一、组网过程
大概流程:
1.关闭防火墙,设置以太网卡(百兆全双工)
2.ubuntu下设置桥接模式,更改静态IP(ifconfig)
1>编辑----->虚拟网络编辑器----->桥接模式----->选择网卡
2>虚拟机----->设置----->网络适配器2----->桥接模式
IP地址----->192.168.8.188
子网掩码----->255.255.255.0
网关----->192.168.8.1
DNS----->8.8.8.8
3.开发板网络配置
1>setenv serverip 192.168.8.188 ----->设置服务器ip地址
2>setenv ipaddr 192.168.1.100 ----->设置服务器开发板地址
3>setenv netmask 255.255.255.0 ----->设置开发板子网掩码
4>setenv gatewayip 192.168.1.1 ----->设置开发板网关
5>saveenv -----> 保存
4.测试ping
pint 192.168.8.88
5.测试tftp命令
1>拷贝bin文件到tftpboot目录下,asm-led.bin
2>tftp 0xc0008000 asm-led.bin
3>在串口工具输入go运行 go 0xc0008000
如何设置bootcmd命令,倒计时进入0之前,可以自动执行tftp命令
setenv bootcmd tftp 0xc0008000 asm-led.bin\;go 0xc0008000
saveenv
二、uboot源码获取
1.uboot官网获取:
ftp://ftp.denx.de/pub/u-boot/ 前提是是芯片厂家将uboot源码开源到uboot官网上
2.ST开发社区获取: https://wiki.stmicroelectronics.cn/stm32mpu/wiki/STM32MP1_Developer_Package
3.ST官网:
https://www.st.com/en/embedded-software/stm32mp1dev.html
4.开发板厂家:直接找对应的开发板厂家进行获取,一定有支持开发板的相关镜像文件
5.项目经理:一定有支持开发板的相关镜像文件
三、uboot源码移植准备过程
大概流程
1.将Uboot源码拷贝到Ubuntu下,在家目录下创建demo目录,将源码文件解压
2.在家目录下创建一个文件夹FSMP1A,将文件拷贝到FSMP1A目录下
3.进入目录,对压缩文件解压
4.进入uboot源码目录下,对uboot源码进行解析
5.因为uboot源码使用Makefile进行编译的,所以需要查看make相关帮助命令
6.分析README文件
7.总结:
通过README文件分析可知,配置板子的默认缺省命令是:make <board_name>_defconfig
详细流程
1.在家目录下创建一个文件夹FSMP1A
2.将u-boot-stm32mp-v2020.10-stm32mp-r2-r0拷贝到FSMP1A目录下
cp u-boot-stm32mp-v2020.10-stm32mp-r2-r0/ ~/FSMP1A/ -rf
3.进入到~/FSMP1A/u-boot-stm32mp-v2020.10-stm32mp-r2-r0目录
4.对u-boot-stm32mp-v2020.10-stm32mp-r2-r0.tar.gz目录进行解压
tar -vxf u-boot-stm32mp-v2020.10-stm32mp-r2-r0.tar.gz
5.进入uboot源码目录下,对uboot源码进行解析
1>平台相关
arch:存放平台相关架构内容
board:存放各个板子相关文件
2>平台无关
Makefile:工程管理文件
configs:配置相关文件
drivers:存放驱动相关内容
README:帮助文档
6.因为uboot源码使用Makefile进行编译的,所以需要查看make相关帮助命令信息 ----->make help
1>清除中间文件 -----> make distclean
Cleaning targets:
clean - Remove most generated files but keep the config
mrproper - Remove all generated files + config + various backup files
distclean - mrproper + remove editor backup and patch files
2>基于图形化界面配置 -----> make menuconfig
menuconfig - Update current config utilising a menu based program
3>编译uboot源码 -----> make all
all - Build all necessary images depending on configuration
7.分析README文件
195 For all supported boards there are ready-to-use default
196 configurations available; just type "make <board_name>_defconfig".
197
198 Example: For a TQM823L module type:
199
200 cd u-boot
201 make TQM823L_defconfig
8.总结
通过README文件分析可知,配置板子的默认缺省命令是:make <board_name>_defconfig
问题:如何确定本次移植FSMP1A开发板<board_name>是什么?
四、如何确定<board_name>名字
4.1大概流程:
方法1:
1>在uboot源码顶层目录下执行:make fsmpla_defconfig
2>在uboot源码顶层目录下,进入configs目录,查看配置文件:ls stm32mp*
方法2:
1>因为uboot源码使用makefile进行管理编译,所以在makefile文件中可以找到 make<board_name>_defconfig对应的目标信息
1>在uboot源码顶层目录下,打开Makefile文件,搜索:config
2>在uboot源码顶层目录下,打开Makefile文件,搜索:config,使用echo将变量信息进行打印
3>在uboot源码顶层目录下执行: make fsmp1a_defconfig
4>总结:通过以上命令打印可知$(Q)取消回显,所以将$(Q)去掉,在次执行 make fsmp1a_defconfig
查看打印信息:
make -f ./scripts/Makefile.build obj=scripts/kconfig fsmp1a_defconfig = make obj=scripts/kconfig fsmp1a_defconfig
方法3:通过方法2分析可知,到指定scripts/kconfig目录下,打开Makefile文件,搜索目标:defconfig
1>在scripts/kconfig目录下,打开Makefile文件,搜索目标:defconfig
2>在scripts/kconfig目录下,打开Makefile文件,搜索目标:defconfig,使用echo命令,对变量信息进行打印
3>在uboot源码顶层目录下执行: make fsmp1a_defconfig,会出现如下打印信息
4>总结:通过以上命令打印可知$(Q)取消回显,所以将$(Q)去掉,在次执行 make fsmp1a_defconfig
查看打印信息:scripts/kconfig/conf --defconfig=arch/../configs/fsmp1a_defconfig Kconfig
4.总结:make <board_name>_defconfig执行过程
conf是一个可执行文件,--defconfig=arch/../configs/fsmp1a_defconfig和Kconfig作为参数传递给conf
4.2具体步骤:
1.方法1:如何确定<board_name>名字
1>在uboot源码顶层目录下执行: make fsmp1a_defconfig
2>在源码目录下出现如下错误信息:
*** Can't find default configuration "arch/../configs/fsmp1a_defconfig"!
通过阅读可知:在arch/../configs/fsmp1a_defconfig不能找到默认的配置文件
3>进入uboot源码顶层目录下,进入configs目录,查看配置文件: ls stm32mp*
stm32mp15_basic_defconfig : 非安全默认配置文件
stm32mp15_trusted_defconfig :安全默认配置文件
2.方法2:因为uboot源码使用makefile进行管理编译,所以在makefile文件中可以找到make <board_name>_defconfig对应的目标信息:
1>在uboot源码顶层目录下,打开Makefile文件,搜索:config
564 %config: scripts_basic outputmakefile FORCE
565 $(Q)$(MAKE) $(build)=scripts/kconfig $@
2>在uboot源码顶层目录下,打开Makefile文件,搜索:config,使用echo将变量信息进行打印
564 %config: scripts_basic outputmakefile FORCE
565 @echo $(Q)
566 @echo $(MAKE)
567 @echo $(build)
568 @echo $@
569 $(Q)$(MAKE) $(build)=scripts/kconfig $@
3>在uboot源码顶层目录下执行: make fsmp1a_defconfig,会出现如下打印信息
@
make
-f ./scripts/Makefile.build obj
fsmp1a_defconfig
4>总结:通过以上命令打印可知$(Q)取消回显,所以将$(Q)去掉,在次执行 make fsmp1a_defconfig,查看打印信息
make -f ./scripts/Makefile.build obj=scripts/kconfig fsmp1a_defconfig = make obj=scripts/kconfig fsmp1a_defconfig
3.方式3:通过方法2分析可知,到指定scripts/kconfig目录下,打开Makefile文件,搜索目标:defconfig
1>在scripts/kconfig目录下,打开Makefile文件,搜索目标:defconfig
109 %_defconfig: $(obj)/conf
110 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
2>在scripts/kconfig目录下,打开Makefile文件,搜索目标:defconfig,使用echo命令,对变量信息进行打印
109 %_defconfig: $(obj)/conf
110 @echo $(Q)
111 @echo $(silent)
112 @echo $(SRCARCH)
113 @echo $@
114 @echo $(Kconfig)
115 $(Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
3>在uboot源码顶层目录下执行: make fsmp1a_defconfig,会出现如下打印信息
@
..
fsmp1a_defconfig
Kconfig
4>总结:通过以上命令打印可知$(Q)取消回显,所以将$(Q)去掉,在次执行 make fsmp1a_defconfig,查看打印信息
scripts/kconfig/conf --defconfig=arch/../configs/fsmp1a_defconfig Kconfig
4.总结:make <board_name>_defconfig执行过程
scripts/kconfig/conf:通过file命令进行查看,可知是一个elf可执行文件
--defconfig=arch/../configs/fsmp1a_defconfig:板子目标文件
Kconfig:uboot源码目录下配置文件
通过以上分析可知:conf是一个可执行文件,--defconfig=arch/../configs/fsmp1a_defconfig和Kconfig作为参数传递给conf
五、basic版本启动流程
流程 作用 BL0 芯片厂家出厂时,固化到芯片内部的一段代码 BL1 FSBL(u-boot-spl.stm32) BL2 SSBL(u-boot.img)
六、uboot源码配置和编译流程
6.1大概流程:
1.进入uboot源码顶层目录下,配置交叉编译工具链,打开Makefile文件,搜索CROSS_COMOILE
CROSS_COMOILE:指定交叉编译工具链前缀
2.在uboot源码顶层目录下配置支持fsmpla开发板,非安全版本默认配置文件
make stm32mp15_basic_defconfig
3.在uboot源码顶层目录下执行基于图形化界面配置信息
make menuconfig
需要安装库 :sudo apt-get install ncurses-dev
4.设备数相关文件(驱动细讲)
5.在uboot源码顶层目录下,进入arch/arm/dts目录下,查看DK1公板相关设备树内容
复制文件,改名为FSMP1A
更改打印信息
打开Makefile添加FSMP1A平台设备树内容
6.对uboot源码进行编译:time make -j4 all
6.2详细流程:
1.进入uboot源码顶层目录下
2.配置交叉编译工具链,打开uboot源码顶层目录下Makefile文件,搜索:CROSS_COMPILE
将以下内容更改为:
262 ifeq ($(HOSTARCH),$(ARCH))
263 CROSS_COMPILE ?=
更改为:
262 ifeq (arm,arm)
263 CROSS_COMPILE ?=arm-linux-gnueabihf-
3. 在uboot源码顶层目录下配置支持fsmp1a开发板,非安全版本默认配置文件
make stm32mp15_basic_defconfig
成功现象:
#
# configuration written to .config
#
4.在uboot源码顶层目录下执行基于图形化界面配置信息
make menuconfig
5.设备树相关文件
dts--------->设备树源文件(相当于C语言中.c文件)
dtsi--------->设备树头文件(相当于C语言中.h文件)
DTC--------->设备树编译工具(相当于C语言中gcc编译器)
dtb--------->生成设备树可执行文件
格式:
/{
{
节点相关信息;
};
};
6.在uboot源码顶层目录下,进入arch/arm/dts目录下,查看DK1公板相关设备树内容
1>进入arch/arm/dts目录下,通过命令查看:ls stm32*
stm32mp157a-dk1.dts
stm32mp157a-dk1-u-boot.dtsi
stm32mp15xx-dkx.dtsi
2>进入arch/arm/dts目录下,将DK1公板设备树内容复制一份为FSMP1A平台相关内容
cp stm32mp157a-dk1.dts stm32mp157a-fsmp1a.dts
cp stm32mp157a-dk1-u-boot.dtsi stm32mp157a-fsmp1a-u-boot.dtsi
cp stm32mp15xx-dkx.dtsi stm32mp15xx-fsmp1x.dtsi
3>进入arch/arm/dts目录下,打开设备树stm32mp157a-fsmp1a.dts,需要更改以下内容
12 #include "stm32mp15xx-dkx.dtsi"
13
14 / {
15 model = "STMicroelectronics STM32MP157A-DK1 Discovery Board";
16 compatible = "st,stm32mp157a-dk1", "st,stm32mp157";
更改为
12 #include "stm32mp15xx-fsmp1x.dtsi"
13
14 / {
15 model = "HQYJ STM32MP157A-FSMP1A Discovery Board";
16 compatible = "hqyj,stm32mp157a-fsmp1a", "st,stm32mp157";
4>进入arch/arm/dts目录下,打开Makefile文件,添加FSMP1A平台设备树内容
945 dtb-$(CONFIG_STM32MP15x) += \
946 stm32mp157a-dk1.dtb \
947 stm32mp157a-fsmp1a.dtb \ ------>这一行为需要添加的内容
7.对uboot源码进行编译
time make -j4 all
8.成功现象
u-boot-spl.stm32
u-boot.img
七、制作启动盘
7.1制作:
1.插卡,连接到虚拟机
2.查看TF卡分区 ls /dev/sd*
3.删除原有分区 sudo parted -s /dev/sdb mklabel msdos
4.对TF进行重新分区
sudo sgdisk --resize-table=128 -a 1 -n 1:34:545 -c 1:fsbl1 -n 2:546:1057 -c 2:fsbl2 -n 3:1058:5153 -c 3:ssbl -n 4:5154:136225 -c 4:bootfs -n 5:136226 -c 5:rootfs -A 4:set:2 -p /dev/sdb -g
5.查看分区是否成功 ls /dev/sd*
6.将uboot镜像文件烧写到对应的分区中
7.2步骤:
1.将TF卡插入到读卡器中,并将读卡器插入到电脑USB口,需要连接到虚拟机
2.查看TF卡分区
linux@ubuntu:~/FSMP1A/u-boot-stm32mp-v2020.10-stm32mp-r2-r0/u-boot-stm32mp-v2020.10-stm32mp-r2$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5
3.首先删除原有分区
sudo parted -s /dev/sdb mklabel msdos
成功现象:
linux@ubuntu:~/FSMP1A/u-boot-stm32mp-v2020.10-stm32mp-r2-r0/u-boot-stm32mp-v2020.10-stm32mp-r2$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb
4.对 tf 进行重新分区,需要注意查看打印信息是否分区成功
sudo sgdisk --resize-table=128 -a 1 -n 1:34:545 -c 1:fsbl1 -n 2:546:1057 -c
2:fsbl2 -n 3:1058:5153
-c 3:ssbl -n 4:5154:136225 -c 4:bootfs -n 5:136226 -c 5:rootfs -A 4:set:2 -p
/dev/sdb -g
解释:
sgdisk:分区
--resize-table=128 -a 1:对齐
-n:创建一个新的分区
1:第一个分区
34:起始块号
545:终止块号
-c 1:fsbl1:分区名字
-A 4:set:2:设置分区表属性
-p
/dev/sdb -g:打印分区表
5.查看分区是否成功,ls /dev/sd*
linux@ubuntu:~/FSMP1A/u-boot-stm32mp-v2020.10-stm32mp-r2-r0/u-boot-stm32mp-v2020.10-stm32mp-r2$ ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5
6.将uboot镜像文件烧写到对应的分区中
linux@ubuntu:$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
linux@ubuntu:$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
linux@ubuntu:$ sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync
解释:
dd:拷贝文件命令
if:input file 输入文件名字
of: output file 输出文件名字
conv=fdatasync:以物理方式写入
dd if=u-boot-spl.stm32 of=/dev/sdb1 conv=fdatasync
linux@ubuntu:$ sudo dd if=u-boot-spl.stm32 of=/dev/sdb2 conv=fdatasync
linux@ubuntu:$ sudo dd if=u-boot.img of=/dev/sdb3 conv=fdatasync
解释:
dd:拷贝文件命令
if:input file 输入文件名字
of: output file 输出文件名字
conv=fdatasync:以物理方式写入