詳解汽車Bootloader設(shè)計(jì)

來源 |  汽車ECU開發(fā)

BootLoader(下文簡稱Boot)也稱為引導(dǎo)程序,其主要用于軟件更新。這就帶來一個(gè)問題,ECU的軟件更新方式有很多,比如通過JTAG調(diào)試更新軟件,為什么要Boot呢?
由于ECU軟件中難免會(huì)有BUG存在,以及要滿足整車OTA需求,必須可以在不開蓋的情況下更新軟件。而ECU控制器對(duì)外的接口通常只有總線、電源和控制IO等。出于最大化復(fù)用接口(減少線束的重量和成本)考慮,通常采用基于UDS的Boot,而最常用的總線為CAN。為什么不用JTAG口呢?主要是ECU裝車后,直接通過燒錄器或者仿真器更新軟件的很不方便,難以實(shí)現(xiàn)遠(yuǎn)程更新,另外由于JTAG口的權(quán)限很高,可以任意修改內(nèi)部程序,安全風(fēng)險(xiǎn)很大。

詳解汽車Bootloader設(shè)計(jì)的圖1


BootLoader的設(shè)計(jì)需求

Boot除了正常滿足更新軟件需求外,還需滿足以下需求。
1、安全需求
Boot和APP應(yīng)該放在不同的內(nèi)存區(qū)域,防止相互干擾。Boot中不應(yīng)集成Flash Driver,避免程序在正常運(yùn)行時(shí)非法修改FLash,導(dǎo)致軟件異常,通常在刷寫App或者標(biāo)定數(shù)據(jù)時(shí),先將Flash Driver下載至芯片的RAM中。
另外,在Boot執(zhí)行App或者標(biāo)定數(shù)據(jù)更新時(shí),應(yīng)該具有多重安全檢查機(jī)制,確保刷入正確的軟件。
首先在執(zhí)行刷寫流程之前,上位機(jī)對(duì)需要更新的軟件包進(jìn)行檢查,通常包括兩項(xiàng),其一是在生成軟件包時(shí),開發(fā)人員會(huì)在特定位置增加一個(gè)與上位機(jī)約定的特定的ID,當(dāng)上位機(jī)加載軟件包時(shí),會(huì)去檢查軟件包中存儲(chǔ)的ID是否與上位機(jī)中相同,如果不同,則終止刷寫,這樣可以防止刷入其他ECU的軟件包。
其二是在生成軟件包時(shí),會(huì)對(duì)特定地址區(qū)域進(jìn)CRC計(jì)算,通常采用CRC32,并將該CRC值存儲(chǔ)在特定的地址,通常是程序的末尾,在上位機(jī)加載軟件包時(shí),按照相同的CRC算法進(jìn)行計(jì)算,并與軟件包中存入的進(jìn)行比較,如果相同則進(jìn)行下面的流程。這也是俗稱的完整性檢查。
在以上確認(rèn)軟件包本身沒有問題后,開始準(zhǔn)備將軟件刷入到車內(nèi)的ECU中,在此之前需要對(duì)當(dāng)前車輛的刷寫條件進(jìn)行檢查,其中主要包括當(dāng)前是否有車速,檔位是否在P檔,蓄電池電壓是否過低,對(duì)于新能源車而言,還需檢查高壓繼電器是否閉合等。如果有一個(gè)條件不滿足,處于安全考慮,都會(huì)終止軟件更新。
此后,在執(zhí)行數(shù)據(jù)下載前,還需通過主機(jī)廠指定的0x27服務(wù)的安全算法,對(duì)數(shù)據(jù)下載命令進(jìn)行解鎖。
2、BootLoader自更新需求
對(duì)于刷寫流程和刷寫規(guī)范,主機(jī)廠通常有自己的一套,而在開發(fā)階段,為了防止因早期boot中存在BUG而需要更新Boot,供應(yīng)商通常會(huì)做Boot更新功能。
通常的做法是做兩級(jí)Boot,分別為供應(yīng)商自己的Boot和主機(jī)廠的Boot,具體如圖1所示,其中SB為供應(yīng)商自己的Boot,而CB為主機(jī)廠的Boot。除此之外還有其他很多方法,感興趣的可以戳回送門—>如何實(shí)現(xiàn)BootLoader自更新呢?
詳解汽車Bootloader設(shè)計(jì)的圖2
圖1 兩級(jí)boot
3、更新速率需求
在當(dāng)前主機(jī)廠都在追求整車OTA能力的情形下,主機(jī)廠開始在意軟件的更新時(shí)間,盡量減少對(duì)用于的影響,也就是所謂的無感更新,提高用于體驗(yàn),畢竟誰也不想出現(xiàn)幾年前蔚來在長安街上等半天更新軟件情形。
對(duì)此需要熟讀芯片手冊的Flash部分以及數(shù)據(jù)下載協(xié)議,多為UDS,目前通常采用的方法就是Flash執(zhí)行多頁寫入,采取最大化的連續(xù)幀數(shù)量,也就是減少流控制的數(shù)量,亦或是提高總線速率等。

詳解汽車Bootloader設(shè)計(jì)的圖3


BootLoader程序流設(shè)計(jì)

