Linux 内核 SLIMbus 支持

概述

什么是 SLIMbus?

SLIMbus (串行低功耗芯片间媒体总线) 是由 MIPI (移动产业处理器接口) 联盟开发的规范。 该总线使用主/从配置,并且是 2 线多点实现(时钟和数据)。

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

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

数据通道用于 2 个 SLIMbus 设备之间的数据传输。数据通道使用设备上的专用端口。

硬件描述:

SLIMbus 规范根据其功能具有不同类型的设备分类。 管理器设备负责枚举、配置和动态通道分配。 每个总线有 1 个活动管理器。

通用设备是提供应用程序功能的设备(例如,编解码器)。

帧发送器设备负责为总线计时,并在总线上发送帧同步和帧信息。

每个 SLIMbus 组件都有一个接口设备来监控物理层。

通常,每个 SoC 都包含具有 1 个管理器、1 个帧发送器设备、1 个通用设备(用于数据通道支持)和 1 个接口设备的 SLIMbus 组件。 外部外围 SLIMbus 组件通常具有 1 个通用设备(用于功能/数据通道支持)和一个关联的接口设备。 通用设备的寄存器被映射为“值元素”,以便可以使用 SLIMbus 控制通道交换控制/状态类型的信息来写入/读取它们。 如果同一总线上有多个帧发送器设备,则管理器设备负责选择活动帧发送器为总线计时。

根据规范,SLIMbus 使用“时钟齿轮”根据当前频率和带宽要求进行电源管理。 有 10 个时钟齿轮,每个齿轮都将 SLIMbus 频率更改为前一个齿轮的两倍。

每个设备都有一个 6 字节的枚举地址,并且在设备报告存在于总线上后,管理器为每个设备分配一个 1 字节的逻辑地址。

软件描述:

有两种类型的 SLIMbus 驱动程序

slim_controller 表示 SLIMbus 的“控制器”。 此驱动程序应实现 SoC 所需的职责(管理器设备、用于监视层和报告错误的相关接口设备、默认帧发送器设备)。

slim_device 表示 SLIMbus 的“通用设备/组件”,并且 slim_driver 应实现该 slim_device 的驱动程序。

给驱动程序的设备通知:

由于 SLIMbus 设备具有报告其存在的机制,因此当相应的设备报告它们存在于总线上时,该框架允许驱动程序绑定。 但是,驱动程序可能需要先被探测,以便它可以启用相应的 SLIMbus 设备(例如,为其供电和/或使其脱离复位状态)。 为了支持这种行为,该框架还允许驱动程序首先进行探测(例如,使用标准设备树兼容性字段)。 这就要求驱动程序知道设备何时正常工作(即报告存在)。 当设备报告存在并且控制器为其分配逻辑地址时,将使用 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 设备驱动程序应初始化此结构的 name 和 owner 字段

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 规范的 slice size

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

成员

rate

数据速率

bps

每个数据样本的位数

ch_count

通道数

chs

指向通道号列表的指针

port_mask

用于此流的端口的端口掩码

direction

流的方向,SNDRV_PCM_STREAM_PLAYBACK 或 SNDRV_PCM_STREAM_CAPTURE。

module_slim_driver

module_slim_driver (__slim_driver)

用于注册 SLIMbus 驱动程序的辅助宏

参数

__slim_driver

slimbus_driver 结构

描述

用于在模块 init/exit 中不执行任何特殊操作的 SLIMbus 驱动程序的辅助宏。 这消除了大量样板代码。 每个模块只能使用此宏一次,并且调用它会替换 module_init()module_exit()

struct slim_framer

表示 SLIMbus 帧器。每个控制器可以有多个帧器。有一个活动的帧器设备负责为总线提供时钟。管理器负责帧器切换。

定义:

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

在 DISCONNECT_PORT 或 REMOVE_CHANNEL 核心命令后,从“未配置”/“已配置”状态进入的 SLIMbus 端口已断开连接

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 通道 Aux 字段格式 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 上的“主设备”)

定义:

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

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

max_cg

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

clkgear

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

laddr_ida

逻辑地址 ID 分配器

a_framer

由该控制器管理的、正在为总线提供时钟的活动帧器

lock

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

devices

Slim 设备列表

tid_idr

tid ID 分配器

txn_lock

用于保护事务表的锁

sched

控制器使用的调度器结构

xfer_msg

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

set_laddr

在逻辑地址 laddr 处为元素地址为 e_addr 的从设备设置逻辑地址。预期实现控制器的驱动程序会使用其逻辑地址将单播消息发送到此设备。

get_laddr

控制器可能需要设置固定的逻辑地址表,并且在这种情况下可以使用 get_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)

使用设备树节点获取设备的句柄。

参数

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

返回逻辑地址(如果有效标志为 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,则调用控制器的唤醒。对于进入时钟暂停,如果消息事务正在挂起,则返回 -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)

为事务分配一个 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 流,并返回一个有效的流运行时指针,供客户端在后续流 apis 中使用。流的状态设置为 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() start 操作。

int slim_stream_disable(struct slim_stream_runtime *stream)

禁用 SLIMbus 流

参数

struct slim_stream_runtime *stream

要禁用的 slim 流运行时实例

描述

此 API 将禁用与 SLIMbus 流关联的所有端口和通道

返回

成功返回零,失败返回错误代码。从 ASoC DPCM 框架,此状态链接到 trigger() pause 操作。

int slim_stream_unprepare(struct slim_stream_runtime *stream)

取消准备 SLIMbus 流

参数

struct slim_stream_runtime *stream

要取消准备的 slim 流运行时实例

描述

此 API 将取消分配与 SLIMbus 流关联的所有端口和通道

返回

成功返回零,失败返回错误代码。从 ASoC DPCM 框架,此状态链接到 trigger() stop 操作。

int slim_stream_free(struct slim_stream_runtime *stream)

释放 SLIMbus 流

参数

struct slim_stream_runtime *stream

要释放的 slim 流运行时实例

描述

此 API 将取消分配与 slim 流运行时关联的所有内存,在此调用之后,不允许用户对流进行取消引用。

返回

成功时返回零,失败时返回错误代码。在ASoC DPCM框架中,此状态与 shutdown() 操作相关联。