I3C 裝置驅動 API

enum i3c_error_code

I3C 錯誤程式碼

常量

I3C_ERROR_UNKNOWN

未知錯誤,通常表示該錯誤與 I3C 無關

I3C_ERROR_M0

M0 錯誤

I3C_ERROR_M1

M1 錯誤

I3C_ERROR_M2

M2 錯誤

描述

這些是由 I3C 規範定義的標準錯誤程式碼。當 i3c_device_do_priv_xfers() 或 i3c_device_send_hdr_cmds() 返回 -EIO 時,可以檢查 struct_i3c_priv_xfer.errstruct i3c_hdr_cmd.err 中的錯誤程式碼,以更好地瞭解出錯的原因。

enum i3c_hdr_mode

HDR 模式 ID

常量

I3C_HDR_DDR

DDR 模式

I3C_HDR_TSP

TSP 模式

I3C_HDR_TSL

TSL 模式

struct i3c_priv_xfer

I3C SDR 私有傳輸

定義:

struct i3c_priv_xfer {
    u8 rnw;
    u16 len;
    u16 actual_len;
    union {
        void *in;
        const void *out;
    } data;
    enum i3c_error_code err;
};

成員

rnw

編碼傳輸方向。 true 表示讀取,false 表示寫入

len

傳輸的位元組長度

actual_len

控制器傳輸的實際位元組長度

data

輸入/輸出緩衝區

data.in

輸入緩衝區。 必須指向 DMA 可用的緩衝區

data.out

輸出緩衝區。 必須指向 DMA 可用的緩衝區

err

I3C 錯誤程式碼

enum i3c_dcr

I3C DCR 值

常量

I3C_DCR_GENERIC_DEVICE

通用 I3C 裝置

struct i3c_device_info

I3C 裝置資訊

定義:

struct i3c_device_info {
    u64 pid;
    u8 bcr;
    u8 dcr;
    u8 static_addr;
    u8 dyn_addr;
    u8 hdr_cap;
    u8 max_read_ds;
    u8 max_write_ds;
    u8 max_ibi_len;
    u32 max_read_turnaround;
    u16 max_read_len;
    u16 max_write_len;
};

成員

pid

配置 ID

bcr

匯流排特性暫存器

dcr

裝置特性暫存器

static_addr

靜態/I2C 地址

dyn_addr

動態地址

hdr_cap

支援的 HDR 模式

max_read_ds

最大讀取速度資訊

max_write_ds

最大寫入速度資訊

max_ibi_len

最大 IBI 負載長度

max_read_turnaround

最大讀取週轉時間(微秒)

max_read_len

最大私有 SDR 讀取長度(位元組)

max_write_len

最大私有 SDR 寫入長度(位元組)

描述

這些都是 I3C 裝置應該通告的基本資訊。其中一些是可選的,具體取決於裝置型別和裝置功能。對於附加到具有 i3c_master_add_i3c_dev_locked() 的主裝置的每個 I3C 從裝置,核心將傳送相關的 CCC 命令來檢索這些資料。

struct i3c_driver

I3C 裝置驅動程式

定義:

struct i3c_driver {
    struct device_driver driver;
    int (*probe)(struct i3c_device *dev);
    void (*remove)(struct i3c_device *dev);
    const struct i3c_device_id *id_table;
};

成員

driver

繼承自 device_driver

probe

I3C 裝置探測方法

remove

I3C 裝置移除方法

id_table

I3C 裝置匹配表。框架將使用它來決定將哪個裝置繫結到此驅動程式

dev_to_i3cdev

dev_to_i3cdev (__dev)

返回包含 dev 的 I3C 裝置

引數

__dev

裝置物件

返回

指向 I3C 裝置物件的指標。

module_i3c_driver

module_i3c_driver (__drv)

註冊一個提供 I3C 驅動程式的模組

引數

__drv

要註冊的 I3C 驅動程式

描述

提供通用的 init/exit 函式,它們只是註冊/登出 I3C 驅動程式。任何不需要額外 init/cleanup 步驟的驅動程式都應該使用它。

int i3c_i2c_driver_register(struct i3c_driver *i3cdrv, struct i2c_driver *i2cdrv)

註冊一個 i2c 和一個 i3c 驅動程式

引數

struct i3c_driver *i3cdrv

要註冊的 I3C 驅動程式

struct i2c_driver *i2cdrv

要註冊的 I2C 驅動程式

描述

此函式註冊 i2cdevi3cdev,如果其中一個註冊失敗,則失敗。這主要適用於支援 I2C 和 I3C 模式的裝置。請注意,當未啟用 CONFIG_I3C 時,此函式僅註冊 I2C 驅動程式。

返回

如果兩個註冊都成功,則為 0,否則為負錯誤程式碼。

void i3c_i2c_driver_unregister(struct i3c_driver *i3cdrv, struct i2c_driver *i2cdrv)

登出一個 i2c 和一個 i3c 驅動程式

引數

struct i3c_driver *i3cdrv

要註冊的 I3C 驅動程式

struct i2c_driver *i2cdrv

要註冊的 I2C 驅動程式

描述

此函式登出 i3cdrvi2cdrv。請注意,當未啟用 CONFIG_I3C 時,此函式僅登出 i2cdrv

module_i3c_i2c_driver

module_i3c_i2c_driver (__i3cdrv, __i2cdrv)

註冊一個提供 I3C 和 I2C 驅動程式的模組

引數

__i3cdrv

要註冊的 I3C 驅動程式

__i2cdrv

要註冊的 I2C 驅動程式

描述

