linux nandfalsh空间划分及启动参数

来源:互联网 发布:天下网络盟重新城论坛 编辑:程序博客网 时间:2024/06/04 19:31

1.对nand的默认分区

        分区只是内核的概念,就是说A~B地址放内核,C~D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等。一般我们只需要分3-4个区,第一个为boot区,一个为boot参数区(传递给内核的参数),一个为内核区,一个为文件系统区。(但是有的内核就会有很多分区,比如内核参数会有两个,还有会Logo的地址)而对于bootloader 对分区的概念不重要,只要它能把内核u-boot等烧到对相应位置能让内核知道到哪里去寻找相应的文件就行。而为了方便操作,bootloader类似也引入分区的概念。    如果bootloader对内核重新分区就需要重新设置一下bootloader环境参数,就可以同步更新内核分区信息如:

setenvbootargs 'noinitrd console=ttySAC0root=/dev/mtdblock3 rootfstype=jffs2mtdparts=nand_flash:128k(u-boot)ro,64k(u-bootenvs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'

内核有自己默认的MTD分区,如果内核分区信息如下:

staticstruct mtd_partition  smdk_default_nand_part[] = {

[0] = {

.name = "uboot",

.offset = 0x00000000,

.size = 0x00040000,

},

[1] = {

.name = "kernel",

.offset = 0x00040000,

.size = 0x00200000,

},

[2] = {

.name = "yaffs2",

.offset = 0x00240000,

.size = MTDPART_SIZ_FULL

}

};

 

 

2.配置分区

那我们如何去配置呢。有如下两个方法:

1)   直接修改linux源码

Linux有他的默认分区,我们可以修改他的默认分区参数,来达到我们分区的目的。

但这样的方法缺点就是,修改一次都必须重新编译一次内核。

2)   在u-boot中传递分区参数给内核

在u-boot启动内核前,我们把参数设置到u-boot的引导命令中,如下形式:

setenv bootargs 'noinitrdconsole=ttySAC0root=/dev/mtdblock3 rootfstype=jffs2mtdparts=nand_flash:128k(u-boot)ro,128k(u-bootenvs),3m(kernel),30m(root.jffs2),30m(root.yaffs)'

也可以达到分区的目的。这样可以方便的修改分区参数。配置分区后别忘了重新烧写内核和文件系统镜像,修改相应的启动参数。如nand read 0x320000000x50000 0x200000;bootm 0x32000000,引导内核的地址要改为你内核的相应的地址。

3.自定义变量

实现在nand里面定义和保存我们自己的参数。使参数能在断电的情况下能保存。u-boot有如下接口函数:

a)   修改和创建变量

int setenv(char *name,char *value);

b)   制式换行

long conver_format(const char *cp,int base);

c)   得到变量值

char *getenv(char *name);

get_var(char *name)函数返回的是变量的值的字符串指针,如果你需要得到的本身就是一个字符串,那就无需转换。如果你想得到的是8,10或16进制的数的话,就需要使用 conver_format(const char *cp,int base)函数做转换。

原创粉丝点击