1 引 言
隨著(zhù)消費類(lèi)電子產(chǎn)品包括 PDA , MP3 、智能手機等手持設備的市場(chǎng)需求逐步擴大,產(chǎn)品間的競爭也愈發(fā)激烈,降低產(chǎn)品的設計成本,提升產(chǎn)品的市場(chǎng)競爭力成為嵌入式系統開(kāi)發(fā)者所面臨的重大挑戰。 NAND FLASH 和 NORFLASH 作為兩種主要的非易失性存儲器,被應用于各種嵌入式系統。其中 NAND FLASH主要優(yōu)點(diǎn)在于存儲密度高、容量大,有更占優(yōu)勢的存儲性?xún)r(jià)比。但是NANDFLASH 由于其獨特的頁(yè)式讀寫(xiě)方式,并不適合程序的直接執行。因此,從NAND FLASH啟動(dòng)需要片上存儲器作為代碼執行的中轉區。本文所討論的一種系統啟動(dòng)方式,是在缺少片上存儲器支持的情況下,實(shí)現系統直接從NAND FLASH啟動(dòng)。論文中充分考慮了如何實(shí)現軟、硬件之間的協(xié)同工作,以完成 SOC 系統的設計。
2 NAND FLASH 控制器的結構
本文所討論的NAND FLASH控制器是針對一款基于 ARM7TDMI 的 SoC 芯片,該控制器在芯片中的位置如圖 1 所示,作為 AMBA 總線(xiàn)上的一個(gè)從設備集成于 AHB 上。主要模塊包括總線(xiàn)接口模塊、 FIFO 緩沖模塊、 ECC 編碼模塊以及邏輯控制模塊。


總線(xiàn)接口模塊主要的功能是轉換 AMBA 總線(xiàn)上的控制和數據信號:將總線(xiàn)上的數據送入 FIFO 或將數據從 FIFO 讀出到總線(xiàn)上,將總線(xiàn)上的控制信號轉換時(shí)序后送到控制模塊。
NAND 控制器包含一個(gè)寬度為 32 b ,深度為 4 的緩沖 FIFO ,用于解決高速總線(xiàn)與低速設備之間數據傳輸速度的匹配問(wèn)題。為提高總線(xiàn)的傳輸效率,以及控制器設計的便利性,NAND FLASH在總線(xiàn)上的數據傳輸采用 DMA 的方式來(lái)完成。譬如在讀取 FLASH 一頁(yè)數據時(shí),數據持續寫(xiě)入控制器 FIFO , FIFO 滿(mǎn)時(shí)發(fā)出 DMA 傳輸的請求,同時(shí)暫停 FLASH 的數據讀取,控制信號 nRE 拉高,直至 DMA 響應請求即 FIFO 不滿(mǎn)時(shí), FLASH 的數據傳輸重新開(kāi)始。當選擇應用的 FLASH 位寬為 8 ,頁(yè)大小為 (512+16)B 時(shí),控制器需要發(fā)出 (32+1) 次 4 拍字寬度的 DMA 傳輸請求來(lái)完成數據和校驗信息的讀取。
控制模塊的上作主要是將總線(xiàn)接口轉換的控制信號,按照NAND FLASH的接口協(xié)議.將片選、地址、命令、讀寫(xiě)使能按照所配置的時(shí)序要求,發(fā)送到NAND FLASH中,并且控制數據的傳輸個(gè)數,以及 DMA 請求、數據傳輸完成中斷、數據錯誤中斷等系統信號。
NAND FLASH可靠性相對較差,存儲器芯片中有壞塊的存在,會(huì )導致存儲數據出錯。 ECC 校驗模塊針對 NAND FLASH的可靠性問(wèn)題,提供了一種查錯、糾錯的機制。 ECC 校驗碼在數據讀人時(shí),由硬件計算完成后寫(xiě)入到 FLASH 的校驗位中,當此頁(yè)數據讀出時(shí),校驗碼再次生成與存儲器校驗位中的數據進(jìn)行比較,若相同則沒(méi)有損壞位,若不同,則給出出錯中斷,軟件通過(guò)檢查比較結果,判斷出錯位的位置進(jìn)行糾錯處理。糾錯功能僅針對單 bit 位的出錯,當一個(gè)以上位同時(shí)在一頁(yè)中出現時(shí), ECC 校驗不能給出出錯位正確的位置。
3 NAND FLASH 工作的軟件流程
按照上節對控制器結構以及傳輸機理的分析,NAND FLASH的使用需要在 FLASH 控制器模塊以及 DMA 控制器模塊的協(xié)同下完成,工作的軟件流程如圖 2 所示。
軟件驅動(dòng)的主要工作是配置 DMA 模塊以及 FLASH 控制模塊,當傳輸完成,檢測到中斷后,軟件查詢(xún)狀態(tài)寄存器,其中的狀態(tài)位來(lái)自 FLASH 。當一次操作完成后,控制器自動(dòng)向 FLASH 發(fā)出查詢(xún)狀態(tài)的命令 0x70 ,讀出的狀態(tài)字保存在控制器的狀態(tài)寄存器中。
4 NAND FLASH 系統啟動(dòng)的傳統模式
目前支持從NAND FLASH啟動(dòng)的 SoC 芯片中,一般都內嵌有片內存儲器。各個(gè)處理器廠(chǎng)商對這塊片上存儲器定義的容量大小有所不同,但是啟動(dòng)模式都是比較一致的。NAND FLASH按頁(yè)順序讀取的方式,意味著(zhù)對當前的存儲地址訪(fǎng)問(wèn)后就無(wú)法馬上再次訪(fǎng)問(wèn),需在當前頁(yè)訪(fǎng)問(wèn)完成后,重新對此頁(yè)訪(fǎng)問(wèn)時(shí),才可對先前的地址單元再次訪(fǎng)問(wèn),這就導致了一些程序語(yǔ)句無(wú)法執行,譬如跳轉、循環(huán)等語(yǔ)句的使用。因此NAND FLASH僅作為啟動(dòng)代碼的存儲區,而真正執行的存儲器區域是內嵌的片上存儲器或者片外的 SDRAM 。
以上文中描述的控制器為例,按照這種啟動(dòng)模式,程序搬運以及執行的過(guò)程如下:


