uboot中打印信息No NAND device found!!! 0Mib啥错误?怎么修改uboot代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uboot中打印信息No NAND device found!!! 0Mib啥错误?怎么修改uboot代码相关的知识,希望对你有一定的参考价值。
RAM: 256 MiB
NAND: Special Nand id table Ver
sion 1.35
Nand ID: 0xAD 0xD7 0x94 0xDA 0x74 0xC3 0xAD 0xD7
No
NAND device found!!!
0 MiB
Can
't find a valid spi flash chip.
MMC:
Card did not respond to voltage
select!
No EMMC device found!!!
uboot使用命令整理(2016.03)
文章目录
一、uboot启动信息
系统启动时,按下任意键进入uboot命令行:
- uboot版本和编译时间:2016.03
- CPU型号和主频
- CPU类型:工业级
- 复位原因:POR
- 板子名称:MX6ULL 14x14 EVK
- I2C:就绪
- DRAM大小:512MB
- MMC:有两个控制器,就绪
- LCD型号:ATK 7寸LCD,1024*600分辨率,24位色彩深度(RGB888)
- 标准输入:串口
- 标准输出:串口
- 标准错误:串口
- 切换到eMMC的第0个分区上,并使用eMMC
- 网口:使用FEC1
- 用户提示:正常启动,uboot将从eMMC中读取环境变量和参数信息,准备启动linux内核
- 倒计时:3s,等待用户按下任意键,若按下则进入命令行,否则正常启动
二、uboot使用命令
1. 帮助命令
uboot中可用的命令在移植时是用户可配置的。
(1)查看当前可用命令:
help
(2)查看某条命令使用帮助:
help bootz
2. 信息查询类命令
(1)查看板子信息
bdinfo
(3)查看uboot版本号
version
当前uboot版本号是2016.03,编译时间为20200115,编译器为arm-poky-linux-gnueabi-gcc 5.3.0。
3. 环境变量操作命令
(1)打印环境变量
print
printenv
(2)打印指定环境变量的值
printenv <环境变量名称>
(3)修改环境变量(修改DRAM中的加载值)
setenv <环境变量名称> <值>
如果值中有空格,则需要用单引号引起来:
(4)保存环境变量(修改Flash中保存的值)
saveenv
(5)新建环境变量
setenv <新的环境变量名称> <环境变量值>
saveenv
(6)删除环境变量
setenv <要删除的环境变量名称>
saveenv
4. 内存类操作命令(DRAM)
- uboot中的数值都是十六进制的,可以不用加0x
- uboot中的数据长度是以个为单位,而不是字节
(1)显示内存值
md[.b .w .l] address [#of objects]
.b .w .l
:按byte查看(1B)、按word查看(2B)、按long查看(4B)address
:要查看的内存地址# of objects
:数据长度
eg. 查看以0x80000000开始的20个内存值:
(2)修改指定地址的内存值(地址不会自增)
nm[.b .w .l] address
eg. 修改0x80000000地址处的数据为0x12345678:
(3)修改指定地址的内存值(地址自增)
mm[.b .w .l] address
eg. 修改0x80000000开始的三个连续long数据(3*4=12B):
(4)使用指定数据填充一段内存
mw[.b .w .l] address value [count]
eg. 同样修改0x80000000开始的三个连续long数据(3*4=12B)为一样的值:
(5)拷贝数据
该命令有两个作用:
- 将DRAM中的数据从一段内存拷贝到另一段内存中
- 将Nor Flash中的数据拷贝到DRAM中
cp [.b .w .l] source target count
eg. 将0x80000000处的数据拷贝到0x80000100处,长度为0x10个内存块(16 * 4 = 64B):
(6)比较两段内存的数据是否相等
cmp[.b .w .l] addr addr2 count
eg. 比较刚刚拷贝的两段数据是否相等:
4. 网络相关命令
(1)网络环境设置
在使用网络之前需要先搭建网络环境,设置以下环境变量:
这里设置如下:
修改ubuntu主机地址:
(2)ping命令
ping <ip>
开发板中ping windows主机:
开发板中ping ubuntu主机:
uboot中协议实现的原因,开发板不能被ping。
(3)dhcp命令
开发板连接到路由器时,可以使用dhcp命令获取ip,dhcp命令在获取到ip后,还会通过tftp来加载linux内核:
dhcp
(4)nfs方式获取网络文件
确保nfs环境已搭建完成:Ubuntu上搭建NFS。
nfs [load address] [[hostip:]boot filename]
eg. 通过nfs方式从nfs服务器拉取zImage镜像文件,放到DRAM中的0x80800000处:
NFS root 测试正常,不知道一直为啥拉不到文件,后续再分析!
(5)tftp方式获取网络文件
tftp [address] [[serverip]:filename]
eg. 通过tftp方式从tftp服务器拉取zImage镜像文件,放到DRAM中的0x80800000处:
因为之前已经设置了serverip环境变量,所以直接用文件名拉取就ok,真方便。
5. eMMC/SD card相关操作命令
一般情况下,eMMC和SD Card可以当作同一类东西操作,统称为mmc。
uboot中的mmc命令参数汇总如下:
(1)输出当前选中的MMC设备信息
mmc info
可以看出,当前选中使用的MMC设备是sd卡,版本为3.0,容量为14.6GB(16G卡),速度为50MHz,总线4位宽。
(2)扫描当前所有的MMC设备
mmc rescan
(3)查看当前所有的MMC设备
mmc list
可以看到当前开发板上有两个MMC设备,正在使用的是SD卡。
(4)切换当前MMC设备
mmc dev [dev][part]
- dev:要切换的MMC设备号
- part:分区号,不指定则默认0
eg. 切换当前使用eMMC设备:
同时,切换后查看eMMC设备的信息:
可以看出,当前选中使用的MMC设备是eMMC,版本为4.0,容量为7.3GB(8GB eMMC),速度为52MHz,总线8位宽。
(5)查看当前MMC设备分区
mmc part
① 查看eMMC的分区:
可以看出,此时eMMC有两个分区,扇区 2048-65536为第一个分区,扇区67584-15202304为第二个分区。
如果eMMC中烧写了Linux系统,eMMC应该有3个分区,分区1存放uboot、分区2存放Linux镜像和设备树、分区3存放rootfs。
但是图中所示只查到了两个分区,这是因为分区0并没有格式化,所以无法识别出来,但是分区0是存在的。
② 查看SD卡的分区
可以看出,此时SD卡只有一个分区,扇区8192-30552064。一般SD卡默认只有一个分区,也就是分区0,但可以手动创建新的分区。
(6)读取mmc设备的数据
mmc read addr blk# cnt
- addr:数据读取到DRAM的地址
- blk:要读取的块起始地址(十六进制),块和扇区是一个意思,一个块512字节
- cnt:要读取的块数量(十六进制)
eg. 从eMMC中第1536(0x600)个块开始,读取16个块(0x10)到DRAM的0x80800000地址处:
读取之后查看DRAM 0x80800000处是否有数据:
这个结果有点离谱,应该是环境变量在eMMC中的存储位置有变化,还不熟,没法定位问题。
(7)向mmc写入数据
mmc write addr blk# cnt
同样,cnt是指要写入的块的数量。
利用此命令,可以在uboot中通过网络下载文件到DRAM中,然后向SD卡或者eMMC中烧录镜像。
提示:千万不能写SD卡或者eMMC的前两个块/扇区,里面保存有分区表。
(8)擦除mmc数据
mmc erase blk# cnt
提示:没事不要轻易擦除mmc设备。
6. FAT格式文件系统操作命令
在uboot中还可以对SD卡或者eMMC中存储的文件进行操作,前提是FAT类型文件系统。
(1)查询指定mmc设备中指定分区的文件系统信息
fatinfo <interface> [<dev[:part]>]
- interface:接口类型,比如mmc
- dev:查询的设备号
- part:查询的分区
eg. 查询eMMC分区1的文件系统信息:
可以看到,eMMC分布1的文件系统为FAT32格式,分区名称boot。
(2)查询FAT格式设备的目录和文件信息
fatls <interface> [<dev[:part]>] [dir]
- interface:接口类型,比如mmc
- dev:查询的设备号
- part:查询的分区
- dir:查询的目录
eg. 查询eMMC分区1的所有目录和文件:
(3)查询指定mmc设备中指定分区的文件系统格式
fstype <interface> <dev>:<part>
eg. 当前eMMC有三个分区(分区0无法识别),查看三个分区的文件系统格式:
可以看到,分区0存放的uboot,没有格式化文件系统,所以无法识别;分区1的格式是fat,用于存放linux镜像和设备树;分区2的格式是ext4,用于存放linux的根文件系统。
(4)将指定的文件读取到DRAM中
fatload <interface> [<dev>:<part> <addr> [<filename>[bytes[pos]]]]
- interface:接口
- dev:设备号
- part:分区号
- addr:要加载的DRAM地址
- filename:文件名称
- bytes:读取多少个字节的数据,为0或省略则读取整个文件(十六进制)
- pos:要读的文件偏移,为0或省略则从文件首地址开始读取
eg. 将eMMC分区1中的zImage文件读取到DRAM中0x80800000处:
可以看出,uboot从emmc中读取了6785480字节的数据,速度为28.6MB/s。
(5)将数据写入文件系统
fatwrite <interface> [<dev>:<part> <addr> <filename> <bytes>
uboot默认不使能fatwrite命令,需要在板子配置文件中通过定义宏
CONFIG_FAT_WRITE
开启。
7. EXT格式文件系统操作命令
uboot有ext2和ext4这两种格式的文件系统操作命令,常用的命令就4个,分别为:
- ext2
- ext2ls
- ext2load
- ext4
- ext4ls
- ext4load
- ext4write
这些命令使用方法与fat类命令基本相同。
eg. 查询eMMC分区2的所有目录和文件:
8. Nand设备操作命令
暂时没有nand的板子,后续补充。
9. 启动常用操作命令
uboot的核心功能是启动linux系统,和启动相关的命令有3个:bootz、bootm、boot。
(1)启动zImage镜像文件
bootz [addr [initrd[:size][fdt]]]
- addr:zImage镜像文件在DRAM中的位置
- initrd:initrd文件在镜像文件在DRAM中的地址,不使用initrd的话用
-
代替即可 - fdt:设备树文件在DRAM中的地址
eg. 通过网络启动linux:
(2)启动uImage镜像文件
不使用设备树:
bootm
使用设备树(和bootz一样):
bootm [addr [initrd[:size][fdt]]]
(3)boot一键启动
boot通过读取环境变量bootcmd来启动linux系统。
eg. 从网络加载启动linux系统:
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000'
saveenv
boot
需要注意:uboot倒计时结束后,也是通过bootcmd参数来启动的,这样修改后,系统每次启动都会从tftp拉取文件!记得恢复为从eMMC中加载!
eg. 从eMMC加载启动linux系统:
setenv bootcmd 'fatload mmc 1:1 80800000 zimage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000'
saveenv
boot
10. 其它常用命令
(1)复位
reset
(2)跳转到DRAM指定地址处执行程序
go addr [arg ...]
(3)运行环境变量中定义的命令
run <cmd>
run命令最大的作用是运行我们自定义的命令,比如切换从emmc和网络启动过于麻烦,我们可以创建一个新的环境变量,不影响bootcmd环境变量的情况下,一条命令从emmc启动:
setenv bootemmc 'fatload mmc 1:1 80800000 zimage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000'
saveenv
run bootemmc
或者,一条命令从网络启动:
setenv boottftp 'tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-10.1-1280x800-c.dtb; bootz 80800000 - 83000000'
saveenv
run boottftp
(4)内存读写测试命令
mteset [start [end [pattern [iterations]]]]
- start:起始地址
- end:结束地址
该命令可以用来简单的测试一些内存设备读写,比如DDR。
eg. 测试0x80000000 - 0x80001000这段内存:
可以看到,已经读写测试了487次,需要按Ctrl+C结束。
以上是关于uboot中打印信息No NAND device found!!! 0Mib啥错误?怎么修改uboot代码的主要内容,如果未能解决你的问题,请参考以下文章