参照黑金例程在ZYNQ开发板上移植好Linux系统后,默认是没有加载SD卡的。因此每次断电后,在Linux上的配置信息全部丢失,每次上电后都要重复配置,非常的不方便,经过死皮烂脸的求问和网上查资料之后,终于实现了这个功能,在这里分享一下我通过新建petalinux的开机自启 App 的方法,实现在ZYNQ7021开发板跑的Linux上开机自动挂载SD的过程。
手动挂载SD卡
要挂在SD卡,第一件事是查找SD在板子上的Linux里对应的设备描述符。通过以下几步查找:
-
通过 #fdisk -l 命令确认板子上的linux系统是否识别SD卡,可以看到存在SD卡且有 mmcblk0p1 和 mmcblk0p2 两个分区
-
确保SD卡驱动正常。通过 cat /proc/partitions 命令,结果如下图所示,存在与 mmcblk0p1 和 mmcblk0p2相应的分区,可以正常挂载,如果没有,则在移植内核时,选择 device deivers-》mmc/sd card support ->Samsung s3c sd/mmc
card interface support。
-
挂载SD卡。一般习惯挂载到 /mnt 这个文件夹,当然也可以自己新建一个文件夹,然后再挂载到自己的文件夹上
mount /dev/mmcblk0p1 /mnt // 挂载SD卡
umount /mnt // 卸载SD卡
Linux 上电挂载SD卡
在网上,我查阅了很多的博客,都是说直接修改路径 /etc/init.d/ 下的rcS文件,在文件中添加 “mount /dev/mmcblk0p1 /mnt” 或者 “mount -t vfat /dev/mmcblk0p1 /mnt”。但是黑金官方教程里,ZYNQ移植的petalinux并不能这样实现,因为教程里默认加载的文件系统并不是移植在SD卡上EXT分区里的文件系统,而是ramdisk (即压缩在uImage中)里的一个非常小的文件系统。所以通过修改SD中某一文件来实现上电自启功能是行不通的。重点来了,死皮烂脸磨来的,分享给大家:在petalinux下做一个自己的App,在配置petalinux的文件系统时,这个App将自己写的脚本文件复制到文件系统中。
首先是创建一个上电后自动运行的小App,添加或者修改需要开机运行的脚本,然后在移植系统的时候勾选上之前创建的App,剩余移植步骤与黑金教程中一样,移植完成后就可以重新上电查看一下自己的自启效果了。具体步骤如下:
-
新建一个petalinux的App,我是运用的是petalinux的应用程序模板。
-
修改Makefile中的“install:”的目标,使用$(TARGETINST)将预构建的应用程序或脚本安装到目标文件系统的主机中,并参考“install:”目标的注释修改,基本上不怎么修改,如果是更改了名字,则替换了名字就行。
修改开机自启脚本 startUp.sh如下:实现开机将SD的两个分区分别挂载到FAT和EXT4文件夹中。#!/bin/sh mkdir FAT mount /dev/mmcblk0p1 FAT mkdir EXT4 mount /dev/mmcblk0p2 EXT4
修改Makefile如下:不做解释,看不懂,只是稍作修改能用
clean: .PHONY: install image install: # Please add commands below the comments to install data to target file system. # Use $(TARGETINST) to copy data into the target # E.g. there is data/startUp in the current directory, and I want to # copy it into the target "/" directory: #$(TARGETINST) -d data/startUp /startUp $(TARGETINST) -d -p 0755 startUp.sh /etc/init.d/startUp.sh $(TARGETINST) -s /etc/init.d/startUp.sh /etc/rc5.d/S98startUp.sh help: @echo "" @echo "Quick reference for various supported build targets for $(INSTANCE)." @echo "----------------------------------------------------" @echo " all build $(INSTANCE) and install to rootfs host copy" @echo " install install built objects to rootfs host copy"
-
将修改好的App文件夹复制到自己的petalinux工程(教程里的移植工程)的相同目录中,例如将模板
“ax7021_eth/components/apps” 中的 startUp 文件夹复制到 “uart_emio/ax7021_multi_eth_emio/components/apps”中,apps文件夹可能需要自己创建。 -
在构建应用程序之前,需要通过运行以下命令从 PetaLinux menuconfig 启用应用程序:“petalinux-config -c rootfs”,将会在“Applications --->”子菜单中看到自己新建的应用程序。
-
将预构建的应用程序或脚本安装到主机上的目标文件系统中,只需运行 “petalinux-build -c rootfs/startUp” 命令即可。
-
最后,需要重建 PetaLinux 引导映像,以便使用更新的目标文件系统、更新映像,运行以下命令:“petalinux-build -x package”,或者也可以从配置petalinux开始,输入命令 “petalinux-build”,或者完整的重新移植一次。
娘的,终于整理完了,真不容易,关于这个自动挂载SD卡的博客,早在前面的文章中也提到过的,但是一直没时间更新,今天差不多花了一天时间,先是查资料,然后重复了一遍这个过程,成功了之后才来这里整理这个过程。本来想直接给一个petalinux的应用程序模板的下载链接的,结果发现最高只能五个积分。很难受,我没打算让人下载,但是这个分数也太对不起我的劳动成果了,我先平复一下心情先,心情好了再上传!
其他的开机自启App,也可以通过这个方式移植到 Linux 中去,运用好上述提到的petalinux模板,能满足一些基本的自启服务要求了。
最后这个分享一个比较专业的自动挂载脚本
#!/bin/sh
#
if [ ! -d "/emmc1" ]
then
mkdir /emmc1
fi
if [ ! -d "/emmc2" ]
then
mkdir /emmc2
fi
if [ ! -d "/emmc3" ]
then
mkdir /emmc3
fi
umount /dev/mmcblk1p1
umount /dev/mmcblk1p2
umount /dev/mmcblk1p3
mount /dev/mmcblk1p1 /emmc1
mount /dev/mmcblk1p2 /emmc2
mount /dev/mmcblk1p3 /emmc3