S3C2440 nor_flash驱动程序

20150418 S3C2440 nor_flash驱动程序

2015-04-18 Lover雪儿

和前面的nandflash差不多,我们此处来重新学习一下norflash驱动。

  1 /*
  2  * 参考 drivers\mtd\maps\Physmap.c
  3  */
  4
  5 #include <linux/module.h>
  6 #include <linux/types.h>
  7 #include <linux/kernel.h>
  8 #include <linux/init.h>
  9 #include <linux/slab.h>
 10 #include <linux/device.h>
 11 #include <linux/platform_device.h>
 12 #include <linux/mtd/mtd.h>
 13 #include <linux/mtd/map.h>
 14 #include <linux/mtd/partitions.h>
 15 #include <linux/mtd/physmap.h>
 16 #include <linux/mtd/concat.h>
 17 #include <linux/io.h>
 18
 19 //定义nor flash的分区
 20 static struct mtd_partition lhy_nor_part[] = {
 21     [0] = {
 22         .name    = "nor bootloader",
 23         .size    = 0x40000,
 24         .offset    = 0,
 25     },
 26     [1] = {
 27         .name    = "nor root",
 28         .offset = MTDPART_OFS_APPEND,
 29         .size    = MTDPART_SIZ_FULL,        //剩余的所有大小
 30     },
 31 };
 32
 33 static struct map_info *lhy_nor_map;
 34 static struct mtd_info *lhy_nor_mtd;  //动态创建
 35
 36 static int lhy_nor_init(void)
 37 {
 38     /* 1.分配map_info结构体 */
 39     lhy_nor_map = kzalloc(&dev->dev, sizeof(struct map_info),GFP_KERNEL);
 40     /* 2.设置:物理基地址(phys),大小(size),位宽(bankwidth),虚拟基地址(virt) */
 41     lhy_nor_map->name = "lhy_nor";  //名字
 42     lhy_nor_map->phys = 0x0;        //基地址
 43     lhy_nor_map->size = 0x1000000;    //大小,>=nor的真正大小
 44     lhy_nor_map->bankwidth = 2;        //位宽16位
 45
 46     lhy_nor_map->virt = ioremap(lhy_nor_map->phys,lhy_nor_map->size); //映射地址
 47
 48     simple_map_init(lhy_nor_map);    //简单的初始化
 49
 50     /* 3.使用: 调用nor flash协议层提供的函数来识别 */
 51     printk("<0>use cfi_probe\n");
 52     lhy_nor_mtd = do_map_probe("cfi_probe",lhy_nor_map);
 53     if(!lhy_nor_mtd){
 54         printk("<0>use jedec_probe\n");
 55         lhy_nor_mtd = do_map_probe("jedec_probe",lhy_nor_map);
 56     }
 57     if(!lhy_nor_mtd){
 58         iounmap(lhy_nor_map->virt);
 59         kfree(lhy_nor_map);
 60         return -EIO;
 61     }
 62
 63     /* 4.添加分区: add_mtd_partitions */
 64     add_mtd_partitions(lhy_nor_mtd,lhy_nor_part,2); //总共两个分区
 65     return 0;
 66 }
 67
 68 static void lhy_nor_exit(void)
 69 {
 70     if(lhy_nor_map){
 71         iounmap(lhy_nor_map->virt);
 72         kfree(lhy_nor_map);
 73         del_mtd_partitions(lhy_nor_mtd);
 74     }
 75 }
 76
 77 module_init(lhy_nor_init);
 78 module_exit(lhy_nor_exit);
 79 MODULE_LICENSE("GPL");
 80
 81 /*
 82
 83 使用U-BOOT来体验NOR FLASH 的操作(开发板设为NOR启动,进入U-BOOT)
 84 使用OpenJTAG烧写U-BOOT到nor flash
 85 1.读数据
 86 md.b 0
 87
 88 2.读ID
 89 往地址555H写入AAH
 90 往地址2AAH写入55H
 91 往地址555H写入90H
 92 读0地址得到厂家ID      C2H
 93 读1地址得到设备ID    22DAH/225DH
 94 退出读ID状态        往任意地址写入F0H
 95
 96 由于2440的CPU的数据线和NOR的数据线相错开,所以UBOOT操作时,写的地址应该<<1得到
 97 往地址AAAH写入AAH                        mw.w aaa aa
 98 往地址554H写入55H                        mw.w 554 55
 99 往地址AAAH写入90H                        mw.w aaa 90H
100 读0地址得到厂家ID      C2H                    md.w 0 1
101 读2地址得到设备ID    22DAH/225DH            md.w 2 1
102 退出读ID状态        往任意地址写入F0H      mw.w 0 f0
103
104 3.NOR 手册上有两种规范,jedec,cfi(common flash interface)
105     读取CFI信息
106     进入CFI模式,往地址55H写入98H
107     读数据:    读10H得到0051
108                 读11H得到0052
109                 读12H得到0059
110                 读27H得到容量
111 UBOOT操作时,写的地址应该左移一位
112     进入CFI模式,往地址AAH写入98H        mw.w aa 98
113     读数据:    读20H得到0051            md.w 20 1
114                 读22H得到0052           md.w 22 1
115                 读24H得到0059           md.w 24 1
116                 读4EH得到容量           md.w 4E 1    2^n
117     退出CFI模式,往任意地址写入F0H      mw.w 0 f0
118 4.写数据    在地址0x100000写入0x1234  发现无法写数据
119 往地址555H写入AAH
120 往地址2AAH写入55H
121 往地址555H写入A0H
122 往烧写地址写入要写的数据
123
124 U-BOOT操作
125 往地址AAAH写入AAH                        mw.w aaa aa
126 往地址554H写入55H                        mw.w 554 55
127 往地址AAAH写入A0H                        mw.w aaa A0H
128 往烧写地址写入要写的数据                mw.w 100000 1234h  往1M的地址写数据
129
130
131 5.测试内核自带的驱动程序:
132 1).通过配置内核支持NOR FLASH
133 --> Device Drivers
134     --> Memory Technology Device (MTD) support
135         --> Mapping drivers fro chip access
136         <M> CFI Flash device in physical memory map
137         (0x0) Physical start address of flash mapping     //起始地址
138         (0x1000000) Physical length of flash mapping    //内存大小,16M,要大于实际的大小
139         (2) Bank owidth in octets                        //位宽为16位
140 2).make modules
141 cp drivers/mtd/maps/physmap.ko  /home/study/nfs_home
142
143
144 6.写驱动程序
145 ①分配
146 ②设置
147 ③使用
148 驱动程序框架:
149
150 7.测试   使用自己写的驱动程序
151 2.保存以前的根文件系统的bootargs
152 nfs 30000000 192.168.1.5:/work/nfs_root/uImage_nonand
153 set bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.105:/work/nfs_root/first_fs ip=192.168.1.17:192.168.1.5:192.168.1.1:255.255.255.0::eth0:off
154
155 ls /dev/mtd*
156 insmod lhy_nor.ko
157 ls /dev/mtd*
158 格式化: flash_eraseall -j     /dev/mtd1        ;格式化为jffs2文件系统(一般nand(yaffs),nor(jffs2))
159
160 挂接: mount -t jffs2 /dev/mtdblock1 /mnt      ;格式化时用字符设备,挂接时用块设备
161 在里面增加文件,重启之后,看看文件是否还在
162 insmod lhy_nor.ko
163 ls /dev/mtd*
164 mount -t jffs2 /dev/mtdblock1 /mnt           ;读文件
165
166
167 8.协议层追踪
168 lhy_nor_mtd = do_map_probe("cfi_probe",lhy_nor_map);
169 lhy_nor_mtd = do_map_probe("jedec_probe",lhy_nor_map);
170
171
172 */
时间: 2024-10-05 00:28:00

S3C2440 nor_flash驱动程序的相关文章

S3C2440 nand_flash驱动程序

20150418 S3C2440 nand_flash驱动程序 2015-04-18 Lover雪儿 一.一个简单的nand_flash驱动 1.定义nand_chip.mtd_info两个结构体 如上图所示: nand_chip 结构体:是给nand_scan函数用的,而nand_scan函数提供了选中nand.发出命令.发出地址.发出数据.读取数据.判断状态等功能,所以nand_chip结构体上必须定义一系列实现上面功能能的函数,包括选中函数,负责发地址与命令的函数,以及判断状态的函数,最重

S3C2440实现dm9000网卡驱动程序移植

20150419 S3C2440实现dm9000网卡驱动程序移植 2015-04-19 Lover雪儿 首先附上厂家提供的完整的dm9000程序: 1 /* 2 3 dm9ks.c: Version 2.08 2007/02/12 4 5 A Davicom DM9000/DM9010 ISA NIC fast Ethernet driver for Linux. 6 7 This program is free software; you can redistribute it and/or

基于S3C2440的linux-3.6.6移植——LED驱动【转】

本文转载自:http://www.voidcn.com/blog/lqxandroid2012/article/p-625005.html 目前的linux版本的许多驱动都是基于设备模型,LED也不例外. 简单地说,设备模型就是系统认为所有的设备都是挂接在总线上的,而要使设备工作,就需要相应的驱动.设备模型会产生一个虚拟的文件系统——sysfs,它给用户提供了一个从用户空间去访问内核设备的方法,它在linux里的路径是/sys.如果要写程序访问sysfs,可以像读写普通文件一样来操作/sys目录

Android for S3C2440

转载: http://blog.csdn.net/blest/article/details/6215600 本人尚未尝试,先转载,以后再看. 1.移植基本环境: 我用的还是win的平台,所以使用了虚拟机:Vmware workstation 6.5.0 +ubuntu9.10: 交叉编译工具包EABI——4.3.3: 做好的镜像都是在win平台上使用串口烧录的 用到软件DNM: 启动之类的都用超级终端进行控制. 提示:TQ2440所附带的光盘中有很多有用的东西,建议大家看一下,所用的工具除了虚

S3C2440 驱动分层概念

为自己的坚持加油! 切入正题,今天要学习的是驱动的分层/分离概念. 分离分层的目的是将硬件相关的代码和系统中比较稳定的代码分离开,并且按照一定的框架联系到一起.这样我们在写一个驱动的时候能够更加灵活,顶层的应用程序也能更加稳定的调用底层的接口.对驱动开发者而言,这样写驱动程序将更有逻辑性.纯粹时个人理解哈. 以input.c框架为例,从图中可以看到系统把硬件相关的代码放在一起,把纯软件的相对稳定的部分放在一起,如evdev.c 最后他们通过input.c相连接. 除了输入子系统之外,设备总线也遵

linux驱动之触摸屏驱动程序

触摸屏归纳为输入子系统,这里主要是针对电阻屏,其使用过程如下 :当用触摸笔按下时,产生中断.在中断处理函数处理函数中启动ADC转换x,y坐标.ADC结束,产生ADC中断,在ADC中断处理函数里上报(input_event)启动定时器,再次启动定时器(可以处理滑动.长按),松开按键.其驱动程序的写法和之前写输入子系统的写法基本上一致.写出入口函数,出口函数并加以修饰,加入相关头文件,然后开始完善各函数,在入口函数中分配input_dev结构体,设置(能产生哪类事件,能产生这类事件中的哪些事件),注

linux下块设备驱动程序

块设备不能向字符设备那样访问,而是要先将请求放入队列,优化调整顺序后再执行,这种访问方式称为"电梯调度算法". 本篇文章通过ramdisk.nand flash.nor flash来讲解如何写块设备驱动程序. 一.ramdisk 1.因为块设备驱动程序是将请求放入队列然后调整顺序后执行,所以我们需要先定义请求队列: static unsigned char *ramblock_buf; ramblock_buf = kzalloc(RAMBLOCK_SIZE, GFP_KERNEL);

看门狗驱动程序

看门狗是当CPU进入错误状态后,无法恢复的情况下,使计算机重新启动 由于计算机在工作时不可避免的受到各种各样的因素干扰,即使再优秀的计算机程序也可能因为这种干扰使计算机进入一个死循环,更严重的就是导致死机. 有两种办法来处理这种情况: 一是:采用人工复位的方法 二是:依赖于某种硬件来执行这个复位工作.这种硬件通常叫做看门狗(Watch Dog,WD) 看门狗,就像一只狗一样,在那看着们,计算机中通常用定时器来处理这种周期性的动作 看门狗实际上是一个定时器,其硬件内部维护了一个定时器,每当时钟信号

I2C协议-&gt;裸机程序-&gt;adapter驱动程序分析

开发板:mini2440 内核  :linux2.6.32.2 参考  :韦东山毕业班I2C视频教程 1.i2c协议简要分析 i2c中线是一种由 PHILIPS 公司开发的串行总线,用于连接微控制器及其外围设备,它具有以下特点. 1.只有两条总线线路:一条串行数据线SDA,一条串行时钟线SCL. 2.每个连接到总线的器件都可以使用软件根据它的唯一的地址来确定. 3.传输数据的设备之间是简单的主从关系. 4.主机可以用作主机发送器或者主机接收器. 5.它是一个真正的多主机总线,两个或多个主机同时发