现在的位置: 首页 > 综合 > 正文

关于烧写vivi后flash分区不正确的解决办法

2013年09月03日 ⁄ 综合 ⁄ 共 5353字 ⁄ 字号 评论关闭

实验环境要改成Linux 2.6内核,但实验室里的arm2410s开发板安装的Linux内核都是2.4的,不得不将所有开发板重新烧写内核!

由于内核镜像和根文件系统的改变,需要修改flash分区,即修改vivi源码smdk.c文件中的mtd_partition_t default_mtd_partitions[],重新编译vivi,再将vivi烧写到开发板上。但是烧写完vivi后,有些开发板的分区并不正确。其中,vivi是正确的,因为同样的vivi,在一些板上烧成功;但对于某些板上面修改的分区并不起作用,不管你把vivi重新烧上N遍,flash分区还是不正确。这样,我们只能在vivi中使用“bon part ”命令对flash进行重新分区(bon part命令的使用方法见下面)。重新分区后,可以通过“bon part info”命令查看新的bon分区列表(使用“part show”看到的是原来的MTD分区列表)。flash分区正确后,再重新烧写vivi。烧写完vivi后,启动vivi。这时,用“part show”查看到的分区信息就是正确的分区信息了。最后,再将Linux内核镜像和根文件系统烧写到开发板上就OK了。

 

 

 

1、part add 命令用于添加一个MTD 分区。
命令的详细格式如下:
part add name offset size flag
参数name 是要添加的分区的分区名称;
参数offset 是要添加的分区的偏移(相对于整个MTD 设备的起始地址的偏
移,在ARMer9 系统中不论配置的是NOR Flash,还是NAND Flash,都只
注册了一个mtd_info 结构,也就是说逻辑上只有一个MTD 设备,这个MTD
设备的起始地址为0x00000000);
参数size 是要添加的分区的大小,单位为字节;
参数flag 是要添加的分区的标志,参数flag 的取值只能为以下字符串(请注
意必须为大写)或者通过连接符“|”将以下字符串组合起来的组合字符串。
这个标志表示了这个分区的用途
“BONFS” —— 作为BONFS 文件系统的分区;
“JFFS2” —— 作为JFFS2 文件系统的分区;
“LOCK” —— 该分区被锁定了;
“RAM” —— 该分区作为RAM 使用。
 
2、bon part 命令用于建立系统的BON 分区表。
BON 分区表被保存到NANDFlash 的最后0x4000 个字节中,即在NAND Flash 的0x03FFC000 ~0x33FFFFFF 范围内,分区表起始于0x03FFC000(注意: BON 分区是只
针对NAND Flash 设备的一种简单的分区管理方式)。
命令的详细格式如下:
bon part offsets1[flag] offsets2[flag] offsets3[flag] ⋯⋯
参数offsetsN 是每个BON 分区的起始地址;
flag 是跟每个BON 分区的起始地址后面的标识符,这个标识的作用是前面数值的单位,‘k’’或‘K’表示kilo,千;‘m’或‘M’表示mega,兆。
如果再跟上‘:’,后面再跟上‘m’或‘M’,表示该分区被标记为MTD 分区,
如果没有‘:’以及后面的字母‘m’ 或‘M’,则表示该分区被标记为BON 分区。
bon part 命令在建立系统的BON 分区表,会检测每个分区是否有坏块
(Samsung 的NAND Flash 芯片K9S1208U0M,一个块含32 个页,一个
页有512 个字节,一个块有16K 字节,即0x4000),如果发现坏块将标记
出来,并且在分区表中体现,分区的大小将减去坏快的容量,得到实际可用
的分区容量。bon part info 命令执行后显示的信息中, number_of_badblock
所指示的就是分区中的坏块数目。
例子:bon part 0 128K 1M 4M 24M
表示(64M没有坏块的情况下)
分区号(NO.)     起始地址(offset)       大小(size)
0                              0x0000 0000                  0x0002 0000(128K)
1                              0x0002 0000                 0x000e 0000(896K)
2                              0x0010 0000                  0x0030 0000(3M)
3                              0x0040 0000                  0x0140 0000(20M)
4                              0x0180 0000                  0x0280 0000(40M)
摘自:http://blog.chinaunix.net/u3/94039/showart_1933995.html
今天碰到了问题,vivi启动内核后,提示无法找到根文件系统,如下:

 
   FAT: unable to read boot sector
   Kernel panic: VFS: Unable to mount root fs on 61:01
 
   使用part show 显示如下:
 

vivi> part show
mtdpart info. (5 partitions)
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00030000 0x00100000 0 1M
root : 0x00130000 0x01400000 4 20M
usr : 0x01530000 0x02acc000 8 42M+816k

