Linux 核心 SLIMbus 支援

概述

什麼是 SLIMbus?

SLIMbus (Serial Low Power Interchip Media Bus) 是由 MIPI (Mobile Industry Processor Interface) 聯盟開發的一種規範。該匯流排採用主/從配置,是一種 2 線多點實現(時鐘和資料)。

目前,SLIMbus 用於 SoC(System-on-Chip,片上系統)的應用處理器和外圍元件(通常是編解碼器)之間的介面。SLIMbus 使用時分複用 (Time-Division-Multiplexing) 來容納多個數據通道和一個控制通道。

控制通道用於各種控制功能,如匯流排管理、配置和狀態更新。這些訊息可以是單播(例如讀取/寫入裝置特定值),也可以是多播(例如資料通道重新配置序列是向所有裝置廣播的訊息)

資料通道用於 2 個 SLIMbus 裝置之間的資料傳輸。資料通道使用裝置上的專用埠。

硬體描述:

SLIMbus 規範根據裝置功能有不同型別的裝置分類。管理器裝置負責列舉、配置和動態通道分配。每個匯流排有 1 個活動的管理器。

通用裝置是提供應用功能(例如編解碼器)的裝置。

幀器裝置負責為匯流排提供時鐘,並在總線上傳送幀同步和幀資訊。

每個 SLIMbus 元件都有一個介面裝置用於監控物理層。

通常,每個 SoC 包含一個 SLIMbus 元件,該元件具有 1 個管理器、1 個幀器裝置、1 個通用裝置(用於資料通道支援)和 1 個介面裝置。外部外圍 SLIMbus 元件通常具有 1 個通用裝置(用於功能/資料通道支援)和相關的介面裝置。通用裝置的暫存器被對映為“值元素”,因此可以使用 SLIMbus 控制通道讀寫它們,以交換控制/狀態型別的資訊。如果同一總線上有多個幀器裝置,則管理器裝置負責選擇活動幀器為匯流排提供時鐘。

根據規範,SLIMbus 使用“時鐘齒輪”根據當前頻率和頻寬要求進行電源管理。共有 10 個時鐘齒輪,每個齒輪將 SLIMbus 頻率更改為前一個齒輪的兩倍。

每個裝置都有一個 6 位元組的列舉地址,管理器在裝置報告存在於總線上後為每個裝置分配一個 1 位元組的邏輯地址。

軟體描述:

SLIMbus 驅動程式有兩種型別

slim_controller 代表 SLIMbus 的“控制器”。此驅動程式應實現 SoC 所需的職責(管理器裝置、用於監控層並報告錯誤的關聯介面裝置、預設幀器裝置)。

slim_device 代表 SLIMbus 的“通用裝置/元件”,slim_driver 應實現該 slim_device 的驅動程式。

裝置向驅動程式的通知:

由於 SLIMbus 裝置具有報告其存在的機制,因此當相應的裝置報告存在於總線上時,框架允許驅動程式繫結。但是,驅動程式可能需要首先探測,以便它可以啟用相應的 SLIMbus 裝置(例如,上電和/或使其脫離復位)。為了支援這種行為,框架也允許驅動程式首先探測(例如,使用標準 DeviceTree 相容性欄位)。這使得驅動程式有必要知道裝置何時功能正常(即報告存在)。當裝置報告存在並由控制器分配邏輯地址時,device_up 回撥就是為此目的而使用的。

同樣,SLIMbus 裝置在關閉時會“報告不存在”。當裝置報告不存在並且其邏輯地址分配被控制器失效時,device_down 回撥會通知驅動程式。

另一個通知“boot_device”用於在控制器復位匯流排時通知 slim_driver。此通知允許驅動程式採取必要步驟啟動裝置,以便在匯流排復位後其功能正常。

驅動程式和控制器 API:

struct slim_eaddr

SLIMbus 裝置的列舉地址

定義:

struct slim_eaddr {
    u8 instance;
    u8 dev_index;
    u16 prod_code;
    u16 manf_id;
};

成員

例項

例項值

裝置索引

裝置索引

產品程式碼

產品程式碼

製造商 ID

裝置的製造商 ID

enum slim_device_status

slim 裝置狀態

常量

SLIM_DEVICE_STATUS_DOWN

Slim 裝置不存在或尚未報告。

SLIM_DEVICE_STATUS_UP

Slim 裝置已在總線上宣佈。