系統上電前,外部硬線(xiàn) NAND BOOT 開(kāi)關(guān)選擇從 NAND FLASH 啟動(dòng)。芯片設計時(shí),默認 DMA 占有系統總線(xiàn), DMA 按照配置寄存器的默認值工作,其源地址指向 NAND FLASH ,目標地址指向片上 SRAM , NANDFLASH 控制器在 NAND BOOT 選中的情況下,默認向 NAND FLASH 的首頁(yè)發(fā)出讀命令。即上電后, DMA 控制器以及 NAND FLASH 控制器默認的把 FLASH 存儲器中的第一頁(yè)搬到了片上 SRAM 中。一直到 DMA 的工作完成前, ARM 核無(wú)法占用總線(xiàn)。此時(shí)零地址映射在片上 SRAM , DMA 完成搬運后, ARM 開(kāi)始執行程序。此段代碼完成的工作包括對 SDRAM 控制器的初始化,從 NAND FLASH 搬運核心代碼至 SDRAM ,配置地址重映射寄存器至零地址處,最后將 PC 指向零地址的 SDRAM 。在 SDRAM 執行的代碼開(kāi)始真正啟動(dòng)系統。
5 NAND FLASH 系統啟動(dòng)的新方法
一般情況下,片上存儲器在作為啟動(dòng)代碼轉移階石的同時(shí),往往在啟動(dòng)后也有其特殊的作用??梢宰鳛樘厥獾某绦騾^,譬如在進(jìn)行 MP3 解碼過(guò)程中,核心解碼函數作為頻繁調用的程序,可以安排在片上 SRAM 中,以提高讀取速度,提升系統性能。在 SoC 芯片開(kāi)發(fā)過(guò)程中,在整體架構以及模塊功能的變化之后,這塊內嵌的 SRAM 失去了原來(lái)的作用,而僅作為 NAND FLASH 啟動(dòng)時(shí)的代碼跳板,對于整個(gè)芯片而言,付出的代價(jià)比較大。于是提出了在沒(méi)有片上存儲器的架構下,從 NAND FLASH 啟動(dòng)的一種新模式。
在上述一般模式啟動(dòng)過(guò)程中,片上 SRAM 所起到的作用,就是執行 NAND FLASH 中第一頁(yè)的代碼,將真正的啟動(dòng)代碼引入到 SDRAM ,最后將 PC 指針指向 SDRAM 。在失去片上 SRAM 的支持后,可以在控制器的 FIFO 中去執行此段代碼,這需要在硬件以及軟件代碼中作出適當的改變。 (1) 首先需要改變的是地址映射的機制,系統上電后, ARM 即從零地址開(kāi)始執行指令,零地址映射到 NAND FLASH 的 FIFO 入口地址,地址的譯碼過(guò)程由 AMBA 總線(xiàn)模塊完成。在外部硬線(xiàn) NAND BOOT 拉高的條件下, AMBA 從設備地址譯碼模塊在啟動(dòng)過(guò)程中,將零地址的設備選擇權給到緩沖 FIFO 。在第一頁(yè)的指令執行完畢后, PC 指針也指向 SDRAM 。
(2) 其次是 NAND FLASH 控制器在啟動(dòng)過(guò)程中,對數據的讀取方式。鑒于 NAND FLASH 大批量數據讀寫(xiě)的特性,往往采用 DMA 方式對數據進(jìn)行操作。啟動(dòng)過(guò)程中,由 ARM core 直接向 FIFO 讀取數據,在 FIFO 讀空的情況下,將從沒(méi)備 READY 信號拉低,等待 NAND 中的數據讀出。并且在此讀取過(guò)程中, DMA 的請求被屏蔽。
(3) NAND FLASH 型號類(lèi)型眾多,從每頁(yè)容量大小、數據寬度、地址級數以及各型號芯片不同的時(shí)序參數,決定了一個(gè)控制器接口的兼容性要求相當的高。為了兼容從不同的 NAND FLASH 啟動(dòng),設置了 4 根硬線(xiàn)作為選擇。 NAND BOOT 選擇是否從 NAND FLASH 啟動(dòng); PAGESIZE 選擇每頁(yè)大小,支持 512 B / page , 2 kB / page ; IOWIDE 選擇數據端口的寬度,支持 8 位、 16 位; AD-DRESSCYCLE 選擇發(fā)送地址級數,支持 3 級、 4 級、 5 級地址。時(shí)序參數的配置值可以采用默認的寬松值,在讀取首頁(yè)信息之后,將配置值根據當前的時(shí)鐘頻率以及芯片類(lèi)型,選擇舍適的時(shí)序值以達到最佳的性能。
(4) 存儲器首頁(yè)的代碼是在緩沖 FIFO 中執行的, FIFO 的入口地址是一個(gè)高 24 位的選通地址,因此當系統啟動(dòng)時(shí),零地址開(kāi)始增加,對 FIFO 中讀出的指令而言,低 8 位地址的變化是無(wú)關(guān)的, FIFO 始終被選通。指令的輸出是默認的順序輸出。這就要求首頁(yè)的代碼中不可以出現循環(huán)、跳轉等語(yǔ)句,并且要求在 128 條指令內完成需要的操作。
6 啟動(dòng)代碼和流程的分析
上述的匯編程序即是存放在 NAND FLASH 首頁(yè)的啟動(dòng)代碼,啟動(dòng)的流程如下:
(1) 配置 DMA 控制器的 4 個(gè)寄存器,通道使能后,等待 FLASH 發(fā)出的搬運請求;
(2) 配置 NAND FLASH 控制器的 3 個(gè)寄存器,選擇適合的地址、時(shí)序參數與所用的 FLASH 芯片吻合;
(3) 分別在 r8 ~ r11 中放入程序需要的備用值;
(4) 將需要在 SDRAM 中運行的 4 條指令搬入 SDRAM 0x30000000 處;
(5) 執行 Nop 指令, Nop 指令用于填充一頁(yè) NANDFLASH 中的剩余空間;
(6) 執行在頁(yè)末的指令,將 PC 指針指向 SDRAM 的 0x30000000 處;
(7) 執行 SDRAM 中的指令,首先啟動(dòng) NANDFLASH 的數據傳輸,將程序搬往 SDRAM 的 0x30001000 處。其次執行一個(gè)循環(huán)語(yǔ)句,等待第一頁(yè)的程序搬完,之后將 PC 指針指向 0x30001000 處,啟動(dòng)程序從 0x30001000 處正式開(kāi)始執行。
聯(lián)系客服