广东快3>WIKI库>学习嵌入式>嵌入式nand命令使用

嵌入式nand命令使用



Uboot下nand命令使用总结


广东快3接下来我们来看一下关于uboot的下一个命令叫做nand命令,那么nood命令应该是uboot提供给我们程序员烧写或者是修改nandflash这个设备的命令集合,这个命令的使用方法先简单总结一下,它的使用方法比较统一,就是格式是统一的不管在什么情况下,它的命令是一样。


首先nand作为命令的关键词后面跟的是一个动词,这个动词其实就三个:


nand1.png


广东快3如图,第一个就是erase是擦除的意思然后第二个write就是写的意思第三个read就是读的意思。所以说这是nandflash是三大比较常规的命令,当然还有些其他的比如说我们后面可能会用到的一些比较特殊的写到nandflash中还涉及到一些数据等等。


动词是比较常用的,然后动词后面的第一个词应该是我们的内存地址,对于我们这个动词如果是读和写的话,那么第一列就是内存地址。内存地址就是我们数据员是从内存地址来的。比如写,就是把内存地址写过去也就是从内存去搬出去,然后读就是把nandflash的内容读到内存中,这个内存地址你不能认为它是源或者是目的,反正它第一个就是内存地址,那具体这个内存地址是源还是目的要看你的动词来决定。等一下我们边写可以边看,它这个使用他这个使用跟我们普通命令不太一样,然后第二个地址,就是一个内存地址后面就是我们的flash地址,也就是“nandflash的内部地址”然后最后一个因为我们说的数据搬移三要素目的地、原地址和大小,那么这就是我们所说的搬移大小。


广东快3那么这样的话就构成我们nandflash的一个比较常用的使用方法。举几个例子,比如说我们要把nandflash中第五兆的数据块读到内存中,那你看我该怎么写呢?


广东快3比如说我们先模拟一下“nand中5M空间读到内存21000000,1k”要把“nand中5M空间读到21000000这样一个地址中,读到1k,这个时候我们要怎样去构建这个命令。输入命令“nand read 21000000 500000 1024”nand后跟read(因为我们是读),read后面跟的是内存地址(21000000),然后记住上面是nandflash中的5M,因为在很多场合中在嵌入式开发中就需要我们的程序员完成我们平时所说的搬移到哪些量,然后用我们计算机能理解的地址去表达出来,像5M这样一个比较特殊的符号,我希望大家能够记住:


nand2.png


广东快3如图,5M我们说它是5*1M这样表示的,而1M刚好是2的20次方2,而2的20次方是1M那么就代表1后面有20个零,所以说我们一般情况下不会这么写,因为二进制写的太长了,所以我们会把它转化为十六进制,而1后面20个零我们转化成十六进制就是四五二十,因为四个二进制等于一个十六进制所以变为了0x10000,这就是1M,那么5M就是5*这个值,然后后面的1k等于1024。


所以我们输入的命令就是输“nand read 21000000 500000 1024”这个部分就是nand的一个简单使用。然后如果说我现在想把动词变了,也就是说nand想把内存中的这个值写到5M空间,那么一样的输入命令“nand write 21000000 500000 1024”命令中的write是目的,目的还是一样,虽然我们的目的是把内存中的这个值写到5M空间,但是还是不能先写5M还是跟之前一样先写内存地址,然后在是flash的地址,所以这些其实就是地址的问题,具体是作为原还是目的这个不好说。


然后在提一点就是nandflash在物理上有一个特性就是说你真正要去用这块空间的时候,一般情况下,都需要给他进行了一个初始化,所谓的初始化,就是要把它擦除。擦完之后我们才能写的进去,因为你不擦的话,我们可能在某些bit位的物理结构中他可能做不到。所以说我们一般在write之前,一定要做一个erase也就是擦除的动作,那么擦除这个命令跟read write稍微有一点不一致。他命令的形式就是擦除谁,因为他的目的就是擦的目的,所以跟内存没有太大的关系,所以这个内存地址就相当于没有了,直接跟noodflash的内存地址和搬移大小,所以像我们刚才说的那个秘密在执行write之前一定要先执行一下erase,然后再看一下怎么做,输入命令“nand erase 500000 1024”,先擦除5M也就是500000然后擦1024,虽然说是擦1024,但是实际上在我们程序内部会在1024这个地方做判断。


因为擦除一般来说都有一个最小单位,因为nandflash的内部结构等我们学到flash驱动的时候你可以看flash的内部结构实际上是按页或者按块来分的,所以实际上我们这个时候不是按照bit来分的,就是你不会一个bit一个bit去操作而是最小一个页一个页操作或者是一个块一个块的来操作,所以在1024这个地方最终会转化成第几块或第几页这样的一个信息。



演示


广东快3以上就是我们nand一个基本的命令使用,接下来我们来演示一下这些命令的使用,大家下来也可以去试验一下。


