概念
系統電源管理介面 (SPMI) 是一種匯流排,最多可讓四個控制器裝置與最多十六個目標裝置通訊,以便執行不同的電源管理工作。每個控制器和目標裝置都有最多 16 位元的位址空間,由 8 位元登錄器組成,其功能由硬體供應商定義。
雖然這並非 SPMI 規格規定,但部分具有多種功能的目標裝置可進一步劃分為子目標裝置,這些子目標裝置可在目標的位址空間中提供有限的檢視畫面。將裝置以邏輯方式區隔開來 函式也允許軟體驅動程式彼此獨立。
編寫 SPMI 用戶端驅動程式
從用戶端驅動程式使用 SPMI 取決於您要使用的裝置是目標還是子目標。無論是哪一種情況,都應使用 fuchsia.hardware.spmi.Device 這個 FIDL 通訊協定。
目標裝置
請先更新電路板驅動程式,讓 SPMI 控制器驅動程式為目標新增節點。在 devicetree 平台上,您需要新增一個 為:
#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 控制器驅動程式庫,讓 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 |
是 | 子目標的字串名稱。在 devicetree 平台上,這會根據子目標節點的 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 |
TargetInfo 的 id |
fuchsia.spmi.TARGET_NAME |
TargetInfo 中的 name (如有指定) |
子目標裝置
針對 ControllerInfo
中每個 TargetInfo
中的每個 SubTargetInfo
,
控制器驅動程式庫應新增
fuchsia.hardware.spmi.SubTargetService 具備下列條件:
資源:
資源 | 值 |
---|---|
fuchsia.spmi.CONTROLLER_ID |
ControllerInfo 中的 id (如有指定) |
fuchsia.spmi.TARGET_ID |
TargetInfo 的 id |
fuchsia.spmi.TARGET_NAME |
TargetInfo 中的 name (如有指定) |
fuchsia.spmi.SUB_TARGET_ADDRESS |
SubTargetInfo 的 address |
fuchsia.spmi.SUB_TARGET_NAME |
SubTargetInfo 中的 name (如果已指定) |
控制器驅動程式庫應將註冊存取限制為子目標
範圍 [0, size
) 並由 address
偏移。