前言
之前一直尝试做一块自己的linux板子,但是一直未能得偿所愿,最关键原因还是自己的电路知识过于薄弱,同时pcb制作也不是很纯熟,所以就搁置了。后来,翻阅了大量的设计资料,发现如果尝试做一块自己的linux板子的话,很多电路模块,比如usb转ttl模块,tf卡电路模块,电源管理模块,晶振模块等等,其实大家的设计基本上是一样的,且在网上也能够找到成熟的设计方案。所以后面我会尝试设计一套自己的linux板子,然后再尝试进行嵌入式方面的开发。这里,我先入手了一块荔枝派nano的板子,用来研究如何进行uboot烧写和linux移植先,话不多说,今天主要来讲解如何进行uboot移植吧。
虚拟机上的串口和usb设置
首先,在开始之前,我们需要准备一下编译环境,自不必说,linux发行版本,由于天生具有良好的编译环境设定,所以我们选用了ubuntu 64位的系统,然后在vmware虚拟机中做一套出来。虚拟机安装ubuntu系统,这里就不提了。
之后,ubuntu安装完毕后,如果想让物理机的u盘或者是串口能交互到unbuntu上,我们需要对虚拟机进行设置。
针对串口设备,比如usb2ttl这种,需要设置如下:
之后,启动ubuntu进入系统后,会有弹窗提醒你要将串口连接到物理设备还是虚拟设备中,这里我们点击虚拟设备,然后选中我们的ubuntu系统即可。这样串口就连接到虚拟机了,可以使用命令查看一下:
需要注意的是,串口连上来,一定是形如ttyUSB*的形式,至于是数字几,我们可以通过插入串口设备后,执行一下ls /dev/tty*, 然后拔掉串口设备后,再执行一下ls /dev/tty*,看看哪个设备下掉了,则串口设备名称就是这个。
之后,我们利用命令 sudo apt install minicom命令来安装minicom串口管理工具,之后,我们利用sudo minicom -s来进行设置,将串口设置为ttyUSB0:
设置完毕后,保存并推出,我们的串口就设定好了。
针对U盘,请确认一定要是usb电路,单纯的tf卡套这种,在ubuntu是无法识别的,需要利用usb读卡器才行,usb设置如下:
这样设置完毕后,usb插入到电脑,然后在虚拟机右下角就可以看到usb连接上来了,可以使用命令查看一下:
由于我这里对usb做了插拔,这里很容易看出来,我的usb名称是sdb,其中一个分区是sdb1
这样,我们串口和usb都设定好了。
U-Boot编译环境设定
U-Boot编译,由于采用的是荔枝派nano,其芯片是f1c100s,是基于arm的,所以这里我们的交叉编译链要使用arm的,这里使用Linaro提供的交叉编译工具。
下载地址为:http://releases.linaro.org/,注意区分32位与64位,由于我们是64位系统,所以这里我们下载64位的:
64位下载地址:http://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/arm-linux-gnueabi/gcc-linaro-6.1.1-2016.08-x86_64_arm-linux-gnueabi.tar.xz
32位下载地址:http://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/arm-linux-gnueabi/gcc-linaro-6.1.1-2016.08-i686_arm-linux-gnueabi.tar.xz
下载完毕后,我们需要将数据传输到虚拟机中,这里我推荐一个小工具:hfs,文件传输上去后,解压到/home/scy/linux-mi/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/目录下
这时候,我们需要将此目录添加到环境变量中并执行命令,查看配置生效:
#打开文本 nano ~/.bashrc #将此命令加到文本最后一行,ctrl+s保存,ctrl+x退出 export PATH=$PATH:/home/scy/linux-mi/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin #使配置生效 source ~/.bashrc #执行如下命令,校验配置生效
可以看到输出了信息,配置已生效。
之后,我们开始进行uboot编译,这里需要先下载uboot源码,从https://github.com.cnpmjs.org/Lichee-Pi/u-boot/tree/nano-v2018.01下载这个分支压缩包,然后利用hfs上传到虚拟机上并解压到/home/scy/linux-mi/u-boot-nano-v2018.01目录
之后进入此目录,执行如下命令:
#如果需要生成在sdram里启动的uboot,我们采用这个 make ARCH=arm licheepi_nano_defconfig #如果需要生成在spiflash里启动的uboot make ARCH=arm licheepi_nano_spiflash_defconfig
此操作会将配置文件进行写入:
然后执行:
make ARCH=arm V=s -j8 CROSS_COMPILE=arm-linux-gnueabi-
则开始进行编译操作,需要注意的是,需要指明交叉编译链,同时-j可以来指定并发线程数,这个数量可以根据机器的性能更改,整体输出如下:
这里我们可以看到最后生成的bin文件就是我们需要的文件。需要说明一下,如果在编译过程中,有任何错误,都可以使用apt install来进行安装,我在编译过程中,基本上安装过如下几个组件:
sudo apt install swig sudo apt install python-dev dtc: not found dtc是device-tree-compiler的缩写,即设备树编译器,说明系统中没有安装这个编译器 sudo apt-get install device-tree-compiler
这样我们就编译成功了。
U-Boot烧写
既然编译成功后,那么这里就需要进行烧写了。
烧写的话,我们首先需要对我们的usb进行格式化,然后去掉所有分区,这里我们采用的工具是gparted,通过sudo apt install gparted来进行安装,之后启动并插入我们的usb:
这里可以看到我们的usb,上面有了个分区,我们先对sdb1分区进行卸载,然后再进行删除,之后保存执行即可:
到这里,盘就干净了,我们开始烧写吧,需要在uboot目录执行如下命令:
sudo dd if=spl/sunxi-spl.bin of=/dev/sdb bs=1024 seek=8
这句命令的意思是,如果找到了spl目录下的sunxi-spl.bin文件,则拷贝到我们的usb中,sdb就是我们的usb, 位大小为1mb,偏移为8,看下执行结果:
这里可以看到我们写入成功了,现在,我们将usb中的卡拿下来,插入到usb2ttl中,看看串口的显示吧,需要在命令行中输入sudo minicom来提前打开串口:
此时还没有任何输入,我们将usb2ttl重新插拔下,或者是将荔枝派nano上的5v电源线重新插拔一下,输出结果如下:
可以看到输入了信息,但是因为没有linux内核,所以引导失败,我们看下环境变量信息:
再看下bd信息:
可以说整体uboot从sd卡移植成功。
接下来,我们就需要创建一个分区,为fat16,里面放上设备树文件和zimage,
zimage是linux内核
rootfs是根文件系统
参考
http://nano.lichee.pro/get_started/first_eat.html
https://blog.csdn.net/p1279030826/article/details/112672535 值得看一下,烧录结果和我的一致