spi nor flash使用匯總


Overview

SPI flash, 分為spi flash, DUAL spi flash, QUAD spi flash,

3-wire spi, 4-wire spi, 6-wire spi. 在clock一定的情況下, 理論上線數越多速度越快

 

NOR flash和Nand flash相比 

  • NOR缺點: 價格貴, 容量小, 擦除塊大, 擦除速度慢, NOR flash擦出壽命為100,000次, 遠小於NAND flash的一百萬次. NOR可以單字節編程, 也就是說一次只更新一個byte
  • NOR優點: 讀速度快, 穩定不會出現位反轉, 不需要EDC和ECC,  不需要壞塊管理
  • NOR flash通常一次可以寫一個字節, NAND flash內存必須一次寫多個字節(通常為512字節)

NOR flash的優缺點決定了它的應用場: 適合存儲關鍵很少修改的數據, 比如bootloader kernel等代碼;不適合尺寸較大經常修改的數據,比如用戶地圖, 庫文件等

 

3 wire SPI

正常的SPI使用四根線: clock, cs, MOSI, MISO. 可以把MOSI MISO合並為一根線(slave out/slave in SISO)上實現半雙工. 主要用來實現低速傳輸

DUAL SPI

對於SPI flash來說, 全雙工並不常用, 因此擴展這兩根數據線, 使得他們支持半雙工傳輸, 加倍數據傳輸速度. 可以發送一個命令字節請求進入dual mode, 然后MOSI就變成了SIO0(Serial I/O 0), MISO變成了SIO1.

這種模式主要是針對SPI ROM, SPI flash設備, 需要進行大數據量傳輸

QUAD SPI

quad SPI又增加了兩根I/O線(SIO2 SIO3), 可以在一個時鍾周期傳送四個data bits. 通過使用特殊的命令, 使能quad mode.

Double data rate

除了使用多根I/O線, 某些設備還通過DDR技術增加傳輸速率

 

SPI NOR flash文件系統支持

NOR flash和普通機械硬盤, SSD, EMMC的最大區別就是NOR flash在寫之前,需要確保寫的位置是已經擦除過的, 因此並不適合使用傳統的Ext2/3/4, FAT/NTFS等文件系統

甚至YAFFS類的文件系統也不適合NOR flash

 

JFFS和JFFS2

這兩個文件系統都可以支持NOR flash, 並且提供了垃圾回收, 壞塊管理, 磨損平衡. 二者都存在文件系統mount速度較慢的問題, 不適合大容量flash

YAFFS/YAFFS2

已經被踢出主線內核了, 基本廢棄了.

 

Cramfs/Squashfs

常規的只讀文件系統, 都支持數據壓縮, 實現簡單, 速度快, 如果NOR flash存放的文件系統是只讀的, 盡量使用他們. 這些常規文件系統工作在傳統塊設備上, 需要內核支持

CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y

 

Ext2/3/4 FAT/NTFS

支持讀寫的塊設備文件系統不適合工作用在NOR flash上, 因為NOR flash寫操作會導致擦除操作, 速度慢, 影響壽命.

 

MTD模擬block device

打開CONFIG_MTD_BLOCK和CONFIG_MTD_BLKDEVS

啟動后/dev/下會增加幾個block設備

 

[cpp]  view plain  copy
 
  1. root@devm:~# ls /dev/mtd  
  2. mtd0       mtd1       mtd2       mtd3       mtdblock0  mtdblock2    
  3. mtd0ro     mtd1ro     mtd2ro     mtd3ro     mtdblock1  mtdblock3  


 

 

使用mkfs.ext4, 格式化mtdblock,

 

[cpp]  view plain  copy
 
  1. root@evm:~# mkfs.ext4 /dev/mtdblock3  
  2. mke2fs 1.42.9 (28-Dec-2013)  
  3. Filesystem label=  
  4. OS type: Linux  
  5. Block size=1024 (log=0)  
  6. Fragment size=1024 (log=0)  
  7. Stride=0 blocks, Stripe width=0 blocks  
  8. 1856 inodes, 7424 blocks  
  9. 371 blocks (5.00%) reserved for the super user  
  10. First data block=1  
  11. Maximum filesystem blocks=7602176  
  12. 1 block group  
  13. 8192 blocks per group, 8192 fragments per group  
  14. 1856 inodes per group  
  15.   
  16. Allocating group tables: done                              
  17. Writing inode tables: done                              
  18. Creating journal (1024 blocks): done  
  19. Writing superblocks and filesystem accounting information: done  

 

使用dd命令, 寫入cramfs鏡像

首先, 在Host創建cramefs鏡像

 

[cpp]  view plain  copy
 
  1. mkfs.cramfs rootfs/ cramfs.img  

 

dd命令導入鏡像

 

[cpp]  view plain  copy
 
  1. root@evm:~# dd if=/dev/mtdblock3 of=cramfs.img     
  2. 14848+0 records in  
  3. 14848+0 records out  
  4. root@evm:~# ls -l  
  5. -rw-r--r--    1 root     root       7602176 Jan  1 00:24 kaka.img  
  6. root@evm:~#   

 

 

NOR flash使用JFFS2

NOR flash上運行JFFS2, JFFS2通過MTD接口操作NOR flash

創建JFFS2鏡像

mkfs.jffs2工具在mtd-utils工具包中

 

[cpp]  view plain  copy
 
  1. sudo apt-get install mtd-utils  
  2.   
  3. mkfs.jffs2 -r rootfs/ -o jffs2.img --pad=0x800000  

--pad=0x800000 如果不加這個參數, 生成的鏡像尺寸(文件系統大小)是按照rootfs/小內容大小決定的;通過這個參數我們可以強制指定文件系統大小

 

燒寫JFFS2鏡像

有兩種燒寫方法:

1. 在uboot中把jffs2.img下載到DRAM中, 然后使用sf write命令把DRAM內容燒寫到nor flash上

2. 進入系統后使用 dd if=jffs2.img of=/dev/mtdblock4

二者性質上實際相同, 都是直接把鏡像燒到NOR flash某段內存中

 

掛載JFFS2文件系統

首先kernel要支持jffs2文件系統, 執行如下命令

 

[cpp]  view plain  copy
 
  1. mount -t jffs2 /dev/mtdblock4 /mnt  

 

 

文件系統掛載速度

由於JFFS2在掛載過程中需要執行掃描, 構造文件系統, 因此在同樣大小的mtdblock上, JFFS2掛載時間遠大於EXT4文件系統

 

文件系統尺寸為0x740000(7.25MB)

 

[cpp]  view plain  copy
 
  1. Ext4掛載時間  
  2.   
  3. root@evm:~# time mount -t ext4 /dev/mtdblock3 /mnt                                                                                                                
  4. real    0m 0.06s  
  5. user    0m 0.00s  
  6. sys     0m 0.00s  

 

 

 

[cpp]  view plain  copy
 
  1. JFFS2掛載時間  
  2.   
  3. root@evm:~# time mount -t jffs2 /dev/mtdblock3 /mnt  
  4. real    0m 0.34s  
  5. user    0m 0.00s  
  6. sys     0m 0.33s  



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM