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() 操作相关联。