Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

admin 2021年5月26日21:25:03评论84 views字数 4896阅读16分19秒阅读模式
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

本文为看雪论坛优秀文章

看雪论坛作者ID:hyjxiaobia




Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

  序

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
 
2010年毕业那会,我首次接触到51单片机,当时发现51单片机如此简单却功能完备:尽管它没有搭载OS,却能接收GPIO Port上的硬件事件;同时能将控制逻辑反馈给设备。反观基于x86体系的PC,虽然功能强大,但终端用户因为下列限制,很难在Ring3层控制简单如按钮开关这样的外设:

a. 主板厂商本着节省原料的原则,未必会在主板上引出空闲的GPIO Port;退一步,即使厂商出于某种原因,引出了空闲的GPIO Port,终端用户没有主板回路图,无法找到这些GPIO Port;

b. 即使用户侥幸找到了GPIO Port,但是GPIO Port的作用是由主板厂商在Bios中设定的,普通用户无法修改这些设定;另外,Intel仅向IBV/OEM等它的合作厂商提供PCH spec,除非发生了类似2020年7月Intel泄露了30G相关资料的事件,否则终端用户无法对外设进行准确的设定;

c. OS足够强大,以至于抽象了底层硬件实现(OS的透明性),这是积极的一面。但是反过来,正是因为OS的透明性,位于Ring3层的App很难访问硬件。
以上种种,像是PC行业给初学者添加的重重壁垒。我由于机缘巧合,有机会在这些壁垒上自底向上的(Bios--Acpi.sys/OS--驱动--App)打了一串小孔,从而能在Ring3层接受来自硬件层的GPIO中断。本文基于Intel Whiskey Lake平台,总结了这种自上而下的(非标准)访问方式,也算是我对毕业这么多年的一个回顾~


Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

0. 神秘的P2SB接口

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇


Intel PCH EDS Vol2中规定,Intel PCH通过P2SB(Primary to Sideband Bridge)接口,以下列公式访问GPIO Pad:
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图1. P2SB访问GPIO Community

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图2. P2SB的PCIe Location

P2SB接口是PCH上的PCIe设备,在Whisky Lake平台上,它位于B:0/D:31/F:1。看到这,你的第一反应一定是计算P2SB的配置空间地址,然后通过MMIO方式获得SBREG_BAR,这就有了上述公式里1/3的原料。

但是P2SB和PMC Controller(B:0/D:31/F:2)一样神秘:即使已知BusDeviceFunction Number,也无法访问该PCIe设备的配置空间。我们可以用RW分别访问Root Bridge/P2SB/Power Managment Controller 3个PCIe设备的配置空间:
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图3. MMIO方式读取3种PCIe设备的配置空间的结果

根据图3结果,我制作了下表,方便读者阅读:

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

根据图表可知:RW无法获得P2SB的配置空间,进而无法获得SBREG_BAR(P2SB Base Address B:0/D:31/F:1/Reg 0x10),所以本文结束!?

当然这不是结束,我开玩笑的。RW关上一扇门,但是Intel开了一个烟囱:我们可以从Intel提供给IBVOEM的IntelKabyLakeSiliconPkg目录下找到SBREG_BAR和通过P2SB接口访问各类寄存器的宏定义:
/**  Definition for PCR address  The PCR address is used to the PCR MMIO programming**/#define PCH_PCR_ADDRESS(Pid, Offset)    (PCH_PCR_BASE_ADDRESS | ((UINT8)(Pid) << 16) | (UINT16)(Offset))  #define PCH_PCR_BASE_ADDRESS              0xFD000000     ///< SBREG MMIO base address
这个宏定义可以视为对图1中红线部分的补充说明。

PortID


不同于51单片机访问GPIO Port,Intel PCH视GPIO为GPIO Pad。读者可以将GPIO Pad理解为主板上的焊点(当然Pad本身也有焊盘的意思)。而焊点GPIO Pad到真正的GPIO Port之间还有不为人知的回路。

同时,Intel PCH将若干物理内存上相近的GPIO Pad划到同一个GPIO Community(GPIO社区?GPIO组?),以便于访问,并赋予各个GPIO Community平台唯一的Port ID。各个平台定义的Port ID不同,需要查询EDS Vol1,下图为KabyLake定义的Port ID:

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图4. 本文用到的是GPIO community 4 GPPC_E(GPPC_E22),Port ID:6A

至此,铺垫已经完成,开始正题:配置Bios使GPIO在OS下触发SCI Event需要几步?

答:需要3步(把大象关进冰箱要几步?也需要三步。)

1. 配置GPIO,使其能触发GPIO SCI event;
2. 配置PMC;
3. 让ACPI.sys响应SCI event。

下面开始具体的配置过程。


Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

一. 配置GPIO

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

配置GPIO,使其能触发GPIO SCI event。这一步分3小步:


1.1 选择GPIO pin


如果读者能获得主板的GPIO table(其实读者几乎没可能获得OEM厂商的GPIO table这类内部资料,这就是我在文章开头说的障碍之一),那么从中挑选一个空闲的GPIO pin并不是难事。对于本文使用的主板,OEM厂商将GPP_E22设置为一个弱上拉信号,辅助Bios判断主板上喇叭类型(品牌喇叭/杂牌喇叭),我琢磨着这类引脚应该能随意折腾,于是外接了一根引线作为GPP_E22的输入线,另外又引出一根地线:

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图5. 某日摄于公司的一块已上市多年的主板,也是本文试验用的板子

