免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14607 | 回复: 8
打印 上一主题 下一主题

[操作系统] 如何给nand flash分区 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-28 10:55 |只看该作者 |倒序浏览
本帖最后由 zehn_w 于 2012-07-03 16:12 编辑

开发板是dm3730
想要给nand flash分区存放备份。
做法:
修改内核源码中 arch/arm/mach-omap2/borad-omap3stalker.c
  1. /*nand
  2. **------------------------------------------------------------------------------
  3. */
  4. static struct mtd_partition omap3stalker_nand_partitions[] = {
  5.        /* All the partition sizes are listed in terms of NAND block size */
  6.        {
  7.                .name           = "X-Loader",
  8.                .offset         = 0,
  9.                .size           = 4*(SZ_128K),
  10.                .mask_flags     = MTD_WRITEABLE
  11.        },
  12.        {
  13.                .name           = "U-Boot",
  14.                .offset         = MTDPART_OFS_APPEND,
  15.                .size           = 15*(SZ_128K),
  16.                .mask_flags     = MTD_WRITEABLE
  17.        },
  18.        {
  19.                .name           = "U-Boot Env",
  20.                .offset         = MTDPART_OFS_APPEND,
  21.                .size           = 1*(SZ_128K)
  22.        },
  23.        {
  24.                .name           = "Kernel",
  25.                .offset         = MTDPART_OFS_APPEND,
  26.                .size           = 32*(SZ_128K)
  27.        },
  28.        {
  29.                .name           = "File System",
  30.                .offset         = MTDPART_OFS_APPEND,
  31.                .size           = 1*(SZ_64M),
  32.        },

  33.        /* 添加部分 */
  34.        {
  35.                .name           = "Backup File System",
  36.                .offset         = MTDPART_OFS_APPEND,
  37.                .size           = MTDPART_SIZ_FULL,
  38.        },
  39. };
复制代码
重新编译并烧写

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

论坛徽章:
0
2 [报告]
发表于 2012-07-03 15:21 |只看该作者
本帖最后由 zehn_w 于 2012-09-24 13:44 编辑

重新再次还原
  1.        {
  2.                .name           = "File System",
  3.                .offset         = MTDPART_OFS_APPEND,
  4.                .size           = 1*(SZ_64M),
  5.        },
复制代码
在之前的错误之上,发现如下错误:
  1. [   11.231201] omap2-nand driver initializing
  2. [   11.235565] NAND device: Manufacturer ID: 0x2c, Chip ID: 0xba (Micron NAND 25                                                                                                  6MiB 1,8V 16-bit)
  3. [   11.244445] Creating 6 MTD partitions on "omap2-nand.0":
  4. [   11.249816] 0x000000000000-0x000000080000 : "X-Loader"
  5. [   11.256561] 0x000000080000-0x000000260000 : "U-Boot"
  6. [   11.263366] 0x000000260000-0x000000280000 : "U-Boot Env"
  7. [   11.269836] 0x000000280000-0x000000680000 : "Kernel"
  8. [   11.277465] 0x000000680000-0x000004680000 : "File System"
  9. [   11.307373] 0x000004680000-0x000010000000 : "Backup File System"
  10. [   11.383666] UBI: attaching mtd4 to ubi0
  11. [   11.387603] UBI: physical eraseblock size:   131072 bytes (128 KiB)
  12. [   11.393920] UBI: logical eraseblock size:    129024 bytes
  13. [   11.399383] UBI: smallest flash I/O unit:    2048
  14. [   11.404174] UBI: sub-page size:              512
  15. [   11.408813] UBI: VID header offset:          512 (aligned 512)
  16. [   11.414703] UBI: data offset:                2048
  17. [   11.538208] UBI error: ubi_read_volume_table: the layout volume was not found
  18. [   11.545654] UBI error: ubi_init: cannot attach mtd4
  19. [   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分区对于相关参数有什么限制?

论坛徽章:
0
3 [报告]
发表于 2012-07-03 16:10 |只看该作者
在u-boot源码目录中include/asm-genric/errno.h
查找错误码:
  1. #define ENODEV          19      /* No such device */
  2. #define EINVAL          22      /* Invalid argument */
复制代码
看出应该是参数设置错误,导致找不到ubifs
我的u-boot参数如下:

  1. 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
  2. bootdelay=3
  3. baudrate=115200
  4. netmask=255.255.255.0
  5. bootfile=uImage
  6. loadaddr=0x82000000
  7. console=ttyS0,115200n8
  8. vram=12M
  9. dvimode=1024x768MR-16@60
  10. defaultdisplay=dvi
  11. mpurate=600
  12. boardmodel=EVM35X-B3-1880-LUNC0
  13. mmcroot=/dev/mmcblk0p2 rw
  14. mmcrootfstype=ext3 rootwait
  15. nandroot=ubi0:rootfs ubi.mtd=4
  16. nandrootfstype=ubifs
  17. 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}
  18. loadbootscript=fatload mmc 0 ${loadaddr} boot.scr
  19. bootscript=echo Running bootscript from mmc ...; source ${loadaddr}
  20. loaduimage=fatload mmc 0 ${loadaddr} uImage
  21. mmcboot=echo Booting from mmc ...; run mmcargs; bootm ${loadaddr}
  22. nandboot=echo Booting from nand ...; run nandargs; nand read ${loadaddr} 280000 400000; bootm ${loadaddr}
  23. ethaddr=02:0d:03:02:00:0a
  24. dieid#=058400029e3800000163810d0302000a
  25. ethact=smc911x-0
  26. ipaddr=192.168.0.110
  27. serverip=192.168.0.111
  28. gatewayip=192.168.0.1
  29. mtdids=nand0=nand

  30. stdin=serial
  31. stdout=serial
  32. stderr=serial
  33. 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
  34. nandargs=bootargs
  35. mtdparts=mtdparts=nand:512k(x-loader),1920k(u-boot),128k(u-boot-env),4m(kernel),64m(fs),-(backupfs)
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-07-04 00:54 |只看该作者
本帖最后由 daniel_kohler 于 2012-07-04 00:54 编辑

回复 2# zehn_w


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

论坛徽章:
0
5 [报告]
发表于 2012-07-04 11:52 |只看该作者
本帖最后由 zehn_w 于 2012-07-04 11:57 编辑

回复 4# daniel_kohler

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


   

论坛徽章:
0
6 [报告]
发表于 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:要看你使用的是什么格式的文件系统了,每个文件系统都会留有一个最小的空间给自己。

论坛徽章:
0
7 [报告]
发表于 2012-07-05 11:31 |只看该作者
本帖最后由 zehn_w 于 2012-07-05 11:33 编辑

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


   

论坛徽章:
0
8 [报告]
发表于 2012-07-05 12:27 |只看该作者
回复 7# zehn_w


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

论坛徽章:
0
9 [报告]
发表于 2012-07-05 14:41 |只看该作者
daniel_kohler 发表于 2012-07-05 12:27
回复 7# zehn_w


感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP