在说移植之前,我们还是先分析一下它的驱动。
我先介绍一些基本知识:
S3C2410-UDA1341声卡驱动主要用到的资源有IIS音频总线,GPIO,DMA通道.S3C2410有4通道的DMA控制器,支持存储器到存储器,IO到存储器,存储器到IO和IO到IO的传输,采用猝发传输模式加快传输速率.
IIS功能描述:
IISDI:串行数据输入线.
IISDO:串行数据输出线.
SCLK:串行数据提供位时钟.
LRCK:切换左右声道数据贞(字段选择)
MCLK:系统提供的同步时钟,又称CDCLK(编解码器时钟)
S3C2410-IIS总线接口有3种数据传输模式(具体见手册)
1.正常模式.
2.DMA模式.
3.传输/接受模式.
UDA1341和S3C2410的连接方式就是这种模式.
IIS 数据线将通过双通道DMA同时接受和发送音频数据.在这个体系中,为实现全双工,数据传输使用2个DMA通道,与IIS交互的数据经过IIS控制器写入 FIFO寄存器组.当FIFO被添满后,DMA控制器一次性将数据写入预先分配的内存区,UDA1341芯片除了提供IIS接口和麦克风接口,还提供L3 接口控制音量等,IIS总线接口信号线包括位时钟输入SCK,字段选择WS,数据输入DATAI,数据输出DATAO,系统时钟SYSCLK,L3接口由 3个I/O口控制.
IISCON:IIS控制寄存器.(具体看手册).
IISMOD:IIS模式寄存器.
IISPSR:IIS分频寄存器.
音频设备的基础知识:
OSS标准中有2个基础设备:mixer(混音器)和dsp(数字信号处理器).
现在我们就来分析一下我们的驱动吧:
int __init tq2440_uda1341_init(void)
{
int ret = 0;
ret = l3_attach_client(&uda1341, "l3-bit-24x0-gpio", "uda1341");
if (ret)
{
printk("l3_attach_client() failed./n");
return ret;
}
l3_open(&uda1341);
start_uda1341();
output_stream.dma_ch = S3C2410_DMA_CH2;//这是dma的输出通道
output_stream.dmaclient.name = "audio_out";
if (audio_init_dma(&output_stream, "UDA1341 out"))//下面我们来分析它的初始化过程
{
audio_clear_dma(&output_stream);
printk(KERN_WARNING AUDIO_NAME_VERBOSE ": unable to get DMA channels/n");
return -EBUSY;
}
input_stream.dma_ch = S3C2410_DMA_CH1;//与上面相反
input_stream.dmaclient.name = "audio_in";
if (audio_init_dma(&input_stream, "UDA1341 in"))
{
audio_clear_dma(&input_stream);
printk(KERN_WARNING AUDIO_NAME_VERBOSE ": unable to get DMA channels/n");
return -EBUSY;
}
audio_dev_dsp = register_sound_dsp(&tq2440_audio_fops, -1);
audio_dev_mixer = register_sound_mixer(&tq2440_mixer_fops, -1);
printk(AUDIO_NAME_VERBOSE " initialized/n");
return 0;
}