如何在DM8127 SDK3.8里面添加一款新的sensor

当我们从TI那里拿到SDK3.8源码包过后,发现源码包里面只支持部分的sensor的接入,可能不支持我们想要的sensor接入,那么我们就得在sdk里面添加相关自己想要接入的sensor的源码,那该如何接入呢?对于像我这样的新手来说,确实是个问题,经过几天的源码琢磨,小有收获,于是把自己的经验分享给大家,废话少说,直接说新sensor如何接入吧!

以下就以sony传感器imx174为例(接入分辨率1920*1080),其他厂家的sensor接入大体一致。

1、  首先要编写imx174驱动和添加必要的文件

a)        在ti_tools\iss_08_80_00_00\pakages\ti\psp\devices目录下新增imx174用来存放驱动源码;驱动代码的编写得参考imx174的datasheet及相关的硬件资料说明(包 sensor与核心板的通信方式等)。我的imx174目录下主要有以下文件:

issdrv_imx174.h   //供外部调用的头文件

issdrv_imx174_config.h //配置头文件

SRC_FILES.MK   //Makefile子文件,make时调用编译源码

b)        在imx174目录里面新建src源码目录,其里面主要有一下文件:

imx174_reg_setting.h  //寄存器相关配置

issdrv_imx174Api.c  //驱动源码

issdrv_imx174I2c.c  //I2C通信源码

issdrv_imx174Priv.h //驱动源码头文件,包括相关的结构体、函数等

c)        ti_tools\iss_03_80_00_00\packages\ti\psp\iss\drivers\alg\2A\src目录下添加

issdrv_algTIawbCalcData_IMX174.c文件,这个文件是保存2A的相关参数


2、  驱动编写好之后,接下来就是修改其他文件,添加相应的imx174的设置源码

 

a)        ti_tools\iss_08_80_00_00\pakages\ti\psp\devices目录下

 

iss_device.h 文件里面添加:

#define FVID2_ISS_SENSOR_IMX174_DRV  (ISS_SENSOR_DRV_BASE + 0x0016u)

 

Makefile文件里面添加:

ifeq($(IMGS_ID),IMGS_SONY_IMX174)  

   SRCDIR = srcimx174/src

endif

 

ifeq ($(IMGS_ID),IMGS_SONY_IMX174)  

   include$(MODULE_SRC_BASE_PATH)/imx174/SRC_FILES.MK

endif

 

b)        ti_tools\iss_03_80_00_00\packages\ti\psp\iss\core\src目录下

 

Iss_params_default.c文件

IssIsifFillDefaultParams(iss_config_processing_t *iss_config)

{

             ………

#elif defined IMGS_SONY_IMX174

                             iss_config->clamp->dcoffset_clamp_value= (uint16)-240;

……

}

 

Isp_msp.c文件

MSP_ERROR_TYPE MSP_ISP_config(……)函数

{

            ………

#if defined(IMGS_SONY_IMX174)

          isp_regs->ISP5_CTRL &= ~(1 << 22);

             ………

}


c)        ti_tools\iss_08_80_00_00\pakages\ti\psp\iss\drivers\alg\2A\src目录下

issdrv_alg2AApi.c文件

Int32 IssAlg_capt2AProcessTI(……)函数

{

            ……

            #ifdefined(IMGS_MICRON_MT9M034) | defined ( IMGS_SONY_IMX174)

            ……

}

 

issdrv_algTIaewb.c文件

#if defined(IMGS_SONY_IMX174)

#undef BAYER_PATTERN_GRBG

#define BAYER_PATTERN_GBRG 2

#endif

ALG_aewbCreate(……)函数

{

            …….

#elif defined IMGS_SONY_IMX174

            gTi2aControlParams.dGainMin           = 1024;    

            gTi2aControlParams.dGainMax                         =8191;  gTi2aControlParams.minExposure         = 100;

         gTi2aControlParams.stepSize            = 100;  

         gTi2aControlParams.aGainMin            = 1000;

         gTi2aControlParams.aGainMax            = 256000; 

         gTi2aControlParams.maxExposure         = 40000;

         gALG_TI_aewbObj.flicker_detect         = FDC_DISABLED;

         gTi2aControlParams.flicker_sel         = 1;

                   gTi2aControlParams.flickerFreq               = 50;

            ……

}

TI_2A_config(……)函数

{

……

#ifdef IMGS_SONY_IMX174

  retval=AWB_TI_AWB.control((IAWB_Handle)gALG_TI_aewbObj.handle_awb,TIAWB_CMD_CALIBRATION, (IAWB_DynamicParams*)&awb_calc_data_normal,NULL);

  #else

……

}

int ALG_aewbControl(void)函数

{

            ……

#if defined(IMGS_SONY_IMX174) &&  defined(WDR_ON)

                   gTi2aControlParams.maxExposure                   = 33184;

……

}

 

issdrv_algTIawbCalcData.c文件

#ifdef IMGS_SONY_IMX174

#include "issdrv_algTIawbCalcData_IMX174.c"

#endif


d)        ti_tools\iss_03_80_00_00\packages\ti\psp\iss\drivers\capture\src目录下

issdrv_captureApi.c文件

Void Issdrv_captSetDefaultH3APrms()函数

{

            ……

#elif defined (IMGS_SONY_IMX174)

gIss_captCommonObj.pIssConfig->ptH3aAewbParams->ptAewbPaxelWin->nHPos= 32;

            ……

}

Void IssCdrv_setIpipeCfg()函数

