|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 Distent 于 2022-6-6 09:20 编辑
一、SoundWire 概述:
SoundWire是MIPI提出的一个接口协议,与I2S,HDA一样,是音频接口协议。其特点是:
1. 通过一个 two-pin接口来传输音频data,控制命令等。
2. 其clock scaling 和可选的多条data lane给予data频率更高的灵活度以匹配系统要求。
3. 因为用了DDR(double data rate)数据传输方式,因此可以使用更低的时钟频率和功耗。
4. 单个master可以连接最多11个slave。
5. 支持slave to slave的数据传输方式。
6. 支持多负载传输机制(multiple payload transport mechanisms),包括同步或者异步的音频流。
7. 帧大小可以灵活配置,payload具有复杂性,支持PCM和PDM音频流。
8. 低延时,高采样率。
二、SoundWire 物理层接口(PHY):
SoundWire接口使用两根信号做设备之间的连接:
• Clock – 从master发送到全部slave的时钟信号。
• Data – 可以被所有设备驱动的data信号,并且可以配置没有设备驱动它的时候的空载值。
SoundWire 设备(device)与PHY:
上图为SoundWire的master interface和slave interface,内部的digital interface负责传送payload,command等,而PHY负责提供本设备与其他SoundWire设备的物理连接(两线接口)。
Data Signaling and Bitslots
1. SoundWire采用DDR(double data rate)进行数据传输。1个bit在上升沿的时候被驱动,并且在下降沿被采样,下一个bit在下降沿被驱动,在上升沿被采样。数据可以在上升沿和下降沿被采样,所以数据传输频率时时钟的两倍。
2. SoundWire帧内每一个bit叫做bitslot,帧内第一个bitslot叫bitslot[0],后面以此类推,bitslot[n]紧接着bitslot[n-1],所以bitslot[0]时紧跟着上一帧的最后一个bitslot。
3. Bitslot里面的的值,都是由0个,1个,甚至是多个SoundWire设备提供的。如果一个设备提供了这个bitslot的值,我们称为这个设备own了这个bitslot(这个设备就叫the owner of the Bitslot)。
SoundWire采用改进的NRZI进行数据编码(这段不是很懂)
NRZI编码:
下图为NRZI编码方式,当data值发生变化时,表示为1,当data值不变时,表示为0,如果要传输“1101011”,则最终data的值为“HLLHHLH”或者“LHHLLHL”,前者还是后者,取决于传输信号前,data的状态。
改进的NRZI编码:
SoundWire采用改进的NRZI编码,意味着如果设备想从SoundWire总线上抓取数据作为自己的input data(例如Bitslot[n]),则要根据时钟,采样两个点(例如Bitslot[n-1]和Bitslot[n])进行对比。同样,如果设备想从SoundWire总线上输出data(例如Bitslot[n]),则需要采样当前data的值(例如Bitslot[n-1])来确认输出的data应该是什么值。
这个改进的NRZI的不同点在于,只有在逻辑“1”的时候,data output信号被主动驱动起来,逻辑“0”的时候,data信号可以被被动驱动起来。
这样做有两个好处:
1. 如果当前的bitslot没有owner,或者是由于某些data原因没有被驱动,这个master的bus-keeper会让data保持逻辑0状态,这有利于检查出丢失的设备和某些错误配置;
2. 允许同一个bitslot拥有两个甚至多个owner,多个owner之间的关系是“线或”(wire-ORed),意味着一个owner要输出逻辑1,对于其他逻辑0拥有更高的优先级。
三、帧结构与Control Word:
帧结构
SoundWire的帧可以看作成一个二维数组,由比特流(bitstream)的行和列组成。其中,行的值是48~256里面的几个值,同样,列是2~16。这些master设备可以通过配置寄存器来决定的,同时这些帧的属性变量是动态可配的。初始的帧大小就是96个bitslot(48行,2列)。
配置列数:
配置行数:
每一帧的第一个bitslot开始于时钟的下降沿(第一个output data生成),并且结束于时钟的上升沿(最后一个bitslot被采样)。因为列数永远是偶数,所以下一帧的第一个bitslot也总是在时钟下降沿开始。
但是SPEC说的一帧的最后一个bitslot结束和下一帧的开始bitlost是同一个moment,这个不太理解,我的理解是第N帧的结束和第N+1帧的开始,应该是相差一个周期的。
下图为帧结构的图:
Control Word
在帧结构中,第一列的前48个bitslot为control word({row[0],col[0]},{row[0],col[1]}......{row[0],col[48]}),由于bitstream传输是一行一行(row)传输的,因此control word在bitstream上是不连续的。前48列中,每列第一个为control word的一部分,该列剩下的bitslot都是data payload。下图为control word在帧结构中的位置。
在control word里面的bitslot被分配成以下两种功能:
• Control BitSlot(20):负责一些低层级的功能,例如帧同步等。
• Command BitSlot(28):负责帮助当前的command owner传输command给其他设备,也负责接收respond给command owner。
Control Word field
1. PREQ(Ping Request):
一个或者多个Slave用于通知Owner,其需要在Ping command 中上报一些状态。因为多个slave的data pin是"线与"关系,所以只要有一个slava拉起了PREQ,Owner收到的这一帧的PREQ都会被拉起来。当owner收到这个PREQ时,会在接下来的32帧内发送ping command去读取slave的状态。在第N帧内发生类似中断等信息需要发送PREQ时,已经晚于当前帧发送PREQ的时机了,因此会在N+1帧甚至N+2帧的时候才能发出PREQ,一旦拉起了PREQ,slave会一直拉起来直到其能成功收到来自Owner的ping command。
2. Opcode:
Opcode由3个bit组成,command field的组成由Opcode来决定。Opcode由Master或者Monitor接口(command owner), slave接口接收到不同的Opcode和对应的command field之后会做相应的动作。Opcode有3种:
• Ping:让总线上的所有slave返回状态。
• Write:Command Owner给一个或者多个设备中一个或者多个寄存器写一个8 bit 的值。
• Read:Command Owner从一个或者多个设备中一个或者多个寄存器读一个8 bit 的值。
当Opcode为Ping的时候,command field如下:
当Opcode为Write或者Read的时候,command field如下:
当Opcode为Reserved的时候,command field如下:
3. Static Synchronization
Static Synchronization是一个固定的8bit的值为 b'10110001,由master产生,slave接收,并以此来维持帧同步。
4. PHY Synchronization
PHY Synchronization为1bit,由master生成,通知slave当前的PHY属于什么状态:0代表普通的PHY,1代表High-PHY。当Slave收到这个值的时候,会把PHY_Sync值写到对应的寄存器中。
5. Dynamic Synchronization
Dynamic Synchronization为4个bit,为连续15个帧的一个动态码。由于只看Static Synchronization的话,比特流可能刚好与Static Synchronization一致,导致SoundWire总线进入假连接状态,加入Dynamic Synchronization后能更好的解决这个问题。Dynamic Synchronization的值来自于4-bit LFSR(linear feedback shift register)寄存器,其通过一个PRBS (pseudo-random binary sequence) 产生器生成出来。LFSR初始值为b’1111。
6. 奇偶校验 PAR
Control Word中,存在一个奇偶校验位PAR,来检测data信号传输过程中是否出现错误。注意,奇偶校验的是data电平的高低次数,而不是逻辑的0和1。
PRA由Command Owneri经过计算后产生,并发送到别的设备进行匹配,如果设备计算出的PRA与Owner送出的PRA不一致,可能会引发中断(如果中断使能的话),并且会发送一个Command_Failed的response,让该总线上所有设备都丢弃这一帧,使得设备不会被这次错误传输所影响。
奇偶校验的窗口超过了一帧的边界,当Master修改帧结构,奇偶校验的窗口会包括上一个帧结构的部分Bitslot,和新的帧结构的部分Bitslot。下图为帧和校验窗口的关系图,注意,PAR并不是紧跟着校验窗口的,而是和奇偶校验窗口相差几个bit,多少个bit取决于你的列数,主要也是给Master计算PAR的时间。另外,校验窗口内所有的数据有需要拿来校验,包括上一帧的PAR。
下图为奇偶校验窗口的细节图。首先我们可以看到,校验窗口N只到了[44,0],此时窗口N的数据会被短暂存储起来用于计算PAR,校验窗口N+1由[44,1]开始。因此,44行的[44,1]~[44,15]都是窗口N+1的计算值,包括了窗口N的PAR本身,也是窗口N+1的计算值。
7. Response,NAK & ACK
Control Word中,存在两个bit,NAK和ACK来描述对Command的Response。
当一个设备被选中是command 的目标时,其response的NAK和ACK的组合可能如下:
• Command_Failed (NAK=1 & ACK=0):例如奇偶校验失败。
• Command_OK (NAK=0 & ACK=1):例如顺利完成读操作并返回读数据。
• Command_Ignored (NAK=0 & ACK=0):例如读了一个只写寄存器。
当一个设备没被选中是command 的目标时,其response的NAK和ACK的组合可能如下:
• Command_Failed (NAK=1 & ACK=0): 例如奇偶校验失败。
• Command_Ignored (NAK=0 & ACK=0):例如自身并不是读写操作的目标设备,或者奇偶校验没有失败。
Command Fields
1. Stream Synchronization Point (SSP)
SSP是Command Fields中的1个bit,用于设备间的传输同步。同时,当一个设备中,出现了不同的采样率,且采样率之间不是倍数关系,则需要用到SSP来使采样率和帧率同步。
2. Bus Request (BREQ)
BREQ是Command Fields中的1个bit,Monitor通过拉起BREQ申请成为Command Owner。
3. Bus Release (BREL)
BREL是Command Fields中的1个bit,Master通过拉起BREL允许Monitor成为Command Owner。
4. Slave Status (Slv_Stat_nn)
这个field一共是24个bit,一共包含了12个slave的状态(每个slave占用2个bit,slave0~11),这些状态包括:
• Slave 未成功连接。
• Slave 成功连接但是没有中断信息。
• Slave 成功连接并至少有1个中断需要上报。
5. Device Address (DevAddr)、Register Address (RegAddr)、Register Data (RegData)
Addr和Data,其中DevAddr 4个bit,RegAddr 16个bit,RegData 8个bit。
四、帧同步
Master 初始化
Master有时候会先发一段时间的时钟,再经过初始化,发出动态同步码和静态同步码等等,这并不妨碍slave识别和同步,因为slave总是匹配上了所有的同步码步骤之后,再进入同步状态。Master一开始发的帧是48行2列的结构,这样slave能过够更快同步上master。而且这种帧结构中,读写command占整个帧的比例最大,因此读写command的带宽会更大(同样的时间能送出更多的command),一旦枚举结束,所有slave同步了,master就可以改变帧结构来传输数据了。
Slave 同步步骤及SS_SM(Slave Synchronization State Machine)
Slave同步通过一个状态机SS_SM来实现,这个状态机体现了:
1. slave 如何与总线上的master进行同步;
2. slave 如何从总线上失去同步。
这个概念图为了简单阐述这个过程,因此同步过程只用了一种搜索算法和简单的参数去完成同步,实际上,真正的同步过程会用更高级的算法,并且使用多个参数(例如多种行和列的组合)去进行同步。同步时间的长短取决于slave自身的参数,master发送所用的参数,甚至是传送的data和command。另外,下图还包括对设备进入High-PHY mode的检测。实际上,系统会等所有的slave都具备High-PHY功能的时候,才会有可能进入High-PHY mode。
下图为SS_SM概念图:
状态描述:
State name | 描述 | 表现 | Unattached | slave没接收到任何正确的静态同步码,所以不能正确的连接在总线上。
当前的搜索静态同步码的帧结构的列数可能是不正确的,并且行数也是未知的。
| slave不会own任何的bitslot。
slave会循环使用这些可能的列数去寻找静态同步码。保证先确定列数。
| Column_OK | slave只接受过一次正确的静态同步码,并且不能正确的正确的连在总线上。
设定的列数可能是正确的。但是行数仍然是未知的。
| slave不会own任何的bitslot。
slave会假定这个列数是正确的,并去寻找第二次正确的静态同步码,以确定行数去初始化对应的寄存器。
| Colume_Row_OK | slave还没接收足够的静态,动态以及PHY同步码,并且不能正确的连在总线上。
行数,列数以及High-PHY状态都可能是正确的。
| slave不会own任何的bitslot。
slave假定行数和列数都是正确的,并检查接下来15帧的静态,动态和PHY的同步码,以确定之前初始化的寄存器内容是否正确。
| Attached | slave接受了足够多的静态,动态和PHY同步码,并且已经正确地连在了总线上。 | slave可以own bitslot来写control word或者data payload了。 | Attached_Error_1 | slave已经attached了,但是收到当前一帧在同步码上出现错误的值
| slave可以own bitslot来写control word或者data payload了。
同时,slave会假定行数列数以及High-PHY域仍然是正确的,并检查当前一帧的剩余部分以及下一帧的静态,动态和PHY同步码,以此来确定行数列数以及High-PHY域是否正确。
| Attached_Old_Error | slave是连在总线上的,但是上一帧的同步码有出现错误的值。 | 同上 |
转跳条件描述:
转跳条件名字 | 描述 | Static_Sync_Missing | slave使用候选的列数进行搜索静态同步码 'b10110001,但是经过大于或者等于256个bitslot之后,仍然没找到。 | Static_Sync_1_OK | slave使用候选的列数去搜索静态同步码 'b10110001,并且搜索成功。 | Static_Sync_2_OK | slave在上一次成功搜索静态同步码之后,256个bigslot之内再次搜索成功。 | Full_Sync_OK | slave用当前了的行数和列数以及寄存器值(PHY)正确的接受了所有的同步码。 | Any_Sync_Error | slave用当前了的行数和列数以及寄存器值(PHY)接受的同步码中出现了错误。 | PHY_OK_to_Attach | 满足下面其中一个条件:
1. SCP_SystemCtrl寄存器的High-PHY_Select域为0(Basic PHY)
2. 下列条件同时满足:
a. High-PHY 的值是1
b. slave 在High-PHY模式下
c. SCP_Stat寄存器的High-PHY_NotOK域为0
| End_of_Frame | slave继续用当前的行数和列数去检查当前一帧剩余部分的同步码,并且所有剩余的bitslot的值都是正确的,没有发生别的错误使状态机进入Unattached状态。 | Self_Detach | slave因为某些原因自行选择下线。
|
五、系统控制(System Control) 主要介绍下SoundWire的底层功能,包括复位,时钟,data驱动冲突,PHY切换等等。
复位
SoundWire设备的复位分为3种,都会导致设备变成unattached,从而需要重新attached到总线上并且等待重新枚举,根据影响排列从小到大,3种复位分别是:
1. 软复位(Soft Reset)
软复位一般发生于设备出现同步错误的时候,当设备同步码出错误bit位出现太多了,就会出发软复位。此复位对设备影响最小,仅仅是防止设备在错误的时间往总线发送信息。当设备重新连上总线并枚举结束后,master可以读取设备的寄存器进行debug。
2. 硬复位(Hard Reset)
影响第二小的是硬复位,例如时钟停止,或者往SCP_Ctrl寄存器写ForceReset都能触发硬复位。硬复位对slave内部多个(或者全部)的状态都有影响,取决于designer如何设计。
3. Severe Reset
影响最大的是Severe Reset,例如Power_on Reset或者Bus Reset。其影响包括了硬复位所影响的部分,另外,一些自初始化之后就不会更改的部分,例如PHY output control,都会被Severe Reset所影响。
4. Bus Reset
如下图,如果设备连续接收了超过4096个逻辑1时(即2046个时钟周期),就会在第4096个逻辑1的时候触发Bus Reset。之后只要保持发送逻辑1,设备就会一直保持复位状态。
|
|