粗浅的研究了一下ST官方提供的利用Yocto工具建立的系统,个人感觉掌握起来有点复杂,而且编译过程真心的痛不欲生。我的机器内存2G根本编译不了,而且时间超级长,我的机器是个双核2G,内存4G,编译一次应该在10个小时以上,还不包括所需内容在网络获取的时间。我下载了第三方澎湃兔的系统,整整下载了1天,接近50G的资料。最重要的是,好不容易编译了一个出来,整个系统动不动就上G,对于一个工控产品这个也太大了。等我先哭一会。。。。。
于是,我决定不采用官方的系统,利用官方提供的uboot和linux
kernel看看可不可以有个第三方的工具可以建立一个简单点的系统。功夫不负有心人,我找到了一个老外搞得,采用buildroot工具建立的系统,感觉挺好,下面把我构建系统的过程和问题总结如下。
1. 下载buildroot
git clone git://git.buildroot.net/buildroot
git remote add tpetazzoni https://github.com/tpetazzoni/buildroot.gitgit fetch tpetazzonigit checkout -b stm32mp157-dk2 tpetazzoni/2019.02/stm32mp157-dk
下载的文件为:buildroot-stm32mp157-dk.zip
把这个文件复制到ubunt 16下面,然后解压。
解压缩命令:unzipbuildroot-stm32mp157-dk.zip3. 装载缺省配置文件
进入刚才解压的目录,目录名为buildroot-stm32mp157-dk#cdbuildroot-stm32mp157-kd#makestm32mp157_dk_defcofig4. 对当前的配置进行调整以适合我们的开发板
我们执行命令:# makemenuconfig这时候,我们可以看到打开了这个系统的配置界面。1、Target optionsTarget Architecture:ARM(little endian)Target BinaryFormat:ELFTarget ArchitectureVariant:cortex-A7Target ABI:EABIhfFloating pointstrategy:VFPv4-D16ARM instructionset:ARM 看一下就可以,不用调整。2、Build options其中的内容我们不用调整。3、Toolchain这里我进行了几项调整:Toolchain type:ExternaltoolchainToolchain:Arm ARM2018.11选中Copygdb server to the Target。将来远程调试应用程序的时候会用到。4、System configuration可以调整 System hostname ,这个默认为buildroot,你可以改成你喜欢的名字,将来系统中的hostname就是这个名字。提一下这个设置Root filesystem overlay direction。它指出了一个配置文件的位置,是uboot引导系统的一些命令,如果将来有需要的我们在调整。Extra argumentspassed:这个配置指向的文件将来是SD卡分区的配置文件,如果有需要将来我们在修改。.
5. 执行编译
执行命令开始编译:#make2>&1 | tee build.log接下来将是痛苦的开始,如果你耐心足够,下面你不用看了,如果你挺不住了,继续往下看吧。6. 下载必要的源码文件
其它的源码文件因为压缩包很小,基本都可以忍受,但是toolchain、uboot和linuxkernel的压缩包太大了,真心不能忍受。我们自己下载下来。前面提到的需要记住的名字起作用了:u-boot:v2018.11-stm32mp-r2.1下载地址:https://github.com/u-boot/u-boot克隆当前最新的u-boot需要修改压缩包的名字为uboot-v2018.11-stm32mp-r2.1.tar.gz目录:dl/ubootlinux kernel:linux-v4.19-stm32mp-r1.2.tar.gz下载地址:https://github.com/STmicroelectronics/linux/archive/v4.19-stm32mp-r1.2/linux-v4.19-stm32mp-r1.2.tar.gz目录:dl/linuxtoolchain:arm-2018.11下载地址:https://developer.arm.com/-/media/Files/downloads/gnu-a/8.2-2018.11/gcc-arm-8.2-2018.11-x86_64-arm-linux-gnueabihf.tar.xz
7. 输出文件
8. 烧录
采用如下命令烧录到sd卡中。sudo dd IF=output/images/sdcard.img of=/dev/sdb bs=1M conv=fdatasync status=progress
9. 从SD卡启动中遇到的问题
我遇到的问题:end Kernel panic - not syncing: VFS: Unable to mount root fs onunknown-block(179,4) SD卡烧录完成后,系统中查看每个分区都是正常的。Uboot可以正常启动,但是linux却无法挂载rootfs分区,并提示上面错误。 经过试验发现是rootfs的分区被破坏了,目前采用的修复方式是在Ubuntu下面重新格式化这个分区: #sudomkfs.ext4 /dev/sdb4格式化分区后,将rootfs下面的文件重新复制到SD的这个分区内,重现上电,问题解决了。目前还不是太清楚是不是生成的sdcard.img有问题。