前言
為了提供系統(tǒng)的安全性能,TC3xx上一些重要的寄存器都受Endinit保護(hù),不能直接修改。如果想要修改這些重要寄存器,就需要先按特定步驟解鎖Endinit,然后才能修改這些重要的寄存器的值,最后還要上鎖Endinit。那什么是Endinit功能了? -- 本文就來(lái)詳細(xì)解鎖TC3xx芯片的Endinit機(jī)制。
Note: 第1到5章節(jié)都是關(guān)于Endinit的概念介紹,如果感覺(jué)比較枯燥可以先從第6章節(jié)的實(shí)際應(yīng)用開(kāi)始閱讀。
縮略詞
| 簡(jiǎn)寫(xiě) | 全稱(chēng) |
| Endinit | End of initialization |
| WDTCPUyCON0 | CPUy WDT Control Register 0 |
| WDTSSR | Safety WDT Status Register |
注:本文章引用了一些第三方工具和文檔,若有侵權(quán),請(qǐng)聯(lián)系作者刪除!
正文
1.功能概述
在系統(tǒng)或應(yīng)用程序的初始化過(guò)程中,通常只對(duì)一些寄存器進(jìn)行一次編程(programmed only once)。 在正常應(yīng)用程序運(yùn)行期間修改此類(lèi)寄存器可能會(huì)嚴(yán)重影響模塊或整個(gè)系統(tǒng)的整體運(yùn)行。
雖然 Supervisor Mode 和 Access Protection 方案提供了一定級(jí)別的保護(hù),防止意外修改,但它們可能不足以防止對(duì)系統(tǒng)關(guān)鍵注冊(cè)器的所有意外訪問(wèn)。
為這類(lèi)寄存器提供了額外的保護(hù),稱(chēng)為 Endinit (“Endoff initialization”)。 Endinit 是一種寫(xiě)保護(hù)方案,它只允許在特定時(shí)間進(jìn)行寫(xiě)入,并使受此功能保護(hù)的寄存器的意外修改幾乎不可能實(shí)現(xiàn)。
Endinit 功能由每個(gè) WDT 控制寄存器中包含的 ENDINIT 位組成。 通過(guò) Endinit 保護(hù)的寄存器決定是否啟用寫(xiě)入。 只有當(dāng)相應(yīng)的 ENDINIT =0 且主管模式處于活動(dòng)狀態(tài)時(shí),才會(huì)啟用寫(xiě)入。 如果這種情況不正確,則寫(xiě)入嘗試將被放棄,在這種情況下,寄存器內(nèi)容將不會(huì)被修改。
為了獲得最高的穩(wěn)定性,寫(xiě)入 ENDINIT 位將受到 WDT 中實(shí)施的高度安全的訪問(wèn)保護(hù)方案的保護(hù)。 這是一個(gè)復(fù)雜的過(guò)程,幾乎不可能無(wú)意中修改 ENDINIT bits。 此外,每次軟件通過(guò)清除相應(yīng)的 ENDINIT 位來(lái)打開(kāi)對(duì)關(guān)鍵寄存器的訪問(wèn)時(shí),每個(gè) WDT 都會(huì)啟動(dòng)超時(shí)序列來(lái)監(jiān)視 ENDINIT 位的修改。 如果超時(shí)時(shí)間在相應(yīng)的 ENDINIT 位再次設(shè)置之前結(jié)束,則假定軟件出現(xiàn)故障,并生成看門(mén)狗故障響應(yīng)。
以下各節(jié)介紹了 WDT 的訪問(wèn)保護(hù)方案和 Endinit 超時(shí)操作。 在每個(gè)模塊 (包括 SCU 本身) 的寄存器概覽表中,通過(guò)每個(gè) Endinit 類(lèi)型保護(hù)的寄存器在描述寫(xiě)入訪問(wèn)的列中標(biāo)識(shí),如下所示:
“ CEy” - CPU 關(guān)鍵寄存器。 僅當(dāng) CPUy WDT ENDINIT=0 (y=CPU number) 時(shí)可寫(xiě)。也就是,只有把要要訪問(wèn)這個(gè)寄存器的CPU的ENDINIT設(shè)為0后,這個(gè)寄存器才能被這個(gè)CPU寫(xiě)訪問(wèn)(也就是解鎖WDTCPUyCON0.ENDINIT)。
“ E ” - 系統(tǒng)關(guān)鍵寄存器 - 任何 (一個(gè)或多個(gè)) CPUy 看門(mén)狗計(jì)時(shí)器 ENDINIT=0 或 EICON0.ENDINIT=0 時(shí)可寫(xiě)。也就是,任意一個(gè)CPU的ENDINIT設(shè)為0后,所有CPU都可以對(duì)這個(gè)寄存器進(jìn)行寫(xiě)訪問(wèn)。
“ SE ” - 安全關(guān)鍵寄存器 - 僅當(dāng)安全監(jiān)控計(jì)時(shí)器 ENDINIT=0 或 SEICON0.ENDINIT=0 時(shí)才可寫(xiě)入。也就是,Safety Watchdog的ENDINIT設(shè)為0后,Safety EndInit的保護(hù)就解除了,所有CPU都可以對(duì)這個(gè)寄存器進(jìn)行寫(xiě)訪問(wèn)(也就是解鎖WDTSCON0.ENDINIT)。
以上都不是 - 隨時(shí)都可以訪問(wèn)
圖 1顯示了解鎖各種 ENDINIT 寫(xiě)保護(hù)模式的選項(xiàng)。

