本文内容来自对 《朱有鹏嵌入式linux核心课程》学习总结
1. SD卡/ iNand 操作指令 movi
- 开发板如果用 SD 卡/EMMC/iNand 等作为 Flash,则在 uboot 中操作的指令为
movi
(或mmc) movi
指令是一一个命令集,有很多子命令,具体用法可以help movi
查看。movi
的指令都是movi read
和movi write
一组的,movi read
用来读取 iNand 到 DDR 上,movi write
用来将 DDR 中的内容写入 iNand 中。理解这些指令时一定要注意涉及到的 2 个硬件:iNand 和 DDR 内存。movi read {u-boot | kernel} {addr}
这个命令使用了一种通用型的描述方法来描述:movi
和read
外面没有任何标记说明每一次使用这个指令都是必选的;一对大括号{}
括起来的部分必选1个,大括号中的竖线表是多选一。中括号[]
表示可选参数(可以有也可以没有)- 指令有多种用法,譬如
movi read u-boot 0x30000000
,意思就是把 iNand 中的 u-boot 分区读出到 DDR 的 0x30000000 起始的位置处。(uboot 代码中将 iNand 分成了很多个小分区,每个分区有地址范围和分区名,uboot 程序操作中可以使用直接地址来操作 iNand 分区,也可以使用分区名来操作分区。);注意这里的 0x30000000 也可以直接写作 30000000,意思是一样的(uboot 的命令行中所有数字都被默认当作十六进制处理,不管你加不加 0x 都一样)。
2. NandFlash 操作指令 nand
- 理解方法和操作方法完全类似
movi
指令
3. 内存操作指令:mm,mw,md
- DDR 中是没有分区的(只听说过对硬盘,Flash 进行分区,没听说过对内存进行分区…),但是内存使用时要注意,千万不能越界踩到别人了。因为 uboot 是一个裸机程序,不像操作系统会由系统整体管理所有内存,系统负责分配和管理,系统会保证内存不会随便越界。然后裸机程序中 uboot 并不管理所有内存,内存是散的随便用的,所以如果程序员(使用 uboot 的人)自己不注意就可能出现自己把自己的数据给覆盖了。(所以你思考下我们为什么把 uboot 放在 23E00000 地址处)
md
就是memory display
,用来显示内存中的内容。mw
就是memory write
,将内容写到内存中。mm
就是memory modity
,修改内存中的某一块,说白了还是写内存(如果需要批量的逐个单元的修改内存,用mm
最合适)
4. 启动内核指令:bootm,go
- uboot 的终极目标就是启动内核,启动内核在 uboot 中表现为一个指令,uboot 指令行中调用这个指令就会启动内核(不管成功与否,所以这个指令是一条死路)。
- 差别:
bootm
启动内核同时给内核传参,而go
命令启动内核不传参。bootm
其实才是正宗的启动内核的命令,一般情况下都用这个;go
命令可以用来在 uboot 中执行任何的裸机程序(有一种调试裸机程序的方法就是事先启动 uboot,然后在 uboot 中去下载裸机程序,用go
命令去执行裸机程序)