NAND flash 文件系统制作
?
BeagleBoardNANDSoftware以下的部分软件可以存储和从NAND启动/运行:
这些软件在beagleboard上的存储分配如下: ------------------------------------- 0x00000000-0x00080000?: "X-Loader" 0x00080000-0x00260000?: "U-Boot" 0x00260000-0x00280000?: "U-Boot Env" 0x00280000-0x00680000?: "Kernel" 0x00680000-0x10000000?: "File System" ------------------------------------- 为了能够写东西到nandflash,首先你需要从其他源,如MMC/SD卡启动。此外,你需要把那些从MMC/SD卡启动的文件(MLO & U-Boot),写进MMC/SD卡得第一个分区。然后你可以在那里读取到这些文件和写入到NAND。 X-Loader编译x-loader。放到MMC/SD卡的FAT分区,然后开始从存储卡中的引导和使用下面的命令写x-loader到NAND: ------------------------------------- mmc init fatload mmc 0:1 80000000 x-load_revc_v3.bin.ift nand unlock nandecc hw nand erase 0 80000 nand write 80000000 0 80000 ------------------------------------------ 注:命令nandecc hw 在这里是必须的。x-loader是OMAP引导ROM的第一段程序。在读NAND的时候,使用命令nandecc hw 。所以,在写NAND时,同样使用使用命令nandecc hw 。如果你不使用nandecc hw 将不能从NAND 引导ROM。 U-Boot编译U-Boot。放到MMC/SD卡的FAT分区,然后开始从存储卡中的引导和使用下面的命令写U-Boot到NAND: ------------------------------------- mmc init fatload mmc 0:1 80000000 u-boot.bin nand unlock nandecc sw nand erase 80000 160000 nand write 80000000 80000 160000 ------------------------------------- 注意:你可以使用引导MMC/SD卡启动的u-boot.bin来引导NAND启动。他们之间没有区别。 注意:这儿,你不需要nandecc hw选项。X-loader用于加载和引导u-boot,能够识别u-boot写入的SW ECC。 Kernel相比于只能通过u-boot写入NAND的x-loader和u-boot,这里有两种方法将kernel和file system写入NAND:通过u-boot(与上面的x-loader和u-boot相似) 或者从运行中的内核(比如,从MMC卡引导)。 注意:x-loader和u-boot不能从运行中得内核中写入,因为从内核的角度, x-loader和u-boot的NAND分区是标记为只读的。 Writing kernel with U-Boot------------------------------------- mmc init fatload mmc 0:1 80000000 uImage nandecc sw nand erase 280000 400000 nand write 80000000 280000 400000 ------------------------------------- 当做了上述工作之后,使用U-Boot命令从NAND引导kernel (uImage): nand read 80000000 280000 400000?; bootm 80000000 这里,你可以保存U-Boot命令,这样你的板子就可以自动的从NAND引导uImage。 Writing kernel with kernel当你有一个内核启动了,比如:从MMC卡。你可以使用该内核去写自己的kernel (uImage)去NAND。然后从MMC卡启;动切换到NAND卡启动。对于这一点,观察内核的引导信息。这些应该是这样的: ------------------------------------- omap2-nand driver initializing NAND device: Manufacturer ID: 0x2c,Chip ID: 0xba (Micron NAND 256MiB 1,8V 16-bit) cmdlinepart partition parsing not available Creating 5 MTD partitions on "omap2-nand": 0x00000000-0x00080000?: "X-Loader" 0x00080000-0x00260000?: "U-Boot" 0x00260000-0x00280000?: "U-Boot Env" 0x00280000-0x00680000?: "Kernel" 0x00680000-0x10000000?: "File System" ------------------------------------- 在内核的提示命令 cat /proc/mtd 下会给出类似的输出信息: ------------------------------------- root@beagleboard:~# cat /proc/mtd dev:??? size?? erasesize? name mtd0: 00080000 00020000 "X-Loader" mtd1: 001e0000 00020000 "U-Boot" mtd2: 00020000 00020000 "U-Boot Env" mtd3: 00400000 00020000 "Kernel" mtd4: 0f980000 00020000 "File System" ------------------------------------- 虽然前三个分区(x-loader,u-boot和u-boot Env),从内核的角度查看是只读的。但是kernel和file system 分区对于内核本身来说是可写的。要做到这一点,你需要有MTD用户模块在你的内核根文件系统里。 在这个例子中,我们挂在MMC卡得FAT分区去读kernel(uImage)。如果你的内核有网络连接,你可以使用此。或者把uImage放在你的根文件系统。这样做的目的是能够从正在运行的内核中将uImage写入到NAND。 ------------------------------------- root@beagleboard:~# mkdir -p /mnt/fat root@beagleboard:~# mount /dev/mmcblk0p1 /mnt/fat/ root@beagleboard:~# ls -la /mnt/fat -rwxr-xr-x??? 1 root???? root??????? 16740 Jul? 7 17:28 mlo -rwxr-xr-x??? 1 root???? root?????? 717116 Jul 24? 2008 u-boot.bin -rwxr-xr-x??? 1 root???? root????? 2106940 Jul 26? 2008 uImage root@beagleboard:~# cp /mnt/fat/uImage . root@beagleboard:~# ls -la -rwxr-xr-x??? 1 root??? ?root????? 2106940 Jul 22 00:30 uImage root@beagleboard:~# flash_eraseall /dev/mtd3 Erasing 128 Kibyte @ 3e0000 -- 96?% complete. root@beagleboard:~# nandwrite -p /dev/mtd3 uImage Writing data to block 0 at offset 0x0 <...> Writing data to block 20 at offset 0x280000 root@beagleboard:~# ------------------------------------- File system与内核一样,相比于只能通过u-boot写入NAND的x-loader和u-boot,这里有两种方法将file system写入NAND:通过u-boot(与上面的x-loader和u-boot相似) 或者 从运行中的内核(比如,从MMC卡引导)。很多用户反映,他们在用u-boot写根文件系统时遇到了问题。主要的问题是,u-boot必须格式化内核去写file system。如果有轻微的不兼容,内核将不能读取到被u-boot写入的文件系统。 所以,我们在这里记录了如何去用u-boot写入文件系统。推荐的方法是通过内核本身去写根文件系统。有了这个,可以确保用内核写入一个文件系统,稍后能够读取到。 Writing file system with U-Boot该方法不推荐,原因见上。 ------------------------------------- OMAP3 beagleboard.org # mmc init OMAP3 beagleboard.org # fatload mmc 0:1 80000000 rootfs.jffs2 reading rootfs.jffs2 12976128 bytes read OMAP3 beagleboard.org # nand unlock device 0 whole chip nand_unlock: start: 00000000,length: 268435456! NAND flash successfully unlocked OMAP3 beagleboard.org # nandecc sw OMAP3 beagleboard.org # nand erase 680000 F980000 NAND erase: device 0 offset 0x680000,size 0xf980000 Erasing at 0xffe0000 -- 100% complete. OK OMAP3 beagleboard.org # nand write.jffs2 80000000 680000 ${file_size} NAND write: device 0 offset 0x680000,size 0xc60000 Writing data at 0x12df800 -- 100% complete. 12976128 bytes written: OK ------------------------------------- Writing file system with kernel推荐该方法。 首先,我们用SD卡上的根文件系统启动内核。在正在运行的内核中,用SD卡上的文件系统映像把根文件系统写入到Beagle的NAND上去。在这些做完之后,我们切换内核的启动参数去从NAND上执行根文件系统来替代SD卡得根文件系统。 然后,为了能够从内核的用户空间去操纵/擦除/写NAND,我们需要MTD Utils。如果你没有这个工具,你可以通过该方法获取:opkg install mtd-utils 对于在Beagle’s NAND 中的文件系统,我们使用JFFS2。JFFS2是标准的git内核的一部分,只需要配置内核使能JFFS2。使用make menuconfig检查是否已启用。 ------------------------------------- CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y ------------------------------------- 在内核支持JFFS2和MTD Utils后,我们先擦除文件系统分区并在该分区中创建JFFS2。 ------------------------------------- root@beagleboard:~# cat /proc/mtd dev:??? size?? erasesize? name mtd0: 00080000 00020000 "X-Loader" mtd1: 001e0000 00020000 "U-Boot" mtd2: 00020000 00020000 "U-Boot Env" mtd3: 00400000 00020000 "Kernel" mtd4: 0f980000 00020000 "File System" root@beagleboard:~# flash_eraseall -j /dev/mtd4 Erasing 128 Kibyte @ f960000 -- 99?% complete. Cleanmarker written at f960000. ------------------------------------- 然后,我们可以挂载文件系统分区: ------------------------------------- root@beagleboard:~# cd /mnt root@beagleboard:~# mkdir nand root@beagleboard:~# mount -t jffs2 /dev/mtdblock4 /mnt/nand ------------------------------------- 并提取到他的根文件系统映像: ------------------------------------- root@beagleboard:~# cd nand root@beagleboard:~# tar xfz <where_ever_your_root_fs_image_is_at_sd_card>/rootfs.tar.gz . ... wait ... root@beagleboard:~# cd .. root@beagleboard:~# sync root@beagleboard:~# umount nand ------------------------------------- 现在,你应该重启你的主板并在u-boot中编辑启动参数去配置在NAND中的根文件系统。 ------------------------------------- root=/dev/mtdblock4 rootfstype=jffs2 ------------------------------------- (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |