简化不是简单,简化只是简化Linux系统的制作过程,制作的目标系统是产品级系统。
ST用yocto制作工具发布OpenSTLinux系统,这个系统在ST的wiki上有明确的制作过程。
使用yocto做系统是嵌入式应用里面比较流行也比较完备的制作方法,然而它有3个问题。第1个问题是yocto的复杂性。这个东西本身使用python脚本来控制制作过程,定制各种组件的编译条件,解决依赖等等。对于这种自成体系的东西,需要消耗大量精力对它的组成,语法,流程等熟悉之后才能取得比较理想的定制效果。第2个问题是recipes菜单管理的碎片化。它没有一个统一的中心仓库管理recipes,官方提供的仓库远远不能满足定制化需求,因此目前来说芯片厂自己提供很多菜单满足自己的需求。第3个问题最致命,基于众所周知的原因,我们通过网络获取外部资源总是无法访问或奇慢无比,甚至使用技术手段加持后还是无法满足网络资源的获取。
因此本人借评测STM32MP157A-DK1的机会给大家介绍一种简化的制作过程。
为什么要自己做一个。1:部分定制,2:过程简单,做系统10分钟,系统配置10分钟,下面看着图多,其实命令很少,主要是大家喜欢图,3:略过make源代码的制作速度快,主机空间占用小,4:包和源代码下载快,5:标准Debian系统,这点很重要,在开发阶段的排错和产品阶段的补丁都可以使用最新的社区成果。缺点:1:定制深度不及Yocto,2:系统空间占用比Yocto定制的系统大。
首先要说明的是OpenSTLinux是一个基于Debian的发行版,它包括Debian包管理工具apt-get,apt-cache等。OpenSTLinux的系统管理机制不再是传统的SysV的init的方式,而是使用的功能更强大的systemd管理系统,挂载系统等初始化行为由systemd接管。
也就是说,OpenSTLinux是一个定制化的Debian Embedded Linux System。这就有意思了,可以查看/etc/apt/sources.list.d/packages.openstlinux.st.com.list了解ST的包仓库。通过wiki这部分了解基本操作。忘掉ST提供的那个所谓SDK吧,有BUG不说真没什么用。
OpenSTLinux提供的原始镜像包里面包括:
u-boot-stm32mp157a-dk1-basic.img,u-boot-spl.stm32-stm32mp157a-dk1-basic
st-image-bootfs-openstlinux-weston-stm32mp1.ext4
st-image-weston-openstlinux-weston-stm32mp1.ext4
st-image-userfs-openstlinux-weston-stm32mp1.ext4
st-image-vendorfs-openstlinux-weston-stm32mp1.ext4
除了uboot是可执行的二进制文件之外,其余的都是ext4文件系统。通过主机的挂载工具可以直接查看、添加、删除,最主要是可以拷贝里面的东西出来。
拷贝是比较有用的,毕竟OpenSTLinux是一个深度定制的Linux发行版,有些文件是ST单独提供的,我们既然要简化偷懒,最好的办法莫过于拿来直接用,虽然这些文件大部分都是脚本。
bootfs就是把内核与dtb拷贝进去,我们不用再做一个bootfs,可以在make kernel之后把uImage和*.dtb拷贝过来,比如上一篇中的SPI操作我就是这样更新的镜像。
make ee_st_rootfs
make install qemu-user-static debootstrap
debootstrap --arch=armhf --foreign buster debian_st https://mirrors.tuna.tsinghua.edu.cn/debian/
debootstrap可以指定目标系统的规模:mini,还是base,还是其他。具体可以查看debootstrap手册,我这里省事用的base版。
这个过程大约4分钟,当然,这要依赖网络情况,清华的源还是蛮快的。
cp /usr/bin/qemu-arm-static debian_st/usr/bin/
chroot debian_st /usr/bin/qemu-arm-static /bin/sh -i
/debootstrap/debootstrap --second-stage
这一步是解包刚才debootstrap下载的安装包,大约6分钟,当然,这和你的机器性能有关。
最后,设置root密码,建立登录用户,设置默认输出控制台,这个基本系统就算是做完了,so easy。
rm -fr boot
passwd root
adduser ee
systemctl enable serial-getty@ttySTM0.service
这个系统简化是简化,然而这些包都是Debian的Production Release的包,用做服务器的Debian系统不要太多。
如果没有其他需求,可以直接往下一节,制作镜像和烧写。
进一步的,还可以设置本地化locales,安装一些软件包,例如我打算安装无线网卡,因为我不习惯太多线缆。
编辑/etc/apt/sources.list源,然后更新debian包信息。
还可以设置locates:dpkg-reconfigure locales,全部选成en_US.UTF-8即可。
最后看一下这个目标系统的大小,退出chroot环境。
这个根文件系统就不要删了,可以当作GCC编译器的include和lib包。
上面已经exit退出了chroot环境,下面的操作都是在主机上进行。根据上面的目标系统大小,做一个块设备文件,并格式化文件系统。
dd if=/dev/zero of=ee_st_fs.ext4 bs=1M count=600
sudo mkfs.ext4 ee_st_fs.ext4
挂载它,然后把ee_st_rootfs下面做好的目标系统考进去。
sudo mount ee_st_fs.ext4 rfs
sudo cp -ar ee_st_rootfs/* rfs
sudo umount rfs
当然,也可以反过来,先做一个ext4的文件系统,挂载之后再直接在这个挂载的系统里debootstrap做系统。
系统镜像做好了,下面主要是烧写和引导相关的操作。
1、把ee_st_fs.ext4拷贝到stm32mp1-openstlinux-20-02-19\images\stm32mp1下。
2、在stm32mp1-openstlinux-20-02-19\images\stm32mp1\flashlayout_st-image-weston下面用仿照现有的tsv文件编写一个自己的烧写配置:
#Opt Id Name Type IP Offset Binary
- 0x01 fsbl1-boot Binary none 0x0 tf-a-stm32mp157a-dk1-trusted.stm32
- 0x03 ssbl-boot Binary none 0x0 u-boot-stm32mp157a-dk1-trusted.stm32
P 0x04 fsbl1 Binary mmc0 0x00004400 u-boot-spl.stm32-stm32mp157a-dk1-basic
P 0x05 fsbl2 Binary mmc0 0x00044400 u-boot-spl.stm32-stm32mp157a-dk1-basic
P 0x06 ssbl Binary mmc0 0x00084400 u-boot-stm32mp157a-dk1-basic.img
P 0x21 bootfs System mmc0 0x00284400 st-image-bootfs-openstlinux-weston-stm32mp1.ext4
P 0x23 rootfs FileSystem mmc0 0x04284400 ee_st_fs.ext4
3、如果只更改rootfs的话,则可以直接进入第5步烧写。如果像我上面那样只保留了bootfs和rootfs,去掉了vendorfs和userfs的话,还需要进行下面的第4步。
4、仿照上面的形式挂载st-image-bootfs-openstlinux-weston-stm32mp1.ext4,修改mmc0_stm32mp157a-dk1_extlinux/extlinux.conf:
# Generic Distro Configuration file generated by OpenEmbedded
MENU BACKGROUND /splash.bmp
TIMEOUT 20
LABEL stm32mp157a-dk1-sdcard
KERNEL /uImage
FDT /stm32mp157a-dk1.dtb
APPEND root=/dev/mmcblk0p5 rootwait rw console=ttySTM0,115200
主要是root=/dev/mmcblk0p5这里。(tsv文件里面第一列的P代表分区,rootfs放在第几个P,这里就改成几)
5、通过STM32CubeProgrammer工具烧写。参见前篇文章。
上电,一个完整的基础Debian就起来了。
配置无线网卡。参见Debian官方wiki。这里需要注意的是在制作根文件系统的时候,要apt install wpasupplicant iw 等相关包。参考上面 “Debian – 基本系统”的后半截。
通过df -h / 查看文件系统占用情况。然后:
resize2fs -p /dev/mmcblk0p5
mmcblk0p5是具体情况需要根据自己的实际情况选择。调整根文件系统大小,扩展到整个SD卡。
到了这里,一个可无线联网的运行在32G SD卡上Debian系统就做好了。
因为做base 系统的时候已经装了openssh-server,因此可以用ssh工具连接开发板进行管理和文件交换了。
1、首先安装weston和虚拟终端的kbd
apt update
apt install kbd weston
2、在主机上挂载OpenSTLinux的st-image-weston-openstlinux-weston-stm32mp1.ext4,主要在主机上拷贝出来三个文件,这三个文件weston配置文件和systemd服务配置文件,不复杂,但是有现成的自然拿来用。
同样的方法,ST提供的其他几个ext4文件系统里的内容,都可以拷贝出来直接用。
sudo mount st-image-weston-openstlinux-weston-stm32mp1.ext4 rfs
scp rfs/etc/xdg/weston/weston.ini ee@192.168.31.8:/home/ee/
scp rfs/lib/systemd/system/weston.service ee@192.168.31.8:/home/ee/
scp rfs/usr/bin/weston-start ee@192.168.31.8:/home/ee/
192.168.31.8是我的开发板地址。
3、在开发板上,修改weston服务配置文件和weston配置文件:
编辑~/weston.service,注释掉
# After=pulsesaudio.service
因为我没有装音频相关包,所以先注释掉。
编辑~/weston.ini,注释掉
#[launcher]
#icon=/usr/share/weston/icon/ST13345_Products_light_blue_24x24.png
#path=/usr/local/demo/demo_launcher.py
因为我没有挂载ST的工具包
4、在开发板上:
cd ~
sudo mkdir -p /etc/xdg/weston/
sudo cp weston.ini /etc/xdg/weston/
sudo cp weston.service /lib/systemd/system/
chmod +x weston-start
sudo cp weston-start /usr/bin/
5、然后打开weston服务
sudo systemctl enable weston
sudo systemctl start weston
应该能看到weston图形界面了。
此内容由EEWORLD论坛网友freebsder原创,如需转载或用于商业用途需征得作者同意并注明出处
道长你这写错了一个地方吧,是mkdir rootfs不是make rootfs
引用: donatello1996 发表于 2020-4-14 23:08
道长你这写错了一个地方吧,是mkdir rootfs不是make rootfs
引用: donatello1996 发表于 2020-4-14 23:08 道长你这写错了一个地方吧,是mkdir rootfs不是make rootfs
好眼力,我都不知道你是在哪里看到的。
引用: littleshrimp 发表于 2020-4-16 15:12 好眼力,我都不知道你是在哪里看到的。
因为我也要弄这块板子,帖子我是认真看完的,每一行
膜拜,linux是个深奥的东西啊