娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年03月23日(星期日)

正在發(fā)生

2020年03月23日 | 第015課 NOR Flash操作原理及裸機程序分析

發(fā)布者:SparklingSoul 來源: eefocus關(guān)鍵字:NOR  Flash操作  裸機程序 手機看文章 掃描二維碼
隨時隨地手機看文章

#第001節(jié)_Nor Flash原理及硬件操作 #
Nor Flash的連接線有地址線,數(shù)據(jù)線,片選信號讀寫信號等,Nor Flash的接口屬于內(nèi)存類接口,Nor Flash可以向內(nèi)存一樣讀,但是不能像內(nèi)存一樣寫,需要做一些特殊的操作才能進行寫操作,讀只需像內(nèi)存一樣讀很簡單。

Nor Flash原理圖如圖:

這里寫圖片描述

Flash介紹

常用的Flash類型有Nor Flash和NAND Flash兩種。

Nor Flash由Intel公司在1988年發(fā)明,以替代當(dāng)時在市場上占據(jù)主要地位的EPROM和E2PROM。NAND Flash由Toshiba公司在1989年發(fā)明。兩者的主要差別如下表:

image.png

Nor Flash支持XIP,即代碼可以直接在Nor Flash上執(zhí)行,無需復(fù)制到內(nèi)存中。這是由于NorF lash的接口與RAM完全相同,可以隨機訪問任意地址的數(shù)據(jù)。Nor Flash進行讀操作的效率非常高,但是擦除和寫操作的效率很低,另外,Nor Flash的容量一般比較小。NAND Flash進行擦除和寫操作的效率更高,并且容量更大。一般而言,Nor Flash用于存儲程序,NAND Flash用于存儲數(shù)據(jù)。基于NAND Flash的設(shè)備通常也要搭配Nor Flash以存儲程字。

Flash存儲器件由擦除單元(也稱為塊)組成,當(dāng)要寫某個塊時,需要確保這個塊己經(jīng)
被擦除。Nor Flash的塊大小范圍為64kB、128kB:NAND Flash的塊大小范圍為8kB,64kB,擦/寫一個Nor Flash塊需4s,而擦/寫一個NAND Flash塊僅需2ms。Nor Flash的塊太大,不僅增加了擦寫時間,對于給定的寫操作,Nor Flash也需要更多的擦除操作——特別是小文件,比如一個文件只有IkB,但是為了保存它卻需要擦除人小為64kB—128kB的Nor Flash塊。

Nor Flash的接口與RAM完全相同,可以隨意訪問任意地址的數(shù)據(jù)。而NAND Flash的
接口僅僅包含幾個I/O引腳,需要串行地訪問。NAND Flash一般以512字節(jié)為單位進行讀寫。這使得Nor Flash適合于運行程序,而NAND Flash更適合于存儲數(shù)據(jù)。

容量相同的情況下,NAND Flash的體積更小,對于空間有嚴格要求的系統(tǒng),NAND Flash可以節(jié)省更多空間。市場上Nor Flash的容量通常為IMB~4MB(也有32MB的Nor Flash),NAND Flash的容量為8MB~512MB。容量的差別也使得Nor Flash多用于存儲程序,NAND Flash多用于存儲數(shù)據(jù)。

對于Flash存儲器件的可靠性需要考慮3點:位反轉(zhuǎn)、壞塊和可擦除次數(shù)。所有Flash器件都遭遇位反轉(zhuǎn)的問題:由于Flash固有的電器特性,在讀寫數(shù)據(jù)過程中,偶然會產(chǎn)生一位或幾位數(shù)據(jù)錯誤(這種概率很低),而NAND Flash出現(xiàn)的概率遠大于Nor Flash,當(dāng)位反轉(zhuǎn)發(fā)生在關(guān)鍵的代碼、數(shù)據(jù)上時,有可能導(dǎo)致系統(tǒng)崩潰。當(dāng)僅僅是報告位反轉(zhuǎn),重新讀取即可:如果確實發(fā)生了位反轉(zhuǎn),則必須有相應(yīng)的錯誤檢測/恢復(fù)措施。在NAND Flash上發(fā)生位反轉(zhuǎn)的概率史高,推薦使用EDC/ECC進行錯誤檢測和恢復(fù)。NAND Flash上面會有壞塊隨機分布在使用前需要將壞塊掃描出來,確保不再使用它們,否則會使產(chǎn)品含有嚴重的故障。NAND Flash每塊的可擦除次數(shù)通常在100000次左右,是Nor Flash的10倍。另外,因為NAND Flash的塊大小通常是NorF lash的1/8,所以NAND Flash的壽命遠遠超過Nor Flash。

嵌入式Linux對Nor、NAND Flash的軟件支持都很成熟。在Nor Flash上常用jffs2文
件系統(tǒng),而在NAND Flash常用yaffs文件系統(tǒng)。在更底層,有MTD驅(qū)動程序?qū)崿F(xiàn)對它們的讀、寫、擦除操仵,它也實現(xiàn)了EDC/ECC校驗。

