当我们从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图像能够正常输出,接入成功。后续还需要对图像进行一系列的调节优化。
------------------------------------------转载请保留原创-----------谢谢!-------------------------------------