mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			442 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			442 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/bin/sh
 | |
| #
 | |
| # This is part of OpenIPC.org project | 2022.01.07
 | |
| #
 | |
| 
 | |
| # 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_TYPE=$(fw_printenv -n sensor)
 | |
| SNS_TYPE=${SNS_TYPE:=ar0130}
 | |
| 
 | |
| report_error() {
 | |
|     echo "******* Error: There's something wrong, please check! *****"
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| insert_osal() {
 | |
|     insmod mmz.ko mmz=anonymous,0,$mmz_start,$mmz_size anony=1 || report_error
 | |
| }
 | |
| 
 | |
| insert_detect() {
 | |
|     cd /lib/modules/3.0.8/hisilicon
 | |
|     sys_config;
 | |
|     insert_osal
 | |
|     insmod hi3518_base.ko
 | |
|     insmod hi3518_sys.ko
 | |
|     insmod hi3518_isp.ko
 | |
|     insmod hi_i2c.ko
 | |
|     SNS_TYPE=imx122 insert_sns
 | |
| }
 | |
| 
 | |
| remove_detect() {
 | |
|     rmmod -w ssp_sony &>/dev/null
 | |
|     rmmod -w ssp_pana &>/dev/null
 | |
|     rmmod -w ssp_ad9020 &>/dev/null
 | |
|     rmmod -w hi_i2c
 | |
|     rmmod -w hi3518_isp
 | |
|     rmmod -w hi3518_sys
 | |
|     rmmod -w hi3518_base
 | |
|     rmmod -w mmz
 | |
| }
 | |
| 
 | |
| insert_audio() {
 | |
|     insmod acodec.ko
 | |
|     insmod hidmac.ko
 | |
|     insmod hi3518_sio.ko
 | |
|     insmod hi3518_ai.ko
 | |
|     insmod hi3518_ao.ko
 | |
|     insmod hi3518_aenc.ko
 | |
|     insmod hi3518_adec.ko
 | |
|     echo "insert audio"
 | |
| }
 | |
| 
 | |
| remove_audio() {
 | |
|     rmmod -w hi3518_adec
 | |
|     rmmod -w hi3518_aenc
 | |
|     rmmod -w hi3518_ao
 | |
|     rmmod -w hi3518_ai
 | |
|     rmmod -w hi3518_sio
 | |
|     rmmod -w acodec
 | |
|     rmmod -w hidmac
 | |
|     echo "remove audio"
 | |
| }
 | |
| 
 | |
| insert_sns() {
 | |
|     case $SNS_TYPE in
 | |
|     ar0130 | 9m034 | po3100k | bf3116 | bg0703)
 | |
|         devmem 0x20030030 32 0x5 #Sensor clock 27 MHz
 | |
|         insmod ssp_ad9020.ko
 | |
|         ;;
 | |
|     icx692)
 | |
|         devmem 0x200f000c 32 32 0x1 #pinmux SPI0
 | |
|         devmem 0x200f0010 32 32 0x1 #pinmux SPI0
 | |
|         devmem 0x200f0014 32 0x1    #pinmux SPI0
 | |
|         insmod ssp_ad9020.ko
 | |
|         ;;
 | |
|     mn34031 | mn34041)
 | |
|         devmem 0x200f000c 32 0x1 #pinmux SPI0
 | |
|         devmem 0x200f0010 32 0x1 #pinmux SPI0
 | |
|         devmem 0x200f0014 32 0x1 #pinmux SPI0
 | |
|         devmem 0x20030030 32 0x5 #Sensor clock 27MHz
 | |
|         insmod ssp_pana.ko
 | |
|         ;;
 | |
|     imx104 | imx122 | imx138 | imx222 | imx225 | imx322)
 | |
|         devmem 0x200f000c 32 0x1 #pinmux SPI0
 | |
|         devmem 0x200f0010 32 0x1 #pinmux SPI0
 | |
|         devmem 0x200f0014 32 0x1 #pinmux SPI0
 | |
