SD卡/iNand操作指令movi

  • Post author:
  • Post category:其他


1、SD卡/iNand操作指令movi

(1)开发板如果用SD卡/EMMC/iNand等作为Flash,则在uboot中操作flash的指令为movi(或mmc)

(2)movi的指令都是movi read和movi write一组的,movi read用来读取iNand到DDR上,movi write用来将DDR的内容写入iNand中。

(3)movi read {u-boot | kernel} {addr} 这个命令使用了一种通用型的描述方法来描述:大括号中的竖线表示多选一。中括号[]表示可选参数。

(4)指令有很多用法,譬如 movi read u-boot 0x30000000,意思就是把iNand中u-boot分区读出到DDR的0x30000000起始的位置处。(uboot代码中将iNand分成很多分区,每个分区有地址范围和分区名,uboot程序操作中可以直接地址来操作iNand分区,也可以使用分区名来操作分区。);注意这里的0x30000000也可以直接写作30000000,意思是一样子的(uboot的命令行中所有的数字都被默认当成16进制处理,不管你加不加0x都一样)。

2、NandFlash操作指令nand

(1)理解方法和操作方法完全类似于movi指令

3、内存操作指令:mm、mw、md

(1)DDR中是没有分区的(只听说过对硬盘、Flash进行分区,没有听说过对内存进行分区······),但是内存使用时要注意,千万不能越界踩到别人。因为uboot是一个裸机程序,不像操作系统会由系统整体管理所以内存,系统负责分配和管理,系统会保证内存不会随便越界。然后裸机程序中uboot并不管理所以内存,内存是散的随便用的,如果是程序员(使用uboot的人)自己不注意就可能出现自己的数据给覆盖了。(所以你思考我们为什么把uboot放在0x23E00000地址处)

(2)md就是memory display,用来显示内存中的内容。

(3)mw就是memory write,将内容写到内存中

(4)mm就是memory modify,修改内存中的某一块,说白了还是写内存(如果需要批量的逐个单位的修改内存,用mm最合适)

4、环境变量如何参与程序运行

(1)环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始值,然后使用过程中都是用DDR中的环境变量重新写入Flash中更新Flash中的环境变量。下次开机时又会从Flash中再读一次。

(2)环境变量在uboot中是用字符串表示的,也就是说uboot是按照字符匹配的方式来区分各个环境变量的。因此用的时候一定要注意不能写错字。

5、网络设置:ipaddr servserverip

(1)ipaddr是开发板通过tftp指令去tftp服务器下载东西是,tftp服务器的IP地址。

(2)serverip是开发板通过tftp指令去tftp服务器下载东西是,tftp服务器的IP地址。

(3)gatewayip是开发板的本地网关地址

(4)netmask是子网掩码

(5)ethaddr是开发板的本地网卡的MAC地址。

6、自动运行命令设置:bootcmd

(1)uboot启动时实际就是在内部执行了bootcmd这个环境变量的值所对应的命令集。

(2)bootcmd=movi read kernel 3000800;bootm 30008000意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。

(3)在uboot中是没有操作系统的,因此我们对Flash(相当于硬盘)的管理必须事先使用分区界定(实际上在uboot中和kernel中都有个分区表,分区表就是我们在做系统移植时对Flash的整体分配方法)。有了这个界定后,我们在部署系统时按照分区界定方法来部署,uboot和kernel的软件中也是按照这个分区界定来工作,就不会错。

(4)分区方法不是一定的,不是固定的,是可以变动的。但是在一个移植中必须事先设计好定死,一般在设计系统移植时就会定好,定的标准:

uboot:uboot必须从Flash起始地址开始存放(也许是扇区0,也许是扇区1,也许是其他,取决于Soc的启动设计)



版权声明:本文为weixin_40405692原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。