zehn_w 发表于 2012-06-28 10:55

如何给nand flash分区

本帖最后由 zehn_w 于 2012-07-03 16:12 编辑

开发板是dm3730
想要给nand flash分区存放备份。
做法:
修改内核源码中 arch/arm/mach-omap2/borad-omap3stalker.c/*nand
**------------------------------------------------------------------------------
*/
static struct mtd_partition omap3stalker_nand_partitions[] = {
       /* All the partition sizes are listed in terms of NAND block size */
       {
               .name         = "X-Loader",
               .offset         = 0,
               .size         = 4*(SZ_128K),
               .mask_flags   = MTD_WRITEABLE
       },
       {
               .name         = "U-Boot",
               .offset         = MTDPART_OFS_APPEND,
               .size         = 15*(SZ_128K),
               .mask_flags   = MTD_WRITEABLE
       },
       {
               .name         = "U-Boot Env",
               .offset         = MTDPART_OFS_APPEND,
               .size         = 1*(SZ_128K)
       },
       {
               .name         = "Kernel",
               .offset         = MTDPART_OFS_APPEND,
               .size         = 32*(SZ_128K)
       },
       {
               .name         = "File System",
               .offset         = MTDPART_OFS_APPEND,
               .size         = 1*(SZ_64M),
       },

       /* 添加部分 */
       {
               .name         = "Backup File System",
               .offset         = MTDPART_OFS_APPEND,
               .size         = MTDPART_SIZ_FULL,
       },
};
重新编译并烧写

设置uboot参数:setenv mtdparts 'mtdparts=nand:512k(x-loader),1920k(u-boot),128k(u-boot-env),4m(kernel),64m(fs),-(fs2)'重新启动失败,错误提示:[   12.645446] UBIFS error (pid 1): ubifs_get_sb: cannot open "ubi0:rootfs", error -19
[   12.653228] VFS: Cannot open root device "ubi0:rootfs" or unknown-block(0,0)
[   12.660339] Please append a correct "root=" boot option; here are the available partitions:
[   12.668823] 1f00             512 mtdblock0 (driver?)
[   12.673828] 1f01            1920 mtdblock1 (driver?)
[   12.678863] 1f02             128 mtdblock2 (driver?)
[   12.683837] 1f03            4096 mtdblock3 (driver?)
[   12.688873] 1f04         65536 mtdblock4 (driver?)
[   12.693847] 1f05          189952 mtdblock5 (driver?)
[   12.698883] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
求指导!

zehn_w 发表于 2012-07-03 15:21

本帖最后由 zehn_w 于 2012-09-24 13:44 编辑

重新再次还原       {
               .name         = "File System",
               .offset         = MTDPART_OFS_APPEND,
               .size         = 1*(SZ_64M),
       },在之前的错误之上,发现如下错误:[   11.231201] omap2-nand driver initializing
[   11.235565] NAND device: Manufacturer ID: 0x2c, Chip ID: 0xba (Micron NAND 25                                                                                                6MiB 1,8V 16-bit)
[   11.244445] Creating 6 MTD partitions on "omap2-nand.0":
[   11.249816] 0x000000000000-0x000000080000 : "X-Loader"
[   11.256561] 0x000000080000-0x000000260000 : "U-Boot"
[   11.263366] 0x000000260000-0x000000280000 : "U-Boot Env"
[   11.269836] 0x000000280000-0x000000680000 : "Kernel"
[   11.277465] 0x000000680000-0x000004680000 : "File System"
[   11.307373] 0x000004680000-0x000010000000 : "Backup File System"
[   11.383666] UBI: attaching mtd4 to ubi0
[   11.387603] UBI: physical eraseblock size:   131072 bytes (128 KiB)
[   11.393920] UBI: logical eraseblock size:    129024 bytes
[   11.399383] UBI: smallest flash I/O unit:    2048
[   11.404174] UBI: sub-page size:            512
[   11.408813] UBI: VID header offset:          512 (aligned 512)
[   11.414703] UBI: data offset:                2048
[   11.538208] UBI error: ubi_read_volume_table: the layout volume was not found
[   11.545654] UBI error: ubi_init: cannot attach mtd4
[   11.551055] UBI error: ubi_init: UBI error: cannot initialize UBI, error -22
另发现直接设置内核目录中的mtd分区信息就可以实现分区,无需配置(u-boot-env)mtdparts参数。

请问:
a.内核目录中的mtd分区信息和u-boot中的mtdparts关系是什么?
b.mtd分区对于相关参数有什么限制?

zehn_w 发表于 2012-07-03 16:10

