1. 程式人生 > >[hi3518] 記錄一次Hi3518E新添sensor的過程

[hi3518] 記錄一次Hi3518E新添sensor的過程

使用的sensor是海思列表沒有支援的SC2235,主要需要了解到這個sensor的配置已經地址(需要向sensor原廠要驅動sc2235_cmos.c sc2235_sensor_ctl.c  sc2235_1080p_line.ini vpss_attr_2235.c)編譯為.so .a以供測試程式碼呼叫。

首先在ko載入時就要新增自己的sensor,./load3518e -a -sensor sc2235 -osmem 32 -total 64
在load3518e 指令碼中的函式insert_sns()中新增自己sensor對應的地址。
否則會報錯“Invalid sensor type”



問題1:
Unknown symbol in module, or unknown parameter(rmmod 執行失敗,請忽視錯誤,開機第一次載入ko,會先刪除rmmode,為空肯定報錯)
operation not permitted
load3518e執行失敗,ko插入失敗
第一反應肯定是linux版本不匹配,嗯,事實上並不是,很可能是OS和MMZ的地址重疊了。
需要看你DDR記憶體大小,海思教程中的DDR是128MB的,如果你一樣,那就跟著教程走就ok
不幸的是,我們的DDR是64MB,那麼你可以參照下面的修改
setenv bootargs 'mem=32M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=jffs2 mtdparts=hi_sfc:1M(boot),3M(kernel),12M(rootfs)'
setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x300000;bootm 0x82000000'
saveenv
上面的修改就夠了,以後的都按照預設走,我也順帶貼出來
SNS_TYPE=ar0230             # sensor type

mem_total=64;               # 64M, total mem
mem_start=0x80000000;       # phy mem start

os_mem_size=32;             # 32M, os mem
mmz_start=0x82000000;       # mmz start addr
mmz_size=32M;               # 32M, mmz size

MMZ地址肯定是從82000000開始的,OS最開始是從bootm 0x82000000啟動的,但是啟動後會回蓋到0x80000000的 ,所以不用擔心0x82000000重疊,正如文件所述,正常執行後的地址分配如圖:
    DDR:                                                           
    
    -----|-------|  0x80000000   # Memory managed by OS.              
    32M  | OS    |                                                 
         |       |                                                 
    -----|-------|  0x82000000   # Memory managed by MMZ block anonymous.          
    32 M | MMZ   |                                                 
         |       |                                                 
    -----|-------|  0x84000000   # Memory managed by MMZ block jpeg.                       
一切順利的話,lsmod會有如下顯示:

Module                  Size  Used by    Tainted: P  
hi_mipi                22587  0 
hi3518e_adec            6546  0 
hi3518e_aenc           46989  0 
hi3518e_ao            105952  0 
hi3518e_ai            109706  1 hi3518e_aenc
hi3518e_aio            28363  0 
acodec                  8242  0 
piris                   3220  0 
pwm                     2471  0 
sensor_i2c              1501  0 
hi3518e_ive            76660  0 
hi3518e_jpege          51824  0 
hi3518e_h264e         172210  0 
hi3518e_chnl           33659  0 
hi3518e_venc          216283  2 hi3518e_jpege,hi3518e_h264e
hi3518e_rc             62388  0 
hifb                   72068  0 
hi3518e_vou           168985  1 hifb
hi3518e_vpss          261330  0 
hi3518e_viu           246389  1 hi3518e_vpss
hi3518e_isp           105606  4 piris,sensor_i2c,hi3518e_vpss,hi3518e_viu
hi3518e_vgs           127198  0 
hi3518e_region         66722  0 
hi3518e_tde           121855  2 hifb,hi3518e_region
hi3518e_sys            62048  2 hi3518e_vpss,hi3518e_viu
hi3518e_base           58109 21 hi3518e_adec,hi3518e_aenc,hi3518e_ao,hi3518e_ai,hi3518e_aio,acodec,hi3518e_ive,hi3518e_jpege,hi3518e_h264e,hi3518e_chnl,hi3518e_venc,hi3518e_rc,hifb,hi3518e_vou,hi3518e_vpss,hi3518e_viu,hi3518e_isp,hi3518e_vgs,hi3518e_region,hi3518e_tde,hi3518e_sys
hi_media                5801  6 hi_mipi,acodec,pwm,hifb,hi3518e_tde,hi3518e_base
mmz                    22400  6 hi3518e_ao,hi3518e_jpege,hi3518e_h264e,hi3518e_tde,hi3518e_sys,hi3518e_base
rtl8188eu             692341  0 



問題1:
由於是新sensor,跑海思自帶的測試程式碼肯定會提示“This sensor type is not surpport!”
解決方案:
新增新sensor的列舉型別 到typedef enum sample_vi_mode_e {}SAMPLE_VI_MODE_E;
並根據自己sensor的引數正確命名。

問題2:
最棘手的問題,get venc stream time out, exit thread
既然是新新增sensor,那麼能出現這個超時問題一定就是視訊攝入有問題了,最主要的結構在sample_common_vi.c 的combo_dev_attr_t結構體。
你要對照sensor廠商給的ini配置,參照其他廠商的形式為你的sensor寫一個此結構體的初始化程式碼。當然我們的是CMOS3V3的,直接使用如下初始化結構:
combo_dev_attr_t MIPI_CMOS3V3_ATTR =
{
    /* input mode */
    .input_mode = INPUT_MODE_CMOS_33V,
    {
        
    }
};

執行sample_venc之後,選擇一個選項,h264的流就出現在執行目錄下了,直接用vlc開啟。
如果想要轉為網路的rtsp流,那需要改sample程式碼將這些流重新打包,並使用rtsp流釋出出來。


最後貼一張成像圖,但是泛紫,現在正準備在ISP除錯下,帖子繼續更新。

 

謝謝樓上兩位,結貼了,掩碼在sample_comm_vi.c中你新增的sensor的VI_DEV_ATTR_S 結構體中,我的結構體是:
VI_DEV_ATTR_S DEV_ATTR_SC2235_DC_720P_BASE =
{
    /* interface mode */
    VI_MODE_DIGITAL_CAMERA,
    /* multiplex mode */
    VI_WORK_MODE_1Multiplex,
    /* r_mask    g_mask    b_mask*/
    //{0xFFF0000,    0x0},
    //{0xFF00000,    0x0},
    {0x3FF0000
, 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_PULSE, VI_VSYNC_NEG_HIGH, VI_HSYNC_PULSE,VI_HSYNC_NEG_HIGH,VI_VSYNC_NORM_PULSE,VI_VSYNC_VALID_NEG_HIGH,
/*hsync_hfb hsync_act hsync_hhb*/ {0, 1280, 0, /*vsync0_vhb vsync0_act vsync0_hhb*/ 0, 720, 0, /*vsync1_vhb vsync1_act vsync1_hhb*/ 0, 0, 0} }, /* use interior ISP */ VI_PATH_ISP, /* input data type */ VI_DATA_TYPE_RGB, /* bRevert */ HI_FALSE, /* stDevRect */ {200, 20, 1280, 720} };

掩碼低十位 0x 3ff 0000