唐建兵,吳仲光,肖 煬
(四川大學 計算機學院,四川 成都 610065)
Davinci平臺下大頁面NAND Flash上的系統構建問題
唐建兵,吳仲光,肖 煬
(四川大學 計算機學院,四川 成都 610065)
以TI公司新一代Davinci TMS320DM6446嵌入式處理器為例,詳細描述了在NAND Flash上構建嵌入式Linux操作系統的一般方法。結合Sumsang公司的K9K8G08U0A大頁面NAND Flash,給出了引導程序的移植、燒寫的具體設計及實現過程,提供基于大頁面NAND Flash作為唯一外部存儲設備的穩定、可靠的解決方案 。為新一代Davinci系列處理器的配置、使用提供了參考。
Davinci;NAND Flash;大頁面;引導程序;Linux
達芬奇(Davinci)系列嵌入式處理器是 TI公司的具有高速處理能力的新一代嵌入式設備[1],它同時具備了DSP和精簡指令級計算機技術的優點。它集成了一個高性能的DSP核心與一個ARM9內核,被廣泛應用于嵌入式圖片、視頻處理中[2]。在 Davinci平臺下,通常以ARM核為基礎構建嵌入式操作系統,但是目前經常采用一片NOR Flash加上一片NAND Flash作為外部存儲設備,并且通常都是 256 B/頁或者 512 B/頁的小頁面 NAND Flash,本文旨在只以一片2 KB/頁的大頁面NAND Flash(Samsung K9K8G08U0A)作為外部存儲設備、Davinci TMS-320DM6446作為處理器的硬件結構下,闡述構建穩定可靠的系統需要解決的問題。
EMIF是用來連接Flash、SRAM等多種存儲設備的外設端口。TMS320DM6446的EMIF端口支持每路32 MB總共4路可尋址的片選空間,支持8 bit以及16 bit的數據總線寬度,具有可編程的建立、選通以及保持時間,還具備NAND Flash ECC校驗數據生成功能等[5],因此可以方便靈活地與外部NAND Flash芯片通信。在本文的硬件系統中,即采用TMS320DM6446的EMIF的CS2空間與Samsung K9K8G08U0A NAND Flash相連。
由于本系統只有一片NAND Flash作為外部的存儲設備,因此所有的引導程序、操作系統內核以及根文件系統均需要存儲在這上面,系統也就需要從NAND Flash啟動。TMS320DM6446具有多種啟動方式,具體由哪種方式啟動,由系統復位時引腳 BTSEL[1:0]電平決定,當BTSEL[1:0]被置為“01”時,TMS320DM6446 的 ARM 核從EMIFA的EM_CS2存儲空間開始執行(地址為0x0200 0000),這種情況下EMIF連接的是具有線性地址的非易失存儲器,通常是 NOR Flash。 當 BTSEL[1:0]不為“01”時,TMS-320DM6446內部的 ROM BOOT LOADER(簡稱 RBL)開始運行,RBL再根據BTSEL[1:0]的不同值決定從何處加載用戶的引導程序 UBL(USER BOOT LOADER)。當BTSEL[1:0]為“00”時,RBL將從連接到 EMIF的 CS2空間的NAND Flash中加載UBL。由于RBL的加載過程是將UBL拷貝到ARM的內部RAM中,因此對于UBL的大小限制在14 KB以內,但是在嵌入式環境常用的U-BOOT、ViVi等的大小都遠超過這個限制,因此需要多級加載,一級引導程序主要做系統的初始化,然后將二級引導程序(在本系統中采用U-BOOT,本文后面提到的UBL均指一級引導程序)從NAND Flash中讀取到RAM中,然后啟動它,由U-BOOT負責操作系統的引導[4]。于是整個NAND Flash上系統構建的關鍵問題包括如何移植UBL,以使其能夠正常初始化系統,正常加載二級引導程序U-BOOT到RAM中,U-BOOT的移植使其滿足大頁面NAND Flash的讀寫要求以及裸機時引導程序的燒寫。
UBL為TI公司提供的對于Davinci系列處理器通過內部的ROM BOOT LOADER啟動時的一級引導程序。其工作流程如圖1所示。

圖1 UBL流程圖
UBL的移植主要針對本系統中硬件板的結構修改系統初始化過程以及增加對Samsung K9K8G08U0A NAND Flash的支持,以下分別闡述。
TMS320DM6446具有兩路PLL,其中PLL1通過分頻供系統的主時鐘及大部分外設的時鐘,PLL2供DDR2使用。DSP 時鐘頻率為SYSCLK1=27 MHz×(PLL1_PLLM+1),使用固定一分頻,本系統中DSP工作在正常頻率594 MHz,因此需設置PLL1_PLLM=21,即設置寄存器0x1C4 0910為21。
本系統使用兩片K4T1G164QQ-HCE6 DDR2 SDRAM作為系統內存,該芯片為DDR2 667芯片,時鐘頻率為333 MHz。TMS320DM6446中 DDR2使用 PLL2的 PLLDIV2分頻作為時鐘頻率,計算公式為(27 MHz×(PLL2_PLLM+1))/(PLL2_PLLDIV2→RATIO+1)。因此設置PLL2_PLLM=23,PLL2_PLLDIV2→RATIO=1,PLL2_PLLDIV2 的第 15 位為分頻允許位,應置為 1,所以 PLL2_PLLDIV2為0x8001,即寄存器 0x1C4 0D10=23,0x1C4 0D1C=0x8001。
根據Samsung K9K8G08U0A NAND Flash的讀、寫時序要求,TMS320DM6446的 EMIF用于與 NAND Flash連接時,配置寄存器各字段值需滿足如下要求:

其中tSU是EMIF數據建立時間,取值5 ns,tH數據保持時間取 0,EMFI時鐘為系統 6分頻,所以 tcyc=1/(27×(21+1)/6)≈10 ns,根據 EMIF連接 NAND的取值要求,設置EMIF CS2的配置寄存器值為0x842429c。
UBL通過數據結構struct_NAND_DEV_STRUCT_來表示一個型號的 NAND Flash,具有 devID、numBlocks、pagesPerBlock、bytesPerPage幾個字段。通過 struct_NAND_DEV_STRUCT_類型的數組gNandDevInfo[]來記錄所有支持的NAND Flash。UBL在從NAND Flash讀取數據之前,首先通過讀取設備號命令0x90得到NAND Flash的設備號,然后從數組gNandDevInfo[]中查找具有相同設備號的記錄,從而得到NAND Flash的詳細信息,以確定NAND Flash的讀方式。
因此,需要 UBL支持特定的 NAND Flash,只需要將其信息添加到數組gNandDevInfo[]中即可。本系統中用到的 Samsung K9K8G08U0A NAND Flash設備號為 0xD3,具有8 192個存儲塊,每個塊具有64個頁面,每頁具有2 048 B數據存儲區域以及64 B的Spare區域,在數組gNandDevInfo[]中添加{0xD3,8192,64,2048+64}即可。
本系統中使用的U-BOOT引導程序由TI公司提供的支持Davinci平臺以及NAND Flash啟動的U-BOOT1.1.3移植而來。
U-BOOT1.1.3不支持 2 KB/page的大頁面 Flash,因此移植過程主要是增加NAND Flash的讀寫、擦除。2 KB頁面NAND Flash與普通讀寫擦除最主要的區別在于地址構成不同,本系統中用到的Samsung K9K8G08U0A NAND Flash總共存儲空間 1 GB=230,每頁大小為 2 KB=211,因此總的地址長度 30 bit,從 A0~A29,頁地址長度為11 bit,從 A0~A10,本系統采用 8 bit的地址數據寬度連接NAND Flash,頁地址和塊地址需要分不同的地址周期,因此NAND的地址需要5個周期送出,前兩個周期為頁地址,依次為地址的 A0~A7、A8~A10,后三個周期為塊地址,依次為地址的 A11~A18、A19~A26、A27~A29,頁地址和塊地址的最后一個周期不足8位,不足的高位均為 0。
Samsung K9K8G08U0A的讀過程如下:寫0x00命令、分5個周期寫地址、寫0x30命令、讀數據、根據讀出的數據生成ECC校驗數據、生成的ECC數據與讀出的ECC數據比對以確定數據是否有誤以及能否校正。
寫過程如下:寫0x80命令、分5個地址周期寫地址、送出數據(包括ECC校驗數據)、寫 0x10命令、讀取狀態直到busy信號無效、檢查是否出現寫錯誤。
擦除過程如下:寫0x60命令、分三個地址周期寫塊地址、寫0xD0命令、讀取狀態直到busy信號無效、檢查是否出現擦除錯誤。
YAFFS2鏡像燒寫與U-BOOT下普通寫NAND Flash區別在于spare區域的數據不需要程序根據數據存儲區的數據生成,spare區域的數據在制作YAFFS2鏡像時,已經由鏡像制作工具生成并寫入了鏡像文件。因此在nand命令的write中增加.yaffs2選項,當使用nand write.yaffs2命令時,直接從指定地址中讀出2 048 B/頁數據以及數據后緊跟的64 B的spare區域數據,并將其寫入NAND Flash中。
U-BOOT在Flash的讀寫過程中需要檢查壞塊情況,在開始讀寫每個塊的時候首先檢查該塊第一頁以及第二頁的spare區域的第一個數據是否為0xFF,如果不為0xFF則當前塊為壞塊,需要跳過它。
在UBL以及U-BOOT被固化進NAND Flash之前,系統處于裸機狀態,無法正常引導操作系統,燒寫程序的作用是在裸機狀態下借助仿真器的作用,將UBL以及U-BOOT燒寫到NAND Flash正確位置的。
前面已經提到,本系統采用的Samsung K9K8G08U0A NAND Flash具有8 192個存儲塊(block)。這 8 192個塊按照如下分配其使用方式:第0塊在出廠時確保不是壞塊,用作整個NAND Flash的壞塊信息存儲;第1~3塊存儲 UBL;第 4~7塊存儲 U-BOOT;第 8塊存儲 U-BOOT環境變量;第 9~40塊存儲 Linux操作系統內核;第 41~8 191塊存儲YAFFS2文件系統。
實際中,UBL和U-BOOT都只需要占用一個存儲塊的存儲空間,由于考慮到NAND Flash可能有壞塊的存在,于是在設計燒寫程序時,為UBL增加了2個冗余塊,為U-BOOT增加了3個冗余塊,以確保系統穩定可靠地從NAND Flash上啟動。
燒寫程序是系統在沒有任何程序的裸機情況下執行的,燒寫程序需要通過仿真器加載到系統目標板的DDR2中運行。由于加載程序時系統未執行任何程序,也就沒有做任何初始化,DDR2也處于不可用狀態,系統將無法加載程序。TI的CCS集成環境提供了GEL文件來解決這一問題,在仿真器連接目標板時會自動執行GEL文件中的 OnTargetConnect()函數,在該函數中,需要對系統做初始化。
燒寫程序在被加載到內存后,即可被執行來完成UBL以及U-BOOT的燒寫,程序執行過程如圖2所示。

圖2 燒寫程序流程圖
數據寫入時需要注意UBL是由TMS320DM6446內部的ROM BOOT LOADER讀入到內部RAM中然后執行的,因此,燒寫程序對于ECC校驗數據的生成以及ECC數據在spare區域的存儲位置必須要與ROM BOOT LOADER讀取數據時的校驗方式一致。ROM BOOT LOADER采用EMIF的硬件ECC校驗,每512 B的數據產生4 B的校驗數據,并按照如下方式存儲:spare區域地址從0x00到0x3F,其中0x08-0x0B存儲第1個512 B數據的第3-0位ECC數據,0x18-0x1B存儲第2個512 B數據的第3-0位ECC數據,0x28-0x2B存儲第3個512 B數據的第3-0位ECC數據,0x38-0x3B存儲第 4個512 B數據的第3-0位ECC數據。因此,在燒寫程序中也使用EMIF硬件ECC校驗來生成校驗數據,在每次寫入數據達到512 B時,通過讀寄存器NANDF1ECC(地址為0x0200 0070)來獲得ECC值,最后在一頁數據寫入完畢后寫入到spare區域的對應位置。
在UBL以及U_BOOT成功燒寫到NAND Flash后,系統上電,U_BOOT成功執行,通過U_BOOT將Linux操作系統內核以及YAFFS2文件系統鏡像燒寫到NAND Flash,設置 U_BOOT環境變量,再次引導系統,Linux系統正常啟動。本系統中成功實現了從裸機到整個系統的構建,解決了對大頁面NAND Flash的不支持,同時考慮了NAND Flash存在的壞塊情況,系統在實際使用中運行穩定可靠。
[1]TI Corporation.TMS320DM6446 Digital Media System-on-Chip[EB/OL].[2008-03-31].http://www.ti.com/lit/gpn/tms320dm6446.
[2]TI Corporation.TMS320DM644x DMSoC ARM Subsystem Reference Guide[EB/OL].[2009-03-31].http://www.ti.com/litv/pdf/sprue14b.
[3]TI Corporation.TMS320DM644x DMSoC Asynchronous External Memory Interface(EMIF)Reference Guide[EB/OL].[2009-02-24].http://www.ti.com/litv/pdf/sprue20c.
[4]王化福,孫同景.從NAND Flash啟動嵌入式操作系統[J].可編程控制器與工廠自動化,2009(5):79-80.
[5]Samsung Corporation.K9XXG08UXA Flash Memory[S],2006.
Key issues of system construction on large page NAND Flash based on Davinci
Tang Jianbing,Wu Zhongguang,Xiao Yang
(Department of Computer,Sichuan University,Chengdu 610065,China)
Take TI′s next-generation Davinci TMS320DM6446 embedded processor as an example,the general method of build embedded Linux operating system on NAND Flash is described in detail.Combined with Samsung′s K9K8G08U0A large page NAND Flash,the specific design and implementation process of boot transplant and programming is given,stable and reliable solution based on large page NAND Flash as only external storage device is given.It provide reference for configuration and use of the new generation processors of Davinci family.
Davinci;NAND Flash;large page;Boot Loader;Linux
TP368.33
A
1674-7720(2011)02-0103-03
2010-08-19)
唐建兵,男,1986年生,在讀碩士研究生,主要研究方向:嵌入式系統、計算機網絡與通信。
吳仲光,男,1953年生,副教授,碩士,主要研究方向:光機電一體化、嵌入式系統架構、計算機網絡與通信。
肖煬,男,1982年生,碩士,主要研究方向:電路系統。