|         devmem 0x20030030 32 0x6 #Sensor clock 37.125 MHz
 | |
|         insmod ssp_sony.ko
 | |
|         ;;
 | |
|     ov9712 | ov9732 | soih22 | ov2710 | jxh22 | jxh42)
 | |
|         devmem 0x20030030 32 0x1 #Sensor clock 24 MHz
 | |
|         insmod ssp_ad9020.ko
 | |
|         ;;
 | |
|     ar0140 | ar0141)
 | |
|         devmem 0x20030030 32 0x1
 | |
|         ;; #Sensor clock 24 MHz
 | |
|     mt9p006)
 | |
|         devmem 0x20030030 32 0x1  #Sensor clock 24 MHz
 | |
|         devmem 0x2003002c 32 0x6a #VI input associated clock phase reversed
 | |
|         insmod ssp_ad9020.ko
 | |
|         ;;
 | |
|     hm1375 | ar0330)
 | |
|         devmem 0x20030030 32 0x1
 | |
|         ;; #Sensor clock 24 MHz
 | |
|     imx236)
 | |
|         devmem 0x20030030 32 0x6 #Sensor clock 37.125 MHz
 | |
|         ;;
 | |
|     *)
 | |
|         echo "xxxx Invalid sensor type $SNS_TYPE xxxx"
 | |
|         report_error
 | |
|         ;;
 | |
|     esac
 | |
| }
 | |
| 
 | |
| remove_sns() {
 | |
|     rmmod -w hi_i2c &>/dev/null
 | |
|     rmmod -w ssp &>/dev/null
 | |
|     rmmod -w ssp_sony &>/dev/null
 | |
|     rmmod -w ssp_pana &>/dev/null
 | |
|     rmmod -w ssp_ad9020 &>/dev/null
 | |
| }
 | |
| 
 | |
