1. sensor開發框圖
2. 設備驅動加載及硬件系統配置
cd mpp/ko
load3518e腳本主要是用來配置硬件系統的參數(引腳複用、sensor時鐘、VI時鐘)加載驅動(.ko),包括訪問sensor的I2C接口驅動。
離線模式時圖像存入DDR中,在線模式時圖像不存入DDR中。
在load3518e腳本中添加sensor的相關配置,這裏使用smartsens的SC2135的200萬像素的圖像傳感器。
insert_sns() { case $SNS_TYPE in sc2135) 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,
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_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. 最終結果