您的位置:首页 > 其它

向nandflash中烧写内核和文件系统的方法

2013-07-24 22:49 302 查看
在RAM开发板上往nandflash烧写内核和文件系统的方法:

一、 在u-boot中烧写文件系统:(其中这里的地址参考具体开发板使用手册中的地址,SBC6345)

a) 在系统启动的时候,u-boot会提示有三秒中停留,敲击回车中断u-boot启动内核的过程,可以使用u-boot的相关命令,擦除nandflash的部分空间,使用命令nand erase 0x9a0000,命令的含义是将nandflash中从0x9a0000开始的所有空间进行擦除

b) 整理nandflash空间,这个步骤可有可无,命令为nand scrub 0x9a0000在出现选择的时候直接点击Y

c) 下载文件系统到内存,使用tftp下载文件系统到内存的某地址,命令为tftp0x70000000 rfs,tftp服务器的搭建和使用可以参考这篇文章,如果下载不成功,可能出现的错误有:tftp服务器没有搭建成功、需要修改文件的读写权限

d) 将下载到内存中的文件系统写入nandflash,命令nandflash write.yaffs 0x700000000x9a0000 filesize 命令中的参数说明,第一个是从内存的某个地址下载,第二个是从nandflash的某个地址开始写,第三个是文件系统的大小。第三个参数通过上一个步骤可以看到,严格按照tftp下载完成后提供的16进制的大小。

上面是举例说明的是从u-boot中烧写文件系统部分,从u-boot中烧写内核的方法和烧写文件系统的方法相似。比如在u-boot中烧写的内核文件为uImage

a) Tftp 0x70000000 uImage 从tftp服务器中下载内核到内存中

b) Nand erase 0x1a0000 0x200000 清除nandflash的空间从0x1a0000到0x3a0000

c) Nand write 0x70000000 0x1a0000 0x200000 从内存中的地址读取内核到nandflash的位置,读取的大小在最后一个参数中。

如果在写入nandflash后,上电启动u-boot不能启动内核,可能的原因有:内核文件不匹配、写入的地址不匹配(这个问题可以参考这篇文章)。遇到这个问题以后,同时还需要启动内核,可以参考的方法就是在u-boot内将uImage下载到内核,直接使用u-boot的go命令来启动内核,然后内核挂载文件系统。

二、 从内核中往nandflash中烧写内核的方法

a) 在内核里面对存放kernel的分区先进行擦除(可以擦除的原因是现在内核已经在内存中,nandflash中的内核已经没有作用了),然后再进行烧写内核文件,具体过程为,先输入cat /proc/mtd 可以看到内核对nand flash的分区信息,然后对内核分区部分进行擦除(例如查看到分区信息中内核的位置在mtd5中):命令flash_eraseall /dev/mtd5

b) 然后将待烧写的内核文件(uImage)拷贝至nfs的根目录下(nfs的安装和使用的方法,参考这篇文章),在终端输入下面命令将内核文件拷贝至nandflash对应的分区,cp /uImage /dev/mtdblock5。完成即代表烧写完毕。为啥是一个mtd5一个是mtdblock5

c) 在上面烧写完毕内核后,需要在uboot里面修改bootcmd来告诉uboot从nandflash启动内核,修改命令为setenv bootcmd 'nand read0x70000000(dest addr) 0x1A0000(存放内核的nand flash偏移地址) 0x200000(要拷贝的内核大小);bootm 0x70000000'

这个是在需要对烧写到nandflash中的内核进行更新的时候使用的方法。

、不同的启动不同的参数设置

1、如果是挂载nfs的话,在u-boot参数设置上的命令如下:

(setenv bootargs 'mem=80M console=ttySAC6,115200n8 root=/dev/nfsnfsroot=192.168.5.122:/home/rfsip=192.168.5.12:192.168.5.122:192.168.5.1:255.255.255.0::eth0:off')

u-boot命令设置setenv bootcmd ‘tftp 0x70000000 uImage;bootm 0x70000000 ‘

2、如果是从nandflash中启动的话,设置参数问题就有所不同,setenvbootargs ‘console=ttySAC6 115200 tft=b root=/dev/mtdblock7 rw rootfstype=yaffs2

u-boot中的命令setenvbootcmd ‘nand read 0x70000000(读到内存中的位置) 0x1a0000(从nandflahs的这个地方开始读取) 0x200000(读取文件的大小)’



解析:文件系统烧写到nandflash中,烧写的地址为0x9a0000,但是内核怎么知道文件系统的地址呢,u-boot传送给内核的,在root/dev/mtdblock7,这个位置就是告诉了文件系统的地址。但是这个地址是内核已经准备好的,所在的目录在内核源代码中/arch/arm/



在将板子的所有东西写到nandflash中,这个时候如果在串口终端上进行查看是看不到内容的(烧写到nandflash中不像是使用nfs挂载文件系统),特别是文件系统,需要将文件系统挂载到某个目录上去。比如:mount /dev/mtdblock5 /mnt/nand 这里假设文件系统在nandflash中是mtdblock5,这样就可以看到写到板子里的文件系统。(但是不知道是不是这样)



在板子上文件系统内的某个程序需要更新,新的程序在nfs的某个目录上。这样就可以使用挂载nfs到板子文件系统的某个目录上 mount –t nfs-0 nolock 192.168.5.122:/home/rfs /mnt/temp将nfs的目录挂载到板子上面。这样就可以在板子上看到虚拟机上的文件系统了。可以从nfs上拷贝东西到板子上,进而更新板子上的代码。(这一点很像上面介绍的更新已将烧写到nandflash中的内核)





其实在u-boot启动之后,在u-boot中还是可以启动u-boot的,比如在u-boot中进行中断,tftp 0x70000000 u-boot-new.bin 使用tftp将u-boot下载到内存中,然后直接执行go 0x70000000 就可以直接执行内存的这个地址,其实这些命令都是u-boot内部支持的,比如展示内存信息的命令 md 清除内存信息的命令 mm等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: