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

Posted 小败qi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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");

 

以上是关于Smart210学习记录------nor flash驱动的主要内容,如果未能解决你的问题,请参考以下文章

Smart210学习记录-----Linux i2c驱动

smart210看不到uboot启动信息

嵌入式linux开发uboot移植——三星官方uboot的移植

学习centos中记录的常用命令

samrt210开发板ping-系列问题(开发板ping通主机,主机ping通虚拟机,唯独~开发板ping不通虚拟机)

第一章之s5pv210启动顺序