vivi、kernel、根文件镜像都是正常下载,怎么会找不到那?

查看vivi参数:param show

vivi> param show
Number of parameters: 9
name : hex integer
-------------------------------------------------------------
mach_type : 000000c1 193
media_type : 00000003 3
boot_mem_base : 30000000 805306368
baudrate : 0001c200 115200
xmodem_one_nak : 00000000 0
xmodem_initial_timeout : 000493e0 300000
xmodem_timeout : 000f4240 1000000
ymodem_initial_timeout : 0016e360 1500000
boot_delay : 00020000 131072
Linux command line: noinitrd root=/dev/bon/1 init=/linuxrc console=ttyS0

这里显示也是正常的,问题在那?

bon part show 显示如下:

vivi> bon part show
BON info. (3 partitions)
No: offset size flags bad
---------------------------------------------
 0: 0x00000000 0x00030000 00000000 0 192k
 1: 0x00030000 0x00100000 00000000 0 1M
 2: 0x00100000 0x03ecc000 00000000 0 62M+816k

现在知道了原来vivi下part show 中的root地址是0x00130000,而在bon下的root为0x0010000,这样,虽然给kernel传递的参数是root=/dev/bon/2,但bon的第三个分区的地址和实际的vivi根文件镜像的地址是不一样,当然无法找到文件系统了。

  这里怎么来解释两个不同的分区,part show 与bon part show 的不同,首先需要明白的是,vivi中的part show 显示的实际是nand的mtd分区,在vivi中mtd分区一般有5个,分别用于存放vivi、kernel、root、param、usr。 在vivi的load flash vivi/kernel/root x/y ,这类的命令实质是将输入写入mtd相对应分区中去,所以执行

load flash root x后,实际的根文件系统实质是写入到mtd的root分区,而这个分区的地址是0x00130000,而vivi给kernel传递的参数是bon/2,这个地址是0x0010000, 当然没办法找到文件系统了,在vivi的源码中,关于 mtd分区的定义在文件:arch/s3c2410/smdk.c中,代码:

#ifdef CONFIG_S3C2410_NAND_BOOT
mtd_partition_t default_mtd_partitions[] = {
    {
        name:        "vivi",
        offset:        0,
        size:        0x00020000,
        flag:        0
    }, {
        name:        "param",
        offset:        0x00020000,
        size:        0x00010000,
        flag:        0
    }, {
        name:        "kernel",
        offset:        0x00030000,
        size:        0x000C0000,
        flag:        0
    }, {
        name:        "root",
        offset:        0x00100000,
        size:        0x00140000,
        flag:        MF_BONFS
    }
};
#endif

这里就是mtd分区的信息。

那么bon分区是什么? 这里需要明确一个概念,mtd分区仅在下载文件时有用,相当与电脑下载东西,把文件放在那个盘相似,需要注意,我们存放数据是在nand flash中,而在kernel下,这是几个文件,可以在/dev/bon下看到三个或者2个设备,这与你分区的数量有关,我们有3个分区,所以其下有三个设备文件0 1 2 ,而vivi传递给内核的参数是:
Linux command line: noinitrd root=/dev/bon/2 init=/linuxrc console=ttyS0

这句话给了四条信息,noinitrd这条我不知道,而root=/dev/bon/2是告诉内核文件系统在、/dev/bon/2的设备下,实质是告诉内核文件系统在nand flash中的区域的首地址,init=/linuxrc是告诉内核,启动首先执行的脚本是linuxrc.从上边我们可以看到bon分区中的bon/2的地址与mtd中的root的地址是不一样的,所以内核就找不到文件系统,提示:

FAT: unable to read boot sector
Kernel panic: VFS: Unable to mount root fs on 61:01

 


 

怎么来解决这个问题:

很简单,对nand flash重新分区,bon part 0  XX  XX ,这里的地址一定要对应vivi中的相应分区,

vivi> bon part show
BON info. (3 partitions)
No: offset size flags bad
-------------------------------------------
 0: 0x00000000 0x00030000 00000000 0 192k

 1: 0x00030000 0x00100000 00000000 0 1M
 2: 0x00100000 0x03ecc000 00000000 0 62M+816k

 

vivi> part show
mtdpart info. (5 partitions)
name offset size flag
-------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00030000 0x00100000 0 1M
root : 0x00130000 0x01400000 4 20M
usr : 0x01530000 0x02acc000 8 42M+816k

我们需要做的工作让bon分区的root区首地址和mtd分区的root首地址相对应。mtd 中root的首地址为0x00130000,转换为十进制为:1245184
 所以对bon分区: bon part 0 192k 1245184,然后param save ,在冲下vivi kernel  根文件系统,一切OK!

抱歉!评论已关闭.