基于DDK的TLV320AIC23音频编解码器驱动程序设计

1 引言
tlv320aic23是ti公司推出的一款高性能立体声音频编解码器,内置耳机输出放大器,支持mic和line in二选一的输入方式。输入和输出都具有可编程的增益调节功能。tlv320aic23的模/数转换器(adc)和数,模转换器(dac)集成在芯片内部.采用先进的σ一△过采样技术.可以在8khz至96khz的采样率下提供16bit、20bit、24bit和32bit的采样数据。adc和dac的输出信噪比分别可达90db和100db。同时。tlv320aic23还具有很低的功耗(回放模式为23mw。节电模式为15μw)。上述优点使得tlv320aic23成为一款非常理想的音频编解码器,与ti的dsp系列相配合更是相得益彰。
dsp/bios driver developer’s kit(ddk)是ti为简化驱动程序开发为tms320系列dsp及其evm板等提供的驱动程序开发套件。该套件为tms320系列各种外围器件提供完整的标准化驱动程序模型,使得驱动程序可以很方便地移植到其他应用中,大大提高驱动程序开发的效率。ddk是对每种tms320系列dsp都提供的芯片支持库(chip support library—csl)的补充,csl提供对外围器件寄存器配置及初始化等的低级控制,ddk完全通过csl来对外围器件进行控制。简单地说。ddk建立在csl上层.所以用ddk来开发驱动程序将更为快捷且可移植性更好。
ddk为开发驱动程序定义了标准模型和一系列的api。为简化程序设计。标准模型又被分为二个层次.其中高层称为class driver,低层称为mini—driver。class drivei与器件相对独立.完成诸如缓冲区管理和请求同步等功能.同时扮演着与api和mini—driver二者接口的角色。mini—driver完成特定的器件初始化和控制功能.它符合iom(i/o mini—driver)的接口标准。ddk的这种分层结构使得驱动开发人员仅需了解单一的mini—driver api就可以完成整体外围器件的驱动设计,而且这一过程比设计整个驱动程序要简单得多,因为class driver控制了缓冲区管理和同步等。ddk提供3种class driver.分别为sio/dio、pip/pio和gio,它们都可以和任何mini—driver结合使用。
2 tlv320aic23的驱动设计基础
ddk的标准模型结构如图1所示。高层的应用和底层驱动相互没有直接的关联,开发中只需通过class driver控制mini—driver。
下面以dm642 evm板为例.说明基于ddk的tlv320aic23的驱动程序设计方法。
首先,需要使用配置工具建立驱动程序的入口。在dsp/bios con_fig下的cdb文件中.依次选择in-puffoutplut---deviee drivers→user→defined drivers.在这些例程中一般已经添加了udevcodec.如果需要的话,用户可以自行添加或编辑。右键单击选择properties选项来编辑其属性,其属性应设置如下:
comment:可以加入自己的注释
lnit function:键入evmdm642_edma_aic23一init
function table ptr:键入 evmdm642_edma_a-ic23一fxn8
function table type:选择iom_fxns
deviceid:该项会被自动忽略.因为dm642 evm板上只有一块tlv320aic23
device params ptr:tlv320aic23参数结构的入口指针.使用缺省参数时设为0x0
device global data ptr:必须设置为oxo
正确配置驱动程序入口后.就要按照需要设置相关的参数。下面具体讨论tlv320aic23参数的设置。
tlv320aic23的参数结构体原型如下:
typedef struct
在一般应用中。上述结构体的大多数参数无需更改,需要修改的主要是aie23config.它是tlv320aic23控制寄存器值.需要通过它来控制tlv320aic23的工作模式、输入/输出选择、采样率等重要参数。
除了复位寄存器外.tlv320aic23共有9个控制寄存器.每个寄存器控制字长为9bit.地址位为7bit,共有16bit。地址位为高7位而控制字在低9位。具体如下:
register0:左声道输入音量控制,缺省值为 0x0017
register1:右声道输入音量控制,缺省值为 0x0017
register 2:左声道输出音量控制。缺省值为ox01f9
register 3:右声道输出音量控制,缺省值为ox01f9
register 4:模拟音频通道设置.缺省值为ox0011
register 5:数字音频通道设置。缺省值为0x0000
register 6:节电模式控制.缺省值为0x0000
register 7:数字音频接口格式控制,缺省值为0x0043
register 8:采样率控制,缺省为48khz,对dm642evm板.缺省值为ox0002
register 9:数字音频接口激活开关.缺省值为0x0001
通常情况下需要修改的寄存器包括4号和8号寄存器.即选择是由mic输入还是由line in输入和根据需要选择采样率。这2个寄存器的详细配置如下:
4号寄存器配置见表1,其中,d2位。insel(in-put select for adc)是输入选择,“o”为line in;“l”为mic.d1位micm(microphone mute)是mic静音开关.为“l”表示静音。do位micb(microphone boost)如设置为“1”将为mic输入提供20db的增益。8号寄存器配置见表2,其中,采样率控制位为d5~d2的sr[3:o]。对于dm642 evm板,设置方式见表3。
可见.需要通过4号寄存器的d2来选择输入,同时考虑dl和do对mic的控制;采样率的控制通过设置8号寄存器的sr[3:0]来实现。
3 tlv320aic23的驱动配置方法
很多初学者在运行dm642 evm的echo或其他音频例程时,最容易碰到的问题是通过line in输入时有输出.而通过mic输入时没有输出,更不要说改变采样率了。即使参考资料编辑aic23-h和emvdm642_edma_aic23.h修改dcfauh参数仍然无法解决。
出现这样的问题时。首先要了解tlv320aic23的模拟音频输入为mic和line in二选一的,其次要知道如何能够正确配置tlv320aic23的参数使之满足特定应用的需要。如果仔细分析echo例程和其他音频例程的话,可以发现只有在echo例程中包含了aie23.h和emvdm642_edma_aie23.h 2个头文件。其实在echo例程中.所包含的这2个头文件和tlv320aic23的初始化语句实际并未使用。如果屏蔽掉对这2个头文件的包含以及tlv320aic23的初始化语句,会发现编译后仍然能够正常运行。实际上echo例程中的tlv320aic23初始化语句只是提供了对ⅱ,v320aic23进行配置的一种方法而并未直接使用。该方法在ddk包的emvdm642部分说明文件中也已提及。
由于在echo例程中初始化驱动程序人口和其他的音频例程一样使用了默认参数,而默认参数是通过调用ddk包中的evmdm642_edma_aic23.164库获得的.该库不变则配置也不变,于是就会出现上述问题。
在明确了以上原理后.通过实践证明,本文提供的以下三种配置方法可以适应各种应用。
方法一
既然默认参数是通过调用evmdm642_edlna_a-ic23.164库获得的.那么自然可以通过修改该库来达到修改参数的目的。ti提供的ddk包中包含了各种库的源代码.这使得修改库文件成为可能。本文用到的库生成工程是tiddksrc\audio\evmdm642目录下的evmdm642_edma_mc23_64.pjt,只需要打开该工程.修改其中aic23.h中的默认参数,重新编译就能生成新的库文件。这样,所有的音频例程都会默认按修改过的参数运行。
这种方法适合tlv320aic23参数配置相对固定的应用场合。配置完全通过调用evmdm642_ed_ma_aic23.164库初始化时进行.不用在应用工程文件中添加任何附加代码.使得工程文件更简洁.可移植性更高。
方法二
自定义符合标准结构evmdm642_edma_a.ic23一devparams的结构体,例如:
然后将“_myparms”作为device params ptr在指定人口指针时替代默认的0x0。这就符合ti推荐的方法,在echo例程中的相关代码也说明了这种方法。
这种方法能够适应几乎任何使用情况,初始化参数自定义非常明确,代码易读性较高。但是不建议像echo例程中那样直接包含默认参数的头文件.最好参照该头文件定义自己的结构体。
方法三
通过仔细分析生成evmdm642_edma_aic23.164库的源代码,可以发现对tlv320aic23寄存器的设置是通过aic23_setparams()函数来完成的。在大多数情况下,只要修改寄存器值而不必修改标准结构evmdm642_edma_aic23_devparams结构体中的其他变量。所以可以调用aic23_setparams()函数来完成对tlv320aic23参数的配置。这样就只需要定义1个符合标准的寄存器数组.将数组名作为参数来调用aic23_setparamsf()函数就可以达到目的。
这种方法使用灵活,代码长度很短,含义非常明确,可以用不同参数多次调用.尤其适用于tlv320aic23参数可变的特殊场合。
4 结束语
笔者在实际工作基础上对tlv320aic23参数配置提出了3种方法,各有特点且都十分实用。在进行基于ddk的tlv320aic23驱动程序设计时.可以根据需要方便地选用。

