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

374 lines
8.7 KiB
Bash
Executable File

#!/bin/sh
#
# This is part of OpenIPC.org project | 2022.01.19
#
# Board
board=demo
# SoC detect
chipid=$(ipcinfo --chip-name)
# Memory 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}
SNS_TYPE0=imx327 # sensor type
SNS_TYPE1=NULL # sensor type
YUV_TYPE0=0 # 0 -- raw, 1 -- bt1120/DC, 2 --bt656
report_error() {
echo "******* Error: There's something wrong, please check! *****"
exit 1
}
insert_osal() {
MMZ=$(awk -F '=' '$1=="mmz"{print $2}' RS=" " /proc/cmdline)
if [ -z "$MMZ" ]; then
insmod hi_osal.ko anony=1 mmz_allocator=hisi mmz=anonymous,0,$mmz_start,$mmz_size || report_error
else
insmod cma_osal.ko anony=1 mmz_allocator=cma mmz=$MMZ || report_error
fi
}
insert_detect() {
cd /lib/modules/4.9.37/hisilicon
insert_osal
insmod sys_config.ko chip=${chipid} sensors=sns0=$SNS_TYPE0,sns1=$SNS_TYPE1, g_cmos_yuv_flag=$YUV_TYPE0
insmod hi3516cv500_base.ko
insmod hi3516cv500_isp.ko
insmod hi_sensor_i2c.ko
insmod hi_sensor_spi.ko
}
remove_detect() {
rmmod -w hi_sensor_spi
rmmod -w hi_sensor_i2c
rmmod -w hi3516cv500_isp
rmmod -w hi3516cv500_base
rmmod -w sys_config
rmmod -w hi_osal &> /dev/null
rmmod -w cma_osal &> /dev/null
}
insert_audio() {
insmod hi3516cv500_aio.ko
insmod hi3516cv500_ai.ko
insmod hi3516cv500_ao.ko
insmod hi3516cv500_aenc.ko
insmod hi3516cv500_adec.ko
insmod hi3516cv500_acodec.ko
# insmod extdrv/hi_tlv320aic31.ko
echo "insert audio"
}
remove_audio() {
rmmod -w hi3516cv500_acodec
# rmmod -w hi_tlv320aic31.ko
rmmod -w hi3516cv500_adec
rmmod -w hi3516cv500_aenc
rmmod -w hi3516cv500_ao
rmmod -w hi3516cv500_ai
rmmod -w hi3516cv500_aio
echo "remove audio"
}
insert_isp() {
insmod hi3516cv500_isp.ko
}
insert_gyro() {
insmod extdrv/hi_spi.ko
insmod hi3516cv500_gyrodis.ko
insmod hi3516cv500_motionfusion.ko
insmod extdrv/motionsensor_mng.ko
insmod extdrv/motionsensor_chip.ko
}
remove_gyro() {
rmmod -w motionsensor_chip
rmmod -w motionsensor_mng
rmmod -w hi3516cv500_motionfusion
rmmod -w hi3516cv500_gyrodis
rmmod -w hi_spi
}
sys_config(){
bt656_pinmux(){
devmem 0x114f0040 32 0x2
devmem 0x114f0044 32 0x2
devmem 0x114f0048 32 0x2
devmem 0x114f004c 32 0x2
devmem 0x114f0050 32 0x2
devmem 0x114f0054 32 0x2
devmem 0x114f0058 32 0x2
devmem 0x114f005c 32 0x2
devmem 0x114f0068 32 0x2
}
bt656_pinmux;
}
insert_ko() {
# driver load
insert_osal
# sys config
insmod sys_config.ko chip=${chipid} sensors=sns0=$SNS_TYPE0,sns1=$SNS_TYPE1, g_cmos_yuv_flag=$YUV_TYPE0
sys_config;
# insmod hi_tzasc.ko
insmod hi3516cv500_base.ko
insmod hi3516cv500_sys.ko
insmod hi3516cv500_tde.ko
insmod hi3516cv500_rgn.ko
insmod hi3516cv500_gdc.ko
insmod hi3516cv500_vgs.ko
insmod hi3516cv500_dis.ko
insmod hi3516cv500_vi.ko
insert_isp
insmod hi3516cv500_vpss.ko
insmod hi3516cv500_vo.ko
# insmod hifb.ko video="hifb:vram0_size:1024" # default fb0:576p
insmod hi3516cv500_chnl.ko
insmod hi3516cv500_vedu.ko
insmod hi3516cv500_rc.ko
insmod hi3516cv500_venc.ko
insmod hi3516cv500_h264e.ko
insmod hi3516cv500_h265e.ko
insmod hi3516cv500_jpege.ko
# insmod hi3516cv500_ive.ko save_power=1
# insmod hi_ipcm.ko
# insmod hi3516cv500_nnie.ko nnie_save_power=1 nnie_max_tskbuf_num=32
insmod hi_pwm.ko
insmod hi_piris.ko
insmod hi_sensor_i2c.ko
insmod hi_sensor_spi.ko
# insmod extdrv/hi_sil9136.ko norm=12 #1080P@30fps for umap7p
# insmod extdrv/mpu_bosch.ko
insert_audio
insmod hi_mipi_rx.ko
# insmod hi_mipi_tx.ko
# insmod hi_user.ko
# insert_gyro
}
remove_ko() {
# rmmod_gyro
# rmmod -w hi_user
remove_audio
# rmmod -w hi_mipi_tx
rmmod -w hi_mipi_rx
#rmmod -w hi_sil9136 &> /dev/null
rmmod -w hi_piris
rmmod -w hi_pwm
# rmmod -w hi3516cv500_nnie nnie_save_power=1 nnie_max_tskbuf_num=32
# rmmod -w hi_ipcm
# rmmod -w hi3516cv500_ive
rmmod -w hi3516cv500_rc
rmmod -w hi3516cv500_jpege
rmmod -w hi3516cv500_h264e
rmmod -w hi3516cv500_h265e
rmmod -w hi3516cv500_venc
rmmod -w hi3516cv500_vedu
rmmod -w hi3516cv500_chnl
# rmmod -w hifb
# rmmod -w hi3516cv500_vo
rmmod -w hi3516cv500_vpss
rmmod -w hi3516cv500_isp
rmmod -w hi3516cv500_vi
rmmod -w hi3516cv500_gdc
rmmod -w hi3516cv500_dis
rmmod -w hi3516cv500_vgs
rmmod -w hi3516cv500_rgn
rmmod -w hi3516cv500_tde
rmmod -w hi_sensor_i2c &>/dev/null
rmmod -w hi_sensor_spi &>/dev/null
# rmmod -w mpu_bosch
rmmod -w hi3516cv500_sys
rmmod -w hi3516cv500_base
# rmmod -w hi_tzasc
rmmod -w sys_config
rmmod -w hi_osal
}
sys_restore() {
sns_config
}
load_usage()
{
echo "Usage: ./load_hisilicon [-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: imx307]"
echo " -h help information"
echo -e "Available sensors: gc2053 imx307 imx327 imx335 os05a sc2231 sc2235 sc4236 sc3235 sc4236 etc."
echo -e "for example: ./load_hisilicon -i -sensor imx307 -osmem 32M -board demo -yuv0 0\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_sensor0=0
b_arg_sensor1=0
b_arg_yuv_type0=0
b_arg_insmod=0
b_arg_remove=0
b_arg_restore=0
b_arg_total_mem=0
b_arg_os_mem=0
for arg in $@; do
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_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_yuv_type0 -eq 1 ]; then
b_arg_yuv_type0=0
YUV_TYPE0=$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
;;
"-yuv0")
b_arg_yuv_type0=1
;;
"-total")
b_arg_total_mem=1
;;
"-restore")
b_arg_restore=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 --short-sensor)
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
if [ $b_arg_restore -eq 1 ]; then
sys_restore
fi