基于S12G CAN總線通信的獨立NVM驅(qū)動安全bootloader設(shè)計
摘要:本文針對傳統(tǒng)汽車ECU CAN總線通信bootloader將NVM驅(qū)動放置在MCU片上Flash, 存在程序跑飛進(jìn)入NVM驅(qū)動時造成NVM數(shù)據(jù)丟失,從而出現(xiàn)ECU功能丟失或工作異常的問題,提出一種獨立NVM驅(qū)動的安全bootloader設(shè)計,并在NXP的S12G128上實現(xiàn)。
本文引用地址:http://www.ex-cimer.com/article/201607/294705.htm引言
CAN總線因其良好的差分通信抗干擾能力而被廣泛應(yīng)用于汽車ECU通信。bootloader是MCU上電或復(fù)位之后最先運行的一段永久駐留于MCU 片上NVM (Non-Volatile Memory,非易失性存儲器) 中的一段極小的程序,完成與PC上位機(jī)通信,下載、解析并存儲應(yīng)用程序到ECU的非易失性存儲器,從而完成應(yīng)用程序的在線升級[1]。以往的bootloader設(shè)計將NVM的驅(qū)動程序放在片上Flash中,當(dāng)程序跑飛進(jìn)入NVM驅(qū)動時就會造成NVM數(shù)據(jù)丟失,導(dǎo)致ECU功能丟失或工作異常。如果將NVM驅(qū)動程序編譯到MCU RAM中,形成S19文件,與應(yīng)用程序一起由CAN總線下載到RAM中運行而不將其儲存在片上,則可以避免此類情況發(fā)生。
1 S12G128片上NVM資源及其獨立驅(qū)動程序開發(fā)
S12G128片上NVM資源包括片上的4KB EEPROM和128KB P-Flash。由于S12內(nèi)核中SP和PC寄存器都是16位寬,因此,其最大線性尋址范圍為64KB。為了高效地訪問大于64KB的P-Flash存儲空間,F(xiàn)reescale提出了存儲器分頁訪問機(jī)制,即通過0x8000~0xBFFF的16KB Flash窗口以存儲器映射的方式對分頁的Flash空間進(jìn)行訪問[2-3]。
1.1 S12G128片上NVM資源
S12G128的128KB P-Flash包括了從全局地址0x20000開始的8個連續(xù)16KB Flash頁,其支持1/2/4/8/16KB的區(qū)域 (region) 保護(hù) (Protection) 和 整個P-Flash的加密 (Secure) 。所謂保護(hù)是指不能被應(yīng)用程序擦除和改寫,這一功能在bootloader開發(fā)中常被用于保護(hù)bootloader程序自身不被應(yīng)用程序修改。加密是針對BDM調(diào)試接口的,當(dāng)S12G加密之后,外部調(diào)試器能夠執(zhí)行的唯一BDM命令就是整片擦除,要想解密,就得執(zhí)行整片擦除命令將整個P-Flash上的數(shù)據(jù)清空或者輸入8個字節(jié)的正確后門密鑰 (backdoor key,位于局部地址0xFF00~0xFF07,全局地址0x3FF00~0x3FF07)。 從而有效的保護(hù)用戶的軟件知識產(chǎn)權(quán)[2]。
S12G128的片上4KB EEPROM,地址空間為0x400~0x13FF,位于CPU可以直接訪問的局部地址[3]中,所有無需分頁訪問。其包含1024個4Byte的最小擦除和編程扇區(qū)(sector)并支持靈活的保護(hù)功能。S12G 128 的NVM都支持硬件ECC,能夠自動糾正NVM數(shù)據(jù)的單比特錯誤和多比特檢錯。
1.2 S12G128 獨立NVM驅(qū)動開發(fā)
NXP提供的S12系列MCU的標(biāo)準(zhǔn)軟件驅(qū)動 (SSD—Standard Software Driver),包含運行時獨立的源代碼、S19文件,C數(shù)組以及靜態(tài)庫等形式的NVM驅(qū)動[5]。
本設(shè)計中使用標(biāo)準(zhǔn)軟件驅(qū)動開發(fā)獨立NVM驅(qū)動:首先,根據(jù)實際MCU型號配置SSD,make生成C數(shù)組形式的NVM驅(qū)動,將其整理在一個C文件中與SSD頭文件一起添加到CodeWarrior工程中編譯,并將各個NVM驅(qū)動函數(shù)地址放在位于地址0x3F80的數(shù)組中作為NVM驅(qū)動函數(shù)地址表。因為所有的NVM驅(qū)動函數(shù)數(shù)組和NVM驅(qū)動函數(shù)地址表都由C語言關(guān)鍵詞const修飾,是數(shù)組常量,默認(rèn)放在ROM_VAR段中,修改工程PRM鏈接文件,將ROM_VAR段放置在NVM_RAM段中即可將其編譯到0x3000開始的RAM地址,得到S19文件,從中即可分離得到NVM驅(qū)動及其函數(shù)地址表的S19格式文件。具體的NVM驅(qū)動函數(shù)映射地址表及PRM鏈接文件如圖1所示。
使用時,先將其加載在對應(yīng)的RAM地址,然后用函數(shù)指針調(diào)用。
2 基于CAN總線的bootloader設(shè)計
基于CAN總線的bootloader設(shè)計包括運行在PC上的上位機(jī)軟件和運行在目標(biāo)MCU中的bootloader軟件兩部分。
2.1 PC上位機(jī)軟件及通信協(xié)議設(shè)計
運行在PC上的上位機(jī)軟件主要功能是讀取目標(biāo)MCU的應(yīng)用程序S19文件,并調(diào)用USB轉(zhuǎn)CAN總線適配器(Adapter),將其逐行下載到目標(biāo)MCU,其軟件設(shè)計軟件設(shè)計流程圖如圖2所示。
本設(shè)計中,采用Visual C++調(diào)用WFC和武漢吉陽光電的-GY8507 USB轉(zhuǎn)CAN適配器驅(qū)動,編寫上位機(jī)軟件。
上位機(jī)下載應(yīng)用程序S19文件的CAN消息是ID為0x64的標(biāo)準(zhǔn)數(shù)據(jù)幀,而bootloader host程序應(yīng)答上位機(jī)的CAN消息幀是ID為0xC8的標(biāo)準(zhǔn)數(shù)據(jù)幀,通信速率設(shè)置為500Kbit/s。因此在S12G初始化時將MSCAN模塊的接收ID濾波器設(shè)置為只接收ID為0x64的標(biāo)準(zhǔn)幀,以避免總線上其他ECU的干擾。具體的CAN消息命令定義如表1所示。
2.2 bootloader軟件設(shè)計
bootloader軟件設(shè)計流程如圖3所示。
MCU復(fù)位之后,進(jìn)行系統(tǒng)初始化,配置系統(tǒng)時鐘和MSCAN,使能CPU全局中斷,然后等待上位機(jī)boot命令并檢查是否超時:如果在規(guī)定的500ms內(nèi)接收到了上位機(jī)請求進(jìn)入boot的命令,則建立通信接收并解析得到行地址和字對齊的數(shù)據(jù),接著判斷S19行地址空間,若是Flash地址且是第一次收到Flash數(shù)據(jù),則將除bootloader程序之外的所有片上Flash擦除;若為EEPROM地址且是第一次收到EEPROM數(shù)據(jù),則將全部EEPROM擦除;若是RAM地址,則不可擦除。對Flash地址的數(shù)據(jù),在編程到Flash之前,還須將解析結(jié)果中的邏輯地址轉(zhuǎn)換為Flash驅(qū)動所需的線性連續(xù)物理地址,并將數(shù)據(jù)進(jìn)行4字對齊,以提高編程效率。依次逐行接收,解析并將結(jié)果燒寫到相應(yīng)地址的片上Flash/EEPROM/RAM中,直至整個應(yīng)用程序S19文件結(jié)束,最后復(fù)位外設(shè)、清除NVM驅(qū)動所在的RAM、關(guān)閉CPU全局中斷,結(jié)束bootloader跳轉(zhuǎn)至應(yīng)用程序;如果在規(guī)定的500ms內(nèi)未收到上位機(jī)通過CAN發(fā)來的進(jìn)入boot命令,則直接關(guān)閉CPU全局中斷,結(jié)束bootloader跳轉(zhuǎn)至應(yīng)用程序。
2.3 應(yīng)用程序軟件設(shè)計
應(yīng)用程序設(shè)計時,需要保留bootloader所在的Flash空間并在系統(tǒng)初始化時設(shè)置IVOR=0xEF,將應(yīng)用程序中斷向量表偏移至0xEF80,使其與MCU復(fù)位后默認(rèn)的中斷向量表分開,從而執(zhí)行不同的外設(shè)中斷服務(wù)函數(shù)。
另外,需要將COP看門狗使能,在應(yīng)用程序主循環(huán)中正常喂狗,而在MSCAN接收中斷中對接收到的CAN消息ID進(jìn)行判斷,若接收到Boot ID,則不喂狗,讓其溢出復(fù)位,從而進(jìn)入bootloader。典型的應(yīng)用程序軟件設(shè)計流程圖如圖4所示。
3 bootloader和應(yīng)用程序內(nèi)存分配及處理器專家配置
在bootloader工程中使用CodeWarrior 5.1 IDE自帶的內(nèi)核和外設(shè)圖形化配置和自動代碼生成工具--處理器專家(Processor Expert)配置外部8MHz晶振作為PLL參考時鐘,配置PLL倍頻輸出50MHz作為CPU運行時鐘,其二分配得到的25MHz作為總線時鐘頻率;MSCAN通信速率為500Kbit/s,使能接收中斷。配置0xF000~0xFEFF的3.8KB Flash作為bootloader存儲空間,堆棧大小為256B,保留0x3000到0x3FFF的4KB空間作為NVM驅(qū)動代碼的存儲和運行空間并將其初始化為0。系統(tǒng)RAM空間為0x2000到0x2FFF。
在應(yīng)用程序工程中,需要保留bootloader所在的Flash最后4KB空間,其余Flash空間全部可被應(yīng)用程序使用;對于RAM空間,則全部8KB都可以被用戶使用。而且必須保證其入口函數(shù)Entry_Point () 與bootloader中定義的應(yīng)用程序入口地址相同 (因為使用處理器專家生成的工程中,默認(rèn)從0xC000開始放置默認(rèn)中斷服務(wù)函數(shù)Cpu_Interrupt () 和匯編軟件延遲函數(shù)Cpu_Delay100US (), 其分別占2個字節(jié)和12個字節(jié),然后才放置MCU復(fù)位中斷服務(wù)函數(shù)_EntryPoint () ,如果在處理器專家的CPU組件中未使能匯編軟件延遲函數(shù),則應(yīng)將bootloader和應(yīng)用程序中的應(yīng)用程序入口地址由0xC00E改為0xC002 。
bootloader和應(yīng)用程序的內(nèi)存分配如圖5所示。
使用處理器專家CPU組件的編譯選項能夠非常方便的完成上述內(nèi)存分配并生成prm鏈接文件, bootloader內(nèi)存分配處理器專家配置結(jié)果如圖6所示。
生成相應(yīng)的鏈接文件為:
SEGMENTS
RAM = READ_WRITE 0x2000 TO 0x2FFF;
ROM_C000 = READ_ONLY 0xC00E TO 0xEFFF;
NVM_DRIVER_RAM = READ_WRITE 0x3000 TO 0x3FFF FILL 0x00;
BOOT_ROM = READ_ONLY 0xF000 TO 0xFEFF;
END
PLACEMENT
_PRESTART,
STARTUP,
ROM_VAR,
STRINGS,
NON_BANKED,
DEFAULT_ROM,
COPY INTO BOOT_ROM;
DEFAULT_RAM INTO RAM, NVM_DRIVER_RAM;
APP_ROM_ENTRY INTO ROM_C000;
END
INIT _EntryPoint
STACKSIZE 0x0100
4. 總結(jié)
本文針對NXP公司的S12 (X) 系列MCU在汽車ECU應(yīng)用中bootloader開發(fā)的實際需求,介紹了S12G128的片上NVM資源極其獨立驅(qū)動開發(fā),提出并實現(xiàn)了一種基于CAN總線通信將NVM驅(qū)動程序由上位機(jī)下載到RAM中運行而非讓其駐留于MCU片上Flash的安全bootloader設(shè)計,有效避免了應(yīng)用程序跑飛運行至駐留于片上Flash的NVM驅(qū)動代碼所造成的程序/數(shù)據(jù)丟失失效。借助CodeWarrior 5.1 IDE的圖形化外設(shè)配置和自動代碼生成工具----處理器專家,便捷的實現(xiàn)了bootloader和應(yīng)用程序的內(nèi)存分配和片上外設(shè)配置。本設(shè)計提供完整設(shè)計工程和使用文檔,在此基礎(chǔ)上,根據(jù)整車廠的要求修改CAN報文boot ID和命令,并增加相應(yīng)的UDP或者CCP協(xié)議棧即可快速開發(fā)出符合車廠要求的安全bootloader產(chǎn)品。
參考文獻(xiàn):
[1][德]康拉德·萊夫 .BOSCH汽車電氣與電子, 中文第二版[M].孫澤昌,譯,北京:北京理工大學(xué)出版社,,2014,8.
[2]孫同景. Freescale 9S12 十六位單片機(jī)原理及嵌入式開發(fā)技術(shù)[M].北京:機(jī)械工業(yè)出版社, 2008,7.
[3]AN3784.Understanding the Memory Scheme in the S12(X) Architecture, Application Note. NXP Semiconductor, http://www.nxp.com. 2009.
[4]MC9S12G Family Reference Manual, Rev.1.25. NXP Semiconductor, http://www.nxp.com. 2014.
[5]Standard Software Driver for MC9S12G / MC9S12VR User’s Manual, Rev.3.1. NXP Semiconductor, http://www.nxp.com. 2012.
本文來源于中國科技期刊《電子產(chǎn)品世界》2016年第7期第73頁,歡迎您寫論文時引用,并注明出處。
評論