hi3559_imx334_sensor修改配置1080P60
hi3559 imx334 sensor修改1080P60
先說一下我的需求:讓hi3559上支持驅(qū)動(dòng)Mp60/4MP60 的imx334
海思把一些可能用到的驅(qū)動(dòng)文件開放讓我們修改,這樣我們確實(shí)是可以做一些自己的適配,挺好的
先給指一下路,imx334路徑
obj文件是編譯之后會(huì)生成的,編譯之前沒有很正常。
主要要修改的就是imx334_cmos.c,imx334_sensor_ctl.c
然后思路就是修改底層之后在上層(sample)做適配,本文最終呈現(xiàn)基于海思官方SDK下的sample下的vio
另外,原理不清楚,但是親測(cè)ko文件是不用重新生成的。
具體的修改測(cè)試方法是:
先修改component 下的底層驅(qū)動(dòng)-> make clean->make
再修改sample_comm_vi.c,sample_comm_isp.c/sample_comm_isp.h 新增對(duì)應(yīng)的驅(qū)動(dòng)配置,
最后修改sample 下的Makefile.param,把SENSOR0_TYPE配成你新生成的配置(如果你回改可以配其他的)
334驅(qū)動(dòng)修改
如果直接說這玩意改哪個(gè)地方的代碼就沒必要寫個(gè)東西記錄了,直接移步下載就可以了,重點(diǎn)說一下修改的思路,以防萬一之后有什么需要還得重新看,雖然也沒看全。
HIISP開發(fā)參考.pdf
下面的圖說了ISP用到的的幾個(gè)指針的功能,
這里說了這幾個(gè)函數(shù)指針的功能,所以cmos.c和ctl.c是在生成函數(shù)指針給海思內(nèi)核調(diào)用,根據(jù)個(gè)人觀察 ,他的調(diào)用方法是沒有開放的,也就是說只能通過修改他給的接口的函數(shù)指針,讓他去執(zhí)行我們寫的函數(shù),從而實(shí)現(xiàn)初始化/驅(qū)動(dòng)。
個(gè)人建議是把這個(gè)手冊(cè)ISP初始化的部分跳著看一看的
這里可以看到初始化有兩個(gè)前置函數(shù) ,內(nèi)存初始化不看,看屬性配置HI_MPI_SetPubAttr
下面是SDK功能的描述
也就是說我們的一切修改都是在修改這幾個(gè)函數(shù),修改它對(duì)相機(jī)的配置
剩下的都是用得到的時(shí)候再看就來得及,這里貼上來看一眼
cmos.c
cmos_set_image_mode
根據(jù)傳進(jìn)來的image的尺寸設(shè)定初始化的模式,下面是我的部分配置
if (f32Fps <= 120) {if (pstSnsState->enWDRMode == WDR_MODE_NONE) {if (f32Fps==60 && IMX334_RES_IS_2K60_12BIT(u32W,u32H)) {u8SensorImageMode = IMX334_2M_60FPS_12BIT_LINEAR_MODE;pstSnsState->u32FLStd = IMX334_VMAX_8M_30FPS_12BIT_LINEAR;}else if(f32Fps>=60){u8SensorImageMode = IMX334_8M_60FPS_12BIT_LINEAR_MODE;pstSnsState->u32FLStd = IMX334_VMAX_8M_30FPS_12BIT_LINEAR;}else if(f32Fps>=60){u8SensorImageMode = IMX334_2M_120FPS_12BIT_LINEAR_MODE;pstSnsState->u32FLStd = IMX334_VMAX_8M_30FPS_12BIT_LINEAR;}else if(IMX334_RES_IS_4K30_12BIT(u32W, u32H)){u8SensorImageMode = IMX334_8M_30FPS_12BIT_LINEAR_MODE;pstSnsState->u32FLStd = IMX334_VMAX_8M_30FPS_12BIT_LINEAR;}可以看到傳進(jìn)來給這個(gè)函數(shù)識(shí)別的結(jié)構(gòu)體只剩下下面的幾個(gè)屬性
typedef struct hiISP_CMOS_SENSOR_IMAGE_MODE_S {HI_U16 u16Width;HI_U16 u16Height;HI_FLOAT f32Fps;HI_U8 u8SnsMode; } ISP_CMOS_SENSOR_IMAGE_MODE_S;也就是說最好根據(jù)幀率,尺寸來確定這個(gè)東西的初始化配置,那個(gè)額外的參數(shù)怎么傳還不大確定,也不太想去確定了,也就是說在這里根據(jù)對(duì)面ISP 接口傳進(jìn)來的屬性配置之后的初始化方案。
剩下的思路就是Ctrl+F “IMX334_8M_30FPS_12BIT_LINEAR_MODE” 這個(gè)配置的位置,配置當(dāng)為"IMX334_2M_60FPS_12BIT_LINEAR_MODE"時(shí)候應(yīng)該有的操作
比如
僅供參考
cmos_init_sensor_exp_function
重點(diǎn)說一下這個(gè)函數(shù)的接口的指針函數(shù)的定義,不過一般也不用改,如果自己寫全部的話需要了解
sensor_register_callback
這個(gè)是包括ae,awb等一些額外功能在內(nèi)的函數(shù)的注冊(cè)函數(shù),大概就是讓系統(tǒng)知道這段函數(shù)代碼的指針位置,一般也不用改
cmos_set_pixel_detect
static HI_VOID cmos_set_pixel_detect(VI_PIPE ViPipe, HI_BOOL bEnable) {HI_U32 u32FullLines_5Fps;ISP_SNS_STATE_S *pstSnsState = HI_NULL;IMX334_SENSOR_GET_CTX(ViPipe, pstSnsState);CMOS_CHECK_POINTER_VOID(pstSnsState);if (pstSnsState->enWDRMode == WDR_MODE_2To1_LINE) {u32FullLines_5Fps = (IMX334_VMAX_8M_30FPS_12BIT_2TO1_WDR * 30) / 5;} else {if (pstSnsState->u8ImgMode == IMX334_8M_30FPS_12BIT_LINEAR_MODE) {u32FullLines_5Fps = (IMX334_VMAX_8M_30FPS_12BIT_LINEAR * 30) / 5;} else if (IMX334_8M_60FPS_12BIT_LINEAR_MODE == pstSnsState->u8ImgMode) {u32FullLines_5Fps = (IMX334_VMAX_8M_30FPS_12BIT_LINEAR * 60) / 5;} else if (IMX334_2M_60FPS_12BIT_LINEAR_MODE == pstSnsState->u8ImgMode) {u32FullLines_5Fps = (IMX334_VMAX_8M_30FPS_12BIT_LINEAR * 60) / 5;} else if (IMX334_2M_120FPS_12BIT_LINEAR_MODE == pstSnsState->u8ImgMode) {u32FullLines_5Fps = (IMX334_VMAX_8M_30FPS_12BIT_LINEAR * 120) / 5;} else {return;}}if (bEnable) { /* setup for ISP pixel calibration mode *//* Sensor must be programmed for slow frame rate (5 fps and below) *//* change frame rate to 5 fps by setting 1 frame length *//* Analog and Digital gains both must be programmed for their minimum values */imx334_write_register(ViPipe, IMX334_PGC_L, 0x00);imx334_write_register(ViPipe, IMX334_PGC_H, 0x00);imx334_write_register(ViPipe, IMX334_VMAX_L, u32FullLines_5Fps & 0xFF);imx334_write_register(ViPipe, IMX334_VMAX_M, (u32FullLines_5Fps & 0xFF00) >> 8);imx334_write_register(ViPipe, IMX334_VMAX_H, (u32FullLines_5Fps & 0xF0000) >> 16);} else { /* setup for ISP 'normal mode' */pstSnsState->u32FLStd = (pstSnsState->u32FLStd > IMX334_FULL_LINES_MAX) ? IMX334_FULL_LINES_MAX : pstSnsState->u32FLStd;imx334_write_register(ViPipe, IMX334_VMAX_L, (pstSnsState->u32FLStd & 0xff));imx334_write_register(ViPipe, IMX334_VMAX_M, (pstSnsState->u32FLStd & 0xff00) >> 8);imx334_write_register(ViPipe, IMX334_VMAX_H, (pstSnsState->u32FLStd & 0xf0000) >> 16);pstSnsState->bSyncInit = HI_FALSE;}return; }ctl.c
imx334_init
這個(gè)函數(shù)主要實(shí)現(xiàn)init 一些寄存器的配置
下面是在網(wǎng)上抄的reg配置 334 1080P60,親測(cè)配置可用
另外init函數(shù),不存在的標(biāo)簽自己定義一下宏
void imx334_init(VI_PIPE ViPipe) {HI_U8 u8ImgMode;HI_BOOL bInit;bInit = g_pastImx334[ViPipe]->bInit;u8ImgMode = g_pastImx334[ViPipe]->u8ImgMode;/* 1. sensor i2c init */imx334_i2c_init(ViPipe);if (bInit == HI_FALSE) {/* 2. sensor registers init */if (u8ImgMode == IMX334_8M_30FPS_12BIT_LINEAR_MODE) { /* 4K@30fps Linear */imx334_linear_8M30_12bit_init(ViPipe);} else if (IMX334_8M_30FPS_12BIT_2t1_DOL_MODE == u8ImgMode) { /* 4K@30fps DOL2 */imx334_DOL_2t1_8M30_12bit_init(ViPipe);} else if (IMX334_8M_60FPS_12BIT_LINEAR_MODE == u8ImgMode) { /* 4K@60fps Linear */imx334_linear_8M60_12bit_init(ViPipe);} else if (IMX334_2M_120FPS_12BIT_LINEAR_MODE == u8ImgMode) { /* 1K@120fps Linear */imx334_linear_2M120_12bit_init(ViPipe);} else if (IMX334_2M_60FPS_12BIT_LINEAR_MODE == u8ImgMode) { /*2K@60fps Linear */imx334_linear_2M60_12bit_init(ViPipe);}} else {/* When sensor switch mode(linear<->WDR or resolution), config different registers(if possible) *//* 2. sensor registers init */if (u8ImgMode == IMX334_8M_30FPS_12BIT_LINEAR_MODE) { /* 4K@30fps Linear */imx334_linear_8M30_12bit_init(ViPipe);} else if (IMX334_8M_30FPS_12BIT_2t1_DOL_MODE == u8ImgMode) { /* 4K@30fps DOL2 */imx334_DOL_2t1_8M30_12bit_init(ViPipe);} else if (IMX334_8M_60FPS_12BIT_LINEAR_MODE == u8ImgMode) { /* 4K@60fps Linear */imx334_linear_8M60_12bit_init(ViPipe);} else if (IMX334_2M_120FPS_12BIT_LINEAR_MODE == u8ImgMode) { /* 2K@120fps Linear */imx334_linear_2M120_12bit_init(ViPipe);}else if (IMX334_2M_60FPS_12BIT_LINEAR_MODE == u8ImgMode) { /*2K@60fps Linear */imx334_linear_2M60_12bit_init(ViPipe); }}g_pastImx334[ViPipe]->bInit = HI_TRUE;return;}至此,底層修改就說道這,深的也還沒看
isp接口修改
Makefile.param
新寫一個(gè)宏 這個(gè)宏定義的位置在sample_common.h
typedef enum hiSAMPLE_SNS_TYPE_E {SONY_IMX477_MIPI_12M_30FPS_12BIT,SONY_IMX477_MIPI_9M_50FPS_10BIT,SONY_IMX477_MIPI_9M_60FPS_10BIT,SONY_IMX477_MIPI_8M_60FPS_12BIT,SONY_IMX477_MIPI_8M_30FPS_12BIT,SONY_IMX290_MIPI_2M_30FPS_12BIT,SONY_IMX290_MIPI_2M_30FPS_12BIT_WDR3TO1,SONY_IMX334_SLAVE_MIPI_8M_30FPS_12BIT,SONY_IMX334_MIPI_8M_30FPS_12BIT,SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1,SONY_IMX334_MIPI_8M_60FPS_12BIT,SONY_IMX334_MIPI_2M_60FPS_12BIT,SONY_IMX334_MIPI_2M_120FPS_12BIT,SONY_IMX277_SLVS_8M_120FPS_10BIT,SONY_IMX277_SLVS_8M_30FPS_12BIT,SONY_IMX277_SLVS_8M_60FPS_12BIT,SONY_IMX277_SLVS_12M_30FPS_12BIT,SONY_IMX277_SLVS_2M_240FPS_12BIT,COMSIS_SHARP8K_SLVDS_8K_30FPS_12BIT,SAMPLE_SNS_TYPE_BUTT, } SAMPLE_SNS_TYPE_E;下面的是param里面的配置
## SENSOR0_TYPE ?= SONY_IMX334_MIPI_8M_30FPS_12BIT SENSOR0_TYPE ?= SONY_IMX334_MIPI_2M_60FPS_12BITsample_comm_vi.c
SAMPLE_COMM_VI_GetSizeBySensor
里面新加一個(gè)case
case SONY_IMX334_MIPI_2M_60FPS_12BIT:*penSize = PIC_1080P;break;SAMPLE_COMM_VI_GetFrameRateBySensor
switch (enMode)里面新加一個(gè)case
case SONY_IMX334_MIPI_2M_60FPS_12BIT:*pu32FrameRate = 60;break;SAMPLE_COMM_VI_GetChnAttrBySns
case SONY_IMX334_MIPI_2M_60FPS_12BIT:memcpy_s(pstChnAttr, sizeof(VI_CHN_ATTR_S), &CHN_ATTR_1920x1080_420_SDR8_LINEAR, sizeof(VI_CHN_ATTR_S));break;其中配置結(jié)構(gòu)體的定義
VI_CHN_ATTR_S CHN_ATTR_1920x1080_420_SDR8_LINEAR = {{1920, 1080},PIXEL_FORMAT_YVU_SEMIPLANAR_420,DYNAMIC_RANGE_SDR8,VIDEO_FORMAT_LINEAR,COMPRESS_MODE_NONE,0, 0,0,{ -1, -1} };SAMPLE_COMM_VI_GetPipeAttrBySns
加一個(gè)case
case SONY_IMX334_MIPI_2M_60FPS_12BIT:memcpy_s(pstPipeAttr, sizeof(VI_PIPE_ATTR_S), &PIPE_ATTR_1920x1080_RAW12_420_3DNR_RFR, sizeof(VI_PIPE_ATTR_S));break;結(jié)構(gòu)體定義
VI_PIPE_ATTR_S PIPE_ATTR_1920x1080_RAW12_420_3DNR_RFR = {VI_PIPE_BYPASS_NONE, HI_FALSE,HI_FALSE,1920, 1080,PIXEL_FORMAT_RGB_BAYER_12BPP,COMPRESS_MODE_LINE,DATA_BITWIDTH_12,HI_TRUE,{PIXEL_FORMAT_YVU_SEMIPLANAR_420,DATA_BITWIDTH_10,VI_NR_REF_FROM_RFR,COMPRESS_MODE_NONE},HI_FALSE,{ -1, -1} };SAMPLE_COMM_VI_GetDevAttrBySns
case SONY_IMX334_MIPI_2M_60FPS_12BIT:memcpy_s(pstViDevAttr, sizeof(VI_DEV_ATTR_S), &DEV_ATTR_IMX334_2M_BASE, sizeof(VI_DEV_ATTR_S));break;結(jié)構(gòu)體
VI_DEV_ATTR_S DEV_ATTR_IMX334_2M_BASE = {VI_MODE_MIPI,VI_WORK_MODE_1Multiplex,{0xFFF00000, 0x0},VI_SCAN_PROGRESSIVE,{-1, -1, -1, -1},VI_DATA_SEQ_YUYV,{/*port_vsync port_vsync_neg port_hsync port_hsync_neg */VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL,VI_HSYNC_NEG_HIGH,VI_VSYNC_VALID_SINGAL,VI_VSYNC_VALID_NEG_HIGH,/*hsync_hfb hsync_act hsync_hhb*/{0, 1280, 0,/*vsync0_vhb vsync0_act vsync0_hhb*/0, 720, 0,/*vsync1_vhb vsync1_act vsync1_hhb*/0, 0, 0}},VI_DATA_TYPE_RGB,HI_FALSE,{1920, 1080},{{{1920 , 1080},},{VI_REPHASE_MODE_NONE,VI_REPHASE_MODE_NONE}},{WDR_MODE_NONE,1080},DATA_RATE_X1 };SAMPLE_COMM_VI_GetComboAttrBySns
case SONY_IMX334_MIPI_2M_60FPS_12BIT:if (0 == MipiDev){memcpy_s(pstComboAttr, sizeof(combo_dev_attr_t), &MIPI_4lane_CHN0_SENSOR_IMX334_12BIT_2M_NOWDR_ATTR, sizeof(combo_dev_attr_t));}結(jié)構(gòu)體
combo_dev_attr_t MIPI_4lane_CHN4_SENSOR_IMX477_12BIT_12M_NOWDR_ATTR = {.devno = 4,.input_mode = INPUT_MODE_MIPI,.data_rate = MIPI_DATA_RATE_X1,.img_rect = {0, 0, 4000, 3000},{.mipi_attr ={DATA_TYPE_RAW_12BIT,HI_MIPI_WDR_MODE_NONE,{8, 9, 10, 11, -1, -1, -1, -1}}} };vi要改的基本就是這樣 下面改isp.c
sample_comm_isp.c
SAMPLE_COMM_ISP_GetSnsObj
case SONY_IMX334_MIPI_2M_60FPS_12BIT:case SONY_IMX334_MIPI_2M_120FPS_12BIT:return &stSnsImx334Obj;SAMPLE_COMM_ISP_GetIspAttrBySns
case SONY_IMX334_MIPI_2M_60FPS_12BIT:memcpy(pstPubAttr, &ISP_PUB_ATTR_IMX334_2K_60FPS, sizeof(ISP_PUB_ATTR_S));break;其中結(jié)構(gòu)體:
ISP_PUB_ATTR_S ISP_PUB_ATTR_IMX334_2K_60FPS = {{0, 0, 1920, 1080},{1920, 1080},60,BAYER_RGGB,WDR_MODE_NONE,0, };至此,操作完畢,基本上,就ok了
編譯測(cè)試
在編譯完imx334這邊再重新編譯sample_vio ,然后調(diào)用SAMPLE_VIO_8K30_PARALLEL()之后就可以在電腦上得到圖像,沒有操作其他的也能得到圖像,具體原因懶得看了,因?yàn)橛邢旅孢@句話,
printf(“=Imx334 2M60fps 12bit LINE binning 4lane Init OK!=\n”);
所以在執(zhí)行程序后看見下圖就認(rèn)調(diào)成了
總結(jié)
以上是生活随笔為你收集整理的hi3559_imx334_sensor修改配置1080P60的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP判断客户端的浏览器类型
- 下一篇: 禁止访问Apache目录