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