From 444c60f74a40a91b035f7875686a5045fbebb400 Mon Sep 17 00:00:00 2001 From: Andrew Denisenko Date: Mon, 6 Dec 2021 01:16:14 +0200 Subject: [PATCH] add sc1145 support --- .../files/script/load_hisilicon | 15 + .../files/sensor/config/sc1145_720p_line.ini | 260 ++++++++++++++++++ .../files/sensor/libsns_sc1145.so | Bin 0 -> 21830 bytes 3 files changed, 275 insertions(+) create mode 100644 general/package/hisilicon-osdrv-hi3516cv200/files/sensor/config/sc1145_720p_line.ini create mode 100755 general/package/hisilicon-osdrv-hi3516cv200/files/sensor/libsns_sc1145.so diff --git a/general/package/hisilicon-osdrv-hi3516cv200/files/script/load_hisilicon b/general/package/hisilicon-osdrv-hi3516cv200/files/script/load_hisilicon index 89586ed4..a65ef6fd 100755 --- a/general/package/hisilicon-osdrv-hi3516cv200/files/script/load_hisilicon +++ b/general/package/hisilicon-osdrv-hi3516cv200/files/script/load_hisilicon @@ -115,6 +115,21 @@ insert_sns() devmem 0x2003002c 32 0xc4001; # sensor unreset, clk 24MHz, VI 99MHz ;; + + sc1135|sc1145|sc2135) + devmem 0x200f0040 32 0x2; # I2C0_SCL + devmem 0x200f0044 32 0x2; # I2C0_SDA + # Cmos pinmux + devmem 0x200f007c 32 0x1; # VI_DATA13 + devmem 0x200f0080 32 0x1; # VI_DATA10 + devmem 0x200f0084 32 0x1; # VI_DATA12 + devmem 0x200f0088 32 0x1; # VI_DATA11 + devmem 0x200f008c 32 0x2; # VI_VS + devmem 0x200f0090 32 0x2; # VI_HS + devmem 0x200f0094 32 0x1; # VI_DATA9 + devmem 0x2003002c 32 0xb4001; # clk 27MHz, VI 99MHz + ;; + sc2235) devmem 0x200f0040 32 0x2; # I2C0_SCL devmem 0x200f0044 32 0x2; # I2C0_SDA diff --git a/general/package/hisilicon-osdrv-hi3516cv200/files/sensor/config/sc1145_720p_line.ini b/general/package/hisilicon-osdrv-hi3516cv200/files/sensor/config/sc1145_720p_line.ini new file mode 100644 index 00000000..db93c3ea --- /dev/null +++ b/general/package/hisilicon-osdrv-hi3516cv200/files/sensor/config/sc1145_720p_line.ini @@ -0,0 +1,260 @@ +[sensor] +Sensor_type =sc1145 ;sensor name +Mode =0 ;WDR_MODE_NONE = 0 + ;WDR_MODE_BUILT_IN = 1 + ;WDR_MODE_2To1_LINE = 2 + ;WDR_MODE_2To1_FRAME = 3 + ;WDR_MODE_2To1_FRAME_FULL_RATE =4 ...etc +DllFile =/usr/lib/sensors/libsns_sc1145.so ;sensor lib path + + +[mode] +input_mode =4 ;INPUT_MODE_MIPI = 0 + ;INPUT_MODE_SUBLVDS = 1 + ;INPUT_MODE_LVDS = 2 ...etc + +dev_attr = 2 ;mipi_dev_attr_t = 0 + ;lvds_dev_attr_t = 1 + ;NULL =2 + +[mipi] +;----------only for mipi_dev--------- +data_type =-1 ;raw data type: 8/10/12/14 bit + ;RAW_DATA_8BIT = 0 + ;RAW_DATA_10BIT = 1 + ;RAW_DATA_12BIT = 2 + ;RAW_DATA_14BIT = 3 +lane_id = -1|-1|-1|-1|-1|-1|-1|-1| ;lane_id: -1 - disable + +[lvds] +;----------only for lvds_dev--------- +img_size_w = -1 ;oringnal sensor input image size W +img_size_h = -1 ;oringnal sensor input image size H +wdr_mode = -1 ;HI_WDR_MODE_NONE =0 + ;HI_WDR_MODE_2F = 1 + ;HI_WDR_MODE_3F = 2 + ;HI_WDR_MODE_4F =3 +sync_mode = -1 ;LVDS_SYNC_MODE_SOL = 0 + ;LVDS_SYNC_MODE_SAV = 1 +raw_data_type = -1 ;RAW_DATA_8BIT = 0 + ;RAW_DATA_10BIT = 1 + ;RAW_DATA_12BIT = 2 + ;RAW_DATA_14BIT = 3 +data_endian = -1 ;LVDS_ENDIAN_LITTLE = 0 + ;LVDS_ENDIAN_BIG = 1 +sync_code_endian =-1 ;LVDS_ENDIAN_LITTLE = 0 + ;LVDS_ENDIAN_BIG = 1 +lane_id = -1|-1|-1|-1|-1|-1|-1|-1| ;lane_id: -1 - disable +lvds_lane_num = -1 ;LVDS_LANE_NUM +wdr_vc_num = -1 ;WDR_VC_NUM +sync_code_num = -1 ;SYNC_CODE_NUM +sync_code_0 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| +sync_code_1 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| +sync_code_2 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| +sync_code_3 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| +sync_code_4 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| +sync_code_5 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| +sync_code_6 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| +sync_code_7 = -1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1|-1| + +[isp_image] +Isp_x =0 +Isp_y =0 +Isp_W =1280 +Isp_H =720 +Isp_FrameRate=30 +Isp_Bayer =3 ;BAYER_RGGB=0, BAYER_GRBG=1, BAYER_GBRG=2, BAYER_BGGR=3 + + +[vi_dev] +Input_mod =2 ;VI_INPUT_MODE_BT656 = 0 + ;VI_INPUT_MODE_BT601, + ;VI_INPUT_MODE_DIGITAL_CAMERA +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 =0xFFF0000 +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=0 ;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 =0 ;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 =1280 ;Horizontal effetive width +Timingblank_HsyncHbb =0 ;Horizontal back blanking width +Timingblank_VsyncVfb =0 ;Vertical front blanking height +Timingblank_VsyncVact =720 ;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) + +;----- only for bt656 ---------- +FixCode =0 ;BT656_FIXCODE_1 = 0, + ;BT656_FIXCODE_0 +FieldPolar=0 ;BT656_FIELD_POLAR_STD = 0 + ;BT656_FIELD_POLAR_NSTD +DataPath =1 ;ISP enable or bypass + ;VI_PATH_BYPASS = 0,/* ISP bypass */ + ;VI_PATH_ISP = 1,/* ISP enable */ + ;VI_PATH_RAW = 2,/* Capture raw data, for debug */ +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=1280 ; +DevRect_h=720 ; + +[vi_chn] +CapRect_X =0 +CapRect_Y =0 +CapRect_Width=1280 +CapRect_Height=720 +DestSize_Width=1280 +DestSize_Height=720 +CapSel =2 ;Frame/field select. ONLY used in interlaced mode + ;VI_CAPSEL_TOP = 0, /* top field */ + ;VI_CAPSEL_BOTTOM, /* bottom field */ + ;VI_CAPSEL_BOTH, /* top and bottom field */ + +PixFormat =23;PIXEL_FORMAT_YUV_SEMIPLANAR_422 = 22 + ;PIXEL_FORMAT_YUV_SEMIPLANAR_420 = 23 ...etc +CompressMode =0 ;COMPRESS_MODE_NONE = 0 + ;COMPRESS_MODE_SEG =1 ...etc + +;SrcFrameRate=-1 ;Source frame rate. -1: not controll +;FrameRate =-1 ;Target frame rate. -1: not controll + +SrcFrameRate=30 ;Source frame rate. -1: not controll +FrameRate =30 ;Target frame rate. -1: not controll +[vpss_group] +Vpss_DciEn =FALSE +Vpss_IeEn =FALSE +Vpss_NrEn =TRUE +Vpss_HistEn =FALSE +Vpss_DieMode=1 ;Define de-interlace mode + ;VPSS_DIE_MODE_AUTO = 0, + ;VPSS_DIE_MODE_NODIE = 1, + ;VPSS_DIE_MODE_DIE = 2, + +[vpss_corp] +Crop_enable =FALSE +Coordinate =1 ;VPSS_CROP_RATIO_COOR = 0, /*Ratio coordinate*/ + ;VPSS_CROP_ABS_COOR = 1 /*Absolute coordinate*/ +Crop_X =128 +Crop_Y =128 +Crop_W =1158 +Crop_H =562 + +[vpss_chn] +Vpss_W =1280 +Vpss_H =720 +CompressMode=0 ;COMPRESS_MODE_NONE = 0 + ;COMPRESS_MODE_SEG =1 ...etc +Mirror =FALSE;Whether to mirror +Flip =FALSE;Whether to flip + +[vb_conf] +VbCnt=5 +#VbCnt=2 +vbTimes=15 + +[venc_comm] +venc_chn =1 ;create venc chn number;(0,2] +BufCnt = 1 ;network meida-trans bufcnt + +[venc_0] +PicWidth =1280 +PicHeight =720 +Profile =2 +RcMode =VENC_RC_MODE_H264CBR + +Gop =50 +StatTime =2 +ViFrmRate =30 +TargetFrmRate=30 +;----- only for VENC_RC_MODE_H264CBR ---------- +BitRate=2048 +FluctuateLevel=1 +;----- only for VENC_RC_MODE_H264VBR ---------- +MaxBitRate =10000 + +MaxQp=32 +MinQp=24 +;----- only for VENC_RC_MODE_H264FIXQP ---------- +IQp=45 + +PQp=40 + +[venc_1] +PicWidth =1280 +PicHeight =720 +Profile =2 +RcMode =VENC_RC_MODE_H264CBR + +Gop =50 +StatTime =2 +ViFrmRate =30 +TargetFrmRate=15 +;----- only for VENC_RC_MODE_H264CBR ---------- +BitRate=2048 +FluctuateLevel=1 +;----- only for VENC_RC_MODE_H264VBR ---------- +MaxBitRate =10000 + +MaxQp=32 + +MinQp=24 +;----- only for VENC_RC_MODE_H264FIXQP ---------- +IQp=40 + +PQp=45 + +[bind] +ViDev =0 +ViChn =0 +VpssGrp =0 +VpssChn = 0 +VoDev =0 +VoChn =0 +ViSnapChn =0 +VpssSnapGrp=0 +VpssSnapChn=1 +VencSnapGrp=1 +VencSnapChn=3 diff --git a/general/package/hisilicon-osdrv-hi3516cv200/files/sensor/libsns_sc1145.so b/general/package/hisilicon-osdrv-hi3516cv200/files/sensor/libsns_sc1145.so new file mode 100755 index 0000000000000000000000000000000000000000..fdb15e48e4fd286cffc2e57930f5ba9ce25f6fee GIT binary patch literal 21830 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