#!/bin/sh # # This is part of OpenIPC.org project | 2022.01.07 # # SoC detect chipid=$(ipcinfo --chip_id) # MMZ config mem_start=0x80000000 # phy mem start mem_total=$(fw_printenv -n totalmem | tr -d 'M') mem_total=${mem_total:=64} os_mem_size=$(fw_printenv -n osmem | tr -d 'M') os_mem_size=${os_mem_size:=32} # Sensor config # SNS_TYPE=$(awk -F '=' '$1=="sensor"{print $2}' RS=" " /proc/cmdline) SNS_TYPE0=$(fw_printenv -n sensor) SNS_TYPE0=${SNS_TYPE:=ov4689} report_error() { echo "******* Error: There's something wrong, please check! *****" exit 1 } insert_osal() { insmod hi_osal.ko mmz=anonymous,0,$mmz_start,$mmz_size anony=1 || report_error } insert_detect() { cd /lib/modules/3.18.20/hisilicon insert_osal insmod hi3519v101_base.ko insmod hi3519v101_sys.ko vi_vpss_online=$b_arg_online sensor=$SNS_TYPE0,$SNS_TYPE1 mem_total=$mem_total insert_isp insmod hi_sensor_i2c.ko insmod hi_sensor_spi.ko } remove_detect() { rmmod hi_sensor_spi rmmod hi_sensor_i2c rmmod hi3519v101_isp rmmod hi3519v101_sys rmmod hi3519v101_base rmmod hi_osal } insert_audio() { insmod hi3519v101_aio.ko insmod hi3519v101_ai.ko insmod hi3519v101_ao.ko insmod hi3519v101_aenc.ko insmod hi3519v101_adec.ko insmod hi_acodec.ko #insmod extdrv/hi_tlv320aic31.ko } remove_audio() { rmmod hi_acodec #rmmod hi_tlv320aic31 rmmod hi3519v101_adec rmmod hi3519v101_aenc rmmod hi3519v101_ao rmmod hi3519v101_ai rmmod hi3519v101_aio } spi0_4wire_pin_mux() { #pinmux devmem 0x1204018c 32 0x1 #SPI0_SCLK devmem 0x12040190 32 0x1 #SPI0_SD0 devmem 0x12040194 32 0x1 #SPI0_SDI devmem 0x12040198 32 0x1 #SPI0_CSN #drive capability devmem 0x12040998 32 0x150 #SPI0_SCLK devmem 0x1204099c 32 0x160 #SPI0_SD0 devmem 0x120409a0 32 0x160 #SPI0_SDI devmem 0x120409a4 32 0x160 #SPI0_CSN } spi1_4wire_pin_mux() { #pinmux devmem 0x12040018 32 0x1 #SPI1_SCLK devmem 0x1204001c 32 0x1 #SPI1_SD0 devmem 0x12040020 32 0x1 #SPI1_SDI devmem 0x12040024 32 0x1 #SPI1_CSN #drive capability devmem 0x12040818 32 0x150 #SPI1_SCLK devmem 0x1204081C 32 0x160 #SPI1_SD0 devmem 0x12040820 32 0x160 #SPI1_SDI devmem 0x12040824 32 0x160 #SPI1_CSN } spi0_3wire_pin_mux() { #pinmux devmem 0x1204018c 32 0x3 #SPI0_3WIRE_CLK devmem 0x12040190 32 0x3 #SPI0_3WIRE_DATA devmem 0x12040198 32 0x3 #SPI0_3WIRE_CSN #drive capability devmem 0x12040998 32 0x150 #SPI0_3WIRE_CLK devmem 0x1204099c 32 0x160 #SPI0_3WIRE_DATA devmem 0x120409a4 32 0x160 #SPI0_3WIRE_CSN } i2c0_pin_mux() { #pinmux devmem 0x12040190 32 0x2 #I2C0_SDA devmem 0x1204018c 32 0x2 #I2C0_SCL #drive capability devmem 0x1204099c 32 0x120 #I2C0_SDA devmem 0x12040998 32 0x120 #I2C0_SCL } i2c1_pin_mux() { #pinmux devmem 0x1204001c 32 0x2 #I2C1_SDA devmem 0x12040018 32 0x2 #I2C1_SCL #drive capability devmem 0x1204081c 32 0x120 #I2C1_SDA devmem 0x12040818 32 0x120 #I2C1_SCL } insert_sns() { local tmp=0 local tmp1 local tmp2 if [ ${SNS_TYPE0} != "NULL" ]; then case $SNS_TYPE0 in imx226) tmp=0x11 devmem 0x12010040 32 0x11 # sensor0 clk_en, 72MHz # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M #imx226: viu0:600M,isp0:600M, viu1:300M,isp1:300M devmem 0x1201004c 32 0x00094c23 devmem 0x12010054 32 0x00024041 spi0_4wire_pin_mux insmod extdrv/hi_ssp_sony.ko ;; imx274) tmp=0x11 devmem 0x12010040 32 0x11 # sensor0 clk_en, 72MHz # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M #imx274:viu0: 600M,isp0:300M, viu1:300M,isp1:300M devmem 0x1201004c 32 0x00094c23 devmem 0x12010054 32 0x0004041 spi0_4wire_pin_mux insmod extdrv/hi_ssp_sony.ko ;; imx274_mipi) tmp=0x14 # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M # viu0:300M,isp0:300M, viu1:300M,isp1:300M devmem 0x1201004c 32 0x00094c21 devmem 0x12010054 32 0x0004041 devmem 0x12010040 32 0x14 # sensor0 clk_en, 24MHz i2c0_pin_mux ;; imx290) tmp=0x18 # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M #imx290:viu0:340M,isp0:214M, viu1:340M,isp1:214M devmem 0x1201004c 32 0x00094c24 devmem 0x12010054 32 0x0004 devmem 0x12010040 32 0x18 # sensor0 clk_en, 37.125MHz i2c0_pin_mux ;; ov4689) tmp=0x14 # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M #ov4689: viu0:300M,isp0:300M, viu1:300M,isp1:300M devmem 0x1201004c 32 0x00094c21 devmem 0x12010054 32 0x0004041 devmem 0x12010040 32 0x14 # sensor0 clk_en, 24MHz i2c0_pin_mux ;; os08a10) tmp=0x14 # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M #os08a10: viu0: 600M, isp0:300M, viu1:300M,isp1:300M devmem 0x1201004c 32 0x00094c23 devmem 0x12010054 32 0x0004041 devmem 0x12010040 32 0x14 # sensor0 clk_en, 24MHz i2c0_pin_mux ;; bt1120) # SDK config: IVE:396M, GDC:475M, VGS:500M, VEDU:600M, VPSS:300M # viu0:300M,isp0:300M, viu1:300M,isp1:300M devmem 0x1201004c 32 0x00094c21 devmem 0x12010054 32 0x0004041 devmem 0x113c6200 32 0x0 #disable dehaze devmem 0x113d1400 32 0x0 #disable acm devmem 0x113c5200 32 0x0 #disable sharpen #devmem 0x20670000 32 0x0; ;; *) echo "xxxx Invalid sensor type $SNS_TYPE0 xxxx" report_error ;; esac fi if [ ${SNS_TYPE1} != "NULL" ]; then case $SNS_TYPE1 in imx290) tmp1=0x1800 tmp2=$((tmp + tmp1)) devmem 0x12010040 32 $tmp2 # sensor1 clk_en, 37.125MHz i2c1_pin_mux ;; ov4689) tmp1=0x1400 tmp2=$((tmp + tmp1)) devmem 0x12010040 32 $tmp2 # sensor1 clk_en, 24MHz i2c1_pin_mux ;; os08a10) tmp1=0x1400 tmp2=$((tmp + tmp1)) devmem 0x12010040 32 $tmp2 # sensor1 clk_en, 24MHz i2c1_pin_mux ;; bt1120) devmem 0x114c6200 32 0x0 #disable dehaze devmem 0x114d1400 32 0x0 #disable acm devmem 0x114c5200 32 0x0 #disable sharpen #devmem 0x20670000 32 0x0; ;; *) echo "xxxx Invalid sensor type $SNS_TYPE1 xxxx" report_error ;; esac fi if [ ${WORK_MODE} != "NULL" ]; then case $WORK_MODE in stitching) devmem 0x12040184 32 0x1 # SENSOR0 HS from VI0 HS devmem 0x12040188 32 0x1 # SENSOR0 VS from VI0 VS devmem 0x12040010 32 0x1 # SENSOR1 HS from VI0 HS devmem 0x12040014 32 0x1 # SENSOR1 VS from VI0 VS ;; single_pipe) devmem 0x12040184 32 0x1 # SENSOR0 HS from VI0 HS devmem 0x12040188 32 0x1 # SENSOR0 VS from VI0 VS devmem 0x12040010 32 0x2 # SENSOR1 HS from VI1 HS devmem 0x12040014 32 0x2 # SENSOR1 VS from VI1 VS ;; double_pipe) tmp1=$((tmp << 8)) tmp2=$((tmp + tmp1)) devmem 0x12010040 32 $tmp2 # sensor0 clk + sensor1 clk devmem 0x12040184 32 0x2 # SENSOR0 HS from VI1 HS devmem 0x12040188 32 0x2 # SENSOR0 VS from VI1 VS #devmem 0x12040010 32 0x1; # SENSOR1 HS from VI0 HS #devmem 0x12040014 32 0x1; # SENSOR1 VS from VI0 VS devmem 0x1201004c 32 0x00094c21 #double pipe,VI0,ISP0:300M,if inapposite,change it. devmem 0x12010054 32 0x0004041 #double pipe,VI1,ISP1:300M ;; *) echo "xxxx Invalid work mode $WORK_MODE xxxx" report_error ;; esac fi } remove_sns() { rmmod hi_ssp_sony &>/dev/null rmmod hi_sensor_spi &>/dev/null } insert_isp() { case $SNS_TYPE0 in imx117) insmod hi3519v101_isp.ko update_pos=1 proc_param=30 ;; *) insmod hi3519v101_isp.ko proc_param=30 ;; esac } vicap1_pwrdn() { devmem 0x1201003c 32 0x333303ff devmem 0x120a012c 32 0x3 devmem 0x120a012c 32 0x2 devmem 0x1201003c 32 0x120003ff } sys_config() { # pinmux configuration sh ./pinmux.sh -net -vi >/dev/null if [ ${SNS_TYPE1} != "NULL" ]; then vicap1_pwrdn >/dev/null fi if [ ${WORK_MODE} == "double_pipe" ]; then vicap1_pwrdn >/dev/null fi #vicap1_pwrdn; #vicap1_pwrdn > /dev/null # clock configuration sh clkcfg.sh >/dev/null # system configuration sh sysctl.sh $b_arg_online >/dev/null } insert_ko() { # sys config sys_config # driver load insert_osal insmod hi3519v101_base.ko insmod hi3519v101_sys.ko vi_vpss_online=$b_arg_online sensor=$SNS_TYPE0,$SNS_TYPE1 mem_total=$mem_total #insmod hi3519v101_tde.ko insmod hi3519v101_region.ko insmod hi3519v101_fisheye.ko #insmod hi3519v101_vgs.ko insert_isp insmod hi3519v101_viu.ko detect_err_frame=10 delay_line=500 insmod hi3519v101_vpss.ko #insmod hi3519v101_vou.ko #insmod hi3519v101_vou.ko detectCycle=0 #close dac detect #insmod hi3519v101_vou.ko transparentTransmit=1 #enable transparentTransmit #insmod hifb.ko video="hifb:vram0_size:1620" # default pal insmod hi3519v101_rc.ko insmod hi3519v101_venc.ko insmod hi3519v101_chnl.ko insmod hi3519v101_vedu.ko insmod hi3519v101_h264e.ko insmod hi3519v101_h265e.ko insmod hi3519v101_jpege.ko #insmod hi3519v101_ive.ko save_power=1 insmod hi3519v101_photo.ko # insmod extdrv/hi_sensor_i2c.ko insmod extdrv/hi_pwm.ko insmod extdrv/hi_piris.ko insert_audio insmod hi_mipi.ko insmod hi_user.ko insert_sns # sh ./pinmux.sh -vo BT1120 > /dev/null devmem 0x12010044 32 0x4ff0 devmem 0x12010044 32 0x4 echo "==== Your input Sensor0 type is $SNS_TYPE0 ====" echo "==== Your input Sensor1 type is $SNS_TYPE1 ====" } remove_ko() { remove_audio remove_sns rmmod hi_user rmmod hi_pwm rmmod hi_piris #rmmod hi3519v101_photo rmmod hi3519v101_ive rmmod hi3519v101_rc rmmod hi3519v101_jpege rmmod hi3519v101_h264e rmmod hi3519v101_h265e rmmod hi3519v101_vedu rmmod hi3519v101_chnl rmmod hi3519v101_venc #rmmod hifb #rmmod hi3519v101_vou rmmod hi3519v101_vpss rmmod hi3519v101_isp rmmod hi3519v101_viu rmmod hi_mipi rmmod hi3519v101_fisheye #rmmod hi3519v101_vgs rmmod hi3519v101_region #rmmod hi3519v101_tde rmmod hi_sensor_i2c &>/dev/null rmmod hi_ssp_3wire.ko &>/dev/null rmmod hi3519v101_sys rmmod hi3519v101_base rmmod hi_osal } sys_restore() { #################################################### clkcfg.sh >/dev/null # system configuration sysctl.sh $b_arg_online # > /dev/null insert_sns } load_usage() { echo "Usage: ./load3519v101 [-option] [sensor_name]" echo "options:" echo " -i insert modules" echo " -r remove modules" echo " -a remove modules first, then insert modules" echo " -sensor sensor_name config sensor type [default: imx274]" echo " -osmem os_mem_size config os mem size [unit: M, default: 64]" echo " -total_mem_size config total mem size [unit: M, default: 512]" echo " -offline vi/vpss offline" echo " -h help information" echo -e "Available sensors: imx274, imx226, imx290, ov4689 ,os08a10" echo -e "workmode: stitching,single_pipe,double_pipe" echo -e "notes: osmem option can't be used when mmz zone partition is enable\n\n" echo -e "for example online: ./load3519v101 -a -sensor0 ov4689 -sensor1 ov4689 -osmem 64 -total 512\n" echo -e " offline: ./load3519v101 -a -sensor0 imx274 -osmem 64 -total 512 -offline\n" } calc_mmz_info() { mmz_start=$(echo "$mem_start $os_mem_size" | awk 'BEGIN { temp = 0; } { temp = $1/1024/1024 + $2; } END { printf("0x%x00000\n", temp); }') mmz_size=$(echo "$mem_total $os_mem_size" | awk 'BEGIN { temp = 0; } { temp = $1 - $2; } END { printf("%dM\n", temp); }') echo "mmz_start: $mmz_start, mmz_size: $mmz_size" } ######################parse arg################################### b_arg_os_mem=0 b_arg_sensor0=0 b_arg_sensor1=0 b_arg_insmod=0 b_arg_remove=0 b_arg_online=1 b_arg_restore=0 b_arg_mode=0 b_arg_total_mem=0 for arg in $@; do if [ $b_arg_total_mem -eq 1 ]; then b_arg_total_mem=0 mem_total=$arg if [ -z $mem_total ]; then echo "[error] mem_total is null" exit fi fi if [ $b_arg_os_mem -eq 1 ]; then b_arg_os_mem=0 os_mem_size=$arg if [ -z $os_mem_size ]; then echo "[error] os_mem_size is null" exit fi if [ $os_mem_size -ge $mem_total ]; then echo "[err] os_mem[$os_mem_size], over total_mem[$mem_total]" exit fi fi if [ $b_arg_sensor0 -eq 1 ]; then b_arg_sensor0=0 SNS_TYPE0=$arg fi if [ $b_arg_sensor1 -eq 1 ]; then b_arg_sensor1=0 SNS_TYPE1=$arg fi if [ $b_arg_mode -eq 1 ]; then b_arg_mode=0 WORK_MODE=$arg fi case $arg in "-i") b_arg_insmod=1 ;; "-r") b_arg_remove=1 ;; "-a") b_arg_insmod=1 b_arg_remove=1 ;; "-h") load_usage ;; "-sensor0") b_arg_sensor0=1 ;; "-sensor") b_arg_sensor0=1 ;; "-sensor1") b_arg_sensor1=1 ;; "-osmem") b_arg_os_mem=1 ;; "-total") b_arg_total_mem=1 ;; "-restore") b_arg_restore=1 ;; "-offline") b_arg_online=0 ;; "-workmode") b_arg_mode=1 ;; esac done #######################parse arg end######################## if [ $os_mem_size -ge $mem_total ]; then echo "[err] os_mem[$os_mem_size], over total_mem[$mem_total]" exit fi calc_mmz_info #######################Action############################### if [ $# -lt 1 ]; then load_usage exit 0 fi # Sensor config # SENSOR=${SENSOR:=imx307} # if [ -n "$SENSOR" ]; then logger -s -p daemon.info -t hisilicon "Manualy set SENSOR as ${SENSOR}" else if fw_printenv -n sensor >/dev/null; then SENSOR_ENV=$(fw_printenv -n sensor) export SENSOR=${SENSOR_ENV} logger -s -p daemon.info -t hisilicon "Get data from environment and set SENSOR as ${SENSOR}" else insert_detect SENSOR_DETECT=$(ipcinfo -s) export SENSOR=${SENSOR_DETECT:=unknown} remove_detect logger -s -p daemon.info -t hisilicon "Get data from ipcinfo and set SENSOR as ${SENSOR}" fw_setenv sensor $SENSOR && logger -s -p daemon.info -t hisilicon "Write detected ${SENSOR} to U-Boot ENV" fi fi if [ $b_arg_remove -eq 1 ]; then remove_ko fi if [ $b_arg_insmod -eq 1 ]; then insert_ko fi if [ $b_arg_restore -eq 1 ]; then sys_restore fi