Re: 求教关于 JFFS2 文件系统的问题!

13 views
Skip to first unread message

Adam Jiang

unread,
Jun 7, 2010, 2:20:00 AM6/7/10
to wang wang, linux-...@zh-kernel.org, embedded-linux-zh-CN
2010/6/7 wang wang <peilinpe...@gmail.com>:
> Hi Everyone :
>
> 大家早上好!我现在用的平台是 at91rm9200-dk 32M dram 8M norflash ,原来用的是 U-Boot +
> uImage + ramdisk(ext2) (Linux version 2.6.25) (gcc version 3.4.5)
> .现在想在系统里增加 1M的 JFFS2 文件系统,放在 norflash 后面的空间里,把jffs2 文件系统的首地址 0x10600000 映射到
> /dev/mtdblock0 ,准备在系统启动后,mount -t jffs2 /dev/mtdblock0 /mnt/ . 这个增加的
> JFFS2 文件系统是用来保存数据的(原来的ramdisk 不能保存数据)。
>
> 我现在已经在PC 上生成了 jffs2 文件系统的映像文件 rootfs.jffs2 (大小1M 可以在 PC
> 上挂载,并向里写入数据),且已经把他烧录到 norflash 的 0x10600000 开始的空间上。
> 但我不知道怎么把 0x10600000 映射到 /dev/mtdblock0 上,别人告诉我要修改
> 源码中的硬件驱动(注册)部分。但我不知道具体是那个文件,该怎么修改;还有 make menuconfig 中该怎么修改。

Linux内核对mtd设备的支持包括两个部分,一层是统一的mtd设备Interface,
另一层是各个硬件的设备驱动。其中第二个部分通常需要自己编写。

一般的做法是,将mtd设备的硬件驱动放在
$LNX/drivers/mtd/maps/
里面,然后还要为它写Makefile,并添加编译选项;如果你还没有做这些工作,
那么在make menuconfig中就找不到这些编译选项了。

Norflash的物理地址在platform加点之以后就是可以见得,你可以参照
$LNX/drivers/mtd/maps/
里面的任何一起驱动写自己的驱动程序。

/大头阿当

--
Adam Jiang
-----------------------------------
e-mail:jiang...@gmail.com
http://www.adamjiang.com
-----------------------------------

Adam Jiang

unread,
Jun 7, 2010, 2:39:35 AM6/7/10
to wang wang, linux-...@zh-kernel.org, embedded-linux-zh-CN
2010/6/7 Adam Jiang <jiang...@gmail.com>:

> 2010/6/7 wang wang <peilinpe...@gmail.com>:
>> Hi Everyone :
>>
>> 大家早上好!我现在用的平台是 at91rm9200-dk 32M dram 8M norflash ,原来用的是 U-Boot +
>> uImage + ramdisk(ext2) (Linux version 2.6.25) (gcc version 3.4.5)
>> .现在想在系统里增加 1M的 JFFS2 文件系统,放在 norflash 后面的空间里,把jffs2 文件系统的首地址 0x10600000 映射到
>> /dev/mtdblock0 ,准备在系统启动后,mount -t jffs2 /dev/mtdblock0 /mnt/ . 这个增加的
>> JFFS2 文件系统是用来保存数据的(原来的ramdisk 不能保存数据)。
>>
>> 我现在已经在PC 上生成了 jffs2 文件系统的映像文件 rootfs.jffs2 (大小1M 可以在 PC
>> 上挂载,并向里写入数据),且已经把他烧录到 norflash 的 0x10600000 开始的空间上。
>> 但我不知道怎么把 0x10600000 映射到 /dev/mtdblock0 上,别人告诉我要修改
>> 源码中的硬件驱动(注册)部分。但我不知道具体是那个文件,该怎么修改;还有 make menuconfig 中该怎么修改。
>
> Linux内核对mtd设备的支持包括两个部分,一层是统一的mtd设备Interface,
> 另一层是各个硬件的设备驱动。其中第二个部分通常需要自己编写。

我写了一个很概括的例子,你可以看看

struct map_info foo_map = {
name: "foo mapped flash"
bankwidth: BUSWIDTH,
read: foo_read,
copy_from: foo_copy_from,
write: foo_map_write,
copy_to: foo_copy_to,
};

