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