大(dà)多(duō)數(shù)Bootloader 包含兩種操作(zuò' δ)模式。
- 啓動加載模式
- 下(xià)載模式
對(duì)于大(dà)多(duō)數(shù)汽車(chē)軟件(jiàn)開(kāi)發者來γ₩(lái)說(shuō),從(cóng)客戶需✔Ω±♥求的(de)角度,他(tā)們更多(duō)關心Bootloader的(d♥™ e)下(xià)載模式。
下(xià)面我們将從(cóng)CAN B±€₽ootloader的(de)一(yī)般需求入手,來(lái)♠>介紹一(yī)下(xià)CAN Bootload$ →er 的(de)整個(gè)實現(xiàn)過程。
通(tōng)過CAN網絡升級一(yī)般需要(yào)考慮下(xiàε≈π→)面幾個(gè)方向。
01 針對(duì)單一(yī)節點
CA↑↓N網絡是(shì)串行(xíng)結構,在對(duì)節點Ω↔•升級的(de)時(shí)候,不(bù)能(néng)被别的(de)節點影(yǐn≥☆g)響,也(yě)不(bù)能(néng)影(yǐng)響到(dào)别"π♠的(de)節點。這(zhè)裡(lǐ)就(jiù)需要(yào)進行(xε♦íng)點對(duì)點升級。在OEM 的(∏₽←∏de)規範中會(huì)對(duì)每一(yī)¶"'個(gè)ECU 都(dōu)有(yǒu)₩✔自(zì)己的(de)診斷ID。一(yī)→♠±般情況下(xià)針對(duì)CAN網絡的(de)ECU有(yǒu)。
兩個(gè)接收ID
- 功能(néng)尋址ID
- 物(wù)理(lǐ)尋址ID
一(yī)個(gè)發送ID
- 診斷發送ID
這(zhè)樣可(kě)以确保點對(duì)點的(d $™≥e)操作(zuò),和(hé)其他(tā)節點互相(xiàng)不(bù)幹擾。÷'™
02 節點的(de)智能(néng)設計(jì)
在CAN網絡中實現(xiàn)數(shù)據→≈¶更新,最進本的(de)就(jiù)是(shì)master ECU 把數(sh✔©≤σù)據有(yǒu)效的(de)傳輸給Slave ECU, 這(zhè)樣♦∏∞Slave ECU 對(duì)自(zì)身(shēn)的(d₩&♣e)flash 進行(xíng)操作(zuò)。在這(zhè)♦☆δα個(gè)過程中需要(yào)對(duì)數(s ≥σhù)據進行(xíng)一(yī)定要(yà♥∞o)求。
-
保證數(shù)據傳遞的(de)有(yǒu)效性-->傳輸過程沒有(yǒu)©Ω¥∏錯(cuò)誤
-
保證數(shù)據本身(shēn)的(de)真實性--> 未被¶α§篡改
-
保證數(shù)據發送方的(de)可(kě)靠性-->被授權的(de)ECU
-
保證數(shù)據本身(shēn)的(de)正确性--> 是(s¥←←←hì)否與Bootloader 兼容
-
等等需求
這(zhè)裡(lǐ)對(duì)傳輸過程的(de)保證,汽車π★♥(chē)OEM 一(yī)般通(tōn <>g)過UDS 讓Master ECU 和(hé) Sla↕$§←ve 進行(xíng)交互。通(tōng)過握手協議(yì),以及一(yī)些(xiē≈¥)routine 來(lái)對(duì)上(shàng)面需求進行(xí♦↕ng)一(yī)一(yī)實現(xiàn)。
針對(duì)UDS 這(zhè)裡(lγ∑ǐ)不(bù)一(yī)一(yī)介紹,可(kě)以翻閱14→™≠™229 自(zì)行(xíng)查詢。

注意這(zhè)裡(lǐ)缺少(shǎo)新版•Ω₽的(de) 0x29 服務。
UDS診斷29認證服務-Authentication Service
03 進入Bootloader 模式
一(yī)般來(lái)說(shuō)這(zhπ♠è)裡(lǐ)有(yǒu)一(yī)下(xià)幾種方式
-
APP 主動跳(tiào)轉至 Bootloader 模式
-
上(shàng)電(diàn)啓動由于Bootloader 檢測APP 失☆γ↑↓效,主動停留在Bootloader
-
APP 軟件(jiàn)異常,自(zì)動複位到(dào)Bootloader •© 模式下(xià)。
這(zhè)裡(lǐ)針對(duì)OEM 的< ↑(de)升級需求,一(yī)般是(shì) 第一(yī)種"™¶↔, APP 主動跳(tiào)轉至Bootloader 模式。因為(w∞≠≈èi)Bootloader 不(bù)一(yī)定都(dōu)是(shì)需要(yào)依賴 ÷©UDS的(de),這(zhè)裡(lǐ)統一(yī)叫Bootloader 模式,O£€<EM 的(de) UDS 的(de)規範→↓ ®裡(lǐ)面的(de)名稱叫做(zuò)programming s>®♦¶ession。
一(yī)般來(lái)說(shuō)OEM 會(huì)在APP 裡(lǐ)面先進行(xín×π g)session 跳(tiào)轉,身(shēn)©→份驗證。
最後通(tōng)過 10 02 命令讓APP 跳(tiào)轉到(dào)B♦φ'ootloader 模式下(xià)。
在我們進行(xíng)bootloader設計(jì)的(de)時(shí)候Ω,可(kě)以通(tōng)過任何特定方式,注意這(zhè)裡(lǐ)的(de)特定方式不(≈≈bù)能(néng)是(shì)随随便便就(jiù)可(kě)以™✔×觸發 的(de),防止誤觸進入bootloader 模式。
因為(wèi)跳(tiào)轉的(de)邏輯是(shì) APP 檢測到(dào)一(yī)定∞€☆的(de)條件(jiàn),然後 對(duì)某些(xiē)寄存器(qì),或$¶♠者某些(xiē)Bootloader 可(kě)讀(dú)的(♥§de)內(nèi)存空(kōng)間(jiān)進行(xíng£↓™Ω)寫flag. 随後進行(xíng)reset. 這(zhè×♣)樣在reset完成之後, bootloader 會(huλ♠ •ì)檢測到(dào),這(zhè)次不(bù)需要(yào)跳(tiào)轉至APP ♦±≤§了(le)。
04 對(duì)bootloader的(de)要(y>¥≈ào)求
從(cóng)實際的(de)研發需求出發,這(zhè)裡(l§γǐ)列出了(le)一(yī)些(xiē)常用(yòβεng)的(de)需求。實際OEM 的(de)bootloader 可(kě)能≠(néng)會(huì)細化(huà)需求,但(dàn)是(shì)最終都(dō≠₹$u)是(shì)為(wèi)了(le)下(xià)面的(de)目的(de)提出來(& lái)的(de)需求。
-
多(duō)次數(shù)據更新
-
刷寫速度,傳輸速度
-
差分(fēn)更新
-
身(shēn)份驗證
-
數(shù)據格式的(de)标準化(huà)
-
對(duì)數(shù)據的(de)完整性,有(yǒu)效性等進行(xσ&≤íng)校(xiào)驗
-
對(duì)APP 的(de)有(yǒu)效性進行(xíng)校↔↑ >(xiào)驗
-
上(shàng)位機(jī)方便友(yǒu€ ↓)好(hǎo)
& $nbsp;
在OEM 的(de)需求裡(lǐ),在刷寫過程一(yī)般分(fēn)₽ €φ為(wèi)三個(gè)步驟。
-
前處理(lǐ)
-
刷寫
-
後處理(lǐ)
分(fēn)别是(shì)做(zuò)什(shén)麽的(de)呢(ne)?
前處理(lǐ)

需求各不(bù)相(xiàng)同,但(dàn®♣ φ)是(shì)目的(de)基本都(dōu)一(yī)緻。
-
避免其他(tā)節點對(duì)升級過程的(de)影(yǐng)響
-
避免自(zì)身(shēn)節點對(duì)升級過程的(de)影(yǐng∏✔®)響
-
避免自(zì)身(shēn)節點對(duì)其他(tā)節點✔'的(de)影(yǐng)響
刷寫
™↕Ω↓
通(tōng)過一(yī)系列的(de)UDS 命令進行(xíng)±€ 點對(duì)點 交互。其目的(de)和(hé)前面提到(dàφ∏→o)的(de)一(yī)緻。
-
發送數(shù)據的(de)ECU 可(kě)靠
-
數(shù)據傳輸過程可(kě)靠
-
數(shù)據有(yǒu)效性(識别有(yǒuασ♠)沒有(yǒu)被篡改)
-
數(shù)據加密解密數(shù)據安全
-
等等
後處理(lǐ)

解除自(zì)身(shēn)的(de)特殊狀态。更新配置參數(shù)等等。
這(zhè)裡(lǐ)面 ECU 需要(yào)做(zuò)好(hǎo) ♣÷和(hé)APP 的(de)相(xiàng)互校(xiào)驗。需要≥±©(yào)達到(dào)
-
APP 是(shì)否有(yǒu)效,Bootloader ™ 需要(yào)能(néng)判斷出
-
APP 運行(xíng)時(shí)無效,÷₩"需要(yào)能(néng)有(yǒu)效進入Bootloader模式。₹↑±δ
-
APP 無效, Bootloader 不(bù)應該跳(tiào)入
-
等等
總結一(yī)句話(huà)
最基本的(de)Bootloader通(tōng)過傳輸協議(yì)把數(shù)據✘✘可(kě)靠的(de)寫入指定的(de)內(nèi)£® 存空(kōng)間(jiān)
通(tōng)過上(shàng)面的(de)分(fēn)析,總結一(yī)下(xià∞<)我們需要(yào)實現(xiàn)哪些(xα®↑iē)功能(néng)。
01 控制(zhì)器(qì)最小(xiǎo)系統
單純運行(xíng)Boot ∑σ>loader的(de)軟件(jiàn),這(zhè)裡(lǐ)是(shì)不(←∞™←bù)需要(yào)os的(de)。隻需要(yào)一(yī)個(¥♥gè)while(1) + 中斷系統順序執行(xíng)即可(kě)。
本文(wén)以Aurix Tricor ♣$e芯片示例代碼介紹。
啓動代碼
main 函數(shù)
這 δ×(zhè)裡(lǐ)面實現(xiàn)很(hěn)簡單,隻需要(yào)判斷是(s♥&Ωhì)否進入app. 如(rú)果不(bù)進入app. 就(jiù)∑γ隻需要(yào)監聽(tīng)通(tōng)訊₽₽↑÷接口的(de)數(shù)據,進行(xíng)相(xiàng✔←)對(duì)應的(de)操作(zuò)即可(kě)。
02 通(tōng)訊驅動
這(zhè)裡(lǐ)面采用(yòng)的(de)是(shì)比較簡單的(d ←e)CAN 通(tōng)訊。
一(yī)般來(lái)說(shuō)因為(wèi)上(shàn₹¶g)位機(jī)在傳輸數(shù)據的(de)時(shí)候,速度是(shì)很(h₹♣★§ěn)快(kuài)的(de)。我們bootloader裡 ¶→&(lǐ)面的(de)CAN 接收需要(yào)采用(yòng)中斷的(de)模式進行(xíng)β∏€收發。
對(duì)于CAN 的(de)參數(shù)配置。
波特率
可(kě)以根據芯片手冊的(de)原理(lǐ)進行( ↔ xíng)配置。

這(zhè)裡(lǐ)面對(duì)于Bootloader來(lái)說(shuō)£> ★,比較重要(yào)的(de)就(jiù)是(shì)波特率和(hé)收發報•♣×♣(bào)文(wén)ID 以及中斷模式。
因為(wèi)這(zhè)些(xiē)是(shì)需要♦ε(yào)和(hé)上(shàng)位機(jī)進行(<✔₹xíng)配合的(de)。
這(zhè)裡(lǐ)給出以下(xià)Mcal 代碼初始化(huà)CAN時(ε≤↑&shí)候的(de)形參。可(kě)以大(dà)概看(kàn)出需要(yào)初始化★∞(huà)的(de)內(nèi)容
對(duì)于bootloader來(lái)說(shuō),這♥α(zhè)裡(lǐ)隻需要(yào)三個δ₽£(gè)接口
初始化(huà),收,發
03 內(nèi)存驅動
首先看(kàn)一(yī)下(xià)內(nèi)存分(fēn)配✘δ'
PFLASH

DFLASH

一(yī)般來(lái)說(shuō) 被刷的(de)軟件(jiàn♥♣±)格式是(shì)Hex 或S19. 針對(duì)這(zhè)兩種格式就(jiù₽↑λ)不(bù)說(shuō)了(le)。
code 和(hé) data 可(kě)以根據主機(jī)廠(chǎng)需求分(≥££™fēn)為(wèi)兩個(gè)或多(duō)個(gè)Hex.
所以這(zhè)裡(lǐ)需要(yào)對(duì)Pflash 和(hé) DF₩γ∑lash 都(dōu)進行(xíng)操作(zuò)。
需要(yào)注意的(de)是(shì)兩個(gè)不(bù)同的(de)fφ&lash 操作(zuò)的(de) 扇區(qū)大(dà)小(xiǎo)是(shì)不©δ∑(bù)一(yī)樣的(de)。Mcal提供的(de)接口已經做(zuò)了(le)相(x↑↔iàng)對(duì)應的(de)處理(lǐ)。
對(duì)于bootloader來(lái)說(shuō),需要(yào)的(de)接口 擦除 →®₩¶和(hé) 寫入。
04 額外(wài)需求庫
這(zhè)裡(lǐ)比如(rú)需要(yào)對(duì)數(shù)據進行(xíng)CRC♠¶γ 校(xiào)驗
需要(yào)對(duì)數(shù)據包進行(xíng)數(shù)據解密用(yòng€™✔)到(dào)的(de)加密算(suàn)法
等等
05 交互邏輯 上(shàng)層應用(yòng)
根據具體(tǐ)的(de)OEM 需求實現(xiàn)的(de)功能(néng)。比如(rú♥)說(shuō)。配置參數(shù)的(de)交換,與APP軟件(jiàn)的(d¥♦>★e)有(yǒu)效位相(xiàng)互校(xiào)驗,₩✘♥等等需求。這(zhè)裡(lǐ)無法給出對(duì)應代碼。
總結 一(yī)張圖
↕απ
轉自(zì)汽車(chē)電(diàn)子(zǐ)與軟件(ji≠σàn)