Figure 1: ENDINIT Control Registers
Note: ENDINIT 位的清除需要一些時(shí)間。 在清除 ENDINIT 位后訪問(wèn)受 Endinit 保護(hù)的寄存器必須僅在 ENDINIT 位真正被清除時(shí)進(jìn)行。 作為一種解決方案, ENDINIT 位應(yīng)在 ENDINIT位 清除后第一次訪問(wèn)受 Endinit 保護(hù)的寄存器之前被讀回一次。
2.WDTxCON0 的密碼訪問(wèn)(Password Access toWDTxCON0)
為了解鎖WDTxCON0(x=CPUy and y=CPU number, or S)寄存器并修改WDTxCON0寄存器,必須往WDTxCON0寄存器中寫(xiě)入正確的密碼(password)。軟件必須事先知道正確的密碼,或者在運(yùn)行時(shí)計(jì)算密碼。 每個(gè)監(jiān)視程序計(jì)時(shí)器(Watch)的密碼 (x=CPUy 和 y=CPU 編號(hào),或 S) 可以不同,以便提供獨(dú)立的監(jiān)視程序功能程序流,以具有獨(dú)立的監(jiān)視程序功能。
安全監(jiān)視器密碼寄存器(Safety Watchdog password register)WDTSCON0 受通用 SCU 保護(hù),該保護(hù)方案只允許配置的masters具有寫(xiě)入訪問(wèn)權(quán)限。
特定于 CPU 的監(jiān)視程序密碼寄存器(CPU-specific Watchdog password) WDTCPUyCON0 單獨(dú)受到保護(hù),因此它們只能由相應(yīng)的 CPUy 寫(xiě)入。
在安全應(yīng)用程序中可以使用看門(mén)狗來(lái)提供恢復(fù)時(shí)間,在此期間軟件可能會(huì)嘗試從安全警報(bào)警告中恢復(fù)。 為確保 CPU 故障不允許忽略故障,提供了一個(gè)選項(xiàng),用于在安全管理單元 (SMU) 處于故障狀態(tài)時(shí)防止看門(mén)狗解鎖。 此選項(xiàng)可由位 WDTxCON1.UR 啟用。
如果密碼有效且 SMU 狀態(tài)滿足 WDTxSR.US 位的要求,則一旦密碼訪問(wèn)完成, WDTxCON0 將被解鎖。 解鎖條件將由 WDTxCON0.LCK = 0 指示。 為了確保正確的服務(wù)順序(servicing sequence),只有在訪問(wèn)之前設(shè)置了 WDTxCON0.LCK 位時(shí)才允許密碼訪問(wèn)。
如果在密碼訪問(wèn)期間向 WDTxCON0 寫(xiě)入了不正確的密碼值,則存在看門(mén)狗訪問(wèn)錯(cuò)誤情況。 位 WDTxSR.AE 已設(shè)置,并向安全管理單元 (SMU) 發(fā)送警報(bào)請(qǐng)求。 14 位用戶可定義密碼 WDTxCON0.PW 提供了其他選項(xiàng),用于根據(jù)應(yīng)用程序的需要調(diào)整密碼要求。 例如,它可用于檢測(cè)意外的軟件循環(huán),或監(jiān)視例程的執(zhí)行順序。
下表 匯總了密碼的要求。 有多種選擇,下文將更詳細(xì)地介紹這些選擇
Table 1:Password Access Bit Pattern Requirements

