From 3704f126bc85b23fc1aeb2159b049f21a61cc274 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov Date: Tue, 17 May 2022 17:34:45 +0300 Subject: [PATCH] Add IMX385_I2C_LVDS 8CH for Hi3519v101 on Powerview board --- .../files/script/load_hisilicon | 32 +++-- .../sensor/config/imx385_i2c_lvds_1080p.ini | 115 ++++++++++++++++++ .../files/sensor/libsns_imx385_lvds.so | Bin 0 -> 32268 bytes 3 files changed, 134 insertions(+), 13 deletions(-) create mode 100644 general/package/hisilicon-osdrv-hi3519v101/files/sensor/config/imx385_i2c_lvds_1080p.ini create mode 100644 general/package/hisilicon-osdrv-hi3519v101/files/sensor/libsns_imx385_lvds.so diff --git a/general/package/hisilicon-osdrv-hi3519v101/files/script/load_hisilicon b/general/package/hisilicon-osdrv-hi3519v101/files/script/load_hisilicon index 33a2bf4d..680c30c0 100755 --- a/general/package/hisilicon-osdrv-hi3519v101/files/script/load_hisilicon +++ b/general/package/hisilicon-osdrv-hi3519v101/files/script/load_hisilicon @@ -504,19 +504,6 @@ insert_sns() { spi0_3wire_pin_mux insmod hi_ssp_3wire.ko ;; - imx385_lvds) - tmp=0x18 - devmem 0x12010040 32 0x18 - devmem 0x12040190 32 0x2 - devmem 0x1204018c 32 0x2 - devmem 0x1204099c 32 0x120 - devmem 0x12040998 32 0x120 - insmod hi_ssp_sony.ko - devmem 0x12040184 32 0x1 - devmem 0x12040188 32 0x1 - devmem 0x12040010 32 0x2 - devmem 0x12040014 32 0x2 - ;; ov4689) tmp=0x14 # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M @@ -535,6 +522,25 @@ insert_sns() { devmem 0x12010040 32 0x1a # sensor0 clk_en, 27MHz i2c0_pin_mux ;; + imx385_spi_lvds) + tmp=0x18 + devmem 0x12010040 32 0x18 + devmem 0x12040190 32 0x2 + devmem 0x1204018c 32 0x2 + devmem 0x1204099c 32 0x120 + devmem 0x12040998 32 0x120 + spi0_4wire_pin_mux + insmod hi_ssp_sony.ko + ;; + imx385_i2c_lvds) + tmp=0x16 + # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M + # viu0:300M,isp0:300M, viu1:300M,isp1:300M + devmem 0x1201004c 32 0x00094421 + devmem 0x12010054 32 0x0004041 + devmem 0x12010040 32 0x16 # sensor0 clk_en, 74.125MHz + i2c0_pin_mux + ;; imx185 | imx385 | imx178) tmp=0x18 # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M diff --git a/general/package/hisilicon-osdrv-hi3519v101/files/sensor/config/imx385_i2c_lvds_1080p.ini b/general/package/hisilicon-osdrv-hi3519v101/files/sensor/config/imx385_i2c_lvds_1080p.ini new file mode 100644 index 00000000..e631f976 --- /dev/null +++ b/general/package/hisilicon-osdrv-hi3519v101/files/sensor/config/imx385_i2c_lvds_1080p.ini @@ -0,0 +1,115 @@ +[sensor] +Sensor_type=stSnsImx385Obj +Mode=WDR_MODE_NONE +DllFile=libsns_imx385_lvds_8ch.so + +[mode] +input_mode=INPUT_MODE_LVDS +raw_bitness=12 +dev_attr=0 + +[lvds] +img_size_w=1920 +img_size_h=1080 +wdr_mode=HI_WDR_MODE_NONE +sync_mode=LVDS_SYNC_MODE_SAV +raw_data_type=RAW_DATA_12BIT +data_endian=LVDS_ENDIAN_BIG +sync_code_endian=LVDS_ENDIAN_BIG +lane_id=0|1|2|3|4|5|6|7| +sync_code_0 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 +sync_code_1 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 +sync_code_2 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 +sync_code_3 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 +sync_code_4 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 +sync_code_5 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 +sync_code_6 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 +sync_code_7 = 0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0|0xab0|0xb60|0x800|0x9d0 + +[isp_image] +Isp_x=0 +Isp_y=0 +Isp_W=1920 +Isp_H=1080 +Isp_FrameRate=30 +Isp_Bayer=BAYER_GBRG + +[vi_dev] +Input_mod=VI_MODE_LVDS +Work_mod =0 ;VI_WORK_MODE_1Multiplex = 0 + ;VI_WORK_MODE_2Multiplex, + ;VI_WORK_MODE_4Multiplex +Combine_mode =0 ;Y/C composite or separation mode + ;VI_COMBINE_COMPOSITE = 0 /*Composite mode */ + ;VI_COMBINE_SEPARATE, /*Separate mode */ +Comp_mode =0 ;Component mode (single-component or dual-component) + ;VI_COMP_MODE_SINGLE = 0, /*single component mode */ + ;VI_COMP_MODE_DOUBLE = 1, /*double component mode */ +Clock_edge =1 ;Clock edge mode (sampling on the rising or falling edge) + ;VI_CLK_EDGE_SINGLE_UP=0, /*rising edge */ + ;VI_CLK_EDGE_SINGLE_DOWN, /*falling edge */ +Mask_num =2 ;Component mask +Mask_0 =0xFFF00000 +Mask_1 =0x0 +Scan_mode = 1;VI_SCAN_INTERLACED = 0 + ;VI_SCAN_PROGRESSIVE, +Data_seq =2 ;data sequence (ONLY for YUV format) + ;----2th component U/V sequence in bt1120 + ; VI_INPUT_DATA_VUVU = 0, + ; VI_INPUT_DATA_UVUV, + ;----input sequence for yuv + ; VI_INPUT_DATA_UYVY = 0, + ; VI_INPUT_DATA_VYUY, + ; VI_INPUT_DATA_YUYV, + ; VI_INPUT_DATA_YVYU + +Vsync =1 ; vertical synchronization signal + ;VI_VSYNC_FIELD = 0, + ;VI_VSYNC_PULSE, +VsyncNeg=1 ;Polarity of the vertical synchronization signal + ;VI_VSYNC_NEG_HIGH = 0, + ;VI_VSYNC_NEG_LOW /*if VIU_VSYNC_E +Hsync =0 ;Attribute of the horizontal synchronization signal + ;VI_HSYNC_VALID_SINGNAL = 0, + ;VI_HSYNC_PULSE, +HsyncNeg =0 ;Polarity of the horizontal synchronization signal + ;VI_HSYNC_NEG_HIGH = 0, + ;VI_HSYNC_NEG_LOW +VsyncValid =1 ;Attribute of the valid vertical synchronization signal + ;VI_VSYNC_NORM_PULSE = 0, + ;VI_VSYNC_VALID_SINGAL, +VsyncValidNeg =0;Polarity of the valid vertical synchronization signal + ;VI_VSYNC_VALID_NEG_HIGH = 0, + ;VI_VSYNC_VALID_NEG_LOW +Timingblank_HsyncHfb =0 ;Horizontal front blanking width +Timingblank_HsyncAct =1920 ;Horizontal effetive width +Timingblank_HsyncHbb =0 ;Horizontal back blanking width +Timingblank_VsyncVfb =0 ;Vertical front blanking height +Timingblank_VsyncVact =1080 ;Vertical effetive width +Timingblank_VsyncVbb=0 ;Vertical back blanking height +Timingblank_VsyncVbfb =0 ;Even-field vertical front blanking height(interlace, invalid progressive) +Timingblank_VsyncVbact=0 ;Even-field vertical effetive width(interlace, invalid progressive) +Timingblank_VsyncVbbb =0 ;Even-field vertical back blanking height(interlace, invalid progressive) +FixCode=0 +FieldPolar=0 +DataPath=1 +InputDataType=1 ;VI_DATA_TYPE_YUV = 0,VI_DATA_TYPE_RGB = 1, +DataRev =FALSE ;Data reverse. FALSE = 0; TRUE = 1 +DevRect_x=0 +DevRect_y=0 +DevRect_w=1920 +DevRect_h=1080 +FullLinesStd=1125 + +[vi_chn] +CapRect_X=0 +CapRect_Y=0 +CapRect_Width=1920 +CapRect_Height=1080 +DestSize_Width=1920 +DestSize_Height=1080 +CapSel=VI_CAPSEL_BOTH +;PixFormat=26 +CompressMode=COMPRESS_MODE_NONE +SrcFrameRate=-1 +FrameRate =-1 diff --git a/general/package/hisilicon-osdrv-hi3519v101/files/sensor/libsns_imx385_lvds.so b/general/package/hisilicon-osdrv-hi3519v101/files/sensor/libsns_imx385_lvds.so new file mode 100644 index 0000000000000000000000000000000000000000..c66731250ccf47274e96d211c60e9133192caf28 GIT binary patch literal 32268 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�y5uP<>T9;;$fHu=HDYebzeSD~K2D zO#iSW|E0tWw(r+$UDM*pct-jYd;TJC7H@;!#xkFgczZs>?osto;%zMR8>bU_cM@;U z?_A(+uswg1`)eE6p05c0EZCm^3BTkgXYyDs-7L2~e`N=osgLaGv|OqgpXb0|6M5Rn zF!`GfEW`E_4lMD%0z1!yN`Pg2DZFxKPO>$H2I+UJVCR`o6CLrA<~p$ROsE^c&NHD_ zJNPC4)={|AfhQ8b*@1I`+S{e zLQMku=syiu<;qgP@|UuVEF-?PtzdKc_G6G}b^>^u|7kQ>_=uJ7x>&NHEIl6dV5{5u?2^xFz{*2f-4 zyx8Xfu*?@9<68849PB(3>LswVJQ1+-OsLafd%Z%=g!%*6c_vgQOE%6kp)LRq>yx7l zuv7kIu=7l)Yrr!8FwjrV%vuPR`Ja?c^j!tEos{RJVCR`ovS-_QCY0>oww=MnW25j7 z9N27svLYudanl-9VV!E|2z7?mty%@DshL+;sO)sL^;%nptwqtsb1Eg`L<4hcug*f(mAP7L zCKY*gO=MwiytTx=XE*I|F#A5=%ga8?k%1$(rCO=^g~+gF%~BxB+(KGoZXq3Ii{bsF zVr+B&=qQe%<~S5D`&ZdIEjy?eG==7{Ok6*|xucVIR9Z5V+OH#iA@*gvbzA4UjwXUS zLkm0GZ)$7q)W@XhkXfr6tYgzm!&((h;$@Y~N)T3hrI~Wpo%M4X*0L*C_RtbFU81fM zu(Wbnsel=F4h!nmuB|iK*03@o7+Sqs%vhrF}v=r zrVg!&F0ENWv8pN57NJ&aU1g`T8R^h>v;j;JB@&9kOlwRZ&4M{fuC_BVtvFQZcJst6 z>+rAlRHV&iD(BSRj;LE#GILp-^ixZvj>$qoq;=dnd%65JfbKXsJ zhk8$aJ@>;m&04f@4lJC%S7S3YcDB{5;T$de-c!c{Tbd zynk?P*{HMhq^r=q%FsD)yee{>tL8ja&pJfUJV4Ak9!zI8bO_o~#{p?tta-ZK=qyH@ z2&d0m(`WdNI7x8$@V}8qm1%kM`vLnDJVcsZk|V44oG&+8-H|7{IZJAuALtOJe-P-j ziB-@EI?2eBB1fIXXKTch z)NV+_cCwDKw9dAa*OVg;D-_%6W;~pt<{T$xp8IS~>o7}u%=eG{3t^Bcn5<8n(6pE7 zv|w>Ej}o5j