徐軍化 張紹軍
摘要 嵌入式系統中NAND文件系統的實現方式直接關系到NAND芯片的使用壽命。本文首先介紹了YAFFS文件系統的特點及其在Windows CE.Net環境下NAND Flash接口層的要求,其次介紹了SAMSUNG公司的K9K8G08U0A NAND Flash的相關技術規格,并給出了其塊設備驅動程序的部分程序代碼。
關鍵詞Windows CE;YAFFS;NAND;驅動開發
中圖分類號 TP311.1文獻標識碼A文章編號 1674-6708(2009)05-0054-02
0 引言
Windows CE是微軟公司設計的嵌入式操作系統,具有系統體積小、界面友好、可擴展、應用程序開發上手快等特點,目前,在手持式測量設備領域的應用越來越多。手持式振動信號測量儀是一種電池供電、便于現場或野外攜帶和使用的測量設備,主要功能是對振動信號進行實時連續的采集、顯示、分析、處理和存儲。
1 YAFFS文件系統簡介
YAFFS是一種類似于JFFS/JFFS2的專為NAND Flash設計的嵌入式文件系統,適用于大容量的存儲設備。和JFFS相比,YAFFS減少了一些功能,但是速度更快、占用的內存更少、NAND Flash的使用壽命也更長。YAFFS文件系統采用層次結構設計,可分為三層:文件系統管理接口層、YAFFS內部實現層和NAND Flash接口層。
2 YAFFS NAND Flash接口層
YAFFS NAND Flash接口層的主要功能就是為文件系統管理接口層、YAFFS內部實現層提供一個與具體NAND Flash硬件無關的訪問服務,提高了代碼的可移植性和通用性。在對NAND Flash接口層相關代碼進行深入的分析后,我們發現為了使YAFFS能夠對NAND Flash進行訪問,必須為NAND Flash提供一個塊設備驅動程序。與NAND Flash物理訪問相關的代碼全部由其實現,而YAFFS則是通過給該設備驅動程序發送IOControl請求來實現對NAND Flash的讀、寫、擦除等具體操作,具體來說,主要有以下幾個操作請求:
1)IOCTL_DISK_NAND_INIT 功能是命令NAND Flash驅動程序對Flash芯片進行初始化。
2) IOCTL_DISK_NAND_GETSIZE 功能是獲取NAND Flash的存儲容量(磁盤空間)。
3) IOCTL_DISK_NAND_GETNAME 功能是獲取設備在Windows CE中顯示的文件夾名稱。
4) IOCTL_DISK_NAND_GETPARTITIONS 功能是獲取NAND Flash中的分區表。
5) IOCTL_DISK_NAND_WRITE 功能是將緩沖區中的數據寫到NAND Flash中的指定頁中。
6) IOCTL_DISK_NAND_READ 功能是讀取指定的頁的數據。
7) IOCTL_DISK_NAND_ERASE 功能是從NAND Flash中的指定塊擦除。
3 Samsung K9K8G08U0A Flash
目前,在嵌入式系統領域廣泛使用的Flash主要有兩種:一種是采用NOR技術的NOR Flash,另一種是采用NAND技術的NAND Flash。這里重點介紹一下NAND Flash,首先,從內部存儲器的組織形式上看,NAND Flash的內部可分為若干個塊,塊又分為頁,頁而由數據存儲區和備用區兩部分組成;其次,NAND Flash不能按照字節進行訪問,而是以頁為單位進行讀、寫,以塊為單位進行擦除;第三,NAND Flash的地址、數據、命令端口復用,讀、寫、擦除等操作都是相應的命令來完成的。
SAMSUNG的K9K8G08U0A NAND Flash內部共有8192個塊,每個塊有64個頁,每頁包含2048字節的存儲空間和64字節的備用空間,總容量為1G字節。K9K8G08U0A的以頁為單位進行讀和寫,以塊為單位擦除,其典型的隨機頁讀時間為25us、順序頁讀時間為25ns、頁寫時間為200us、塊擦除時間為1.5ms。
4 K9K8G08U0A塊設備驅動程序的實現
Windows CE.Net環境下的塊設備驅動程序一般都實現為流接口驅動的形式,即流接口驅動需要的XXX_Close、XXX_Deinit、XXX_Init、XXX_IOControl、XXX_Open、XXX_PowerDown、XXX_PowerUp、XXX_Read、XXX_Seek 、XXX_Write都要實現,XXX表示設備名前綴,這里可以是“DSK”。由于YAFFS的NAND Flash接口主要是通過IOControl的形式實現的,所以,相應的與K9K8G08U0A讀、寫、擦除等操作相關代碼也都在DSK_IOControl函數內實現。下面給出DSK_IOControl的部分程序代碼:
DSK_IOControl的部分程序代碼如下:
BOOL DSK_IOControl(……)
{
…
switch (dwIoControlCode)
{
…
case IOCTL_DISK_NAND_WRITE:
NandRePage(pDisk,pBufData,pBufSpare,ifData->chunk);break;
case IOCTL_DISK_NAND_READ:
NandReadPage(pDisk,pBufData,pBufSpare,ifData->chunk);break;
case IOCTL_DISK_NAND_ERASE:
NandEraseBlock(pDisk,*BlockNumber);break;
…
}
}
具體的讀、寫、擦除等操作分別由NandReadPage、NandWritePage、NandEraseBlock三個函數按照Samsung公司K9K8G08U0A的時序規范來實現。
5 結論
本文在深入研究YAFFS文件系統的NAND Flash接口后,給出了Windows CE.Net環境下Samsung的K9K8G08U0A NAND Flash塊設備驅動的實現方法,并給出了關鍵程序代碼。
本文創新點在于以手持式振動信號測量儀為背景,給出了Windows CE.Net環境下YAFFS文件系統NAND Flash塊驅動程序的一種實現方法。