Sigmstar Comake D1 SSD2355 SDK开发之Sensor篇
MI_SENSOR模块是传感器驱动与上层应用间的中间层,为不同传感器提供统一接口。主要功能包括:传感器使能、分辨率/帧率设置、镜像调节等。模块通过PadID定位具体传感器驱动,支持Linux/RTOS/DualOS等场景,在不同芯片平台存在接口类型和时钟频率差异。开发流程需先完成传感器驱动开发,再调用MI_SENSOR API进行操作。文中提供了完整的使用示例代码,展示从HDR模式设置到传感器启停
MI SENSOR API
1. 概述¶
1.1. 模块说明¶
MI_SENSOR模块是具体sensor驱动和其他模块之间软件中间层,负责为不同的sensor驱动提供统一的函数实现和调用接口。它将不同sensor的共性行为进行抽象统一后使得上层应用可以无需关注底层sensor drvier具体实现,基于MI_SENSOR模块的不同api,app可以调用到底层sensor驱动的对应实现,能够使能sensor,获取sensor接口信息,调整分辨率和帧率等操作。
关键词说明:
-
Pad
Sensor 硬件插口位置。
-
Plane
Pad 下的通道名称。
-
Res
Resolution 分辨率简称。
-
Orien
确定方向, 设置sensor 水平和竖直方向镜像。
-
VC
Virtual Channel 虚拟通道。
1.2. 基本结构¶
sensor driver在insmod的时候通过驱动参数chmap注册到指定位置后,MI_SENSOR的api就可以通过对应的sensor padId获取到对应位置注册的sensor driver指针。 app可以通过MI_SENSOR提供的api访问指定的sensor driver内的具体实现函数,MI其他模块也会通过MI_SENSOR内部的api对不同pad的sensor进行操作。

1.3. 功能介绍¶
MI_SENSOR支持以下功能:
-
使能sensor
-
获取和设置sensor的分辨率
-
获取对应pad的sensor信息
-
获取和设置fps
-
获取和设置当前mirror或flip的状态
-
获取和设置HDR mode
1.4. 应用场景¶
MI_SENSOR目前可应用于以下场景,都支持基于MI_SENSOR api提供的API接口进行开发
-
Pure linux场景
-
Pure rtos场景
-
Dualos场景
1.5. 芯片差异¶
MI_SENSOR模块在不同chip之间的差异主要包括支持的接口类型数和mclk频率。
1.5.1. Souffle¶
-
mclk支持的频率:

-
sensor接口支持情况:
支持接口类型 使用sensor pad BT656 0、1 BT1120 0 MIPI 0、1、2、3
1.5.2. Iford¶
-
mclk支持的频率:

-
sensor接口支持情况:
支持接口类型 使用sensor pad MIPI 0、2
1.5.3. Pcupid¶
-
mclk支持的频率:

-
sensor接口支持情况:
支持接口类型 使用sensor pad BT656 0 parallel 0 MIPI 0、2
1.6. 工作原理¶
MI_SENSOR本身为软件中间层,不涉及硬件相关工作原理,下面以MI_SNR_Enable调用过程讲述MI_SENSOR的实际作用。
上层应用调用MI_SNR_Enable接口时,MI_SENSOR层会根据具体的pad ID找到对应sensor driver的poweron函数。poweron函数内部也会调用MI_SENSOR提供的sensorif api并根据不同sensor的上电时序在具体实现上进行调整。函数执行完成后返回对应执行结果到MI_SENSOR层,最后返回给MI_SNR_Enable。

1.7. 开发流程¶
MI_SENSOR的API实现依赖底层具体的Sensor Driver,因此在使用MI_SENSOR api进行开发时,应该先完成sensor driver的开发。 具体可以参考:
1.7.1 编译配置¶
-
进入alkaid project根目录,make menuconfig

-
回车键进入Sdk Config子选项

-
回车键进入Interface Compile Config子选项

-
空格键选中sensor子模块,并重新编译project
编译完成将在sdk/interface/src/sensor下生成 mi_sensor.ko, 同时将mi_sensor.h和mi_sensor_datatype.h release到 project/release 目录, 在pure linux环境下会默认打包进入images,在dualos环境下默认不打包,需要手动编译并安装。
1.7.2 接口调用¶

