firmware/general/package/hisilicon-osdrv-hi3516av100/files/script/load_hisilicon

386 lines
11 KiB
Bash
Executable File

#!/bin/sh
#
# This is part of OpenIPC.org project | 2020.08.01
#
# ar0237 imx290 imx307 imx323 imx385 jxf22 ov2718 ov2718_2a sc2235
# SoC detect
chipid=$(ipctool --chip_id)
# MMZ config
mem_start=0x80000000 # phy mem start
mem_total=$(awk -F '=' '$1=="totalmem"{print $2}' RS=" " /proc/cmdline | tr -d 'M')
mem_total=${mem_total:=64}
os_mem_size=$(awk -F '=' '$1=="mem"{print $2}' RS=" " /proc/cmdline | tr -d 'M')
os_mem_size=${os_mem_size:=32}
report_error() {
echo "******* Error: There's something wrong, please check! *****"
exit 1
}
insert_mmz() {
insmod mmz.ko mmz=anonymous,0,$mmz_start,$mmz_size anony=1 || report_error
}
insert_detect() {
cd /lib/modules/4.9.37/hisilicon
insmod sys_config.ko vi_vpss_online=$b_arg_online sensor=unknown pin_mux_select=0
insert_mmz
insmod hi_media.ko
insmod hi3516a_base.ko
insmod hi3516a_sys.ko vi_vpss_online=$b_arg_online sensor=unknown mem_total=$mem_total
insert_isp
insmod sensor_i2c.ko
insmod sensor_spi.ko
SENSOR=ar0230 insert_sns
}
remove_detect() {
rmmod sensor_spi
rmmod sensor_i2c
rmmod hi3516a_isp
rmmod hi3516a_sys
rmmod hi3516a_base
rmmod hi_media
rmmod mmz
}
insert_audio() {
insmod acodec.ko
insmod hi3516a_aio.ko
insmod hi3516a_ai.ko
insmod hi3516a_ao.ko
insmod hi3516a_aenc.ko
insmod hi3516a_adec.ko
echo "insert audio"
}
remove_audio() {
rmmod hi3516a_adec
rmmod hi3516a_aenc
rmmod hi3516a_ao
rmmod hi3516a_ai
rmmod hi3516a_aio
rmmod acodec
echo "remove audio"
}
remove_sns() {
rmmod sensor_spi &>/dev/null
rmmod sensor_i2c &>/dev/null
}
insert_isp() {
case $SENSOR in
ov9750)
insmod hi3516a_isp.ko update_pos=1
;;
*)
insmod hi3516a_isp.ko update_pos=0 proc_param=1
;;
esac
}
insert_sns() {
case $SENSOR in
imx123)
devmem 0x200f0050 32 0x1 # spi0_sclk
devmem 0x200f0054 32 0x1 # spi0_sdo
devmem 0x200f0058 32 0x1 # spi0_sdi
devmem 0x200f005c 32 0x1 # spi0_csn
devmem 0x2003002c 32 0x90007 # sensor unreset, clk 37.125MHz, VI 250MHz
devmem 0x20030104 32 0x0 # VI 250MHz
insmod sensor_i2c.ko
;;
imx185)
devmem 0x200f0050 0x1 # spi0_sclk
devmem 0x200f0054 0x1 # spi0_sdo
devmem 0x200f0058 0x1 # spi0_sdi
devmem 0x200f005c 0x1 # spi0_csn
devmem 0x2003002c 0x90007 # sensor unreset, clk 37.125MHz, VI 250MHz
insmod extdrv/sensor_spi.ko
;;
imx117)
devmem 0x200f0050 0x1 # spi0_sclk
devmem 0x200f0054 0x1 # spi0_sdo
devmem 0x200f0058 0x1 # spi0_sdi
devmem 0x200f005c 0x1 # spi0_csn
devmem 0x200f00dc 0x1
devmem 0x200f00e0 0x1
devmem 0x20030038 0x6
devmem 0x20131020 0x30de8
devmem 0x20131024 0x30de5
devmem 0x2013102c 0x5
devmem 0x20131060 0xbf
devmem 0x20131064 0xbc
devmem 0x2013106c 0x5
devmem 0x2003002c 0x90007 # sensor unreset, clk 37.125MHz, VI 250MHz
insmod extdrv/sensor_spi.ko sensor=imx117
;;
mn34220)
devmem 0x200f0050 0x2 # i2c0_scl
devmem 0x200f0054 0x2 # i2c0_sda
devmem 0x2003002c 0x90007 # sensor unreset, clk 37.125MHz, VI 250MHz
;;
ar0330)
devmem 0x200f0050 0x2 # i2c0_scl
devmem 0x200f0054 0x2 # i2c0_sda
devmem 0x2003002c 0xE0007 # sensor unreset, clk 24MHz, VI 250MHz
;;
ov4689)
devmem 0x200f0050 32 0x2 # i2c0_scl
devmem 0x200f0054 32 0x2 # i2c0_sda
devmem 0x2003002c 32 0xB0007 # sensor unreset, clk 27MHz, VI 250MHz
devmem 0x20030104 32 0x0
;;
ar0230 | ar0237 | sc4236)
devmem 0x200f0050 32 0x2 # i2c0_scl
devmem 0x200f0054 32 0x2 # i2c0_sda
devmem 0x2003002c 32 0xB0007 # sensor unreset, clk 27MHz, VI 250MHz
devmem 0x20030104 32 0x0
;;
bt1120) ;;
\
*)
echo "xxxx Invalid sensor type $SNS_TYPE xxxx"
report_error
;;
esac
}
insert_ko() {
# sys config
#insmod sys_config.ko vi_vpss_online=$b_arg_online sensor=$SENSOR pin_mux_select=0
# driver load
insert_mmz
#insmod mmz.ko mmz=anonymous,0,$mmz_start,$mmz_size anony=1 || report_error
insmod hi_media.ko
insmod hi3516a_base.ko
insmod hi3516a_sys.ko vi_vpss_online=$b_arg_online sensor=$SENSOR mem_total=$mem_total
if [[ $? -ne 0 ]]; then
exit
fi
#insmod hi3516a_tde.ko
insmod hi3516a_region.ko
insmod hi3516a_vgs.ko
insert_isp
insmod hi3516a_viu.ko detect_err_frame=10
insmod hi3516a_vpss.ko rfr_frame_comp=1
#insmod hi3516a_vou.ko
#insmod hi3516a_vou.ko transparentTransmit=1 #enable transparentTransmit
#insmod hifb.ko video="hifb:vram0_size:1620" # default pal
insmod hi3516a_rc.ko
insmod hi3516a_venc.ko
insmod hi3516a_chnl.ko ChnlLowPower=1
insmod hi3516a_h264e.ko H264eMiniBufMode=1
insmod hi3516a_jpege.ko
insmod hi3516a_ive.ko save_power=0
#insmod hi3516a_ive.ko
insmod sensor_i2c.ko
#insmod pwm.ko
#insmod piris.ko
insert_sns
insert_audio
insmod hi_mipi.ko
echo "==== Your input Sensor type is $SENSOR ===="
}
remove_ko() {
rmmod sys_config.ko
remove_audio
remove_sns
#rmmod pwm
rmmod hi3516a_ive
rmmod hi3516a_rc
rmmod hi3516a_jpege
rmmod hi3516a_h264e
rmmod hi3516a_chnl
rmmod hi3516a_venc
rmmod hifb
rmmod hi3516a_vou
rmmod hi3516a_vpss
rmmod hi3516a_viu
rmmod hi_mipi
rmmod hi3516a_vgs
rmmod hi3516a_region
rmmod hi3516a_tde
#rmmod piris
rmmod hi3516a_isp
rmmod hi3516a_sys
rmmod hi3516a_base
rmmod hi_media
rmmod mmz
}
load_usage() {
echo "Usage: ./load3518e [-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: ar0230]"
echo " -osmem os_mem_size config os mem size [unit: M, default: 32]"
echo " -total_mem_size config total mem size [unit: M, default: 64]"
echo " -offline vi/vpss offline"
echo " -h help information"
echo -e "Available sensors: imx222 9m034 ov9752 ar0230 ar0130 ov9712 mn34222"
echo -e "notes: osmem option can't be used when mmz zone partition is enable\n\n"
echo -e "for example online: ./load3518e -a -sensor ar0230 -osmem 32 -total 64\n"
echo -e " offline: ./load3518e -a -sensor ar0230 -osmem 32 -total 64 -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_total_mem=0
b_arg_sensor=0
b_arg_insmod=0
b_arg_remove=0
b_arg_online=1
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
fi
if [ $b_arg_sensor -eq 1 ]; then
b_arg_sensor=0
SENSOR=$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
;;
"-sensor")
b_arg_sensor=1
;;
"-osmem")
b_arg_os_mem=1
;;
"-total")
b_arg_total_mem=1
;;
"-offline")
b_arg_online=0
;;
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 [ "$SENSOR" = "unknown" ]; then
exit 1
else
if [ $b_arg_insmod -eq 1 ]; then
cd /lib/modules/4.9.37/hisilicon
insert_ko
fi
fi