硬件:Hi3559av100 4G+32G
multi-core版本為單系統a73mp+a53mp版本
一、內存分配說明
Hi3559AV100 的 DDR 地址空間從 0x40000000 起始。
- 核間通信共享內存(A53MP+A73MP、A53UP、Cortex-M7、DSP 之間)
- DSP0/1/2/3 Huawei LiteOS 系統內存
- A53MP+A73MP Linux 系統內存
- A53UP Huawei LiteOS 系統內存
- A53MP+A73MP 使用的 MMZ 區域
- A53UP 使用的 MMZ 區域。
見下圖
內存分配的配置可以在osdrv目錄下的osdrv_mem_cfg.sh文件中進行配置
... CHIP=$2 AMP_TYPE=$3 DDR_MEM_BASE=0x40000000 DSP_MEM_SIZE=0x04000000 #64M #hi3559av100 memory config# if [ ${CHIP} == "hi3559av100" ]; then echo "CHIP:${CHIP}, memory config" if [ ${AMP_TYPE} == "linux" ]; then LINUX_SYS_MEM_BASE=0x`echo "obase=16;$[$DDR_MEM_BASE + $DSP_MEM_SIZE]"|bc` #LINUX_SYS_MEM_BASE=0x0x40000000 + 0x04000000(64M) = 0x44000000 LINUX_ENTRY=0x`echo "obase=16;$[$LINUX_SYS_MEM_BASE + 0x00080000]"|bc` #LINUX_ENTRY=0x44000000 + 0x00080000 = 0x44080000 ATF_ENTRY=0x`echo "obase=16;$[$LINUX_ENTRY + 0x02F80000]"|bc` #ATF_ENTRY=0x44080000 + 0x02F80000 = 0x47000000 LINUX_MEM_SIZE=0x20000000 #內核的基地址是0x44000000,內核大小為0x20000000即512M。內核結束地址=0x64000000 LINUX_MMZ_SIZE=0xCC000000 #MMZ的開始地址為0x64000000,大小為0xCC000000即3264M,MMZ結束地址=0x13000 0000 LITEOS_SYS_MEM_BASE=0x`echo "obase=16;$[$LINUX_SYS_MEM_BASE+$LINUX_MEM_SIZE+$LINUX_MMZ_SIZE]" | bc` LITEOS_TEXT_OFFSET=0x01000000 LITEOS_SYS_MEM_SIZE=0x0B000000 LITEOS_MMZ_MEM_BASE=0x`echo "obase=16;$[$LITEOS_SYS_MEM_BASE+$LITEOS_TEXT_OFFSET+$LITEOS_SYS_MEM_SIZE]" | bc` LITEOS_MMZ_MEM_LEN=0x04000000 CPU_TYPE=multi-core elif [ ${AMP_TYPE} == "linux_liteos" ]; then ...
每次執行這個腳本時,會根據腳本的第一個參數$1,會不同的部分進行內存配置。
可以看到在編譯uboot,linux,atf時,都會將參數寫入對應的config文件。
在osdrv目錄下的Makefile中會執行此腳本,如下:
編譯uboot時執行./osdrv_mem_cfg.sh腳本
二、在加載驅動時指定MMZ內存參數
load3559av100_multicore腳本原來是在mmp/out/linux/multi-core/ko文件夾下,生成文件系統時會將其拷貝到文件系統的根目錄的/komod文件夾下
./load3559av100_multicore -i -sensor0 imx334 -sensor1 imx334 -sensor2 imx334 -sensor3 imx334
示例,以下是核心板出廠自帶的文件系統/komod下的腳本,廠家的config和uboot的bootargs: mem=2048M即給內核分配了2048M內存,MMZ的起始:0xE400 0000
但是我燒錄的海思默認配置的內核與文件系統(包含load3559av100_multicore),配置即內核的管理內存為512M,MMZ起始於0x64000000
1 ...核心板出廠的... 2 #DDR start:0x40000000, DSP(64M); kernel start:0x44000000, OS(2048M); MMZ start:0xE4000000 3 mmz_start=0xE4000000; # mmz start addr 4 mmz_size=1984M; # 1984M, mmz size 6 ################################################################## 7 ... 8 insert_ko() 9 { 10 insmod sys_config.ko g_online_flag=0 sensors=sns0=$SNS_TYPE0,sns1=$SNS_TYPE1,sns2=$SNS_TYPE2,sns3=$SNS_TYPE3,sns4=$SNS_TYPE4,sns5=$SNS_TYPE5,sns6=$SNS_TYPE6,sns7=$SNS_TYPE7 11 12 # driver load 13 insmod hi_osal.ko anony=1 mmz_allocator=hisi mmz=anonymous,0,$mmz_start,$mmz_size || report_error15 insmod hi3559av100_sys.ko17 ...
...海思默認的... #DDR start:0x40000000, DSP(64M); kernel start:0x44000000, OS(512M); MMZ start:0x64000000 mmz_start=0x64000000; # mmz start addr mmz_size=3520M; # 3520M, mmz size ...
燒錄進入,啟動開發板,第一次從SD燒錄,可以進入內核並掛載文件系統,進入文件系統/komod目錄下執行驅動加載腳本時,出現報錯
報錯信息里面:
kernel memory:(0x4000 0000, 0xC3FF FFFF), SIZE=0xC3FF FFFF - 0x4000 0000 = 2047M (kernel)+ 64M(DSP)
kernel的默認內存不是512M嗎?怎么變成2048M,因為config和uboot的bootargs里面也指定了mem=2048M
如此,加載腳本里面又重新指定了MMZ的起始地址為0x6400 0000,加載的時候就和內核的地址空間 (0x4000 0000, 0xC3FF FFFF)沖突了,報內存錯誤。
那就更改load3559av100_multicore腳本里面的參數為
mmz_start=0xE4000000; # mmz start addr mmz_size=1984M; # 1984M, mmz size
加載成功。
執行推流程序,
系統卡死,無法退出,也沒有報錯信息。
嘗試將內存配置改為kernel mem=512M, MMZ=3520M,重新執行./hi3559a 2,正常執行。
判斷,是因為kernel mem=2048M后,留給MMZ=1984M,在VB模塊初始化時,后預先分配內存池的大小,分配的大小過大,導致內存越界,出現不開預知的錯誤
boot args修改
修改燒寫文件的config文件里的參數
進入boot界面后,printenv,查看參數,setenv bootargs...修改參數,最后savenv保存
注意,bootargs每次save后都會寫到emmc里面,以后每次啟動就會從emmc里面讀取配置信息,比如去哪里加載內核和文件系統,
如果內核的參數或文件系統沒有配置對,就會導致kernel panic, 掛載不上文件系統,所以一定要檢查好配置參數。每次對bootargs修改后
都要保存到emmc中,內核的實際大小一定要和config文件里寫的要匹配。
注意:
燒寫uboot時,一定一定要燒寫與板子ddr參數匹配的uboot,因為第一次燒寫不匹配的uboot.bin后是可以燒進去,但是同時會將ddr的參數重寫
會導致以后重啟或再次燒寫時,系統不知道去哪里運行程序,一直無法燒寫,卡死在system startup
一旦出現這種情況,可以通過海思官方提供的HiTools來進行串口或網口燒寫。