概述

Surface/系统聚合模块 (SAM, SSAM) 是 Microsoft Surface 设备上的一个(可以说是“主要”)嵌入式控制器 (EC)。它最初是在第四代设备(Surface Pro 4,Surface Book 1)上引入的,但其职责和功能集已在后续几代设备中得到显著扩展。

功能和集成

目前对第四代设备(Surface Pro 4,Surface Book 1)上的 SAM 知之甚少,原因是主机和 EC 之间使用了不同的通信接口(详见下文)。在第五代(Surface Pro 2017,Surface Book 2,Surface Laptop 1)及更高代设备上,SAM 负责向主机提供电池信息(包括当前状态和静态值,如最大容量等),以及各种温度传感器(例如皮肤温度)和散热/性能模式设置。特别是在 Surface Book 2 上,它还提供了一个接口,用于正确处理键盘分离(即,将设备的显示部分与键盘部分分离),在 Surface Laptop 1 和 2 上,它对于键盘 HID 输入是必需的。此 HID 子系统已针对第七代设备进行了重构,在这些设备上,特别是 Surface Laptop 3 和 Surface Book 3,它负责所有主要的 HID 输入(即键盘和触摸板)。

虽然自第五代以来,功能在宏观层面没有太大变化,但内部接口经历了一些相当大的改变。在第五代和第六代设备上,电池和温度信息都通过一个垫片驱动程序(称为 Surface ACPI Notify,或 SAN)暴露给 ACPI,将 ACPI 通用串行总线读写访问转换为 SAM 请求。在第七代设备上,此附加层已不存在,这些设备需要一个直接连接到 SAM 接口的驱动程序。同样,在更新一代的设备上,ACPI 中声明的设备较少,这使得它们更难被发现,并要求我们硬编码一种设备注册表。因此,已实现了一个带有客户端设备(struct ssam_device)的 SSAM 总线和子系统。

通信

主机和 EC 之间的通信接口类型取决于 Surface 设备的代次。在第四代设备上,主机和 EC 通过 HID 通信,具体是使用 HID-over-I2C 设备;而在第五代及更高代设备上,通信通过 USART 串行设备进行。根据在其他操作系统上发现的驱动程序,我们将该串行设备及其驱动程序称为 Surface Serial Hub (SSH)。在需要时,我们通过将它们称为 SAM-over-SSH 和 SAM-over-HID 来区分两种类型的 SAM。

目前,此子系统仅支持 SAM-over-SSH。SSH 通信接口在下文中有更详细的描述。HID 接口尚未进行逆向工程,目前尚不清楚下文详细介绍的 SSH 接口概念有多少(以及哪些)可以应用于它。

Surface 串行集线器

如上文所述,Surface 串行集线器 (SSH) 是第五代及所有后续 Surface 设备上 SAM 的通信接口。在最高层面上,通信可以分为两种主要类型:请求,即从主机发送到 EC 的消息,这些消息可能会触发 EC 的直接响应(与请求明确关联);以及事件(有时也称为通知),即从 EC 发送给主机,而不是对先前请求的直接响应。我们也可以将无响应的请求称为命令。通常,事件需要通过多个专用请求中的一个启用后,才能由 EC 发送。

有关更详细的技术协议文档,请参阅Surface 串行集线器协议;有关内部驱动程序架构的概述,请参阅核心驱动程序内部