0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

常见eSPI通讯数据包的分析

CHANBAEK 来源: 吃面小哥 作者: Morgen 2023-11-18 15:35 次阅读

eSPI 通讯一般来说无需特别关注,因为通讯都是 PCH(eSPI_Master)和 EC(eSPI_Slave)硬件完成的,软件不参与。

但是实际开发中经常会遇到 SLP_S3/4 不拉高导致无法开机,8042键盘无功能,6266无法通信等问题。因此了解常见的通讯流程,分析抓取的 eSPI 通讯数据包,对异常定位有很大的帮助。

eSPI 初始化通讯

通用参数配置

图片

eSPI_Master 第一步会读取 eSPI_Slave 的 0x08 寄存器获取 eSPI_Slave 所支持的通讯能力。有如下参数:

I/O Mode SupportSingle I/O、Single and Dual I/O、Single and Quad I/O、Single, Dual and Quad I/O
Open Drain Alert# SupportedOpen-drain Alert#
Maximum Frequency Supported20、25、33、50、66MHz
Channel SupportedPeripheral、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 SizeR/W
Peripheral Channel Maximum Payload SizeR/W
Peripheral Channel Maximum Payload Size SupportedRO
Bus Master EnableR/W
Peripheral Channel ReadyRO
Peripheral Channel EnableR/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 端的键值发送就非常容易理解了。流程如下:

  1. 键盘按键按下后,EC 完成扫描以及转换过程,最终生成一个 ScanCode 写入 IO-60 数据寄存器。
  2. IO-60 的写入动作,会触发 EC 硬件自动发送一个 IRQ-1 通知 PCH,有键盘中断发生。
  3. PCH 识别到 IRQ-1 后,会读取 IO-64,查看 OBF 状态,以判断 IO-60 是否有数据需要读取。
  4. 紧接着 PCH 会读取 IO-60 获取 ScanCode。

键盘一次按键分为“Press” 和 “Release”,即按下和松开都会给 PCH 端发送一个 ScanCode。如下示例是 “A” 键操作,对应 ScanCode 是 1E 和 9E。

按键按下数据包。

图片

按键松开数据包

图片

Q_Event 通讯

EC 发送 Q_Event(A0)流程:

  1. EC 拉低 SCI,同时置位 66 寄存器的 BIT5,即 SCI_EVT。
  2. PCH 读取 66,发现 SCI_EVT 置位,发送 0x84 命令查询 Q_Event。
  3. EC 拉高 SCI,同时清除 66寄存器 BIT5。
  4. EC 处理 0x84 查询命令,把 Q_Event 队列第一个 num(A0) 写入 62 寄存器
  5. EC 拉低 SCI,置位 66寄存器 BIT0,即 OBF
  6. PCH 读取 66 ,发现 OBF 置位,读取 62 寄存器,获得 Q_Event Num(A0)。
  7. EC 拉高 SCI。

图片

图片

图片

上述就是常见 eSPI 通讯数据包的分析。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117762
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1615

    浏览量

    89647
  • 通讯
    +关注

    关注

    9

    文章

    840

    浏览量

    34374
  • 数据包
    +关注

    关注

    0

    文章

    231

    浏览量

    24095
收藏 人收藏

    评论

    相关推荐

    eSPI协议抓包分析

    eSPI 协议在物理层是遵循 SPI 通讯规范的,但是协议层有差异,因此不能使用 SPI 协议去解析(没有 eSPI 协议分析仪的情况下,可以使用 SPI 协议
    的头像 发表于 11-18 15:29 1370次阅读
    <b class='flag-5'>eSPI</b>协议抓包<b class='flag-5'>分析</b>

    求DAQ数据包

    我的软件里没有DAQ选项,是不是没有安装这个版块,如果是的话,求分享下这个版块的数据包
    发表于 08-17 22:53

    请问,CAN发送数据出现数据包丢失的情况

    请问,CAN发送数据出现数据包丢失的情况,怎么解释呀,CAN不是有自动重发功能吗。大家对于数据包丢失这种情况是怎么处理的
    发表于 12-12 20:51

    蓝牙数据包的抓取与分析

    本帖最后由 bbsc 于 2017-5-7 17:10 编辑 各位大佬好,我想用电脑抓取蓝牙数据包,然后用wireshark分析,需要哪些硬件协助?最好便宜点(学生dang)需要测试的设备支持
    发表于 05-07 16:55

    请问SRIO每次出传输数据包的个数,数据包负载大小怎么设置?

    本帖最后由 一只耳朵怪 于 2018-6-19 14:25 编辑 DSP一次发送16个数据包,每个数据包256字节,一次传输4096个字节。如果现在DSP向FPGA发送2048字节数据,后面2048个字节它自动为零,造成效
    发表于 06-19 05:22

    如何用虚拟数据填充数据包

    如果主机要发送长度不为512倍的数据流,则最后一个不会自动提交给USB,因为它小于512字节。为了提交最后一个数据包,主机可以做两件事之一:它可以用虚拟数据来填充
    发表于 12-28 15:24

    AXI流数据包传输问题

    嗨eveyone,我是这个论坛的新人。如果我弄错了,我道歉。我正在尝试使用AXI Stream协议传输数据包。这些数据包包括512 * 32位数据。使用1 kHz时钟使能发送重新生成的数据包
    发表于 04-15 13:51

    N4217A数据包分析探针数据

    N4217A数据包分析探针数据
    发表于 07-10 06:27

    如何检测数据包丢失?

    问题:我想做一个RFC2544速度测试。有人知道如何检测数据包丢失吗?数据中是否有UNIQ标识符(什么是RF2544数据包结构?)……我找不到这个信息。谢谢。
    发表于 03-13 08:56

    请问在串口通信中数据包的帧头和帧尾怎样加入到数据包

    ,请问在串口通信中,数据包的帧头和帧尾(比如0x55,0xaa)是怎样加入到数据包的?是不是定义一个数组,将帧头和帧尾设置成0x55,0xaa,再将整个数组发送?在发送包含帧头帧尾的数据包时,是否需要
    发表于 03-30 05:55

    UART数据包设计与解析

    上一节讲到起止式SST(Start-Stop-Type)帧结构协议,该协议利用帧头、长度、校验构建帧结构,基于帧结构能实现对数据包的可靠、准确传输。应用层数据...
    发表于 12-16 06:15

    odbus实现主机对从设备读取数据包和从设备写入数据包

    六.modbus实现主机对从设备读取数据包和从设备写入数据包1.准备好硬件上能精确到1ms的定时器2. 先完成一个MODBUS所需要的软件上的定时器void Timer2_Init(void
    发表于 02-22 07:59

    如何发送音频/视频ISOC数据包

    我想开发带有音频和/或视频类的 USB 主机应用程序。是否有任何工作示例项目或代码片段?我检查了 STM32 HCD 驱动文件 - -ux_hcd_stam32_periodic_schedule.c,但它总是生成 EP_TYPE_INTR 数据包。如何发送音频/视频 ISOC
    发表于 12-26 08:18

    如何获得ESP32端接收到的数据包数量?

    我们目前正在开发基于ESP32的新产品,我们想做一些认证。我们正在使用 ESP RF 工具在 Tx 数据包、Rx 等中设置产品。这部分按预期工作。我们使用 ESP RF 工具进行适应性测试
    发表于 04-13 07:25

    eSPI通讯总线的应用优势

    eSPI总线是Intel在2016年推出的一种通讯总线,用于x86 CPU平台和外设之间的通讯
    的头像 发表于 02-15 09:05 2942次阅读