1.nor flash和nand flash
對於flash儲存器件的可靠性需要考慮3點:位反轉、壞塊和可擦除次數。所有的flash器件(包括nor flash和nand flash)都遭遇位反轉的問題:由於flash固有的電器特性,在讀寫資料過程中,偶然會產生一位或幾位資料錯誤(這種概率很低),nand flash出現這種問題的機率遠大於nor flash。當位反**生在關鍵的**、資料上時,有可能導致系統崩潰。當僅僅是報告位反轉,重新讀取即可;如果確實發生了位反轉,則必須有相應的錯誤檢測/恢復措施,推薦使用edc/ecc進行錯誤檢測/恢復。
嵌入式linux對nor、nand flash的軟體支援都很成熟,在nor flash上常用jffs2檔案系統,而在nand flash上常用yaffs檔案系統。在更底層,有mtd驅動程式(源**位於linux源**的/drivers/mtd中)實現對它們的讀、寫和擦除操作,它也實現了edc/ecc校驗。
2.k9f1208u0m儲存格式
k9f1208u0m容量為528mbit=64mb,內部分為131072行(頁)、528列;每一行(頁)大小為512位元組,外加16位元組的額外空間,這16位元組的額外空間的列位址為512~527。
k9f1208u0m的64mb的儲存空間需要26位位址,因此以位元組為單位訪問flash時需要4個位址序列:列位址(a0~a7)、行位址的低位部分以及行位址的高位部分(a9~a25)。讀寫頁在發出命令後,需要4個位址序列,而擦除塊在發出擦除命令後僅需要3個位址序列。這是因為nand flash一般以512位元組為單位進行讀寫,nand flash的塊大小範圍為8kb~64kb,讀寫是按行(頁)進行,而擦除是以塊為單位完成的。
3.讀操作方法
操作nand flash時,先傳輸命令,然後傳輸位址,最後讀/寫資料,期間要檢查flash的狀態。
k9f1208u0m一頁的大小為512位元組,分為兩部分:上半部、下半部。
列位址的8bits用來在半頁(256位元組)中定址。
當發出讀命令00h時,表示列位址將在上半部定址;當發出讀命令01h時,表示列位址將在下半部定址。a8位址線將被讀命令00h設定為低電平,被01h設定為高電平。所以2440向k9f1208u0m傳輸位址過程中不會出現a8,在k9f1208u0m內部a8會根據命令自動被設定為高電平或低電平。
k9f1208u0m一頁大小為528位元組,而列位址a0~a7可以定址的範圍是256位元組,所以必須輔以其他手段才能完全定址這528位元組,將一頁分為a、b、c三個區:a區為0~255位元組,b區為256~511位元組,c區為512~527位元組。訪問某頁時,需要選定特定的區:命令00h選中a區、命令01h選中b區、命令50h選中c區。命令00h和50h會使得訪問flash的位址指標一直從a區或c區開始,除非發出了其他的修改位址指標的命令。而命令01h的效果只能維持一次,當前的讀、寫、擦除、復位或者上電操作完成之後,位址指標將重新指向a區。
4.寫操作方法
寫操作命令分為兩種:page program(true)和page program(dummy)。page program(true)需要的命令組合為80h和10h;而page program(dummy)需要的命令組合為80h和11h。寫不同於讀操作,寫操作不分a、b、c三個部分,因為nand flash的寫操作一般是以頁為單位的,但是也可以只寫一頁中的一部分。寫操作的位址序列依然同讀一致,a8依然是沒有的,所以寫nand flash一部分的位址只能是在a0~a7定址空間內開始。
page program(true):發出命令80h後,緊接著是4個位址序列,然後向flash傳送資料(最大可以達到528位元組),然後發出10h啟動寫操作,這時flash會自動完成寫、校驗操作。一旦發出10h後,就可以通過讀取狀態命令70h獲知當前的寫操作是否完成、是否成功。
page program(dummy):由於k9f1208u0m內部分為4個128mbit的儲存層,每個儲存層包含1024個block(不是頁而是塊)和528個暫存器。這使得可以同時寫多個頁或者同時擦除多個塊。k9f1208u0m的第1塊位於第1個儲存層、第2塊位於第2個儲存層、第3個塊位於第3個儲存層、第4個塊位於第4個儲存層,以此類推。這樣當用於需要連續寫1~4塊時,就能夠充分使用這4個儲存層各自的528位元組儲存器。
5.塊擦除
k9f1208u0m塊大小為16kb,當發出60h命令後,後續需要發出3個位址(第2、3、4cycle的位址),並且a9~a13被忽略,即可完成塊擦除操作。
自己學驅動18 中斷
1.中斷原理 當某個事件發生時,硬體會設定某個暫存器 cpu在執行完乙個指令時,通過硬體檢視這個暫存器,如果發現所關注的事件發生了,則中斷當前程式流程,跳轉到乙個固定的位址去處理這個事件,最後返回繼續執行被中斷的程式。2.中斷處理過程 1 中斷控制器匯集各類外設發出的中斷訊號,然後告訴cpu。2 c...
自己學驅動12 儲存控制器
1.2440的bank 2440一共提供給外部8個bank bank0 bank7 每個bank均為128mb的位址空間,一共1gb位址空間。2440對外引出了27根位址線addr0 addr26,這27根位址線的訪問位址大小為128mb,2440對外還引出了8根片選訊號ngcs0 ngcs7,對應...
學驅動從模組開始
通用的makefile模板 ifeq kernelrelease kerneldir home lht kernel2.6 linux 2.6.14 kerneldir lib modules shell uname r build pwd shell pwd modules make c kern...