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");
时间: 2024-11-03 21:30:09

Smart210学习记录------nor flash驱动的相关文章

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

一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法(即“algorithm”)上层的.与具体适配器无关的代码以及探测设备.检测设备地址的上层代码等. (2) I2C 总线驱动. I2C 总线驱动是对 I2C 硬件体系结构中适配器端的实现,适配器可由 CPU 控制,甚至可以直接集成在 CPU 内部. I2C 总线驱动主要包含了 I2C 适配器数据结构

Smart210学习记录------linux串口驱动

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=27025492&id=327609 一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在<#include linux/serial_core.h> 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver). struct

Smart210学习记录-----SD/MMC/SDIO驱动

转自:http://jingpin.jikexueyuan.com/article/23369.html 一.SD/MMC/SDIO概念区分 SD(SecureDigital)与 MMC(MultimediaCard) SD 是一种 flash memory card 的标准,也就是一般常见的 SD 记忆卡,而 MMC 则是较早的一种记忆卡标准,目前已经被 SD 标准所取代.在维基百科上有相当详细的 SD/MMC 规格说明:[http://zh.wikipedia.org/wiki/Secure

Smart210学习记录-------linux驱动中断

Linux中断 1.申请和释放中断 申请中断 int request_irq(unsigned int irq, irq_handler_t handler,  unsigned long irqflags, const char *devname, void *dev_id) irq 是要申请的硬件中断号. handler 是向系统登记的中断处理函数(顶半部),是一个回调函数,中断发生时,系统调用 这个函数, dev_id 参数将被传递给它. irqflags是中断处理的属性,可以指定中断的触

Smart210学习记录------块设备

转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的块设备进行mkfs,mount和读写文件.为了尽可能简单,这个驱动的规模不是1000行,也不是500行,而是100行以内. 这里插一句,我们不打算在这里介绍如何写模块,理由是介绍的文章已经满天飞舞了.如果你能看得懂.并且成功地编译.运行了这段代码,我们认为你已经达到了本教程的入学资格,当然,如果你不

Smart210学习记录-------linux内核模块

Linux 驱动工程师需要牢固地掌握 Linux 内核的编译方法以为嵌入式系统构建可运行的Linux 操作系统映像.在编译 LDD6410 的内核时,需要配置内核,可以使用下面命令中的 一个: #make config(基于文本的最为传统的配置界面,不推荐使用) #make menuconfig(基于文本菜单的配置界面) #make xconfig(要求 QT 被安装) #make gconfig(要求 GTK+被安装) 在配置Linux 2.6内核所使用的make config.make me

Smart210学习记录-----linux定时器

1.内核定时器: Linux 内核所提供的用于操作定时器的数据结构和函数如下: (1) timer_list 在 Linux 内核中,timer_list 结构体的一个实例对应一个定时器 1 struct timer_list { 2    struct list_head entry; /* 定时器列表 */ 3    unsigned long expires; /*定时器到期时间*/ 4    void (*function)(unsigned long); /* 定时器处理函数 */ 5

Smart210学习记录-----中断

1. OVERVIEW OF VECTORED INTERRUPT CONTROLLER(概述向量中断控制器) 主要有4个VIC,4个TZIC还有一个很特殊的ARM PrimeCell PL192.主要的VIC和TZIC可以支持93个中断源.其中TZIC是为TrustZone技术所准备的,ARM TrustZone® 技术是系统范围的安全方法,针对高性能计算平台上的大量应用,包括安全支付.数字版权管理 (DRM).企业服务和基于 Web 的服务(援引官方的介绍).TZIC提供了安全控制的nFIQ

《灰帽Python-黑客和逆向工程师的Python编程》学习记录

ctypes是Python语言的一个外部库,提供和C语言兼容的数据类型,可以很方便的调用C DLL中的函数. 操作环境:CentOS6.5 Python版本:2.66 ctypes是强大的,强大到本书以后介绍的几乎所有库都要基于此.使用它我们就能够调用动态链接库中函数,同时创建各种复杂的C数据类型和底层操作函数.毫无疑问,ctypes就是本书的基础. 第一章 搭建开发环境 1.3.2 使用动态链接库 from ctypes import * libc = CDLL("libc.so.6"