| sys_config() {
 | |
|     # lowpower.sh
 | |
|     devmem 0x20050080 32 0x000121a8
 | |
|     #USB PHY
 | |
|     devmem 0x20050084 32 0x005d2188
 | |
|     #NANDC
 | |
|     devmem 0x200300D0 32 0x5
 | |
|     devmem 0x200f00c8 32 0x1
 | |
|     devmem 0x200f00cc 32 0x1
 | |
|     devmem 0x200f00d0 32 0x1
 | |
|     devmem 0x200f00d4 32 0x1
 | |
|     devmem 0x200f00d8 32 0x1
 | |
|     devmem 0x200f00dc 32 0x1
 | |
|     devmem 0x200f00e0 32 0x1
 | |
|     devmem 0x200f00e4 32 0x1
 | |
|     devmem 0x200f00e8 32 0x1
 | |
|     devmem 0x200f00ec 32 0x1
 | |
|     devmem 0x200f00f4 32 0x1
 | |
|     devmem 0x200f00f8 32 0x1
 | |
|     #SAR ADC
 | |
|     devmem 0x20030080 32 0x1
 | |
|     devmem 0x200b0008 32 0x1
 | |
|     #PWM
 | |
|     devmem 0x20030038 32 0x2
 | |
|     #IR
 | |
|     devmem 0x20070000 32 0x0
 | |
|     devmem 0x200f00c4 32 0x1
 | |
|     #UART2
 | |
|     devmem 0x200A0030 32 0x0
 | |
|     #UART2
 | |
|     devmem 0x200f0108 32 0x0
 | |
|     devmem 0x200f010c 32 0x0
 | |
|     #SPI0 SPI1
 | |
|     devmem 0x200C0004 32 0x7F00
 | |
|     devmem 0x200E0004 32 0x7F00
 | |
|     #spi0
 | |
|     devmem 0x200f000c 32 0x0
 | |
|     devmem 0x200f0010 32 0x0
 | |
|     devmem 0x200f0014 32 0x0
 | |
|     #spi1
 | |
|     devmem 0x200f0110 32 0x0
 | |
|     devmem 0x200f0114 32 0x0
 | |
|     devmem 0x200f0118 32 0x0
 | |
|     devmem 0x200f011c 32 0x0
 | |
|     #AUDIO CODEC LINE IN
 | |
|     #devmem 0x20050068 32 0xa8022c2c
 | |
|     #devmem 0x2005006c 32 0xf5035a4a
 | |
| 
 | |
|     # PINMUX
 | |
|     devmem 0x200f0008 32 0x00000001 # 0:GPIO1_2   /1:SENSOR_CLK
 | |
|     #I2C default setting is I2C
 | |
|     i2c_type_select() {
 | |
|         devmem 0x200f0018 32 0x00000001 # 0:GPIO2_0   / 1:I2C_SDA
 | |
|         devmem 0x200f001c 32 0x00000001 # 0:GPIO2_1   / 1:I2C_SCL
 | |
|     }
 | |
| 
 | |
|     #I2C default setting is I2C
 | |
|     gpio_i2c_type_select() {
 | |
|         devmem 0x200f0018 32 0x00000000 # 0:GPIO2_0   / 1:I2C_SDA
 | |
|         devmem 0x200f001c 32 0x00000000 # 0:GPIO2_1   / 1:I2C_SCL
 | |
|     }
 | |
| 
 | |
|     #MII
 | |
|     net_mii_mode() {
 | |
|         devmem 0x200f0030 32 0x1
 | |
|         devmem 0x200f0034 32 0x1
 | |
|         devmem 0x200f0038 32 0x1
 | |
|         devmem 0x200f003C 32 0x1
 | |
|         devmem 0x200f0040 32 0x1
 | |
|         devmem 0x200f0044 32 0x1
 | |
|         devmem 0x200f0048 32 0x1
 | |
|         devmem 0x200f004C 32 0x1
 | |
|         devmem 0x200f0050 32 0x1
 | |
|         devmem 0x200f0054 32 0x1
 | |
|         devmem 0x200f0058 32 0x1
 | |
|         devmem 0x200f005C 32 0x1
 | |
|         devmem 0x200f0060 32 0x1
 | |
|         devmem 0x200f0064 32 0x1
 | |
|         devmem 0x200f0068 32 0x1
 | |
|         devmem 0x200f006C 32 0x1
 | |
|         #devmem 0x200f0070 32  0x1
 | |
|         devmem 0x200f0074 32 0x1
 | |
|         devmem 0x200f0078 32 0x1
 | |
|     }
 | |
| 
 | |
|     #RMII
 | |
|     net_rmii_mode() {
 | |
|         devmem 0x200f0030 32 0x1
 | |
|         devmem 0x200f0034 32 0x1
 | |
|         devmem 0x200f0038 32 0x1
 | |
|         #devmem 0x200f003C 32  0x1
 | |
|         #devmem 0x200f0040 32  0x1
 | |
|         devmem 0x200f0044 32 0x1
 | |
|         devmem 0x200f0048 32 0x1
 | |
|         devmem 0x200f004C 32 0x1
 | |
|         devmem 0x200f0050 32 0x1
 | |
|         devmem 0x200f0054 32 0x1
 | |
|         devmem 0x200f0058 32 0x1
 | |
|         devmem 0x200f005C 32 0x3
 | |
|         devmem 0x200f0060 32 0x1
 | |
|         devmem 0x200f0064 32 0x1
 | |
|         devmem 0x200f0068 32 0x1 #MII_TXER 0x1,GPIO2_6 0x0
 | |
|         devmem 0x200f006C 32 0x1 #MII_RXER 0x1,GPIO2_7 0x0
 | |
|         #devmem 0x200f0070 32  0x1
 | |
|         devmem 0x200f0074 32 0x1
 | |
|         devmem 0x200f0078 32 0x1
 | |
|     }
 | |
| 
 | |
|     clk_cfg() {
 | |
|         devmem 0x2003002c 32 0x2a  # VICAP, ISP unreset & clock enable
 | |
|         devmem 0x20030048 32 0x2   # VPSS unreset, code also config
 | |
|         devmem 0x20030034 32 0x510 # VDP  unreset & HD clock enable # XM: 0x00000043
 | |
|         devmem 0x20030040 32 0x2   # VEDU unreset
 | |
|         devmem 0x20030060 32 0x2   # JPEG unreset
 | |
|         devmem 0x20030058 32 0x2   # TDE  unreset
 | |
|         devmem 0x20030068 32 0x2   # MDU  unreset
 | |
| 
 | |
|         #devmem 0x2003006c 32 0x2;		# IVE  unreset
 | |
|         #devmem 0x2003008c 32 0x2;		# SIO unreset and clock enable,m/f/bclk config in code.
 | |
|         #devmem 0x20050068 32 0x58000000 # Audio Codec channel config for power down.
 | |
|     }
 | |
|     sysctl() {
 | |
|         devmem 0x20110150 32 0x03ff6 #DMA1 DMA2
 | |
|         devmem 0x20110154 32 0x03ff6 #ETH
 | |
|         devmem 0x20110158 32 0x03ff6 #USB
 | |
|         devmem 0x2011015C 32 0x03ff6 #CIPHER   0x15C
 | |
|         devmem 0x20110160 32 0x03ff6 #SDIO   0X160
 | |
|         devmem 0x20110164 32 0x03ff6 #NAND SFC   0X164
 | |
|         devmem 0x20110168 32 0x10201 #ARMD  0X168
 | |
|         devmem 0x2011016C 32 0x10201 #ARMI	0X16C
 | |
|         devmem 0x20110170 32 0x03ff6 #IVE  0X170
 | |
|         devmem 0x20110174 32 0x03ff6 #MD, DDR_TEST  0x174
 | |
|         devmem 0x20110178 32 0x03ff6 #JPGE #0x178
 | |
|         devmem 0x2011017C 32 0x03ff3 #TDE0 0X17C
 | |
|         devmem 0x20110180 32 0x03ff4 #VPSS  0X180
 | |
|         devmem 0x20110184 32 0x10c82 #VENC  0X184
 | |
|         devmem 0x20110188 32 0x10101 #VICAP FPGA
 | |
|         #devmem 0x20110188 32 0x10640         #VICAP ESL
 | |
|         devmem 0x2011018c 32 0x10100 #VDP
 | |
|         devmem 0x20110100 32 0x67    #mddrc order enable mddrc idmap mode select
 | |
|         #devmem 0x20050054 32 0x123564        #[2:0] VENC [6:4] VPSS [10:8] TDE [14:12] JPGE [18:16] MD
 | |
|         devmem 0x20050038 32 0x3 #DDR0 VICAP VDP
 | |
|     }
 | |
|     i2c_type_select
 | |
|     net_rmii_mode
 | |
|     clk_cfg
 | |
| }
 | |
