Animation中唯有一对门类的情节是被高度优化的公海赌船网站,所以共有27根数据线

1.nor硬件介绍:

CAEAGLLayer

当iOS要拍卖高质量图形绘制,必要时就是OpenGL。应该说它应该是最后的绝活,至少对于非游戏的采用来说是的。因为相比Core
Animation和UIkit框架,它神乎其神地复杂。

OpenGL提供了Core
Animation的根基,它是底层的C接口,直接和魅族,苹果平板的硬件通讯,极少地抽象出来的措施。OpenGL没有目标只怕图层的接续概念。它只是简单地拍卖三角形。OpenGL中兼有东西都以3D空间中有颜色和纹理的三角形。用起来卓殊复杂和有力,然则用OpenGL绘制iOS用户界面就要求多多过多的办事了。

为了可以以高品质使用Core
Animation,你必要看清你须要绘制哪一类内容(矢量图形,例子,文本,等等),但后选用适用的图层去显示那些内容,Core
Animation中唯有局地类型的内容是被高度优化的;所以如果你想绘制的东西并无法找到专业的图层类,想要拿到高质量就相比费事情了。

因为OpenGL根本不会对你的始末展开固然,它亦可绘制得一定快。利用OpenGL,你可以绘制任何你领会须求的联谊消息和造型逻辑的内容。所以广大游戏都喜爱用OpenGL(这个情状下,Core
Animation的界定就旗帜明显了:它优化过的内容类型并不一定能满意须要),但是这么借助,方便的万丈抽象接口就没了。

在iOS
5中,苹果引入了五个新的框架叫做GLKit,它去掉了一部分设置OpenGL的复杂性,提供了2个称作CLKViewUIView的子类,帮您处理超过半数的装置和制图工作。前提是习以为常的OpenGL绘图缓冲的平底可陈设项仍旧要求你用CAEAGLLayer完成,它是CALayer的3个子类,用来呈现任意的OpenGL图形。

一大半动静下您都不须要手动设置CAEAGLLayer(假如用GLKView),过去的日子就无须再提了。尤其的,我们将安装2个OpenGL
ES 2.0的上下文,它是当代的iOS设备的科班做法。

尽管不须求GLKit也得以做到那总体,不过GL基特囊括了多如牛毛杰出的行事,比如设置终点和某些着色器,那么些都是类C语言叫做GLSL自包蕴在程序中,同时在运作时载入到图片硬件中。编写GLSL代码和安装EAGLayer从来不怎么关系,所以大家将用GLKBaseEffect类将着色逻辑抽象出来。其余的业务,大家照旧会有过去的点子。

在始发从前,你必要将GLKit和OpenGLES框架加入到你的序列中,然后就足以兑现清单6.14中的代码,里面是安装多个GAEAGLLayer的足足工作,它利用了OpenGL
ES 2.0 的绘图上下文,并渲染了三个死里逃生三角(见图6.15).

清单6.14 用CAEAGLLayer绘图多少个三角形

