u-boot nandflash 烧写
- 格式:doc
- 大小:92.00 KB
- 文档页数:12
u-boot中NAND Flash操作及烧写芯片内部存储布局及存储操作特点: K9F1208 64MB一片Nand flash为一个设备(device), 其数据存储分层为:1 (Device) = 4096 (Blocks)1 (Block) -= 32 (Pages/Rows) 页与行是相同的意思,叫法不一样1 (Page) = 528 (Bytes) = 数据块大小(512Bytes) + OOB 块大小(16Bytes)根据芯片规格,计算需要擦除的块大小,按上述指令操作,可以升级u-boot。
NAND操作指令指令 Flash内地址擦除长度nand erase 0x100000 0x200000指令内存中地址 Flash内地址写入长度nand write 0x20000000 0x100000 0x200000nand read 0x20000000 0x100000 0x200000注意写入长度的计算,要以块为单位,计算字节数量。
如:u-boot.bin大小为:114028 bytes一个NAND数据块的容量:32 ×512 = 16384 bytes需要擦除NAND数据块的数量:114028÷16384 = 6.96 ≈ 7 (往上取整)转为擦除NAND数据的长度:16384 ×7 = 114688 bytes (十进制)=0x1_C000 写入以页page为单位,一页大小为512B如何升级bootloader(以下以烧写u-boot.bin为实例)1、用tftp下载u-boot.bin到内存,如0x3300_0000tftp 33000000 u-boot.bin2、擦除uboot分区1Mnand erase 0x0 0x00100000 // 1M的bootloader分区3、写入NAND中nand write 0x33000000 0x0 0x1C000 // u-boot.bin实际大小需用的block (注:如果板子为空白,用sjf2410工具,通过并口,烧写到NAND的0x0地址即可)如何烧写linux kernel1、 tftp下载uImage2.6.14到内存,如0x3400_0000tftp 34000000 uImage2.6.142、擦除kernel分区3Mnand erase 00100000 003000003、写入NAND中nand write 34000000 00100000 00300000如何烧写文件系统fs4、 tftp下载rootfs.cramfs到内存,如0x3400_0000tftp 34000000 rootfs.cramfs5、擦除root分区40Mnand erase 00400000 028000006、写入NAND中nand write 34000000 00400000 (实际大小,往前取512B的整数倍)奇怪,3400_0000已经是64M内存的上限边界,为什么居然还可以使用??2011-5-17 yang 好像3400_0000已经自动映射到 3000_0000的。
u-boot 启动内核的命令设置启动参数(仅供格式参考,参数是不对的)setenv bootargs root=1f02 init=/linuxrc console=ttySAC0,115200 devfs=mountsetenv bootcmd nand read 0x30007fc0 0x40000 0x1c0000\;bootm 0x30007fc0第二行是必要的,第一行我没设置也行,可能是内核中已经设置了这个参数。
第二行中,符号:\ 是必要的,否则设置命令出错,可能要将整个命令加双引号括起来才行。
内核分区空间:Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit":0x00000000-0x00080000 : "Bootloader"0x00080000-0x00280000 : "Linux Kernel"0x00280000-0x00680000 : "Root File System"0x00680000-0x04000000 : "User Space"烧写u-boot:tftp 0x30008000 u-boot.binnand erase 0x0 0x80000nand write 0x30008000 0x0 0x80000烧写内核:tftp 0x30008000 uImagenand erase 0x80000 0x200000nand write 0x30008000 0x80000 0x200000烧写文件系统:tftp 0x30008000 root.cramfsnand erase 0x280000 0x400000nand write 0x30008000 0x280000 0x400000用uboot 烧写uboot linux内核文件系统到nandflash的过程以及bootm go命令启动与区别分类:linux网络驱动2013-01-08 10:19 91人阅读评论(0) 收藏举报下面的转自/s/blog_6b94d5680100nd48.html文章结构结构顺序有变化-1:烧写uboot0: bootargs bootcmd 命令参数的设置1:制作yaffs2的过程2:烧写yaffs2的过程3:制作uimage 的过程4: 烧写uiamge的过程5:uimage zimage vmlinux 的区别6: uboot传递给内核的参数结构tag7:bootm go 的启动过程以及区别8:加载地址入口地址等///////////////////通过uboot烧写uboot到nandflash///////////////////////////nand erase 0 50000//////////////tftpboot 30008000 u-boot.bin/////Loading: T ##################doneBytes transferred = 257164 (3ec8c hex)[u-boot@MINI2440]# nand write 0x30008000 0 3f000//////////////nand write 0x30008000 0 3f000( 3ec8c最靠近2K整数倍的值)///////////////////通过uboot烧写内核到nandflash/////////////先查看你自己板子的nandflash分区表通过实例分析:下面的烧写内核出错[u-boot@MINI2440]# tftpboot 30008000 uImagedm9000 i/o: 0x20000300, id: 0x90000a46DM9000: running in 16 bit modeMAC: 08:08:11:18:12:27operating at 100M full duplex modeUsing dm9000 deviceTFTP from server 192.168.0.100; our IP address is 192.168.0.10Filename 'uImage'.Load address: 0x30008000Loading: T ################################################################# ###########################################################################################doneBytes transferred = 2287128 (22e618 hex)[u-boot@MINI2440]# nand erase 0x60000 0x500000NAND erase: device 0 offset 0x60000, size 0x500000Erasing at 0x54000002800000 -- 0% complete.OK[u-boot@MINI2440]# nand write 0x30008000 0x60000 22e618NAND write: device 0 offset 0x60000, size 0x22e618Attempt to write non page aligned data2287128 bytes written: ERROR下面的烧写正确:NAND erase: device 0 offset 0x80000, size 0x500000Erasing at 0x54000002800000 -- 0% complete.OK[u-boot@MINI2440]# nand write 0x30008000 0x80000 22e800NAND write: device 0 offset 0x80000, size 22e800改了两个地方:1:0x60000 ->0x800002:0x22e618 ->22e800修改的原因是:1:从0x60000檫除会把bootargs bootcmd 也给檫除了所以选择从0x80000开始檫除2:0x22e618 虽然是通过tftpboot下载的内核的实际大小,但是这里是write指令后面的参数是指明要檫写的长度檫写长度要求是2k(2048)的整数倍(也就是整页整页的檫除)而0x22e618 不是2K的整数倍,出现错误Attempt to write non page aligned data 2287128 bytes written: ERROR ,于是取一个最靠近的数就选择了22e800 就OK乐/////////////////////设置自启动参数bootcmd///////////////////我刚开始时是这样写的:setenv bootcmd nand read 30008000 80000 22e800 ; bootm 30008000按确定后直接执行了bootm这个命令于是改了:setenv bootcmd nand read 30008000 80000 22e800 \; bootm 30008000 就OK了/////////////////////下载yaffs2映像到nandflash中/////////////////////////生产yaffs2 以及工具请可以参考Tekkaman Ninja 的文件uboot 烧写yaffs2文件系统方法是类似于内核的烧写先查看你自己板子的nandflash分区表( 比如128M的板子128M ->8000000 檫写地址是从0x580000开始所以两个相减等于7a80000 而我的是256M的前面的内核是从0x80000开始的檫除了0x500000 长度所以这里文件系统从0x580000 开始结束到nandflash的结束 )128M先察除:nand erase 0x580000 7a80000再写:nand write.yaffs 30008000 0x580000 dbb040(文件系统的大小,而这里文件系统不像内核一样烧写长度不是2K的整数倍我不确定我从网络上找到的答案是否是对的,自己也没有去查证:用mkyaffs2image 生成的文件系统在2K数据对齐的问题上已经采取了对齐措施用户不用在考虑数据对齐的问题,而mkimage等工具没有采用对齐措施所以是要注意)256M:先察除:nand erase 0x580000 FA80000再写:nand write.yaffs 30008000 0x580000 dbb040///////////设置bootargs参数////////////////////////////////////1:如果用yaffs2文件系统setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M2:如果用NFS文件系统setenv bootargs noinitrd root=/dev/nfs rw nfsroot= 192.168.0.100 :/ home/lq/rootfs ip=192.168.0.10 console=ttySAC0 mem=64M///////////////bootatgs 参数解析/////////////////////////root用来指定rootfs的位置,常见的情况有:root=/dev/ram rwroot=/dev/ram0 rw请注意上面的这两种设置情况是通用的,我做过测试甚至root=/dev/ram1 rw和root=/dev/ram2 rw也是可以的,网上有人说在某些情况下是不通用的,即必须设置成ram或者ram0,但是目前还没有遇到,还需要进一步确认,遇到不行的时候可以逐一尝试。