zoukankan      html  css  js  c++  java
  • 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");
  • 相关阅读:
    Making your first driver
    注册表与盘符(转victor888文章 )
    电脑Win7如何取得文件管理所有权(提供各种GHOST版本的Windows)
    可拖动的DIV
    IE Javascript 进阶调试
    优化性能
    命令模式
    MVC 4 结合jquery.uploadify 上传实例
    IIS处理并发请求时出现的问题及解决
    Spring3.2 + Hibernate4.2
  • 原文地址:https://www.cnblogs.com/qigaohua/p/5509963.html
Copyright © 2011-2022 走看看