分类: LINUX
2013-09-07 20:19:17
/********************************************************************************************
参考 drivers\mtd\maps\physmap.c
********************************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
static struct map_info *nor_map_info;
static struct mtd_info *nor_mtd_info;
static struct mtd_partition nor_parts[] = {
[0] = {
.name = "bootloader_nor",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "root_nor",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
static int __init nor_flash_init(void)
{
/* 1:分配和设置 */
/* 分配 */
nor_map_info=kzalloc(sizeof(struct map_info), GFP_KERNEL);
/* 设置 */
nor_map_info->name ="Nor_Flash"; /* 名字 */
nor_map_info->size =0x200000; /* 大小 */
nor_map_info->phys =0; /* 起始物理地址 */
nor_map_info->bankwidth=2; /* 16位数据总线,2个字节宽度 */
nor_map_info->virt=ioremap(nor_map_info->phys,nor_map_info->size); /* 虚拟地址 */
/* 2: 调用函数simple_map_init()来设置了读写等函数 */
simple_map_init(nor_map_info);
/* 3. 使用: 调用NOR FLASH协议层提供的函数来识别 */
nor_mtd_info = do_map_probe("cfi_probe", nor_map_info); /* 以CFI接口方式调用 该函数探测Flash得到mtd_info */
if (!nor_mtd_info) /* 如果以CFI接口方式调用不成功,则以JEDEC接口方式调用 */
{
printk("use jedec_probe\n");
nor_mtd_info = do_map_probe("jedec_probe", nor_map_info);
}
if (!nor_mtd_info) /* 如果以以上两种方式调用均未成功则释放资源 */
{
iounmap(nor_map_info->virt);
kfree(nor_map_info);
return -EIO;
}
/* 4. add_mtd_partitions */
add_mtd_partitions(nor_mtd_info, nor_parts, 2); /* 注册 */
return 0;
}
static void __exit nor_flash_exit(void)
{
iounmap(nor_map_info->virt);
kfree(nor_map_info);
del_mtd_partitions(nor_mtd_info);
}
module_init(nor_flash_init);
module_exit(nor_flash_exit);
MODULE_AUTHOR("shenchaoping"); /*描述模块作者*/
MODULE_LICENSE("Dual BSD/GPL");/*指定代码使用双重许可证*/
MODULE_VERSION("v1.0"); /*模块版本*/
MODULE_DESCRIPTION("A Nor Flash Operation Module"); /*说明模块用途*/
MODULE_ALIAS("Nor Flash"); /*模块别名*/