MI ISP API


1. 概述


1.1. 模块说明

图像信号处理(Image Signal Processing),实现HDR,3D/2D降噪,3A算法,WDR等相关功能。


1.2. 流程框图

图 1‑1:Tiramisu框图


1.3. 关键字说明

  • Device

    硬件设备。

  • channel

    Device上的分时复用通道。

  • DNR

    Digital Noise Reduction,数字降噪技术。

    2D降噪:将一个像素与其周围像素平均,平均后噪声降低,缺点是会造成画面模糊;

    3D降噪:增添了时域处理,2D降噪只考虑一帧图像,而3D降噪进一步考虑帧与帧之间的时域关系,对每个像素进行时域上的平均。

  • 3A算法

    AE (Auto Exposure,自动曝光)、AWB(Auto White Balance,自动白平衡)和AF(Auto Focus,自动对焦)。

  • HDR

    High-Dynamic Range,高动态范围图像。

    据不同的曝光时间的LDR(Low-Dynamic Range,低动态范围图像),并利用每个曝光时间相对应最佳细节的LDR图像来合成最终HDR图像。能够更好的反映出真实环境中的视觉效果。

  • WDR

    Wide Dynamic Range,宽动态范围。

    开启后场景中特别亮和特别暗的部位都能看得清楚。宽动态范围是图像能分辨的最亮的亮度信号值与最暗的亮光信号值的比值。

  • Rotation

    旋转,将原始图像绕中心点旋转0°/90°/180°/270°。

  • mirror

    水平镜像翻转。

  • Flip

    上下镜像翻转。

  • Crop

    裁剪,对输入图像进行裁剪。


1.4. insmod参数说明

使用insmod mi_isp.ko 后面可以带的参数使用情况如下所示:

参数 含义 取值
g_u32DefaultDropNum Drop MI_ISP_CreateChannel 之后buffer的张数 1. Default:10。由于 ISP 需要收敛,默认会drop掉10张。
2. 用户可以设定任意值。在快启的场景时,减少drop的张数,可以缩短启动时间。

2. API 参考


该功能模块提供以下API:

API名 功能
MI_ISP_CreateDevice 创建一个 ISP 设备
MI_ISP_DestoryDevice 销毁一个 ISP 设备
MI_ISP_CreateChannel 创建一个 ISP 通道
MI_ISP_DestroyChannel 销毁一个 ISP 通道
MI_ISP_SetInputPortCrop 设定 ISP 输入端口裁剪参数
MI_ISP_GetInputPortCrop 获取 ISP 输入端口裁剪参数
MI_ISP_SetChnParam 设定 ISP 通道参数
MI_ISP_GetChnParam 获取 ISP 通道参数
MI_ISP_StartChannel 启动 ISP 通道
MI_ISP_StopChannel 停止 ISP 通道
MI_ISP_SetOutputPortParam 设定 ISP 输出端口参数
MI_ISP_GetOutputPortParam 获取 ISP 输出端口参数
MI_ISP_EnableOutputPort 启用 ISP 输出端口
MI_ISP_DisableOutputPort 禁用 ISP 输出端口
MI_ISP_Alloc_IQDataBuf 申请 IQ 数据缓存区
MI_ISP_Free_IQDataBuf 释放 IQ 数据缓存区
MI_ISP_CallBackTask_Register 注册 ISP 回调接口
MI_ISP_CallBackTask_Unregister 注销 ISP 回调接口
MI_ISP_SkipFrame 设定跳过 Frame count
MI_ISP_LoadPortZoomTable 载入 ISP 端口 Zoom Table
MI_ISP_StartPortZoom 启动 ISP 端口 Zoom
MI_ISP_StopPortZoom 停止 ISP 端口 Zoom
MI_ISP_GetPortCurZoomAttr 获取 ISP 端口实时的 Zoom 属性
MI_ISP_SetCustSegAttr 设置AI ISP属性
MI_ISP_GetCustSegAttr 获取AI ISP属性
MI_ISP_GetCustSegBuf 获取AI ISP buffer
MI_ISP_PutCustSegBuf 释放AI ISP buffer
MI_ISP_GetSubChnId 获取ISP的子通道号

2.1. MI_ISP_CreateDevice

  • 功能

    创建一个 ISP 设备。

  • 语法

    MI_S32 MI_ISP_CreateDevice(MI_ISP_DEV DevId, MI_ISP_DevAttr_t *pstDevAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    pstDevAttr ISP 设备属性指针。静态属性。 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    在调用前要保证 ISP 设备处于禁用状态。如果 ISP设备已处于使能状态,可以使用MI_ISP_DestoryDevice来禁用设备。

  • 举例

    MI_ISP 初始化:

    MI_S32 ST_IspModuleInit(MI_ISP_DEV IspDevId)
    {
    #define ST_MAX_ISP_OUTPORT_NUM (2)
        MI_ISP_CHANNEL IspChnId = 0;
        MI_ISP_PORT  IspOutPortId =0;
    
        MI_ISP_DevAttr_t stCreateDevAttr;
        memset(&stCreateDevAttr, 0x0, sizeof(MI_ISP_DevAttr_t));
        stCreateDevAttr.u32DevStitchMask = E_MI_ISP_DEVICE_ID0;
    
        MI_ISP_CreateDevice(IspDevId, &stCreateDevAttr);
    
        MI_ISP_ChannelAttr_t  stIspChnAttr;
        memset(&stIspChnAttr, 0x0, sizeof(MI_ISP_ChannelAttr_t));
        stIspChnAttr. u32SensorBindId = E_MI_ISP_SENSOR0;
        MI_ISP_CreateChannel(IspDevId, IspChnId, &stIspChnAttr);
    
        MI_SYS_WindowRect_t  stInputCropInfo;
        stInputCropInfo.u16x=0;
        stInputCropInfo.u16y=0;
        stInputCropInfo.u16width=0;
        stInputCropInfo.u16height=0;//width/height==0 no use crop.
        MI_ISP_SetInputPortCrop(IspDevId, IspChnId, &stInputCropInfo);
    
        MI_ISP_ChnParam_t  stChnParam;
        stChnParam.eHDRType = E_MI_ISP_HDR_TYPE_OFF;
        stChnParam.e3DNRLevel = E_MI_ISP_3DNR_LEVEL2;
        stChnParam.bMirror = FALSE;
        stChnParam.bFlip = FALSE;
        stChnParam.eRot = E_MI_SYS_ROTATE_NONE;
        //use rot or flip, 3dnr level must more than 0
        stChnParam.bY2bEnable = FALSE;
        MI_ISP_SetChnParam(IspDevId, IspChnId, &stChnParam);
        MI_ISP_StartChannel(IspDevId, IspChnId);
    
        for(IspOutPortId=0; IspOutPortId<ST_MAX_ISP_OUTPORT_NUM; IspOutPortId++)
        {
            MI_ISP_OutPortParam_t  stIspOutputParam;
            memset(&stIspOutputParam, 0x0, sizeof(MI_ISP_OutPortParam_t));
            stIspOutputParam.stCropRect.u16x=0;
            stIspOutputParam.stCropRect.u16y=0;
            stIspOutputParam.stCropRect.u16Width=0;
            stIspOutputParam.stCropRect.u16Height=0;//width/height use 0, not use crop
            stIspOutputParam.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_YUV420;
            MI_ISP_SetOutputPortParam(IspDevId, IspChnId, IspOutPortId, &stIspOutputParam);
            MI_ISP_EnableOutputPort(IspDevId, IspChnId, IspOutPortId);
        }
    
        return MI_SUCCESS;
    }
    

    MI_ISP 去初始化:

    MI_S32 ST_IspModuleUnInit(MI_ISP_DEV IspDevId)
    {
    #define ST_MAX_ISP_OUTPORT_NUM (2)
    
        MI_ISP_CHANNEL IspChnId = 0;
        MI_ISP_PORT  IspOutPortId =0;
    
        for(IspOutPortId=0; IspOutPortId<ST_MAX_ISP_OUTPORT_NUM; IspOutPortId++)
        {
            MI_ISP_DisableOutputPort(IspDevId, IspChnId, IspOutPortId);
        }
    
        MI_ISP_StopChannel(IspDevId, IspChnId);
        MI_ISP_DestroyChannel(IspDevId, IspChnId);
    
        MI_ISP_DestoryDevice(IspDevId);
    
        return MI_SUCCESS;
    }
    
  • 相关主题

    MI_ISP_DestoryDevice


2.2. MI_ISP_DestoryDevice

  • 功能

    销毁一个 ISP 设备。

  • 语法

    MI_S32 MI_ISP_DestoryDevice(MI_ISP_DEV DevId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    需要先禁用所有的输出端口,然后停下channel,销毁通道,才能销毁设备。

  • 举例

    参考MI_ISP_CreateDevice 举例。

  • 相关主题

    MI_ISP_CreateDevice


2.3. MI_ISP_CreateChannel

  • 功能

    创建一个 ISP 通道。

  • 语法

    MI_S32 MI_ISP_CreateChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ChannelAttr_t *pstChAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pstChAttr ISP 通道属性指针 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    需要先创建设备, 才能创建通道。

  • 举例

    参考MI_ISP_CreateDevice举例。

  • 相关主题

    MI_ISP_DestroyChannel


2.4. MI_ISP_DestroyChannel

  • 功能

    销毁一个 ISP 通道。

  • 语法

    MI_S32 MI_ISP_DestroyChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    需要先禁用所有的输出端口, 然后停下channel,才能销毁通道。

  • 举例

    参考MI_ISP_CreateDevice 举例。

  • 相关主题

    MI_ISP_CreateChannel


2.5. MI_ISP_SetInputPortCrop

  • 功能

    设定 ISP 输入端口裁剪参数。

  • 语法

    MI_S32 MI_ISP_SetInputPortCrop(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_SYS_WindowRect_t *pstCropInfo);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pstCropInfo ISP 输入端口裁剪参数指针 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    • 只有input 是Dram buffer 时,才支持input crop。

    • Crop x、Crop y、width、height 都是2对齐。

    • Isp内部的3A 只会统计裁剪区域的信息,会影响到整个画面最终3A计算结果。


2.6. MI_ISP_GetInputPortCrop

  • 功能

    获取 ISP 输入端口裁剪参数。

  • 语法

    MI_S32 MI_ISP_GetInputPortCrop(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId,MI_SYS_WindowRect_t *pstCropInfo);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号 输入
    ChnId ISP 通道号 输入
    pstCropInfo ISP 输入端口裁剪参数指针 输出
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a


2.7. MI_ISP_SetChnParam

  • 功能

    设定 ISP 通道参数。

  • 语法

    MI_S32 MI_ISP_SetChnParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ChnParam_t *pstChnParam);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pstChnParam ISP 通道参数指针 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    建议在通道停止的情况下切换通道参数,避免通道内缓存的buffer和后端参数不匹配,导致异常。

  • 举例

    参考MI_ISP_CreateDevice 举例。

  • 相关主题

    MI_ISP_GetChnParam


2.8. MI_ISP_GetChnParam

  • 功能

    获取 ISP 通道参数。

  • 语法

    MI_S32 MI_ISP_GetChnParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ChnParam_t *pstChnParam);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号 输入
    ChnId ISP 通道号 输入
    pstChnParam ISP 通道参数指针 输出
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 相关主题

    MI_ISP_SetChnParam