SLIM_DEVICE_STATUS_RESERVED

保留供將來使用。

struct slim_device

Slim 裝置控制代碼。

定義:

struct slim_device {
    struct device           dev;
    struct slim_eaddr       e_addr;
    struct slim_controller  *ctrl;
    enum slim_device_status status;
    u8 laddr;
    bool is_laddr_valid;
    struct list_head        stream_list;
    spinlock_t stream_list_lock;
};

成員

裝置

裝置的驅動程式模型表示。

e_addr

此裝置的列舉地址。

ctrl

slim 控制器例項。

狀態

slim 裝置狀態

laddr

此裝置的 1 位元組邏輯地址。

is_laddr_valid

指示 laddr 是否有效

stream_list

此裝置上的流列表

stream_list_lock

保護流列表的鎖

描述

這是 SLIMbus 設備註冊到控制器時返回的客戶端/裝置控制代碼。客戶端驅動程式將指向此結構的指標用作控制代碼。

struct slim_driver

SLIMbus “通用裝置”(從屬)裝置驅動程式(類似於 SPI 上的 “spi_device”)

定義:

struct slim_driver {
    int (*probe)(struct slim_device *sl);
    void (*remove)(struct slim_device *sl);
    void (*shutdown)(struct slim_device *sl);
    int (*device_status)(struct slim_device *sl, enum slim_device_status s);
    struct device_driver            driver;
    const struct slim_device_id     *id_table;
};

成員

探測

將此驅動程式繫結到 SLIMbus 裝置。

移除

從 SLIMbus 裝置解除此驅動程式的繫結。

關閉

在關機/停止期間使用的標準關閉回撥。

裝置狀態

當裝置報告存在並獲得分配的 laddr 時,或者當裝置報告不存在或匯流排關閉時,將呼叫此回撥。

驅動程式

SLIMbus 裝置驅動程式應初始化此結構的名稱和所有者欄位

id_table

此驅動程式支援的 SLIMbus 裝置列表

struct slim_val_inf

Slimbus 值或資訊元素

定義:

struct slim_val_inf {
    u16 start_offset;
    u8 num_bytes;
    u8 *rbuf;
    const u8                *wbuf;
    struct completion      *comp;
};

成員

start_offset

指定資訊/值元素對映中的起始偏移量

num_bytes

最大 16。這確保訊息將符合 SLIMbus 規範的切片大小

rbuf

讀取值的緩衝區

wbuf

寫入緩衝區

comp

非同步操作的完成,僅當事務需要 TID 時有效,例如 REQUEST 操作。其餘事務無論如何都是同步的。

struct slim_stream_config

SLIMbus 流配置流的配置在音訊驅動程式的 hw_params 或 prepare 呼叫中完成,其中它們具有所有必需的關於速率、通道數等資訊。通道和埠之間存在 1:1 的對映。

定義:

struct slim_stream_config {
    unsigned int rate;
    unsigned int bps;
    unsigned int ch_count;
    unsigned int *chs;
    unsigned long port_mask;
    int direction;
};

成員

速率

資料速率

bps

每個資料樣本的位數

ch_count

通道數

chs

指向通道號列表的指標

port_mask

用於此流的埠掩碼

方向

流的方向,SNDRV_PCM_STREAM_PLAYBACKSNDRV_PCM_STREAM_CAPTURE

module_slim_driver

module_slim_driver (__slim_driver)

註冊 SLIMbus 驅動程式的輔助宏

引數

__slim_driver

slimbus_driver 結構

描述

適用於在模組初始化/退出中不做任何特殊操作的 SLIMbus 驅動程式的輔助宏。這消除了許多樣板程式碼。每個模組只能使用此宏一次,並且呼叫它會替換 module_init()module_exit()

struct slim_framer

表示 SLIMbus 幀器。每個控制器可能有多個幀器。有一個活動的幀器裝置負責為匯流排提供時鐘。管理器負責幀器切換。

定義:

struct slim_framer {
    struct device           dev;
    struct slim_eaddr       e_addr;
    int rootfreq;
    int superfreq;
};

成員

裝置

裝置的驅動程式模型表示。

e_addr

幀器的列舉地址。

rootfreq

幀器可以執行的根頻率。這是匯流排可以執行的最大頻率(“時鐘齒輪 10”)。

superfreq

每根頻率的超幀。每個幀為 6144 位。