Nor Flash的操作##

下面我們使用u-boot來體驗Nor Flash的操作(開發(fā)板設(shè)置Nor啟動,進入u-boot)。

1).使用OpenJTAG燒寫UBOOT到Nor Flash

那么我們怎么用u-boot來操作呢?

Nor Flash手冊里會有一個命令的表格,如圖:
這里寫圖片描述

下面簡單的舉一些例子:

復(fù)位(reset):往任何一個地址寫入F0。

讀ID(ReadSiliconID):很多的Nor Flash可以配置成位寬16bit(Word),位寬8bit(Byte)。對于我們使用的jz2440開發(fā)板使用是位寬16bit,怎樣讀ID呢?

根據(jù)前面得圖可知,往Nor Flash的555地址寫AA,再往2AA的地址寫入55,再往555的地址寫入90,然后就可以讀ADI地址,就可以讀到DDI數(shù)據(jù)了。

實例1

讀數(shù)據(jù):

在u-boot上執(zhí)行:md.b0

結(jié)果(和我們燒進去的數(shù)據(jù)完全一樣):

00000000:170000ea14f09fe514f09fe514f09fe5................
00000010:14f09fe514f09fe514f09fe514f09fe5................
00000020:6001f833c001f8332002f8337002f833`..3...3..3...3
00000030:e002f8330004f8332004f833efbeadde...3...3..3....

可以得出結(jié)論:u-boot可以像讀內(nèi)存一樣來讀nor flash

實例2

讀ID(參考Nor手冊)

  • 往地址555H寫入AAH(解鎖)

  • 往地址2AAH寫入55H(解鎖)

  • 往地址555H寫入90H(命令)

  • 讀0地址得到廠家ID(C2H)

  • 讀1地址得到設(shè)備ID(22DAH或225BH)

  • 退出讀ID狀態(tài):給任意地址寫F0H就可以了。

下圖為2440和Nor Flash的簡易連接圖:
這里寫圖片描述

2440的A1接到Nor的A0所以2440發(fā)出的地址是,Nor Flash收到的地址左移一位。比如:2440發(fā)出(555H<<1)地址,Nor Flash才能收到555H這個地址。

下面對在Nor Flash的操作,2440的操作,U-BOOT上的操作進行比較,如下表:

image.png

1).當(dāng)執(zhí)行過
md.w 0 1
結(jié)果(輸出廠家ID):
00000000:00c2…(00c2就是廠家ID)

2).當(dāng)執(zhí)行過
md.w 2 1

結(jié)果(輸出設(shè)備ID):
00000002:2249I"(2249就是設(shè)備ID)

3).當(dāng)執(zhí)行
mw.w 0 f0
就退出讀ID的狀態(tài),

執(zhí)行:
md.b0
結(jié)果:
00000000:17.(讀到的就是Nor Flash地址·0的數(shù)據(jù))

Nor Flash的兩種規(guī)范

通常內(nèi)核里面要識別一個 Nor Flash 有兩種方法:

一種是 jedec 探測,就是在內(nèi)核里面事先定義一個數(shù)組,該數(shù)組里面放有不同廠家各個芯片的一些參數(shù),探測的時候?qū)?flash 的 ID 和數(shù)組里面的 ID 一一比較,如果發(fā)現(xiàn)相同的,就使用該數(shù)組的參數(shù)。
jedec 探測的優(yōu)點就是簡單,缺點是如果內(nèi)核要支持的 flash 種類很多,這個數(shù)組就會很龐大。內(nèi)核里面用 jedec 探測一個芯片時,是先通過發(fā)命令來獲取 flash 的 ID,然后和數(shù)組比較,但是 flash.c 中連 ID 都是自己通過宏配置的。

一種是 CFI(common flash interface)探測,就是直接發(fā)各種命令來讀取芯片的信息,比如 ID、容量等,芯片本身就包含了電壓有多大,容量有有多少等信息。

下面對在Nor Flash上操作,2440上操作,U-BOOT上操作cfi 探測(讀取芯片信息)進行比較參考芯片手冊。

image.png

##Nor Flash寫數(shù)據(jù) ##
我們在Nor Flash的10000的地址讀數(shù)據(jù),
md.w 100000 1
結(jié)果:
00100000:ffff…
在Nor flash的10000的地址寫數(shù)據(jù)下0x1234,
mw.w 100000 1234
然后在這個地址讀數(shù)據(jù),
md.w 100000 1
結(jié)果:
00100000:ffff(這個地址上的數(shù)據(jù)沒有被修改,寫操作無效)。

怎樣把數(shù)據(jù)寫進Nor Flash進去呢?

寫數(shù)據(jù)之前必須保證,要寫的地址是擦除的。

下面是Nor Flash的寫操作,如下表:

image.png

1).U-BOOT執(zhí)行完上述指令后,0x1234,就被寫到0x100000地址處,


執(zhí)行:

md.w1000001

結(jié)果(1234被寫進去):

00100000:1234 4

從這里可以看出來U-BOOT的操作不是很復(fù)雜。


2).我們再次往0x100000地址處,寫入0x5678,執(zhí)行如下命令:

mw.w aaa aa

mw.w 554 55

mw.w aaa a0

mw.w 100000 5678

查看0x100000地址處的數(shù)據(jù)

md.w 100000 1

結(jié)果:

00100000:12300.

0x100000地址處的數(shù)據(jù)不是0x5678,寫操作失敗,失敗的原因是,原來的數(shù)據(jù)已經(jīng)是0x1234不是全0xffff,再次寫操作失敗,(Nor Flash只有先擦出,才能燒寫)。


先擦除(參考Nor Flash芯片手冊)

Nor Flash操作 u-boot操作

555H AAH mw.w aaa aa

2AAH 55H mw.w 554 55

555H 80H mw.w aaa 80

555H AAH mw.w aaa aa

2AAH 55H mw.w 554 55

SA 30H //往扇區(qū)地址寫入30 mw.w 100000 30


執(zhí)行完上述指令后測試


執(zhí)行:

md.w 100000 1

結(jié)果:

00100000:ffff…

已被擦除,這個時候再次燒寫就不會有問題了。


再燒寫

mw.w aaa aa

mw.w 554 55

mw.w aaa a0

mw.w 100000 5678


測試燒寫結(jié)果

執(zhí)行:

md.w 100000 1

結(jié)果:

00100000:5678 xV

數(shù)據(jù)被燒寫進去,燒寫成功。


總結(jié):我們燒寫時,如果上面的數(shù)據(jù),不是0ffff,沒有被擦除過,我們就要先擦出,擦除完后,才可以燒寫,擦除燒寫的命令可以從芯片手冊里面獲得。


= 第002節(jié)_Nor Flash編程_識別 =

本節(jié)實例的目的目的:識別nor flash

發(fā)送命令函數(shù)

nor_cmd函數(shù)代碼如下,往NOR Flash某個地址發(fā)送指令,


16

17 /* offset是基于NOR的角度看到 */

18 void nor_cmd(unsigned int offset, unsigned int cmd)

19 {

20 nor_write_word(NOR_FLASH_BASE, offset, cmd);

21 }

讀取函數(shù)


nor_read_word函數(shù)是從NOR Flash 讀取兩個字節(jié)(本開發(fā)板位寬16bit),讀取數(shù)據(jù)的地址,是基于2440,所以讀取NOR Flash某個地址上的數(shù)據(jù)時,需要把NOR Flash對應(yīng)的地址左移一位(地址乘以2)。


23 unsigned int nor_read_word(unsigned int base, unsigned int offset)

24 {

25 volatile unsigned short *p = (volatile unsigned short *)(base + (offset << 1));

26 return *p;

27 }

讀取地址中的數(shù)據(jù)


向nor_dat函數(shù)中寫入NOR Flash某個地址,返回該NOR Flash地址上的數(shù)據(jù)。


29 unsigned int nor_dat(unsigned int offset)

30 {

31 return nor_read_word(NOR_FLASH_BASE, offset);

32 }

進入NOR FLASH的CFI模式,讀取各類信息


do_scan_nor_flash函數(shù)代碼如下,該函數(shù)的功能:進入CFI模式讀取NOR Flash中的廠家ID,設(shè)備ID,容量等信息。


50/* 進入NOR FLASH的CFI模式

51 * 讀取各類信息

52 */

53 void do_scan_nor_flash(void)

54 {

55 char str[4];

56 unsigned int size;

57 int regions, i;

58 int region_info_base;

59 int block_addr, blocks, block_size, j;

60 int cnt;

61

62 int vendor, device;

63

64 /* 打印廠家ID、設(shè)備ID */

65 nor_cmd(0x555, 0xaa);    /* 解鎖 */

66 nor_cmd(0x2aa, 0x55); 

67 nor_cmd(0x555, 0x90);    /* read id */

68 vendor = nor_dat(0);

69 device = nor_dat(1);

70 nor_cmd(0, 0xf0);        /* reset */

71

72 nor_cmd(0x55, 0x98);  /* 進入cfi模式 */

073

74 str[0] = nor_dat(0x10);

75 str[1] = nor_dat(0x11);

76 str[2] = nor_dat(0x12);

77 str[3] = '

主站蜘蛛池模板: 吉木乃县| 共和县| 潢川县| 新乡市| 昔阳县| 尼勒克县| 白山市| 阳春市| 湾仔区| 江源县| 苏州市| 永顺县| 宾川县| 星座| 山阴县| 库伦旗| 泰和县| 平邑县| 华蓥市| 陆良县| 改则县| 永胜县| 南溪县| 泰安市| 宁津县| 博野县| 离岛区| 元阳县| 盈江县| 固镇县| 调兵山市| 阳城县| 龙里县| 重庆市| 边坝县| 麻城市| 兖州市| 乌兰浩特市| 卢氏县| 涞水县| 尼木县|