2023年7月25日发(作者:)
海思Hi3559AV100内存分配——MMZ硬件:Hi3559av100 4G+32Gmulti-core版本为单系统a73mp+a53mp版本⼀、内存分配说明 Hi3559AV100 的 DDR 地址空间从 0x40000000 起始。 Hi3559AV100 的 DDR 主要划分为如下⼏个部分:核间通信共享内存(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_⽂件中进⾏配置...CHIP=$2AMP_TYPE=$3DDR_MEM_BASE=0x40000000DSP_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" ]; ####################################################################################################echo -e ${INFO}"config $1..."${DONE}echo UBOOT_LINUX_ENTRY_NEW=$UBOOT_LINUX_ENTRY_NEWecho LITEOS_DDR_MEM_BASE_NEW=$LITEOS_DDR_ho LINUX_SYS_MEM_BASE_NEW =$LINUX_SYS_MEM_BASE_NEWif [ $1 == "uboot" ];thensed -i "s/$UBOOT_LINUX_ENTRY_MATCH/$UBOOT_LINUX_ENTRY_NEW/g" ./opensource/uboot/u-boot-2016.11/configs/${CHIP}_defconfigsed -i "s/$UBOOT_LINUX_ENTRY_MATCH/$UBOOT_LINUX_ENTRY_NEW/g" ./opensource/uboot/u-boot-2016.11/configs/${CHIP}_nand_defconfigsed -i "s/$UBOOT_LINUX_ENTRY_MATCH/$UBOOT_LINUX_ENTRY_NEW/g" ./opensource/uboot/u-boot-2016.11/configs/${CHIP}_emmc_defconfigsed -i "s/$UBOOT_LINUX_ENTRY_MATCH/$UBOOT_LINUX_ENTRY_NEW/g" ./opensource/uboot/u-boot-2016.11/configs/${CHIP}_ufs_defconfigelif [ $1 == "liteos" ];then if [ ${AMP_TYPE} == "linux" ]; then sed -i "s/$LITEOS_DDR_MEM_BASE_MATCH/$LITEOS_DDR_MEM_BASE_NEW/g" ./platform/liteos_a53/liteos_user/platform/bsp/board/${CHIP}/cortex-a53_aarch64/include/lif [ $1 == "atf" ];thensed -i "s/$ATF_ATF_ENTRY_MATCH/$ATF_ATF_ENTRY_NEW/g" ./opensource/arm-trusted-firmware/arm-trusted-firmware/plat/hisilicon/${CHIP}/include/platform_ [ $1 == "linux" ];thensed -i "s/$LINUX_ATF_ENTRY_MATCH/$LINUX_ATF_ENTRY_NEW/g" ./opensource/kernel/linux-4.9.y_${CPU_TYPE}/arch/arm64/boot/dts/hisilicon/${CHIP}- -i "s/$LINUX_ATF_ENTRY_MATCH/$LINUX_ATF_ENTRY_NEW/g" ./opensource/kernel/linux-4.9.y_${CPU_TYPE}/arch/arm64/boot/dts/hisilicon/${CHIP}- -i "s/$LINUX_SYS_MEM_BASE_MATCH/$LINUX_SYS_MEM_BASE_NEW/g" ./opensource/kernel/linux-4.9.y_${CPU_TYPE}/arch/arm64/boot/dts/hisilicon/${CHIP}- -i "s/$LINUX_SYS_MEM_BASE_MATCH/$LINUX_SYS_MEM_BASE_NEW/g" ./opensource/kernel/linux-4.9.y_${CPU_TYPE}/arch/arm64/boot/dts/hisilicon/${CHIP}-eecho -e ${ERROR}"MODULE IS INVALID!"${DONE}exit 1fi 每次执⾏这个脚本时,会根据脚本的第⼀个参数$1,会不同的部分进⾏内存配置。 可以看到在编译uboot,linux,atf时,都会将参数写⼊对应的config⽂件。 在osdrv⽬录下的Makefile中会执⾏此脚本,如下: 编译uboot时执⾏./osdrv_mem_脚本
⼆、在加载驱动时指定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_ 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 load13 insmod hi_ anony=1 mmz_allocator=hisi mmz=anonymous,0,$mmz_start,$mmz_size || report_error15 insmod hi3559av100_17 ......海思默认的...#DDR start:0x40000000, DSP(64M); kernel start:0x44000000, OS(512M); MMZ start:0x64000000mmz_start=0x64000000; # mmz start addrmmz_size=3520M; # 3520M, 烧录进⼊,启动开发板,第⼀次从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,查看参数,修改参数,最后savenv保存注意,bootargs每次save后都会写到emmc⾥⾯,以后每次启动就会从emmc⾥⾯读取配置信息,⽐如去哪⾥加载内核和⽂件系统,如果内核的参数或⽂件系统没有配置对,就会导致kernel panic, 挂载不上⽂件系统,所以⼀定要检查好配置参数。每次对bootargs修改后都要保存到emmc中,内核的实际⼤⼩⼀定要和config⽂件⾥写的要匹配。
注意:烧写uboot时,⼀定⼀定要烧写与板⼦ddr参数匹配的uboot,因为第⼀次烧写不匹配的后是可以烧进去,但是同时会将ddr的参数重写会导致以后重启或再次烧写时,系统不知道去哪⾥运⾏程序,⼀直⽆法烧写,卡死在system startup
⼀旦出现这种情况,可以通过海思官⽅提供的HiTools来进⾏串⼝或⽹⼝烧写。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690228504a317998.html
评论列表(0条)