公海赌船网站 1公海赌船网站 2

  1 #import "ViewController.h"
  2 #import 
  3 #import 
  4 
  5 @interface ViewController ()
  6 
  7 @property (nonatomic, weak) IBOutlet UIView *glView;
  8 @property (nonatomic, strong) EAGLContext *glContext;
  9 @property (nonatomic, strong) CAEAGLLayer *glLayer;
 10 @property (nonatomic, assign) GLuint framebuffer;
 11 @property (nonatomic, assign) GLuint colorRenderbuffer;
 12 @property (nonatomic, assign) GLint framebufferWidth;
 13 @property (nonatomic, assign) GLint framebufferHeight;
 14 @property (nonatomic, strong) GLKBaseEffect *effect;
 15 
 16 @end
 17 
 18 @implementation ViewController
 19 
 20 - (void)setUpBuffers
 21 {
 22     //set up frame buffer
 23     glGenFramebuffers(1, &_framebuffer);
 24     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
 25 
 26     //set up color render buffer
 27     glGenRenderbuffers(1, &_colorRenderbuffer);
 28     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
 29     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderbuffer);
 30     [self.glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:self.glLayer];
 31     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_framebufferWidth);
 32     glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_framebufferHeight);
 33 
 34     //check success
 35     if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
 36         NSLog(@"Failed to make complete framebuffer object: %i", glCheckFramebufferStatus(GL_FRAMEBUFFER));
 37     }
 38 }
 39 
 40 - (void)tearDownBuffers
 41 {
 42     if (_framebuffer) {
 43         //delete framebuffer
 44         glDeleteFramebuffers(1, &_framebuffer);
 45         _framebuffer = 0;
 46     }
 47 
 48     if (_colorRenderbuffer) {
 49         //delete color render buffer
 50         glDeleteRenderbuffers(1, &_colorRenderbuffer);
 51         _colorRenderbuffer = 0;
 52     }
 53 }
 54 
 55 - (void)drawFrame {
 56     //bind framebuffer & set viewport
 57     glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
 58     glViewport(0, 0, _framebufferWidth, _framebufferHeight);
 59 
 60     //bind shader program
 61     [self.effect prepareToDraw];
 62 
 63     //clear the screen
 64     glClear(GL_COLOR_BUFFER_BIT); glClearColor(0.0, 0.0, 0.0, 1.0);
 65 
 66     //set up vertices
 67     GLfloat vertices[] = {
 68         -0.5f, -0.5f, -1.0f, 0.0f, 0.5f, -1.0f, 0.5f, -0.5f, -1.0f,
 69     };
 70 
 71     //set up colors
 72     GLfloat colors[] = {
 73         0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
 74     };
 75 
 76     //draw triangle
 77     glEnableVertexAttribArray(GLKVertexAttribPosition);
 78     glEnableVertexAttribArray(GLKVertexAttribColor);
 79     glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, vertices);
 80     glVertexAttribPointer(GLKVertexAttribColor,4, GL_FLOAT, GL_FALSE, 0, colors);
 81     glDrawArrays(GL_TRIANGLES, 0, 3);
 82 
 83     //present render buffer
 84     glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderbuffer);
 85     [self.glContext presentRenderbuffer:GL_RENDERBUFFER];
 86 }
 87 
 88 - (void)viewDidLoad
 89 {
 90     [super viewDidLoad];
 91     //set up context
 92     self.glContext = [[EAGLContext alloc] initWithAPI: kEAGLRenderingAPIOpenGLES2];
 93     [EAGLContext setCurrentContext:self.glContext];
 94 
 95     //set up layer
 96     self.glLayer = [CAEAGLLayer layer];
 97     self.glLayer.frame = self.glView.bounds;
 98     [self.glView.layer addSublayer:self.glLayer];
 99     self.glLayer.drawableProperties = @{kEAGLDrawablePropertyRetainedBacking:@NO, kEAGLDrawablePropertyColorFormat: kEAGLColorFormatRGBA8};
100 
101     //set up base effect
102     self.effect = [[GLKBaseEffect alloc] init];
103 
104     //set up buffers
105     [self setUpBuffers];
106 
107     //draw frame
108     [self drawFrame];
109 }
110 
111 - (void)viewDidUnload
112 {
113     [self tearDownBuffers];
114     [super viewDidUnload];
115 }
116 
117 - (void)dealloc
118 {
119     [self tearDownBuffers];
120     [EAGLContext setCurrentContext:nil];
121 }
122 @end

View Code

 

 

图6.15 用OpenGL渲染的CAEAGLLayer图层

在三个真正的OpenGL应用中,大家兴许会用NSTimerCADisplayLink周期性地每分钟调用-drawRrame方法伍拾9遍,同时会将几何图形生成和制图分开以便不会每一回都再一次生成三角形的终点(那样也可以让我们绘制其他的一对事物而不是一个三角形形而已),可是下面这些例子已经丰盛演示了绘图原则了。

1.

 公海赌船网站 3

小编学妹,在QQ上给小编留言:学姐,小编想请教您一个标题,一个那么些小气的阿婆对婚姻影响大吗?感觉以往大妈好小气,和自个儿的消费观念差异太大。每一次她的抠门都会潜移默化自个儿的心气,最终就会造成自身和男朋友闹争论。大家将要结婚了,作者家不要彩礼,还嫌小编家带大礼没给本人男朋友买衣装。送的酒非要搞那种不是很好的酒。无数十次想分手,就以为他家里人太吝啬。

从规律图中大家能来看NOXC60FLASH有地址线,有数据线,它和我们的SDRAM接口相似,能一贯读取数据,可是不只怕像SDRAM直接写入数据,要求有指令才行

自作者后来又问了他多少个难点,她感觉男朋友条件相似,两年工作并未起色。如故异地,七日见一回面,因为考试没有考在二个地点。她标准还可以,正式的工作,家里最小,经济条件也比男朋友家好。因为男朋友是独生子女,家里条件不佳,她就从未要彩礼。本人直接看不上他家,但老人催促,不让她分。

1.1里边我们2440的地址线共有27根(LADD奥德赛0~26),为什么是27根?

2.

因为2440共有三个bank内存块,每一种bank=128MB=(2^27)B,所以共有27根数据线

我说:您都这么嫌弃人家了,本人条件可以,直接分手呗,年龄不大,再找1个。未来糟糕听,今后只会更为不佳听。

1.2为什么Nor
Flash的地址线A0是接在2440的LADDEscort1上?

她说:但是明日都带大礼了,后悔已经来不及了,周围人都知道自家快结婚了。现在分,闹得场地太大,还有爱情也舍不得放任。外人挺好的,每一遍都因为那个想法和平解决。

因为Nor
Flash的数量共有13个人,相当于种种地方保存了2B多少,而小编辈的2440每一个地点是保留的1B数据,

我说:您唯有三种选拔,要么分手,无论怎么闹,本身都不投降。要么认命,什么工作都要好想方法。既然分手不可以,那就接受现状,采用积极的神态消除难点。

比如:

她说:离别有幸福的大概性,结婚就是毕生。没有其他措施了吧?

当2440访问0X00地址时,就会读取到Nor上0地址的2B数据,然后2440的内存控制器会根据0x00来找到低六个人字节,并回到给CPU,

因为是自己学妹,我讲讲挺不谦虚的。我说:您高校四年心情学白学了,自个儿还和阿婆打电话,对住户讲话不客气。作者说句逆耳的,你在此地和自家抱怨,觉得自个儿不可以缓解难题,小编瞧不起你。你来问作者,你认为自身还是可以有怎么着花样,事物的法则,你恐怕比本身都知道。

当2440访问0x01地址时,由于2440的LADD途乐0线未接,所以依旧访问Nor的0地址上的2B数据,然后内存控制器会依照0x01来找到高六位字节,并回到给CPU

她说:小编有时候也挺讨厌自身的,纠结症病人。他曾外祖母死亡,自杀的那种,缺少教育,娘家比较穷,所以相比小气。有时候我能分晓,但那个气,作者受不住。

1.3
nand和nor区别:

3.

nor flash在价格上比nand贵,且体量很小
,擦除和写多少都慢,好处在于接口简单,稳定,无位反转,坏块,常用于保存关键数据,而nand
flash常用于保存大容积数据

笔者们如同此聊了挺久的,若是她们平昔不恋爱五年,从学院时代就在共同,并且多少人的情丝也不利,男朋友对她很包容。我就觉得他拿着一手好牌打错了,她家庭标准尚可,正式工作,干嘛给自个儿找气受,大姨抠门,买的屋宇,还一贯不给装修,并且几人工作还不在一起,异地。将来能依然不能够考到一起或许难点。

在2440中是因而硬件开关来设置OM0为Nand运转依然Nor运转,如下图所示:

可是我们是有情义的动物,因为有心理才汇合临那样的窘境。小编劝她,一定不要觉得男朋友高攀自身。大家必然要坚信,未来在同步的人,就是最般配大家的人。笔者让她全部往好处想,房子好歹给买了,很三个人连房子还尚无呢。装修,自个儿弄呗。

 公海赌船网站 4

自个儿听下来,男朋友人还不易的,男朋友并不会因为她闹,就找家里要钱,如故挺考虑老人难处的。小编也说她就不应当和大姨闹,婆媳的关联本来就丝丝缕缕,大家客客气气的,又不生活在一道。

OM0现实参数如下所示,其中2440的OM1引脚暗中同意接地

学妹本身也做了反省,觉得自个儿性子挺小气的,对事小气,婆婆对钱小气,其实是一类人。

 公海赌船网站 5

学妹本身担心啊,就男朋友那二个幼子,姑姑抠门,省下的钱,最后还不都以他俩的?还有普通家庭,已经买房子了,还是可以有稍许钱啊?彩礼都不用了,其它的琐屑就无须计较了。

