嵌入式Linux--U-Boot(五)NAND命令使用

NAND Flash操作命令

 uboot 是支持 NAND Flash 的,所以也有 NAND Flash 的操作命令,前提是使用的 NAND 版本的核心板,并且编译 NAND 核心板对应的 uboot,然后使用 imxdownload 软件将 u-boot.bin 烧写到 SD 卡中,最后通过 SD 卡启动。
 一般情况下 NAND 版本的核心板已经烧写好了 uboot、linux kernel 和 rootfs 这些文件,所以可以将 BOOT 拨到 NAND,然后直接从 NAND Flash 启动即可。

NAND 版核心板启动信息如:

在这里插入图片描述可以看出,当前开发板的 NAND 容量为 512MiB。输入“? nand”即可查看
NAND 相关命令,如下:

在这里插入图片描述可以看出,NAND 相关的操作命令少。

1、nand info命令

此命令用户打印 NAND Flash 信息,输入“nand info”,结果如图 30.4.8.3 所示:

在这里插入图片描述从上面给出了 NAND 的页大小、OOB 域大小,擦除大小等信息。可以对照着所使用的 NAND Flash 数据手册来查看一下这些信息是否正确。

2、nand device命令

 nand device命令用于切换 NAND Flash,如果你的板子支持多片 NAND 的话就可以使用此命令来设置当前所使用的 NAND。这个需要你的 CPU 有两个 NAND 控制器,并且两个 NAND 控制器各接一片 NAND Flash。就跟 I.MX6U 有两个 SDIO 接口,这两个 SDIO 接口可以接两个 MMC设备一样。不过一般情况下 CPU 只有一个 NAND 接口,而且在使用中只接一片 NAND。

3、nand erase命令

 nand erase 命令用于擦除 NAND Flash,NAND Flash 的特性决定了在向 NAND Flash 写数据之前一定要先对要写入的区域进行擦除。“nand erase”命令有三种形式:

nand erase[.spread] [clean] off size //从指定地址开始(off)开始,擦除指定大小(size)的区域。
nand erase.part [clean] partition  //擦除指定的分区
nand erase.chip [clean] //全篇擦除

 NAND 的擦除命令一般是配合写命令的,后面讲解 NAND 写命令的时候在演示如何使用“nand erase”。

4、nand write命令

 此命令用于向 NAND 指定地址写入指定的数据,一般和“nand erase”命令配置使用来更新NAND 中的 uboot、linux kernel 或设备树等文件,命令格式如下:

nand write addr off size

 addr 是要写入的数据首地址,off 是 NAND 中的目的地址,size 是要写入的数据大小。

 由于 I.MX6ULL 要求 NAND 对应的 uboot 可执行文件还需要另外包含 BCB 和 DBBT,因此直接编译出来的 uboot.imx 不能直接烧写到 NAND 里面。关于 BCB 和 DBBT 的详细介绍请参考《I.MX6ULL 参考手册》的 8.5.2.2 小节,笔者目前没有详细去研究 BCB 和 DBBT,因此我们不能在 NAND 版的 uboot 里面更新 uboot 自身。除非大家去研究一下 I.MX6ULL 的 BCB 和DBBT,然后在 u-boot.imx 前面加上相应的信息,否则即使将 uboot 烧进去了也不能运行。我们使用 mfgtool 烧写系统到 NAND 里面的时候,mfgtool 会使用一个叫做“kogs-ng”的工具完成BCB 和 DBBT 的添加。

 但是我们可以在 uboot 里面使用“nand write”命令烧写 kernel 和 dtb。先编译出来 NAND版本的 kernel 和 dtb 文件,在烧写之前要先对 NAND 进行分区,也就是规划好 uboot、linux kernel、设备树和根文件系统的存储区域。I.MX6U-ALPHA 开发板的 NAND 分区如下:

0x000000000000-0x000004000000 : "boot"
0x000004000000-0x000006000000 : "kernel"
0x000006000000-0x000007000000 : "dtb"
0x000007000000-0x000020000000 : "rootfs"

 一共有四个分区,第一个分区存放 uboot,地址范围为0x0~0x4000000(共 64MB);第二个分区存放 kernel(也就是 linux kernel),地址范围为 0x4000000~0x6000000(共 32MB);第三个分区存放 dtb(设备树),地址范围为 0x6000000~0x7000000(共 16MB);剩下的所有存储空间全部作为最后一个分区,存放 rootfs(根文件系统)。

 可以看出 kernel 是从地址 0x4000000 开始存放的,将 NAND 版本 kernel 对应的 zImage 文件放到 Ubuntu 中的 tftpboot 目录中,然后使用 tftp 命令将其下载到开发板的 0X87800000 地址处,最终使用“nand write”将其烧写到 NAND 中,命令如下:

tftp 0x87800000 zImage //下载 zImage 到 DRAM 中
nand erase 0x4000000 0xA00000 //从地址 0x4000000 开始擦除 10MB 的空间
nand write 0x87800000 0x4000000 0xA00000  //将接收到的 zImage 写到 NAND 中

 这里我们擦除了 10MB 的空间,因为一般 zImage 就是 6,7MB 左右,10MB 肯定够了,如果不够的话就将在多擦除一点就行了。

 同理,最后烧写设备树(dtb)文件文件,命令如下:

tftp 0x87800000 imx6ull-alientek-nand.dtb //下载 dtb 到 DRAM 中
nand erase 0x6000000 0x100000 //从地址 0x6000000 开始擦除 1MB 的空间
nand write 0x87800000 0x6000000 0x100000  //将接收到的 dtb 写到 NAND 中

 dtb 文件一般只有几十 KB,所以擦除 1M 是绰绰有余的了。

 根文件系统(rootfs)就不要在 uboot 中更新了,还是使用 NXP 提供的 Mfgtool 工具来烧写,因为根文件系统太大!很有可能超过开发板 DRAM 的大小,这样连下载都没法下载,更别说更新了。

5、nand read命令

 此命令用于从 NAND 中的指定地址读取指定大小的数据到 DRAM 中,命令格式如下:

nand read addr off size

 addr 是目的地址,off 是要读取的 NAND 中的数据源地址,size 是要读取的数据大小。比如我们读取设备树(dtb)文件到 0x83000000 地址处,命令如下:

nand read 0x83000000 0x6000000 0x19000

在这里插入图片描述
 设备树文件读取到 DRAM 中以后就可以使用 fdt 命令来对设备树进行操作了,首先设置 fdt的地址,fdt 地址就是 DRAM 中设备树的首地址,命令如下:

fdt addr 83000000

设置好以后可以使用“fdt header”来查看设备树的头信息,输入命令:

fdt header

在这里插入图片描述输入命令“fdt print”就可以查看设备树文件的内容,输入命令:

fdt print

在这里插入图片描述 上图中的文件就是我们写到 NAND 中的设备树文件,至于设备树文件的详细内容我们后面会有专门的章节来讲解,这里大家知道这个文件就行了。

 NAND 常用的操作命令就是擦除、读和写,至于其他的命令大家可以自行研究一下,一定不要尝试全片擦除 NAND 的指令!!否则 NAND 就被全部擦除掉了,什么都没有了,又得重头烧整个系统。

已标记关键词 清除标记
相关推荐
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除,从账户中取出amt,如果amt>账户余额抛出异常,一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件,演示Address EJB的实现 ,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB。 EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求。例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三,你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节   通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件,简单。 java模拟掷骰子2个 1个目标文件,输出演示。 java凭图游戏 一个目标文件,简单。 java求一个整数的因子 如题。 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从文件中得到公钥编码的字节数组、如何从字节数组解码公钥。 Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输   Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页