贰伍.Linux-Nor Flash驱动(详解)

一般来说图所示,能够见到physmap.c编写翻译成.ko模块了

WebGL定义了Javascript 和openGL ES
贰.0的组成专业,从而让浏览器在提供OpenGL和OpenGL ES
图形接口的平台上海展览中心现加上的3D图形。借助那项标准的出生,能够应用3D和Html成分来显现加上的用户图形界面,网游也会有批判性的浮动。
WebGL标准除了供给取得浏览器的原生援助以外,还索要经过大气Middleware组成总体的生态系统,帮忙Web开发者方便的创始3D内容。

cfi

人生其实是一场喜剧,淡淡的哀愁,淡淡的难过。

 图片 1

眼前WebGL标准早已获得了产业界大佬们的支撑: Apple (Mac OS Safari nightly
builds), 谷歌(Google) (Chrome玖.0), Mozilla (Firefox4.0 beta)和Opera (preview
build)。

里面physmap.c的probe函数如下

The Khronos Group在201一游戏开发者大会上揭橥了WebGL标准规范 大切诺基一.0
(中文
),
援助WebGL的浏览器不借助于任何插件便可提供硬件图形加速从而提供高质量的3D体验。

1.3
nand和nor区别:

当下已知的工具:C3DL、CopperLicht、EnergizeGL、GammaJS、GLGE,GTW、O3D、OSG、JS、SceneJS、
SpiderGL、TDL、Three.js、X3DOM。

唯有一个例外的扇区区域

 

代表解锁地址为0x5555,0x二AAAM,在那之中数组[0],表示属于伍位flash,定义如下:

 

cfi情势部分命令如下图所示:

读到0X一伍,0x一5=二1,如下图,刚好对应大家原理图的二1根nor地址线,所以体积为二^二一=二MB

(PS:能够参照内核自带的mtdram.c,里面是行使内存来模拟flash,
里面通过memcopy()等来落到实处对内存读写擦除)

纵使将这么些参数保存在cfi形式下钦命地点中,
往nor的0x55地点写入0x九八,即可进入cfi形式,

 

由于大家2440的flash型号是MX2九LV160DB,所以设备ID为0x224九

  • ERASEINFO(0x10000, 64)
  •    (0x0)
    Physical start address of flash mapping  // 设置物理集散地址
  •   
    (0x一千000) Physical length of flash mapping  //
    设置体量长度,必须超越等于作者nor的2MB
  •    (二)  
    Bank width in octets (NEW)                   //
    设置字节位宽,因为nor为10伍个人,所以等于2

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

CONFIG_MTD_PHYSMAP_BANKWIDTH:
nandflash的字节位宽

共有陆15个扇区,各种扇区都以64KB(0x一千0)

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

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

CONFIG_MTD_PHYSMAP_LEN:
nandflash的体量长度

3.写数据:

三.三接下去大家就来安顿基本,然后挂载那几个基础自带的norflash驱动实验1番

  •  CmdSet

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

急需以下三步:

一.发送解锁地址:

进去它的init函数:

意识1个未定义的变量:

故而注册多少个块设备驱动,要求以下步骤:

当2440访问0x0一地址时,由于2440的LADDLAND0线未接,所以依旧访问Nor的0地址上的二B数据,然后内部存款和储蓄器控制器会基于0x0壹来找到高7个人字节,并再次来到给CPU

  • [0] =
    MTD_UADDR_0x5555_0x2AAA

 图片 2

#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);
    }

对于2440来讲,因为那时候的A0~A1玖的体量刚好为二MB,与cfi方式下读取的数额一致,所以并未接A20

1.nor硬件介绍:

能够见到成立了四个分区“bootloader”,“root”,如下图所示,能够看到创设了二对mtd字符/块设备

 

 图片 3

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

对于nor运行:OM0接高,2440拜访的内部存款和储蓄器正是nor
flash,能够直接读,可是无法从来写

 


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

步骤如下:

 -> Memory Technology Device (MTD)
support  

2.nor
flash命令如下所示(参考MX2玖LV160DBTI.pdf)

jedec

对于nand运维:OM0接地,nand
flash的发端4KB会自动地被加载到2440停放的SRAM缓存器中,就能够直接读写

 图片 4

(接下去就会直接是program情势,执行reset模式便足以退出)

 

 

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

贰.出殡和埋葬命令:     

因为Nor
Flash的数码共有18个人,也正是每个地区保存了二B数据,而小编辈的2440每个区域是保存的一B数据,

2.三为何上海体育场面的A20引脚未有接?

 

因为2440共有多少个bank内部存款和储蓄器块,种种bank=128MB=(二^2七)B,所以共有2七根数据线

OM0切实可行参数如下所示,个中2440的OM一引脚暗许接地

代码如下:

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

2.1比如,当大家要program(往0x20地址写入0xff数据)时

 


 图片 5

那个变量是因而linux的menuconfig菜单配置出来的,若本身填入值,就不须求用menuconfig菜单配置了

三.陆然后放在nfs目录下,运转开发板

如出1辙地,norflash驱动也是坐落内核的mtd设备中,mtd设备也领悟对nor怎么样来读写擦除,只是不知道norflash的位宽(数据线个数),营地址等,所以大家的norflash驱动同样要兑现硬件相关的操作,须要mtd设备调用

三.接下来便来分析怎么着写norflash驱动

 

 图片 6

 

图片 7

比如:

从规律图中大家能观察NOSportageFLASH有地址线,有数据线,它和我们的SDRAM接口相似,能直接读取数据,不过不能够像SDRAM直接写入数据,供给有发号施令才行

往nor地址0x2AA写入0x55 

/*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");

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

最后会进去drivers/mtd/chips/jedec_probe.c中的jedec_probe_chip
()函数来使用读ID命令,通过ID来相称jedec_table[]数组.

当2440访问0X00地址时,就会读取到Nor上0地址的二B数据,然后2440的内部存款和储蓄器控制器会依据0x00来找到低伍人字节,并重返给CPU,

 图片 8

 图片 9

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

 图片 10

应用哪个种类命令,1般CmdSet=0xFFF0

  • .NumEraseRegions= 1

终极会跻身drivers/mtd/chips/cfi_probe.c中的cfi_probe_chip()函数来进入cfi形式,读取芯片音信

1.二为什么Nor
Flash的地址线A0是接在2440的LADD奥迪Q71上?

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

6.挂载驱动试验

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

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

 图片 11

壹.①里边我们2440的地址线共有贰柒根(LADDGL4500~二陆),为何是二7根?

 

 

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

 图片 12

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

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

如下图所示,insmod后打字与印刷了壹串新闻:

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

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

往nor地址0x555写入0xAA

六.一接下去便来对root分区(mtd①)来考试(使用flash此前最棒擦除二遍)

当大家在cfi方式下,比如:读取nor地址0x②7处的数额,便能读到nor的体积

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

三.1先来回看下从前的nandflsh驱动:

在2440中是透过硬件开关来设置OM0为Nand运行照旧Nor运转,如下图所示:

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

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;

}

CONFIG_MTD_PHYSMAP_STA中华VT:nandflash的物理营地址

 

 图片 13

-> Device
Drivers                

5.接下来大家来参考physmap.c来协调写norflah驱动

正如图所示,能够看来成立了三个mtd0字符设备,三个mtd0块设备:

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

3.伍 make modules 编写翻译模块

 图片 14

当*probe_type==”jedec_probe”时:

 图片 15

图片 16

二.二该NO福特Explorer有三种标准,
jedec, cfi(common flash interface) 

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

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