spi nor flash驱动

原创 2016年08月28日 16:20:39

嵌入式系统中flash的作用相当于PC上的硬盘来存放永久的数据,不像内存那样掉电数据就会消失。而我们使用的是nor flash,操作也比较简单,直接读取flash的地址就可以将数据通过memcpy到内存(当然是需要给相关寄存器配一些值),然后传给上层使用。

专用SPI控制器主要有CTRL,CMD,DATA,ADDR,STATUS寄存器。

相关命令

 /*      Command        Value      N Description             Addr Dummy Data */
 #define MX25L_WREN      0x06    /* 1 Write Enable              0   0     0 */
 #define MX25L_WRDI      0x04    /* 1 Write Disable             0   0     0 */
 #define MX25L_RDID      0x9f    /* 1 Read Identification       0   0     1-3 */
 #define MX25L_RDSR      0x05    /* 1 Read Status Register      0   0     >=1 */
 #define MX25L_WRSR      0x01    /* 1 Write Status Register     0   0     1 */
 #define MX25L_READ      0x03    /* 1 Read Data Bytes           3   0     >=1 */
 #define MX25L_FAST_READ 0x0b    /* 1 Higher speed read         3   1     >=1 */
 #define MX25L_PP        0x02    /* 1 Page Program              3   0     1-256 */
 #define MX25L_SE        0x20    /* 1 Sector Erase              3   0     0 */
 #define MX25L_BE        0xd8    /* 1 Block Erase              3   0     0 */
 #define MX25L_CE        0xc7    /* 1 chip Erase                0   0     0 */
 #define MX25L_DP        0xb9    /* 2 Deep power down           0   0     0 */
 #define MX25L_RES       0xab    /* 2 Read Electronic Signature 0   3     >=1 */
 #define MX25L_NOP       0x00    /* 2 No operation */


首先是对专门的SPI控制器进行初始化,也就是控制寄存器中设置分频系数和片选端,地址和命令寄存器中全部写0.并且提前写好扇区大小,页数等相关值,这些值放在一个全局结构体变量中,会被后面所用到。

 #define MX25L_MX25L6433f_SECTOR_SHIFT  12    /* block size 1 << 12 = 4k */
 #define MX25L_MX25L6433f_NSECTORS      2048 // 8M 
 #define MX25L_MX25L6433f_PAGE_SHIFT    9     /* Page size 1 << 9 =  */
 #define MX25L_MX25L6433f_NPAGES        8192*2

然后注册一些回调函数,主要是读写相关,上层最终调用的还是这些函数。

 <span style="white-space:pre">	</span> priv->mtd.erase  = drv_porting_flash_erase;
         priv->mtd.bread  = drv_porting_flash_bread;
         priv->mtd.bwrite = drv_porting_flash_bwrite;
         priv->mtd.read   = drv_porting_flash_read;
         priv->mtd.ioctl  = drv_porting_flash_ioctl;

flash属于一个块设备,所以也就会有分区的概念,这些分区信息(分几个区,每个区的起始地址和大小),是在config文件里面就事先写好的。

创建分区的函数

FAR struct mtd_dev_s *mtd_partition(FAR struct mtd_dev_s *mtd, off_t firstblock,off_t nblocks)
该函数,主要是创建相关结构体, 并且把相关回调函数注册好

   part->child.erase  = part_erase;
   part->child.bread  = part_bread;
   part->child.bwrite = part_bwrite;
   part->child.read   = mtd->read ? part_read : NULL;
   part->child.ioctl  = part_ioctl;
 #ifdef CONFIG_MTD_BYTE_WRITE
   part->child.write  = mtd->write ? part_write : NULL;
 #endif
 
   part->parent       = mtd;
   part->firstblock   = erasestart * blkpererase;
   part->neraseblocks = eraseend - erasestart;
   part->blocksize    = geo.blocksize;
   part->blkpererase  = blkpererase;
这些函数最终还是会调用到刚刚之前注册号的最底层的SPI控制器相关的回调函数中去。