struct slim_msg_txn

由控制器傳送的訊息。此結構包含資料包頭、負載和要填充的緩衝區(如果有)

定義:

struct slim_msg_txn {
    u8 rl;
    u8 mt;
    u8 mc;
    u8 dt;
    u16 ec;
    u8 tid;
    u8 la;
    struct slim_val_inf     *msg;
    struct completion      *comp;
};

成員

rl

報頭欄位。剩餘長度。

mt

報頭欄位。訊息型別。

mc

報頭欄位。LSB 是型別 mt 的訊息程式碼。

dt

報頭欄位。目標型別。

ec

元素程式碼。用於元素訪問 API。

tid

事務 ID。用於需要響應的訊息。(與涉及讀取操作的訊息程式碼相關)

la

此訊息的目標裝置的邏輯地址。(當目標型別為廣播時未使用。)

訊息

要讀取/寫入的元素訪問訊息

comp

如果讀/寫是同步的,則完成,內部用於基於 tid 的事務。

enum slim_clk_state

SLIMbus 控制器內部用於維護當前時鐘狀態的時鐘狀態。

常量

SLIM_CLK_ACTIVE

SLIMbus 時鐘處於活動狀態

SLIM_CLK_ENTERING_PAUSE

SLIMbus 時鐘暫停序列正在總線上傳送。如果成功,狀態變為 SLIM_CLK_PAUSED。如果轉換失敗,狀態返回 SLIM_CLK_ACTIVE

SLIM_CLK_PAUSED

SLIMbus 控制器時鐘已暫停。

struct slim_sched

框架內部使用此結構進行排程。

定義:

struct slim_sched {
    enum slim_clk_state     clk_state;
    struct completion       pause_comp;
    struct mutex            m_reconf;
};

成員

clk_state

控制器的時鐘狀態,來自 enum slim_clk_state

pause_comp

訊號時鐘暫停序列完成。當客戶端嘗試在控制器進入時鐘暫停時呼叫 SLIMbus 事務時,這很有用。

m_reconf

此互斥鎖在當前重新配置(資料通道排程、訊息頻寬預留)完成之前一直保持。當此互斥鎖被持有時,訊息 API 可以併發使用匯流排,因為當重新配置正在進行時,元素訪問訊息可以在總線上傳送。

enum slim_port_direction

SLIMbus 埠方向

常量

SLIM_PORT_SINK

SLIMbus 埠是接收端

SLIM_PORT_SOURCE

SLIMbus 埠是傳送端

enum slim_port_state

根據 SLIMbus 規範 2.0 的 SLIMbus 埠/端點狀態機

常量

SLIM_PORT_DISCONNECTED

SLIMbus 埠已斷開,在 DISCONNECT_PORT 或 REMOVE_CHANNEL 核心命令後從未配置/已配置狀態進入

SLIM_PORT_UNCONFIGURED

SLIMbus 埠處於未配置狀態。在 CONNECT_SOURCE/SINK 核心命令後從斷開狀態進入

SLIM_PORT_CONFIGURED

SLIMbus 埠處於已配置狀態。在 DEFINE_CHANNEL、DEFINE_CONTENT 和 ACTIVATE_CHANNEL 核心命令後從未配置狀態進入。準備好進行資料傳輸。

enum slim_channel_state

核心使用的 SLIMbus 通道狀態機。

常量

SLIM_CH_STATE_DISCONNECTED

SLIMbus 通道已斷開

SLIM_CH_STATE_ALLOCATED

SLIMbus 通道已分配

SLIM_CH_STATE_ASSOCIATED

SLIMbus 通道與埠關聯

SLIM_CH_STATE_DEFINED

SLIMbus 通道引數已定義

SLIM_CH_STATE_CONTENT_DEFINED

SLIMbus 通道內容已定義

SLIM_CH_STATE_ACTIVE

SLIMbus 通道處於活動狀態並準備好傳輸資料

SLIM_CH_STATE_REMOVED

SLIMbus 通道不活動並已移除

enum slim_ch_data_fmt

根據 SLIMbus 規範 1.01.01 表 60 的 SLIMbus 通道資料型別識別符號

常量

SLIM_CH_DATA_FMT_NOT_DEFINED

未定義

SLIM_CH_DATA_FMT_LPCM_AUDIO

LPCM 音訊

SLIM_CH_DATA_FMT_IEC61937_COMP_AUDIO

