最好还是认真了解linux系统移植的整个过程,否则,可能会让你误入歧途。
1、编译移植好的tf-a
1)、编译生成“tf-a-stm32mp157d-atk-trusted.stm32”
输入“cd /home/zgq/linux/atk-mp1/tfa/my-tfa/tf-a-stm32mp-2.2.r1/回车”,切换到“/home/zgq/linux/atk-mp1/tfa/my-tfa/tf-a-stm32mp-2.2.r1/”目录下;
输入“ls回车”,列出“/home/zgq/linux/atk-mp1/tfa/my-tfa/tf-a-stm32mp-2.2.r1/”目录下所有的文件和文件夹;
输入“make -f ../Makefile.sdk clean”,清除以前的编译;
输入“make -f ../Makefile.sdk all回车”, 执行编译, '-f'的意思是重新指定Makefile。
输入“cd /home/zgq/linux/atk-mp1/tfa/my-tfa/build/trusted/回车”
切换到“/home/zgq/linux/atk-mp1/tfa/my-tfa/build/trusted/”目录
输入“ls -l回车”
列出“/home/zgq/linux/atk-mp1/tfa/my-tfa/build/trusted/”目录下所有的文件和文件夹;发现生成新的“tf-a-stm32mp157d-atk-trusted.stm32”
注意:立即使用“FileZilla”将它下载到“windows”中。否则在编译生成“tf-a-stm32mp157d-atk-serialboot.stm32”时,生成的“tf-a-stm32mp157d-atk-trusted.stm32”会被清除了。
2)、编译生成“tf-a-stm32mp157d-atk-serialboot.stm32”
输入“cd /home/zgq/linux/atk-mp1/tfa/my-tfa/tf-a-stm32mp-2.2.r1/回车”,切换到“/home/zgq/linux/atk-mp1/tfa/my-tfa/tf-a-stm32mp-2.2.r1/”目录下;
输入“ls回车”,列出“/home/zgq/linux/atk-mp1/tfa/my-tfa/tf-a-stm32mp-2.2.r1/”目录下所有的文件和文件夹;
输入“make -f ../Makefile.sdk clean”,清除以前的编译;
输入“make -f ../Makefile.sdk TFA_DEVICETREE=stm32mp157d-atk TF_A_CONFIG=serialboot ELF_DEBUG_ENABLE='1' all”,
执行编译, '-f'的意思是重新指定Makefile。这句非常重要,单独编译生成“tf-a-stm32mp157d-atk-serialboot.stm32”,不能使用“make -f ../Makefile.sdk all回车”来编译,否则在烧录程序时串口会报“Boot interface 6 not supported”问题。
输入“cd /home/zgq/linux/atk-mp1/tfa/my-tfa/build/serialboot/回车”
切换“/home/zgq/linux/atk-mp1/tfa/my-tfa/build/serialboot/”目录下
输入“ls –l tf-a-stm32mp157d-atk-serialboot*回车”,列出当前目录下所有以“tf-a-stm32mp157d-atk-serialboot”开头的的文件和文件夹。发现生成了新的“tf-a-stm32mp157d-atk-serialboot.stm32”
注意:立即使用“FileZilla”将它下载到“windows”中。
至此,我们完成了tf-a的编译。
2、编译移植好的u-boot
1)、输入“cd /home/zgq/linux/atk-mp1/uboot/my_uboot/回车”,切换到“/home/zgq/linux/atk-mp1/uboot/my_uboot/”目录下
输入“ls回车”,查看“/home/zgq/linux/atk-mp1/uboot/my_uboot/”目录下的所有文件和文件夹
2)、输入“vi stm32mp157d_alientek.sh回车”
打开脚本文件“stm32mp157d_alientek.sh”内容如下:
#!/bin/bash
make stm32mp15_atk_trusted_defconfig
#使用stm32mp15_atk_trusted_defconfig覆盖“.config”
make DEVICE_TREE=stm32mp157d-atk all -j8
3)、按“ESC键”,输入“:q!”不保存退出
4)、输入“make distclean”,手动清理工程;
5)、输入“./stm32mp157d_alientek.sh”,记住“make menuconfig”
6)、输入“ls -l u-boot.stm32回车”,查看“u-boot.stm32”文件,发现生成了新的“u-boot.stm32”
7)、使用“FileZilla”将它下载到“windows”中。
至此,我们完成了u-boot的编译。
3、编译移植好的linux系统
1)、输入“cd /home/zgq/linux/atk-mp1/linux/linux-5.4.31/回车”,切换到“/home/zgq/linux/atk-mp1/linux/linux-5.4.31/”目录下
2)、输入“ls回车”,查看“/home/zgq/linux/atk-mp1/linux/linux-5.4.31/”目录下的所有文件和文件夹
记住:“stm32mp1_atk_defconfig”位于“/home/zgq/linux/atk-mp1/linux/linux-5.4.31/arch/arm/configs”;
记住:“make menuconfig”用于打开linux内核图形化配置界面;
3)、输入“vi stm32mp157d_alientek.sh回车”
打开脚本文件“stm32mp157d_alientek.sh”内容如下:
#!/bin/sh
make distclean #清理工程
make stm32mp1_atk_defconfig
#使用”stm32mp1_atk_defconfig”覆盖“.config”
make menuconfig
#打开linux内核图形化配置界面,若不用修改,则两次“ESC键
make uImage dtbs LOADADDR=0XC2000040 -j8
#指定编译“Image”和“dtbs”,并指定装载的起始地址为0XC2000040,j8表示指定采用8线程执行。
4)、按“ESC键”,输入“:q!”不保存退出
5)、输入“./stm32mp157d_atk.sh回车”,执行脚本编译
6)、弹出“图形化配置界面”再按两次“ESC键”
7)、等待编译完成
8)、输入“ls arch/arm/boot/uImage -l”
查看是否生成了新的“uImage”文件
9)、输入“ls arch/arm/boot/dts/stm32mp157d-atk.dtb -l”
查看是否生成了新的“stm32mp157d-atk.dtb”文件
拷贝输出的文件:
10)、输入“cp arch/arm/boot/uImage /home/zgq/linux/atk-mp1/linux/bootfs/ -f回车”,执行文件拷贝,准备烧录到EMMC;
11)、输入“cp arch/arm/boot/dts/stm32mp157d-atk.dtb /home/zgq/linux/atk-mp1/linux/bootfs/ -f回车”,执行文件拷贝,准备烧录到EMMC
12)、输入“cp arch/arm/boot/uImage /home/zgq/linux/tftpboot/ -f回车”,执行文件拷贝,准备从tftp下载;
13)、输入“cp arch/arm/boot/dts/stm32mp157d-atk.dtb /home/zgq/linux/tftpboot/ -f回车”,执行文件拷贝,准备从tftp下载;
14)、输入“cd /home/zgq/linux/atk-mp1/linux/bootfs/”
切换到“/home/zgq/linux/atk-mp1/linux/bootfs/”目录
输入“ls -l回车”,查看“/home/zgq/linux/atk-mp1/linux/bootfs/”目录下的所有文件和文件夹
15)、输入“cd /home/zgq/linux/tftpboot/回车”
切换到“/home/zgq/linux/tftpboot/”目录
输入“ls -l回车”,查看“/home/zgq/linux/tftpboot/”目录下的所有文件和文件夹
输入“chmod 777 stm32mp157d-atk.dtb回车”
给“stm32mp157d-atk.dtb”文件赋予可执行权限
输入“chmod 777 uImage回车” ,给“uImage”文件赋予可执行权限
输入“ls回车”,查看“/home/zgq/linux/tftpboot/”目录下的所有文件和文件夹
16)、生成能烧录到EMMC的“bootfs.ext4”文件
输入“cd /home/zgq/linux/atk-mp1/linux/bootfs/回车”,切换到“/home/zgq/linux/atk-mp1/linux/bootfs/”目录
输入“ls -l回车”,列出“bootfs”目录下的文件和文件夹
如果发现“bootfs.ext4”,则输入“rm bootfs.ext4”删除“bootfs.ext4”
输入“du -h”查询容量,发现容量为7.1M
输入“dd if=/dev/zero of=bootfs.ext4 bs=1M count=10回车”
输入“mkfs.ext4 -L bootfs bootfs.ext4回车”
使用“mkfs.ext4”将“bootfs.ext4磁盘”格式化为“ext4”格式。
输入“ls -l回车”,列出“/home/zgq/linux/atk-mp1/linux/bootfs/”目录下的文件和文件夹
输入“sudo mount bootfs.ext4 /mnt/bootfs/回车”,
使用“mount命令”将“bootfs.ext4”磁盘挂载到“/mnt/bootfs”目录下;
输入“sudo cp uImage stm32mp157d-atk.dtb /mnt/bootfs/回车”
将“uImage”和“stm32mp157d-atk.dtb”拷贝到“/mnt/bootfs/”目录中;
输入“sudo umount /mnt/bootfs/回车”,使用“umount”卸载掉“bootfs”
输入“ls -l回车”,列出“/linux/atk-mp1/linux/bootfs”目录下的文件和文件夹
17)、烧录文件:
将“/linux/atk-mp1/linux/bootfs/bootfs.ext4”下载到“windows”中。
将“tf-a-stm32mp157d-atk-trusted.stm32,tf-a-stm32mp157d-atk-serialboot.stm32,u-boot.stm32和bootfs.ext4”烧录到开发板。
18)、设置从EMMC启动linux系统
输入setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
输入setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
输入saveenv,保存“bootcmd和bootargs”的值
输入boot,启动 Linux 系统
19)、设置从网络启动linux系统
设置“bootcmd和bootargs”这两个环境变量,从网络启动linux系统
输入setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000',设置从网络启动linux系统
输入“setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.2.180:/home/zgq/linux/nfs/rootfs,proto=tcp rw ip=192.168.2.178:192.168.2.180:192.168.2.1:255.255.255.0::eth0:off'
回车”
输入: saveenv,保存bootcmd的值
输入: boot,启动 Linux 系统
至此,我们完成了linux内核的编译和烧录。
4、编译移植好的buildroot,构建根文件系统
1)、输入“cd /home/zgq/linux/buildroot/buildroot-2020.02.6/回车”
切换到“/home/zgq/linux/buildroot/buildroot-2020.02.6/”目录下
2)、输入“ls回车”
查看“/home/zgq/linux/buildroot/buildroot-2020.02.6/”目录下的所有文件和文件夹
记住:“stm32mp1_atk_defconfig”位于“/home/zgq/linux/buildroot/buildroot-2020.02.6/configs”目录中;
记住:“make menuconfig”用于打开“buildroot”的图形化配置界面;
记住:“make busybox-menuconfig”用于打开“buildroot中的busybox”的图形化配置界面;
记住:“make stm32mp1_atk_defconfig”用于使用“make stm32mp1_atk_defconfig”覆盖“.config”;
3)、输入“make show-targets回车”查看buildroot配置的目标软件包
4)、输入“make busybox回车”单独编译“busybox”
5)、输入“make回车”执行编译“buildroot”
6)、挂载磁盘,拷贝文件,卸载磁盘,生成可供nfs下载的根文件系统
执行“cd /home/zgq/linux/nfs/rootfs”切换目录
执行“sudo rm * -rf”删除“/home/zgq/linux/nfs/rootfs”目录下的所有文件;
执行“cd /home/zgq/linux/buildroot/buildroot-2020.02.6/output/images”切换目录;
执行“cp rootfs.tar /home/zgq/linux/nfs/rootfs”拷贝“rootfs.tar”
执行“cd /home/zgq/linux/nfs/rootfs”切换目录
执行“tar -vxf rootfs.tar”解压“/home/zgq/linux/nfs/rootfs/rootfs.tar”
执行“rm rootfs.tar”删除“/home/zgq/linux/nfs/rootfs/rootfs.tar”
输入“ls -l”查看“/home/zgq/linux/nfs/rootfs/”目录,这就是由buildroot生成的可供nfs下载的根文件系统。
6)、生成能烧录到EMMC的“rootfs.ext4”文件
执行“cd /home/zgq/linux/rootfs/”进行目录切换
输入“du -h /home/zgq/linux/nfs/rootfs/”
查看“/home/zgq/linux/nfs/rootfs/”目录的总容,因为下面创建“rootfs.ext4”要用到;
执行“dd if=/dev/zero of=rootfs.ext4 bs=1M count=1024”创建“rootfs.ext4”并分配1G个字节空间
执行“mkfs.ext4 -L rootfs rootfs.ext4”格式化“rootfs.ext4”并将卷标设置为“rootfs”
执行“sudo mount rootfs.ext4 /mnt/rootfs/”将“rootfs.ext4”挂载到“/mnt/rootfs/”目录下
执行“cd /home/zgq/linux/nfs/rootfs/”进行目录切换
执行“sudo cp * /mnt/rootfs/ -drf”将“/home/zgq/linux/nfs/rootfs/”目录下的所有文件拷贝到“/mnt/rootfs/”
执行“cd /home/zgq/linux/rootfs/”进行目录切换
执行“sudo umount /mnt/rootfs”卸载掉“/mnt/rootfs”目录下的所有文件
输入“ls -l”查看“/home/zgq/linux/rootfs”目录下是否生成新的“rootfs.ext4”,这个就是要烧录到EMMC中的文件
7)、烧录文件:
将“/home/zgq/linux/rootfs/rootfs.ext4”下载到“windows”中。
将“tf-a-stm32mp157d-atk-trusted.stm32,tf-a-stm32mp157d-atk-serialboot.stm32,u-boot.stm32,bootfs.ext4和rootfs.ext4”烧录到开发板。
8)、设置从EMMC启动linux系统
输入setenv bootcmd 'ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
输入setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
输入saveenv,保存“bootcmd和bootargs”的值
输入boot,启动 Linux 系统
9)、设置从网络启动linux系统
设置“bootcmd和bootargs”这两个环境变量,从网络启动linux系统
输入setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000',设置从网络启动linux系统
输入“setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.2.180:/home/zgq/linux/nfs/rootfs,proto=tcp rw ip=192.168.2.178:192.168.2.180:192.168.2.1:255.255.255.0::eth0:off'
回车”
输入: saveenv,保存bootcmd的值
输入: boot,启动 Linux 系统
至此,我们完成了使用“buildroot”构建根文件系统的编译和烧录。
由于使用busybox构建根文件系统很麻烦,就不加以总结了。在以后的开发中,我们主要使用buildroot来构建根文件系统。
这是一个非常完美的总结,只有真正参与整个系统移植,才能得到这个结论。每种开饭板的目录可能不一样,但大概流程是这样的。希望最好能参与移植,才能懂得其中的奥秘。