本文主要是介绍海思Hi3518EV200(5)图像sensor驱动开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. sensor开发框图
2. 设备驱动加载及硬件系统配置
cd mpp/ko
load3518e脚本主要是用来配置硬件系统的参数(引脚复用、sensor时钟、VI时钟)加载驱动(.ko),包括访问sensor的I2C接口驱动。
离线模式时图像存入DDR中,在线模式时图像不存入DDR中。
在load3518e脚本中添加sensor的相关配置,这里使用smartsens的SC2135的200万像素的图像传感器。
insert_sns() {case $SNS_TYPE insc2135)himm 0x200f0040 0x2; # I2C0_SCLhimm 0x200f0044 0x2; # I2C0_SDA#cmos pinmuxhimm 0x200f007c 0x1; # VI_DATA13himm 0x200f0080 0x1; # VI_DATA10himm 0x200f0084 0x1; # VI_DATA12himm 0x200f0088 0x1; # VI_DATA11himm 0x200f008c 0x2; # VI_VShimm 0x200f0090 0x2; # VI_HShimm 0x200f0094 0x1; # VI_DATA9himm 0x2003002c 0xb4001; # sensor unreset, clk 27MHz, VI 148.5MHz# himm 0x20030104 0x1; # vpss 148.5MHz ;; *) echo "xxxx Invalid sensor type SNS_TYPE xxxx"
report_error;;
esac
}
insert_ko()
{
# sys config
sys_config;
# driver load
insmod mmz.ko mmz=anonymous,0,mmz_start, mmzsizeanony=1||reporterrorinsmodhimedia.koinsmodhi3518ebase.koinsmodhi3518esys.kovivpssonline= b_arg_online sensor=$SNS_TYPE insmod hi3518e_tde.ko insmod hi3518e_region.ko insmod hi3518e_vgs.ko insmod hi3518e_isp.ko insmod hi3518e_viu.ko detect_err_frame=10; insmod hi3518e_vpss.ko rfr_frame_comp=1; insmod hi3518e_vou.ko #insmod hi3518e_vou.ko transparentTransmit=1 #enable transparentTransmit insmod hifb.ko video="hifb:vram0_size:1620" # default pal insmod hi3518e_rc.ko insmod hi3518e_venc.ko insmod hi3518e_chnl.ko ChnlLowPower=1 insmod hi3518e_h264e.ko insmod hi3518e_jpege.ko insmod hi3518e_ive.ko save_power=0; # insmod hi3518e_ive.ko insmod extdrv/sensor_i2c.ko echo "==== Your input Sensor type is SNS_TYPE ===="
insmod extdrv/pwm.ko
insmod extdrv/piris.ko
#insert_sns > /dev/null
insert_sns
insert_audio
insmod hi_mipi.ko
echo "==== Your input Sensor type isSNS_TYPE ====" }
3. sensor的库文件生成(.so)
sensor的库文件需要在Linux服务器中的SDK包中编译得到,将生成的.so文件放到SDK包中的stream软件包中的Hi3518E_Stream_xxx/libs目录下。
sensor_ctl.c实现sensor的读写初始化。
sensor_cmos.c主要实现ISP需要的回调函数,包括ISP、AE、AWB等。
- //ISP function
- HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc)
- {
- memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S));
- pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init;
- pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit;
- pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init;
- pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode;
- pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode;
- pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default;
- pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level;
- pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect;
- pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info;
- return 0;
- }
- //AE function
- HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs)
- {
- memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S));
- pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default;
- pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set;
- pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set;
- pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update;
- pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update;
- pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table;
- pstExpFuncs->pfn_cmos_get_inttime_max = cmos_get_inttime_max;
- return 0;
- }
- //AWB function
- HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs)
- {
- memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S));
- pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default;
- return 0;
- }
//ISP function
HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc)
{memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S));pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init;pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit;pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init;pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode;pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode;pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default;pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level;pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect;pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info;return 0;
}//AE function
HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs)
{memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S));pstExpFuncs->pfn_cmos_get_ae_default = cmos_get_ae_default;pstExpFuncs->pfn_cmos_fps_set = cmos_fps_set;pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set; pstExpFuncs->pfn_cmos_inttime_update = cmos_inttime_update;pstExpFuncs->pfn_cmos_gains_update = cmos_gains_update;pstExpFuncs->pfn_cmos_again_calc_table = cmos_again_calc_table;pstExpFuncs->pfn_cmos_get_inttime_max = cmos_get_inttime_max; return 0;
}//AWB function
HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs)
{memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S));pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default;return 0;
}
4. 修改stream软件包的.ini文件
sc2135_1080p_line.ini文件在Hi3518E_Stream_xxx/configs目录下,改文件主要指定.so文件的位置、输入视频的接口(LVDS/MIPI/DVP)、视频格式(分辨率、同步方式、目标帧率等)等系统配置。
5. 运行stream软件
运行stream软件包中的HiIspTool.sh脚本,通过以太网卡与上位机的PQTools建立通信。
cd /Hi3518E_Stream_V1.0.2.0./HiIspTool.sh -a -p sc2135_1080p_line.ini
ittb_control进程是基于TCP的服务端,负责控制信号的传输。
ittb_stream进程也是基于TCP的服务端,负责播放H.264或YUV视频流。
6. 运行PQ Tools
双击PQ Tools图片,弹出如下对话框,设置IP地址。
在下拉菜单中选择TTP_Stream.exe选项
7. 最终结果
这篇关于海思Hi3518EV200(5)图像sensor驱动开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!