一、SD卡/iNand操作指令movi
(1)开发板如果用SD卡/EMMC/iNand等作为Flash,则在uboot中操作flash的指令为movi(或mmc)
(2)movi指令是一个命令集,有很多子命令,具体用法可以help movi查看。
(3)movi的指令都是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write查看用来将DDR中的内容写入iNand中。理解这些指令时一定注意设计到的2个硬件:iNand和DDR内存。
(4)movi read {u-boot | kernel} {addr} 这个命令使用了一种通用型的描述方法来描述:movi和read外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}扩起来的部分必选1个,大括号中的竖线表示多选一。中括号[]表示可选参数(可以有也可以没有)
(5)指令有多种用法,譬如movi read u-boot 0x30000000,意思就是把iNand中的u-boot分区读出到DDR的0x30000000起始的位置处。(uboot代码中将iNand分成了很多个分区,每个分区有地址范围和分区名,uboot程序操作中可以使用地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000(uboot的命令行中所有数字都被默认当作十六进制处理,不管加不加0xd都一样)。
二、NandFlash操作指令nand
(1)理解方法和操作方法完全类似于movi指令
三、内存操作指令:mm、mw、md
(1)DDR中是没有分区的,但是内存使用时要注意,千万不能越界踩到别人。因为uboot是一个裸机程序,不像操作系统会由系统整体管理所有内存,系统负责分配和管理,系统会保证内存不会随便越界。然而裸机程序中uboot并不管理所有内存,内存是散的随便用的。
(2)md就是memory display,用来显示内存中的内容。
(3)mw就是memory write,将内容写到内存中
(4)mm就是memory modify,修改内存中的某一块,其实还是写内存(如果需要批量的逐个单元的修改内存,用mm最合适)
三、启动内核指令:bootm、go
(1)uboot的终极目标就是启动内核,启动内核在uboot中表现为一个指令,uboot命令行中调用这个指令就会启动内核。
(2)差别:bootm启动内核同时给内核传参,而go命令启动内核不传参。bootm才是正宗的启动内核的命令,一般情况下都用这个;go命令本来不是专为启动内核设计的,go命令内部其实就是一个函数指针指向一个内存地址然后直接调用那个函数,go命令的实质就是PC直接跳转到一个内存地址运行而已。go命令可以用来在uboot中执行任何的裸机程序。
四、环境变量
(1)环境变量有两份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份,用户可以用saveenv指令将DDR中的环境变量重新写入Flash中去更新Flash中环境变量。
(2)自动运行倒数时间:bootdelay
(3)网络设置:ipaddr serverip
1)ipaddr是开发板的本地IP地址
2)serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
3)gatewayip是开发板的本地网关地址
4)netmask是子网掩码
5)ethaddr是开发板的本地网卡的MAC地址。
(4)自动运行命令设置: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设备第2分区,根文件系统是可读可写的
init=/linuxrc linux的进程1(init进程)的路径
rootfstype=ext3 根文件系统的类型是ext3
六、新建、更改、删除一个环境变量的方法
(1)新建一个环境变量,使用set var value
(2)更改一个环境变量,使用set var value
(3)删除一个环境变量,使用set var