2.1 Static Password
在靜態(tài)密碼模式 (WDTxSR.PAL=0) 中,密碼只能通過(guò)有效的“修改訪問(wèn)”進(jìn)行更改。 密碼訪問(wèn)(Password Access)的設(shè)計(jì)使其不可能簡(jiǎn)單的讀取寄存器并重寫(xiě)寄存器。 在重新寫(xiě)入之前,某些密碼讀取位必須反向 (切換)。 這可以防止簡(jiǎn)單的故障通過(guò)簡(jiǎn)單的讀 / 寫(xiě)序列意外解鎖 WDT。
2.2 Automatic Password Sequencing
如果啟用了自動(dòng)密碼排序 (WDTxSR.PA=1) ,則每次檢查密碼后,密碼會(huì)自動(dòng)更改 (即Password Access or Check Access)。 預(yù)期的下一個(gè)密碼遵循基于具有特征多項(xiàng)式 x14+X13+x12+x2+1 的 14 位斐波那契(Fibonacci) LFSR (Linear Feedback Shift Register) 的pseudorandom sequence。 修改訪問(wèn)權(quán)限還可以提供初始密碼 (或后續(xù)手動(dòng)密碼更新)。

Figure 2: Password Sequencing LFSR
2.3 Time-Independent Pasword
如果未啟用時(shí)間檢查 (WDTxSR.TCS=0) ,則 WDTxCON0 寄存器的 REL 字段必須在密碼訪問(wèn)期間使用現(xiàn)有的重新加載值重新寫(xiě)入。
2.4 Time Check Password
如果啟用時(shí)間檢查 (WDTxSR.TCS=1) , WDTxCON0 寄存器的 REL 字段必須使用當(dāng)前 WDT 計(jì)數(shù)值的反向 (位翻轉(zhuǎn)) 估計(jì)值寫(xiě)入。 此估計(jì)的可接受誤差幅度 (在 WDT 時(shí)鐘周期內(nèi)) 由 WDTxSR.TCT 的值指定。 如果寫(xiě)入的估計(jì)值超出 WDTxSR.TIM +/- WDTxSR.TCT 范圍,則 SMU 回發(fā)出Alarm報(bào)警。 此機(jī)制可以檢查自上次 WDT 重新啟動(dòng)以來(lái)已過(guò)的程序執(zhí)行時(shí)間。 請(qǐng)注意,當(dāng) WDT 以超時(shí)模式運(yùn)行 (訪問(wèn)受 ENDINIT 保護(hù)的寄存器后) 時(shí),密碼或檢查訪問(wèn)仍需要時(shí)間檢查比較。
3. WDTxCON0的檢查訪問(wèn)(Check Access to WDTxCON0)
Check Access 與 Password Access 相同,只不過(guò)鎖位(lockbit)未被清除,因此不允許后續(xù)的“修改訪問(wèn)”。 如果滿足寫(xiě)入數(shù)據(jù)要求,“檢查訪問(wèn)”不會(huì)觸發(fā) SMU 警報(bào)請(qǐng)求。 只有在設(shè)置了 LCK 位時(shí)才能執(zhí)行檢查訪問(wèn)。
此類(lèi)訪問(wèn)用于 WDT 服務(wù)之間的中間檢查點(diǎn)。 這可以用于任務(wù)序列或執(zhí)行時(shí)間監(jiān)控 (例如,與時(shí)間戳計(jì)數(shù)檢查功能或序列密碼結(jié)合使用)。
Table 2: Check Access Bit Pattern Requirements

