Linux 内核 SLIMbus 支持

概述

什么是 SLIMbus?

SLIMbus (Serial Low Power Interchip Media Bus) 是 MIPI (Mobile Industry Processor Interface) 联盟制定的一项规范。该总线采用主/从配置,是双线多点实现(时钟和数据)。

目前,SLIMbus 用于 SoC(片上系统)的应用处理器和外围组件(通常是编解码器)之间进行接口。SLIMbus 使用时分复用技术来容纳多个数据通道和一个控制通道。

控制通道用于各种控制功能,例如总线管理、配置和状态更新。这些消息可以是单播(例如,读取/写入设备特定值),也可以是组播(例如,数据通道重配置序列是向所有设备广播的消息)

数据通道用于 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;
};

成员

instance

实例值

dev_index

设备索引

prod_code

产品代码

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

成员

dev

设备的驱动程序模型表示。

e_addr

此设备的枚举地址。

ctrl

SLIM 控制器实例。

status

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

成员

probe

将此驱动程序绑定到 SLIMbus 设备。

remove

将此驱动程序从 SLIMbus 设备解绑。

shutdown

关机/停止时使用的标准关机回调。

device_status

当设备报告存在并获得 laddr 分配,或者设备报告不在或总线关闭时,会调用此回调。

driver

SLIMbus 设备驱动程序应初始化此结构的 nameowner 字段

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

异步操作的完成量,仅当事务(如 REQUEST 操作)需要 TID 时才有效。其余事务无论如何都是同步的。

struct slim_stream_config

SLIMbus 流配置。流配置在音频驱动程序的 hw_paramsprepare 调用中完成,其中包含有关速率、通道数等所有所需信息。通道和端口之间存在 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;
};

成员

rate

数据速率

bps

每个数据样本的比特数

ch_count

通道数

chs

指向通道号列表的指针

port_mask

此流要使用的端口掩码

direction (方向)

流的方向,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 帧发生器。每个控制器可能有多个帧发生器。有 1 个活动的帧发生器设备负责为总线提供时钟。管理器负责帧发生器的切换。

定义:

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

成员

dev

设备的驱动程序模型表示。

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

此消息的目标设备的逻辑地址。(当目标类型为广播时未使用。)

msg

要读/写的元素访问消息

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_PORTREMOVE_CHANNEL 核心命令后从未配置/已配置状态进入。

SLIM_PORT_UNCONFIGURED

SLIMbus 端口处于未配置状态。在 CONNECT_SOURCE/SINK 核心命令后从断开连接状态进入。

SLIM_PORT_CONFIGURED

SLIMbus 端口处于已配置状态。在 DEFINE_CHANNELDEFINE_CONTENTACTIVATE_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

此通道的辅助格式。

state

通道状态机

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

direction (方向)

端口方向,源或接收器。

state

端口状态机。

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

成员

name

流名称

dev

与此流关联的 SLIM 设备实例

direction (方向)

流方向

prot

此流中使用的传输协议

rate

采样数据速率 *

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

成员

dev

此驱动程序的设备接口

id

此控制器/总线的特定于板的数字标识符

name

此控制器的名称

min_cg

此控制器支持的最小 TDD 时钟齿轮(默认值:1)

max_cg

此控制器支持的最大 TDD 时钟齿轮(默认值:10)

clkgear

此总线当前运行的时钟齿轮

laddr_ida

逻辑地址 ID 分配器

a_framer

为此控制器管理的总线提供时钟的活动帧发生器

lock

保护控制器数据结构的互斥锁

devices

SLIM 设备列表

tid_idr

TID ID 分配器

txn_lock

保护事务表的锁

sched

控制器使用的调度器结构

xfer_msg

在此控制器上传输消息(这可以是广播控制/状态消息,如数据通道设置,或单播消息,如值元素读/写)。

set_laddr

为具有元素地址 e_addr 的从设备在 laddr 处设置逻辑地址。实现控制器的驱动程序将需要向此设备发送带有其逻辑地址的单播消息。

get_laddr

控制器可能需要设置固定的逻辑地址表,在这种情况下可以使用 get_laddr,以便控制器可以执行此分配。用例是当主设备在远程处理器端,由其负责分配 laddr

enable_stream

此函数指针实现控制器特定的过程来启用流。

disable_stream

此函数指针实现控制器特定的过程来禁用流。

wakeup

此函数指针实现控制器特定的过程来从时钟暂停中唤醒它。框架将调用此函数使控制器脱离时钟暂停。

描述

“管理器设备”负责设备管理、带宽分配、通道设置和每个通道的端口关联。设备管理意味着基于设备的枚举(报告存在、报告不存在)进行逻辑地址分配/移除。带宽分配由管理器根据总线上的活动通道、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 device 的引用,使用后需要释放。

返回

如果设备已报告,则指向设备的指针。如果设备尚未枚举,则创建新设备并返回指向它的指针。

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

使用 dt 节点获取设备句柄。

参数

struct slim_controller *ctrl

将查询此设备的控制器

struct device_node *np

指向设备的节点指针

描述

获取对嵌入式 struct device 的引用,使用后需要释放。

返回

如果设备已注册,则指向设备的指针;否则为 NULL。

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

返回逻辑地址(如果有效标志为 false)

描述

被控制器调用以响应 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,则调用控制器的 wakeup 函数。对于进入时钟暂停,如果消息事务挂起,则返回 -EBUSY。

消息传递:

框架支持 regmap 和读/写 API,用于与 SLIMbus 设备交换控制信息。API 可以是同步或异步的。头文件 包含有关消息传递 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)

为事务分配一个 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)

释放事务的 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() 操作相关联。