之前Boot是無法再次更新的,也就是說出廠后,Boot的軟件版本就是固定的,除非是拆件。不過現(xiàn)在越來越多的主機(jī)廠要求Boot也要支持刷寫,即使發(fā)生潛在錯誤時,Boot也可以更新修復(fù)。另外現(xiàn)在越來越多的ECU實(shí)施AB區(qū)的刷寫方案。下面主要從Boot啟動流程、ECU刷寫流程、升級測試、Boot自更新方案三方面來梳理。
01. Boot的啟動流程
ECU上電后,首先執(zhí)行Boot。Boot首先完成一些基本的初始化,例如CAN驅(qū)動,IO模塊,初始化完成后,開始檢查刷新請求標(biāo)志位是否為有效,如果刷新請求標(biāo)志位有效,則等待刷寫指令。如果刷新請求標(biāo)志位無效,則檢查應(yīng)用軟件的狀態(tài),如果應(yīng)用軟件是有效的,則應(yīng)用軟件代碼將被執(zhí)行,如果應(yīng)用軟件是無效的,則繼續(xù)執(zhí)行Bootloader代碼。當(dāng)ECU運(yùn)行在應(yīng)用軟件,當(dāng)收到進(jìn)入編程會話指令,ECU將外部刷新請求標(biāo)志位設(shè)置為有效,并執(zhí)行ECU重啟,如下圖所示。重啟后則按照之前上述的流程檢查。
▲圖 Bootloader啟動時序[來源網(wǎng)絡(luò),侵刪]
02. 刷寫流程
刷新時序分為三個編程步驟:
- 預(yù)刷新步驟:刷新前的CAN網(wǎng)絡(luò)準(zhǔn)備;
- 主刷新步驟:下載應(yīng)用軟件或應(yīng)用數(shù)據(jù);
- 后刷新步驟:重同步CAN網(wǎng)絡(luò)。
1#. 預(yù)刷新步驟
預(yù)刷新步驟如下所示。
1、喚醒ECU,喚醒的方法和策略由汽車制造商制定;
2、為了關(guān)閉DTC存儲和運(yùn)行0x28服務(wù)關(guān)閉相關(guān)的通信,需運(yùn)行0x10服務(wù)跳轉(zhuǎn)至擴(kuò)展會話;
3、進(jìn)入擴(kuò)展會話后,汽車制造商可以進(jìn)一步進(jìn)行特定數(shù)據(jù)鏈路的初始化;
4、運(yùn)行0x31服務(wù)對刷寫條件進(jìn)行檢查,例如低壓電是否在正常范圍內(nèi)等。除了條件檢查之外,還會有一些安全機(jī)制,保證刷寫安全,避免以下幾種情況:
a. 來自非法源的下載動作;
b. 當(dāng)前刷新條件不滿足;
c.下載錯誤的應(yīng)用軟件或應(yīng)用數(shù)據(jù)到ECU;
d.軟件之間不兼容;措施主要包括以下幾種:
安全訪問:ECU通過診斷0x27服務(wù),SEED&KEY機(jī)制進(jìn)行安全訪問服務(wù)限制,保證ECU免遭未授權(quán)的編程動作影響。
刷新預(yù)條件:ECU確保刷新時處于安全狀態(tài),條件不滿足(如高壓上電、低壓異?;蜍囁俨粸榱悖r,刷新服務(wù)請求將被拒絕。
完整性校驗(yàn):ECU對即將下載到flash的程序或數(shù)據(jù)進(jìn)行完整性檢查,當(dāng)一個邏輯模塊下載后,使用CRC32算法驗(yàn)證當(dāng)前邏輯塊的所有數(shù)據(jù)字節(jié)是否被正確傳輸和寫入。
通過“檢查編程完整性”例程控制激活ECU完整性校驗(yàn)。當(dāng)ECU接收到此服務(wù)請求時,Bootloader將計算下載數(shù)據(jù)字節(jié)的CRC32值,并將計算結(jié)果與診斷儀請求報文中發(fā)送的校驗(yàn)值進(jìn)行比較。
一致性檢查:不兼容的軟件不能配合使用,如果配合使用可能會使功能異常或產(chǎn)生致命性錯誤。為此,ECU通過驗(yàn)證軟件兼容性來檢查刷新程序的一致性,包括應(yīng)用軟件與Bootloader軟件、應(yīng)用數(shù)據(jù)
與應(yīng)用軟件檢驗(yàn)等。
5、為了防止刷寫過程中出現(xiàn)異常誤觸發(fā)DTC存儲,運(yùn)行0x85服務(wù)關(guān)閉DTC的存儲;
6、該步驟提供給汽車制造商一個接口,可以通過0x31服務(wù)啟動或關(guān)閉ECU的故障安全響應(yīng)(failsafe reaction);
7、為了提高刷寫速度,降低刷寫程序時總線負(fù)載率,通過運(yùn)行0x28服務(wù)關(guān)閉無關(guān)報文,比如應(yīng)用報文和網(wǎng)絡(luò)管理報文;
8、在關(guān)閉部分通信之后,通過0x22服務(wù)讀取被刷ECU的狀態(tài)(應(yīng)用軟件和數(shù)據(jù))、軟件指紋信息等;
9、為了減少刷寫的時間,可以通過0x87服務(wù)提高CAN總線的波特率。
2#. 主刷新步驟
在預(yù)刷新步驟之后,是主刷新步驟。主刷新時序是單個ECU刷新事件的應(yīng)用,因此所有服務(wù)的請求都使用物理尋址。
其中:
1、運(yùn)行0x10服務(wù)進(jìn)入programmingSession;
2、運(yùn)行0x27服務(wù)進(jìn)入特定的安全等級;
3、運(yùn)行0x2E服務(wù)將指紋信息寫入ECU;
4、運(yùn)行0x34、0x36、0x37服務(wù)將永久存儲區(qū)寫入默認(rèn)值;
5、運(yùn)行0x31服務(wù)檢查步驟4是否成功,另外一種方法是通過0x37的響應(yīng)確定是否成功;
6、運(yùn)行0x31服務(wù)對特定的Flash進(jìn)行擦除;
7、分別運(yùn)行0x34、0x36、0x37服務(wù)將Flash driver下載至內(nèi)存中;
8、運(yùn)行0x31服務(wù)檢查Flash driver下載是否成功;
9、分別運(yùn)行0x34、0x36、0x37服務(wù)將軟件和數(shù)據(jù)下載至ECU的flash中;
10、運(yùn)行0x31服務(wù)檢查步驟9是否下載成功;
11、運(yùn)行0x31服務(wù)驗(yàn)證程序是否能正常運(yùn)行,例如checksum、標(biāo)志位等;
12、在下載完軟件和數(shù)據(jù)后,汽車制造產(chǎn)商需要一些特定的操作,比如寫入VIN碼等。
3#. 后刷新步驟
該步驟主要通過0x11服務(wù)對ECU進(jìn)行復(fù)位或者通過0x10服務(wù)切換至默認(rèn)會話,如圖3所示,如果在預(yù)編程中中調(diào)整了波特率,須通過特定的操作將波特率調(diào)整至正常值。通常操作是運(yùn)行0x11服務(wù)使ECU復(fù)位,回到正常狀態(tài)。
03. 刷寫測試用例
刷寫功能開發(fā)完之后,通常都是要按照測試用例進(jìn)行測試的,那一般都要做哪些測試呢,才能證明刷寫功能是OK的呢?主要分為4部分測試。首先是模擬診斷儀正常刷寫,測試用例主要包括下圖所示,圖中測試用例還考慮了標(biāo)定數(shù)據(jù)的刷寫。
▲圖 正常刷寫用例
然后是錯誤注入測試,其前提是錯誤刷寫不損壞系統(tǒng)Boot,當(dāng)重新上電后,DUT可以正常更新應(yīng)用程序。用例如下所示。
▲圖 故障注入測試用例
再之后是刷寫完整性測試,測試用例如下所示。
▲圖 完整性測試用例
最后就是刷寫流程以及預(yù)條件測試,主要測試3E服務(wù),前置條件,刷寫失敗等,測試用例如下圖所示。
04. Boot自更新
Boot自更新的需求現(xiàn)在也是越來越多,主要為了修復(fù)Boot軟件中存在的Bug。以下有幾種Boot自更新的方案。
1#. Supplier Boot(SB) + Customer Boot(CB)
通常情況下,供應(yīng)商都有自己的平臺軟件,包括Boot和Appl。而各主機(jī)廠都有自己不同的軟件升級規(guī)范,為了適配主機(jī)廠的需求,通常的做法是加一層Customer Boot來實(shí)現(xiàn)客戶的需求。那軟件的運(yùn)行順序就是SB->CB->Appl,如圖1所示。這種做法可以簡單、快速的滿足CB也可以更新。
▲圖 SB+CB的升級方式[來源網(wǎng)絡(luò),侵刪]
不過這種方式,通常情況下通過SB更新CB是通過供應(yīng)商自己定義的升級流程,并且通過自己的上位機(jī)來實(shí)現(xiàn)升級。也就意味著這種方式只適應(yīng)項(xiàng)目開發(fā)階段,因?yàn)楣?yīng)商的升級流程無法接入到整車的OTA流程。這種方式的優(yōu)點(diǎn)就是簡單,能很快地適配客戶的需求,而且即使面向不同的客戶,只需要簡單的更改CB就可以滿足需求,適應(yīng)性比較好。但是缺點(diǎn)就是會浪費(fèi)Flash空間。
2#. 將Boot先放到RAM中運(yùn)行,然后更新Boot的Flash區(qū)域
這種方式只需要一份Boot,其具體方案是,在Boot的鏈接文件中,將程序和數(shù)據(jù)映射到特性的RAM空間,然后在控制器上電時,首先將Boot的代碼和數(shù)據(jù)搬運(yùn)到RAM中,程序運(yùn)行在RAM中,當(dāng)收到更新Boot的需求時(這里需要上位機(jī)在發(fā)送更新指令的時候,區(qū)別是更新Boot還是App,比如通過在0x31服務(wù)寫入不同的標(biāo)志位進(jìn)行區(qū)分),通過RAM中的程序以及上位機(jī)下載的Flash Driver,將Boot的Flash區(qū)域進(jìn)行更新。
▲圖 方案二
這種方式的優(yōu)點(diǎn)就是節(jié)省Flash空間,而且如果客戶想把Boot自更新的功能保留到量產(chǎn)之后,也是可以的,因此控制器的升級是完全遵循主機(jī)廠的要求的。不過這種方式有個缺點(diǎn),就是在更新過程中,不能斷電,一旦斷電,控制器就會變成板磚,需要換件。另外程序運(yùn)行在RAM中,對踩內(nèi)存這種行為更加敏感。不過在整車上,出現(xiàn)意外斷電的情況應(yīng)該很少。首先升級之前會檢查低壓蓄電池的電壓水平,甚至對新能源車來說,可以啟動DCDC,來保證12V的穩(wěn)定供應(yīng)。
3#. 兩個CB+minBoot
這種方案下,有兩個CB和一個miniBoot,miniBoot的作用很簡單,就是根據(jù)引導(dǎo)區(qū)的標(biāo)志位來決定切換到哪個Boot。
▲圖 2個CB+miniBoot方案
這種方案的優(yōu)勢就是可以保證刷新過程中斷電不會導(dǎo)致控制器變成板磚,而且也可以在SOP之后繼續(xù)使用。缺點(diǎn)也很明顯,空間占用率比較大,軟件復(fù)雜,需要三個Boot。
轉(zhuǎn)自汽車ECU開發(fā)