一、bootloader的介绍

现在的电脑几乎都有操作系统,那这个操作系统他是怎样启动的呢?

无论是开发板、真实的物理机也好,操作系统都是跑在内存里的,当开发板上电以后   操作系统就在内存里了吗? 肯定是没有

操作系统没有执行的时候  是存在存储器里的  EMMC/SD,那么谁可以将操作系统由存储搬运到内存里呢?这个东西就叫做 bootloader

bootloader 的作用就是将操作系统搬运到内存里并且执行,所以他又叫做系统的引导程序

bootloader 是一个开源的项目  类似于 linux

bootloader 仅仅是引导程序的一段核心的代码,uboot 就是 bootloader 的一个发行版,类似与 linux 和 ubuntu 的关系一样

二、uboot 的重要文件夹(了解)

uboot 如何增加emmc分区 uboot读取emmc_服务器

        fs:uboot支持的文件系统

        include:编译需要的头文件

        arch:支持的架构:存放的是芯片架构相关的代码

        board:板级资源:存放的是开发板资源相关的代码

        driver:驱动相关的文件夹

        sd_fuse:工具相关的文件夹:这个工具是友善之臂放入的

                mkbl2:对bl2进行偶校验的工具

                E4412_N.bl1.bin:tiny4412 BL1阶段的代码

三、uboot 的移植和使用

3.1 uboot 的编译和烧写

编译的步骤:

(1)将压缩包放入虚拟机

首先,我创建了一个uboot目录文件,然后将uboot压缩包放入该目录下

uboot 如何增加emmc分区 uboot读取emmc_环境变量_02

uboot 如何增加emmc分区 uboot读取emmc_uboot 如何增加emmc分区_03

(2)在虚拟机里解压压缩包

        tar xvf uboot_tiny4412-sdk1506.tar.bz2

ldw@LDW:~/uboot$ tar xvf uboot_tiny4412-sdk1506.tar.bz2

(3)跳转到解压后的目录,执行清理动作

        首先,要安装 make:sudo apt-get install make

        make clean:清理编译之后产生的东西,并不会清理配置文件

        make distclean:将所有的东西  包括配置文件都清理,相当于恢复出厂设置

uboot 如何增加emmc分区 uboot读取emmc_服务器_04

(4)做开发板的选型:make Tiny4412_config

uboot 如何增加emmc分区 uboot读取emmc_linux_05

(5)编译uboot:make

uboot 如何增加emmc分区 uboot读取emmc_服务器_06

(6) uboot的烧录

uboot烧录他要烧录到什么位置?

        uboot 要放在sd卡第一个分区的第49-1056扇区,假如已经放好了,那么uboot要想执行他也要被拷贝到内存里执行,cpu自带的iRAM的大小肯定是不够用的,由此可知   uboot要想执行  只能拷贝到DRAM里去执行。

那么由谁来把uboot拷贝到内存里呢?uboot自己将自己拷贝到内存

具体操作:

        将uboot的前14k 放入到BL2的位置,uboot有一个特性,他自己会判断自己所处的位置,BL2  执行的时候它的位置 IRAM,假如说uboot发现自己所处的位置是IRAM,说明他是uboot的前14k,他就会将uboot搬运到DRAM,假如uboot发现自己所处的位置为DRAM,他就会直接执行,就会将操作系统搬运到内存里。

uboot的烧录的过程:

① 生成bl2的程序:在sd_fuse文件夹里执行

        ./mkbl2 u-boot.bin bl2.bin 14336

uboot 如何增加emmc分区 uboot读取emmc_环境变量_07

② 烧录BL2

        sudo dd iflag=dsync oflag=dsync if=./bl2.bin of=/dev/sdb seek=17

③ 烧录uboot

        sudo dd iflag=dsync oflag=dsync if=./u-boot.bin of=/dev/sdb seek=49

④ 烧录向量表

        sudo dd iflag=dsync oflag=dsync if=./E4412_tzsw.bin of=/dev/sdb seek=705

uboot 如何增加emmc分区 uboot读取emmc_java_08

3.2 MobaXterm 软件的安装以及使用