| insert_ko() {
 | |
|     cd /lib/modules/3.0.8/hisilicon
 | |
| 
 | |
|     sys_config
 | |
| 
 | |
|     insert_osal
 | |
| 
 | |
|     insmod hi3518_base.ko
 | |
|     insmod hi3518_sys.ko
 | |
|     insmod hiuser.ko
 | |
| 
 | |
|     insmod hi3518_tde.ko
 | |
|     insmod hi3518_dsu.ko
 | |
| 
 | |
|     insmod hi3518_viu.ko
 | |
|     insmod hi3518_isp.ko
 | |
|     insmod hi3518_vpss.ko
 | |
|     # insmod hi3518_vou.ko
 | |
|     # insmod hi3518_vou.ko detectCycle=0 #close dac detect
 | |
|     # insmod hifb.ko video="hifb:vram0_size:1620"
 | |
| 
 | |
|     insmod hi3518_venc.ko
 | |
|     insmod hi3518_group.ko
 | |
|     insmod hi3518_chnl.ko
 | |
|     insmod hi3518_h264e.ko
 | |
|     insmod hi3518_jpege.ko
 | |
|     insmod hi3518_rc.ko
 | |
|     insmod hi3518_region.ko
 | |
| 
 | |
|     # insmod hi3518_vda.ko
 | |
|     insmod hi3518_ive.ko
 | |
| 
 | |
|     insmod hi_i2c.ko
 | |
|     #insmod gpioi2c.ko
 | |
|     #insmod gpioi2c_ex.ko
 | |
|     insmod pwm.ko
 | |
|     #insmod sil9024.ko norm=5   #720P@60fps
 | |
| 
 | |
|     insert_sns >/dev/null
 | |
| 
 | |
|     insert_audio
 | |
|     echo "==== Your input Sensor type is $SNS_TYPE ===="
 | |
| 
 | |
|     insmod wdt.ko
 | |
| 
 | |
|     # system configuration
 | |
|     sysctl;
 | |
| }
 | |
