嵌入式学习笔记---uboot(1)

总结于朱有鹏老师的嵌入式课程,感谢朱老师

文章目录

  • uboot是什么?
  • uboot需要解决哪些问题
  • uboot常用命令
    • 基本知识
      • 行缓冲命令行
    • 常用命令举例
  • uboot常用环境变量
    • 自动运行倒数时间
    • 网络设置
    • 自动运行命令设置
    • uboot给kernel传参:bootargs
    • 新建、更改、删除一个环境变量的方法

uboot是什么?

如果重装过系统就知道BIOS,是用于启动顺序等各种配置的一段程序。而uboot就相当于嵌入式设备中的BIOS。有人可能会有疑问,系统都没有启动,是怎么就开始执行代码的呢?这是由内存性质决定的有一些内存设备是上电就可以执行的。可以借助这样的内存设备来初始化那些不能开机就启动的内存设备。

uboot其实就是一段用于初始化操作系统内核,部署整个系统,操作flash上的驱动,提供一个实现人机交互的命令行界面的一段代码

uboot需要解决哪些问题

  1. 需要实现开机自启动
    uboot是否能够顺利的开机自启动有一个很关键的条件,就是与SoC的启动方式(SD卡,Norflash,NandFlash等)相兼容
  2. 能引导操作系统内核启动,并能向里面传参
    在uboot中事先给linux内核准备一些启动参数放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取uboot传给他的参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。
  3. 提供系统部署功能
    能帮助使用者把系统下载到内存中
  4. 能进行soc级和板级硬件管理
    实现了一部分硬件的控制能力,能够简单的控制一些串口,显示屏等在启动的时候将启动过程可视化
  5. uboot的使用时间
    uboot需要知道自己什么时候开始运行什么时候结束,上电启动,启动完内核就结束。

uboot常用命令

基本知识

行缓冲命令行

  1. 行缓冲指的是命令在输入的过程中会放到一个缓冲区,直到按下回车才开始解析命令。类似的还有无缓冲(输入即处理)和全缓冲(填满才处理)
  2. 有些命令有简化的别名
  3. 有些命令会带参数
  4. 命令中的特殊符号。如单引号将这个很长且中间有空格隔开的参数引起来
  5. 有些命令是一个命令族。意思是一些命令开头都是用同一个命令关键字的,但是后面的参数不一样,这些命令的功能和作用也不同。这就叫一个命令族。同一个命令族中所有的命令都有极大的关联

常用命令举例

  1. printenv/print
    print命令不用带参数,作用是打印出系统中所有的环境变量。全局变量被存储在Flash的一个特定区域
  2. setenv/set
    用法:set name value;作用:设置(添加/更改)环境变量
  3. saveenv/save
    用法:不带参数;作用:保存环境变量更改
  4. ping
    用法:ping ip地址;作用:网络测试
  5. tftp
    用法:tftp 0x30000000 zImage-qt(意思是将服务器上名为zImage-qt的文件下载到开发板内存的0x30000000地址处。);作用:下载指令;注意:需要搭建tftp服务器,要下载的东西放在服务器的下载目录中
  6. movi
    用法:指令集,例movi read u-boot 0x30000000----把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处;作用:操作SD卡/iNand
  7. nand
    类似movi但用于操作NandFlash
  8. mm、mw、md
    作用:内存操作指令
    md就是memory display,用来显示内存中的内容。
    mw就是memory write,将内容写到内存中
    mm就是memory modify,修改内存中的某一块,说白了还是写内存(如果需要批量的逐个单元的修改内存,用mm最合适)
  9. bootm、go
    作用:启动内核指令
    差别:bootm启动内核同时给内核传参,而go命令启动内核不传参。bootm其实才是正宗的启动内核的命令,一般情况下都用这个;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址去运行而已。go命令可以用来在uboot中执行任何的裸机程序

uboot常用环境变量

Flash中的环境变量自然是用来做初始化的。在uboot启动时会把Flash中的环境变量全部拷贝进DDR中。
环境变量在uboot中是用字符串表示的,uboot按照字符匹配的方式来区分各个环境变量。

自动运行倒数时间

bootdelay

网络设置

(1)ipaddr是开发板的本地IP地址
(2)serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
(3)gatewayip是开发板的本地网关地址
(4)netmask是子网掩码
(5)ethaddr是开发板的本地网卡的MAC地址。

自动运行命令设置

bootcmd
(1)uboot启动后会开机自动倒数bootdelay秒,如果没有人按下回车打断启动,则uboot会自动执行启动命令来启动内核。
(2)uboot开机自动启动时实际就是在内部执行了bootcmd这个环境变量的值所对应的命令集。
(3)bootcmd=movi read kernel 30008000; bootm 30008000 意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。
(4)set bootcmd printenv,然后saveenv;然后重启则会看到启动倒数后自动执行printenv命令打印出环境变量。这个小实验说明开机自动执行了bootcmd。
(5)set bootcmd ‘movi read kernel 30008000; bootm 30008000’

uboot给kernel传参:bootargs

(1)linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。这样的设计是为了灵活,为了内核在不重新编译的情况下可以用不同的方式启动。
(2)我们要做的事情就是:在uboot的环境变量中设置bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。
(3)bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3 意义解释:
console=ttySAC2,115200: 控制台使用串口2,波特率115200.
root=/dev/mmcblk0p2 rw: 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的
init=/linuxrc: linux的进程1(init进程)的路径
rootfstype=ext3: 根文件系统的类型是ext3

新建、更改、删除一个环境变量的方法

(1)新建一个环境变量,使用set var value
(2)更改一个环境变量,使用set var value
(3)删除一个环境变量,使用set var

你可能感兴趣的:(嵌入式)