3. 驱动初步-------Uboot

一、bootloader的介绍

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

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

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

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

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

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

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

        fs:uboot支持的文件系统

        include:编译需要的头文件

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

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

        driver:驱动相关的文件夹

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

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

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

三、uboot 的移植和使用

3.1 uboot 的编译和烧写

编译的步骤:

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

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

(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:将所有的东西  包括配置文件都清理,相当于恢复出厂设置

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

(5)编译uboot:make

(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

② 烧录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

3.2 MobaXterm 软件的安装以及使用

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

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

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

(4)选择串口方式

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

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

3.3 uboot 的命令

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

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

        set :修改已有变量的值

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

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

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

        reset:重启uboot

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

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

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

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

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

(2)mmc相关的指令

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

                0: sd卡                   1:板载的emmc

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

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

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

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

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

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

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

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

(4)其他的命令

        查看内存的命令:

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

                md.b:以字节查看内存

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

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

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

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

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

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

                如:movi read kernel 0 40008000

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值