《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > Davinci平臺(tái)下大頁面NAND Flash上的系統(tǒng)構(gòu)建問題
Davinci平臺(tái)下大頁面NAND Flash上的系統(tǒng)構(gòu)建問題
來源:微型機(jī)與應(yīng)用2011年第2期
唐建兵,吳仲光,肖 煬
(四川大學(xué) 計(jì)算機(jī)學(xué)院,四川 成都610065)
摘要: 以TI公司新一代Davinci TMS320DM6446嵌入式處理器為例,詳細(xì)描述了在NAND Flash上構(gòu)建嵌入式Linux操作系統(tǒng)的一般方法。結(jié)合Sumsang公司的K9K8G08U0A大頁面NAND Flash,給出了引導(dǎo)程序的移植、燒寫的具體設(shè)計(jì)及實(shí)現(xiàn)過程,提供基于大頁面NAND Flash作為唯一外部存儲(chǔ)設(shè)備的穩(wěn)定、可靠的解決方案 。為新一代Davinci系列處理器的配置、使用提供了參考。
Abstract:
Key words :

摘  要: 以TI公司新一代Davinci TMS320DM6446嵌入式處理器為例,詳細(xì)描述了在NAND Flash上構(gòu)建嵌入式Linux操作系統(tǒng)的一般方法。結(jié)合Sumsang公司的K9K8G08U0A大頁面NAND Flash,給出了引導(dǎo)程序的移植、燒寫的具體設(shè)計(jì)及實(shí)現(xiàn)過程,提供基于大頁面NAND Flash作為唯一外部存儲(chǔ)設(shè)備的穩(wěn)定、可靠的解決方案 。為新一代Davinci系列處理器的配置、使用提供了參考。
關(guān)鍵詞: Davinci;NAND Flash;大頁面;引導(dǎo)程序;Linux

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

    UBL的移植主要針對(duì)本系統(tǒng)中硬件板的結(jié)構(gòu)修改系統(tǒng)初始化過程以及增加對(duì)Samsung K9K8G08U0A NAND Flash的支持,以下分別闡述。
2.1 系統(tǒng)初始化
2.1.1 設(shè)置CPU、DDR工作頻率

    TMS320DM6446具有兩路PLL,其中PLL1通過分頻供系統(tǒng)的主時(shí)鐘及大部分外設(shè)的時(shí)鐘,PLL2供DDR2使用。DSP時(shí)鐘頻率為SYSCLK1=27 MHz×(PLL1_PLLM+1),使用固定一分頻,本系統(tǒng)中DSP工作在正常頻率594 MHz,因此需設(shè)置PLL1_PLLM=21,即設(shè)置寄存器0x1C4 0910為21。
    本系統(tǒng)使用兩片K4T1G164QQ-HCE6 DDR2 SDRAM作為系統(tǒng)內(nèi)存,該芯片為DDR2 667芯片,時(shí)鐘頻率為333 MHz。TMS320DM6446中DDR2使用PLL2的PLLDIV2分頻作為時(shí)鐘頻率,計(jì)算公式為(27 MHz×(PLL2_PLLM+1))/(PLL2_PLLDIV2→RATIO+1)。因此設(shè)置PLL2_PLLM=23,PLL2_PLLDIV2→RATIO=1,PLL2_PLLDIV2的第15位為分頻允許位,應(yīng)置為1,所以PLL2_PLLDIV2為0x8001,即寄存器0x1C4 0D10=23,0x1C4 0D1C=0x8001。
2.1.2 配置EMIF接口
    根據(jù)Samsung K9K8G08U0A NAND Flash的讀、寫時(shí)序要求,TMS320DM6446的EMIF用于與NAND Flash連接時(shí),配置寄存器各字段值需滿足如下要求:
RSETUP≥tCLR(m)/tCYC-1=0
RSTORBE≥max((tREA(m)+tSU)/tCYC,tRP(m)/tcyc)-1=1.5
R_SETUP+R_STROBE≥(tCEA(m)+tSU)/tcyc-1=2
R_HOLD≥(tH-tCHZ(m))/tcyc-1=-4
R_SETUP+R_STROBE+R_HOLD≥tRC(m)/tcyc-3=-0.5
TA≥max((tCHZ(m))/tcyc,(tRHZ(m)-(R_HOLD+1)tcyc)/(tcyc))-1≥2
W_SETUP≥max(tCLS(m)/tcyc,tALS(m)/tcyc,(tCS(m)/tcyc)-1=1
W_STROBE≥tWP(m)/tcyc-1=0.2
W_SETUP+W_STROBE≥tDS(m)/tcyc-1=0.2
W_HOLD≥max((tCLH(m))/(tcyc),(tALH(m))/tcyc,(tCH(m))/(tcyc),(tDH(m))/(tcyc))-1=-0.5
W_SETUP+W_STROBE+W_HOLD≥tWC(m)/(tcyc)-3=-0.5
其中tSU是EMIF數(shù)據(jù)建立時(shí)間,取值5 ns,tH數(shù)據(jù)保持時(shí)間取0,EMFI時(shí)鐘為系統(tǒng)6分頻,所以tcyc=1/(27×(21+1)/6)≈10 ns,根據(jù)EMIF連接NAND的取值要求,設(shè)置EMIF CS2的配置寄存器值為0x842429c。
2.2 支持Samsung K9K8G08U0A NAND Flash
    UBL通過數(shù)據(jù)結(jié)構(gòu)struct _NAND_DEV_STRUCT_來表示一個(gè)型號(hào)的NAND Flash,具有devID、numBlocks、pagesPerBlock、bytesPerPage幾個(gè)字段。通過struct _NAND_
DEV_STRUCT_類型的數(shù)組gNandDevInfo[]來記錄所有支持的NAND Flash。UBL在從NAND Flash讀取數(shù)據(jù)之前,首先通過讀取設(shè)備號(hào)命令0x90得到NAND Flash的設(shè)備號(hào),然后從數(shù)組gNandDevInfo[]中查找具有相同設(shè)備號(hào)的記錄,從而得到NAND Flash的詳細(xì)信息,以確定NAND Flash的讀方式。
    因此,需要UBL支持特定的NAND Flash,只需要將其信息添加到數(shù)組gNandDevInfo[]中即可。本系統(tǒng)中用到的Samsung K9K8G08U0A NAND Flash設(shè)備號(hào)為0xD3,具有8 192個(gè)存儲(chǔ)塊,每個(gè)塊具有64個(gè)頁面,每頁具有2 048 B數(shù)據(jù)存儲(chǔ)區(qū)域以及64 B的Spare區(qū)域,在數(shù)組gNandDevInfo[]中添加{0xD3,8192,64,2048+64}即可。
3 U-BOOT移植
    本系統(tǒng)中使用的U-BOOT引導(dǎo)程序由TI公司提供的支持Davinci平臺(tái)以及NAND Flash啟動(dòng)的U-BOOT1.1.3移植而來。
3.1 NAND Flash讀寫時(shí)序
    U-BOOT1.1.3不支持2 KB/page的大頁面Flash,因此移植過程主要是增加NAND Flash的讀寫、擦除。2 KB頁面NAND Flash與普通讀寫擦除最主要的區(qū)別在于地址構(gòu)成不同,本系統(tǒng)中用到的Samsung K9K8G08U0A NAND Flash總共存儲(chǔ)空間1 GB=230,每頁大小為2 KB=211,因此總的地址長度30 bit,從A0~A29,頁地址長度為11 bit,從A0~A10,本系統(tǒng)采用8 bit的地址數(shù)據(jù)寬度連接NAND Flash,頁地址和塊地址需要分不同的地址周期,因此NAND的地址需要5個(gè)周期送出,前兩個(gè)周期為頁地址,依次為地址的A0~A7、A8~A10,后三個(gè)周期為塊地址,依次為地址的A11~A18、A19~A26、A27~A29,頁地址和塊地址的最后一個(gè)周期不足8位,不足的高位均為0。
    Samsung K9K8G08U0A的讀過程如下:寫0x00命令、分5個(gè)周期寫地址、寫0x30命令、讀數(shù)據(jù)、根據(jù)讀出的數(shù)據(jù)生成ECC校驗(yàn)數(shù)據(jù)、生成的ECC數(shù)據(jù)與讀出的ECC數(shù)據(jù)比對(duì)以確定數(shù)據(jù)是否有誤以及能否校正。
    寫過程如下:寫0x80命令、分5個(gè)地址周期寫地址、送出數(shù)據(jù)(包括ECC校驗(yàn)數(shù)據(jù))、寫0x10命令、讀取狀態(tài)直到busy信號(hào)無效、檢查是否出現(xiàn)寫錯(cuò)誤。
    擦除過程如下:寫0x60命令、分三個(gè)地址周期寫塊地址、寫0xD0命令、讀取狀態(tài)直到busy信號(hào)無效、檢查是否出現(xiàn)擦除錯(cuò)誤。
3.2 YAFFS2文件系統(tǒng)燒寫
    YAFFS2鏡像燒寫與U-BOOT下普通寫NAND Flash區(qū)別在于spare區(qū)域的數(shù)據(jù)不需要程序根據(jù)數(shù)據(jù)存儲(chǔ)區(qū)的數(shù)據(jù)生成,spare區(qū)域的數(shù)據(jù)在制作YAFFS2鏡像時(shí),已經(jīng)由鏡像制作工具生成并寫入了鏡像文件。因此在nand命令的write中增加.yaffs2選項(xiàng),當(dāng)使用nand write.yaffs2命令時(shí),直接從指定地址中讀出2 048 B/頁數(shù)據(jù)以及數(shù)據(jù)后緊跟的64 B的spare區(qū)域數(shù)據(jù),并將其寫入NAND Flash中。
    U-BOOT在Flash的讀寫過程中需要檢查壞塊情況,在開始讀寫每個(gè)塊的時(shí)候首先檢查該塊第一頁以及第二頁的spare區(qū)域的第一個(gè)數(shù)據(jù)是否為0xFF,如果不為0xFF則當(dāng)前塊為壞塊,需要跳過它。
4 燒寫程序
    在UBL以及U-BOOT被固化進(jìn)NAND Flash之前,系統(tǒng)處于裸機(jī)狀態(tài),無法正常引導(dǎo)操作系統(tǒng),燒寫程序的作用是在裸機(jī)狀態(tài)下借助仿真器的作用,將UBL以及U-BOOT燒寫到NAND Flash正確位置的。
    前面已經(jīng)提到,本系統(tǒng)采用的Samsung K9K8G08U0A NAND Flash具有8 192個(gè)存儲(chǔ)塊(block)。這8 192個(gè)塊按照如下分配其使用方式:第0塊在出廠時(shí)確保不是壞塊,用作整個(gè)NAND Flash的壞塊信息存儲(chǔ);第1~3塊存儲(chǔ)UBL;第4~7塊存儲(chǔ)U-BOOT;第8塊存儲(chǔ)U-BOOT環(huán)境變量;第9~40塊存儲(chǔ)Linux操作系統(tǒng)內(nèi)核;第41~8 191塊存儲(chǔ)YAFFS2文件系統(tǒng)。
    實(shí)際中,UBL和U-BOOT都只需要占用一個(gè)存儲(chǔ)塊的存儲(chǔ)空間,由于考慮到NAND Flash可能有壞塊的存在,于是在設(shè)計(jì)燒寫程序時(shí),為UBL增加了2個(gè)冗余塊,為U-BOOT增加了3個(gè)冗余塊,以確保系統(tǒng)穩(wěn)定可靠地從NAND Flash上啟動(dòng)。
    燒寫程序是系統(tǒng)在沒有任何程序的裸機(jī)情況下執(zhí)行的,燒寫程序需要通過仿真器加載到系統(tǒng)目標(biāo)板的DDR2中運(yùn)行。由于加載程序時(shí)系統(tǒng)未執(zhí)行任何程序,也就沒有做任何初始化,DDR2也處于不可用狀態(tài),系統(tǒng)將無法加載程序。TI的CCS集成環(huán)境提供了GEL文件來解決這一問題,在仿真器連接目標(biāo)板時(shí)會(huì)自動(dòng)執(zhí)行GEL文件中的OnTargetConnect()函數(shù),在該函數(shù)中,需要對(duì)系統(tǒng)做初始化。
    燒寫程序在被加載到內(nèi)存后,即可被執(zhí)行來完成UBL以及U-BOOT的燒寫,程序執(zhí)行過程如圖2所示。

    數(shù)據(jù)寫入時(shí)需要注意UBL是由TMS320DM6446內(nèi)部的ROM BOOT LOADER讀入到內(nèi)部RAM中然后執(zhí)行的,因此,燒寫程序?qū)τ贓CC校驗(yàn)數(shù)據(jù)的生成以及ECC數(shù)據(jù)在spare區(qū)域的存儲(chǔ)位置必須要與ROM BOOT LOADER讀取數(shù)據(jù)時(shí)的校驗(yàn)方式一致。ROM BOOT LOADER采用EMIF的硬件ECC校驗(yàn),每512 B的數(shù)據(jù)產(chǎn)生4 B的校驗(yàn)數(shù)據(jù),并按照如下方式存儲(chǔ):spare區(qū)域地址從0x00到0x3F,其中0x08-0x0B存儲(chǔ)第1個(gè)512 B數(shù)據(jù)的第3-0位ECC數(shù)據(jù),0x18-0x1B存儲(chǔ)第2個(gè)512 B數(shù)據(jù)的第3-0位ECC數(shù)據(jù),0x28-0x2B存儲(chǔ)第3個(gè)512 B數(shù)據(jù)的第3-0位ECC數(shù)據(jù),0x38-0x3B存儲(chǔ)第4個(gè)512 B數(shù)據(jù)的第3-0位ECC數(shù)據(jù)。因此,在燒寫程序中也使用EMIF硬件ECC校驗(yàn)來生成校驗(yàn)數(shù)據(jù),在每次寫入數(shù)據(jù)達(dá)到512 B時(shí),通過讀寄存器NANDF1ECC(地址為0x0200 0070)來獲得ECC值,最后在一頁數(shù)據(jù)寫入完畢后寫入到spare區(qū)域的對(duì)應(yīng)位置。
    在UBL以及U_BOOT成功燒寫到NAND Flash后,系統(tǒng)上電,U_BOOT成功執(zhí)行,通過U_BOOT將Linux操作系統(tǒng)內(nèi)核以及YAFFS2文件系統(tǒng)鏡像燒寫到NAND Flash,設(shè)置U_BOOT環(huán)境變量,再次引導(dǎo)系統(tǒng),Linux系統(tǒng)正常啟動(dòng)。本系統(tǒng)中成功實(shí)現(xiàn)了從裸機(jī)到整個(gè)系統(tǒng)的構(gòu)建,解決了對(duì)大頁面NAND Flash的不支持,同時(shí)考慮了NAND Flash存在的壞塊情況,系統(tǒng)在實(shí)際使用中運(yùn)行穩(wěn)定可靠。
參考文獻(xiàn)
[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啟動(dòng)嵌入式操作系統(tǒng)[J].可編程控制器與工廠自動(dòng)化,2009(5):79-80.
[5] Samsung Corporation. K9XXG08UXA Flash Memory[S],2006.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。