2.9. MI_ISP_StartChannel

  • 功能

    启动 ISP 通道。

  • 语法

    MI_S32 MI_ISP_StartChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 举例

    参考MI_ISP_CreateDevice 举例。

  • 相关主题

    MI_ISP_SetChnParam


2.10. MI_ISP_StopChannel

  • 功能

    停止 ISP 通道。

  • 语法

    MI_S32 MI_ISP_StopChannel(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    在通道创建的情况下,都可以停下通道,通道停下所有的输出端口都不会有数据输出。

  • 举例

    参考MI_ISP_CreateDevice举例。


2.11. MI_ISP_SetOutputPortParam

  • 描述

    设定 ISP 输出端口参数。

  • 语法

    MI_S32 MI_ISP_SetOutputPortParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId, MI_ISP_OutPortParam_t *pstOutPortParam);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    PortId ISP 端口号 输入
    pstOutPortParam ISP 输出端口参数指针 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    • Output port0 只支持和MI_SCL realtime 绑定,输出区域和input 相同, 可以不调用此api设置。

    • Output port1 支持crop,需要指定size 输出。

    • Output port2 只支持输出RGBIR sensor的IR 数据,Output W/H固定为input W/H的各一半,可以不调用此api设置。

  • 举例

    参考MI_ISP_CreateDevice 举例。


2.12. MI_ISP_GetOutputPortParam

  • 描述

    获取 ISP 输出端口参数。

  • 语法

    MI_S32 MI_ISP_GetOutputPortParam(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId, MI_ISP_OutPortParam_t *pstOutPortParam);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    PortId ISP 端口号 输入
    pstOutPortParam ISP 输出端口参数指针 输出
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 相关主题

    MI_ISP_SetOutputPortParam


