如何给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-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分区对于相关参数有什么限制? 在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 编辑
回复 2# zehn_w
1. U-Boot的分区会被Linux的分区覆盖掉的,
2. 参数没有特定的限制,只要不相互覆盖,不超出flash的大小就行了。 本帖最后由 zehn_w 于 2012-07-04 11:57 编辑
回复 4# daniel_kohler
RE 1:mtdparts在何种情况下是有意义的呢?(影响到mtd设置)
RE 2:尝试发现文件系统分区分配的大小是有最小限制的(必须大于最小的某个值),这个有说明文档么?或是否了解?
本帖最后由 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:33 编辑
回复 6# daniel_kohler
最后的分区结果依然依据内核的分区表来完成。但是mtdparts参数即使和内核中的分区表不一致,也不会造成冲突吗?之前说会被内核分区所覆盖,有点矛盾啊。
是不是这样理解的,内核启动后根据mtdparts进行分区,如果分析参数不一样,内核会根据自己的分区信息覆盖掉mtdparts。
这样的话,麻烦指点一下这部分代码在哪个文件里?
回复 7# zehn_w
kernel3.5.2 , driver/mtd/cmdlinepart.c ,line 376; daniel_kohler 发表于 2012-07-05 12:27 static/image/common/back.gif
回复 7# zehn_w
感谢!
页:
[1]