IEC61937 壓縮音訊

SLIM_CH_DATA_FMT_PACKED_PDM_AUDIO

打包 PDM 音訊

enum slim_ch_aux_bit_fmt

根據 SLIMbus 規範 2.0 表 63 的 SLIMbus 通道輔助欄位格式 ID

常量

SLIM_CH_AUX_FMT_NOT_APPLICABLE

未定義

SLIM_CH_AUX_FMT_ZCUV_TUNNEL_IEC60958

用於隧道 IEC60958 的 ZCUV

SLIM_CH_AUX_FMT_USER_DEFINED

使用者定義

struct slim_channel

SLIMbus 通道,用於狀態機

定義:

struct slim_channel {
    int id;
    int prrate;
    int seg_dist;
    enum slim_ch_data_fmt data_fmt;
    enum slim_ch_aux_bit_fmt aux_fmt;
    enum slim_channel_state state;
};

成員

id

通道 ID

prrate

SLIMbus 2.0 規範表 66 的通道存在率

seg_dist

SLIMbus 2.0 規範表 20 的段分佈程式碼

data_fmt

通道的資料格式。

aux_fmt

此通道的輔助格式。

狀態

通道狀態機

struct slim_port

SLIMbus 埠

定義:

struct slim_port {
    int id;
    enum slim_port_direction direction;
    enum slim_port_state state;
    struct slim_channel ch;
};

成員

id

埠 ID

方向

埠方向,源或匯。

狀態

埠的狀態機。

ch

與此埠關聯的通道。

enum slim_transport_protocol

SLIMbus 2.0 規範表 47 中的 SLIMbus 傳輸協議列表。

常量

SLIM_PROTO_ISO

等時協議,無流控制,因為資料速率與通道速率流控制嵌入在資料中。

SLIM_PROTO_PUSH

推式協議,包括流控制,用於傳輸速率等於或低於通道速率的資料。

SLIM_PROTO_PULL

拉式協議,與推式協議用法相似,但拉式是單播。

SLIM_PROTO_LOCKED

鎖定協議

SLIM_PROTO_ASYNC_SMPLX

非同步協議-單工

SLIM_PROTO_ASYNC_HALF_DUP

非同步協議-半雙工

SLIM_PROTO_EXT_SMPLX

擴充套件非同步協議-單工

SLIM_PROTO_EXT_HALF_DUP

擴充套件非同步協議-半雙工

struct slim_stream_runtime

SLIMbus 流執行時例項

定義:

struct slim_stream_runtime {
    const char *name;
    struct slim_device *dev;
    int direction;
    enum slim_transport_protocol prot;
    unsigned int rate;
    unsigned int bps;
    unsigned int ratem;
    int num_ports;
    struct slim_port *ports;
    struct list_head node;
};

成員

名稱

流的名稱

裝置

與此流關聯的 SLIM 裝置例項

方向

流向

prot

此流中使用的傳輸協議

速率

樣本資料速率 *

bps

每樣本位數

ratem

速率乘數,即超幀速率/資料速率

num_ports

埠數量

ports

指向埠例項的指標

node

與 slim 裝置關聯的流的列表頭。

struct slim_controller

控制 SLIMbus 的每個例項(類似於 SPI 上的“master”)

定義:

struct slim_controller {
    struct device           *dev;
    unsigned int            id;
    char name[SLIMBUS_NAME_SIZE];
    int min_cg;
    int max_cg;
    int clkgear;
    struct ida              laddr_ida;
    struct slim_framer      *a_framer;
    struct mutex            lock;
    struct list_head        devices;
    struct idr              tid_idr;
    spinlock_t txn_lock;
    struct slim_sched       sched;
    int (*xfer_msg)(struct slim_controller *ctrl, struct slim_msg_txn *tx);
    int (*set_laddr)(struct slim_controller *ctrl, struct slim_eaddr *ea, u8 laddr);
    int (*get_laddr)(struct slim_controller *ctrl, struct slim_eaddr *ea, u8 *laddr);
    int (*enable_stream)(struct slim_stream_runtime *rt);
    int (*disable_stream)(struct slim_stream_runtime *rt);
    int (*wakeup)(struct slim_controller *ctrl);
};

成員

裝置

此驅動程式的裝置介面

id

此控制器/匯流排的板級數字識別符號

名稱

此控制器的名稱

min_cg