如果在檢查訪問(wèn)期間向 WDTxCON0 寫(xiě)入了不正確的值 (x=CPUy and y=CPU number, or S) ,則存在看門(mén)狗訪問(wèn)錯(cuò)誤情況。 位 WDTxSR.AE 已設(shè)置,并向安全管理單元 (SMU) 發(fā)送警報(bào)請(qǐng)求。
4. WDTxCON0的修改訪問(wèn)(Modify Access to WDTxCON0)
如果密碼訪問(wèn)(Password Access)成功解鎖 WDTxCON0 (x=CPUy and y=CPU number, or S) ,則以接下來(lái)的WDTxCON0 的寫(xiě)入訪問(wèn)可以對(duì)其進(jìn)行修改。 但是,這種訪問(wèn)也必須滿足某些要求才能被接受并被視為有效。 表 3列出了所需的位模式(bit patterns)。 如果訪問(wèn)不遵循這些規(guī)則,則會(huì)檢測(cè)到監(jiān)視程序訪問(wèn)錯(cuò)誤情況,設(shè)置位 WDTxSR.AE ,并向安全管理單元 (SMU) 發(fā)送警報(bào)請(qǐng)求。 修改訪問(wèn)完成后,將再次設(shè)置 WDTxCON0.LCK ,自動(dòng)重新鎖定 WDTxCON0。 在重新修改寄存器之前,必須再次執(zhí)行有效的密碼訪問(wèn)。
Table 3: Modify Access Bit Pattern Requirements

5. 訪問(wèn)受Endinit保護(hù)的寄存器
如果在運(yùn)行期間需要對(duì)受 Endinit 保護(hù)的寄存器進(jìn)行寫(xiě)入訪問(wèn),則可以在有限的時(shí)間內(nèi)臨時(shí)重新啟用寫(xiě)入訪問(wèn)。 提供了兩種選擇:
通過(guò) WDT 刷新重新啟用對(duì)受 ENDINIT 保護(hù)的寄存器的訪問(wèn)
無(wú)需 WDT 刷新即可重新啟用對(duì) ENDINIT 保護(hù)的寄存器的訪問(wèn)
為了獲得調(diào)試支持, Cerberus 模塊可以覆蓋所有 WDT 的所有 ENDINIT 控件,以簡(jiǎn)化調(diào)試流程。 如果設(shè)置了 CBS_OSTATE.ENIDIS位 ,則所有 ENDINIT 保護(hù)都將被禁用,而不管 WDT 配置的當(dāng)前狀態(tài)如何。 如果清除了 CBS_OSTATE.ENIDIS ,則完整的ENDINIT控制位于 WDT 內(nèi)。
5.1 通過(guò)WDT訪問(wèn)Endinit保護(hù)的寄存器
要重新啟用訪問(wèn)(修改受Endinit保護(hù)的寄存器),必須先使用有效的密碼訪問(wèn)解鎖 WDTxCON0。 在隨后的有效修改訪問(wèn)中,可以清除 ENDINIT。解鎖WDTxCON0且清除ENDINT后, 就能再次打開(kāi)對(duì)受 Endinit 保護(hù)的寄存器的訪問(wèn)。 注意,當(dāng) WDTxCON0 解鎖時(shí), WDT 會(huì)自動(dòng)切換到超時(shí)模式。 因此,訪問(wèn)窗口有時(shí)間限制。 超時(shí)模式僅在重新設(shè)置 ENDINIT 后終止,需要另一個(gè)有效密碼和有效的 WDTxCON0 修改訪問(wèn)權(quán)限。
5.2 不通過(guò)WDT訪問(wèn)Endinit保護(hù)的寄存器
在某些應(yīng)用中,可能不使用 WDT ,并將被禁用 (WDTxSR.DS =1) ,盡管不建議這樣做。
在其他應(yīng)用程序中,可能會(huì)使用 WDT 時(shí)間戳功能,刷新之間的 WDT 訪問(wèn)將是不可取的。
在這種情況下,仍然可以使用 ENDINIT 全球控制寄存器 (EICONx) 來(lái)臨時(shí)訪問(wèn)受 Endinit 保護(hù)的寄存器。
6. Endinit實(shí)際應(yīng)用
6.1 Endinit需求及場(chǎng)景介紹
需求:在ECU上電后需要在Startup階段關(guān)閉看門(mén)狗,也就是配置WDTxCON1(x標(biāo)識(shí)CPU0-5)的DR位域。但是,WDTxCON1寄存器是受Endinit保護(hù)的。所以,在修改前我們需要解鎖Endinit,修改完WDTxCON1寄存器后再上鎖Endinit。


