Nor Flash 程式設計

2021-04-13 06:52:46 字數 4109 閱讀 4510

[email protected]

nor flash

與nand flash

的不同之處在於

nor flash

的位址和資料線是不共用的,所以

nor flash

比較象rom,

是可以按位址自由讀的,這樣就非常適合儲存**,在開機時從

nor flash

中取**來執行。在我的板子上有

16m的

intel

的nor flash e

28f128j

3a150

,以此為例來研究一下

nor flash

的一些常用操作。

e

28f128j

3a150

每個sector

是128k

,擦除是按扇區操作了。

首先來看下

e

28f128j

3a150與s

3c2410

的介面吧。

一般情況下

rom與

s

3c2410

的介面我們可以在

s

3c2410

的手冊上看到,如下圖所示

仔細看下

16位和

8位資料介面在位址線連線上的區別吧,

16位的位址線是要移位的,

a1接到

a0上,這當然是比較容易理解的,位寬大了一倍,位址就少了一條。對於

e

28f128j

3a150

其實也是這樣,不過又有點不一樣,仔細看看

e

28f128j

3a150

的手冊吧。下面給出接線圖。

不同之處

e

28f128j

3a150

貌似並沒有移位,其實只是因為

e

28f128j

3a150的a1

就相對於別的16位

rom的

a0,其

a0就相當於他們的

a(-1)

是用來指示

8位位址的,所以還是一樣的。

來看看flash

操作的命令集吧

以幾個比較重要的操作來說明比較容易懂

首先就是

read identifier codes

先給定我們的

flash

開始的位址吧,

flash_addr=ioremap(0x0,0x1000000);

實體地址從

0x0開始的

0x1000000

(16m

)位址空間,這樣得到了可訪問的虛擬位址

flash_addr

很簡單,看命令表

,先寫乙個命令

writew(0x90,flash_addr);

然後把manufacture code

讀回來readw(flash_addr)

; 接著再讀

device code

readw(flash_addr+2);

細節部分還是參考手冊吧

其實核心已經

mtd驅動完全支援

nor flash

的操作,所以不必要自己再寫了。

不過在jtag

燒寫flash

的程式中可以加入對我們自己的

flash

的支援。

來看看其中對

e

28f128j

3a150

的燒寫**,分析一下。

int strata_checkid(int targetaddr) //

返回manufacture code

int strata_checkdevice(int targetaddr) //

返回device code 看著

block erase flowchart

再對照著

block erase

的函式看就比較能完全看懂了

就相當於

_wr(targetaddress, 0x00ff)

,回到read array

的狀態。

}很清晰的流程吧。

共兩種program

方式可以把資料寫到

flash

中,一般也只用到這種就可以了

int strata_progflash(u32 realaddr,u16 data)

_wr(realaddr, 0x0070);

readstatus=_rd(realaddr);

bsr4=readstatus & (1<<4);

if (bsr4==0)

else

_reset();

return 0;

}以上這種寫會很慢,以致於

jtag

燒寫相當得慢。

去除sector

的寫保護_wr(targetaddr,0x0070);

readstatus=_rd(targetaddr);

sr3=readstatus & (1<<3);

sr4=readstatus & (1<<4);

sr5=readstatus & (1<<5);

if(sr3)

if(sr4 && sr5)

if(sr5)

_reset();

return res;

}另外按照

write to buffer

的流程自己寫了乙個函式,沒有

test

,不想再去燒寫了,太煩了,就這樣好了。

void strata_buffer_program(int blockaddress,int tagetaddress,u16* buf)

while(!bsr7);

_wr(blockaddress, 0x

001f

);for(i=0;i<=0x

1f;i++)

_wr(targetaddress+2*i, *(buf+i));

_wr(blockaddress, 0x00d0);

do while(!bsr7);

_wr(blockaddress, 0x0070);

readstatus=_rd(blockaddress);

bsr4=readstatus & (1<<4);

if (bsr4==0)

else

_reset();}

norflash驅動編寫

首先我們來看 參考drivers mtd maps physmap.c include include include include include include include include include include include include static struct map ...

norflash驅動編寫

首先我們來看 參考drivers mtd maps physmap.c include include include include include include include include include include include include static struct map ...

norflash驅動編寫

首先我們來看 參考drivers mtd maps physmap.c include include include include include include include include include include include include static struct map ...