nor flash驱动与nand flash驱动的差别不大,只是设置不同的结构体而已,,
nor flash驱动代码:
#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 unsigned char nr_parts = 2; static struct mtd_partition nor_mtd_partition[] = { [0] = { .name = "bootloader_nor", .size = 0x00040000, .offset = 0, }, [1] = { .name = "root_nor", .offset = MTDPART_OFS_APPEND, .size = MTDPART_SIZ_FULL, } }; static int __init my_nor_flash_init(void) { /*分配一个mtd_info结构体*/ int err; nor_map = kzalloc(sizeof(struct map_info), GFP_KERNEL); if(nor_map == NULL) { printk(KERN_ALERT"map_info kzalloc error\n"); return -ENOMEM; } /*设置: 物理基地址(phys), 大小(size), 位宽(bankwidth), 虚拟基地址(virt)*/ nor_map->name = "nor flash"; nor_map->phys = 0; nor_map->size = 0x100000; //大于真实nor flash的大小 nor_map->bankwidth = 2; //16位 nor_map->virt = ioremap(nor_map->phys,nor_map->size); if (nor_map->virt == NULL) { printk(KERN_ALERT"Failed to ioremap flash region\n"); err = -EIO; goto err_out; } simple_map_init(nor_map); printk(KERN_ALERT"do_map_probe cfi_probe\n"); nor_mtd = do_map_probe("cfi_probe", nor_map); if(nor_mtd = NULL) { printk(KERN_ALERT" do_map_probe jedec_probe\n"); nor_mtd = do_map_probe("jedec_probe", nor_map); } if(!nor_mtd) { iounmap(nor_map->virt); kfree(nor_map); return -EIO; } nor_mtd->owner = THIS_MODULE; /*添加分区*/ if(mtd_device_register(nor_mtd, nor_mtd_partition, nr_parts) != 0) { printk(KERN_ALERT" mtd_device_register error\n"); return -EINVAL; } return 0; err_out: kfree(nor_map); return err; } static void __exit my_nor_flash_exit(void) { iounmap(nor_map->virt); kfree(nor_map); } module_init(my_nor_flash_init); module_exit(my_nor_flash_exit); MODULE_LICENSE("GPL");
时间: 2024-11-03 21:30:09