海思Hi3518EV200(5)圖像sensor驅動開發

1. sensor開發框圖

 

wKiom1fSl5mwA2ESAABzoRmaSVU881.jpg

 

2. 設備驅動加載及硬件系統配置

cd mpp/ko




# default online ./load3518e -a -sensor sc2135 -osmem 32 -total 64 # vi_vpss offline ./load3518e -a -sensor sc2135 -osmem 32 -total 64 -offline

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,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 is
SNS_TYPE ====" }

 

3. sensor的庫文件生成(.so)

sensor的庫文件需要在Linux服務器中的SDK包中編譯得到,將生成的.so文件放到SDK包中的stream軟件包中的Hi3518E_Stream_xxx/libs目錄下。

wKiom1fSrKWSwkQLAAB-bfCJ3DQ706.jpg

sensor_ctl.c實現sensor的讀寫初始化。

sensor_cmos.c主要實現ISP需要的回調函數,包括ISP、AE、AWB等。

  1. //ISP function  
  2. HI_S32 cmos_init_sensor_exp_function(ISP_SENSOR_EXP_FUNC_S *pstSensorExpFunc)  
  3. {  
  4.     memset(pstSensorExpFunc, 0, sizeof(ISP_SENSOR_EXP_FUNC_S));  
  5.   
  6.     pstSensorExpFunc->pfn_cmos_sensor_init = sensor_init;  
  7.     pstSensorExpFunc->pfn_cmos_sensor_exit = sensor_exit;  
  8.     pstSensorExpFunc->pfn_cmos_sensor_global_init = sensor_global_init;  
  9.     pstSensorExpFunc->pfn_cmos_set_image_mode = cmos_set_image_mode;  
  10.     pstSensorExpFunc->pfn_cmos_set_wdr_mode = cmos_set_wdr_mode;  
  11.       
  12.     pstSensorExpFunc->pfn_cmos_get_isp_default = cmos_get_isp_default;  
  13.     pstSensorExpFunc->pfn_cmos_get_isp_black_level = cmos_get_isp_black_level;  
  14.     pstSensorExpFunc->pfn_cmos_set_pixel_detect = cmos_set_pixel_detect;  
  15.     pstSensorExpFunc->pfn_cmos_get_sns_reg_info = cmos_get_sns_regs_info;  
  16.   
  17.     return 0;  
  18. }  
  19.   
  20. //AE function  
  21. HI_S32 cmos_init_ae_exp_function(AE_SENSOR_EXP_FUNC_S *pstExpFuncs)  
  22. {  
  23.     memset(pstExpFuncs, 0, sizeof(AE_SENSOR_EXP_FUNC_S));  
  24.   
  25.     pstExpFuncs->pfn_cmos_get_ae_default    = cmos_get_ae_default;  
  26.     pstExpFuncs->pfn_cmos_fps_set           = cmos_fps_set;  
  27.     pstExpFuncs->pfn_cmos_slow_framerate_set= cmos_slow_framerate_set;      
  28.     pstExpFuncs->pfn_cmos_inttime_update    = cmos_inttime_update;  
  29.     pstExpFuncs->pfn_cmos_gains_update      = cmos_gains_update;  
  30.     pstExpFuncs->pfn_cmos_again_calc_table  = cmos_again_calc_table;  
  31.     pstExpFuncs->pfn_cmos_get_inttime_max   = cmos_get_inttime_max;   
  32.   
  33.     return 0;  
  34. }  
  35.   
  36. //AWB function  
  37. HI_S32 cmos_init_awb_exp_function(AWB_SENSOR_EXP_FUNC_S *pstExpFuncs)  
  38. {  
  39.     memset(pstExpFuncs, 0, sizeof(AWB_SENSOR_EXP_FUNC_S));  
  40.   
  41.     pstExpFuncs->pfn_cmos_get_awb_default = cmos_get_awb_default;  
  42.   
  43.     return 0;  
  44. }  
//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視頻流。

wKioL1fSsq-wXKC9AADRHXJoipc306.jpg

 

6. 運行PQ Tools

雙擊PQ Tools圖片,彈出如下對話框,設置IP地址。

wKiom1fStgiBOLd5AABV6TYUyy8974.jpg

在下拉菜單中選擇TTP_Stream.exe選項

wKiom1fStkDxwy9rAADdoeFseIU165.jpg

 

7. 最終結果

wKioL1fStqGzj4q-AAFyb_DMrWc691.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章