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_DOWNSlim 裝置不存在或尚未報告。
SLIM_DEVICE_STATUS_UPSlim 裝置已在總線上宣佈。
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此裝置的列舉地址。
ctrlslim 控制器例項。
狀態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_PLAYBACK或SNDRV_PCM_STREAM_CAPTURE。
-
module_slim_driver¶
module_slim_driver (__slim_driver)
註冊 SLIMbus 驅動程式的輔助宏
引數
__slim_driverslimbus_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_ACTIVESLIMbus 時鐘處於活動狀態
SLIM_CLK_ENTERING_PAUSESLIMbus 時鐘暫停序列正在總線上傳送。如果成功,狀態變為 SLIM_CLK_PAUSED。如果轉換失敗,狀態返回 SLIM_CLK_ACTIVE
SLIM_CLK_PAUSEDSLIMbus 控制器時鐘已暫停。
-
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_statepause_comp訊號時鐘暫停序列完成。當客戶端嘗試在控制器進入時鐘暫停時呼叫 SLIMbus 事務時,這很有用。
m_reconf此互斥鎖在當前重新配置(資料通道排程、訊息頻寬預留)完成之前一直保持。當此互斥鎖被持有時,訊息 API 可以併發使用匯流排,因為當重新配置正在進行時,元素訪問訊息可以在總線上傳送。
-
enum slim_port_direction¶
SLIMbus 埠方向
常量
SLIM_PORT_SINKSLIMbus 埠是接收端
SLIM_PORT_SOURCESLIMbus 埠是傳送端
-
enum slim_port_state¶
根據 SLIMbus 規範 2.0 的 SLIMbus 埠/端點狀態機
常量
SLIM_PORT_DISCONNECTEDSLIMbus 埠已斷開,在 DISCONNECT_PORT 或 REMOVE_CHANNEL 核心命令後從未配置/已配置狀態進入
SLIM_PORT_UNCONFIGUREDSLIMbus 埠處於未配置狀態。在 CONNECT_SOURCE/SINK 核心命令後從斷開狀態進入
SLIM_PORT_CONFIGUREDSLIMbus 埠處於已配置狀態。在 DEFINE_CHANNEL、DEFINE_CONTENT 和 ACTIVATE_CHANNEL 核心命令後從未配置狀態進入。準備好進行資料傳輸。
-
enum slim_channel_state¶
核心使用的 SLIMbus 通道狀態機。
常量
SLIM_CH_STATE_DISCONNECTEDSLIMbus 通道已斷開
SLIM_CH_STATE_ALLOCATEDSLIMbus 通道已分配
SLIM_CH_STATE_ASSOCIATEDSLIMbus 通道與埠關聯
SLIM_CH_STATE_DEFINEDSLIMbus 通道引數已定義
SLIM_CH_STATE_CONTENT_DEFINEDSLIMbus 通道內容已定義
SLIM_CH_STATE_ACTIVESLIMbus 通道處於活動狀態並準備好傳輸資料
SLIM_CH_STATE_REMOVEDSLIMbus 通道不活動並已移除
-
enum slim_ch_data_fmt¶
根據 SLIMbus 規範 1.01.01 表 60 的 SLIMbus 通道資料型別識別符號
常量
SLIM_CH_DATA_FMT_NOT_DEFINED未定義
SLIM_CH_DATA_FMT_LPCM_AUDIOLPCM 音訊
SLIM_CH_DATA_FMT_IEC61937_COMP_AUDIOIEC61937 壓縮音訊
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
prrateSLIMbus 2.0 規範表 66 的通道存在率
seg_distSLIMbus 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_idrtid 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() 操作相關聯。