概念
系統電源管理介面 (SPMI) 是一種匯流排,最多可讓四個控制器裝置與十六個目標裝置通訊,以完成不同的電源管理工作。每個控制器和目標裝置的位址空間最多為 16 位元,由 8 位元暫存器組成,其功能由硬體供應商定義。
雖然並非 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_0 SPMI_USID>, <$TARGET_ID_1 SPMI_USID>;
reg-names = "$TARGET_NAME_0", "$TARGET_NAME_1";
};
};
一個目標可以有多個 reg 項目 (最多 16 個),因此單一裝置樹狀結構節點可以代表多個 SPMI 目標 (SID)。
驅動程式應連線至 fuchsia.hardware.spmi.TargetService,並在元件資訊清單中加入該項目的項目。SPMI 控制器驅動程式庫會為每個目標新增節點。SPMI 訪客會為裝置產生複合節點規格,並為每個目標設定父項,且每個父項都會使用下列繫結屬性:
| 屬性 | 選用 | 目的 |
|---|---|---|
fuchsia.hardware.spmi.TargetService |
否 | SPMI 目標服務。 |
fuchsia.spmi.TARGET_ID |
否 | SPMI 目標 ID。 |
fuchsia.spmi.TARGET_NAME |
Y | 目標的字串名稱。在裝置樹狀結構平台,這是從目標節點的 reg-names 屬性產生。如果定義多個目標,系統會使用 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 |
Y | 包含這個子目標的目標字串名稱。在裝置樹狀結構平台中,這是從目標節點的 reg-names 屬性產生。 |
fuchsia.spmi.SUB_TARGET_ADDRESS |
否 | 目標中這個子目標的起始位址。 |
fuchsia.spmi.SUB_TARGET_NAME |
Y | 子目標的字串名稱。在裝置樹狀結構平台,這是從子目標節點的 reg-names 屬性產生。 |
透過 fuchsia.hardware.spmi.Device 註冊的存取權會對應至子目標的起始位址,且僅限於指派給子目標的範圍。
子目標和父項目標都可以有多個 reg 項目,但不能同時使用:有多個 SID 的父項目標不得有子目標。如果父項目標有子目標,則必須只有一個 SID,但子目標本身仍可有多個 reg 項目 (區域)。
子目標裝置樹狀結構繫結
SPMI 裝置樹狀結構訪客禁止下列事項:
spmis屬性中參照的目標節點- 具有
compatible屬性,且在spmis屬性中參照的子目標節點 - 多個其他節點中的
spmis屬性參照的子目標節點
編寫 SPMI 控制器驅動程式庫
SPMI 控制器驅動程式負責根據從主機板驅動程式庫收到的 fuchsia.hardware.spmi.ControllerInfo 中繼資料,設定子節點。
目標裝置
對於 ControllerInfo 中沒有 sub_targets 的每個 TargetInfo,控制器驅動程式庫應新增提供 fuchsia.hardware.spmi.TargetService 的子項節點,並具有下列屬性:
| 屬性 | 值 |
|---|---|
fuchsia.spmi.CONTROLLER_ID |
id (如已指定)ControllerInfo |
fuchsia.spmi.TARGET_ID |
TargetInfo 的 id |
fuchsia.spmi.TARGET_NAME |
name (如已指定)TargetInfo |
子目標裝置
針對 ControllerInfo 中每個 TargetInfo 的每個 SubTargetInfo,控制器驅動程式庫應新增提供 fuchsia.hardware.spmi.SubTargetService 的子節點,並具備下列屬性:
| 屬性 | 值 |
|---|---|
fuchsia.spmi.CONTROLLER_ID |
id (如已指定)ControllerInfo |
fuchsia.spmi.TARGET_ID |
TargetInfo 的 id |
fuchsia.spmi.TARGET_NAME |
name (如果已指定) 中的 TargetInfo |
fuchsia.spmi.SUB_TARGET_ADDRESS |
SubTargetInfo 的 address |
fuchsia.spmi.SUB_TARGET_NAME |
name (如已指定)SubTargetInfo |
控制器驅動程式庫應將子目標的暫存器存取權限制在 [0, size) 範圍內,並以 address 偏移。