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 ...