static struct mtd_partition foo_partitions[] = {
{ name: "part1", offset: OFFSET_OF_PART1, size: SIZE_OF_PART1 },
{ name: "part2", offset: OFFSET_OF_PART2, size: SIZE_OF_PART2 },
{ name: "part4", offset: OFFSET_OF_PART3, size: SIZE_OF_PART3 },
};

init __init init_foo_map(void)
{
foo_map.size = flash_windows_size;
foo_map.virt = ioremap( flash_window_addr, flash_window_size);

foo_mtd = do_map_probe("xxx", &foo_map);
...
add_mtd_partitions(foo_mtd, foo_partitions, numofpartitions);
}

关键是map_info和mtd_partition两个数据结构和,
do_map_probe,add_mtd_partitions两个函数。

具体的映射关系,需要你自己调整。

/大头阿当

Adam Jiang

unread,
Jun 8, 2010, 2:50:13 AM6/8/10
to wang wang, 中文内核邮件列表, embedded-linux-zh-CN
2010/6/8 wang wang <peilinpe...@gmail.com>:
> 您好:
> 您以前的邮件告诉我在
> $LNX/drivers/mtd/maps/
> 这个路径下添加一个 nor flash的驱动文件(我们暂时把这个文教叫做 nor_flash_drivers.c),仿照
> $LNX/drivers/mtd/maps/
> 路径下其他的驱动文件去编写。
>

这个做法是正确的。

> 不好意思,我没有弄明白你问的问题。上文中"这个文件"指的是驱动程序源码本身,
> 还是Makefile或者Kconfig?
>
> 上文中"这个文件"指 nor_flash_drivers.c 也就是我现在板上的 8M 的 nor flash 的驱动文件。
> 我把 nor_flash_drivers.c 加入到 Makefile 和 Kconfig 中进行配置和编译 应该是可以做到。
> 但是 nor_flash_drivers.c 这个文件和其他文件的依赖关系联系,这个我弄不明白。
> (
> 因为我看见 在 Kconfig 中 有
> config MTD_CFI_FLAGADM
> tristate "CFI Flash device mapping on FlagaDM"
> depends on 8xx && MTD_CFI
> help
> Mapping for the Flaga digital module. If you don't have one, ignore
> this setting.
> 这样的内容,说明 MTD_CFI_FLAGADM 依赖于 8xx && MTD_CFI
> )

你问到的这个问题是关于Linux kernel自身编译系统的问题,事实上,
Kconfig仅仅是提供编译选项和对于选项的说明。
你上面给的这个例子就是编译选项CONFIG_MTD_CFI_FLAGADM依赖于另外两个
编译选项,它的意思是,你需要使用该选项时,必须让其他两个选项也有效。
help下面的是说明文字。

你需要将新驱动的编译选项添加到这里,但是仅仅这样做是不够的,
因为它并没有将你写好的驱动程序添加到编译过程中。
接着,你需要修改Makefile。我举个例子:

Kconfig
______________________
config FOO_MTD_FLASH
tristate "Foo mtd device driver"
depends on MTD_CFI
help
This enable the support to foo nor flash device on XXX board.
______________________

Makefile
______________________
obj-$(CONFIG_FOO_MTD_FLASH) += foo_nor_flash.c
______________________

至于,Kconfig里面的依赖关系,你需要自己弄清楚,一般来说,
这个依赖指定特定的体系结构arch,子系统的general选项,还有其他需要的编译选项。

> 还有这个驱动在内核中什么地方调用,怎么调用;
> 以及 我的 8M 的 nor flash 上 0x10600000 这个地址开始的 1M 的数据块 怎么映射到 /dev/mtdblock1这个块设备上 。

通过在驱动程序中指定这个该"块"的物理地址和大小从而让Linux找到这段存储器。
物理地址与CPU体系结构有关,所以你还得做一些转换。
然后,就像我昨天给的例子那样,使用ioremap函数将这段物理内存拉入内核的虚拟地址空间内。
这样就完成了映射。

/大头阿当

> 上面是我的问题,请您帮忙看看。
>
> 谢谢您!!!
>
> Thanks & Bestregards !
> Colin

Reply all
Reply to author
Forward
0 new messages