对此nand运维:OM0接地,nand
flash的上马4KB会自动地被加载到2440放到的SRAM缓存器中,就可以直接读写

本身3个好爱人,她那边的聘礼6.6万,男朋友那边的3.6万,为了照顾双方老人的面子,不为难。男朋友和她一起贴了3万,那样两边都没关系难点。我们碰着题目,尤其在婚姻中,尽量消除难题的态度,即使抱怨,那好日子也就到底了。

对此nor运维:OM0接高,2440拜访的内存就是nor
flash,能够一直读,但是无法一向写

学妹现在就毫无因为姑姑那边的事务和男友再闹了,要降服其心呀。二姑小气,不甘于多接触,就逢年过节去探望,买好东西,让男朋友多回家。

 

自作者直接认为死心才能踏地,这一个死心不是心如止水,而是灭掉自个儿不行不甘心的、躁动的遐思,踏踏实实过好脚下的活着。降服自身的内心,接受当下的生存,降服对方的心,愿意把大家正是生命里主要的人,一起走下来。

2.nor
flash命令如下所示(参考MX29LV160DBTI.pdf)

若是大家强调公平,讲究理所应当,那我们就失去了主动权。弱势的人,才给这么些世界要不分轩轾,内心强大的人,早就想着自个儿消除难题。大家不少时候,都以颓唐的选项,而积极的面对,让大家可以从容自信的过好生活。

 公海赌船网站 6

其中word是针对16位nand,byte针对8位nand.

鉴于大家2440的flash型号是MX29LV160DB,所以设备ID为0x2249

 

2.1
比如,当我们要program(往0x十九人置写入0xff数据)时

急需以下3步:

1.发送解锁地址:

往nor地址0x555写入0xAA

往nor地址0x2AA写入0x55 

2.发送命令:     

往nor地址0x555写入0xA0               
//进入program模式

3.写数据:

往nor地址0x20(PA)写入0xff(PD)         
//往0x20写入0xff

(接下去就会直接是program形式,执行reset格局便足以退出)

2.2该NO奥迪Q3有三种标准,
jedec, cfi(common flash interface) 

jedec

就是和nandflash的一样,通过读ID来匹配linux内核中drivers/mtd/chips/jedec_probe.c里的jedec_table[]数组,来鲜明norflash的次第参数(名称、体积、位宽等),如下图所示:

 公海赌船网站 7

  • [0] =
    MTD_UADDR_0x5555_0x2AAA

代表解锁地址为0x5555,0x2AAAM,其中数组[0],表示属于八人flash,定义如下:

公海赌船网站 8

  •  CmdSet

行使哪一类命令,一般CmdSet=0xFFF0

  • .NumEraseRegions= 1

只有3个例外的扇区区域

  • ERASEINFO(0x10000, 64)

共有六十七个扇区,各种扇区都以64KB(0x一千0)

cfi

不怕将那个参数保存在cfi情势下钦赐地方中,
往nor的0x55地址写入0x98,即可进入cfi格局,

cfi形式部分命令如下图所示:

 公海赌船网站 9

当大家在cfi方式下,比如:读取nor地址0x27处的数码,便能读到nor的体量

一般来说图所示,之所以地址*2,是因为nor地址线A0接在大家2440的A1上(退出cfi方式,使用复位命令即可)

公海赌船网站 10

读到0X15,0x15=21,如下图,刚好对应大家原理图的21根nor地址线,所以体量为2^21=2MB

 公海赌船网站 11

2.3为啥上图的A20引脚没有接?

对于2440来讲,因为这时候的A0~A19的容积刚好为2MB,与cfi情势下读取的数码一致,所以并未接A20

 

3.接下来便来分析哪些写norflash驱动

3.1
先来回看下在此以前的nandflsh驱动:

nandflsh驱动会放在内核的mtd设备中,而mtd设备接头哪些通过命令/地址/数据来操作nandflash,所以咱们事先的nandflash驱动只兑现了硬件相关的操作(构造mtd_info,nand_chip结构体、运维nand控制器等)

无异于地,norflash驱动也是坐落内核的mtd设备中,mtd设备也明白对nor怎样来读写擦除,只是不知底norflash的位宽(数据线个数),集散地址等,所以大家的norflash驱动同样要完结硬件相关的操作,须要mtd设备调用

 

3.2参考内核自带的nor驱动:drivers/mtd/maps/physmap.c

