Smart210学习记录------nor flash驱动

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

 

转载于:https://www.cnblogs.com/qigaohua/p/5509963.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值