概述

表面/系统聚合器模块(SAM,SSAM)是 Microsoft Surface 设备上的一个(可以说是唯一)嵌入式控制器(EC)。它最初是在第四代设备(Surface Pro 4、Surface Book 1)上引入的,但其职责和功能集随着后续几代设备的推出而显著扩展。

功能和集成

由于主机和 EC 之间使用了不同的通信接口(如下详述),目前对第四代设备(Surface Pro 4、Surface Book 1)上的 SAM 知之甚少。在第五代(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 中声明的设备较少,这使得它们更难被发现,并要求我们硬编码一种设备注册表。因此,实现了一个带有客户端设备的 SSAM 总线和子系统(struct ssam_device)。

通信

主机和 EC 之间的通信接口类型取决于 Surface 设备的代数。在第四代设备上,主机和 EC 通过 HID 进行通信,特别是使用基于 I2C 的 HID 设备,而在第五代及更高版本的设备上,通信通过 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 串行集线器协议,有关内部驱动程序架构的概述,请参阅核心驱动程序内部