跻身它的init函数:

 公海赌船网站 12

察觉注册了多少个platform平台设备驱动,进入physmap_flash结构体中:

 公海赌船网站 13

察觉1个未定义的变量:

CONFIG_MTD_PHYSMAP_BANKWIDTH:
nandflash的字节位宽

CONFIG_MTD_PHYSMAP_STACRUISERT:nandflash的物理集散地址

CONFIG_MTD_PHYSMAP_LEN:
nandflash的体量长度

这二个变量是透过linux的menuconfig菜单配置出来的,若本人填入值,就不必要用menuconfig菜单配置了

 

3.3接下去我们就来布置基本,然后挂载那么些基础自带的norflash驱动实验一番

3.4 首先make
menuconfig,配置方面三个变量,然后设为模块

-> Device
Drivers                

 -> Memory Technology Device (MTD)
support  

 -> Mapping drivers for chip
access                   //进入映射驱动


 

<M>
CFI Flash device in physical memory map       
  //将协助cfi的norflash设置为模块

  •    (0x0)
    Physical start address of flash mapping  // 设置物理基地址
  •   
    (0x一千000) Physical length of flash mapping  //
    设置体量长度,必须高于等于我nor的2MB
  •    (2)  
    Bank width in octets (NEW)                   //
    设置字节位宽,因为nor为1伍位,所以等于2

 


3.5 make modules 编译模块

一般来说图所示,可以看出physmap.c编译成.ko模块了

 公海赌船网站 14

3.6
然后放在nfs目录下,运行开发板

如下图所示,insmod后打印了一串音讯:

 公海赌船网站 15

一般来说图所示,可以看来创立了1个mtd0字符设备,一个mtd0块设备:

 公海赌船网站 16

 

4.接下来大家便分析physmap.c,咋样写出norflash驱动的

里面physmap.c的probe函数如下

struct physmap_flash_info {
       struct mtd_info             *mtd;             //实现对flash的读写擦除等操作
       struct map_info            map;              //存放硬件相关的结构体
       struct resource             *res;
#ifdef CONFIG_MTD_PARTITIONS
       int                 nr_parts;
       struct mtd_partition      *parts;
#endif
};

static const char *rom_probe_types[] = { "cfi_probe", "jedec_probe", "map_rom", NULL };    //芯片名称

... ...
static int physmap_flash_probe(struct platform_device *dev)
{
       const char **probe_type;
       ... ...
       /*1. 分配结构体*/
       info = kzalloc(sizeof(struct physmap_flash_info), GFP_KERNEL);

       /*2.设置map_info 结构体*/
    info->map.name = dev->dev.bus_id;                 //norflash的名字
       info->map.phys = dev->resource->start;          //物理基地址
       info->map.size = dev->resource->end - dev->resource->start + 1;       //容量长度
       info->map.bankwidth = physmap_data->width;                     //字节位宽
       info->map.virt = ioremap(info->map.phys, info->map.size);    //虚拟地址

       simple_map_init(&info->map);                   //简单初始化map_info的其它成员

       probe_type = rom_probe_types;
       /*3. 设置mtd_info 结构体 */
       /*通过probe_type指向的名称来识别芯片,当do_map_probe()函数返回NULL表示没找到*/
       /*当找到对应的芯片mtd_info结构体,便返回给当前的info->mtd */
       for (; info->mtd == NULL && *probe_type != NULL; probe_type++)       
       info->mtd = do_map_probe(*probe_type, &info->map); //通过do_map_probe ()来识别芯片


       if (info->mtd == NULL) {             //最终还是没找到芯片,便注销之前注册的东西并退出
              dev_err(&dev->dev, "map_probe failed\n");
              err = -ENXIO;
              goto err_out;
       }

       info->mtd->owner = THIS_MODULE;        



       /*4.添加mtd设备*/

       add_mtd_device(info->mtd);              

       return 0;



err_out:

       physmap_flash_remove(dev);                      //该函数用来注销之前注册的东西

       return err;

}

 

通过上边的代码和注释分析到,和大家上一节的nandflash驱动相似,那里是设置map_info
结构体和mtd_info结构体来成功的,当大家要对norflash分区即将采用add_mtd_partitions()才行

其中当*probe_type==“cfi_probe”时:

就会透过do_map_probe(“cfi_probe”,
&info->map)来鉴别芯片.

