5.5.2.4.6.1. 声明 GenericSerialBus 字段
与其他区域一样,GenericSerialBus 操作区域只能通过 Field 术语访问。每个字段元素都分配有一个唯一的命令值,并代表目标 GenericSerialBus 设备上的虚拟寄存器。
字段术语的语法(参见第 19.6.47 节)如下所述:
Field(
RegionName, // NameString=>OperationRegion
AccessType, // AccessTypeKeyword
LockRule, // LockRuleKeyword - ignored for Hardware-reduced ACPI platforms
UpdateRule // UpdateRuleKeyword - ignored
) {FieldUnitList}
其中:
RegionName 指定之前为设备定义的操作区域名称。
AccessType 必须设置为 BufferAcc。这表明对字段元素的访问将使用区域特定的数据缓冲区来完成。对于这种访问类型,字段处理程序不知道数据缓冲区的内容可能是任何大小。当这种类型的字段用作操作中的源参数时,它的计算结果只是一个缓冲区。然而,当用作目标时,缓冲区会双向传递,以允许从写入操作返回数据。修改后的缓冲区将成为该操作的执行结果。这与执行结果与写入目标的值相同的正常情况略有不同。请注意,源永远不会更改,因为它可能是只读对象(请参阅声明和使用 GenericSerialBus 数据缓冲区)。
LockRule 指示访问该操作区域是否需要获取全局锁以进行同步。在具有可以访问 GenericSerialBus 的固件的系统上,应将该字段设置为 Lock,否则应设置为 NoLock。在硬件缩减的ACPI平台上,没有全局锁定,因此该参数被忽略。
UpdateRule 不适用于 GenericSerialBus 操作区域,因为每个虚拟寄存器都是完整访问的。所有 GenericSerialBus 字段定义都会忽略此字段。
GenericSerialBus 操作区域要求以命令值粒度声明所有字段元素。这意味着每个虚拟寄存器不能分解为字段定义中的各个位。
对虚拟寄存器的子部分的访问只能在字段定义之外进行。施加此限制是为了简化 GenericSerialBus 接口。
使用字段定义中的 AccessAs 术语将 GenericSerialBus 协议分配给字段元素。该术语的语法(来自 ASL 根术语和次要术语)描述如下:
AccessAs(
AccessType, //AccessTypeKeyword
AccessAttribute //Nothing \| ByteConst \| AccessAttribKeyword
)
其中:
AccessType 必须设置为 BufferAcc。
AccessAttribute 指示分配给该术语后面的命令值的 GenericSerialBus 协议。有关 GenericSerialBus 协议的列表,请参阅:ref:using-the-genericserialbus-protocols。
AccessAs 术语必须出现在字段定义中,才能为后面的字段元素设置初始 GenericSerialBus 协议。可以为每个字段元素定义最多一个通用串行总线协议。支持单个命令值的多个协议的设备可以通过指定具有相同偏移量(命令值)的多个字段元素来建模,其中每个字段元素前面都有指定备用协议的 AccessAs 术语。
对于 GenericSerialBus 操作区域,必须为每组字段元素定义连接属性。使用字段定义中的连接术语将 GenericSerialBus 资源分配给字段元素。该术语的语法(来自连接(声明字段连接属性)“连接(声明字段连接属性)”)描述如下:
Connection (ConnectionResourceObj)
其中:
- ConnectionResourceObj 指向串行总线资源连接描述符(请参阅 GenericSerialBus 连接描述符 了解有效类型),或指定包含连接资源信息的缓冲区字段的命名对象。
每个字段定义引用操作区域定义中指定的初始命令偏移量。针对相应字段中定义的每个后续字段元素迭代偏移量。如果在同一个Field定义中描述了新的连接,则偏移量将不会返回到其初始值,并且必须定义新的Field以从操作区域定义继承初始命令值偏移量。下面的例子说明了这一点。
OperationRegion (TOP1, GenericSerialBus, 0x00, 0x100) //Initial offset is 0
Field (TOP1, BufferAcc, NoLock, Preserve)
{
Connection (I2CSerialBusV2 (0x5a,,100000,,"\\_SB.I2C",,,,,RawDataBuffer(){1,6})),
Offset (0x0),
AccessAs(BufferAcc, AttribBytes (4)),
TFK1, 8, //TFK1 at command value offset 0
TFK2, 8, //TFK2 at command value offset 1
Connection(I2CSerialBusV2(0x5c,,100000,,"\\_SB.I2C",,,,,RawDataBuffer(){3,1})),
AccessAs(BufferAcc, AttribBytes (12)),
TS1, 8 //TS1 at command value offset 2
}
Field (TOP1, BufferAcc, NoLock, Preserve)
{
Connection(I2CSerialBusV2(0x5b,,100000,,"\\_SB.I2C",,,,,RawDataBuffer(){2,9})),
AccessAs(BufferAcc, AttribByte),
TM1, 8 //TM1 at command value offset 0
}