ECU上電后,程序從鏈接文件中定義的RESET入口進(jìn)入BootBoot在做完基本的初始化之后,會(huì)檢查軟件刷新標(biāo)志位和App有效標(biāo)志位,如果有效,則停留在Boot中等待執(zhí)行軟件刷寫任務(wù),如果無效,則跳轉(zhuǎn)至App的入口地址,啟動(dòng)App。Boot的具體流程圖如圖2所示。
詳解汽車Bootloader設(shè)計(jì)的圖4
圖2 Bootloader軟件流程圖
軟件刷新標(biāo)志位被置位通常有兩種方式,其一為當(dāng)App正常運(yùn)行的時(shí)候,如果此時(shí)收到10 02切換至編程會(huì)話的命令,在App會(huì)將軟件刷新標(biāo)志位進(jìn)行置位,通常寫入至NVM,寫入成功后,軟件進(jìn)行復(fù)位。這里涉及到NvM模塊中的block在App和Boot中的同步管理。
其二是在Boot啟動(dòng)期間,收到10 02編程會(huì)話命令,Boot將軟件刷新標(biāo)志位進(jìn)行置位,進(jìn)入刷寫流程。
在軟件刷寫流程中,通常分為個(gè)步驟,分別為預(yù)編程步驟、主編程階段、后編程階段。
1、預(yù)編程步驟
從名字可以看出,該步驟主要是下載程序前的一些操作,包括喚醒ECU、讀寫特定的DID、通信管理等,詳細(xì)的操作如圖3所示。
詳解汽車Bootloader設(shè)計(jì)的圖5
圖3 預(yù)編程階段
其中:
1、喚醒ECU,喚醒的方法和策略由主機(jī)廠制定,有些要求在KeyOn下刷寫,有些要求在KeyOff下刷寫。
2、為了運(yùn)行85服務(wù)關(guān)閉DTC存儲(chǔ)和28服務(wù)關(guān)閉相關(guān)的通信,首先需通過10服務(wù)切換至擴(kuò)展會(huì)話,因?yàn)?5和28服務(wù)都需要在擴(kuò)展模式下才能工作。
3、進(jìn)入擴(kuò)展會(huì)話后,主機(jī)廠可以進(jìn)一步進(jìn)行特定數(shù)據(jù)鏈路的初始化,通常來說,國內(nèi)主機(jī)廠不會(huì)有這種需求,不知道歐洲會(huì)不會(huì)有。
4、運(yùn)行31服務(wù)對(duì)刷寫條件進(jìn)行檢查,例如低壓電是否在正常范圍內(nèi),檔位是否為P檔,車速是否為零等;
5、檢查通過后,為了防止刷寫過程中其他ECU節(jié)點(diǎn)誤觸發(fā)DTC,通常為通信故障,則通過功能尋址請(qǐng)求85服務(wù)關(guān)閉局域網(wǎng)內(nèi)所有ECU節(jié)點(diǎn)的DTC存儲(chǔ);
6、該步驟提供給主機(jī)廠一個(gè)接口,可以通過0x31服務(wù)啟動(dòng)或關(guān)閉ECU的故障安全響應(yīng)(failsafe reaction),目前主機(jī)廠用得很少。
7、為了提高刷寫速度,降低刷寫程序時(shí)總線負(fù)載率,通過28服務(wù)關(guān)閉無關(guān)報(bào)文,比如應(yīng)用報(bào)文和網(wǎng)絡(luò)管理報(bào)文;
8、在關(guān)閉部分通信之后,通過22服務(wù)讀取被刷ECU的狀態(tài)(應(yīng)用軟件和數(shù)據(jù))、軟件指紋信息等;
9、為了減少刷寫的時(shí)間,可以通過87服務(wù)提高CAN總線的波特率。
2、主編程階段
該步驟用于將軟件或者數(shù)據(jù)下載到被刷ECU中,主要包括進(jìn)入特定的安全等級(jí)、寫入指紋信息、下載軟件和數(shù)據(jù)等,如圖4所示。
詳解汽車Bootloader設(shè)計(jì)的圖6
圖4 主編程階段
其中:
1、10 02切換至編程會(huì)話模式,將軟件刷新標(biāo)志位置位,;
2、運(yùn)行27服務(wù)進(jìn)入特定的安全等級(jí),下載前,通過安全訪問過程是強(qiáng)制的,確保只有合法的診斷儀能對(duì)ECU進(jìn)行下載操作。
3、運(yùn)行2E服務(wù)將指紋信息寫入ECU;
4、運(yùn)行34、36、37服務(wù)將永久存儲(chǔ)區(qū)寫入默認(rèn)值;
5、運(yùn)行31服務(wù)檢查步驟4是否成功,另外一種方法是通過37的響應(yīng)確定是否成功;
6、運(yùn)行31服務(wù)對(duì)特定的Flash進(jìn)行擦除;
7、分別運(yùn)行34、36、37服務(wù)將Flash driver下載至內(nèi)存中;
8、運(yùn)行31服務(wù)檢查Flash driver下載是否成功;
9、分別運(yùn)行34、36、37服務(wù)將軟件包或者標(biāo)定數(shù)據(jù)下載至Buffer中,Boot通過周期調(diào)用Flash Driver將數(shù)據(jù)寫入Flash中;
10、運(yùn)行31服務(wù)檢查步驟9是否下載成功;
11、運(yùn)行31服務(wù)驗(yàn)證程序是否能正常運(yùn)行,例如checksum、標(biāo)志位等;
12、在下載完軟件和數(shù)據(jù)后,汽車制造產(chǎn)商需要一些特定的操作,比如寫入VIN碼等。
3、后編程階段
該步驟主要通過11服務(wù)對(duì)ECU進(jìn)行復(fù)位或者通過10服務(wù)將會(huì)話切換至默認(rèn)會(huì)話,如圖5所示,如果在預(yù)編程階段中調(diào)整了波特率,須通過特定的操作將波特率調(diào)整至正常值。通常操作是運(yùn)行11服務(wù)使ECU復(fù)位,重啟ECU。
詳解汽車Bootloader設(shè)計(jì)的圖7
圖5 后編程階段
登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

1
1
1