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
-----------------------------------
我写了一个很概括的例子,你可以看看
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两个函数。
具体的映射关系,需要你自己调整。
/大头阿当
这个做法是正确的。
> 不好意思,我没有弄明白你问的问题。上文中"这个文件"指的是驱动程序源码本身,
> 还是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