高速同步序列介面 (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}

匿名

flow

RX 流型別 (SYNCHRONIZED 或 PIPELINE)

arb_mode

TX 幀的仲裁模式(輪詢、優先順序)

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;
};

成員

name

HSI 裝置的名稱

hsi_id

客戶端所在的 HSI 控制器 ID

port

客戶端所在的控制器中的埠號

tx_cfg

HSI TX 配置

rx_cfg

HSI 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_cfg

HSI TX 配置

rx_cfg

HSI 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

完成時傳輸的資料的實際長度

channel

TX/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

指向擁有控制器的模組的指標

id

HSI 控制器 ID

num_ports

HSI 控制器中的埠數

port

HSI 埠陣列

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

void hsi_port_unregister_clients(struct hsi_port *port)

登出 HSI 埠

引數

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_ports

HSI 控制器上的埠數

gfp_t flags

核心分配標誌

描述

失敗時返回 NULL,成功時返回指向 hsi_controller 的指標。

void hsi_free_msg(struct hsi_msg *msg)

釋放 HSI 訊息

引數

struct hsi_msg *msg

HSI 訊息的指標

描述

客戶端負責釋放散列表指向的緩衝區。

struct hsi_msg *hsi_alloc_msg(unsigned int nents, gfp_t flags)

分配 HSI 訊息

引數

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。

int hsi_event(struct hsi_port *port, unsigned long event)

通知客戶端有關埠事件

引數

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。