eSPI 通訊一般來說無需特別關注,因為通訊都是 PCH(eSPI_Master)和 EC(eSPI_Slave)硬件完成的,軟件不參與。
但是實際開發中經常會遇到 SLP_S3/4 不拉高導致無法開機,8042鍵盤無功能,6266無法通信等問題。因此了解常見的通訊流程,分析抓取的 eSPI 通訊數據包,對異常定位有很大的幫助。
eSPI 初始化通訊
通用參數配置
eSPI_Master 第一步會讀取 eSPI_Slave 的 0x08 寄存器獲取 eSPI_Slave 所支持的通訊能力。有如下參數:
I/O Mode Support | Single I/O、Single and Dual I/O、Single and Quad I/O、Single, Dual and Quad I/O |
---|---|
Open Drain Alert# Supported | Open-drain Alert# |
Maximum Frequency Supported | 20、25、33、50、66MHz |
Channel Supported | Peripheral、Virtual Wire、OOB、Flash、platform specific channels |
接著 eSPI_Master 會在合適的時候寫 eSPI_Slave 的 0x08 寄存器,以配置不同的通訊參數。如下表:
CRC Checking Enable |
---|
Response Modifier Enable |
Alert Mode Select |
I/O Mode Select |
Open Drain Alert# Select |
Operating Frequency Select |
Maximum WAIT STATE Allowed |
上圖的配置參數中就選擇了 Quad Mode IO、66MHz 通訊,圖中也可以發現緊接著一筆數據通訊變成 66MHz、Quad IO mode。
通道參數配置
eSPI 支持4個 Channel,即 Peripheral(0x10)、Virtual wire(0x20)、OOB(0x30)、Flash(0x40)。
此處僅以 Peripheral Channel(0x10)配置為例。
通道參數配置,也遵循先讀后寫原則。即 eSPI_Master 先讀取 eSPI_Slave 通道配置寄存器,然后再改寫配置寄存器。
Peripheral Channel (0x10)涉及的參數如下表
Peripheral Channel Maximum Read Request Size | R/W |
---|---|
Peripheral Channel Maximum Payload Size | R/W |
Peripheral Channel Maximum Payload Size Supported | RO |
Bus Master Enable | R/W |
Peripheral Channel Ready | RO |
Peripheral Channel Enable | R/W |
eSPI_Master 讀取 Peripheral Channel 0x10 寄存器,發現通道已經 Ready
即 Channel Ready=1。
eSPI_Master 寫 Peripheral Channel 0x10 寄存器,寫Channel Enable=1。
Virtual Wire 通訊
Virtual Wire Channel 包攬了 PCH 和 EC 之間所有的信號傳遞,包括 SCI、IRQ、SLP Signal。數據傳遞可以是 eSPI_Master 到 eSPI_Slave,也可以反向。
當然反向通信,需要 eSPI_Slave 先發起 Alert# 信號,等待 eSPI_Master 查詢Status Reg,再根據狀態發起不同的命令讀取 eSPI_Slave 的數據。
Master 向 Slave 發送 pin status。
如上圖,eSPI_Master 使用 PUT_VWIRW(04)命令,附帶數據包,
向 eSPI_Slave 通知 PCH 虛擬引腳狀態。
Length=03,即傳遞了 4組 Virtual Wire 信號。
index=02,Data=74,即傳遞了 System Event-2。
index=03,Data=30,即傳遞了 System Event-3。
index=41,Data=B9,即傳遞了 Platform Specific-41。
index=42,Data=31,即傳遞了 Platform Specific-41。
如下圖是 System Event Virtual Wire 2 的數據解析。其他 System Event 解析一致。因此 Index=2,data=74,即表示 SLP_S3/4/5 有效,SLP_S3、SLP_S4 為低電平,SLP_S5 為高電平。
Slave 向 Master 發送 Signal status。
如上圖,eSPI 通訊采用 Single IO,因此 Alert# 和 IO-1 復用。上圖 IO-1 最開始的 230ns 即為 eSPI_Slave 發起的 Alert# 信號。
eSPI_Master 接到 Alert# 后,首先發送 GET_STATUS(25)命令,獲取 eSPI_Slave 的狀態,可以看到 SLave 端回復的 status 是 0x14F。
即表示 PC/NP/VWIRE/OOB buffer 都是空,BIT6 VWIRE_AVAIL 置位即表示有 Virtual Wire 需要 Master 端讀取。
Master 發送 GET_VWIRE(05)命令讀取 Virtual Wire 狀態,Slave 端返回 System Event-5 的狀態。index=5,data=99,即表示
SLAVE_BOOT_LOAD_DONE 和 SLAVE_BOOT_LOAD_STATUS 有效,同時置位,即表示 Slave 端成功完成了 Flash 的訪問。
Slave 向 Master 發送 pin status。
如上圖,就是 Slave 端向 Master 端發送 SCI 的數據包。
index=6,data=10,即表示 SCI 信號有效,同時拉低。
當然,等待 Master 端響應 SCI 后,Slave 必須發送一個 SCI 拉高的數據包。
Slave 向 Master 發送 IRQ。
IRQ 在 eSPI Virtual wire 里面劃分為 Interrupt Event。占用 Virtual Wire Index 0和1。
如上圖,Master 接到 Alert# 信號后,讀取 Virtual 狀態。Slave 返回 IRQ-1信號。index=00,data=81,即表示 IRQ-1 拉高(注意,此處 IRQ-1 是高觸發)。IRQ-1 信號同樣的需要 Slave 端再次發送數據包拉低。
Peripheral Channel IO 通訊
Keyboard 通訊
理解上述 IRQ-1 觸發原理后,EC 端的鍵值發送就非常容易理解了。流程如下:
- 鍵盤按鍵按下后,EC 完成掃描以及轉換過程,最終生成一個 ScanCode 寫入 IO-60 數據寄存器。
- IO-60 的寫入動作,會觸發 EC 硬件自動發送一個 IRQ-1 通知 PCH,有鍵盤中斷發生。
- PCH 識別到 IRQ-1 后,會讀取 IO-64,查看 OBF 狀態,以判斷 IO-60 是否有數據需要讀取。
- 緊接著 PCH 會讀取 IO-60 獲取 ScanCode。
鍵盤一次按鍵分為“Press” 和 “Release”,即按下和松開都會給 PCH 端發送一個 ScanCode。如下示例是 “A” 鍵操作,對應 ScanCode 是 1E 和 9E。
按鍵按下數據包。
按鍵松開數據包
Q_Event 通訊
EC 發送 Q_Event(A0)流程:
- EC 拉低 SCI,同時置位 66 寄存器的 BIT5,即 SCI_EVT。
- PCH 讀取 66,發現 SCI_EVT 置位,發送 0x84 命令查詢 Q_Event。
- EC 拉高 SCI,同時清除 66寄存器 BIT5。
- EC 處理 0x84 查詢命令,把 Q_Event 隊列第一個 num(A0) 寫入 62 寄存器
- EC 拉低 SCI,置位 66寄存器 BIT0,即 OBF
- PCH 讀取 66 ,發現 OBF 置位,讀取 62 寄存器,獲得 Q_Event Num(A0)。
- EC 拉高 SCI。
上述就是常見 eSPI 通訊數據包的分析。
-
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
SPI
+關注
關注
17文章
1701瀏覽量
91345 -
通訊
+關注
關注
9文章
894瀏覽量
34836 -
數據包
+關注
關注
0文章
253瀏覽量
24367
發布評論請先 登錄
相關推薦
評論