{

             …..

#elif defined IMGS_SONY_IMX174

ipipe_reg->SRC_COL= 0x4E;////Gr R B Gb

……

}

 

issdrv_ispApi.c文件

Void ispDrvSetOneShotMode(……)函数

{

……

#elif defined(IMGS_SONY_IMX174)

                ipipe_reg->SRC_COL= 0x4E;//Gr R B Gb

……

……

#elif definedIMGS_SONY_IMX174

            isif_reg->SLV0 = 13;

……

}

 

e)        ti_tools\iss_03_80_00_00\packages\ti\psp\devices\src目录下

Issdrv_device.c文件

#ifdef IMGS_SONY_IMX174

#include "ti/psp/devices/imx174/issdrv_imx174.h"

#endif

Int32 Iss_deviceInit(……)

{

            ……

#ifdef IMGS_SONY_IMX174

    Iss_Imx174PinMux();

#endif

……

……

#ifdef IMGS_SONY_IMX174

 status |=Iss_Imx174Init();

#endif

……

}

 

Int32 Iss_deviceDeInit()函数

{

……

#ifdef IMGS_SONY_IMX174

        status |=Iss_Imx174DeInit();

#endif        

……

}

f)         ti_tools\iss_08_80_00_00\pakages\ti\psp\platforms\ti814x\src目录下

iss_platformTI814x.c文件

Iss_platformTI814xGetSensorI2cAddr(…….)函数

{

……

UInt8 devAddrImx174[ISS_CAPT_INST_MAX] ={0x2d};//lvds324

……

……

case FVID2_ISS_SENSOR_IMX174_DRV:

   devAddr =devAddrImx174[vipInstId];

  break;

……

}

 

g)        ipnc_rdk\ipnc_mcfw\demos\mcfw_api_demos\multich_usecase目录下

ti_mcfw_ipnc_main.c文件

int main(int argc, char **argv)

{

……

#ifdef IMGS_SONY_IMX174

    gUI_mcfw_config.sensorId = SN_IMX174;

#endif

……

}


ti_mcfw_ipnc_main.h文件

……

typedef enum {

    MT_9J003 = 0,

…….

    SN_IMX1174

} UI_SENSOR_MODE;

……

 

h)        ipnc_rdk\ipnc_mcfw\mcfw\interfaces\link_api目录下

system_const.h文件

#define SYSTEM_DEVICE_VID_CAM_IMX138_DRV    (SYSTEM_DEVICE_VID_CAM_SENSOR_DRV_BASE +0x0016u)

 

i)          ipnc_rdk\ipnc_mcfw\mcfw\src_bios6\links_m3vpss\camera目录下

cameraLink_drv.c文件

Int32 CameraLink_drvCreateSensor(……)函数

{

……

#ifdef IMGS_SONY_IMX174

if((pInstPrm->videoDecoderId == FVID2_ISS_SENSOR_IMX174_DRV) &&(pInstPrm->vipInstId == ISS_CAPT_INST_VP || pInstPrm->vipInstId ==ISS_CAPT_INST_VP))

       #endif

……

}

 

j)          ti_tools\iss_03_80_00_00\packages\ti\psp\iss\alg\aewb\ti2a\awb\inc目录下

Alg_ti_aewb_priv.h文件

#ifdef IMGS_SONY_IMX174

extern awb_calc_data_t awb_calc_data_normal;

extern awb_calc_data_t awb_calc_data_High;

extern awb_calc_data_t awb_calc_data_MidHigh;

extern const unsigned char awb_calc_rgb2rgb1_normal[];

extern const unsigned char awb_calc_rgb2rgb2_normal[];

#endif

k)        ipnc_rdk目录下

Makefile文件

ifeq ($(IMGS_ID), IMGS_SONY_IMX174)

   @echo"dcc_default_imx174.bin selected"

   Cp $(EXEC_DIR)/dcc/dcc_default_imx174.bin$(EXEC_DIR)/dcc/dcc_default.bin

endif

  ......

ifeq ($(IMGS_ID), IMGS_SONY_IMX174)

mv$(TARGET_FS)/opt/ipnc/firmware/ipnc_rdk_fw_m3vpss.xem3$(TARGET_FS)/opt/ipnc/firmware/ipnc_rdk_fw_m3vpss.IMX174.xem3

endif

  .......


Rules.make文件

ifeq($(IPNC_DEVICE), DM8127)

  #IMGS_ID := IMGS_MICRON_MT9J003

            ……. 

  IMGS_ID := IMGS_SONY_IMX174

……..

else

……

endif

 

ifeq ($(IMGS_ID), IMGS_SONY_IMX174)

    CAPTURE_MODE:=IMX174_DATA_OP_LVDS324

endif

        

 

3、  如果sensor最大分辨率和默认(1920*1080)匹配,那么还需要修改下列文件里面相关分辨率的配置

ipnc_rdk\ipnc_mcfw\demos\mcfw_api_demos\multich_usecase\ti_mcfw_ipnc_main.h

ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\usecases目录下

multich_capturedisplay.c

multich_quadstream_noisefilter.c

multich_tristream_fullfeature.c

multich_tristream_lowpower.c

 

就这样,一款新的sensor就添加到SDK源码中了,编译、打包、烧写到板上,配合硬件工程师进行测试,初步调试,imx174图像能够正常输出,接入成功。后续还需要对图像进行一系列的调节优化。




------------------------------------------转载请保留原创-----------谢谢!-------------------------------------





你可能感兴趣的:(软件功能)