前言

之前一直尝试做一块自己的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 CROSS_COMPILE=arm-linux-gnueabi- -j16

则开始进行编译操作,需要注意的是,需要指明交叉编译链,同时-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=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

这句命令的意思是,如果找到了spl目录下的sunxi-spl.bin文件,则拷贝到我们的usb中,sdb就是我们的usb, 位大小为1mb,偏移为8,看下执行结果:

这里可以看到我们写入成功了。

但是到这里只是编译了默认部分,由于uboot倒计时结束,要启动Linux内核,所以需要修改配置文件使u-boot去执行:

/* bootcmd 保存着 uboot 默认命令, uboot 倒计时结束以后就会执行 bootcmd 中的命令 */
/* bootargs 保存着 uboot 传递给 Linux 内核的参数*/
sudo nano /include/configs/suniv.h
 
/* 添加以下代码(mmc 0为TF卡,1是第一分区,文件系统为fat32,把zImage和dtb文件拷入DRAM)*/
#define CONFIG_BOOTCOMMAND	"fatload mmc 0:1 0x80800000 zImage; "  \
                            "fatload mmc 0:1 0x83000000 suniv-f1c100s-licheepi-nano.dtb; " \
                            "bootz 0x80800000 - 0x83000000;"
 
/* 继续添加(linux将使用uart0进行交互,死机5s重启,根文件系统在mmc0(tf卡)第二分区(EXT4),等待 mmc 设备初始化完成以后再挂载,开启读写权限) */
#define CONFIG_BOOTARGS   "console=ttyS0,115200 panic=5 root=/dev/mmcblk0p2 rootwait rw "
 
 
/* 回到u-boot目录进行编译 */
make ARCH=arm menuconfig
/* 取消勾选 [] Enable a default value for bootcmd */
/* 勾选 [v] Enable boot arguments;*/
 
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j16

将上面生成成功的u-boot-sunxi-with-spl.bin再烧录到sd卡一次,即执行如下命令:

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8

现在,我们将usb中的卡拿下来,插入到usb2ttl中,看看串口的显示吧,需要在命令行中输入sudo minicom来提前打开串口:

此时还没有任何输入,我们将usb2ttl重新插拔下,或者是将荔枝派nano上的5v电源线重新插拔一下,输出结果如下,但是因为没有linux内核,所以引导失败,我们看下环境变量信息::

上面这个是正常的输出结果,如果从tf卡启动的话,如果输出是下面的结果,则极有可能是你没有修改suniv.h这个文件导致的,需要去修改下这个文件,然后重新生成

来看看环境信息:

再看下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  值得看一下,烧录结果和我的一致 

从零开始 荔枝派nano TF卡启动_feelinghappy的专栏-CSDN博客 修改suniv.h

posted on 2021-06-06 22:38  程序诗人  阅读(170)  评论(0编辑  收藏  举报