提供通用的 init/exit 函式,它們只是註冊/登出 I3C 和 I2C 驅動程式。即使停用 CONFIG_I3C,也可以使用此宏,在這種情況下,只會註冊 I2C 驅動程式。任何不需要額外 init/cleanup 步驟的驅動程式都應該使用它。

struct i3c_ibi_setup

IBI 設定物件

定義:

struct i3c_ibi_setup {
    unsigned int max_payload_len;
    unsigned int num_slots;
    void (*handler)(struct i3c_device *dev, const struct i3c_ibi_payload *payload);
};

成員

max_payload_len

與 IBI 關聯的負載的最大長度。 如果一個 IBI 的負載大於此數字,則該 IBI 將被拒絕。

num_slots

預分配的 IBI 插槽數。 應該選擇此值,以使系統永遠不會耗盡 IBI 插槽,否則您將丟失 IBI。

handler

IBI 處理程式,每次收到 IBI 時都會呼叫。 此處理程式在工作佇列上下文中呼叫。 允許它休眠並在總線上傳送新訊息,但建議儘可能快地完成在那裡進行的處理,以避免延遲處理同一工作佇列中排隊的其他 IBI。

描述

用於將資訊傳遞給 i3c_device_request_ibi() 的臨時結構。 此物件可以在堆疊上分配,因為 i3c_device_request_ibi() 複製每一位資訊,並且在 i3c_device_request_ibi() 返回後不再使用它。

int i3c_device_do_priv_xfers(struct i3c_device *dev, struct i3c_priv_xfer *xfers, int nxfers)

執行定向到特定裝置的 I3C SDR 私有傳輸

引數

struct i3c_device *dev

應進行傳輸的裝置

struct i3c_priv_xfer *xfers

傳輸陣列

int nxfers

傳輸次數

描述

啟動與 dev 的一個或多個私有 SDR 傳輸。

此函式可以休眠,因此不能在原子上下文中呼叫。

返回

成功時為 0,否則為負錯誤核心。
-EAGAIN:控制器丟失地址仲裁。目標

(IBI、HJ 或控制器角色請求)贏得匯流排。客戶端驅動程式需要在稍後重新發送“xfers”。請參閱 I3C 規範 ver 1.1.1 09-Jun-2021。第:5.1.2.2.3 節。

int i3c_device_do_setdasa(struct i3c_device *dev)

使用靜態地址進行 I3C 動態地址分配

引數

struct i3c_device *dev

應進行 DAA 的裝置

返回

成功時為 0,否則為負錯誤核心。

void i3c_device_get_info(const struct i3c_device *dev, struct i3c_device_info *info)

獲取 I3C 裝置資訊

引數

const struct i3c_device *dev

我們想要獲取資訊的裝置

struct i3c_device_info *info

要填充的資訊物件

描述

檢索 I3C 裝置資訊。

int i3c_device_disable_ibi(struct i3c_device *dev)

停用來自特定裝置的 IBI

引數

struct i3c_device *dev

應停用 IBI 的裝置

描述

此函式停用來自特定裝置的 IBI,並等待處理所有掛起的 IBI。

返回

成功時為 0,否則為負錯誤核心。

int i3c_device_enable_ibi(struct i3c_device *dev)

啟用來自特定裝置的 IBI

引數

struct i3c_device *dev

應啟用 IBI 的裝置

描述

此函式啟用來自特定裝置的 IBI,並等待處理所有掛起的 IBI。 應該在 i3c_device_request_ibi() 成功的裝置上呼叫此函式。

請注意,可能在此函式返回到其呼叫方之前收到來自此裝置的 IBI。

返回

成功時為 0,否則為負錯誤核心。

int i3c_device_request_ibi(struct i3c_device *dev, const struct i3c_ibi_setup *req)

請求 IBI

引數

struct i3c_device *dev

我們應為其啟用 IBI 的裝置

const struct i3c_ibi_setup *req

為此 IBI 請求的設定

描述

此函式負責預先分配處理來自 dev 的 IBI 所需的所有資源。 當此函式返回時,在呼叫 i3c_device_enable_ibi() 之前,IBI 不會被啟用。

返回

成功時為 0,否則為負錯誤核心。

void i3c_device_free_ibi(struct i3c_device *dev)

釋放 IBI 處理所需的所有資源

引數

struct i3c_device *dev

您要釋放 IBI 資源的裝置

描述

此函式負責釋放先前由 i3c_device_request_ibi() 分配的資源。 應該在使用 i3c_device_disable_ibi() 停用 IBI 後呼叫此函式。

struct device *i3cdev_to_dev(struct i3c_device *i3cdev)

返回嵌入在 i3cdev 中的裝置

引數

struct i3c_device *i3cdev

I3C 裝置

返回

指向裝置物件的指標。

const struct i3c_device_id *i3c_device_match_id(struct i3c_device *i3cdev, const struct i3c_device_id *id_table)

返回與 i3cdev 匹配的 i3c_device_id 條目

引數

struct i3c_device *i3cdev

I3C 裝置

const struct i3c_device_id *id_table

I3C 裝置匹配表

返回

指向 i3c_device_id 物件的指標,如果沒有匹配項,則為 NULL。

int i3c_driver_register_with_owner(struct i3c_driver *drv, struct module *owner)

註冊一個 I3C 裝置驅動程式

引數

struct i3c_driver *drv

要註冊的驅動程式

struct module *owner

擁有此驅動程式的模組

描述

向核心註冊 drv

返回

成功時為 0,否則為負錯誤核心。

void i3c_driver_unregister(struct i3c_driver *drv)

登出一個 I3C 裝置驅動程式

引數

struct i3c_driver *drv

要登出的驅動程式

描述

登出 drv