调试sc2232总结
1、驱动调试方法:
(1)首先,sc2232这款sensor厂家提供了3个配置文件config_entry.ini、sc2232_1080p25.ini、sc2232_1080p25_2lane.ini,另外两个驱动代码文件sc2232_cmos.c、sc2232_sensor_ctl.c等。
其中,sc2232_cmos.csc2232_cmos.c主要实现 ISP 需要的回调函数,这些回调函数中包含了 sensor 的适配算法,如注册了3a库回调函数,ae初始化参数,增益、帧率等初始化算法。
sc2232_sensor_ctl.c用于底层驱动控制,主要实现sensor的读写和初始化动作,也就是读写寄存器,主要是根据datasheet文档进行的代码开发。
(2)其次,讲讲3个配置文件,其中config_entry.ini是所有配置的入口,内容如下:
首先设置UserMode参数,该参数用于选择哪一种模式,0表示mode.0;1表示mode.1;这里刚开始我都不知道,后来慢慢研究才明白的。
然后,sc2232_1080p25.ini这个文件代表的是datasheet里面的DVP并行视频端口模式,也就是CMOS模式,这种模式是12-bit并行数据。
sc2232_1080p25_2lane.ini这个文件代表的是datasheet里面的MIPI模式,也就是串行视频端口模式,只是8/10bit,1/2lane串行输出。
(lane解释:用于连接发送端和接收端的一对高速差分线,既可以是时钟lane,也可以是数据lane。)
可以使用beyondcompare对比这两个文件,只有个别参数配置不一样。
(3)stream工具的使用方法
Stream工具需要上面说到的3个ini配置文件,当配置好参数之后,在stream的configs目录下建立一个sc2232目录,把ini配置文件放到目录下。还需要复制两个自适应配置文件,分别是普通模式和wdr模式的,当然如果厂家提供有的话就不用复制其他方案的了。这个配置文件在sc2232_1080p25.ini和sc2232_1080p25_2lane.ini里面可以设置是否使用。
最重要的是还要把前面说的两个.c驱动代码文件编译出来的的libsns_sc2232.so文件拷贝到libs目录下,这样stream才能真正调用了驱动代码使他生效。
好了,准备工作做好了,运行Stream工具之前要先kill掉固件程序,还要把watchdog
跑起来,所以执行
killall -9 guard && killall -9 core && /huamai/app/script/watchdog.sh > /dev/null &
然后挂载stream工具到设备,当然还要把pqtool也要一起挂载,方便调节参数。
运行stream:
./HiIspTool.sh -a sc2232
当执行ps有以下进程表示运行成功:
再运行windows端的ITTP_Stream.exe客户端进行连接,就可以看到视频了,前提是驱动和参数都没有问题。
(4)I2C寄存器值的调试
. 寄存器可以使用命令读写:usage: i2c_write . 0x1 0x56 0x0 0x28 2 2. . 0x1 0x56 0x0 0x28. default reg_width and data_width is 1. . usage: i2c_read . 0x1 0x56 0x0 0x10 2 2. . 0x1 0x56 0x0 0x10 2 2 2. . 0x1 0x56 0x0 0x10. default reg_width, data_width, reg_step is 1. i2c_num: ls /dev/i2c*, 一般有0x0 和 0x1 dev_addr: imx290的iic地址为0x34(固定) reg_addr: 开始寄存器地址 reg_addr_end: 结束寄存器地址 reg_width: 寄存器地址字节数 data_width: 数据字节数 但是命令读写太慢了,而且容易输错,海思pqtool提供了专门的读写I2C寄存器的工具 这个工具读写方便效率高,操作简单。 2、固件代码参数的修改。 (1)首先在chip_type_e里面添加芯片类型chip_type_sc2232 = 25; (2)然后在sal_video_init添加设置enViMode, else if(video_module->chip_type[0] == chip_type_sc2232) { enViMode = SMARTSENS_SC2232_MIPI_1080P_25FPS; } (3)sensor设备参数 combo_dev_attr_t MIPI_2lane_SENSOR_SC2232_10BIT_1080_NOWDR_ATTR = { .devno = 0, .input_mode = INPUT_MODE_MIPI, { .mipi_attr = { RAW_DATA_10BIT, HI_MIPI_WDR_MODE_NONE, {0, 1, -1, -1} } } }; 对应配置文件的[sensor_mode.0.0] (4)Isp_image参数修改: stPubAttr.enBayer = BAYER_BGGR; stPubAttr.stWndRect.s32X = 0; stPubAttr.stWndRect.s32Y = 0; stPubAttr.stWndRect.u32Width = 1920; stPubAttr.stWndRect.u32Height = 1080; stPubAttr.f32FrameRate = 25; 对应[isp_image.0]部分 (5)设置视频缓存池大小 调用接口HI_MPI_VB_SetConf设置缓存池大小,需要在hisi_mppsys_init函数添加: case chip_type_sc2232: case chip_type_ar0237: hi_sys.enSize[0] = PIC_HD1080; hi_sys.enSize[1] = PIC_HD720; hi_sys.enSize[2] = PIC_VGA; hi_sys.enSize[3] = PIC_HD1080; hi_sys.maxpicsize = PIC_HD1080; hi_sys.mmz_count[0] = 14; hi_sys.mmz_count[1] = 8; hi_sys.mmz_count[2] = 8; hi_sys.mmz_count[3] = 14; 对应【vb_conf】参数 (6)vi视频输入设备属性 调用HI_MPI_VI_SetDevAttr接口函数,设置属性: VI_DEV_ATTR_S DEV_ATTR_MIPI_BASE_SC2232 = { /* interface mode */ VI_MODE_MIPI, /* multiplex mode */ VI_WORK_MODE_1Multiplex, /* r_mask g_mask b_mask*/ {0xfff0000, 0x0}, /* progessive or interleaving */ VI_SCAN_PROGRESSIVE, /*AdChnId*/ { -1, -1, -1, -1}, /*enDataSeq, only support yuv*/ VI_INPUT_DATA_YUYV, /* synchronization information */ { /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ VI_VSYNC_FIELD, VI_VSYNC_NEG_HIGH, VI_HSYNC_VALID_SINGNAL, VI_HSYNC_NEG_HIGH, VI_VSYNC_NORM_PULSE, VI_VSYNC_VALID_NEG_HIGH, /*hsync_hfb hsync_act hsync_hhb*/ { 0, 1920, 0, /*vsync0_vhb vsync0_act vsync0_hhb*/ 0, 1080, 0, /*vsync1_vhb vsync1_act vsync1_hhb*/ 0, 0, 0 } }, /* use interior ISP */ VI_PATH_ISP, /* input data type */ VI_DATA_TYPE_RGB, /* bRever */ HI_FALSE, /* DEV CROP */ {0, 0, 1920, 1080} }; 对应【vi_dev.0】参数: 主要修改视频设备接口模式au32CompMask[VIU_DEV_COMP_MASK_NUM]; IntfMode 和分量掩码值 (7)设置VI通道属性 调用HI_MPI_VI_SetChnAttr设置vi通道属性,在MPP_COMM_VI_StartIspAndVi函数中添加sc2232的enViMode设置视频捕获区域的宽和高: case SMARTSENS_SC2232_MIPI_1080P_25FPS: stCapRect.u32Width = 1920; stCapRect.u32Height = 1080; 对应[vi_chn.0]参数: (8)Load3516cv300参数配置: sc2232) bus_type=\"i2c\"; pinmux_mode=\"i2c_mipi\"; sensor_clk_freq=27000000; intf_mode=\"default\"; viu_frequency=83300000; # 83.3M, viu clock frequency isp_div=1; # isp div clk, freq = viu_clk_freq / div ;; 参数解释: bus_type:总线类型,如i2c或者spi等类型; pinmux_mode:设置mipi串行或者dvp并行模式,以及其他模式; sensor_clk_freq:sensor的时钟频率; viu_frequency:视频采集单元viu的时钟频率; 因篇幅问题不能全部显示,请点此查看更多更全内容