SoundWire 锁定¶
本文档解释了 SoundWire 总线的锁定机制。总线使用以下锁以避免在共享资源上的总线操作中出现竞争条件。
总线锁
消息锁
总线锁¶
SoundWire 总线锁是一个互斥锁,并且是每个总线实例使用的总线数据结构 (sdw_bus) 的一部分。此锁用于序列化 SoundWire 总线实例中的以下每个操作。
添加和删除从设备,更改从设备状态。
准备、启用、禁用和取消准备流操作。
访问流数据结构。
消息锁¶
SoundWire 消息传输锁。此互斥锁是总线数据结构 (sdw_bus) 的一部分。此锁用于序列化 SoundWire 总线实例中的消息传输(读取/写入)。
以下示例显示了如何获取锁。
示例 1¶
消息传输。
对于每个消息传输
获取消息锁。
将消息(读取/写入)传输到从设备 1 或在发生组切换时在总线上广播消息。
释放消息锁
+----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | + +
示例 2¶
准备操作。
获取与主设备 1 关联的总线实例的锁。
对于准备操作中的每个消息传输
获取消息锁。
将消息(读取/写入)传输到从设备 1 或在发生组切换时在总线上广播消息。
释放消息锁。
释放与主设备 1 关联的总线实例的锁
+----------+ +---------+ | | | | | Bus | | Master | | | | Driver | | | | | +----+-----+ +----+----+ | | | sdw_prepare_stream() | <-------------------------------+ 1. Acquire bus lock | | 2. Perform stream prepare | | | | | bus->ops->xfer_msg() | <-------------------------------+ a. Acquire Message lock | | b. Transfer message | | +-------------------------------> c. Release Message lock | return success/error | d. Return success/error | | | | | return success/error | 3. Release bus lock +-------------------------------> 4. Return success/error | | + +