• 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
    ");
            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
    ");
            err = -EIO;
            goto err_out;
        }
    
        simple_map_init(nor_map);
    
        printk(KERN_ALERT"do_map_probe cfi_probe
    ");
        nor_mtd = do_map_probe("cfi_probe", nor_map);
        if(nor_mtd = NULL) {
            printk(KERN_ALERT" do_map_probe jedec_probe
    ");
            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
    ");
            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");
  • 相关阅读:
    201771010125王瑜《面向对象程序设计(Java)》第十周学习总结
    201771010125王瑜《面向对象程序设计(Java)》第九周学习总结
    201771010125王瑜《面向对象程序设计(Java)》第八周学习总结
    7 Python外壳:代码结构
    6 python容器
    元组
    列表
    4 python基本元素之变量
    3 关于操作系统基本了解
    1 python是什么?
  • 原文地址:https://www.cnblogs.com/qigaohua/p/5509963.html
Copyright © 2020-2023  润新知