末尾会进去drivers/mtd/chips/cfi_probe.c中的cfi_probe_chip()函数来进入cfi形式,读取芯片新闻

当*probe_type==”jedec_probe”时:

说到底会跻身drivers/mtd/chips/jedec_probe.c中的jedec_probe_chip
()函数来利用读ID命令,通过ID来匹配jedec_table[]数组.

由此注册2个块设备驱动,必要以下步骤:

  • 1.
    分配mtd_info结构体和map_info结构体
    1. 设置map_info
      结构体
    1. 设置mtd_info
      结构体
  • 4.
    使用add_mtd_partitions()或者add_mtd_device()来创建MTD字符/块
    设备

 

5.接下来大家来参考physmap.c来本身写norflah驱动

代码如下:

#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 <asm/io.h>


static struct mtd_info        *mynor_mtd_info;
static struct map_info         *mynor_map_info;


static struct mtd_partition mynor_partitions[] = {
       [0] = {
        .name   = "bootloader",
        .size   = 0x00040000,
        .offset     = 0,
       },
       [1] = {
        .name   = "root",
        .offset = MTDPART_OFS_APPEND,
        .size   = MTDPART_SIZ_FULL,
       }
};

static const char *mynor_probe_types[] = { "cfi_probe", "jedec_probe",NULL};


static int mynor_init(void)
{
    int val;

/*1. 分配map_info 结构体和mtd_info结构体*/
    mynor_mtd_info=kzalloc(sizeof(struct mtd_info), GFP_KERNEL);
    mynor_map_info=kzalloc(sizeof(struct map_info), GFP_KERNEL);

/*2. 设置map_info 结构体*/
    mynor_map_info->name="my_nor";
    mynor_map_info->phys=0x0;                          //物理地址
    mynor_map_info->size=0x1000000;                 //=16M,长度必须大于等于norflash的2M容量
    mynor_map_info->bankwidth=2;                     //16位宽
    mynor_map_info->virt = ioremap(0x0, mynor_map_info->size);   //虚拟地址
    simple_map_init(mynor_map_info);

/*3. 设置mtd_info 结构体*/
   mynor_mtd_info = do_map_probe("cfi_probe", mynor_map_info);
   if (!mynor_mtd_info)
   {
     mynor_mtd_info = do_map_probe("jedec_probe", mynor_map_info);
    }

    if (!mynor_mtd_info)
    {
    printk(“not available norflash !!!\r\n”);
    goto err_out;
    }
    mynor_mtd_info->owner=THIS_MODULE;

 

/*4. 使用add_mtd_partitions()或者add_mtd_device()来创建MTD字符/块 设备*/
       add_mtd_partitions(mynor_mtd_info,mynor_partitions,2);
       return 0;


err_out:
       iounmap(mynor_map_info->virt);                      //取消虚拟地址映射
       kfree(mynor_map_info);
       kfree(mynor_mtd_info);      
       return 0;
}


static  void mynor_exit(void)
{
    del_mtd_partitions(mynor_mtd_info);                  //卸载分区
    iounmap(mynor_map_info->virt);                      //取消虚拟地址映射
    kfree(mynor_map_info);
    kfree(mynor_mtd_info);       
}

module_init(mynor_init);
module_exit(mynor_exit);
MODULE_LICENSE("GPL");

 

6.挂载驱动试验

(一定要在nor运营下挂载才行,因为2440使用nand运维时,是造访不了nor的前4k地址)

insmod挂载驱动后,如下图所示:

 公海赌船网站 17

可以见到创制了八个分区“bootloader”,“root”,如下图所示,可以看到创制了2对mtd字符/块设备

 公海赌船网站 18

6.1
接下去便来对root分区(mtd1)来试验(使用flash在此之前最好擦除五遍)

手续如下:

./flash_eraseall -j /dev/mtd1                      //使用mtd-util工具的flash_eraseal命令来擦除root分区(mtd1)

mount -t jffs2 /dev/mtdblock1 /mnt/                //使用mount挂载文件系统, -t:文件系统类型(type)

 

接下去就可以在/mnt目录下来任意读写文件了,最后会保留在flash的mtdblock1块设备中

(PS:能够参照内核自带的mtdram.c,里面是采取内存来模拟flash,
里面通过memcopy()等来兑现对内存读写擦除)

相关文章