(1)将安装包的压缩包解压:双击 MobaXterm_installer_21.2.msi,然后一直下一步就可以了

(2)将开发板和主机电脑通过串口线链接在一起

uboot 如何增加emmc分区 uboot读取emmc_java_09

(3)安装完成之后  双击打开,点击 Session

uboot 如何增加emmc分区 uboot读取emmc_linux_10

(4)选择串口方式

uboot 如何增加emmc分区 uboot读取emmc_linux_11

(5)选择设备 设置波特率为115200

uboot 如何增加emmc分区 uboot读取emmc_环境变量_12

(6)给开发板上电:能看到uboot命令界面,则说明uboot的移植完成

uboot 如何增加emmc分区 uboot读取emmc_java_13

3.3 uboot 的命令

(1)常用的环境变量相关的指令(重点)

        pri、print、printenv:查看目前 uboot 里的环境变量

uboot 如何增加emmc分区 uboot读取emmc_环境变量_14

        set :修改已有变量的值

                set 已有环境变量的名字  修改的值     如:set bootdelay 5

uboot 如何增加emmc分区 uboot读取emmc_uboot 如何增加emmc分区_15

        新增一个环境变量:set 要新增的变量的名字 新增变量的值     如:set test 5

uboot 如何增加emmc分区 uboot读取emmc_java_16

        删除一个环境变量:set 要删除的变量的名字    如:set test

uboot 如何增加emmc分区 uboot读取emmc_环境变量_17

        reset:重启uboot

如果通过指令新增了一个环境变量,然后执行 reset指令,那么这个新增的环境变量将消失

uboot 如何增加emmc分区 uboot读取emmc_环境变量_18

        save/saveenv:保存环境变量的信息

添加这个指令之后,新增的环境变量信息不会在重启uboot之后消失,它会依然存在

uboot 如何增加emmc分区 uboot读取emmc_环境变量_19

        ?:查看uboot支持的所有的指令

uboot 如何增加emmc分区 uboot读取emmc_linux_20

        查询某个指令的用法:? 指令      如:? pri

uboot 如何增加emmc分区 uboot读取emmc_uboot 如何增加emmc分区_21

(2)mmc相关的指令

        mmc list :列出开发板的所有的存储介质

uboot 如何增加emmc分区 uboot读取emmc_java_22

                0: sd卡                   1:板载的emmc

        mmcinfo:当前开发板启动介质的信息

uboot 如何增加emmc分区 uboot读取emmc_环境变量_23

(3)文件系统相关的指令

        显示存储介质的详细信息:fatinfo mmc [存储介质的编号]

uboot 如何增加emmc分区 uboot读取emmc_环境变量_24

        查看存储介质信息:fatls mmc [存储介质标号]:[分区号]       如:fatls mmc 0:1 查看sd卡的第一个分区

uboot 如何增加emmc分区 uboot读取emmc_环境变量_25

        fatload:从启动介质里下载内容到内存列(重点)

        fatload mmc [存储介质的标号]:[存储介质的分区号] [内存里的地址] [要下载的文件] [要下载文件的大小]

        如:fatload mmc 0:1 0x02023450 images/FriendlyARM.ini 3072

        这条命令的意思就是:从sd卡的第一个分区里取一个images/FriendlyARM.ini文件 大小是3072,然后把取到的内容放在DRAM里的0x02023450这个地址去运行

(4)其他的命令

        查看内存的命令:

                md 要查看的内存的位置(地址) 要查看的大小

                md.b:以字节查看内存

uboot 如何增加emmc分区 uboot读取emmc_linux_26

                md.w:以半字(2个字节)查看内存

                md.l:以字(4个字节)查看内存

        go 地址:跳转到内存的某个地址开始执行程序   如:go 0x02023400 

        boot:当执行这个命令的时候,他就会执行bootcmd里的内容

                   bootcmd 是 uboot 倒计时执行完了之后,默认会执行的命令

        read:从存储介质读取一段代码到内存里

                如:movi read kernel 0 40008000

                他的意思就是从0号存储介质(sd卡)读取内核到内存里的0x40008000位置