1.2 将GPIO Pin配置为Edge/Level触发&Enable GPIO SCI


Bios通过Pad Configuration DW0 寄存器设置来控制GPIO pin的触发方式以及中断触发类型(SCI/SMI/NMI/IOxACPI)等属性,如果将中断触发类型设置为SCI,还需要配置GPI General Purpose Events Enable寄存器:

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

图6. GPI General Purpose Events Enable寄存器

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图7. GPIO DW0寄存器

我已经提前在主板上按如下方式配置这2个寄存器,
{GPIO_CNL_LP_GPP_E22, {GpioPadModeGpio,     GpioHostOwnAcpi,   GpioDirIn,       GpioOutDefault,       GpioIntSci | GpioIntLevel,             GpioPlatformReset,  GpioTermNone,     GpioPadConfigUnlock                           }},

为了验证配置结果,可以将GPI_GPE_EN_GPP_E_22的偏移(Offset:0x164)和PAD_CFG_DW0_GPPC_E_22的偏移(Offset:0x8E0)作为宏PCH_PCR_ADDRESS的参数分别计算出它们的地址,然后用RW查看配置结果:
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图8. GPI_GPE_EN_GPP_E_22的配置结果

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图9. PAD_CFG_DW0_GPPC_E_22的配置结果

这种验证方式并不是很直观,如果读者有"Intel GPIO Configuration"工具,可以以报表的形式展示,获得更直观的结果:
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图10. Intel GPIO Configuration输出结果

1.3 将GPIO Pad映射到PMC GPE event


根据PCH spec可知,GPE顶层中断源共有128个,PCH外部中断将中断信号映射到GPE顶层中断源后,才有机会触发SCI中断。仅仅完成上面的配置还不足以触发SCI中断,还需要建立从GPIO到GPE的映射。建立这种映射依赖GPIO Community的Miscellaneous Configuration寄存器(MISCCFG:Offset 10):

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图11

对于KabyLake平台,一种默认的映射关系是GPP_E-->GPE_DW2/None-->GPE_DW1/GPP_B-->GPE_DW0(这种映射关系不能随意改变,改变映射关系可能不会生效)
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图12. MISCCFG配置


Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

二. 配置PMC

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇


理论上应该配置被GPPC_E22映射的用于触发PMC GPE_EN的寄存器----GPE_EN_95_64,但实际测试过程中发现不去置位GPE_EN_95_64:22也能触发SCI中断。
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图12. PMC Register

前面也说过我们无法通过MMIO获得PMC Controller PCIe配置空间的值,更无法获得ACPI Power managerment IO register的地址,所以最终还是要到Intel代码中获得:
TOKEN    Name  = "ACPI_BASE_ADDRESS"    Value  = "0x1800"    Help  = "ACPI Base Address(ABASE), D31F2, Offset 40h"    TokenType = Integer    TargetH = YesEnd

由此可知,ACPI Power managerment IO register(ABASE)的偏移地址为0x1800:
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图13. ACPI Power managerment IO register物理地址输出。


Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

三. ACPI响应SCI event

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇


ACPI命名空间_GPE下_Lxx_Exx Control Method用于接收和处理SCI event,_L/_E分别指电平触发和边缘触发,而xx(16 进制)是128个GPE中断源中的编号。
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图14. GPE Handling.

本文中GPPC_E Port映射到GPE_96_64(GPPC_E22映射到了GPE_86),因此我们需要在_GPE下添加_L56 Control Method:
IntelCometLakePlatSamplePkgAcpiAcpiTablesDsdtGpe.asl    Scope(_GPE)  {    Method (_L56, 0, Serialized){        DSTR("l-event _L56"); //打印日志    }  }

重新编译和烧录Bios,看下Bios输出结果。

当GPIO pin处于高电平时(pin在上拉状态下),有大量的"l-event _L56"输出;当GPIO pin搭上Gnd引脚,不会有这条语句输出:
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图15. GPP_E22处于高电平时,Bios的输出

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
图16. GPP_E22拉低电后,Bios的输出 

总结:


Tiger Lake Platform Controller Hub (PCH) BIOS Specification概括了GPIO SCI的步骤:
Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
这次完了?还是没完,还有软件篇,介绍把Bios的Q-event消息转交给驱动程序进一步处理,所以请各位待续~

谢谢


参考:


a.<Intel® 100 Series Chipset Family PCH Datasheet, Vol. 1 > (简称PCH EDS Vol1)/<Intel® 100 Series Chipset Family PCH Datasheet, Vol. 2> (简称PCH EDS Vol2), 这两份是Intel Skylake PCH spec,规定了PCH的寄存器偏移/默认值等;

b.<Tiger Lake Platform Controller Hub (PCH) BIOS Specification>, 这一份是Intel Tiger Lake bios writer guide,规定了如何在Bios中配置GPIO;

c.ACPI 6.2



Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

- End -



Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇


看雪ID:hyjxiaobia

https://bbs.pediy.com/user-home-399589.htm

  *本文由看雪论坛 hyjxiaobia 原创,转载请注明来自看雪社区。




# 往期推荐





Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇
公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]



Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

球分享

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

球点赞

Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

球在看



Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

点击“阅读原文”,了解更多!

本文始发于微信公众号(看雪学院):Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月26日21:25:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇http://cn-sec.com/archives/277375.html

发表评论

匿名网友 填写信息