Note:Nor flash介质和内核之间还有一个FTL(flash translation layer)中间层,这么做的主要原因还是因为SPI每次写之前是需要擦除的,所以也就是flash的读写次数是有寿命的,中间的ftl转换层,作为一个缓冲可以增加flash的使用寿命。

所以需要调用ftl相关函数

int ftl_initialize(int minor, FAR struct mtd_dev_s *mtd)
该函数最主要的还是创建ftl相关结构体,并且注册块设备函数。

register_blockdriver(devname, &g_bops, 0, dev);
相关注册函数

 static const struct block_operations g_bops =
 {
   ftl_open,     /* open     */
   ftl_close,    /* close    */
   ftl_read,     /* read     */
 #ifdef CONFIG_FS_WRITABLE
   ftl_write,    /* write    */
 #else
   NULL,         /* write    */
 #endif
   ftl_geometry, /* geometry */
   ftl_ioctl     /* ioctl    */
 };

当然,flash也可以做一个字符设备,也就可以调用字符设备注册的相关函数。

int bchdev_register(FAR const char *blkdev, FAR const char *chardev,bool readonly)

该函数主要完成两步:

   /* Setup the BCH lib functions */   
    ret = bchlib_setup(blkdev, readonly, &handle);
 
    /* Then setup the character device */
    ret = register_driver(chardev, &bch_fops, 0666, handle);

相关回调函数和注册块设备的是相同的。

总的来说,也就是相当于注册了三次回调函数,然后最上层开始一层一层调用,一般都是类似****_i_node->read()的方式来调用的。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

spi nor flash使用汇总

Overview SPI flash, 分为spi flash, DUAL spi flash, QUAD spi flash, 3-wire spi, 4-wire spi, 6-wire spi....
  • kickxxx
  • kickxxx
  • 2017年02月24日 16:38
  • 4176

Nand Flash,Nor Flash,CFI Flash,SPI Flash 之间的关系

前言:     在嵌入式开发中,如uboot的移植,kernel的移植都需要对Flash 有基本的了解。下面细说一下标题中的中Flash中的关系 一,Flash的内存存储结构     flash按照...

SPI Nor Flash

SPI协议 Slave与Master 一般而言,提供clock的一方称为master。如下图(7-1)中的SCLK方向可知:Processor为master,而Peripheral为slave。 ...

FLASH 存储学习-串行SPI nor

分类: 嵌入式 1.1 SST25VF080B简介1.1.1 主要特性 关键点:容量、速度(时钟速度、读写速度)、功耗。 l 容量:8MBit; l 最高SPI时钟频率:50MHz; ...

linux设备驱动程序之SPI nor flash

(1)检查MCLK\MOSI\MISO 电压是否是3.3V左右,满足nor flash datasheet的电压 (2)提高MCLK drving能力 (3)GPIO 引脚是否配置正确 (4)C...
  • lbaihao
  • lbaihao
  • 2016年10月28日 20:06
  • 1354

spi flash 和 Nor flash 区别

1、SPI Flash (即SPI Nor Flash)是Nor Flash的一种; 2、NOR Flash根据数据传输的位数可以分为并行(Parallel)NOR Flash和串行(SPI)NOR...

Linux块设备驱动之NOR FLASH

块设备驱动之NOR FLASH /*  * 参考 drivers\mtd\maps\physmap.c  */   static struct map_info *s3c_nor_map; stati...

norflash驱动编写

首先我们来看代码: /* *参考drivers\mtd\maps\physmap.c */ #include #include #include #include #incl...

norflash驱动程序——基础知识

1、我们先来看下原理图: LADDR1——LADDR20:20位地址线 LDATA0——LDATA15  :16位数据线 nRESET                        :复...

块设备驱动之NOR FLASH驱动

本文会对NOR FLASH 驱动进行详尽分析。通过NOR FLASH 驱动对块设备驱动进行更深入的了解。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spi nor flash驱动
举报原因:
原因补充:

(最多只允许输入30个字)