電子電器架構刷寫方案——General Flash Bootloader
我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。
注:文章1萬字左右,深度思考者入!!!
老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師:
屏蔽力是信息過載時代一個人的特殊競爭力,任何消耗你的人和事,多看一眼都是你的不對。非必要不費力證明自己,無利益不試圖說服別人,是精神上的節能減排。
無人問津也好,技不如人也罷,你都要試著安靜下來,去做自己該做的事.而不是讓內心的煩躁、焦慮、毀掉你本就不多的熱情和定力。
文章大體有如下內容:
1、簡介
2、刷寫系統概述
3、Flash Bootloader刷寫流程
4、Flash Bootloader架構介紹
5、關于刷寫的思考
正文如下:
一、Bootloader簡介
首先基于現在整車電子電氣架構中ECU類型,大體分為兩類:
MCU(常規MCU)具備硬實時,應用Classic AUTOSAR軟件架構;
MPU,具備操作系統,應用上多使用Adaptive AUTOSAR軟件架構或者自研;
那相應對于Bootloader介紹也分為:
1、MCU Bootloader是微控制器(MCU)中的引導程序,它的設計旨在解決程序升級問題,尤其是在產品穩定投產、程序燒錄后,MCU被外殼等材料覆蓋,無法通過燒錄口進行升級的情況下。Bootloader可以通過一定方式觸發運行,比如按鍵觸發或UDS協議指令(在汽車行業中)觸發。一旦Bootloader運行,它可以通過串口接收新的代碼并寫入Flash,從而在不使用燒錄器的情況下實現程序升級。
2、Bootloader,中文名稱為系統啟動加載器,是計算機系統從開機上電到操作系統啟動過程中所需要的一個引導程序。在嵌入式Linux系統中,Bootloader也扮演著重要的角色。它是一段在操作系統內核運行之前運行的程序,主要負責初始化硬件設備、建立內存空間映射圖,將系統的軟硬件環境帶到一個合適狀態,以便為最終調用操作系統內核準備好正確的環境。
Bootloader的具體作用如下:
-> 1、提供初始的硬件設備的初始代碼,以及檢測和初始化單板;
-> 2、引導操作系統,包括定位、解壓和加載操作系統到內存空間,然后將其控制權交給操作系統;
-> 3、當操作系統獲取控制權后,嵌入式系統中的Bootloader就不復存在了。
此外,U-Boot是一款流行的功能強大的開源Bootloader項目。它支持多種嵌入式操作系統內核,如Linux、NetBSD、VxWorks等,也支持多種處理器系列,如PowerPC、ARM、x86、MIPS。U-Boot有較高的可靠性和穩定性,以及高度的靈活的功能設置,適合U-Boot調試、操作系統的不同引導要求、產品發布等。它還包含豐富的設備驅動源碼和較為豐富的開發調試文檔與強大的網絡技術支持。
首先關于ECU刷寫的軟件架構Flash Bootloader并沒有在AUTOSAR規范中有明確定義。原因是每家刷寫策略基于自身需求不一致,沒有必要在AUTOSAR規范中特定定義函數接口等信息。
基于整車不同域,使用場景不一樣,就會有不同的總線類型。因此在做ECU刷寫時,也是通過不同的總線類型CAN,LNFlexRay or Ethernet)來完成軟件的下載更新。
整車所有件基于相同的刷寫流程,只是數據傳輸的總線載體不一樣而已。
在研發階段,可以隨時進行應用程序(Application)的更新和下載可以隨時為研發工程師隨時進行下載調試更新等功能在車輛下線階段,進行應用程序的刷寫和灌注:在車輛售后階段進行售后維護和升級
目前對于ECU更新方式:
1、刷寫上位機通過OBD口,相當于傳統的Flash更新方式進行更新;
2、另外是通過OTA,基于OTAMaster 對車內節點進行更新;
上述刷寫方式不需要通過更換硬件ECU來完成軟件的更新,對于軟件bug或者功能升級,在硬件不需要更新的情況下,可以直接通過更新Application功能實現功能升級對于量產的ECU產品,可以不通過傳統的調試接口UTAGDAP2)來完成Fash 的刷寫這個時候調試口已經關閉,通過OBD口升級提供一種更好的方案對于車內的ECU來講,通過一套協議(UDS)即可完成全部ECU的刷寫需求在一定程度上,保證了刷寫過程中的安全性和合法性。
通過上位機加載待刷寫的Flash Data/Driver,不用通過燒錄口就可以進行software update,對用戶而言更加友好。
二、系統概述
診斷儀通過OBD診斷口和網關ECU進行連接,實現診斷刷寫和路由功能:每個ECU的內存布局都是基本類似,包含了三大部分 Flash Bootloader.Flash Driver 和Application.
Flash Bootloader實現總線通信基于ISO標準和OEM企標,實現診斷服務功能Application調用Flash Driver 接口來對Fash進行擦寫操作一般情況下,代碼僅在輪詢模式下運行的中斷僅在一些特殊需求下才會用到,一般代碼精簡短小,占用空間資源不大.
用于擦除和寫入數據的Driver,通常是在RAM中執行調用的,是片內片外的驅動程序可對Hash 進行擦除和寫入,可將數據寫入Flash中。
-> 通過驅動調用擦除接口,可以對內存地址進行擦除,將地址上舊數據進行擦掉;
-> 在數據寫入階段可以調用驅動的寫入接口,實現對新數據在擦除后的地址進行寫入操作,不同的芯片廠家和硬件平臺,flash driver 是有所不同的。
根據 Flash 芯片不同,不同點主要體現如下兩點:
1、不同的擦寫參數(Sectors/Pages): 擦除和寫入的Sector 和page 大小不一樣2、存儲保護機制(ECC);
對于第一點(擦寫參數(Sectors/Pages)是指在擦除或重寫存儲設備中的數據時所使用的單位。不同的存儲設備可能有不同的擦寫參數,這些參數可能會影響擦寫性能和壽命。
在閃存設備中,擦寫參數通常是以扇區(Sector)或頁(Page)為單位進行操作的。扇區通常是一個存儲單元,可以容納一定數量的數據,而頁是閃存設備中一個最小的可擦除單位。
對于不同的閃存設備,擦寫參數可能會有所不同。例如,一些設備可能有 2KB的頁大小,而另一些設備可能有 4KB 或 8KB 的頁大小。此外,一些設備可能支持不同的擦寫策略,例如一次擦寫一個扇區或一次擦寫多個扇區。
這些不同的擦寫參數可能會影響閃存設備的性能和壽命。例如,如果一個設備的頁大小較小,那么在執行寫入操作時,可能會需要進行更多的讀-改-寫操作,這可能會導致性能下降。此外,如果一個設備的擦寫策略過于頻繁地擦除同一區域的數據,那么這個區域的壽命可能會比其他區域更短。因此,選擇正確的擦寫參數對于優化閃存設備的性能和壽命非常重要。這需要根據具體的應用需求和設備特性進行選擇。
對于第二點:(存儲保護機制(ECC)是一種用于Nand Flash 的差錯檢測和修正算法,它能夠確保數據的可靠性。
在Nand Flash的每個頁面上,包括額外的存儲空間,即64個字節的空閑區(每512 字節的扇區有 16 字節)。這個空閑區能存儲 ECC 代碼及其它信息,例如磨損評級或邏輯到物理塊映射。在編程操作期間,ECC單元根據扇區中存儲的數據來計算誤碼校正代碼。數據區的ECC代碼然后被分別寫入到各自的空閑區。當數據被讀出時,ECC代碼也被讀出,運用反操作可以核查讀出的數據是否正確
如果有數據錯誤,ECC 算法可以校正數據錯誤。能校正的錯誤的數量取決于所用算法的校正強度。軟件通常負責磨損評級或邏輯到物理映射,并且如果處理器不包含ECC 硬件的話,軟件還需要提供 ECC 碼。
芯片內部對數flash driver存放位置:
-> 1、UTSAR轉化為加密的二進制數組文件并對文件進行加密存儲在FIashBootloader 中的指定Flash 區域,調用前先解密目的是防止flash誤操作,誤調用,比如用戶程序(Application 調用flashdriver 接口,對某-塊區域進行調用擦寫),添加加密策略,就保證了只有 Bootloader 具備解密能力,才可以調用Flash driver;
-> 2、刷寫Application之前通過診斷儀載入到 RAM中上述操作是先通過診斷儀將 flash driver 下載到指定的區域(RAM 區域),下載完成后Bootloader 才可以調用相應的接口實現對內存的擦除和寫入。ECU 復位或者斷電后 flashdriver就不再存在,避免安全問題。
三、Flash Bootloader刷寫流程
本文僅描述通用性刷寫流程,不同OEM或多或少有一定的差異如上圖,當前假設只有FBL程序,沒有Application(用戶程序)。ECU上電后運行在Bootloader當中,Tester 通過相應的接口卡
舉例常用的:
CAN總線用VN16 系列;
DoIP用VN56系列。
這樣刷寫上位機與待刷寫 ECU 建立連接,通過UDS 協議刷寫上位機與 ECU 進行相應的數據交互,主要讀取一些所需要的診斷版本信息數據。接下來就是將用戶程序數據通過刷寫上位機傳到ECU相應的地址處進行刷寫。數據傳輸并寫入完畢,Bootloader 會對數據進行校驗,其中包含對單獨每一個 block 以及整體的數據進行校驗上述完畢后,對App有效標志位進行操作置位,后續復位。復位操作首先在FBL中查閱應用數據flag 位是否置位,判斷有效后就會跳到用戶程序中在Application中運行正常。后續有新的刷寫請求,會繼續運行至FBL中。對于刷寫流程大體分為三步:
A:Pre programming
首先切換至編程會話模式,進行Programming Pre-condition狀態檢查(車速、擋位等);
關閉DTC功能
對常規通信報文進行設置,只接收診斷報文
目的是讓ECU全負荷為刷寫服務。
切換至編程會話模式寫入一些DID和讀取DID操作這些操作與OEM企業標準強相關。在定義刷寫流程中明確每一步執行的內容和目的。信息安全要求過Service27,表示通過爭取途徑獲取訪問權限。
1、Request Service 34報文格式中會體現下載數據長度、是否壓縮等信息;、
2、通過Service36/37完成數據的整體傳輸3、數據傳輸完成后,會執行 Service 31,對下載數據做完整性校驗,數據丟失、錯位等失真情況。
Flash Driver后會通過Service 31RID(猜出FF00)調用對內存擦除的接口實現對ECU內存的擦除操作。想要寫入新的數據之前,必須對數據做擦除操作后才可以進行寫入。
如上圖,Vector 中國關于Fash Bootloader 產品手冊的截圖關于 Flash Bootloader 工程主要分為幾大部分:
1、通信協議棧主要用于實現不同總線的通信需求,如圖支持車載CAN 總線/LIN 總線/Flexray總線/車載以太網
2、OEM Download Manager主要是基于OEM企標要求做代碼功能實現:A:OEM 定義的刷寫流程(在 Bootloader 模式下)所使用到的診斷服務、子服務所支持的DID/RID/NRC信息都在這個模塊做功能實現;
3、Fash bootloader 用戶程序讀取一些軟件版本號、NVM存儲應用,小模塊上述流程也完全符合AUTOSAR開發流程。包含CAN、LIN早期協議棧是GENY做配置,現在是用Dawinciconfigurator定義pdur、CANdRIVER。當前 Bootloader 中也包含了一些非AUTOSAR定義的內容,這個時候需要由 Bootloader軟件服務商自己OEM特定需求做定制化開發。也就是日常所說的購買成熟協議棧使用。
4、Bootmanager為芯片一級boot,是ECU 上電后第一個執行的代碼,由該模塊負責ECU該往那個代碼模塊跳比如進入 Bootloader還是Application(常見刷寫成功后置位Flash位作為下次啟動的判定標準)當需要對FlashBootloader做更新時,就需要由Bootloader Updater 來實現,其實這個邏輯也可以對照SBL/PBL,當有Super SBL時,也可以允許對PBL做擦除。
5、為了完成刷寫功能,用于UI界面加載Flash Driver/Flash Data,也執行刷寫template定義刷洗序列。
FBL和Application之間的跳轉ECU上電后,代碼運行會進入到FBL中,做相應的一些ECU初始化,初始化完成后會進入判斷刷寫標志位的一個步驟。若刷寫標志位有效,進入到Boot 中,若標志位無效,進入App 中。FBL跳轉至ApplicationFBL初始化
A:檢查刷寫標志位
B:檢查Application的有效標志位
C:跳轉至Application的入口
D:執行Application的啟動代碼
Application跳轉至FBL
Application 運行中接收到診斷儀發出的診斷刷寫請求
Application 將刷寫請求標志位存入NVM 或者RAM中
Application 執行復位操作
FBL檢查診斷刷寫標志位
另外關于Stay In Boot功能:
在Application無法接收和處理診斷請求時,避免ECU無法進行刷寫更新并不是所有的OEM都會用到,通常情況下,用于研發階段,量產中可能也會用(影響啟動時間)。該功能應用場景是在某一次更新當中把新的APP更新到ECU中。此時APPdata沒有經過很充分的認證導致APP 軟件中有 bug,比如有死循環 (While)。每一次ECU 上電,先進入boot,在進入app,死循環無法與診斷儀(刷寫上位機)做診斷數據交互,發送請求也沒有響應。
這個時候通過其他方式來規避這個風險,vFlash也支持,對ECU啟動時間有影響。
當收到Stay in boot message進入Stay in boot狀態,避免ECU編程板磚。
關于ECU安全啟動
對于Flash Data會存在片內或片外,會有可能被不法分子做篡改的風險。
通過安全啟動獲知該ECU 是否App data 是否被篡改、是否無效等,保證車輛安全ECU一上電,通過HSM,HSM 可以理解位信息安全的加密引擎,對FBL做源碼校驗,通過特定算法和 key 計算出一個 MAC 值(消息認證碼)。這個消息認證碼與原本存在芯片中的消息認證碼進行比較:
若一樣,FBL valid。不一樣:FBL被算改了!
同樣策略也可以對APP做mac檢驗,開啟ECU時計算一個MAC值對比ECU內部存儲的就可以確認APP是否有效安全啟動每一家芯片供應商都有自己的做法
HSM(硬件安全模塊)對于實現AUTOSAR系統的加密保護起著重要作用。隨著汽車電子控制單元(ECU)連通度的提高,安全和防范外部威脅的重要性日益增加。HSM具有適當的固件,即使在資源不足的情況下,也能保證系統的加密。此外,HSM還允許在單獨的處理器上計算密碼,以滿足實時需求。因此,HSM在AUTOSAR系統中發揮著關鍵作用,確保了系統的安全性和實時性能。