| 
 | |
| remove_ko() {
 | |
|     rmmod -w wdt
 | |
|     remove_audio
 | |
|     remove_sns
 | |
| 
 | |
|     # rmmod -w sil9024 &> /dev/null
 | |
|     rmmod -w hi_i2c.ko &>/dev/null
 | |
|     rmmod -w pwm
 | |
|     #rmmod -w gpioi2c
 | |
| 
 | |
|     rmmod -w hi3518_ive
 | |
|     # rmmod -w hi3518_vda
 | |
| 
 | |
|     rmmod -w hi3518_region
 | |
|     rmmod -w hi3518_rc
 | |
|     rmmod -w hi3518_jpege
 | |
|     rmmod -w hi3518_h264e
 | |
|     rmmod -w hi3518_chnl
 | |
|     rmmod -w hi3518_group
 | |
|     rmmod -w hi3518_venc
 | |
| 
 | |
|     # rmmod -w hifb
 | |
|     # rmmod -w hi3518_vou
 | |
|     rmmod -w hi3518_vpss
 | |
|     rmmod -w hi3518_isp
 | |
|     rmmod -w hi3518_viu
 | |
| 
 | |
|     # rmmod -w hi3518_dsu
 | |
|     # rmmod -w hi3518_tde
 | |
| 
 | |
|     rmmod -w hiuser
 | |
|     rmmod -w hi3518_sys
 | |
|     rmmod -w hi3518_base
 | |
|     rmmod -w mmz
 | |
| }
 | |
| 
 | |
| load_usage() {
 | |
|     echo "Usage:  ./load3518 [-option] [sensor_name]"
 | |
|     echo "options:"
 | |
|     echo "    -i sensor_name           insert modules"
 | |
|     echo "    -r                       remove modules"
 | |
|     echo "    -a sensor_name           remove modules first, then insert modules"
 | |
|     echo "    -h                       help information"
 | |
|     echo -e "Available sensors: ar0130, imx104, icx692, ov9715, 9m034, imx122, mt9p006"
 | |
|     echo -e "for example: ./load3518 -a ar0130 \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"
 | |
| }
 | |
| 
 | |
| 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
 | |
| 
 | |
| # 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
 | |
|         SNS_TYPE=$(ipcinfo --short-sensor)
 | |
|         export SENSOR=${SNS_TYPE:=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
 | |
| 
 | |
| # load module
 | |
| if [ "$SENSOR" = "unknown" ]; then
 | |
| 	exit 1
 | |
| else
 | |
| if [ "$1" = "-i" ]; then
 | |
|     cd /lib/modules/3.0.8/hisilicon
 | |
|     insert_ko
 | |
| fi
 | |
| fi
 | |
| 
 | |
| if [ "$1" = "-r" ]; then
 | |
|     remove_ko
 | |
| fi
 | |
| 
 | |
| if [ "$1" = "-h" ]; then
 | |
|     load_usage
 | |
|     exit
 | |
| fi
 | |
| 
 | |
| if [ $# -eq 0 ] || [ "$1" = "-a" ]; then
 | |
|     remove_ko
 | |
|     insert_ko
 | |
| fi
 |