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支持以下功能:

  1. 使能sensor

  2. 获取和设置sensor的分辨率

  3. 获取对应pad的sensor信息

  4. 获取和设置fps

  5. 获取和设置当前mirror或flip的状态

  6. 获取和设置HDR mode


1.4. 应用场景

MI_SENSOR目前可应用于以下场景,都支持基于MI_SENSOR api提供的API接口进行开发

  1. Pure linux场景

  2. Pure rtos场景

  3. 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 编译配置
  1. 进入alkaid project根目录,make menuconfig

  2. 回车键进入Sdk Config子选项

  3. 回车键进入Interface Compile Config子选项

  4. 空格键选中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的接口调用分为以下几步:

  1. 设置是否开启HDR mode

  2. 查询当前sensor driver可用的分辨率

  3. 设置要用的分辨率

  4. 设置fps

  5. 使能sensor

  6. 关闭sensor

  7. 退出应用


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参考

进一步的api介绍请点击这里

3.  立即开始

加入Comake开发者社区

 主页地址: CoMake开发者社区

SDK下载: CoMake开发者社区

文档中心: CoMake开发者社区

马上购买 : 首页-Comake开发者社区商店

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