TX2440裸機程式 nor flash

2021-06-19 11:41:15 字數 2274 閱讀 5730

norflash和nandflash是應用不同技術而實現的非易失快閃儲存器。它們之間的各自特點在這裡就不做介紹了,而只把s3c2440對norflash的操作做一講解。我們用的norflash為en29lv160ab,其實對各種型號的norflash進行讀寫等操作差別不大。

對norflash的操作主要就是讀、寫、擦除和識別等。en29lv160ab的資料寬度可以是8位位元組型,也可以是16位的字型,它由en29lv160ab的某一引腳配置實現的。在這裡我們選擇字型。

對norflash的讀操作比較簡單,系統上電後會自動進入讀模式,而且也不需要額外的命令來實現讀操作。下面的函式實現了讀操作:

u16 read_en29lv160ab(u32 addr)

norflash不僅能夠實現硬體復位,而且可以實現軟體復位。軟體復位的操作是向任一位址寫入復位命令0xf0。下面的函式實現了軟體復位:

void reset_en29lv160ab(void)

norflash的擦除操作和寫操作要稍微複雜一些,它們需要4個或6個週期來完成,每乙個週期都要把相應的命令寫入norflash中的某一命令暫存器中。寫操作的過程為第乙個週期是把命令0xaa寫入位址為0x555的命令暫存器中,第二個週期是把命令0x55寫入位址為0x2aa命令暫存器中,第三個週期是把命令0xa0再寫入位址為0x555命令暫存器中,第四個週期為真正地把要寫入的資料寫入到norflash的位址中。下面的函式實現了寫操作,其中該函式的兩個輸入引數分別為要寫入的資料和位址,為了方便,我們事先定義好命令暫存器:

#define    flash_base              0x00000000

#define    cmd_addr0              *((volatile u16 *)(0x555<<1+flash_base))

#define    cmd_addr1              *((volatile u16 *)(0x2aa<<1+flash_base))

u8 en29lv160ab_program(u32 addr, u16 dat)

由於我們是把norflash連線到了s3c2440的bank 0上,因此norflash中的位址相對於s3c2440來說基址為0x00000000。而之所以又把norflash中的位址向左移一位(即乘以2),是因為我們是把s3c2440的addr1連線到了norflash的a0上的緣故。在該函式中,我們還呼叫了check_toggle函式,它的作用是用於判斷這次操作是否正確,它的原型為:

u8 check_toggle()

oldtoggle = newtoggle; }

return 1;         //正確 }

它的原理是連續兩次讀取資料匯流排上的資料,判斷資料匯流排上的第6位數值(dq6)是否翻轉,如果沒有翻轉則正確,否則還要判斷第5位(dq5),以確定是否是因為超時而引起的翻轉。

u8 en29lv160ab_sector_erase(u32 section_addr)

對norflash另乙個比較常用的操作是讀取晶元的id。讀取廠商id的過程為第乙個週期是把命令0xaa寫入位址為0x555的命令暫存器中,第二個週期是把命令0x55寫入位址為0x2aa命令暫存器中,第三個週期是把命令0x90再寫入位址為0x555命令暫存器中,第四個週期為讀取位址為0x100中的內容,即廠商id(0x1c)。讀取裝置id的過程的前三個週期與讀取廠商id相同,第四個週期是讀取位址為0x01中的內容,即裝置id(0x2249)。下面的函式為讀取晶元id:

u32 get_en29lv160ab_id(void)

下面的程式實現了對一塊區域進行擦除,寫入,並讀出的操作,判斷寫入的資料是否與讀出的資料相同:

…… ……

u16 buffer[1024];

char cmd;

…… ……

void test_en29lv160ab(void)

else

delay(200);

}if(sta == 1)

}if(sta !=3) //全部操作都正確}}

while(!(rutrstat0 & 0x2)) ;

rutxh0=0x88; //結束}

//簡單測試cfi

void test_en29lv160ab_cfi(void)

void __irq uartisr(void)

while(!(rutrstat0 & 0x2)) ;

rutxh0=ch;}

void main(void)

}}

Linux核心驅動在Tx2440上的移植詳解

linux核心已經完美的支援 uda1341 音訊晶元的驅動,我們只要在arch arm mach s3c2440 mach smdk2440.c檔案中註冊 uda1341 平台裝置的控制埠就可以了。1 修改arch arm mach s3c2440 mach smdk2440.c,在platfor...

2440裸機程式分析之led

今天 用心 把 led 顯示 的原理弄懂了一下。注釋如下 首先,對照著tq 2440 v2原理圖觀察到了4個led燈的管腳分別為gpb5,gpb6,gpb7,gpb8.有詳細觀察 發現gpb共有11個管腳 其中gpb0到gpb3為高電平有效,gpb4到gpb10為低電平有效,這不是用0 x 就可以控...

mini2440按鍵裸機程式編寫執行

1.開發環境 作業系統 linux 開發板 mini2440 2.原理圖 gpgcon控制暫存器功能說明 3.操作流程 只需要操作gpgcon暫存器即可操作k1按鍵 a 設定控制暫存器gpgcon為輸入功能 00 即 可讀取gpgdat暫存器的值 html view plain copy 按鍵 un...