前言
為了提供系統的安全性能,TC3xx上一些重要的寄存器都受Endinit保護,不能直接修改。如果想要修改這些重要寄存器,就需要先按特定步驟解鎖Endinit,然后才能修改這些重要的寄存器的值,最后還要上鎖Endinit。那什么是Endinit功能了? -- 本文就來詳細解鎖TC3xx芯片的Endinit機制。
Note: 第1到5章節都是關于Endinit的概念介紹,如果感覺比較枯燥可以先從第6章節的實際應用開始閱讀。
縮略詞
簡寫 | 全稱 |
Endinit | End of initialization |
WDTCPUyCON0 | CPUy WDT Control Register 0 |
WDTSSR | Safety WDT Status Register |
注:本文章引用了一些第三方工具和文檔,若有侵權,請聯系作者刪除!
正文
1.功能概述
在系統或應用程序的初始化過程中,通常只對一些寄存器進行一次編程(programmed only once)。 在正常應用程序運行期間修改此類寄存器可能會嚴重影響模塊或整個系統的整體運行。
雖然 Supervisor Mode 和 Access Protection 方案提供了一定級別的保護,防止意外修改,但它們可能不足以防止對系統關鍵注冊器的所有意外訪問。
為這類寄存器提供了額外的保護,稱為 Endinit (“Endoff initialization”)。 Endinit 是一種寫保護方案,它只允許在特定時間進行寫入,并使受此功能保護的寄存器的意外修改幾乎不可能實現。
Endinit 功能由每個 WDT 控制寄存器中包含的 ENDINIT 位組成。 通過 Endinit 保護的寄存器決定是否啟用寫入。 只有當相應的 ENDINIT =0 且主管模式處于活動狀態時,才會啟用寫入。 如果這種情況不正確,則寫入嘗試將被放棄,在這種情況下,寄存器內容將不會被修改。
為了獲得最高的穩定性,寫入 ENDINIT 位將受到 WDT 中實施的高度安全的訪問保護方案的保護。 這是一個復雜的過程,幾乎不可能無意中修改 ENDINIT bits。 此外,每次軟件通過清除相應的 ENDINIT 位來打開對關鍵寄存器的訪問時,每個 WDT 都會啟動超時序列來監視 ENDINIT 位的修改。 如果超時時間在相應的 ENDINIT 位再次設置之前結束,則假定軟件出現故障,并生成看門狗故障響應。
以下各節介紹了 WDT 的訪問保護方案和 Endinit 超時操作。 在每個模塊 (包括 SCU 本身) 的寄存器概覽表中,通過每個 Endinit 類型保護的寄存器在描述寫入訪問的列中標識,如下所示:
“ CEy” - CPU 關鍵寄存器。 僅當 CPUy WDT ENDINIT=0 (y=CPU number) 時可寫。也就是,只有把要要訪問這個寄存器的CPU的ENDINIT設為0后,這個寄存器才能被這個CPU寫訪問(也就是解鎖WDTCPUyCON0.ENDINIT)。
“ E ” - 系統關鍵寄存器 - 任何 (一個或多個) CPUy 看門狗計時器 ENDINIT=0 或 EICON0.ENDINIT=0 時可寫。也就是,任意一個CPU的ENDINIT設為0后,所有CPU都可以對這個寄存器進行寫訪問。
“ SE ” - 安全關鍵寄存器 - 僅當安全監控計時器 ENDINIT=0 或 SEICON0.ENDINIT=0 時才可寫入。也就是,Safety Watchdog的ENDINIT設為0后,Safety EndInit的保護就解除了,所有CPU都可以對這個寄存器進行寫訪問(也就是解鎖WDTSCON0.ENDINIT)。
以上都不是 - 隨時都可以訪問
圖 1顯示了解鎖各種 ENDINIT 寫保護模式的選項。
Figure 1: ENDINIT Control Registers
Note: ENDINIT 位的清除需要一些時間。 在清除 ENDINIT 位后訪問受 Endinit 保護的寄存器必須僅在 ENDINIT 位真正被清除時進行。 作為一種解決方案, ENDINIT 位應在 ENDINIT位 清除后第一次訪問受 Endinit 保護的寄存器之前被讀回一次。
2.WDTxCON0 的密碼訪問(Password Access toWDTxCON0)
為了解鎖WDTxCON0(x=CPUy and y=CPU number, or S)寄存器并修改WDTxCON0寄存器,必須往WDTxCON0寄存器中寫入正確的密碼(password)。軟件必須事先知道正確的密碼,或者在運行時計算密碼。 每個監視程序計時器(Watch)的密碼 (x=CPUy 和 y=CPU 編號,或 S) 可以不同,以便提供獨立的監視程序功能程序流,以具有獨立的監視程序功能。
安全監視器密碼寄存器(Safety Watchdog password register)WDTSCON0 受通用 SCU 保護,該保護方案只允許配置的masters具有寫入訪問權限。
特定于 CPU 的監視程序密碼寄存器(CPU-specific Watchdog password) WDTCPUyCON0 單獨受到保護,因此它們只能由相應的 CPUy 寫入。
在安全應用程序中可以使用看門狗來提供恢復時間,在此期間軟件可能會嘗試從安全警報警告中恢復。 為確保 CPU 故障不允許忽略故障,提供了一個選項,用于在安全管理單元 (SMU) 處于故障狀態時防止看門狗解鎖。 此選項可由位 WDTxCON1.UR 啟用。
如果密碼有效且 SMU 狀態滿足 WDTxSR.US 位的要求,則一旦密碼訪問完成, WDTxCON0 將被解鎖。 解鎖條件將由 WDTxCON0.LCK = 0 指示。 為了確保正確的服務順序(servicing sequence),只有在訪問之前設置了 WDTxCON0.LCK 位時才允許密碼訪問。
如果在密碼訪問期間向 WDTxCON0 寫入了不正確的密碼值,則存在看門狗訪問錯誤情況。 位 WDTxSR.AE 已設置,并向安全管理單元 (SMU) 發送警報請求。 14 位用戶可定義密碼 WDTxCON0.PW 提供了其他選項,用于根據應用程序的需要調整密碼要求。 例如,它可用于檢測意外的軟件循環,或監視例程的執行順序。
下表 匯總了密碼的要求。 有多種選擇,下文將更詳細地介紹這些選擇
Table 1:Password Access Bit Pattern Requirements
2.1 Static Password
在靜態密碼模式 (WDTxSR.PAL=0) 中,密碼只能通過有效的“修改訪問”進行更改。 密碼訪問(Password Access)的設計使其不可能簡單的讀取寄存器并重寫寄存器。 在重新寫入之前,某些密碼讀取位必須反向 (切換)。 這可以防止簡單的故障通過簡單的讀 / 寫序列意外解鎖 WDT。
2.2 Automatic Password Sequencing
如果啟用了自動密碼排序 (WDTxSR.PA=1) ,則每次檢查密碼后,密碼會自動更改 (即Password Access or Check Access)。 預期的下一個密碼遵循基于具有特征多項式 x14+X13+x12+x2+1 的 14 位斐波那契(Fibonacci) LFSR (Linear Feedback Shift Register) 的pseudorandom sequence。 修改訪問權限還可以提供初始密碼 (或后續手動密碼更新)。
Figure 2: Password Sequencing LFSR
2.3 Time-Independent Pasword
如果未啟用時間檢查 (WDTxSR.TCS=0) ,則 WDTxCON0 寄存器的 REL 字段必須在密碼訪問期間使用現有的重新加載值重新寫入。
2.4 Time Check Password
如果啟用時間檢查 (WDTxSR.TCS=1) , WDTxCON0 寄存器的 REL 字段必須使用當前 WDT 計數值的反向 (位翻轉) 估計值寫入。 此估計的可接受誤差幅度 (在 WDT 時鐘周期內) 由 WDTxSR.TCT 的值指定。 如果寫入的估計值超出 WDTxSR.TIM +/- WDTxSR.TCT 范圍,則 SMU 回發出Alarm報警。 此機制可以檢查自上次 WDT 重新啟動以來已過的程序執行時間。 請注意,當 WDT 以超時模式運行 (訪問受 ENDINIT 保護的寄存器后) 時,密碼或檢查訪問仍需要時間檢查比較。
3. WDTxCON0的檢查訪問(Check Access to WDTxCON0)
Check Access 與 Password Access 相同,只不過鎖位(lockbit)未被清除,因此不允許后續的“修改訪問”。 如果滿足寫入數據要求,“檢查訪問”不會觸發 SMU 警報請求。 只有在設置了 LCK 位時才能執行檢查訪問。
此類訪問用于 WDT 服務之間的中間檢查點。 這可以用于任務序列或執行時間監控 (例如,與時間戳計數檢查功能或序列密碼結合使用)。
Table 2: Check Access Bit Pattern Requirements
如果在檢查訪問期間向 WDTxCON0 寫入了不正確的值 (x=CPUy and y=CPU number, or S) ,則存在看門狗訪問錯誤情況。 位 WDTxSR.AE 已設置,并向安全管理單元 (SMU) 發送警報請求。
4. WDTxCON0的修改訪問(Modify Access to WDTxCON0)
如果密碼訪問(Password Access)成功解鎖 WDTxCON0 (x=CPUy and y=CPU number, or S) ,則以接下來的WDTxCON0 的寫入訪問可以對其進行修改。 但是,這種訪問也必須滿足某些要求才能被接受并被視為有效。 表 3列出了所需的位模式(bit patterns)。 如果訪問不遵循這些規則,則會檢測到監視程序訪問錯誤情況,設置位 WDTxSR.AE ,并向安全管理單元 (SMU) 發送警報請求。 修改訪問完成后,將再次設置 WDTxCON0.LCK ,自動重新鎖定 WDTxCON0。 在重新修改寄存器之前,必須再次執行有效的密碼訪問。
Table 3: Modify Access Bit Pattern Requirements
5. 訪問受Endinit保護的寄存器
如果在運行期間需要對受 Endinit 保護的寄存器進行寫入訪問,則可以在有限的時間內臨時重新啟用寫入訪問。 提供了兩種選擇:
通過 WDT 刷新重新啟用對受 ENDINIT 保護的寄存器的訪問
無需 WDT 刷新即可重新啟用對 ENDINIT 保護的寄存器的訪問
為了獲得調試支持, Cerberus 模塊可以覆蓋所有 WDT 的所有 ENDINIT 控件,以簡化調試流程。 如果設置了 CBS_OSTATE.ENIDIS位 ,則所有 ENDINIT 保護都將被禁用,而不管 WDT 配置的當前狀態如何。 如果清除了 CBS_OSTATE.ENIDIS ,則完整的ENDINIT控制位于 WDT 內。
5.1 通過WDT訪問Endinit保護的寄存器
要重新啟用訪問(修改受Endinit保護的寄存器),必須先使用有效的密碼訪問解鎖 WDTxCON0。 在隨后的有效修改訪問中,可以清除 ENDINIT。解鎖WDTxCON0且清除ENDINT后, 就能再次打開對受 Endinit 保護的寄存器的訪問。 注意,當 WDTxCON0 解鎖時, WDT 會自動切換到超時模式。 因此,訪問窗口有時間限制。 超時模式僅在重新設置 ENDINIT 后終止,需要另一個有效密碼和有效的 WDTxCON0 修改訪問權限。
5.2 不通過WDT訪問Endinit保護的寄存器
在某些應用中,可能不使用 WDT ,并將被禁用 (WDTxSR.DS =1) ,盡管不建議這樣做。
在其他應用程序中,可能會使用 WDT 時間戳功能,刷新之間的 WDT 訪問將是不可取的。
在這種情況下,仍然可以使用 ENDINIT 全球控制寄存器 (EICONx) 來臨時訪問受 Endinit 保護的寄存器。
6. Endinit實際應用
6.1 Endinit需求及場景介紹
需求:在ECU上電后需要在Startup階段關閉看門狗,也就是配置WDTxCON1(x標識CPU0-5)的DR位域。但是,WDTxCON1寄存器是受Endinit保護的。所以,在修改前我們需要解鎖Endinit,修改完WDTxCON1寄存器后再上鎖Endinit。
分析1:因為CBS_OSTATE.ENIDIS只有在Debug模式下通過Cerverus module來Disable(置位CBS_OSTATE.ENIDIS),所以上電的時候因為CBS_OSTATE.ENIDIS是被Cleared的。
所以,能夠通過WDT模塊解鎖Endinit功能。參考第5章節兩種解鎖Endinit的方式。
分析2:WDTSSR寄存器的Reset值是0xFFFC 0010,則WDTSSR.PAS為0,WDTSSR.TCU為0。
所以,使用static password來解鎖Endinit.參考2.1和2.2章節的static password和Automatic Psassword 。
分析3:我們通過配置WDTSCON0寄存器來解鎖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. 總結
為了提供系統的安全性,TC3xx芯片提供了Endinit機制來保護一些特殊的寄存器。在修改這些特殊寄存器的時候需要先解鎖Endinit, 在解鎖Endinit時需要考慮使用static靜態還是automatic自動密碼機制以及是否使用超時機制等。確定了解鎖Endinit的類型后,就可以按照特定的步驟來解鎖Endinit,然后按照UnlockEndinit àmodify protected register àLockEndinit的步驟來修改特殊寄存器即可。
-
芯片
+關注
關注
454文章
50460瀏覽量
421965 -
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
應用程序
+關注
關注
37文章
3245瀏覽量
57614
原文標題:TC3xx芯片的Endinit功能詳解
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論