分析1:因?yàn)镃BS_OSTATE.ENIDIS只有在Debug模式下通過(guò)Cerverus module來(lái)Disable(置位CBS_OSTATE.ENIDIS),所以上電的時(shí)候因?yàn)镃BS_OSTATE.ENIDIS是被Cleared的。
所以,能夠通過(guò)WDT模塊解鎖Endinit功能。參考第5章節(jié)兩種解鎖Endinit的方式。
分析2:WDTSSR寄存器的Reset值是0xFFFC 0010,則WDTSSR.PAS為0,WDTSSR.TCU為0。


所以,使用static password來(lái)解鎖Endinit.參考2.1和2.2章節(jié)的static password和Automatic Psassword 。
分析3:我們通過(guò)配置WDTSCON0寄存器來(lái)解鎖Endinit.

6.2 Endinit解鎖
解鎖流程,參考Table 1.
Example: 解鎖CPU0的Endinit.
#define WDT_WDTSCON0_ADDR 0xF0036024u #define STARTUP_CLR_WDTLCK_WDTHPW27 (0xFFFFFF01u) #define STARTUP_SET_WDTHPW27 (0xF0u) #define STARTUP_SET_ENDINIT (0x01u) #define STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT (0xFFFFFFF0u) #define STARTUP_SET_WDTLCK (0x02u) #define STARTUP_SET_WDTLCK_ENDINIT (0x03u) void UnlockEndinit_Core0(void) { volatile uint32 WDTCON0_Register_Value; volatile uint32 *WDTCON0_Address; WDTCON0_Address = WDT_WDTSCON0_ADDR; /* * Create password and send to WDTSCON0 */ WDTCON0_Register_Value = *WDTCON0_Address; /* Clear WDTSCON0.LCK, WDTSCON0.PW[2:7]*/ WDTCON0_Register_Value &= STARTUP_CLR_WDTLCK_WDTHPW27; /* Set WDTSCON0.PW[2:7] to 0xF */ WDTCON0_Register_Value |= STARTUP_SET_WDTHPW27; /* Written 1 to WDTSCON0.ENDINIT for password access */ WDTCON0_Register_Value |= STARTUP_SET_ENDINIT; *WDTCON0_Address = WDTCON0_Register_Value; /* * Set the bit ENDINIT to 1 or 0 to allow access to registers of WDT_CON1 e.g. */ /* Clear WDTSCON0.PW[2:7], WDTSCON0.LCK, WDTSCON0.ENDINIT */ WDTCON0_Register_Value &= STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT; /* WDTSCON0.PW[2:7]=0, WDTSCON0.LCK=1, WDTSCON0.ENDINIT=0 */ WDTCON0_Register_Value |= STARTUP_SET_WDTLCK; *WDTCON0_Address = WDTCON0_Register_Value; WDTCON0_Register_Value = *WDTCON0_Address; }
6.3 Endinit上鎖
上鎖流程,參考Table 3.
Example: 上鎖CPU0的Endinit.
void LockEndinit_Core0(void)
{
volatile uint32 WDTCON0_Register_Value;
volatile uint32 *WDTCON0_Address;
WDTCON0_Address = WDT_WDTSCON0_ADDR;
/*
* Create password and send to WDTSCON0
*/
WDTCON0_Register_Value = *WDTCON0_Address;
/* ClearWDTSCON0.LCK, WDTSCON0.PW[2:7]*/
WDTCON0_Register_Value &= STARTUP_CLR_WDTLCK_WDTHPW27;
/* set WDTSCON0.PW[2:7] to 0xF */
WDTCON0_Register_Value |= STARTUP_SET_WDTHPW27;
/* Write 1 to ENDINIT for password access */
WDTCON0_Register_Value |= STARTUP_SET_ENDINIT;
*WDTCON0_Address = WDTCON0_Register_Value; /* modify access to WDTSCON0 */
/*
* Set the bit ENDINIT to 1 or 0 to allow access to registers of WDT_CON1 .e.g.
*/
/* Clear WDTSCON0.PW[2:7], WDTSCON0.LCK, WDTSCON0.ENDINIT */
WDTCON0_Register_Value &= STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT;
/* WDTSCON0.PW[2:7]={0}, WDTSCON0.LCK=1, WDTSCON0.ENDINIT=1 */
WDTCON0_Register_Value |= STARTUP_SET_WDTLCK_ENDINIT;
*WDTCON0_Address = WDTCON0_Register_Value;
WDTCON0_Register_Value = *WDTCON0_Address;
}
7. 總結(jié)
為了提供系統(tǒng)的安全性,TC3xx芯片提供了Endinit機(jī)制來(lái)保護(hù)一些特殊的寄存器。在修改這些特殊寄存器的時(shí)候需要先解鎖Endinit, 在解鎖Endinit時(shí)需要考慮使用static靜態(tài)還是automatic自動(dòng)密碼機(jī)制以及是否使用超時(shí)機(jī)制等。確定了解鎖Endinit的類(lèi)型后,就可以按照特定的步驟來(lái)解鎖Endinit,然后按照UnlockEndinit àmodify protected register àLockEndinit的步驟來(lái)修改特殊寄存器即可。
-
芯片
+關(guān)注
關(guān)注
463文章
54007瀏覽量
465952 -
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129968 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3344瀏覽量
60251
原文標(biāo)題:TC3xx芯片的Endinit功能詳解
文章出處:【微信號(hào):汽車(chē)電子嵌入式,微信公眾號(hào):汽車(chē)電子嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
英飛凌TC3XX系列多核MCU學(xué)習(xí)筆記(1)
TC3xx芯片時(shí)鐘系統(tǒng)的鎖相環(huán)PLL詳解
TC3XX寄存器讀寫(xiě)時(shí)間過(guò)長(zhǎng)怎么解決?
TC3xx系列怎么禁用trap?
TC3xx系列是否支持RTC功能?
TC3xx的HSM中有沒(méi)有單調(diào)計(jì)數(shù)器?
請(qǐng)問(wèn)tc3xx如何配置多個(gè)dedicatedRxBuffersNumber?
兩片TC3XX芯片之間的時(shí)鐘同步可以實(shí)現(xiàn)嗎?
AUTOSAR MCAL-基于Infineon TC3xx芯片的ADC模塊
AURIX? TC3xx NVM是非易失性存儲(chǔ)器學(xué)習(xí)筆記
TC3xx芯片DMU介紹
TC3xx芯片的MPU功能詳解
TC3xx芯片的Endinit功能詳解
評(píng)論