MI_SENSOR接口调用流程
MI_SENSOR的接口调用分为以下几步:
-
设置是否开启HDR mode
-
查询当前sensor driver可用的分辨率
-
设置要用的分辨率
-
设置fps
-
使能sensor
-
关闭sensor
-
退出应用
1.8. 实例介绍¶
本实例展示了基于MI_SENSOR api进行开发的流程。
#include <stdio.h>
#include "mi_sys.h"
#include "mi_sensor.h"
#include <string.h>
#include <stdarg.h>
void ST_Flush(void)
{
int c;
while((c = getchar()) != '\n' && c != EOF);
}
int ST_Scanf(const char *format, ...)
{
int ret = 0;
va_list args;
va_start(args, format);
ret = vscanf(format, args);
va_end(args);
if (ret == 0)
{
printf("Error:scanf fail\n");
return -1;
}
return 0;
}
int main(int argc, char **argv)
{
MI_SNR_PADID eSnrPadId = 0;
MI_VIF_GROUP GroupId = 0;
MI_S32 s32Ret = 0;
MI_BOOL bHDR = 0;
MI_U32 u32ResCount = 0;
MI_U8 u8ResIndex =0;
MI_U8 u8ChocieRes = 0xff;
MI_S32 s32Input =0;
MI_U32 u32SnrFps = 30;
MI_SNR_Res_t stRes;
MI_SNR_PADInfo_t stPad0Info;
MI_SNR_PlaneInfo_t stSnrPlane0Info;
memset(&stRes, 0x0, sizeof(MI_SNR_Res_t));
memset(&stPad0Info, 0x0, sizeof(MI_SNR_PADInfo_t));
memset(&stSnrPlane0Info, 0x0, sizeof(MI_SNR_PlaneInfo_t));
MI_SYS_Init(0);
s32Ret = MI_SNR_SetPlaneMode(eSnrPadId,bHDR);
if(s32Ret != MI_SUCCESS)
{
printf("set sensor:%d plane mode failed\n", eSnrPadId);
goto EXIT;
}
s32Ret = MI_SNR_QueryResCount(eSnrPadId, &u32ResCount);
if(s32Ret != MI_SUCCESS)
{
printf("query sensor:%d res failed\n", eSnrPadId);
goto EXIT;
}
for(u8ResIndex=0; u8ResIndex < u32ResCount; u8ResIndex++)
{
s32Ret =MI_SNR_GetRes(eSnrPadId, u8ResIndex, &stRes);
if(s32Ret != MI_SUCCESS)
{
printf("get sensor:%d res:%d failed\n", eSnrPadId,u8ResIndex);
goto EXIT;
}
printf("index %d, Crop(%d,%d,%d,%d), outputsize(%d,%d), maxfps %d, minfps %d, ResDesc %s\n",
u8ResIndex,
stRes.stCropRect.u16X, stRes.stCropRect.u16Y, stRes.stCropRect.u16Width,stRes.stCropRect.u16Height,
stRes.stOutputSize.u16Width, stRes.stOutputSize.u16Height,
stRes.u32MaxFps,stRes.u32MinFps,
stRes.strResDesc);
}
if(u8ChocieRes >= u32ResCount && u8ChocieRes != 0xff)
{
printf("res set err %d > =cnt %d\n", u8ChocieRes, u32ResCount);
s32Ret = -1;
goto EXIT;
}
else if(u8ChocieRes == 0xff)
{
printf("choice which resolution use, cnt %d\n", u32ResCount);
do
{
ST_Scanf("%d", &s32Input);
u8ChocieRes = (MI_U8)s32Input;
ST_Flush();
s32Ret = MI_SNR_QueryResCount(eSnrPadId, &u32ResCount);
if(s32Ret != MI_SUCCESS)
{
printf("query sensor:%d res failed\n", eSnrPadId);
goto EXIT;
}
if(u8ChocieRes >= u32ResCount)
{
printf("choice err res %d > =cnt %d, choice again\n", u8ChocieRes, u32ResCount);
}
else
{
break;
}
}while(1);
printf("You select %d res\n", u8ChocieRes);
}
s32Ret = MI_SNR_GetRes(eSnrPadId, u8ChocieRes, &stRes);
if(s32Ret != MI_SUCCESS)
{
printf("get sensor:%d res:%d failed\n", eSnrPadId,u8ChocieRes);
goto EXIT;
}
s32Ret = MI_SNR_SetRes(eSnrPadId,u8ChocieRes);
if(s32Ret != MI_SUCCESS)
{
printf("set sensor:%d res:%d failed\n", eSnrPadId,u8ChocieRes);
goto EXIT;
}
if(u32SnrFps <= stRes.u32MaxFps && u32SnrFps >= stRes.u32MinFps)
{
s32Ret = MI_SNR_SetFps(eSnrPadId,u32SnrFps);
if(s32Ret != MI_SUCCESS)
{
printf("set sensor:%d fps failed\n", eSnrPadId);
goto EXIT;
}
}
s32Ret = MI_SNR_Enable(eSnrPadId);
if(s32Ret != MI_SUCCESS)
{
printf("enable sensor:%d failed\n", eSnrPadId);
goto EXIT;
}
s32Ret = MI_SNR_Disable(eSnrPadId);
if(s32Ret != MI_SUCCESS)
{
printf("enable sensor:%d failed\n", eSnrPadId);
goto EXIT;
}
MI_SYS_Exit(0);
EXIT:
return s32Ret;
}
2. API参考¶
3. 立即开始
加入Comake开发者社区
主页地址: CoMake开发者社区
SDK下载: CoMake开发者社区
文档中心: CoMake开发者社区
马上购买 : 首页-Comake开发者社区商店
更多推荐
所有评论(0)