SPMI 總覽

概念

系統電源管理介面 (SPMI) 可容納最多四個 控制器裝置最多可與 16 個目標裝置通訊 完成不同的電源管理工作每個控制器和目標裝置 擁有高達 16 位元的位址空間,由 8 位元暫存器組成 其中有由硬體供應商定義的

雖然不屬於 SPMI 的規格,但一些目標裝置 還可進一步細分為子目標裝置 實現目標的位址空間邏輯上分隔裝置函式,可讓裝置的軟體驅動程式也分開。

編寫 SPMI 用戶端驅動程式庫

能否使用用戶端驅動程式庫的 SPMI,取決於您打算使用的裝置 是目標或子目標無論是哪一種情況,都應使用 fuchsia.hardware.spmi.Device 這個 FIDL 通訊協定。

目標裝置

請先更新電路板驅動程式,讓 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 目標的字串名稱。在 devicetree 平台上,這會根據目標節點的 reg-names 屬性產生。

子目標裝置

請先更新電路板驅動程式,讓 SPMI 控制器驅動程式為子目標新增節點。在 devicetree 平台上,您需要新增節點 例如:

#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 包含此子目標的目標的字串名稱。在 devicetree 平台上,這會根據目標節點的 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 TargetInfoid
fuchsia.spmi.TARGET_NAME TargetInfo 中的 name (如果已指定)

子目標裝置

針對 ControllerInfo 中每個 TargetInfo 中的每個 SubTargetInfo, 控制器驅動程式庫應新增 fuchsia.hardware.spmi.SubTargetService 具備下列條件: 資源:

資源
fuchsia.spmi.CONTROLLER_ID ControllerInfo 中的 id (如果已指定)
fuchsia.spmi.TARGET_ID TargetInfoid
fuchsia.spmi.TARGET_NAME TargetInfo 中的 name (如果已指定)
fuchsia.spmi.SUB_TARGET_ADDRESS SubTargetInfoaddress
fuchsia.spmi.SUB_TARGET_NAME SubTargetInfo 中的 name (如果已指定)

控制器驅動程式應將子目標的註冊存取權限制在 [0, size) 範圍內,並以 address 偏移。

資源