1. 程式人生 > >Linux下norflash驅動編寫方法

Linux下norflash驅動編寫方法

                                                                      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");