常见eSPI通讯数据包的分析

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# 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 sizer/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,即 obfpch 读取 66 ,发现 obf 置位,读取 62 寄存器,获得 q_event num(a0)。ec 拉高 sci。
上述就是常见 espi 通讯数据包的分析。

二保焊焊接工艺参数
DS1265W 8Mb非易失(NV) SRAM
中国PCB行业增速高于全球平均 车用PCB行业是潜力板块
什么时候买5G手机最适合
英国政府将限制采用华为设备的比例不能超过整体网络的50%以上
常见eSPI通讯数据包的分析
开放加速标准如何推动安全关键型发展
【昉·星光 2(VisionFive 2)RISC-V单板计算机】尝试玩3D赛车-帧率有点低
椭圆齿轮流量计运行中的故障现象及处理方法
光电探测器的带宽是什么_光电探测器误报原因
三极管与MOS管的正确应用
是德科技推出高性能PAM4误码仪及100GHz采样示波器模块
数据在存储器中的存储方式与寻址方式
为什么说区块链会是未来广告业的趋势?
飞思卡尔为ZigBee RF4CE消费电子产品推出MC132
要闻:Google不再强制预装应用 三星收购AI分析公司Zhilabs
你了解哪一些智慧城市的应用场景
基于FPGA的LCD大屏幕拼接系统的设计
步影医疗聚焦青少年脊柱侧弯病种 实现疾病的早发现、早干预、早治疗
光伏逆变器如何散热