目标板要更新成2.6的内核,以前板子vivi上的flash分区不合理,kernel分区只有1M的空间,而2.6的核编译出来一不小心就会超过1M,因此还是研究下vivi的flash分区,增大kernel分区.
这里先转发一下网络上看到的有关vivi分区问题分析,然后整理出自己的分区过程.
问题:
##################################################################################
您好:
看了你blog上的一篇文章,我是刚接触NAND flash分区的问题,所以请教与你.
flash分区一般分为5个:
bootloader,param,kernel,root
这几个分区对应应该是mtdblock/0到mtdblock
谢谢,我才开始, 对这些有点迷惑.谢谢你的帮助.
##################################################################################
回答:
##################################################################################
你好,
首先申明我的理解仅限于参考(我也很菜的说,^_^)。
1、>>flash分区一般分为5个
这个理解是不对的,至少不完全对。flash想分成几个区完全由于
2、>>bootloader,param,kernel
这个和上面的问题有关系,不过个人觉得你的理解还是有点问题
使用三个分区情况:/dev/mtdblock/0 bootloader
/dev/mtdblock/1 kernel
/dev/mtdblock/2 cramfs (假设cramfs中有multimedia,guilib, etc,usr, extdata等)
这样之需要在kernel加载后使用下面的命令(放在初始化脚本l
mount -t yaffs /dev/mtdblock/2 / 即可。
那么可能我觉得这个cranfs太大,尤其是其中的multime
使用五个分区: /dev/mtdblock/0 bootloader
/dev/mtdblock/1 kernel
/dev/mtdblock/2 yaffspart1(将guilib, etc,usr以及其他一些文件制作成yaffs文件系统)
/dev/mtdblock/3 yaffspart2 (将multimedia制作成yaffs文件系统)
/dev/mtdblock/4 yaffspart3(将extdata制作成yaffs文件系统
那么kernel起来后,需要做这样的动作(可以放在linuxr
mkdir /multimedia
mkdir /extdata
mount -t yaffs /dev/mtdblock/3 /multimedia
mount -t yaffs /dev/mtdblock/4 /extdata
为此时选择yaffs而不是cramfs呢?我想你知道答案
3、关于bon分区和mtd分区,请参考一种bootloader
4、如果你不了解yaffs,可能需要查找一下资料。简单点说
yaffs文件系统的制作和cramfs一样,需要工具
5、至于文件系统的共存,其实比较好理解。不仅仅yaffs和cr
以上是我个人的一点点理解和建议,肯定有不正确的地方
changejoy
##################################################################################
很感谢上面这位网友的一番分析和讲解,解答了我的某些困惑的地方.
通过多次实验,以下为自己具体的分区过程:
1.如果首先板子上没有烧进去vivi,则可以通过JTAG口以及jflash烧写工具软件把vivi烧进目标板上,当然有的开发板也可以在 ADS1.2的环境用JTAG仿真器(如Multi-ICE),通过某个烧写程序把vivi烧进目标板,这里具体第一次怎么把vivi烧写进去就不再多述 了.
2.当把vivi烧进去后,可以通过输入part show查看MTD分区情况,这个分区表应该和后面kernel中的MTD分区保持一致,我的2.6内核源码中修改后的MTD分区表为:
0x00000000-0x00020000 : "boot"
0x00020000-0x00030000 : "param"
0x00030000-0x001f0000 : "kernel"
0x00200000-0x00400000 : "root"
0x00400000-0x04000000 : "user"
那么这里,我们应该将通过修改vivi的源码把MTD分区表修改成一样,修改/vivi/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: 0x00100000,
flag: 0
}, {
name: "root",
offset: 0x00130000,
size: 0x00200000,
flag: MF_BONFS
}
};
#endif
修改成如下:
#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: 0x001f0000,
flag: 0
}, {
name: "root",
offset: 0x00200000,
size: 0x00400000,
flag: MF_BONFS
}, {
name: "user",
offset: 0x00400000,
size: 0x04000000,
flag: 0
}
};
#endif
保存文件,并重新make,生成新的vivi文件;
3. 重新bon分区flash,这是十分必要的,相当于重新分区并格式化了整个flash区,当bon分区后flash里面的数据将全部丢失,所以要再把前面 新生成的vivi烧入目标板上,当然现在就可以只通过串口把vivi烧写进去,不用像第1步那样操作烧写vivi,但是注意bon命令重新分区后千万不要 断电了再烧写vivi,否则就不能通过串口烧vivi了,具体步骤如下:
(1)这里将flash分成4个区(vivi和param只占一个区),输入bon分区命令:
#bon part 0 192K 2M 4M
解释一下上面的命令:
第1个分区从0开始;
第2个分区从0x30000(即192K)开始;
第3个分区从0x200000(即2M)开始;
第4个分区从0x400000(即4M)开始.
(2)分区成功后,可以通过命令bon part info或者bon part show来查看bon分区信息,接下来不要断电,直接通过串口下载vivi,但是要注意的是,在linux下用xmodem协议下载文件很有可能出现传输 过程中断线或者连不上的情况,但是在windowsXP的附件中的超级终端下通过xmodem传输文件过程却是十分的理想,所以我建议从前面的第3步一开 始就都在windowsXP环境下的超级终端里进行操作,输入命令:
#load flash vivi x
然后点击终端窗口中的传送下的发送文件,采用xmodem协议,选择要下载的vivi码即可.
(3)等待文件传输完毕后,输入boot重启目标板,并按住空格键重新进入vivi模式下,输入命令:
#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 0x001f0000 0 1M+960k
root : 0x00200000 0x00400000 4 4M
user : 0x00400000 0x04000000 0 64M
vivi>
以上就是整个分区过程了
在vivi下:
vi Makefile
1.LINUX_INCLUDE_DIR = /usr/wqw/2.4.18-rmk7/include
2.CROSS_COMPILE =/usr/local/arm/2.95.3/bin/arm-linux-
3./usr/wqw/vivi-sd/arch/s3c2410
vi smdk.c
char linux_cmd[] = "root=/dev/mtdblock2 load_ramdisk=0 init=/linuxrc console=ttyS0 mem=64M
devfs=mount mac=00:00:c0:ff:ee:08";
如果改动不起作用,在启动vivi时,按空格进入参数输入状态:
linux command line is: "root=/dev/nfs rw nfsroot=192.168.0.24:/home/myroot noinitrd init=/linuxrc
console=ttyS0 ip=192.168.0.25 devfs=mount"
移植vivi成功
移植vivi成功
今天将vivi移植到了开发版里.vivi的版本为1.4.现在讲一下具体修改的过程.首先是下载vivi源代码,解压缩.然后是修改makefile,具体是:
修改为“LINUX-INCLUDE-DIR = /usr/local/arm/2.95.3/include”,就是自己的编译器路径.
修改为“CROSS-COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-”
修改为"ARM_GCC_LIBS = /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3"
在 这里我遇到一个问题,我用3.3.2和3.4.1的编译器编译vivi会报很多错误,比如什么:invalid option "no-fpu"之类的,但是用2.95.3就没问题,一路绿灯。不知道是只有我一个人有这个问题还是大家都有,总之网上没有人提到这个问题。就是这个小 问题卡了我将尽两天,浪费了大量的精力,真是受不了。
然后是修改arch/s3c2410/smdk2410.c
修改为
#ifdef CONFIG_S3C2410_NAND_BOOT
mtd_partition_t default_mtd_partitions[] = {
{
name: "vivi",
offset: 0,
size: 0x00030000,
flag: 0
}, {
name: "param",
offset: 0x00030000,
size: 0x00150000,
flag: 0
}, {
name: "kernel",
offset: 0x00180000,
size: 0x00180000,
flag: 0
}, {
name: "root",
offset: 0x00300000,
size: 0x01e00000,
flag: 0
//flag: MF_BONFS
}, {
name: "user",
offset: 0x02100000,
size: 0x01f00000,
flag: 0
}
};
#endif
修改cmd_line,因为我是用linux2.6的内核,还想使用ramdisk,所以设置为:
“char linux_cmd[] = "initrd root=/dev/mtdblock/3 init=/linuxrc console=ttySAC0,115200 mem=64M";”
然后make menuconfig,主要是去掉ecc。其他的设置就不细说了。
最后,make vivi 就可以的到一个名为vivi的文件,烧到nandflash里就ok了
再谈修改vivi
前几天将vivi在开发板上成功的跑了起来,于是转去做porting 2.6kernel+yaffs2的工作去了,等完成之后需要将kernel烧到nandflash里的时候出问题了.它说什么invalid mtd info.就是在使用vivi的load命令的时候出现的问题.用param save也会出现问题.总之就是不能往flash里写东西.看了一下vivi的启动信息,并且和网上其它人的启动信息比较了一下,发现在memory mapping的时候都是正常的,但是我的启动信息里没有nandflash的id,厂商等信息.于是在windows下用sourceinsight这 个软件将vivi添加到一个工程里,查看main.c(里面可以看出了vivi的启动过程),发现对mtd的初始化等依赖于smc功能,然而我在编译的时 候是把smc掉的.重新编译vivi,make menuconfig,选中smc支持.编译,出错,说什么在mtd.o里什么mtd_nand_ecc没有定义之类的,抱着瞎试的态度,把smc支持下 的关于ecc的项选中,编译通过.然后烧到板子上,启动,果然出现了nandflash的厂商信息,load命令也可以正常使用了.这些步骤看着听少的, 可是我自己做耗费的时间是以天来记的.真希望有个高手能在旁边指导一下,这样至少能省3/4的时间.其实对vivi的这一点我是感到很奇怪的,既然这两个 项你不放在一起选就会编译报错,那你为什么不把后一个设置为和前一个绑定.
首先下载一个纯净版的vivi主要修改几个地方
(1)LINUX_INCLUDE_DIR = /kernel/include/(改成你存放linux kernel源代码的地址,因为编译vivi需要用到kernel源代码的部分头文件)----我本来是要把内核升级成2.6的,但是包含2.6的 include就是有问题,只好把他改成2.4的,我的linux就是2.4的,不过这个关系不大.
(2)CROSS_COMPILE = arm-linux-(改成你存放交叉编译工具的路径,通常交叉编译工具的路径都已经在profile文件中声明,所以一般直接写成arm-linux-)
(3)ARM_GCC_LIBS = /opt/crosstool/arm-linux/lib/gcc-lib/arm-linux/2.95.3(改成你安装交叉编译工具的相应路径)- ---用3.4.1的编译器会报错:说什么mshort-load-bytes选项无效,搞了好久不弄明白,只好用2.95.3,我弄了两个编译环 境!:)
然后就是配置选项了,在make menuconfig之前,建议先make clean,先把原来试验产生的目标文件清除.
make menuconfig之后,可以选用默认的配置,因为vivi对2410的支持很好,但是我们可以在串口选项下输入自己的vivi提示符(看我的,就是lidtin@HBUT>是不是很有成就感?)
保存退出.接下来,系统会提示下一步:make ,过几秒后,ls查看,就会发现新生成了一个vivi和vivi-elf两个文件,我们把vivi用sjf2410或者Jflash烧到板子里去,重启就会发先可爱的vivi了!
-----注:我的vivi不支持usb,只能用串口下载,那位知道怎么样才能支持usb,告诉我一声哈,谢谢!
启动界面:
==============================
VIVI version 0.1.4 (root@localhost.localdomain) (gcc version 2.95.3 20010315 (re
lease)) #0.1.4 三 7月 19 11:16:06 CST 2006
MMU table base address = 0x33DFC000
Succeed memory mapping.
NAND device: Manufacture ID: 0xec, Chip ID: 0x76 (Samsung K9D1208V0M)
Could not found stored vivi parameters. Use default vivi parameters.
Press Return to start the LINUX now, any other key for vivi
type "help" for help.
lidtin@HBUT> part show
mtdpart info. (4 partitions)
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00030000 0x00200000 0 2M
root : 0x00230000 0x01f00000 4 31M