Linux下norflash驱动编写方法

来源:互联网 发布:淘宝团队 编辑:程序博客网 时间:2024/05/16 15:57

                                                                      Linux下norflash驱动编写步骤

1. 分配map_info结构体

2. 设置: 物理基地址(phys), 大小(size), 位宽(bankwidth), 虚拟基地址(virt) 

3. 使用: 调用NOR FLASH协议层提供的函数来识别

4. add_mtd_partitions

如:

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h>
#include <linux/mtd/concat.h>
#include <linux/io.h>

static struct map_info *nor_map;
static struct mtd_info *nor_mtd;

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 norflash_driver_init()
{
nor_map=kzalloc(sizeof(struct map_info), GFP_KERNEL);

nor_map->name="nor_drv";
nor_map->size=0x1000000;
nor_map->phys=0;
nor_map->bankwidth=2;
nor_map->virt=ioremap(nor_map->phys, nor_map->size);

simple_map_init(s3c_nor_map);

printk("use cfi_probe\n");
nor_mtd=do_map_probe("cfi_probe", s3c_nor_map);
if (!nor_mtd)
{
printk("use jedec_probe\n");
nor_mtd=do_map_probe("jedec_probe", s3c_nor_map);
}

if (!nor_mtd)
{
iounmap(s3c_nor_map->virt);
kfree(s3c_nor_map);
return -EIO;
}

nor_mtd->owner=THIS_MODULE;
add_mtd_partitions(nor_mtd, nor_parts, 2);
return 0;
}

static void norflash_driver_exit()
{

del_mtd_partitions(nor_mtd);
map_destroy(nor_mtd);
iounmap(nor_map->virt);
kzfree(nor_map);


}

module_init(norflash_driver_init);
module_exit(norflash_driver_exit);
MODULE_LICENSE("GPL");



原创粉丝点击