stm32mp157c-dk2u-boot启动与制作
⼀.uboot描述
1)⽀持外设
/MMCcontroller(SDMMC)
ntroller(FMC)
troller(QSPI)
troller(OTGDWC2)
2)⽀持驱动
1.I2C
1(PMICandregulator)
,Ret,Sysret
⼆.启动列表
BootRom=>FSBLinSYSRAM=>SSBLinDDR=>OS(LinuxKernel)
FSBL=第⼀阶段Bootloader
SSBL=第⼆阶段Bootloader
1)boot设置
a.安全模式启动
在这种模式配置下,U-Boot和安全固件相关联(TF-A)⽽且仅仅U-Boot镜像作为第⼆阶段的bootloader(SSBL)。TF-A⼆进制⽂件
(tf-a-*.stm32)必须被拷贝到名为“fsbl1”的指定分区。U-boot⼆进制⽂件(u-boot*.stm32)必须被拷贝到名为“ssbl”的指定分区
安全启动模式:U-Boot".stm32"的⼆进制扩展⽂件是SSBL,FSBL有TF-A提供
配置⽂件:defconfig_file:stm32mp15_trusted_defconfig
上电启动:BootRom加载启动第⼀启动⽂件=>FSBL=TrustedFirmware-A(TF-A)第⼀阶段启动⽂件;
接着加载启动第⼆阶段启动⽂件=>SSBL=U-Boot第⼆阶段⽂件uboot。
TF-A提供安全外设的全部初始化(如时钟初始化,即使第⼆阶段也有时钟初始化,但是还是以FSBL初始化为主),并且建⽴安全监
控,uboot运⾏在正常模式,并且在TF-A安全监控模式下访问安全资源
b.⼀般模式启动
编译uboot提供给两个启动阶段所需要的⼆进制⽂件:⼀般启动模式:U-BootSPL为第⼀阶段启动⽂件(FSBL,.stm32格式),即U-
BootSPL(32-*)需要拷贝到名字为“fsbl1”的指定分区。U-Bootimgage为第⼆阶段启动⽂件(SSBL,U-Boot
imgage),即U-Boot镜像(u-boot*.img)必须拷贝到名为“ssbl”的指定分区。
⼀般模式启动:在这个设置中,我们⽤U-BootSPL作为第⼀阶段的加载启动(FSBL),⽤U-Boot镜像作为第⼆阶段的加载启动(SSBL).
配置⽂件:defconfig_file:stm32mp15_basic_defconfig
上电启动:BootRom加载启动第启动⽂件=>FSBL=32-*第⼀阶段启动⽂件ubootSPL
接着启动第⼆启动项⽂件=>SSBL=u-boot*.img第⼆阶段启动⽂件
SPL禁⽌安全模式初始化,uboot运⾏在安全模式,仅仅通过PSCI(arm定义的电源状态协调接⼝)⽀持给内核提供安全监控
uboot⽀持所有的STM32MP1板⼦,可以⽀持引导所有stm32mp1⼀般的的板⼦。
每个板⼦仅仅通过设备树进⾏配置:
ev1:evalboardwithpmicstpmic1(ev1=motherboard+daughtered1)
dts:stm32mp157c-ev1
+ed1:daughterboardwithpmicstpmic1
dts:stm32mp157c-ed1
+dk1:Discoveryboard
dts:stm32mp157a-dk1
+dk2:Discoveryboard=dk1withaBT/WiFIcomboandaDSIpanel
dts:stm32mp157c-dk2
三.uboot编译步骤
==================
1).安装U-BootMakefile所需要的⼯具
(libssl-dev,swig,libpython-dev...)
安装ARMv7的32位⼯具链+installARMv7toolchainfor32bitCortex-A(Linaro,
SDKforSTM32MP1,或者从你的配置安装⼀些交叉⼯具链)
2).设置编译器,这个也可以就⾏系统设置/etc/⾥⾯长期设置:
#exportCROSS_COMPILE=/path/to/toolchain/arm-linux-gnueabi-
编译器已经安装,我电脑执⾏:source/home/my-linux/STM32MPU_workspace/STM32MP15-Ecosystem-
v1.1.0/Developer-Package/SDK/environment-tup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-linux-gnueabi
3).选择编译输出⽂件⽬录
#exportKBUILD_OUTPUT=/path/to/output
例如:给每⼀种模式配置新建⼀个输出⽬录
#exportKBUILD_OUTPUT=../build/stm32mp15_trusted
#exportKBUILD_OUTPUT=../build/stm32mp15_basic
4).配置U-Boot:
#make
-对于安全可靠模式defconfig_file:"stm32mp15_trusted_defconfig"
-对于⼀般模式defconfig_file:"stm32mp15_basic_defconfig"
5).配置设备树和编译U-Bootimage:
#makeDEVICE_TREE=
例如:
a)安全模式ev1板⼦
#exportKBUILD_OUTPUT=stm32mp15_trusted
#makestm32mp15_trusted_defconfig
#makeDEVICE_TREE=stm32mp157c-ev1all
b)⼀般模式dk2板⼦
#exportKBUILD_OUTPUT=stm32mp15_basic
#makestm32mp15_basic_defconfig
#makeDEVICE_TREE=stm32mp157c-dk2all
四.输出⽂件
BootRom和TF-A所需要的STM32镜像头⽂件的⼆进制⽂件
SPL所需要的U-BootuImage头部⽂件
在输出⽬录(KBUILD_OUTPUT),
可以找到所需要的⽂件:
a)在安全模式下
+FSBL=32(TF-A源码编译提供)
+SSBL=32(uboot编译得到)
b)⼀般模式下
+FSBL=spl/32(uboot⼀般模式编译得到)
+SSBL=(uboot⼀般模式编译得到)
五.制作microSD启动镜像
STM32启动最⼩需要的分区⽂件:
-GPT分区(⽤gdisk或者sgdisk)
-2个fsbl分区,名字fsbl1和fsbl2,⼤⼩⾄少是256KiB
-1个ssbl分区给U-Boot
然后最⼩GPT分区是:
------------------------------------
|数量|名字|⼤⼩|内容|
------------------------------------
|1|fsbl1|256KiB|TF-AorSPL|
|2|fsbl2|256KiB|TF-AorSPL|
|3|ssbl|enought|U-Boot|
|*|-|-|Boot/Rootfs|
------------------------------------
在添加引导分区/uboot/include/config_distro_bootcmd.h配置着启动参数,u-boot-
2018.11/board/st/stm32mp1/README,有uboot制作sd启动详细描述
下⾯是基本的分配情况
(doc/foru)
根据⽤到的card选择设备
(/dev/sdxor/dev/mmcblk0)
我⽤/dev/mmcblk0作为例⼦
例如:withgpttablewith128entries
a)删掉先前的格式(制作启动盘需要管理模式)
#sgdisk-o/dev/
b)创建最新系统镜像
#sgdisk--resize-table=128-a1
-n1:34:545-c1:fsbl1
-n2:546:1057-c2:fsbl2
-n3:1058:5153-c3:ssbl
-p/dev/
例如制作步骤:
1)#sgdisk-o/dev/sdc删除分区,在管理模式下
2)root@vlinux:/dev#
sgdisk--resize-table=128-a1-n1:34:545-c1:fsbl1-p/dev/sdc
3)sgdisk--resize-table=128-a1-n2:546:1057-c2:fsbl2-p/dev/sdc
4)sgdisk--resize-table=128-a1-n3:1058:5153-c3:ssbl-p/dev/sdc
5)sgdisk--resize-table=128-a1-n4:5154:136225-c4:bootfs-p/dev/sdc
6)sgdisk--resize-table=128-a1-n5:136226:168993-c5:vendorfs-p/dev/sdc
7)sgdisk--resize-table=128-a1-n6:168994:1705857-c6:rootfs-p/dev/sdc
8)sgdisk--resize-table=128-a1-n7:1705858:15759324-c7:urfs-p/dev/sdc
分区完后,分别对4.5.6.7分区格式化成ext4格式
mkfs-text4/dev/sdc4
mkfs-text4/dev/sdc5
mkfs-text4/dev/sdc6
mkfs-text4/dev/sdc7
NumberStart(ctor)End(ctor)SizeCodeName
134545256.0KiB8300fsbl1
25461057256.0KiB8300fsbl2
3105851532.0MiB8300fsbl3
45.0MiB8300fsbl4
5316.0MiB8300fsbl5
657750.4MiB8300fsbl6
71746.7GiB8300fsbl7
Theoperationhascompletedsuccessfully.
pc挂载可⽤ls-l/dev/disk/by-partlabel/查看分区
也可以继续添加内核分区
例如rootfs分区:
-n3:5154:-c4:rootfs
c)拷贝FSBL(拷贝2次)和SSBL⽂件到指定的分区.
例如分区1to3
⼀般模式:
#ddif=32of=/dev/mmcblk0p1
#ddif=32of=/dev/mmcblk0p2
#ddif==/dev/mmcblk0p3
安全模式:
#ddif=32of=/dev/mmcblk0p1
#ddif=32of=/dev/mmcblk0p2
#ddif=32of=/dev/mmcblk0p3
SDCard启动,选择BootPinMode=111然后复位.
六.eMMC启动
===============
⽤U-Boot拷贝⼆进制⽂件到eMMC.
在接下来的例⼦中,你需要先从SDCARD启动,镜像⽂件(32,)是ext4格式
⽬前在SDCARD(mmc0)第四分区(bootfs)
SDCard启动,选择BootPinMode=111然后复位.
然后更新eMMC在接下来的U-Boot命令中:
a)在eMMC准备全局引导GPT,
例⼦中的2个分区,bootfs和roots:
#tenv
emmc_part"name=ssbl,size=2MiB;name=bootfs,type=linux,bootable,size=64MiB;name=rootfs,type=linux,size=512"
#gptwritemmc1${emmc_part}
b)复制SPL到eMMC的第⼀个启动分区
(SPL最⼤是256kB,withLBA512,0x200)
#ext4loadmmc0:32
#mmcdev1
#mmcpartconf1111
#mmcwrite${fileaddr}0200
#mmcpartconf1110
b)复制U-Boot在eMMC的第⼀个GPT分区
#ext4loadmmc0:
#mmcdev1
#partstartmmc11partstart
#partsizemmc11partsize
#mmcwrite${fileaddr}${partstart}${partsize}
从eMMC启动,选择BootPinMode=010然后复位重启.
七.MAC地址
Macid的存取和索引再stm32mpotp上:
-OTP_57[31:0]=MAC_ADDR[31:0]
-OTP_58[15:0]=MAC_ADDR[47:32]
编程⼀个MAC地址在上⾯原始的OTP上,可以在bank0上⽤fu命令
进⼊内部的OTP:
例如去设置MAC地址"12:34:56:78:9a:bc"
1)⾸先写OTP
STM32MP>fuprog-y0570x785634120x0000bc9a
2)然后读OTP
STM32MP>fun0572
bank0上显⽰:
Word0x00000039:785634120000bc9a
3)接着重新启动REBOOT:
###SettingenvironmentfromOTPMACaddress="12:34:56:78:9a:bc"
4)检查环境更新
STM32MP>printethaddr
ethaddr=12:34:56:78:9a:bc
⼋.协处理器固件
========================
U-Boot可以在内核之前启动协处理器(协处理器早期启动).
1)⽤rproc命令⼿动启动(更新bootcmd)
配置:
#envtname_copro"stm32mp15_"
#envtdev_copro0
#envtloadaddr_copro0xC1000000
在SDCard(mmc0)第四分区,从bootfs分区下载⼆进制⽂件
#ext4loadmmc0:4${loadaddr_copro}${name_copro}
=>${filesize}updatedwiththesizeoftheloadedfile
⽤远程proc命令启动M4固件
#rprocinit
#rprocload${dev_copro}${loadaddr_copro}${filesize}
#rprocload_rsc${dev_copro}${loadaddr_copro}${filesize}
#rprocstart${dev_copro}
2)⽤FIT特性和通⽤的DISTRObootcmd⾃动加载//AutomaticallybyusingFITfeatureandgenericDISTRObootcmd
看这个⽬录的例⼦:
⽣成FIT,包括kernel+devicetree+M4固件
⽤cfg⽤M4boot
$>mkimage-ffit_copro_kernel__copro_kernel_
然后⽤DISTRO配置⽂件:参考选择
正确的配置如下:
=>stm32mp157c-ev1-m4
=>stm32mp157c-dk2-m4
九.通过SDCARD更新uboot启动:
-----------------------
1)基本启动模式
需要更新的⽂件:*32-*
把⼆进制⽂件拷贝到指定分区,在SDCARD/USB闪存分区
"fsbl1"是分区1:
-SDCARD:/dev/mmcblkXp1(whereXistheinstancenumber)
-SDCARDviaUSBreader:/dev/sdX1(whereXistheinstancenumber)
ddif=
需要更新的⽂件*u-boot*.img
拷贝⼆进制⽂件到指定分区,在SDCARD/USB的闪存分区
"ssbl"是分区4:
-SDCARD:/dev/mmcblkXp3(x是分区的实例标号)
2)安全可靠启动模式
需要更新的⽂件:*tf-a-*.stm32
拷贝⼆进制到指定的分区,在SDCARD/USB闪存的分区
"fsbl1"是分区1:
-SDCARD:/dev/mmcblkXp1(是实际分区名字)
-SDCARDviaUSBreader:/dev/sdX1(x是实际分区的名字)
ddif=
需要更新的⼆进制⽂件:*u-boot*.stm32
拷贝⼆进制到指定的分区,在SDCARD/USB闪存的分区
"ssbl"是分区4:
-SDCARD:/dev/mmcblkXp3(是实际分区名字)
-SDCARDviaUSBreader:/dev/sdX3(是实际分区名字)
ddif=
本文发布于:2022-12-03 19:55:06,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/46374.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |