目录
1-4-1-1.struct snd_soc_platform:
1-4-1-2.struct snd_soc_dai_link
1-4-2.struct snd_soc_codec_device:
2-1.struct snd_soc_codec_device:
UDA1341声卡传输基本原理
uda1341连接soc的引脚分为两类:数据引脚、控制引脚。
数据引脚用于音频码流的传输,
控制引脚用于该声卡芯片控制,比如说音量控制等
如下图为uda1341的声卡
其中连接soc的引脚用红框框了出来
上面那个是数据传输引脚
下面的是控制引脚
引脚说明:
CDCLK : uda1341的工作时钟
I2SSCLK : 码流一位所用的时钟
I2SLRCK : 码流的左右声道时钟
I2SSDI : 输入码流
I2SSDO : 输出码流
L3MODE : 模式选择,用于选择L3DATA传输的是地址还是数据
L3CLOCK : 控制时钟
L3DATA : 控制数据引脚,先发送地址,再读写数据
L3传输模式跟I2C的差不多
对于码流传输,这里是通过I2S协议进行传输的。
一般的soc里面也有I2S模块,关系如下:
soc内的I2S模块作为内存跟声卡芯片的中间站,
当需要发出声音信号的时候,数据从内存通过系统总线进入soc的I2S模块,I2S模块再把数据发送到UDA1341,然后通过扬声器或者耳机输出。
当需要接受声音信号的时候,数据从外界通过声音采集设备,进入UDA1341,然后I2S模块,最后通过系统总线传输到内存。
当然,内存与I2S模块的交互方式是DMA
在s3c2440里面,I2S与GPIO是公用引脚的,因此在使用I2S模块之前应该把GPIO设为I2S模式
I2S是专门的音频协议,我们可以直接通过设置soc内部的I2S控制寄存器,达到设置声卡码流传输的目的,其中包括设置声卡工作时钟,位时钟,声音信号位宽等。
声音信号的传输是左右声道的信号交替传输的
对于控制传输,这里暂且称为L3传输
L3传输在mini2440开发板上是通过GPIO进行数据传输的,因此使用前应该设置GPIO引脚为输入/输出
L3传输类似于I2C传输,先发送地址信号,再发送数据信号,多出来的那条信号作为时钟信号
L3MODE用于选择是发送数据还是地址,L3DATA会在L3CLOCK上升沿的时候接收数据
由于是通过GPIO传输数据的,所以L3的三个引脚需要我们自己设置,一位一位地写GPIO
uda1341之L3接口介绍
MINI2440+UDA1341TS分析之一
1、L3接口不等于3线接口
2、L3接口各线功能
UDA1341TS这颗CODEC和S3C2440的硬件接口为L3和IIS.其中,L3为实现UDA1341TS这颗CODEC内部寄存器配置的硬件接口,而IIS则为音频数据流的数据接口.
1-2.主控端原理图:
S3C2440-L3原理图:
2.数据手册及通讯协议:
主控需要根据一定的协议(如IIC、SPI、IIS、L3等)和设备端通讯,从而达到数据的交互效果.而这过程往往是基于某种协议来实现设备端内部寄存器的配置而达到设备功能的设置动作.这些信息往往需要从SOC的数据手册和DEV的数据手册获取.
2-1.UDA1341TS的DATASHEET:
我们要达到控制某颗IC内部的信息,往往是通过其寄存器的读写实现的.下面针对UDA1341TS这颗CODEC的数据手册来看一下其内部寄存器.在这里实现UDA1341TS的内部寄存器操作是通过L3总线实现的.类似IIC总线协议,L3总线上也可以挂多个设备,每个设备都要有一个唯一的地址.UDA1341TS的设备地址为0x5.见数据手册:
其中第一个byte中,bit[7]~bit[2]表示UDA1341TS的设备地址,见上图红色标识部分:000101.而bit[1]~bit[0]表示后续传输的数据类型.一共有三种类型(还有一种保留未使用).如下图:
00表示DATA0,01表示DATA1,10表示STATUS.这里其实就是指UDA1341TS的内部寄存器的地址.因此,
00010100b表示是DATA0的地址; 用于控制音量
00010101b表示是DATA1的地址; 表示读回一些信息
00010110b表示是STATUS的地址; 表示状态信息(时钟,数据位宽)
00010111b保留.
因此,sound/soc/codecs/uda134x.h中宏定义便轻易理解:
其中,DATA0里面就包含了音量的控制:
用于设置音量
其中,往DATA0这个寄存器写入一些特定的数值还可以进入"扩展地址"模式,见上图中的EAn(n = 2,1,0)一栏.根据其数据手册.如下: