华为开发者空间 海思Hi3518EV200(5)图像sensor驱动开发

海思Hi3518EV200(5)图像sensor驱动开发

1. sensor开发框图2. 设备驱动加载及硬件系统配置cdmpp/ko#defaultonline./load3518e-a-sensorxxxx-osmem32-total64#vi_vpssoffline./load3518e-a-sensorxxxx-osmem32-total64-offlineload3518e脚本...

1. sensor开发框图


wKiom1fSl5mwA2ESAABzoRmaSVU881.jpg


2. 设备驱动加载及硬件系统配置

cd mpp/ko
# default online
./load3518e -a -sensor xxxx -osmem 32 -total 64
# vi_vpss offline
./load3518e -a -sensor xxxx -osmem 32 -total 64 -offline

load3518e脚本主要是用来配置硬件系统的参数(引脚复用、sensor时钟、VI时钟)加载驱动(.ko),包括访问sensor的I2C接口驱动。

离线模式时图像存入DDR中,在线模式时图像不存入DDR中。

在load3518e脚本中添加sensor的相关配置。

insert_sns()
{
	case $SNS_TYPE in
		xxxx)
			himm 0x200f0040 0x2;    			# I2C0_SCL
			himm 0x200f0044 0x2;    			# I2C0_SDA

			#cmos pinmux
			himm 0x200f007c 0x1;    			# VI_DATA13
			himm 0x200f0080 0x1;    			# VI_DATA10
			himm 0x200f0084 0x1;    			# VI_DATA12
			himm 0x200f0088 0x1;    			# VI_DATA11
			himm 0x200f008c 0x2;    			# VI_VS
			himm 0x200f0090 0x2;    			# VI_HS
			himm 0x200f0094 0x1;    			# VI_DATA9
			
			himm 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,$mmz_size anony=1 || report_error
	insmod hi_media.ko
	insmod hi3518e_base.ko

	insmod hi3518e_sys.ko vi_vpss_online=$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 is $SNS_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_p_w_picpath_mode = cmos_set_p_w_picpath_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文件

xxxx_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 xxxx_1080p_line.ini

ittb_control进程是基于TCP的服务端,负责控制信号的传输。

ittb_stream进程也是基于TCP的服务端,负责播放H.264或YUV视频流。

6. 运行PQ Tools

双击PQ Tools图片,弹出如下对话框,设置IP地址。

wKiom1fStgiBOLd5AABV6TYUyy8974.jpg

在下拉菜单中选择TTP_Stream.exe选项

wKiom1fStkDxwy9rAADdoeFseIU165.jpg


7. 最终结果

wKioL1fStqGzj4q-AAFyb_DMrWc691.jpg

转载于:https://blog.51cto.com/shugenyin/1851241

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐

  • 浏览量 1444
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献3493条内容