Blackfin處理器Second-stage Loader的應用程序在線升級設計方案
本文主要介紹了ADI Blackfin處理器的啟動流程、LDR文件的格式和一些高級的啟動技術,最后通過一個實際的例子說明如何使用SSL (second-stage loader) 實現應用程序的在線升級。
對于嵌入式開發者來說,一種快速方便的在線升級方法不僅能夠節約升級帶來的額外成本,還可以提高升級效率。
隨著集成電路技術的快速發展,系統的硬件方案已經變得越來越相似,一個嵌入式應用的價值和特點往往都是由應用程序來決定的。因此用戶希望嵌入式系統的功能可以不斷地完善和增強,這使得應用程序的升級變得非常普遍。
圖1 Blackfin處理器啟動流程
通用Blackfin的啟動流程和LDR文件分析
通用Blackfin處理器的啟動流程
Blackfin處理器的啟動可以看作是從靜態存儲器上讀取啟動碼流(LDF文件格式)到Blackfin內部的L1和SDRAM存儲器的過程。啟動工作全部由存儲在Blackfin ROM中的啟動代碼完成的。每款Blackfin處理器的ROM大小有所不同,但啟動過程總是從ROM的起始地址0xEF00 0000開始。
Blackfin處理器的啟動代碼可以分為新舊兩種版本,分別針對BF54x、BF52x、BF51x、BF561和BF53x。新版本啟動代碼以處理器的啟動模式為基礎來構建程序,一個通用的啟動內核負責處理的啟動碼流的解析、裝載和異常錯誤的處理。本文以新版的啟動代碼為基礎進行分析和構建實例,用戶可以參考已經發布的應用筆記EE-240和EE-314來學習BF53x和BF561的啟動過程。
本文以圖1為例講解Blackfin處理器的啟動流程。處理器復位后會從ROM的起始地址開始執行,啟動代碼首先讀取啟動碼流最開始的8個字節,它們只是頭信息的一部分,內核通過分析包含在這8個字節中的DMACODE位來確定DMA通道的寬度和步長。一旦DMA的配置完成后,啟動碼流將以子塊為單位進行讀取。啟動代碼根據頭信息中的目標地址和子塊長度將啟動碼流的每個子塊傳輸到指定的存儲器位置。當所有的塊傳輸完成后,啟動代碼會自動跳轉到應用程序的起始地址開始執行,默認的地址是0xFFA0 0000。這個過程就是Blackfin的啟動。
LDR文件格式
LDR文件,即可裝載文件,包含著全部的啟動碼流并保存在靜態存儲器中供啟動使用。它可以非常容易地通過Visual DSP(VDSP)的ELFLOADER功能生成。ELFLOADER解析輸入的可執行DXE文件,生成帶有頭信息的啟動碼流,過程如圖2所示。
圖2 LDR文件生成過程
LDR文件由多個子塊組成,每個子塊可以分為頭部和負載兩個部分,但有部分特殊子塊只有頭部,沒有負載區。頭部區共有16個字節,分別存儲著頭部的CRC校驗數據、標志符、目的地址、塊大小和塊參數,如圖3所示,用戶可以使用LDR VIEWER工具查看LDR文件。啟動代碼每次都會對頭部16字節進行異或校驗, BLOCK CODE的低16位用于儲存頭部區的校驗和。一旦頭部信息校驗失敗,啟動代碼就會調用錯誤處理函數,默認的情況是將內核置于空閑態,不處理任何后續數據。但是用戶可以在初始化函數中自行替換錯誤處理函數。
圖3 啟動碼流頭部區
頭部的標志符共有16比特,如圖4所示。這里需要著重指出的是BFLAG_FINAL、BFLAG_FIRST、BFLAG_INIT和BFLAG_FILL四個標志符,它們分別指出當前的子塊為結束塊、開始塊、初始化塊和填充塊。一般情況下每個LDR文件都會存在這四個標志符,而且具有其中任何一個標志符的子塊都沒有的負載區。一旦啟動碼流解析到標志符中有BFLAG_FINAL或BFLAG_INIT,它會馬上調用入口地址存儲在EVT1寄存器中的函數,這個地址通常是0xFFA0 0000。也就是說,在默認的情況下,應用程序的起始位置和初始化函數的起始地址都是0xFFA0 0000。DMACODE用來配置DMA通道的寬度和傳輸步長,但一般只在啟動開始的時候設置一次。
圖4 標志符低16位
Blackfin的高級啟動功能
內核數據結構
新版的啟動代碼使用了一種新的數據結構,叫做ADI_BOOT_DATA。通過在初始化函數中修改這個數據結構中的成員變量,用戶可以定義自己的啟動過程,這里簡要介紹升級過程中用到的成員。
• pSource:啟動碼流在FLASH存儲器中的起始地址,默認情況下是0x0。但用戶可以通過修改這個成員,使啟動代碼從FLASH存儲器的其它地址開始讀取啟動碼流。
• pLogBuffer:啟動記錄存儲區,默認的起始地址位于0xFFB0 0400。因為這個臨時數據存儲區不能被DMA訪問,所以多作為應用程序的堆棧。該緩沖區記錄了啟動碼流的每個子塊的頭信息及一些同啟動過程密切相關的重要信息,具體內容可參考BF51x的硬件手冊。這些記錄信息的主要用于啟動調試。
• dFlags:低15位是當前正在處理的啟動碼流子塊的頭信息標志符(圖4),高15位是啟動數據結構的標志符,如圖5所示。當SPI FLASH的類型已經確定后,用戶通過設置BFLAG_TYPE,BFLAG_NOAUTO和BFLAG_ALTERNATE三個標志位可以使啟動代碼跳過SPI地址檢測。
圖5 標志符高16位
可用于啟動過程的API函數
為了方便開發者定義客戶化的啟動過程,啟動的ROM提供了11個API函數供用戶使用,它們的接口參數請詳見BF51x硬件手冊,這里介紹將會用到的BFROM_SPIBOOT,BFROM_CRC32和BFROM_CRC32POLY函數。
BFROM_SPIBOOT函數的C語言原型是:
s32 bfrom_SpiBoot (s32 dSpiAddress,
s32 dFlags,
s32 dBlockCount,
ADI_BOOT_HOOK_FUNC* pCallHook);
SPI啟動代碼需要四個參數,分別是啟動碼流在SPI FLASH內存中的起始位置,啟動標志符(圖5和圖4)、子塊數量(非負數時正常啟動)和回調函數。通過使用這個函數,SPI啟動代碼可以裝載已經存儲在SPI FLASH的啟動碼流。利用回調函數,用戶可以修改SPI的波特率,SPI的slave select pin等配置,加快啟動速度。
BFROM_CRC32POLY函數的C語言原型是:
s32 bfrom_Crc32Poly (unsigned s32 *pLut,
s32 dPolynomial);
該函數根據用戶提供的多項式建立CRC校驗需要的查詢表,多項式可從LDR文件的INIT塊中找到(必須使用-CRC32選項生成LDR文件)。查詢表要在使用bfrom_Crc32函數之前建立好。
BFROM_CRC32函數的C語言原型是:
s32 bfrom_Crc32 (s32 *pLut,
void *pData,
s32 dByteCount,
s32 dInitial);
該函數用于校驗LDR文件的負載區,頭部信息已經有頭部區的校驗和來保證正確性。使用該函數之前需要建立CRC校驗查詢表。函數會返回每個子塊負載區的CRC值。
基于SSL的在線升級方法
當前的升級方法多是基于ping-pong的方法,每次都會更新最舊的版本,這樣的設計保證了即使升級失敗,系統也能夠正常啟動。但是使用這種方法,系統需要啟動碼流兩倍大小的FLASH存儲器,增加了系統成本。
本節將根據前面介紹的Blackfin處理器啟動流程和高級啟動技術,使用SSL來構建一個在線升級的方案。通過使用SSL,用戶能夠控制升級和啟動過程,即使出現升級失敗,也不會導致系統癱瘓,而且不需要增加額外的FLASH存儲器空間。這個例子基于BF518處理器,但也可以推廣到BF54x或BF52x處理器。本文選用比較通用的SPI FLASH作為SSL和應用程序的存儲介質,同時BF518工作在external SPI boot的模式。SSL通過串口接收升級數據,同上位機進行通訊。
SSL的工作原理
SSL主要包括兩部分功能,啟動碼流的接收和升級。接收部分通過串口從上位機接收LDR文件,然后存儲到SDRAM中,使用Blackfin提供的bfrom_Crc32函數校驗接收到的碼流。升級部分將SDRAM中的LDR文件燒寫到SPI閃存中,并更新文件狀態。升級過程如圖6所示。
圖6 升級過程
升級應用程序首先需要軟/硬重啟系統來加載SSL。SSL啟動后首先初始化系統硬件,向上位機發出是否升級的確認信息。如果在5秒內沒有得到上位機的回復,系統將進行正常的啟動流程。用戶也可以自定義等待時間(不超過10秒)。如果SPI FLASH中沒有有效的啟動碼流,SSL會強制讓用戶升級新的應用程序。得到確認升級的消息后,SSL要求上位機發送啟動碼流。當上位機發送完成全部碼流后,它要發送一個用戶定義的結束標志符(不要和LDR文件中的數據重合)通知SSL傳輸過程完成。然后SSL對緩存在SDRAM中的數據進行CRC校驗并將結果反饋到上位機。如果校驗失敗,SSL會讓用戶選擇重新升級,還是放棄升級后啟動上一次使用的應用程序。CRC校驗成功后,SSL將更新SPI FLASH中LDR文件和狀態標志位。全部過程結束后SSL直接調用bfrom_SpiBoot函數加載應用程序,不需要重新啟動系統。
SSL和應用程序的LDR文件生成和FLASH燒寫
應用程序的LDR文件生成如下圖7所示,需要增加-CRC32選項使ELFLOADER生成帶有校驗多項式的文件(請參考VDSP幫助文檔獲得該選項的具體信息)。SSL需要單獨生成一個LDR文件,并燒寫到SPI FLASH起始地址0x0。一般SPI FLASH的最小擦除單位是扇區,所以應用程序要從SSL后面的第二個扇區開始燒寫,并且要空出頭4個字節用來保存當前LDR文件的狀態標志位。
圖7 Load Option配置
總結
本文首先介紹了BF51x處理器的啟動過程,LDR文件的解構和一些高級的啟動技術,并在這些知識的基礎上實現了一個基于SSL的應用程序在線升級。本文描述的SSL只實現了一個基本的程序升級要求,根據實際應用的需要,嵌入式開發者可以繼續擴展SSL的功能,比如支持網絡升級等或定制自己的SSL。通過使用SSL,嵌入式開發者可以非常迅速方便地升級應用程序,節約升級成本,為客戶提供額外的產品價值。