概念
SPMI 是一根总线,最多可有 4 个 控制器设备可与多达十六个目标设备通信 完成不同的电源管理任务。每个控制器和目标设备都有一个最多 16 位的地址空间,由 8 位寄存器组成,其功能由硬件供应商定义。
虽然该 API 不属于 SPMI 规范,但某些目标设备 功能可以进一步划分为子目标设备, 目标地址空间的视图对设备进行逻辑隔离 函数还可以使它们的软件驱动程序分开。
编写 SPMI 客户端驱动程序
是否可以在客户端驱动程序中使用 SPMI,取决于您打算使用的设备是目标设备还是子目标设备。在任何一种情况下,要使用的 FIDL 协议都是 fuchsia.hardware.spmi.Device。
目标设备
首先更新板驱动程序,以便 SPMI 控制器驱动程序添加一个用于 您的目标。在设备树平台上,这将涉及添加一个新节点, 以:
#include "sdk/lib/driver/devicetree/visitors/drivers/spmi-controllers/spmi/spmi.h"
spmi@0xffff0000 {
/* The new node is below */
$TARGET_DEVICE_TYPE@$TARGET_ID {
reg = <$TARGET_ID SPMI_USID>;
reg-names = "$TARGET_NAME";
};
};
您的驱动程序应连接到 fuchsia.hardware.spmi.TargetService,并在其组件清单中包含相应条目。SPMI 控制器驱动程序将为您的目标添加一个节点,并附带以下绑定属性:
属性 | 可选 | 用途 |
---|---|---|
fuchsia.hardware.spmi.TargetService |
否 | SPMI 目标服务。 |
fuchsia.spmi.TARGET_ID |
否 | SPMI 目标 ID。 |
fuchsia.spmi.TARGET_NAME |
是 | 目标的字符串名称。在设备树平台上,此值由目标节点的 reg-names 属性生成。 |
子目标设备
首先更新开发板驱动程序,以便 SPMI 控制器驱动程序为您的子目标添加节点。在设备树平台上,这包括添加一个新节点 例如:
#include "sdk/lib/driver/devicetree/visitors/drivers/spmi-controllers/spmi/spmi.h"
spmi@0xffff0000 {
$TARGET_DEVICE_TYPE@$TARGET_ID {
reg = <$TARGET_ID SPMI_USID>;
reg-names = "$TARGET_NAME";
/* Your driver's node is below */
$SUB_TARGET_DEVICE_TYPE@$SUB_TARGET_ADDRESS {
compatible = "$COMPATIBLE"
reg = <$SUB_TARGET_ADDRESS $SUB_TARGET_SIZE>;
reg-names = "$SUB_TARGET_NAME";
};
};
};
如果您的驱动程序节点必须是某个其他总线的子级,您还可以使用 spmis
引用属性访问子目标。例如:
#include "sdk/lib/driver/devicetree/visitors/drivers/spmi-controllers/spmi/spmi.h"
$BUS@0xffff1000 {
/* Your driver's node is below */
$BUS_CHILD {
compatible = "$COMPATIBLE"
spmis = <&$SUB_TARGET_LABEL>;
};
};
spmi@0xffff0000 {
$TARGET_DEVICE_TYPE@$TARGET_ID {
reg = <$TARGET_ID SPMI_USID>;
reg-names = "$TARGET_NAME";
/* This is the sub-target your driver can access */
$SUB_TARGET_LABEL: $SUB_TARGET_DEVICE_TYPE@$SUB_TARGET_ADDRESS {
reg = <$SUB_TARGET_ADDRESS $SUB_TARGET_SIZE>;
reg-names = "$SUB_TARGET_NAME";
};
};
};
司机应连接到 fuchsia.hardware.spmi.SubTargetService 其组件清单SPMI 控制器驱动程序将为您的子目标或引用属性添加一个节点,并附加以下绑定属性:
属性 | 可选 | 用途 |
---|---|---|
fuchsia.hardware.spmi.SubTargetService |
否 | SPMI 子目标服务。 |
fuchsia.spmi.TARGET_ID |
否 | 包含此子目标的定位条件的 ID。 |
fuchsia.spmi.TARGET_NAME |
是 | 包含此子目标的目标的字符串名称。在设备树平台上,此值由目标节点的 reg-names 属性生成。 |
fuchsia.spmi.SUB_TARGET_ADDRESS |
否 | 目标内此子目标的起始地址。 |
fuchsia.spmi.SUB_TARGET_NAME |
是 | 子目标的字符串名称。在设备树平台上,此值由子目标节点的 reg-names 属性生成。 |
将通过 fuchsia.hardware.spmi.Device 访问寄存器 映射到子目标的起始地址,且限制为分配的范围 子目标
子目标设备树绑定
SPMI 设备树访问者禁止执行以下操作:
spmis
属性中引用的目标节点- 具有
compatible
属性且在spmis
属性中被引用的子目标节点 - 多个其他节点中的
spmis
属性引用的子目标节点
编写 SPMI 控制器驱动程序
SPMI 控制器驱动程序负责根据从板级驱动程序收到的 fuchsia.hardware.spmi.ControllerInfo 元数据设置子节点。
目标设备
对于 ControllerInfo
中每个没有 sub_targets
的 TargetInfo
,
控制器驱动程序应添加一个子节点,
fuchsia.hardware.spmi.TargetService,它具有以下特征
属性:
属性 | 值 |
---|---|
fuchsia.spmi.CONTROLLER_ID |
ControllerInfo 中的 id (如果已指定) |
fuchsia.spmi.TARGET_ID |
id (在 TargetInfo 中) |
fuchsia.spmi.TARGET_NAME |
TargetInfo 中的 name (如果已指定) |
子目标设备
对于 ControllerInfo
中的每个 TargetInfo
中的每个 SubTargetInfo
,控制器驱动程序应添加一个子节点,该子节点提供 fuchsia.hardware.spmi.SubTargetService 并具有以下属性:
属性 | 值 |
---|---|
fuchsia.spmi.CONTROLLER_ID |
ControllerInfo 中的 id (如果已指定) |
fuchsia.spmi.TARGET_ID |
id (在 TargetInfo 中) |
fuchsia.spmi.TARGET_NAME |
TargetInfo 中的 name (如果已指定) |
fuchsia.spmi.SUB_TARGET_ADDRESS |
address (在 SubTargetInfo 中) |
fuchsia.spmi.SUB_TARGET_NAME |
SubTargetInfo 中的 name (如果已指定) |
控制器驱动程序应将对子目标的寄存器访问限制在 [0, size
) 范围内,并将其偏移 address
。