全志V3S嵌入式驱动开发 - uboot,linux kernel和rootfs移植
-
安装了ubuntu操作系统,有了开发板,下面就可以进行我们的开发工作了。第一步,我们要面临的问题就是uboot移植。一般来说,嵌入式的基础环境就是uboot、linux和rootfs。uboot完成一些基本硬件的初始化,比如cpu频率设置、ddr初始化、加载linux等等。早前,uboot的烧入比较麻烦,需要jtag工具才能完成。现在来说,很多soc支持系统直接从sd卡启动,这对开发者就比较友好了。
要做好uboot移植,做好四个方面的工作就可以了。第一,下载好uboot代码;第二,安装交叉编译工具;第三,编译uboot;第四,选择好sd卡,将uboot的bin文件烧入到sd卡。这样,将sd卡插入到开发板中,上电,就可以看到uboot的启动画面了,比如像这样,
1、下载uboot代码
针对uboot代码,可以直接从官方的github地址下载就可以了,
git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current
2、下载交叉编译工具
目前v3s的交叉编译工具都可以直接从网上下载,下载地址在这个位置,
https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/
注意,如果是ubuntu系统,可以选择这个安装包即可,
安装好之后,如果发现对应的gcc没有办法打开,记得安装一下lib32的包,
sudo dpkg --add-architecture i386 sudo apt-get update sudo apt-get install zlib1g:i386 libstdc++6:i386 libc6:i386
并且在.bashrc当中设置一下环境变量,
export PATH=$PATH:/home/feixiaoxing/gcc-linaro-6.3.1-2017.05-i686_arm-linux-gnueabihf/bin
3,编译uboot
相比较而言,编译uboot还是比较简单的,cd到uboot目录,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
如果没有make命令,先用apt-get安装一下make命令,
sudo apt-get install make
4、烧入sd卡
做到了前面三步,好像第四步最简单。其实不然,要实现这个功能,要注意两个方面。第一,选择sd卡的时候一定要选择正规的sd卡,差的sd卡是没有办法完成uboot启动的,这算是自己很大的一个教训吧,浪费了不少时间。实践中发现,一线品牌的sd卡更好一点,启动基本没问题。另外一个方面,一定要让虚拟机支持usb功能,虽然开发板使用的是sd卡,但是这种sd卡是micro sd卡,因此需要一个读卡器,所以如果需要ubuntu支持sd卡的读写,最要让虚拟机支持usb,这样才可以完成ubuntu对sd卡的读写功能。
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
烧写直接使用dd命令就好了,注意这里烧写的文件是u-boot-sunxi-with-spl.bin,烧入的设备是/dev/sdb,也就是刚刚插入的sd卡。做到这两点,基本就可以保证烧入成功了。
除了少部分嵌入式设备使用vxworks和freertos之外,大部分嵌入式都是使用linux来做基础os来使用的。linux使用场景很多,除了大家都知道的android设备、娱乐设备之外,在汽车、工控、网络交换机、服务器等领域,linux也扮演着重要的角色。所以,对于linux或者linux kernel来说,大家没必要神话它,也没有必要轻视它,就把它当成一个工具好了,该优化优化、该加驱动加驱动、该写上层软件写上层软件就行。
前面学习了uboot,板子是可以启动了,但是不能称之为一个完整的系统,因为它还缺少了两样东西,一个是linux kernel,一个是rootfs。
不同厂家的soc,一般对uboot和kernel,他们自己都已经移植好了,用户只需要到对应的地址下载代码编译即可。而对于rootfs,如果本身没有特殊的需求,可以考虑直接使用别人做好的rootfs.tar,这样效率会高很多。
1、下载linux kernel
git clone https://github.com/Lichee-Pi/linux.git -b zero-4.10.y
不出意外,我们就可以下载到4.10.y版本的linux内核代码,首先,配置config文件
make ARCH=arm licheepi_zero_defconfig
接着,开始编译内核,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
这个时候就可以搜索发现,生成了一个zImage文件,接着继续编译设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
最后就是生成驱动modules,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules
当然,如果需要自己把驱动放到统一的目录里面,就可以这么做,
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=out modules_install
2、编译rootfs
关于rootfs,一般都是用buildroot进行配置编译的。之前练习的时候,下载的buildroot版本是buildroot-2017.08.tar.gz。这部分还是建议使用别人编译好的根文件系统,差别不大,编译好之后,在./output/images目录下面,会有一个rootfs.tar文件,这就是我们需要的根文件系统。在文章的最后,我们也给出了自己编译好的rootfs.tar下载地址,供大家参考。
3、烧入sd卡
除linux kernel编译和rootfs编译之外,另外很重要的一个部分就是sd卡烧入。所有的操作都是在ubuntu虚拟机里面完成的,有这么几个流程,
3.1 分区
利用ubuntu里面的fdisk进行分区,输入
sudo fdisk /dev/sdb
分成两个区即可,第一个分区32M,剩下的空间留给另外一个分区,注意在第一个分区的最后一步输入+32M即可。
3.2 在刚才创建好的分区构建文件系统
sudo mkfs.vfat /dev/sdb1 sudo mkfs.ext4 /dev/sdb2
3.3 重新插拔sd卡
sudo sync sudo eject /dev/sdb
3.4 拷贝文件
把zImage和sun8i-v3s-licheepi-zero.dtb拷贝到vfat分区,与此同时把rootfs.tar拷贝到ext4分区,并解压,
tar -xvf rootfs.tar ./
因为之前已经烧入过uboot,这步可以省略,当然不放心的话,可以再烧入一下,
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
3.5 重启板子,因为uboot中我们没有对代码进行修改,所以uboot启动后,需要输入下面这些命令,才能启动kernel
setenv bootm_boot_mode sec load mmc 0:1 0x41000000 zImage load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb setenv bootargs console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw vt.global_cursor_default=0 bootz 0x41000000 - 0x41800000
4、效果图
之前说过,uboot启动后,如果需要进入Linux,那么需要进行一些配置,效果如下,
所有命令输入完毕之后,也就是输入bootz 0x41000000 - 0x41800000后,kernel就可以开始启动了,
因为目前驱动的内容比较少,上层软件也不多,所以不到2s就启动结束,这里输入rootfs之后,马上就进入根文件系统了,
至此,一个最小的嵌入式linux系统就已经实实在在的跑起来了。
Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号