此控制器支援的最小時鐘齒輪(預設值:1)

max_cg

此控制器支援的最大時鐘齒輪(預設值:10)

clkgear

此匯流排當前執行的時鐘齒輪

laddr_ida

邏輯地址 ID 分配器

a_framer

由該控制器管理併為匯流排提供時鐘的活動幀器

lock

保護控制器資料結構的互斥鎖

裝置

Slim 裝置列表

tid_idr

tid ID 分配器

txn_lock

保護事務表的鎖

sched

控制器使用的排程器結構

xfer_msg

在此控制器上傳輸訊息(這可以是廣播控制/狀態訊息,如資料通道設定,或單播訊息,如值元素讀/寫。

set_laddr

在 laddr 處為具有元素地址 e_addr 的從屬裝置設定邏輯地址。實現控制器的驅動程式將需要向此裝置傳送帶有其邏輯地址的單播訊息。

get_laddr

控制器可能需要設定固定的邏輯地址表,在這種情況下可以使用 get_laddr,以便控制器可以進行此分配。用例是當主控在遠端處理器端,由其負責分配 laddr。

enable_stream

此函式指標實現控制器特定的啟用流過程。

disable_stream

此函式指標實現控制器特定的停用流過程。

“管理器裝置”負責裝置管理、頻寬分配、通道設定和每通道埠關聯。裝置管理意味著基於裝置的列舉(報告存在、報告不存在)進行邏輯地址分配/移除。頻寬分配由管理器根據總線上的活動通道和 SLIMbus 裝置發出的訊息頻寬請求動態完成。根據當前頻寬使用情況,管理器選擇匯流排執行的頻率(以“時鐘齒輪”步進,1 到 10,每個時鐘齒輪代表前一個齒輪兩倍的頻率)。管理器還負責進入(和退出)低功耗模式(稱為“時鐘暫停”)。如果總線上有多個幀器,並且某個用例需要使用某個幀器以避免保持上一個幀器通電,則管理器可以進行幀器切換。

此處的控制器執行管理器裝置和“介面裝置”的職責。介面裝置負責監控匯流排並報告諸如失同步、資料槽衝突等資訊。

喚醒

此函式指標實現控制器特定的從時鐘暫停喚醒過程。框架將呼叫此函式使控制器脫離時鐘暫停。

int slim_unregister_controller(struct slim_controller *ctrl)

控制器拆卸。

引數

struct slim_controller *ctrl

要拆卸的控制器。

void slim_report_absent(struct slim_device *sbdev)

當裝置報告不存在,或者無法與裝置通訊時,控制器呼叫此函式

引數

struct slim_device *sbdev

無法訪問或傳送不存在報告的裝置

struct slim_device *slim_get_device(struct slim_controller *ctrl, struct slim_eaddr *e_addr)

獲取裝置控制代碼。

引數

struct slim_controller *ctrl

將新增/查詢此裝置的控制器

struct slim_eaddr *e_addr

要查詢裝置的列舉地址

返回

如果裝置已報告,則返回指向裝置的指標。如果裝置尚未列舉,則建立新裝置並返回指向它的指標。

struct slim_device *of_slim_get_device(struct slim_controller *ctrl, struct device_node *np)

使用 dt 節點獲取裝置控制代碼。

引數

struct slim_controller *ctrl

將新增/查詢此裝置的控制器

struct device_node *np

指向裝置的節點指標

返回

如果裝置已報告,則返回指向裝置的指標。如果裝置尚未列舉,則建立新裝置並返回指向它的指標。

int slim_device_report_present(struct slim_controller *ctrl, struct slim_eaddr *e_addr, u8 *laddr)

報告已列舉裝置。

引數

struct slim_controller *ctrl

裝置列舉到的控制器。

struct slim_eaddr *e_addr

裝置的列舉地址。

u8 *laddr

返回邏輯地址(如果有效標誌為假)

描述

由控制器響應 REPORT_PRESENT 呼叫。框架將為此列舉地址分配一個邏輯地址。如果所有邏輯地址都已被佔用,函式返回 -EXFULL。

int slim_get_logical_addr(struct slim_device *sbdev)

獲取/分配 SLIMbus 裝置的邏輯地址。

引數

struct slim_device *sbdev

請求地址的客戶端控制代碼。

返回

如果邏輯地址有效或已分配新邏輯地址,則為零。錯誤時返回錯誤程式碼。

時鐘暫停:

SLIMbus 規定,在匯流排進入低功耗模式之前,必須向總線上所有活動的裝置廣播一個重新配置序列(稱為時鐘暫停)。當控制器決定進入低功耗模式時,它會使用此序列,以便可以關閉相應的時鐘和/或電源軌以節省電量。時鐘暫停透過喚醒幀器裝置(如果控制器驅動程式啟動退出低功耗模式)或透過切換資料線(如果從屬裝置希望啟動它)來退出。

時鐘暫停 API:

int slim_ctrl_clk_pause(struct slim_controller *ctrl, bool wakeup, u8 restart)

由 slimbus 控制器呼叫,用於進入/退出“時鐘暫停”

引數

struct slim_controller *ctrl

請求匯流排暫停或喚醒的控制器

bool wakeup

從時鐘暫停中喚醒此控制器。

u8 restart

根據規範用於時鐘暫停的重啟時間值。當控制器需要喚醒時,此值不使用。

描述

Slimbus 規範要求此序列關閉匯流排的時鐘。該序列涉及傳送 3 條廣播訊息(重新配置序列)以通知總線上的所有裝置。要退出時鐘暫停,控制器通常會喚醒活動幀器裝置。如果 wakeup 為 false,則此 API 執行時鐘暫停重新配置序列。如果 wakeup 為 true,則呼叫控制器的喚醒函式。對於進入時鐘暫停,如果訊息事務掛起,則返回 -EBUSY。

訊息傳遞:

該框架支援 regmap 和讀/寫 API,用於與 SLIMbus 裝置交換控制資訊。API 可以是同步的或非同步的。標頭檔案 <linux/slimbus.h> 中有更多關於訊息傳遞 API 的文件。

訊息傳遞 API:

void slim_msg_response(struct slim_controller *ctrl, u8 *reply, u8 tid, u8 len)

將從裝置接收到的訊息響應傳遞給框架。

引數

struct slim_controller *ctrl

控制器控制代碼

u8 *reply

從裝置收到的回覆

u8 tid

事務 ID,框架可以根據它關聯回覆。

u8 len

回覆的長度

描述

由控制器呼叫,通知框架收到的響應。這有助於使 API 非同步,並且控制器驅動程式不需要管理除框架管理(將 TID 與緩衝區對映)之外的另一個表

int slim_alloc_txn_tid(struct slim_controller *ctrl, struct slim_msg_txn *txn)

為 txn 分配 tid

引數

struct slim_controller *ctrl

控制器控制代碼

struct slim_msg_txn *txn

要分配 tid 的事務。

返回

成功時返回零,txn->tid 有效;失敗時返回錯誤程式碼。

void slim_free_txn_tid(struct slim_controller *ctrl, struct slim_msg_txn *txn)

釋放 txn 的 tid

引數

struct slim_controller *ctrl

控制器控制代碼

struct slim_msg_txn *txn

要釋放 tid 的事務

int slim_do_transfer(struct slim_controller *ctrl, struct slim_msg_txn *txn)

處理 SLIMbus 訊息傳遞事務

引數

struct slim_controller *ctrl

控制器控制代碼

struct slim_msg_txn *txn

要透過 SLIMbus 傳送的事務

描述

由控制器呼叫以傳輸不處理介面/值元素的訊息事務。(例如,傳輸訊息以向從屬裝置分配邏輯地址)

返回

-ETIMEDOUT:如果此訊息傳輸超時(例如,由於匯流排線路未被控制器計時或驅動)

(例如,由於匯流排線路未被控制器計時或驅動)

int slim_xfer_msg(struct slim_device *sbdev, struct slim_val_inf *msg, u8 mc)

在 slim 裝置上傳輸值資訊訊息

引數

struct slim_device *sbdev

此訊息要傳輸到的 slim 裝置

struct slim_val_inf *msg

值資訊訊息指標

u8 mc

訊息的訊息程式碼

描述

由需要傳輸值或資訊元素的驅動程式呼叫。

返回

-ETIMEDOUT:如果此訊息傳輸超時(例如,由於匯流排線路未被控制器計時或驅動)

int slim_read(struct slim_device *sdev, u32 addr, size_t count, u8 *val)

讀取 SLIMbus 值元素

引數

struct slim_device *sdev

客戶端控制代碼。

u32 addr

要讀取值元素的地址。

size_t count

要讀取的位元組數。最大允許位元組數為 16。

u8 *val

將返回值元素的值

返回

-EINVAL 表示無效引數,-ETIMEDOUT 如果此訊息傳輸超時(例如,由於匯流排線路未被控制器計時或驅動)

int slim_readb(struct slim_device *sdev, u32 addr)

從 SLIMbus 值元素讀取位元組

引數

struct slim_device *sdev

客戶端控制代碼。

u32 addr

值元素中要讀取的地址。

返回

值元素的位元組值。

int slim_write(struct slim_device *sdev, u32 addr, size_t count, u8 *val)

寫入 SLIMbus 值元素

引數

struct slim_device *sdev

客戶端控制代碼。

u32 addr

值元素中要寫入的地址。

size_t count

要寫入的位元組數。最大允許位元組數為 16。

u8 *val

要寫入值的值

返回

-EINVAL 表示無效引數,-ETIMEDOUT 如果此訊息傳輸超時(例如,由於匯流排線路未被控制器計時或驅動)

int slim_writeb(struct slim_device *sdev, u32 addr, u8 value)

向 SLIMbus 值元素寫入位元組

引數

struct slim_device *sdev

客戶端控制代碼。

u32 addr

要寫入值元素的地址。

u8 value

要寫入值的值

返回

-EINVAL 表示無效引數,-ETIMEDOUT 如果此訊息傳輸超時(例如,由於匯流排線路未被控制器計時或驅動)

流媒體 API:

struct slim_stream_runtime *slim_stream_allocate(struct slim_device *dev, const char *name)

分配一個新的 SLIMbus 流

引數

struct slim_device *dev

要關聯的 Slim 裝置

const char *name

流的名稱

描述

這是 SLIMbus 流的第一個呼叫,此 API 將分配一個新的 SLIMbus 流並返回一個有效的流執行時指標供客戶端在後續流 API 中使用。流的狀態設定為 ALLOCATED

返回

成功時返回有效指標,失敗時返回錯誤程式碼。從 ASoC DPCM 框架來看,此狀態與 startup() 操作相關聯。

int slim_stream_prepare(struct slim_stream_runtime *rt, struct slim_stream_config *cfg)

準備 SLIMbus 流

引數

struct slim_stream_runtime *rt

要配置的 slim 流執行時例項

struct slim_stream_config *cfg

流的新配置

描述

此 API 將使用 cfg 中的配置引數配置 SLIMbus 流。成功時返回零,失敗時返回錯誤程式碼。從 ASoC DPCM 框架來看,此狀態與 hw_params() 操作相關聯。

int slim_stream_enable(struct slim_stream_runtime *stream)

啟用已準備好的 SLIMbus 流

引數

struct slim_stream_runtime *stream

要啟用的 slim 流執行時例項

描述

此 API 將啟用與 SLIMbus 流關聯的所有埠和通道

返回

成功時返回零,失敗時返回錯誤程式碼。從 ASoC DPCM 框架來看,此狀態與 trigger() 啟動操作相關聯。

int slim_stream_disable(struct slim_stream_runtime *stream)

停用 SLIMbus 流

引數

struct slim_stream_runtime *stream

要停用的 slim 流執行時例項

描述

此 API 將停用與 SLIMbus 流關聯的所有埠和通道

返回

成功時返回零,失敗時返回錯誤程式碼。從 ASoC DPCM 框架來看,此狀態與 trigger() 暫停操作相關聯。

int slim_stream_unprepare(struct slim_stream_runtime *stream)

取消準備 SLIMbus 流

引數

struct slim_stream_runtime *stream

要取消準備的 slim 流執行時例項

描述

此 API 將取消分配與 SLIMbus 流關聯的所有埠和通道

返回

成功時返回零,失敗時返回錯誤程式碼。從 ASoC DPCM 框架來看,此狀態與 trigger() 停止操作相關聯。

int slim_stream_free(struct slim_stream_runtime *stream)

釋放 SLIMbus 流

引數

struct slim_stream_runtime *stream

要釋放的 slim 流執行時例項

描述

此 API 將取消分配與 slim 流執行時關聯的所有記憶體,使用者在此呼叫後不允許對流進行解引用。

返回

成功時返回零,失敗時返回錯誤程式碼。從 ASoC DPCM 框架來看,此狀態與 shutdown() 操作相關聯。