在u-boot源码目录中include/asm-genric/errno.h
查找错误码:#define ENODEV          19      /* No such device */
#define EINVAL          22      /* Invalid argument */看出应该是参数设置错误,导致找不到ubifs
我的u-boot参数如下:
bootcmd=if mmc init; then if run loadbootscript; then run bootscript; else if run loaduimage; then run mmcboot; else run nandboot; fi; fi; else run nandboot; fi
bootdelay=3
baudrate=115200
netmask=255.255.255.0
bootfile=uImage
loadaddr=0x82000000
console=ttyS0,115200n8
vram=12M
dvimode=1024x768MR-16@60
defaultdisplay=dvi
mpurate=600
boardmodel=EVM35X-B3-1880-LUNC0
mmcroot=/dev/mmcblk0p2 rw
mmcrootfstype=ext3 rootwait
nandroot=ubi0:rootfs ubi.mtd=4
nandrootfstype=ubifs
mmcargs=setenv bootargs console=${console} vram=${vram} omapfb.mode=dvi:${dvimode} omapfb.video_mode=dvi:${dvimode} omapdss.def_disp=${defaultdisplay} omap-dss.def_disp=${defaultdisplay} root=${mmcroot} init=/init mpurate=${mpurate} boardmodel=${boardmodel} rootfstype=${mmcrootfstype}
loadbootscript=fatload mmc 0 ${loadaddr} boot.scr
bootscript=echo Running bootscript from mmc ...; source ${loadaddr}
loaduimage=fatload mmc 0 ${loadaddr} uImage
mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
ethaddr=02:0d:03:02:00:0a
dieid#=058400029e3800000163810d0302000a
ethact=smc911x-0
ipaddr=192.168.0.110
serverip=192.168.0.111
gatewayip=192.168.0.1
mtdids=nand0=nand

stdin=serial
stdout=serial
stderr=serial
bootargs=console=ttyS0,115200n8 vram=12M omapfb.vram=0:12M omapfb.mode=dvi: omapdss.def_disp=tv root=ubi0:rootfs ubi.mtd=4 rw init=/init mpurate=1000 rootfstype=ubifs rootwait boardmodel=SBC3730-A1-2990-LUAC0 mem=54M@0x80000000 mem=128M@0x88000000
nandargs=bootargs
mtdparts=mtdparts=nand:512k(x-loader),1920k(u-boot),128k(u-boot-env),4m(kernel),64m(fs),-(backupfs)

daniel_kohler 发表于 2012-07-04 00:54

本帖最后由 daniel_kohler 于 2012-07-04 00:54 编辑

回复 2# zehn_w


    1. U-Boot的分区会被Linux的分区覆盖掉的,
    2. 参数没有特定的限制,只要不相互覆盖,不超出flash的大小就行了。

zehn_w 发表于 2012-07-04 11:52

本帖最后由 zehn_w 于 2012-07-04 11:57 编辑

回复 4# daniel_kohler

RE 1:mtdparts在何种情况下是有意义的呢?(影响到mtd设置)
RE 2:尝试发现文件系统分区分配的大小是有最小限制的(必须大于最小的某个值),这个有说明文档么?或是否了解?


   

daniel_kohler 发表于 2012-07-05 01:11

本帖最后由 daniel_kohler 于 2012-07-05 01:15 编辑

回复 5# zehn_w


    RE, RE 1:mtdparts这个参数在u-Boot设置后,kernel start时会按照这个参数进行MTD分区;
    RE, RE 2:要看你使用的是什么格式的文件系统了,每个文件系统都会留有一个最小的空间给自己。

zehn_w 发表于 2012-07-05 11:31

本帖最后由 zehn_w 于 2012-07-05 11:33 编辑

回复 6# daniel_kohler
最后的分区结果依然依据内核的分区表来完成。但是mtdparts参数即使和内核中的分区表不一致,也不会造成冲突吗?之前说会被内核分区所覆盖,有点矛盾啊。
是不是这样理解的,内核启动后根据mtdparts进行分区,如果分析参数不一样,内核会根据自己的分区信息覆盖掉mtdparts。
这样的话,麻烦指点一下这部分代码在哪个文件里?


   

daniel_kohler 发表于 2012-07-05 12:27

回复 7# zehn_w


    kernel3.5.2 , driver/mtd/cmdlinepart.c ,line 376;

zehn_w 发表于 2012-07-05 14:41

daniel_kohler 发表于 2012-07-05 12:27 static/image/common/back.gif
回复 7# zehn_w




感谢!
页: [1]
查看完整版本: 如何给nand flash分区