受5G推动移动DRAM 内存制造商2020年冲刺成长
苹果现款iPod touch将配备4英寸Retina视网膜屏幕搭载A8芯片
0.6μm CMOS工艺全差分运算放大器的设计
数据中心服务器功率一般多大 数据中心服务器操作系统三大类包括
什么模式下操作降压转换器最好
基于DDK的TLV320AIC23音频编解码器驱动程序设计
四通道高速直接数字频率合成器AD9959的功能特点和应用
鸿海的面板工厂再陷亏损 夏普电视难与中国电视竞争
关于汽车线束测试,你了解多少?
艾拉比芮亚楠:当OTA普及,我们将在物联网和车联网看到三个变化
智能安防发展进程加速,视频监控市场规模不断扩大
三星Note 8和一加5T防抖功能比拼,谁更胜一筹
基于FPGA芯片XC4005E-4IPQ100实现频信号发送系统的方案设计
富士康不惧苹果“压榨”发展工业机器人是妙方
寄存器与缓存的区别
NVIDIA高性能GPU硬件助力Cloudpick智能门店数字化运营
关于土壤温湿度测量仪的作用以及功能的分析
Qualcomm发布骁龙虚拟现实软件开发包
红米S2评测 同价位竞品强势红米S2主攻线下
如何正确教育青少年使用应用程序与科技?