还是一样我们想要演示这个命令还需要借助内存的东西,就或者我们在以后uboot开发时要测试一下这个nand到底对没对。我们最常用的做法就是先写一段数据,然后把这个数据在内存中表示出来,然后通过这个write把内存里的东西写进去,然后写完过后,我们再想办法把它读出来,读完之后我们再看一下,读的内容跟我们之前写的内容是不是一致的,如果是一致的,就没有问题。所以这就是我们关于nand的基本测试。


广东快3下面我们来看一下这样的一个测试方法,既然要测试那个肯要内存中,的数据进行一个设置,至于怎么做,我们还是要用到之前学习过的tftp方法,也就是说我们先在PC端线构造一段文件,然后再把这样的文件放到我的内存中,然后再把这个内存想办法跟nand命令跟flash进行交互就可以了。


nand3.png


如图,这次上课我们以Linux这个服务端也就是tftp服务端来给大家进行讲解,如果说在Ubuntu搭建服务有问题的同学,你可以先按照Windows下的tftp服务来使用。


广东快3首先来说在我的机器中叫做tftpboot目录存放了一些我们需要共享的数据,也就是需要跟开发板交互的数据,其中有一个文件1.txt我们作为它的数据源,比如我们现在来试验一下,输入命令“vi 1.txt”点击回车后会看到一段数据是“1234567890”然后我们把这段数据作为测试写到flash里面。


nand4.png


广东快3如图,首先要想写数据,第一个方法要在我们的开发板中,使用tftp命令之前第一件事情是先用pri的方法去查看一下我们这个开发板,也就是我们的目标机的一个环境,其中我们可以看到,我这里已经改好的就是

广东快3serverip=192.168.10.110,那么如果你们的机器不是10.110也就是说跟Linux机器环境不一致,那就把它改成对应的网段就可以了。


然后我们输入命令“tftp 200080000 1.txt”我们把改成那个1.txt文件下载下来大家可以看到是十一个字节。


nand5.png


如图,输入命令“md 20008000”点击回车我们就可以看到内存中不是全f了,也就是把内存中的内容进行了一些变换,变换的效果就是1234567890对应的x2码,我们也不用管之前变换的东西,我们现在主要是把变换的东西写到我们noodfla里面。


广东快3至于怎么做?我们这样考虑,比如说nandflash在6M的空间进行烧写。


nand6.png


如图,说到这个空间,我在提一个思路,就是说我们在最后的系统移植成功过后,我们要做的事情实际上就是把最终的结果烧写到flash中,以后你一开机就直接在flash中取数据,就不需要PC主机来做服务了。


广东快3那么现在我们的做法是这样的,一般来说flash的分区(图中大四边形)和我们买的硬盘一样,第一件事情也要分c盘d盘e盘。实际上道理也是一样,flash也会分,一般来说flash最下面的地址(图中大四边形最下面的椭圆)这段地址,我们一般不会把它作为一个通用数据而是一个特殊数据。就是因为我们CPU一上电,他们内部就会有一个事情就是把flash最低端的地址加载但我们内存上运行,所以说这一段地址里面存的东西一定要是可执行程序,或者是我们需要他干的事情。那么这个事情实际上就是bootlod。那我们这个地方实际上是放的uboot,放了uboot后uboot在我们flash中其实在紧挨uboot真正的二进制文件的前面(也就是椭圆形上面的长方形)会安排一个区域,这个区域会存放我们保存环境变量的一些值,以后我一开机就可以从这个地方把这个数据取出来,所以这就是相当于一个磁盘的感觉所以说顾名思义我们在测试flash不小心写到零地址上就肯定是不行的,因为写完之后我们的uboot就烧坏了,烧坏了系统就肯定启不来,所以我们还是建议你做的这个设计明白了,这样的数据放在高地址上(图最上方的长方形)一般来说,像咱们的这个flash有128M,然后你就直接把他放在我们的高地址上。


然后我们来试验一下,我们放之前还是先做擦除如下图:


nand7.png


如图,我们输入命令“nand erase 600000 2048”我们把它擦到6M这里,然后我们擦2k,然后点击回车键,然后我们再把数据写回去,输入命令“nand  write 20008000 600000 2048”就相当于把刚才在内存中的部分写进去。点击回车键,这样就代表我们已经写完了,但是写完过后我们还需要验证。


广东快3如果有些同学现在没有断电或者是没有重启那么很有可能会在内存中有临时的之前的内容,所以我们现在重启一下,然后重启过后我们输入命令“md 20008000”就会发现已经没有之前的内容,整个内存存放的就是原始的数据。


nand8.png


广东快3如图,输入命令“nand read 20008000 600000 2048”把它读进去,然后点击回车键,读完之后我们在输入命令“md 20008000”就会发现里面的内容1234567890就出来了,所以这样的话,我们通过这个命令的熟悉知道我们在测试完我们整个环境就比如我们的内核、文件系统过后最终肯定要把它放到我们的开发板上才能运行起来。


广东快3在这个过程中我们其实就可以利用nand命令来跟我们的开发板进行交互。


以上就是关于nand命令的基本使用方法。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

分享到:

目录