• 嵌入式linux与物联网进阶之路一:U-Boot移植


    前言

    之前一直尝试做一块自己的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

  • 相关阅读:
    「Codeforces 79D」Password
    「算法笔记」BSGS
    「Codeforces 468C」Hack it!
    「算法笔记」快速傅里叶变换(FFT)
    「算法笔记」2-SAT 问题
    「算法笔记」基础数论 2
    《算法笔记》二分—木棒切割问题&求凸多边形外接圆最大半径
    《算法笔记》区间贪心
    《算法笔记》PAT B1020 月饼、PAT B1023 组个最小数
    《算法笔记》n皇后问题
  • 原文地址:https://www.cnblogs.com/scy251147/p/14856721.html
Copyright © 2020-2023  润新知