Linux驱动开发前期准备
本文主要是记录下再驱动开发前期遇到的一些问题,如有错误或建议欢迎指出。
平台:正点原子的阿尔法卡发板(256+nand),Ubuntu20.04
Uboot
正常编译
首先需要编译uboot的源码,这用了正点原子提供的uboot源码(uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2。)
在uboot下编写shell脚本,方便我们去编译uboot源码。
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_sd_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
uboot无法启动
然后把uboot.bin烧写到SD卡,插上板子启动,但发现一直无法启动,后来发现是自己的交叉编译工具选错了,需要修改下交叉编译链。
sudo vi /etc/profile
vi ~/.bashrc
分别在末尾添加上自己的交叉工具链,然后注释掉原来别的交叉编译链
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
最后验证下交叉编译工具是否正确,有可能需要重启下Ubuntu,才可能生效
source ~/.bashrc
which arm-linux-gnueabihf-gcc
接着在再次编译,用imxdownload把uboot.bin下载到sd卡,也可以用命令下载到SD卡
sudo dd if=u-boot.bin of=/dev/sdb bs=1024 seek=1 conv=fsync
最后uboot成功点亮
uboot环境变量
然后需要设置下几个uboot的环境变量,这部分可以参考正点原子的【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.71,主要是配置网络,ubootcmd,bootargs。下面的我的配置。
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=nfs网络文件系统的路径,v3,nfsvers=3 proto=tcp rw ip=板子的ip:Ubuntu的ip:网关的ip:子网掩码::eth0:off'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-alientek-nand.dtb; bootz 80800000 - 83000000'
#这里v3,nfsvers=3是未来让uboot启动内核时,可以用NFS3的版本挂载Rootfs
#在uboot用nfs去下载zImage时会出错,提示Loading: *** ERROR: File lookup fail,不过不影响可以用tftp去下载zImage和dtb
#https://blog.csdn.net/polaris_zgx/article/details/103571725(我仍然无法解决NFS问题)
Kernal
正常编译
内核源码的编译,与uboot类似,编写脚本,进行配置,把编译出来的镜像拷贝到tftpboot目录下
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
主要的两个问题
VFS: Unable to mount root fs on unknown-block(2,0)
内核的编译基本也是跟着正点原子的来的,但是要注意的地方是,在编译内核时,要取消NFS2的启用,否则ubuntu20.04的NFS V2无法被挂载rootfs,会提示这个问题。
[ 11.254132] #0: wm8960-audio
[ 106.409572] VFS: Unable to mount root fs via NFS, trying floppy.
[ 106.416312] VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6
[ 106.423662] Please append a correct "root=" boot option; here are the available partitions:
...
[ 106.512338] b300 62367744 mmcblk0 driver: mmcblk
[ 106.517696] b301 62351360 mmcblk0p1 00000000-01
[ 106.523031] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[ 106.531307] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
[ 110.393264] random: nonblocking pool is initialized
VFS: Cannot open root device “nfs” or unknown-block(0,255)错误解决_Overboom的博客-CSDN博客
参考上面的链接,把NFS version 2 取消编译,然后把
arch/arm/boot/zImage和arch/arm/boot/dts/imx6ull-alientek-nand.dtb拷贝到tftpboot的目录下
重启设备就可以正常进入linux的控制台了
make: *** [Makefile:947:fs]
第二个问题就是编译kernal的时候出现下面的问题,导致无法编译出zImage和dtb
LD fs/ext4/ext4.o
LD fs/ext4/built-in.o
make: *** [Makefile:947:fs] 错误 2
LD arch/arm/mach-imx/devices/built-in.o
LD arch/arm/mach-imx/built-in.o
LD mm/built-in.o
原因还是更uboot交叉编译类似的问题,换回正确的编译器后,可以正常编译,板子启动后也不会有一些却莫名其妙的问题了
Rootfs
跟文件系统按着正点原子的文档来,基本不会出现什么问体,但是因为我是跳着来的,导致在进入系统后,板子上有些命令无法,像smod,cat ,kill ,pid等一些命令。
正常来说,这些应该已经被编译进去了, 我们需要完善下rootfs,添加一些启动的相关代码,上面的问题基本解决了
参考链接
字符设备驱动编译出现error:code model kernel does not support PIC mode-OpenEdv-开源电子网
VFS: Cannot open root device “nfs” or unknown-block(0,255)错误解决_Overboom的博客-CSDN博客