高速同步序列介面 (HSI)¶
簡介¶
高速同步介面 (HSI) 是一種全雙工、低延遲協議,針對應用處理器和基帶晶片組之間的晶片級互連進行了最佳化。它由 MIPI 聯盟於 2003 年指定,此後由多家供應商實施。
HSI 介面支援透過多個通道(通常為 8 個)進行全雙工通訊,並且能夠達到高達 200 Mbit/s 的速度。
序列協議使用兩個訊號 DATA 和 FLAG 作為組合的資料和時鐘訊號,以及一個額外的 READY 訊號用於流量控制。 另外,可以使用 WAKE 訊號從待機模式喚醒晶片。 這些訊號通常以 AC 為字首,表示從應用晶片到蜂窩晶片的訊號,以 CA 為字首,表示從蜂窩晶片到應用晶片的訊號。
+------------+ +---------------+
| Cellular | | Application |
| Die | | Die |
| | - - - - - - CAWAKE - - - - - - >| |
| T|------------ CADATA ------------>|R |
| X|------------ CAFLAG ------------>|X |
| |<----------- ACREADY ------------| |
| | | |
| | | |
| |< - - - - - ACWAKE - - - - - - -| |
| R|<----------- ACDATA -------------|T |
| X|<----------- ACFLAG -------------|X |
| |------------ CAREADY ----------->| |
| | | |
| | | |
+------------+ +---------------+
Linux 中的 HSI 子系統¶
在 Linux 核心中,hsi 子系統應該用於 HSI 裝置。hsi 子系統包含 hsi 控制器的驅動程式,包括對多埠控制器的支援,並提供使用 HSI 埠的通用 API。
它還包含 HSI 客戶端驅動程式,這些驅動程式利用通用 API 來實現 HSI 介面上使用的協議。這些客戶端驅動程式可以使用任意數量的通道。
hsi-char 裝置¶
每個埠都會自動註冊一個名為 hsi_char 的通用客戶端驅動程式,該驅動程式為使用者空間提供一個代表 HSI 埠的字元裝置。它可以用於從使用者空間透過 HSI 進行通訊。 使用者空間可以使用以下 ioctl 命令配置 hsi_char 裝置
- HSC_RESET
重新整理 HSI 埠
- HSC_SET_PM
啟用或停用客戶端。
- HSC_SEND_BREAK
傳送中斷
- HSC_SET_RX
設定 RX 配置
- HSC_GET_RX
獲取 RX 配置
- HSC_SET_TX
設定 TX 配置
- HSC_GET_TX
獲取 TX 配置
核心 HSI API¶
-
struct hsi_channel¶
hsi 客戶端使用的通道資源
定義:
struct hsi_channel {
unsigned int id;
const char *name;
};
成員
id通道號
name通道名稱
-
struct hsi_config¶
RX/TX HSI 模組的配置
定義:
struct hsi_config {
unsigned int mode;
struct hsi_channel *channels;
unsigned int num_channels;
unsigned int num_hw_channels;
unsigned int speed;
union {
unsigned int flow;
unsigned int arb_mode;
};
};
成員
mode位傳輸模式(STREAM 或 FRAME)
channels客戶端使用的通道資源
num_channels通道資源的數量
num_hw_channels收發器配置的通道數 [1..16]
speed最大位傳輸速度 (Kbit/s)
{unnamed_union}匿名
flowRX 流型別 (SYNCHRONIZED 或 PIPELINE)
arb_modeTX 幀的仲裁模式(輪詢、優先順序)
-
struct hsi_board_info¶
HSI 客戶端板資訊
定義:
struct hsi_board_info {
const char *name;
unsigned int hsi_id;
unsigned int port;
struct hsi_config tx_cfg;
struct hsi_config rx_cfg;
void *platform_data;
struct dev_archdata *archdata;
};
成員
nameHSI 裝置的名稱
hsi_id客戶端所在的 HSI 控制器 ID
port客戶端所在的控制器中的埠號
tx_cfgHSI TX 配置
rx_cfgHSI RX 配置
platform_data平臺相關資料
archdata架構相關的裝置資料
-
struct hsi_client¶
附加到 HSI 埠的 HSI 客戶端
定義:
struct hsi_client {
struct device device;
struct hsi_config tx_cfg;
struct hsi_config rx_cfg;
};
成員
device裝置的驅動程式模型表示
tx_cfgHSI TX 配置
rx_cfgHSI RX 配置
-
struct hsi_client_driver¶
與 HSI 客戶端關聯的驅動程式
定義:
struct hsi_client_driver {
struct device_driver driver;
};
成員
driver驅動程式的驅動程式模型表示
-
struct hsi_msg¶
HSI 訊息描述符
定義:
struct hsi_msg {
struct list_head link;
struct hsi_client *cl;
struct sg_table sgt;
void *context;
void (*complete)(struct hsi_msg *msg);
void (*destructor)(struct hsi_msg *msg);
int status;
unsigned int actual_len;
unsigned int channel;
unsigned int ttype:1;
unsigned int break_frame:1;
};
成員
link當前描述符所有者可以自由使用
cl發出傳輸的 HSI 裝置客戶端
sgt散列表陣列的頭
context與傳輸關聯的客戶端上下文資料
complete傳輸完成回撥
destructor重新整理時釋放資源的解構函式
status完成時傳輸的狀態
actual_len完成時傳輸的資料的實際長度
channelTX/RX 訊息的通道
ttype傳輸型別(如果設定則為 TX,否則為 RX)
break_frame如果為真,則 HSI 將傳送/接收中斷幀。 在請求中忽略資料緩衝區。
-
struct hsi_port¶
HSI 埠裝置
定義:
struct hsi_port {
struct device device;
struct hsi_config tx_cfg;
struct hsi_config rx_cfg;
unsigned int num;
unsigned int shared:1;
int claimed;
struct mutex lock;
int (*async)(struct hsi_msg *msg);
int (*setup)(struct hsi_client *cl);
int (*flush)(struct hsi_client *cl);
int (*start_tx)(struct hsi_client *cl);
int (*stop_tx)(struct hsi_client *cl);
int (*release)(struct hsi_client *cl);
struct blocking_notifier_head n_head;
};
成員
device裝置的驅動程式模型表示
tx_cfg當前 TX 路徑配置
rx_cfg當前 RX 路徑配置
num埠號
shared當埠可以由不同的客戶端共享時設定
claimed宣告埠的客戶端的引用計數
lock序列化埠宣告
async非同步傳輸回撥
setup設定 HSI 客戶端配置的回撥
flush清理硬體狀態並銷燬所有掛起傳輸的回撥
start_tx通知客戶端想要 TX 資料的回撥
stop_tx通知客戶端不再希望 TX 資料的回撥
release通知客戶端不再使用埠的回撥
n_head用於向客戶端發出埠事件訊號的通知鏈。
-
struct hsi_controller¶
HSI 控制器裝置
定義:
struct hsi_controller {
struct device device;
struct module *owner;
unsigned int id;
unsigned int num_ports;
struct hsi_port **port;
};
成員
device裝置的驅動程式模型表示
owner指向擁有控制器的模組的指標
idHSI 控制器 ID
num_portsHSI 控制器中的埠數
portHSI 埠陣列
-
unsigned int hsi_id(struct hsi_client *cl)¶
獲取與客戶端關聯的 HSI 控制器 ID
引數
struct hsi_client *cl指向 HSI 客戶端的指標
描述
返回客戶端所連線的控制器 ID
-
unsigned int hsi_port_id(struct hsi_client *cl)¶
獲取客戶端所連線的埠號
引數
struct hsi_client *cl指向 HSI 客戶端的指標
描述
返回與客戶端關聯的埠號
-
int hsi_setup(struct hsi_client *cl)¶
配置客戶端的埠
引數
struct hsi_client *cl指向 HSI 客戶端的指標
描述
當共享埠時,客戶端應該依賴於單個客戶端設定,或者所有客戶端都具有相同的設定。
失敗時返回 -errno,成功時返回 0
-
int hsi_flush(struct hsi_client *cl)¶
重新整理客戶端埠上的所有掛起事務
引數
struct hsi_client *cl指向 HSI 客戶端的指標
描述
此函式將銷燬埠中的所有掛起的 hsi_msg,並重置 HW 埠,使其準備好從乾淨狀態接收和傳輸。
失敗時返回 -errno,成功時返回 0
-
int hsi_async_read(struct hsi_client *cl, struct hsi_msg *msg)¶
提交讀取傳輸
引數
struct hsi_client *cl指向 HSI 客戶端的指標
struct hsi_msg *msg傳輸的 HSI 訊息描述符
描述
失敗時返回 -errno,成功時返回 0
-
int hsi_async_write(struct hsi_client *cl, struct hsi_msg *msg)¶
提交寫入傳輸
引數
struct hsi_client *cl指向 HSI 客戶端的指標
struct hsi_msg *msg傳輸的 HSI 訊息描述符
描述
失敗時返回 -errno,成功時返回 0
-
int hsi_start_tx(struct hsi_client *cl)¶
向埠發出客戶端想要啟動 TX 的訊號
引數
struct hsi_client *cl指向 HSI 客戶端的指標
描述
失敗時返回 -errno,成功時返回 0
-
int hsi_stop_tx(struct hsi_client *cl)¶
向埠發出客戶端不再想要傳輸的訊號
引數
struct hsi_client *cl指向 HSI 客戶端的指標
描述
失敗時返回 -errno,成功時返回 0
引數
struct hsi_port *port要登出的 HSI 埠
-
void hsi_unregister_controller(struct hsi_controller *hsi)¶
登出 HSI 控制器
引數
struct hsi_controller *hsi要註冊的 HSI 控制器
-
int hsi_register_controller(struct hsi_controller *hsi)¶
註冊 HSI 控制器及其埠
引數
struct hsi_controller *hsi要註冊的 HSI 控制器
描述
失敗時返回 -errno,成功時返回 0。
-
int hsi_register_client_driver(struct hsi_client_driver *drv)¶
將 HSI 客戶端註冊到 HSI 匯流排
引數
struct hsi_client_driver *drv要註冊的 HSI 客戶端驅動程式
描述
失敗時返回 -errno,成功時返回 0。
-
void hsi_put_controller(struct hsi_controller *hsi)¶
釋放 HSI 控制器
引數
struct hsi_controller *hsi要釋放的 HSI 控制器的指標
描述
只有當 HSI 控制器驅動程式需要在成功呼叫 hsi_register_controller 之前釋放其分配的 hsi_controller 結構時,才應使用此函式。 不允許其他用法。
-
struct hsi_controller *hsi_alloc_controller(unsigned int n_ports, gfp_t flags)¶
分配 HSI 控制器及其埠
引數
unsigned int n_portsHSI 控制器上的埠數
gfp_t flags核心分配標誌
描述
失敗時返回 NULL,成功時返回指向 hsi_controller 的指標。
引數
struct hsi_msg *msgHSI 訊息的指標
描述
客戶端負責釋放散列表指向的緩衝區。
引數
unsigned int nents記憶體條目的數量
gfp_t flags核心分配標誌
描述
nents 可以為 0。 這主要對讀取傳輸有意義。 在這種情況下,HSI 驅動程式將在有資料要讀取而無需消耗資料時呼叫 complete 回撥。
失敗時返回 NULL,成功時返回指向 hsi_msg 的指標。
-
int hsi_async(struct hsi_client *cl, struct hsi_msg *msg)¶
將 HSI 傳輸提交到控制器
引數
struct hsi_client *cl傳送傳輸的 HSI 客戶端
struct hsi_msg *msg傳遞給控制器的 HSI 傳輸
描述
HSI 訊息必須事先設定通道、ttype、complete 和 destructor 欄位。 如果 nents > 0,則客戶端還必須初始化散列表以指向要寫入或讀取的緩衝區。
HSI 控制器依賴於來自其客戶端的預分配緩衝區,並且它們不自己分配緩衝區。
HSI 訊息傳輸完成後,HSI 控制器會呼叫 complete 回撥,其中 HSI 訊息的狀態和 actual_len 欄位已更新。 可以在從 hsi_async 返回之前呼叫 complete 回撥。
失敗時返回 -errno,成功時返回 0
-
int hsi_claim_port(struct hsi_client *cl, unsigned int share)¶
宣告 HSI 客戶端的埠
引數
struct hsi_client *cl想要宣告其埠的 HSI 客戶端
unsigned int share指示客戶端是否要共享埠的標誌。
描述
失敗時返回 -errno,成功時返回 0。
-
void hsi_release_port(struct hsi_client *cl)¶
釋放 HSI 客戶端的埠
引數
struct hsi_client *cl先前宣告其埠的 HSI 客戶端
-
int hsi_register_port_event(struct hsi_client *cl, void (*handler)(struct hsi_client*, unsigned long))¶
註冊客戶端以接收埠事件
引數
struct hsi_client *cl想要接收埠事件的 HSI 客戶端
void (*handler)(struct hsi_client *, unsigned long)事件處理程式回撥
描述
客戶端應註冊一個回撥,以便能夠接收來自埠的事件。 註冊應在宣告埠後進行。 可以在中斷上下文中呼叫處理程式。
出錯時返回 -errno,成功時返回 0。
-
int hsi_unregister_port_event(struct hsi_client *cl)¶
停止接收客戶端的埠事件
引數
struct hsi_client *cl想要停止接收埠事件的 HSI 客戶端
描述
客戶端應在釋放其關聯埠之前呼叫此函式。
出錯時返回 -errno,成功時返回 0。
引數
struct hsi_port *port發生事件的埠
unsigned long event事件型別
描述
客戶端不應關心喚醒線路行為。 但是,由於 HSI HW 協議中的競爭條件,需要通知客戶端有關喚醒線路的變化,以便他們可以為其實現解決方法。
事件:HSI_EVENT_START_RX - 傳入喚醒線路高電平 HSI_EVENT_STOP_RX - 傳入喚醒線路低電平
出錯時返回 -errno,成功時返回 0。
-
int hsi_get_channel_id_by_name(struct hsi_client *cl, char *name)¶
按通道名稱獲取通道 ID
引數
struct hsi_client *cl使用通道的 HSI 客戶端
char *name通道使用的名稱
描述
客戶端可以呼叫此函式來獲取類似於按名稱請求 IRQ 或 GPIO 的 hsi 通道 ID。 此函式假定 RX 和 TX 使用相同的通道配置。
出錯時返回 -errno,成功時返回通道 ID。