2.13. MI_ISP_EnableOutputPort

  • 描述

    启用 ISP 输出端口。

  • 语法

    MI_S32 MI_ISP_EnableOutputPort(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    PortId ISP 端口号 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    • Output port1 必须要在设置了output port属性的前提下才可以使能该端口。

    • Output port2 只有在使用RGBIR sensor的时候才可以使能。

  • 举例

    参考MI_ISP_CreateDevice 举例。

  • 相关主题

    MI_ISP_DisableOutputPort


2.14. MI_ISP_DisableOutputPort

  • 描述

    禁用 ISP 输出端口。

  • 语法

    MI_S32 MI_ISP_DisableOutputPort(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_PORT PortId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    PortId ISP 端口号 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a


2.15. MI_ISP_Alloc_IQDataBuf

  • 描述

    申请 IQ API数据缓存区。

  • 语法

    MI_S32 MI_ISP_Alloc_IQDataBuf(MI_U32 u32Size,void **pUserVirAddr);
    
  • 形参

    参数名称 描述 输入/输出
    u32Size IQ 数据缓存区大小。 输入
    pUserVirAddr IQ 数据缓存区指针地址 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    • 建议使用该api申请IQ api 数据,避免高频率调用造成cpu loading较高风险。

    • 一个线程申请一块isp data buffer,避免线程间buffer共用,导致线程之间buffer 互踩。

  • 举例

    #define  MI_ISP_MAX_DATA_SIZE  (80*1024)
    MI_ISP_Alloc_IQDataBuf(MI_ISP_MAX_DATA_SIZE, &pIspBuffer);
    MI_ISP_IQ_ColorToGrayType_t *pstColorToGray = (MI_ISP_IQ_ColorToGrayType_t *)pIspBuffer;
    MI_ISP_IQ_GetColorToGray( Channel, pstColorToGray);
    if(pstColorToGray->bEnable == SS_TRUE)
        pstColorToGray->bEnable = SS_FALSE;
    else
        pstColorToGray->bEnable = SS_TRUE;
    MI_ISP_IQ_SetColorToGray( Channel, pstColorToGray);
    
    MI_ISP_IQ_ContrastType_t  *pstContrast = (MI_ISP_IQ_ContrastType_t *)pIspBuffer;
    MI_ISP_IQ_GetContrast( Channel, pstContrast);
    MI_ISP_IQ_SetContrast( Channel, pstContrast);
    
    MI_ISP_Free_IQDataBuf(pIspBuffer)
    
  • 相关主题

    MI_ISP_Free_IQDataBuf


2.16. MI_ISP_Free_IQDataBuf

  • 描述

    释放 IQ 数据缓存区。

  • 语法

    MI_S32 MI_ISP_Free_IQDataBuf(void *pUserBuf);
    
  • 形参

    参数名称 描述 输入/输出
    pUserBuf IQ 申请的数据缓存区指针 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 举例

    参考MI_ISP_Alloc_IQDataBuf举例。


2.17. MI_ISP_CallBackTask_Register

  • 描述

    注册 ISP 回调接口。

  • 语法

    MI_S32 MI_ISP_CallBackTask_Register(MI_ISP_DEV DevId, MI_ISP_CallBackParam_t *pstCallBackParam);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    pstCallBackParam ISP 回调参数 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h, mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

  • 举例

    MI_S32 _MI_ISP_vsync1(MI_U64 u64Data)
    {
        DBG_ERR("DATA %llu \n", u64Data);
        return 0;
    }
    
    MI_S32 _MI_ISP_vsync2(MI_U64 u64Data)
    {
        DBG_ERR("DATA %llu \n", u64Data);
        return 0;
    }
    
    static MS_S32 _MI_ISP_testRegCallback(void)
    {
        MI_ISP_CallBackParam_t stCallBackParam1;
        MI_ISP_CallBackParam_t stCallBackParam2;
        memset(&stCallBackParam1, 0x0, sizeof(MI_ISP_CallBackParam_t));
        memset(&stCallBackParam2, 0x0, sizeof(MI_ISP_CallBackParam_t));
        stCallBackParam1.eCallBackMode = E_MI_ISP _CALLBACK_ISR;
        stCallBackParam1. eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
        stCallBackParam1.pfnCallBackFunc = _mi_ISP_vsync1;
        stCallBackParam1.u64Data = 12;
        MI_ISP_CallBackTask_Register(&stCallBackParam1);
        stCallBackParam2.eCallBackMode = E_MI_ISP_CALLBACK_ISR;
        stCallBackParam2. eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
        stCallBackParam2.pfnCallBackFunc = _mi_ISP_vsync2;
        stCallBackParam2.u64Data = 23;
        MI_ISP_CallBackTask_Register(&stCallBackParam2);
        return 0;
    }
    
    static MS_S32 _MI_ISP_testUnRegCallback(void)
    {
        MI_ISP_CallBackParam_t stCallBackParam1;
        MI_ISP_CallBackParam_t stCallBackParam2;
        memset(&stCallBackParam1, 0x0, sizeof(MI_ISP_CallBackParam_t));
        memset(&stCallBackParam2, 0x0, sizeof(MI_ISP_CallBackParam_t));
        stCallBackParam1.eCallBackMode = E_MI_ISP_CALLBACK_ISR;
        stCallBackParam1.eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
        stCallBackParam1.pfnCallBackFunc = _mi_ISP_vsync1;
        stCallBackParam1.u64Data = 12;
        MI_ISP_CallBackTask_Unregister(&stCallBackParam1);
        stCallBackParam2.eCallBackMode = E_MI_ISP_CALLBACK_ISR;
        stCallBackParam2.eIrqType = E_MI_ISP_IRQ_ISPVSYNC;
        stCallBackParam2.pfnCallBackFunc = _mi_ISP_vsync2;
        stCallBackParam2.u64Data = 23;
        MI_ISP_CallBackTask_Unregister(&stCallBackParam2);
        return 0;
    }
    
  • 相关主题

    MI_ISP_CallBackTask_Unregister


2.18. MI_ISP_CallBackTask_Unregister

  • 描述

    注销回调接口。

  • 语法

    MI_S32 MI_ISP_CallBackTask_Unregister(MI_ISP_DEV DevId, MI_ISP_CallBackParam_t *pstCallBackParam);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    pstCallBackParam ISP 回调参数 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

  • 举例

    MI_ISP_CallBackTask_Register举例。


2.19. MI_ISP_SkipFrame

  • 描述

    设定从调用该API开始跳过Frame count。

  • 语法

    MI_S32 MI_ISP_SkipFrame(MI_ISP_DEV DevId,MI_ISP_CHANNEL ChnId, MI_U32 u32FrameNum);
    
  • 形参

    参数名称 描述 输入/输出
    ChnId ISP 通道号 输入
    u32FrameNum Frame 数量 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a


2.20. MI_ISP_LoadPortZoomTable

  • 描述

    载入 ISP 端口 Zoom Table。

  • 语法

    MI_S32 MI_ISP_LoadPortZoomTable(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId,  MI_ISP_ZoomTable_t *pZoomTable);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pZoomTable Zoom Table参数 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    • 通过该接口提前加载好zoom table,可以每一帧frame依次应用table中的zoom参数,保证zoom效果平滑,对比应用循环call MI_ISP_SetOutputPortParam 设置crop,没有办法保证每一帧frame 生效设置,无法做到平滑效果。

      X0 Y0 W0 H0 SensorId=0
      X1 Y1 W1 H1 SensorId=0
      X2 Y2 W2 H2 SensorId=1
      X3 Y3 W3 H3 SensorId=1

      表中包含crop位置和对应sensorid 信息,sensorid信息以支持长短焦切换场景。

    • Zoom 功能由MI_ISP 和MI_SCL 配合完成,MI_ISP 负责zoom过程中3A效果和长短焦切换场景时通知sensor driver切换sensor。

    • MI_SCL 负责crop 和scaling up,所以在zoom场景中,MI_SCL不能再使用crop 功能。

    • Zoom运行过程中,不可以重复load table,需要先MI_ISP_StopPortZoom,再load table。


2.21. MI_ISP_StartPortZoom

  • 描述

    启动 ISP端口Zoom。

  • 语法

    MI_S32 MI_ISP_StartPortZoom(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ZoomAttr_t *pstZoomAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pstZoomAttr Zoom Table参数 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    X0 Y0 W0 H0 SensorId=0
    X1 Y1 W1 H1 SensorId=0
    X2 Y2 W2 H2 SensorId=1
    X3 Y3 W3 H3 SensorId=1

    u32FromEntryIndex 和 u32ToEntryIndex 为table中index0 ~ 3 任意一个。

    当u32FromEntryIndex != u32ToEntryIndex,逐帧应用从u32FromEntryIndex到u32ToEntryIndex的crop 参数。

    当u32FromEntryIndex == u32ToEntryIndex,会停在当前u32FromEntryIndex参数。

    当MI内部检测到下一个entry的sensorid 和当前sensor id 不一致时,当前帧做完后会将sensirid通知给sensor driver,切换到对应sensor 上。

  • 相关主题

    MI_ISP_StopPortZoom


2.22. MI_ISP_StopPortZoom

  • 描述

    停止 ISP端口Zoom。

  • 语法

    MI_S32 MI_ISP_StopPortZoom(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    MI_ISP_StartPortZoom 成对调用。


2.23. MI_ISP_GetPortCurZoomAttr

  • 描述

    获取 ISP 端口实时的 Zoom 属性。

  • 语法

    MI_S32 MI_ISP_GetPortCurZoomAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_ZoomAttr_t *pstZoomAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pstZoomAttr Zoom 属性状态 输出
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

2.24. MI_ISP_SetCustSegAttr

  • 功能

    设置AI ISP属性。

  • 语法

    MI_S32 MI_ISP_SetCustSegAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_CustSegAttr_t *pstCustSegAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pstCustSegAttr AI ISP属性 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    • pstCustSegAttr→eMode的值为E_MI_ISP_CUST_SEG_MODE_INSERTE_MI_ISP_CUST_SEG_MODE_INSERT时,会使能AI ISP。此时MI ISP内部会分成3个pass。pass0,pass1和pass2,功能由ISP的hdr、3dnr、wdr、rgb2yuv 4个组件组成。pass1是专门给app提供raw buffer。

    • 使能AI ISP时,不支持isp rotation/mirror/flip。

    • Pass0和pass2有以下组合,使用MI_ISP_CustSegAttr_t表示。注意pass0模块序号不能比pass2大。

      Pass0: HDR, HDR→3DNR, HDR→3DNR→WDR, HDR→3DNR→WDR→RGB2YUV

      Pass2: RGB2YUV, WDR→RGB2YUV, 3DNR→WDR→RGB2YUV, HDR→3DNR→WDR→RGB2YUV

      E_MI_ISP_SEG_HDR输出是before 3DNR。

      E_MI_ISP_SEG_3DNR包含DNR Rotation/mirror/flip,输出是before WDR。

      E_MI_ISP_SEG_WDR输出是before RGB2YUV。

    • pstCustSegAttr→eMode、pstCustSegAttr→eFrom和pstCustSegAttr→eTo,用于描述pass1的功能组成。

      E_MI_ISP_CUST_SEG_MODE_INSERT表示在HDR→3DNR→WDR→RGB2YUV中间某个地方插入app的图像处理pass1。

      E_MI_ISP_CUST_SEG_MODE_REPLACE,表示替换HDR、3DNR、WDR、RGB2YUV的功能。可以只替换3DNR,只替换WDR,或3DNR、WDR都替换掉。

      例如:

      1. eFrom= E_MI_ISP_SEG_3DNR, eTo= E_MI_ISP_SEG_WDR, eMode= E_MI_ISP_CUST_SEG_MODE_INSERT

      2. eFrom= E_MI_ISP_SEG_3DNR, eTo= E_MI_ISP_SEG_WDR, eMode= E_MI_ISP_CUST_SEG_MODE_REPLACE

      3. eFrom= E_MI_ISP_SEG_3DNR, eTo= E_MI_ISP_SEG_3DNR, eMode= E_MI_ISP_CUST_SEG_MODE_REPLACE

      4. eFrom= E_MI_ISP_SEG_HDR, eTo= E_MI_ISP_SEG_HDR, eMode= E_MI_ISP_CUST_SEG_MODE_REPLACE

      5. eFrom= E_MI_ISP_SEG_RGB2YUV, eTo= E_MI_ISP_SEG_RGB2YUV, eMode= E_MI_ISP_CUST_SEG_MODE_REPLACE

    • MI_ISP_SetCustSegAttr要在MI_ISP_CreateChannel后,在MI_ISP_StartChannel和MI_ISP_SetOutputPortParam前调用。

  • 举例

    MI_ISP 初始化:

    MI_S32 ST_IspModuleInit(MI_ISP_DEV IspDevId)
    {
        MI_ISP_CHANNEL IspChnId = 0;
        MI_ISP_PORT  IspOutPortId =1;
    
        MI_ISP_DevAttr_t stCreateDevAttr;
        memset(&stCreateDevAttr, 0x0, sizeof(MI_ISP_DevAttr_t));
        stCreateDevAttr.u32DevStitchMask = E_MI_ISP_DEVICE_ID0;
    
        MI_ISP_CreateDevice(IspDevId, &stCreateDevAttr);
    
        MI_ISP_ChannelAttr_t  stIspChnAttr;
        memset(&stIspChnAttr, 0x0, sizeof(MI_ISP_ChannelAttr_t));
        stIspChnAttr. u32SensorBindId = E_MI_ISP_SENSOR0;
        MI_ISP_CreateChannel(IspDevId, IspChnId, &stIspChnAttr);
    
        MI_SYS_WindowRect_t  stInputCropInfo;
        stInputCropInfo.u16x=0;
        stInputCropInfo.u16y=0;
        stInputCropInfo.u16width=0;
        stInputCropInfo.u16height=0;//width/height==0 no use crop.
        MI_ISP_SetInputPortCrop(IspDevId, IspChnId, & stInputCropInfo);
    
        MI_ISP_ChnParam_t  stChnParam;
        stChnParam.eHDRType = E_MI_ISP_HDR_TYPE_OFF;
        stChnParam.e3DNRLevel = E_MI_ISP_3DNR_LEVEL2;
        stChnParam.bMirror = FALSE;
        stChnParam.bFlip = FALSE;
        stChnParam.eRot = E_MI_SYS_ROTATE_NONE;
        stChnParam.bY2bEnable = FALSE;
        MI_ISP_SetChnParam(IspDevId, IspChnId, & stChnParam);
    
        MI_ISP_CustSegAttr_t stCustSegAttr;
        memset(&stCustSegAttr, 0x0, sizeof(MI_ISP_CustSegAttr_t));
        stCustSegAttr.eMode = E_MI_ISP_CUST_SEG_MODE_INSERT;
        stCustSegAttr.eFrom = E_MI_ISP_SEG_3DNR;
        stCustSegAttr.eTo = E_MI_ISP_SEG_WDR;
        stCustSegAttr.stInputParam.ePixelFormat = RGB_BAYER_PIXEL(E_MI_SYS_DATA_PRECISION_12BPP, E_MI_SYS_PIXEL_BAYERID_GR);
        stCustSegAttr.stOutputParam.ePixelFormat = stCustSegAttr.stInputParam.ePixelFormat;
        MI_ISP_SetCustSegAttr(enDevId,enChnId, &stCustSegAttr);
    
        MI_ISP_StartChannel(IspDevId, IspChnId);
    
        MI_ISP_OutPortParam_t  stIspOutputParam;
        memset(&stIspOutputParam, 0x0, sizeof(MI_ISP_OutPortParam_t));
        stIspOutputParam.stCropRect.u16x=0;
        stIspOutputParam.stCropRect.u16y=0;
        stIspOutputParam.stCropRect.u16Width=0;
        stIspOutputParam.stCropRect.u16Height=0;//width/height use 0, not use crop
        stIspOutputParam.ePixelFormat = E_MI_SYS_PIXEL_FRAME_YUV_SEMIPLANAR_YUV420;
        MI_ISP_SetOutputPortParam(IspDevId, IspChnId, IspOutPortId, &stIspOutputParam);
        MI_ISP_EnableOutputPort(IspDevId, IspChnId, IspOutPortId);
    
        return MI_SUCCESS;
    }
    

    获取raw:

    MI_SYS_BUF_HANDLE hBufHandle = NULL;
    MI_SYS_BufInfo_t stInputBufInfo;
    MI_SYS_BufInfo_t stOutputBufInfo;
    MI_U8 *pSrcData = NULL, *pDstData = NULL;
    
    memset(&stInputBufInfo, 0, sizeof(MI_SYS_BufInfo_t));
    memset(&stOutputBufInfo, 0, sizeof(MI_SYS_BufInfo_t));
    s32Ret = MI_ISP_GetCustSegBuf(stChnPort.u32DevId, stChnPort.u32ChnId, &hBufHandle,
                    &stInputBufInfo, &stOutputBufInfo, 200);
    if(s32Ret == MI_SUCCESS)
    {
        pSrcData = stInputBufInfo.stFrameData->pVirAddr[0];
        pDstData = stOutputBufInfo.stFrameData->pVirAddr[0];
        memcpy(pDstData, pSrcData, stOutputBufInfo.stFrameData.u32BufSize);
        memset(pDstData, 0, stOutputBufInfo.stFrameData.u32BufSize/4);
        MI_ISP_PutCustSegBuf(stChnPort.u32DevId, stChnPort.u32ChnId, hBufHandle);
    }
    

2.25. MI_ISP_GetCustSegAttr

  • 功能

    获取AI ISP属性。

  • 语法

    MI_S32 MI_ISP_GetCustSegAttr(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_ISP_CustSegAttr_t *pstCustSegAttr);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pstCustSegAttr AI ISP属性 输出
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

2.26. MI_ISP_GetCustSegBuf

  • 功能

    获取AI ISP buffer。

  • 语法

    MI_S32 MI_ISP_GetCustSegBuf(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId,MI_SYS_BUF_HANDLE *pBufHandle, MI_SYS_BufInfo_t *pstInputBufInfo, MI_SYS_BufInfo_t *pstOutputBufInfo, MI_S32 s32MilliSec);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pBufHandle, Pass1 input/output Buf的handle句柄 输出
    pstInputBufInfo Pass1 input buffer 输出
    pstOutputBufInfo Pass1 output buffer 输出
    s32MilliSec 超时时间 ms 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    MI_ISP_PutCustSegBuf成对使用。

  • 举例

    参考MI_ISP_SetCustSegAttr举例。

2.27. MI_ISP_PutCustSegBuf

  • 功能

    释放AI ISP buffer。

  • 语法

    MI_S32 MI_ISP_PutCustSegBuf(MI_ISP_DEV DevId, MI_ISP_CHANNEL ChnId, MI_SYS_BUF_HANDLE bufHandle);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    ChnId ISP 通道号 输入
    pBufHandle, Pass1 input/output Buf的handle句柄 输入
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

  • 举例

    参考MI_ISP_SetCustSegAttr举例。

2.28. MI_ISP_GetSubChnId

  • 功能

    获取ISP的子通道号。

  • 语法

    MI_S32 MI_ISP_GetSubChnId(MI_ISP_DEV DevId, MI_ISP_CHANNEL MainChnId, 
    MI_ISP_BindSnrId_e eSensorBindId, MI_U32 *pu32SubChnId);
    
  • 形参

    参数名称 描述 输入/输出
    DevId ISP 设备号。 输入
    MainChnId ISP 通道号 输入
    eSensorBindId 子通道绑定的sensor号 输入
    pu32SubChnId ISP 子通道号 输出
  • 返回值

    • MI_SUCCESS(0) 成功。

    • 非0 失败,详情参照错误码

  • 依赖

    • 头文件:mi_isp_datatype.h、mi_isp.h

    • 库文件:libmi_isp.a

  • 注意

    • 在Stitch场景下,一个MI_ISP Channel会绑定多个Sensor,当IQ要控制对应Sensor时,需要输入MI_ISP DevId,MI_ISP ChannelId 和 SensorId,获取对应的SubChannelId,也就是IQ所使用的通道。

    • 其他情况下IQ所使用的通道和MI_ISP ChannelId一致。


3. ISP 数据类型


视频输入相关数据类型定义如下:

数据类型 描述
MI_ISP_DEV 定义 ISP 设备的类型
MI_ISP_CHANNEL 定义 ISP 通道的类型
MI_ISP_PORT 定义 ISP 端口的类型
MI_ISP_DevMaskId_e 定义 ISP 设备需要mask使用的设备ID
MI_ISP_DevAttr_t 定义 ISP 设备属性参数
MI_ISP_HDRType_e 定义 HDR 开关模式
MI_ISP_3DNR_Level_e 定义 3DNR 设置等级
MI_ISP_BindSnrId_e 定义 ISP 绑定sensor的ID
MI_ISP_SYNC3A_e 定义同步各通道 3A 参数
MI_ISP_IQApiHeader_t 定义IQ api 数据类型
MI_ISP_VersionPara_t 定义ISP特殊参数版本
MI_ISP_CustIQParam_t 定义ISP初始化参数
MI_ISP_ChannelAttr_t 定义 ISP 通道静态属性参数
MI_ISP_ChnParam_t 定义 ISP 通道动态属性参数
MI_ISP_OutPortParam_t 定义 ISP 输出端口的参数
MI_ISP_CALLBK_FUNC 定义回调函数类型
MI_ISP_CallBackMode_e 定义回调模式
MI_ISP_IrqType_e 定义硬件中断类型
MI_ISP_CallBackParam_t 定义回调参数
MI_ISP_ZoomEntry_t 定义 Zoom 单元条目类型
MI_ISP_ZoomTable_t 定义 Zoom Table 类型
MI_ISP_ZoomAttr_t 定义 Zoom 属性
MI_ISP_CustSegAttr_t 定义AI ISP属性
MI_ISP_CustSegInPortParam_t Pass1 input port的属性
MI_ISP_CustSegOutPortParam_t Pass1 output port的属性
MI_ISP_CustSegMode_e AI ISP的模式
MI_ISP_InternalSeg_e ISP的模块名称

3.1. MI_ISP_DEV

  • 说明

    定义 ISP 设备的类型。

  • 定义

    typedef MI_U32 MI_ISP_DEV;
    

3.2. MI_ISP_CHANNEL

  • 说明

    定义 ISP 通道的类型。

  • 定义

    typedef MI_U32 MI_ISP_CHANNEL;
    

3.3. MI_ISP_PORT

  • 说明

    定义 ISP 端口的类型。

  • 定义

    typedef MI_U32 MI_ISP_PORT;
    

3.4. MI_ISP_DevMaskId_e

  • 说明

    定义 ISP 设备需要mask使用的设备ID。

  • 定义

    typedef enum
    
    {
    
        E_MI_ISP_DEVICEMASK_ID0 = 0x0001,
    
        E_MI_ISP_DEVICEMASK_ID1 = 0x0002,
    
        E_MI_ISP_DEVICEMASK_ID_MAX = 0xffff
    
    } MI_ISP_DevMaskId_e;
    
  • 注意事项

    Tiramisu 系列芯片只有ISP E_MI_ISP_DEVICEMASK_ID0使用。

  • 相关数据类型及接口

    MI_ISP_CreateDevice


3.5. MI_ISP_DevAttr_t

  • 说明

    定义 ISP 设备属性参数。

  • 定义

    typedef struct MI_ISP_DevAttr_s
    
    {
    
        MI_U32 u32DevStitchMask; //multi ISP dev bitmask by MI_ISP_DevMaskId_e
    
    }MI_ISP_DevAttr_t;
    
  • 成员

    成员名称 描述
    u32DevStitchMask ISP DEV ID 掩码。
  • 注意事项

    u32DevStitchMask由MI_ISP_DevMaskId_e,bitmask组成。如果通道上的数据量一个isp device处理速度无法达到要求,可以通过该参数复用另外一个Device。复用之后不可以再创建另外一个Device。

  • 相关数据类型及接口

    MI_ISP_CreateDevice


3.6. MI_ISP_HDRType_e

  • 说明

    定义 HDR 开关模式

  • 定义

    typedef enum
    
    {
    
        E_MI_ISP_HDR_TYPE_OFF,
    
        E_MI_ISP_HDR_TYPE_VC,
    
        E_MI_ISP_HDR_TYPE_DOL,
    
        E_MI_ISP_HDR_TYPE_EMBEDDED,
    
        E_MI_ISP_HDR_TYPE_LI,
    
        E_MI_ISP_HDR_TYPE_MAX
    
    } MI_ISP_HDRType_e;
    
  • 成员

    成员名称 描述
    E_MI_ISP_HDR_TYPE_OFF 不开HDR
    E_MI_ISP_HDR_TYPE_VC virtual channel mode HDR, vc0->long,vc1->short
    E_MI_ISP_HDR_TYPE_DOL Digital Overlap High Dynamic Range
    E_MI_ISP_HDR_TYPE_EMBEDDED compressed HDR mode
    E_MI_ISP_HDR_TYPE_LI Line interlace HDR
    E_MI_ISP_HDR_TYPE_MAX HDR 边界值
  • 注意事项

    具体使用的HDR Type 可以通过MI_SNR_GetPadInfo 接口获取。

    HDR功能需要MI_VIF 和MI_ISP 模块配合完成,需要两边设置相同的HDR类型。

  • 相关数据类型及接口

    MI_ISP_ChnParam_t


3.7. MI_ISP_3DNR_Level_e

  • 说明

    定义 3DNR 设置等级。

  • 定义

    typedef enum
    
    {
    
        E_MI_ISP_3DNR_LEVEL_OFF,
    
        E_MI_ISP_3DNR_LEVEL1,
    
        E_MI_ISP_3DNR_LEVEL2,
    
        E_MI_ISP_3DNR_LEVEL3,
    
        E_MI_ISP_3DNR_LEVEL4,
    
        E_MI_ISP_3DNR_LEVEL5,
    
        E_MI_ISP_3DNR_LEVEL6,
    
        E_MI_ISP_3DNR_LEVEL7,
    
        E_MI_ISP_3DNR_LEVEL_NUM
    
    }MI_ISP_3DNR_Level_e;
    
  • 注意事项

    Tiramisu系列芯片3DNR level最大为2,level 越高,降噪效果越好,消耗的buffer也越多。

  • 相关数据类型及接口

    MI_ISP_ChnParam_t


3.8. MI_ISP_BindSnrId_e

  • 说明

    定义 ISP 绑定sensor的ID。

  • 定义

    typedef enum
    
    {
    
        E_MI_ISP_SENSOR_INVALID = 0,
    
        E_MI_ISP_SENSOR0 = 0x1,
    
        E_MI_ISP_SENSOR1 = 0x2,
    
        E_MI_ISP_SENSOR2 = 0x4,
    
        E_MI_ISP_SENSOR3 = 0x8,
    
        E_MI_ISP_SENSOR4 = 0x10,
    
        E_MI_ISP_SENSOR5 = 0x20,
    
        E_MI_ISP_SENSOR6 = 0x40,
    
        E_MI_ISP_SENSOR7 = 0x80,
    
        E_MI_ISP_SENSOR_MAX = 8
    
    }MI_ISP_BindSnrId_e;
    

3.9. MI_ISP_SYNC3A_e

  • 说明

    定义同步各通道 3A 参数。

  • 定义

    typedef enum
    
    {
    
        E_MI_ISP_SYNC3A_NONE = 0x00,
    
        E_MI_ISP_SYNC3A_AE = 0x01,
    
        E_MI_ISP_SYNC3A_AWB = 0x02,
    
        E_MI_ISP_SYNC3A_IQ = 0x04
    
    }MI_ISP_SYNC3A_e;
    
  • 成员

    成员名称 描述
    E_MI_ISP_SYNC3A_NONE 不同步3A
    E_MI_ISP_SYNC3A_AE 同步自动曝光
    E_MI_ISP_SYNC3A_AWB 同步自动白平衡
    E_MI_ISP_SYNC3A_IQ 同步图像质量参数设置

3.10. MI_ISP_IQApiHeader_t

  • 说明

    定义设定IQ api 数据属性。

  • 定义

    typedef struct MI_ISP_IQApiHeader_s
    
    {
    
        MI_U32 u32HeadSize; //Size of MIIspApiHeader_t
    
        MI_U32 u32DataLen; //Data length;
    
        MI_U32 u32CtrlID; //Function ID
    
        MI_U32 u32Channel; //Isp channel number
    
        MI_U32 u32DevId; //Isp Device Id
    
        MI_S32 s32Ret; //Isp api retuen value
    
    } MI_ISP_IQApiHeader_t;
    
  • 成员

    成员名称 描述
    u32HeadSize MI_ISP_IQApiHeader_t struct占用空间
    u32DataLen 数据size
    u32CtrlID 功能对应control Id
    u32Channel Isp 通道Id
    u32DevId Isp 设备Id
    s32Ret 接口返回值

3.11. MI_ISP_VersionPara_t

  • 说明

    定义ISP特殊参数版本。

  • 定义

    typedef struct MI_ISP_VersionPara_s
    
    {
    
        MI_U32 u32Revision;
    
        MI_U32 u32Size;
    
        MI_U8 u8Data[VERSIONPARA_DATA_SIZE];
    
    }MI_ISP_VersionPara_t;
    
  • 成员

    成员名称 描述
    u32Revision 和IQ team 协商定义对应版本号
    u32Size 数据对应有效size
    u8Data[VERSIONPARA_DATA_SIZE] 存储数据,VERSIONPARA_DATA_SIZE的值是64
  • 相关数据类型及接口

    MI_ISP_CustIQParam_t


3.12. MI_ISP_CustIQParam_t

  • 说明

    定义ISP IQ初始化参数。

  • 定义

    typedef struct MI_ISP_CustIQParam_s
    
    {
    
        MI_ISP_VersionPara_t stVersion;
    
    }MI_ISP_CustIQParam_t;
    
  • 成员

    成员名称 描述
    stVersion 版本参数
  • 注意事项

    需要ISP 客制化处理的一些IQ初始化参数,可以通过该参数设置,如果没有需求,可以都设置0。


3.13. MI_ISP_ChannelAttr_t

  • 说明

    定义 ISP 通道静态属性参数。

  • 定义

    typedef struct MI_ISP_ChannelAttr_s
    
    {
    
        MI_U32 u32SensorBindId; //bitmask by MI_ISP_BindSnrId_e
    
        MI_ISP_CustIQParam_t stIspCustIqParam;
    
        MI_U32 u32Sync3AType; //sync 3a bitmask by MI_ISP_SYNC3A_e
    
    }MI_ISP_ChannelAttr_t;
    
  • 成员

    成员名称 描述
    u32SensorBindId 通道绑定对应的sensor Id
    stIspCustIqParam Isp IQ初始化参数
    u32Sync3AType 同步通道内多组图像之间的3A/IQ 参数
  • 注意事项

    • 当多sensor拼接场景一个ISP channel 需要处理多个sensor 图像,需要通过u32SensorBindId 将多个sensor Id bitmask 起来设置,否则只设置对应sensor Id接口,如果不需要ISP做IQ/3A,或者前端数据源不是sensor,可以设置0。

    • 当多sensor拼接场景一个ISP channel 需要处理多个sensor 图像,通过u32Sync3AType 设置多个图像之间3A/IQ效果同步, 避免两个图像之间效果差别过大。

  • 相关数据类型及接口

    MI_ISP_CreateChannel


3.14. MI_ISP_ChnParam_t

  • 说明

    定义 ISP 通道动态属性参数。

  • 定义

    typedef struct MI_ISP_ChnParam_s
    
    {
    
        MI_ISP_HDRType_e eHDRType;
    
        MI_ISP_3DNR_Level_e e3DNRLevel;
    
        MI_BOOL bMirror;
    
        MI_BOOL bFlip;
    
        MI_SYS_Rotate_e eRot;
    
    } MI_ISP_ChnParam_t;
    
  • 成员

    成员名称 描述
    eHDRType HDR 开关参数
    e3DNRLevel 3dnr 量级参数
    bMirror 使能通道Mirror
    bFlip 使能通道Flip
    eRot 通道rotation参数
  • 注意事项

    eRot>0或者bFlip=True时,e3DNRLevel 必须大于0。

  • 相关数据类型及接口

    MI_ISP_SetChnParam


3.15. MI_ISP_OutPortParam_t

  • 说明

    定义 ISP 输出端口的参数。

  • 定义

    typedef struct MI_ISP_OutPortParam_s
    
    {
    
        MI_SYS_WindowRect_t stCropRect;
    
        MI_SYS_PixelFormat_e ePixelFormat;
    
    }MI_ISP_OutPortParam_t;
    
  • 成员

    成员名称 描述
    stCropRect 输出裁剪区域
    ePixelFormat 像素格式

3.16. MI_ISP_CALLBK_FUNC

  • 说明

    定义回调函数类型。

  • 定义

    typedef MI_S32 (*MI_ISP_CALLBK_FUNC)(MI_U64 u64Data);
    
  • 相关数据类型及接口

    MI_ISP_CallBackParam_t


3.17. MI_ISP_CallBackMode_e

  • 说明

    定义回调模式。

  • 定义

    typedef enum
    
    {
    
        E_MI_ISP_CALLBACK_ISR,
    
        E_MI_ISP_CALLBACK_MAX,
    
    } MI_ISP_CallBackMode_e;
    
  • 成员

    成员名称 描述
    E_MI_ISP_CALLBACK_ISR 硬件中断模式回调
    E_MI_ISP_CALLBACK_MAX 回调模式最大值
  • 注意事项

    目前只支持ISR 回调模式。

  • 相关数据类型及接口

    MI_ISP_CallBackParam_t


3.18. MI_ISP_IrqType_e

  • 说明

    定义硬件中断类型。

  • 定义

    typedef enum
    
    {
    
        E_MI_ISP_IRQ_ISPVSYNC,
    
        E_MI_ISP_IRQ_ISPFRAMEDONE,
    
        E_MI_ISP_IRQ_MAX,
    
    } MI_ISP_IrqType_e;
    
  • 成员

    成员名称 描述
    E_MI_ISP_IRQ_ISPVSYNC ISP Vsync 中断类型
    E_MI_ISP_IRQ_ISPFRAMEDONE ISP Frame done 中断类型
    E_MI_ISP_IRQ_MAX ISP 硬件中断类型最大值
  • 注意事项

    • E_MI_VPE_IRQ_ISPVSYNC: 每一帧第一个pixel的信号

    • E_MI_VPE_IRQ_ISPFRAMEDONE:isp 写出每一张结束的信号。

  • 相关数据类型及接口

    MI_ISP_CallBackParam_t


3.19. MI_ISP_CallBackParam_t

  • 说明

    定义回调参数。

  • 定义

    typedef struct MI_ISP_CallBackParam_s
    
    {
    
        MI_ISP_CallBackMode_e eCallBackMode;
    
        MI_ISP_IrqType_e eIrqType;
    
        MI_ISP_CALLBK_FUNC pfnCallBackFunc;
    
        MI_U64 u64Data;
    
    } MI_ISP_CallBackParam_t;
    
  • 成员

    成员名称 描述
    eCallBackMode 回调模式
    eIrqType 硬件中断模式类型
    pfnCallBackFunc 回调接口指针
    u64Data 回调接口参数
  • 相关数据类型及接口

    MI_ISP_CallBackTask_Register

    MI_ISP_CallBackTask_Unregister


3.20. MI_ISP_ZoomEntry_t

  • 说明

    定义 Zoom 单元条目类型。

  • 定义

    typedef struct MI_ISP_ZoomEntry_s
    
    {
    
        MI_SYS_WindowRect_t stCropWin;
    
        MI_U8 u8ZoomSensorId;
    
    } MI_ISP_ZoomEntry_t;
    
  • 成员

    成员名称 描述
    stCropWin Crop位置参数
    u8ZoomSensorId Crop 参数对应的sensor Id
  • 注意事项

    u8ZoomSensorId和sensor driver中pCus_sensor_GetCurSwtichSensorId回调函数回传值对应。

  • 相关数据类型及接口

    MI_ISP_ZoomTable_t


3.21. MI_ISP_ZoomTable_t

  • 说明

    定义 Zoom Table 类型。

  • 定义

    typedef struct MI_ISP_ZoomTable_s
    
    {
    
        MI_U32 u32EntryNum;
    
        MI_ISP_ZoomEntry_t *pVirTableAddr;
    
    } MI_ISP_ZoomTable_t;
    
  • 成员

    成员名称 描述
    u32EntryNum Zoom Table 中包含条目数量
    pVirTableAddr Zoom Table Buffer Pointer
  • 相关数据类型及接口

    MI_ISP_LoadPortZoomTable


3.22. MI_ISP_ZoomAttr_t

  • 说明

    定义 Zoom 属性。

  • 定义

    typedef struct MI_ISP_ZoomAttr_s
    
    {
    
        MI_U32 u32FromEntryIndex;
    
        MI_U32 u32ToEntryIndex;
    
        MI_U32 u32CurEntryIndex;
    
    } MI_ISP_ZoomAttr_t;
    
  • 成员

    成员名称 描述
    u32FromEntryIndex 开始运行Zoom 的条目索引
    u32ToEntryIndex 结束运行Zoom 的条目索引
    u32CurEntryIndex 当前Zoom 位置的索引
  • 相关数据类型及接口

    MI_ISP_StartPortZoom

    MI_ISP_GetPortCurZoomAttr

3.23. MI_ISP_CustSegAttr_t

  • 说明

    定义AI ISP属性。

  • 定义

    typedef struct MI_ISP_CustSegAttr_s
    {
        MI_ISP_CustSegMode_e        eMode;
        MI_ISP_InternalSeg_e         eFrom;
        MI_ISP_InternalSeg_e         eTo;
        MI_ISP_CustSegInPortParam_t  stInputParam;
        MI_ISP_CustSegOutPortParam_t stOutputParam;
    } MI_ISP_CustSegAttr_t;
    
  • 成员

    成员名称 描述
    eMode Pass1的模式
    eFrom Pass1的起始模块
    eTo Pass1的结束模块
    stInputParam Pass1 input port的属性
    stOutputParam Pass1 output port的属性
  • 注意事项

    参数具体作用,请参考MI_ISP_SetCustSegAttr的说明。

  • 相关数据类型及接口

    MI_ISP_SetCustSegAttr

    MI_ISP_GetCustSegAttr

3.24. MI_ISP_CustSegInPortParam_t

  • 说明

    Pass1 input port的属性。

  • 定义

    typedef struct MI_ISP_CustSegInPortParam_s
    {
        MI_SYS_PixelFormat_e ePixelFormat;
    } MI_ISP_CustSegInPortParam_t;
    
  • 成员

    成员名称 描述
    ePixelFormat 数据格式
  • 注意事项

    • Before 3DNR只支持12bit bayer和16bit bayer的输入输出。

    • Before WDR只支持16bit bayer的输入输出。

    • Before RGB2YUV只支持E_MI_SYS_PIXEL_FRAME_ARGB8888和E_MI_SYS_PIXEL_FRAME_RGB101010的输入输出。

  • 相关数据类型及接口

    MI_ISP_SetCustSegAttr

    MI_ISP_GetCustSegAttr

3.25. MI_ISP_CustSegOutPortParam_t

  • 说明

    Pass1 output port的属性。

  • 定义

    typedef struct MI_ISP_CustSegOutPortParam_s
    
    {
    
         MI_SYS_PixelFormat_e ePixelFormat;
    
    } MI_ISP_CustSegOutPortParam_t;
    
  • 成员

    成员名称 描述
    ePixelFormat 数据格式
  • 注意事项

    • Before 3DNR只支持12bit bayer和16bit bayer的输入输出。

    • Before WDR只支持16bit bayer的输入输出。

    • Before RGB2YUV只支持E_MI_SYS_PIXEL_FRAME_ARGB8888和E_MI_SYS_PIXEL_FRAME_RGB101010的输入输出。

  • 相关数据类型及接口

    MI_ISP_SetCustSegAttr

    MI_ISP_GetCustSegAttr

3.26. MI_ISP_CustSegMode_e

  • 说明

    AI ISP的模式。

  • 定义

    typedef enum
    
    {
    
         E_MI_ISP_CUST_SEG_MODE_NONE = 0,
    
         E_MI_ISP_CUST_SEG_MODE_INSERT,
    
         E_MI_ISP_CUST_SEG_MODE_REPLACE,
    
         E_MI_ISP_CUST_SEG_MODE_MAX
    
    } MI_ISP_CustSegMode_e;
    
  • 成员

    成员名称 描述
    E_MI_ISP_CUST_SEG_MODE_NONE 关闭AI ISP
    E_MI_ISP_CUST_SEG_MODE_INSERT 插入模式
    E_MI_ISP_CUST_SEG_MODE_REPLACE 替换模式
    E_MI_ISP_CUST_SEG_MODE_MAX 模式的最大值
  • 相关数据类型及接口

    MI_ISP_SetCustSegAttr

    MI_ISP_GetCustSegAttr

3.27. MI_ISP_InternalSeg_e

  • 说明

    ISP的模块名称。

  • 定义

    typedef enum
    {
        E_MI_ISP_SEG_INVALID = 0,
        E_MI_ISP_SEG_HDR,     // HDR
        E_MI_ISP_SEG_3DNR,    // 3DNR
        E_MI_ISP_SEG_WDR,     // WDR
        E_MI_ISP_SEG_RGB2YUV, // RGB2YUV
        E_MI_ISP_SEG_MAX
    } MI_ISP_InternalSeg_e;
    
  • 成员

    成员名称 描述
    E_MI_ISP_SEG_INVALID 无效模块
    E_MI_ISP_SEG_HDR HDR模块
    E_MI_ISP_SEG_3DNR DNR,Rotation/mirror/flip模块
    E_MI_ISP_SEG_WDR WDR模块
    E_MI_ISP_SEG_RGB2YUV RGB2YUV模块
    E_MI_ISP_SEG_MAX 模块的最大值
  • 相关数据类型及接口

    MI_ISP_SetCustSegAttr

    MI_ISP_GetCustSegAttr


4. ISP 错误码


API 错误码如下表所示。

错误代码 宏定义 描述
0xA0078001 MI_ERR_ISP_INVALID_CHNID 设备通道号无效
0xA0078002 MI_ERR_ISP_INVALID_PORTID 设备端口号无效
0xA0078003 MI_ERR_ISP_ILLEGAL_PARAM 非法参数
0xA0078004 MI_ERR_ISP_EXIST 设备已经退出
0xA0078005 MI_ERR_ISP_UNEXIST 设备还没有退出
0xA0078006 MI_ERR_ISP_NULL_PTR 空指针参数
0xA0078008 MI_ERR_ISP_NOT_SUPPORT 不支持
0xA0078009 MI_ERR_ISP_NOT_PERM 操作不允许
0xA007800C MI_ERR_ISP_NOMEM 分配内存失败
0xA007800D MI_ERR_ISP_NOBUF 内存已经使用完
0xA007800E MI_ERR_ISP_BUF_EMPTY 视频输入缓存为空
0xA0078010 MI_ERR_ISP_NOTREADY 设备未初始化完成
0xA0078012 MI_ERR_ISP_BUSY 设备系统繁忙

5. PROCFS介绍


5.1. cat

  • 调试信息

    # cat /proc/mi_modules/mi_isp/mi_isp0
    

  • 调试信息分析

    记录当前ISP的使用状况以及相关属性、可以动态地获取到这些信息,方便调试和测试。

  • 参数说明

    参数 描述
    ISP Dev info DevId Isp Dev Id
    CreChnNum 当前 Chn 数量
    DevMask Stitch Dev Mask
    cmdq Cmdq 指针
    En ISR 中断使能标志
    Mode ISR 中断模式
    num ISR ID
    VsyncCnt ISR ID
    FrameDoneCnt ISR Frame Done Cnt
    DropCnt ISR Frame Drop Cnt
    ISP Chn info DevId Isp Dev Id
    ChnId Isp Chn Id
    start Chn Start Flag
    SnrId Bind sensorId
    Sync3A Sync 3A type
    chnNum Muti chn Num
    Crop Input Crop Size
    InSize Input Size
    pixel Input pixel format
    Stride Input Buffer Stride
    Atom 底层拿住 buffer 数量
    Atom0 释放 buffer 后底层没有 buffer 数量
    Rot Rotation 角度
    bMirror/Flip 水平/竖直 翻转
    3DNRLevel 3DNR Level
    HdrMode HDR mode
    PreCnt/EnqCnt/BarCnt/ checkin/checkout/DeqC nt/DropCnt Callback 接口执行次数
    EnqOTNull Enq 时 OutBuffer 为 Null 次数统计
    ISP OutPut Port info DevId Dev Id
    ChnId Plane id
    PortID Port Id
    Bindtype 与后级绑定模式
    Enable Port enable flag
    Pixel Port output pixel format
    PortCrop output Crop Size
    Stride Output Stride
    GetCnt 尝试获取 OutPut buffer 数量
    Failcnt 获取 OutPut buffer 失败数量
    FinishCnt 处理完 OutPut buffer 数量
    fps Output port frame rate


5.2. echo

# echo help > /proc/mi_modules/mi_isp/mi_isp0 

Echo help 查看可用命令

功能
打印所有 channel 锁的使用 function 和 line 和 time
命令 echo debugmutex > /proc/mi_modules/mi_isp/mi_isp0
参数说明
举例
功能
Stop 指定 channel
命令 echo stopchnl [ChnID] [ON/OFF] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 [ChnId] 通道号
[ON/OFF] ON: stop chn; OFF: start chn
举例 echo stopchnl 0 ON > /proc/mi_modules/mi_isp/mi_isp0
功能
Dump选定channel的output数据,并保存在/path路径下
命令 echo dumptaskfile [chnid, Cnt, /path/, bOnlyDumpResChange, bdumpport] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
Cnt: dump 数量
Path: 存放dump出来文件的路径
bOnlyDumpResChange: 有时候有些花图在切分辨率时产生,敲 dump 命令和切分辨率操作不好配合,可以先设置该参数,然后再切分辨率,当程序识别到分辨率变化时就会将分辨率变化后的那张 buffer dump 出来。 (非必选参数)
Bdumpport: 只dump 某一个portid,默认是dump 所有在输出的port。 (非必选参数)
举例 echo dumptaskfile 0 1 /mnt > /proc/mi_modules/mi_isp/mi_isp0
功能
设置Dev的atomvalue
命令 echo setatom [AtomValue] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 AtomValue: input realtime mode下Driver 最大持有buffer 数量
举例 echo setatom 3 > /proc/mi_modules/mi_isp/mi_isp0
注意:有时候底层卡住,可以尝试增大该atom,加塞一张buffer 给driver,重新trig,看是否可以恢复,或者掉帧的时候,加大是否可以满帧。
功能
清除指定channel port的input/output/done buffer
命令 echo clearbuf [chnid, portid bClearInput, bclearoutput, bcleardonebuff] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
Portid: port id
bClearInput: 清除input的buffer
bclearoutput: 清除output的buffer
bcleardonebuff: 清除done的buffer
举例 echo clearbuf 0 0 1 0 0 > /proc/mi_modules/mi_isp/mi_isp0
功能
设置debug level
命令 echo debuglv [level] >/proc/mi_modules/mi_isp/mi_isp0
echo debuglv [chnid][level] >/proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
Level:
单个level参数时: 1:isp api,2:flow,4:check irq done
两个参数时: 1:check buffer,2:check loop,4:check frame pts,8:check fence done,16:check func time,32:check sidebandmsg,64:check zoominfo
举例 echo debuglv 4 > /proc/mi_modules/mi_isp/mi_isp0 //打开check irq done 相关的MI打印
echo debuglv 0 3 > /proc/mi_modules/mi_isp/mi_isp0 //打开channel0 level3的打印,打印buffer info和loop info
功能
主动drop frame 数量
命令 echo skipframe [chnid, skipnum] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
skipnum: drop frame count
举例 echo skipframe 0 60 > /proc/mi_modules/mi_isp/mi_isp0
功能
保护outputport buffer
命令 echo protectport [chnid portid clientid ben] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
Portid: port id
Clientid: isp:0x23, LDC:0x0e, scl(0,1,2):0x19, 0x1c, 0x1d
ben: 使能
举例 echo protectport 0 0 0x23 1 > /proc/mi_modules/mi_isp/mi_isp0 //保护channel0 pass0 port0 的isp
功能
将 Bind Q 中缓存的 buffer 消耗掉
命令 echo clearbindq [chnid bclear] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
bclear: 是否clear
举例 echo clearbindq 0 1 > /proc/mi_modules/mi_isp/mi_isp0 //clear channel0 bindQ
将 Bind Q 中缓存的 buffer 消耗掉。
有时候前端拿不到 buffer,发现是ISP BindQ塞满,判断 ISP 是否拿的不够快,将bindQ清空,看BindQ中是否还会累加上来,如果还累加则说明ISP拿的不够快,如果不再增加,说明是之前一次异常塞在里面一直没有消耗掉。
功能
设置打印帧率,低于该值打印出来
命令 echo fpsth [chnid portid fpsint fpsfloat] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
Portid: port id
fpsint: 帧率整数位
fpsfloat: 帧率小数位
举例 echo fpsth 0 0 30 30 > /proc/mi_modules/mi_isp/mi_isp0 // channel0 port0中小于30.30的fps打印出来
功能
设置port是否enable
命令 echo enableport [chnid, portid, bEn] > /proc/mi_modules/mi_isp/mi_isp0
参数说明 Chnid: channel id
Portid: port id
bEn: 1/0
举例 echo enableport 0 0 1 > /proc/mi_modules/mi_isp/mi_isp0