聂景贵 德州仪器应用工程师
TLV320AIC310X,TI通用音频CODEC包含内容的系列AIC3101/04/05/06/07。 音质效果优越,信号处理能力灵活,广泛应用于便携式消费电子产品,如音乐手机,PMP,DV,录音笔等。然而,对于许多初始接触这样的人来说,CODEC对于工程师来说,面对各种名称和灵活的内部寄存器设置,仍然很难正确理解使用该设备。
本文详细讨论AIC310X内部寄存器设置的含义有助于产品研发人员正确理解内部寄存器的含义,充分发挥此类设备的功能,缩短产品研发周期。本文所包含的实例中,寄存器的配置可以直接移植到用户应用系统的主程序中,根据不同的设置要求,如系统主时钟的差异、输入输出端子的不同组合等,无需任何修改或调整。
AIC310X内部寄存器分为两页:Page0和Page1。Page装置功能配置0寄存器,Page1仅用于数字滤波器系数的设置,如低音加重、3D音效等。虽然每页包含多达128个寄存器(包括保留寄存器和只读寄存器),但事实上,在许多应用程序中,用户只需要操作少数寄存器,而绝大多数可以使用其默认值,而无需任何操作。
AIC310X内部寄存器I2C读写格式如下
本文以AIC以3104为例,以应用实例的形式详细讨论了不同的内部功能模块,以方便用户根据应用要求正确理解和配置AIC310X内部寄存器。
系统初始化时可以执行以下功能模块寄存器的配置,系统主处理器在应用中不会频繁操作。
AIC310X即使系统不能提供主时钟,内部时钟的产生也非常灵活。(MCLK)音频接口的位时钟仍然可以(BCLK)来产生CODEC内部所需的所有动作时钟。常规音频输入主时钟,如11.2896 MHz /12.288MHz,AIC310X可使用内部整数倍分频器(Q为了降低系统的功耗。其他时钟如12M,13MHz 内部可用于非常规音频主时钟PLL精确生产。AIC310X时钟寄存器由Register(简写成Reg) 由2-7、11、101、102组成,时钟配置树及相应的寄存器如图1所示,粗体为上电默认值。
图 1 AIC310X 内部时钟产生过程
:24MHz系统主时钟(MCLK)输入,使用PLL,ADC/DAC采样频率为48KHz,配置PLL的P.R.J.D值如下:
P=2, R=1, J=8, D=1920
时钟寄存器设置如下:
W30 65 00 使用PLL来产生codec内部时钟
W30 07 00 选择48KHz参考采样频率
W30 03 P2 允许PLL,P=2
W30 04 20 J=8
W30 05 1E 1E为D值高8位
W30 06 0 00为D值的低6位
Step 1: 转换十进制D值到16进制,再到二进制
1920=0x780H=0111 10000000B
Step 2: 未满14位二进制值补足零到高位以形成完整的14位二进制值
0111 1000 0000B==00 0111 1000 0000B
Step 3: 根据D值寄存器存贮的规定,补足两个零到上述14位D值的低位以形成两个完整的字节(寄存器6要求D1.D0位为00 )
00 0111 1000 0000B →00 0111 1000 0000 00B
Step 4: 将上述16位二进制值分成2个字节分别用于Reg 6和5
Reg 6=00 0111 10=1E .Reg 5=00 0000 00=00
AIC310X除支持标准格式音频接口外,还支持分时复用模式(TDM),几个音频CODEC可以共享一根I2S总线,节省此类应用中主处理的硬件资源。另外,AIC310X的音频接口可根据系统要求灵活地配置成I2S主模式(BCLK/WCLK由AIC310X产生)或从模式(BCLK/WCLK输入到AIC310X),Reg 8.9.10控制AIC310X音频接口。
Reg 8: D7-D6 接口主从模式控制
11 主模式, BCLK/WCLK从AIC310X输出
00 从模式, BCLK/WCLK输入到AIC310X
D5 仅分时复用(TDM)时使用
0 I2S DATA线不设置为高阻状态
1 I2S DATA线设置为高阻状态
D4 仅主模式时使用
0 当内部ADC以及DAC POWER Off时BCLK/WCLK停止输出
1 当内部ADC以及DAC POWER Off时BCLK/WCLK仍在输出
Reg 9: D7-D6 数据接口模式选择
00=I2S 01=DSP 10=RJ 11=LJ
D5-D4 数据字长选择
00=16bits 01=20bits 10=24bits 11=32bits
D3 仅有效于主模式
0 连续BCLK时钟输出,每WCLK中BCLK时钟数目= 2X数据字长
1 固定BCLK时钟输出,每WCLK中BCLK时钟数目= 256
D2-D1 ADC/DAC重新同步
1 当一帧中群时延超过±1/4fs时重新自动同步CODEC时钟
0 不重新同步
D0 重新同步时静音的动作
1 重新同步期间,ADC/DAC自动静音
0 重新同步期间,ADC/DAC 并不自动静音
Reg10: 通常仅用于分时复用模式(TDM),用于控制在一帧中数据起始位的位置。
:配置音频接口主模式,24位,I2S格式
W30 08 D0 接口主模式,即使在ADC以及DAC POWER Off时BCLK/WCLK仍有输出
W30 09 27 24bit ,I2S格式,允许重新同步
Reg 14.38.40.42设置了AIC310X输出端子的连接模式,共模电压(直流偏置电压)及电容输出型驱动器上电延时等。
Reg 14 配置HPLOUT/HPROUT及HPLCOM/HPRCOM输出端子连接方式,图2是二种典型的应用:
图 2 AIC310X 常用输出配置
Reg 38 输出级驱动器短路检测, 建议使用默认值
Reg 40 根据CODEC的电源电压配置适当的输出直流偏置电压,以获取无失真信号最大摆幅
Reg 42 控制输出直流偏压对输出电容充电的速度以消除电容输出应用时的POP声
:3.3V CODEC 电源, HPLOUT/HPROUT电容型输出
W30 0E 80 电容型输出
W30 28 40 输出直流偏压电压设定为1.65V
W30 2A 8E 输出级上升延时400ms,信号上升时间4ms
相对于其他类型的CODEC,AIC310X ADC通道增加了两个附加功能:AGC及数字音效处理。它们可以对输入信号进行数字域的处理以进一步地改善录制信号质量,相关寄存器的配置将在章节5中详细讨论。除此之外,由Reg 15 到 Reg 25 控制模拟输入到ADC通道的选择及ADC的动作 。
AIC310X的模拟输入增加了许多灵活性,包括通道间混音,通道间自由切换,通道间输入电平的匹配(例如FM信号输入与基带信号输入),支持差分或单端输入(AIC3105除外) 等。内部集成的低噪声PGA(可编程增益放大器)可用于小信号的放大,可选的偏置电压输出支持了多种麦克风偏置电压的要求。
AIC310X ADC通道模拟输入及相应的控制寄存器如图3所示(以AIC3104 为例)
图3 ADC通道模拟输入及相应的控制寄存器
:单端MIC从AIC310X MIC1/LP输入。MIC偏置电压为2.5V,放大增益为26dB。I2S L/R通道同时输出麦克风信号
W30 13 04 连接MIC1LP到 L-PGA,MIC1设置为单端输入模式,L-ADC上电
W30 18 00 同时连接MIC1LP到R-PGA
W30 16 7C R-ADC上电
W30 19 40 麦克风偏置电压为2.5V
W30 0F 34 L-PGA增益设定为26dB
W30 10 34 R-PGA增益设定为26dB
AIC310X模拟输出比较灵活,图4显示了DAC及模拟输出通道相关寄存器的设置。
图4 DAC及模拟输出通道寄存器的设置
配置图2(1)所示的输出,Stereo Headphone, Stereo external audio amplifier.
W30 25 E0 L-DAC/R-DAC上电,HPLCOM独立单端输出
W30 29 01 L-DAC选择DAC-L1,R-DAC选择 DAC-R1,左通道DAC数字音量跟随右通道音量值。
W30 2C 09 设置DAC数字音量=0dB。
W30 26 10 HPRCOM独立单端输出。
W30 33 00 HPLOUT上电非静音,电平设置= 0dB
W30 2F 80 HPLOUT通道模拟音量设置,DAC-L1引入到HPLOUT,音量= 0dB
W30 3A 00 HPLCOM上电非静音,电平设置=0dB
W30 36 80 HPLCOM模拟音量设置, DAC-L1引入到HPLCOM,音量=0dB
W30 41 00 HPROUT上电,非静音,电平设置=0dB
W30 40 80 HPROUT模拟音量设置,DAC-R1引入到HPROUT,音量=0dB
W30 48 00 HPRCOM上电非静音,电平=0dB
W30 47 80 HPRCOM模拟音量设置DAC-R1引入到HPRCOM,音量=0dB
W30 07 8A L-DAC播放I2S-L输入信号, R-DAC播放I2S-R输入信号
:配置图2⑵所示的输出, Stereo Headphone, Differential Mono audio amplifier, Stereo Line out
W30 25 E0 同实例5
W30 29 01 同实例5
W30 2C 00 同实例5
W30 26 18 HPRCOM配置成HPLCOM的差分对
W30 52 80 DAC-L1引入到线性输出端子,音量=0dB
W30 5C 80 DAC-R1引入到线性输出端子,音量=0dB
W30 56 09 L路线性输出端子上电非静音,电平设置=0dB
W30 5D 09 R路线性输出端子上电非静音,电平设置=0dB
W30 33 00 同实例5
W30 2F 80 同实例5
W30 3A 00 同实例5
W30 36 8C DAC-L1引入到HPLCOM,音量=-6dB
W30 39 8C DAC-R1引入到HPLCOM,音量=-6dB
注:R36,R39将左右路输入信号混合以产生单声道输出信号
W30 41 00 同实例5
W30 40 80 同实例5
W30 07 8A 同实例5
三个附加功能进一步增强AIC310X音色处理效果及应用灵活性。
①AGC
②数字音效滤波器
③模拟有源及无源旁路直通
为了提高语音录制效果,AIC310X提供了AGC功能来维持录音电平的恒定输出及减少环境噪声,9个专用寄存器Reg 26到R35控制了整个的动作。理解AGC的几个变量有助于正确设置AGC的参数
Target Gain 录音信号最终恒定输出电平值
Attack Time 决定了AGC降低PGA增益的速度
Decay Time 决定了AGC增加PGA增益的速度
Noise gate threshold 输入信号平均能量低于此值时,AGC认为是噪声而保持输出在静音
Max PGA gain applicable AGC能够放大输入信号的增益最大值
Hysteresis 用于消除AGC动作时的呼吸效应
Noise detect Debounce 设定一个时间窗口来检测输入噪声信号电平
Signal detect Debounce 设定一个时间窗口来检测输入信号电平
:
当PGA Gain>AGC Gain时,AGC放大信号最大增益由AGC Gain决定。当PGA Gain<AGC Gain,AGC放大信号的最大增益由PGA Gain决定。
AGC输出从静音转变为正常语音信号输出仅当输入信号电平≥ Noise gate threshold + Hysteresis。
AGC输出从正常语音信号转变为静音输出仅当输入信号电平≤ Noise gate threshold - Hysteresis。
Hysteresis 的动作如图5 所示,目的是减少临界状态(Noise gate threshold)时AGC呼吸效应。
图5 Hysteresis 的动作
。
Step1 : 在没有语音信号输入时,降低Max PGA gain applicable 以使输出噪声达到可接受水平。
Step2 : 输入最低的语音信号,增加Noise gate threshold以事轻微信号可以被放大或检测。
Step3 : 如果语音信号在结尾时比较嘈杂,减少Decay Time。如果语音信号在开始时较差,增加Attack Time
Step4 : 反复调整AGC 变量以获得最佳录制语音信号
环境噪声相对于输入信号幅度较小。AGC 变量设置如下:
Target gain = -5.5 db
Attack time = 20ms,Decay time = 500ms
Noise threshold = -84db
Maximum gain applicable =32db
Hysteresis = 1db
Noise detect debounce = 512ms,Signal detect debounce = 32ms
寄存器设置值如下:
W30 1A 8F Left AGC enable, Target gain = -5.5db, Attack time = 20ms, decay time = 500ms
W30 1B 9A Left AGC Maximum gain applicable = 32db
W30 1C 38 Left AGC Hysteresis =1db, noise threshold = -84db
W30 22 7F Left AGC Noise detect debounce = 512ms, signal debounce = 32ms
W30 1D 8F Right AGC enable, Target gain = -5.5db, Attack = 20ms, decay = 500ms
W30 1E 9A Right AGC Maximum gain applicable = 32db
W30 1C 38 Right AGC Hysteresis =1db, noise threshold = -84db
W30 23 7F Right AGC Noise detect debounce = 512ms, signal debounce = 32ms
环境噪声相对于输入信号幅度较大,AGC 变量设置如下:
Target gain = -5.5 db
Attack time = 20ms,Decay time = 500ms
Noise threshold = -80db
Maximum gain applicable =30db
Hysteresis = 3db
Noise detect debounce = 512ms,Signal detect debounce = 32ms
寄存器设置值如下:
W30 1A 8F Left AGC enable, Target gain = -5.5db, Attack time = 20ms, decay time = 500ms
W30 1B 96 Left AGC Maximum gain applicable = 30db
W30 1C b6 Left AGC Hysteresis =3db, noise threshold = -80db
W30 22 7F Left AGC Noise detect debounce = 512ms, signal debounce = 32ms
W30 1D 8F Right AGC enable, Target gain = -5.5db, Attack time = 20ms, decay time = 500ms
W30 1E 96 Right AGC Maximum gain applicable = 30db
W30 1C b6 Right AGC Hysteresis =3db, noise threshold = -80db
W30 23 7F Right AGC Noise detect debounce = 512ms, signal debounce = 32ms
AIC310X提供了各种数字音效处理以进一步提高音质效果,低音加重/EQ/3D是最普遍的应用。Page1寄存器用于存放数字音效处理滤波器的设置值。
Step1 取消数字音效处理器
Step2 转到Page1
Step3 写入新的滤波器设置值到相关寄存器
Step4 转回Page0
Step4 重新允许数字音效处理器
:由其他音效转为3D音效,3D具有较强的扩展深度。
W30 0C 00 取消数字音效处理器 Reg12 D3D2D1D0 = 0000
W30 00 01 转到Page1
W30 35 7F 7F 3D 扩展深度系数
W30 00 00 转到Page0
W30 08 04 3D音效处理允许 Reg8 D2 = 1
:由3D音效转为EQ音效。EQ中心频率400Hz,带宽200Hz,增益9dB
W30 08 00 3D音效处理关闭 Reg8 D2 = 0
W30 0C 00 # 取消数字音效处理器 (仅在动态调整数字音效滤波器系数写入)
W30 00 01 转到Page1
W30 01 7F FF Left通道滤波器系数
W30 03 85 25 Left通道滤波器系数
W30 05 76 1D Left通道滤波器系数
W30 07 00 00 Left通道滤波器系数
W30 09 41 A3 Left通道滤波器系数
W30 0B 00 00 Left通道滤波器系数
W30 0D 7D FF Left通道滤波器系数
W30 0F 83 99 Left通道滤波器系数
W30 11 00 00 Left通道滤波器系数
W30 13 00 00 Left通道滤波器系数
W30 15 3A F3 Left通道滤波器系数
W30 17 F4 C3 Left通道滤波器系数
W30 19 50 4B Left通道滤波器系数
W30 1B 7F 7F Left通道滤波器系数
W30 1D 85 25 Right通道滤波器系数
W30 1F 76 1D Right通道滤波器系数
W30 21 00 00 Right通道滤波器系数
W30 23 41 A3 Right通道滤波器系数
W30 25 00 00 Right通道滤波器系数
W30 27 7D FF Right通道滤波器系数
W30 29 83 99 Right通道滤波器系数
W30 2B 00 00 Right通道滤波器系数
W30 2D 00 00 Right通道滤波器系数
W30 2F 3A F3 Right通道滤波器系数
W30 31 F4 C3 Right通道滤波器系数
W30 33 50 4B Right通道滤波器系数
W30 00 00 转到Page0
W30 0C 0A 打开数字音效处理器 Reg12 D3=1,D1 = 1
PGA的输出可以旁路ADC及DAC而直接引入到所有输出端子,其设置和DAC输出完全一样,仅仅相关寄存器序号相差数值1, 例如:
PGA_L/R到HPL/Rout DAC_L/R到HPL/Rout
W30 2E 80 W30 2F 80
W30 3F 80 W30 40 80
无源旁边直通可以将输入信号直接从输入端子引到输出端子,旁路掉内部所有电路,此种模式可以工作在无时钟状态。
引入MIC1LP/RP到LEFT_LOP / RIGHT_LOP
W30 6C 11 MIC1LP to LEFT_LOP, MIC1RP to RIGHT_LOP
本文以应用实例的方式详细叙述了AIC310X 内部功能模块寄存器的设置,最终的应用可参考各功能模块应用实例中寄存器的设置参数来作相应的调整。有关详细的寄存器描述请参考AIC310X相关器件的数据手册。应用中注意提示部分的内容。
1:TLV320AIC3104,LOW-POWER STEREO AUDIO CODEC FOR PORTABLE AUDIO/TELEPHONY, 数据手册.
2: TLV320AIC3104 Programming Made Easy,TLV320AIC3104应用报告, WWW.TI.COM
- /* extdrv/peripheral/vda/adv7179.c
- *
- *
- * Copyright (c) 2006 Hisilicon Co., Ltd.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.
- *
- *
- * History:
- * 17-Apr-2006 create this file
- *
- */
- #include <linux/unistd.h>
- #include <linux/module.h>
- //#include <linux/config.h>
- #include <linux/errno.h>
- #include <linux/miscdevice.h>
- #include <linux/fcntl.h>
- #include <linux/init.h>
- #include <linux/delay.h>
- #include <linux/proc_fs.h>
- #include <linux/workqueue.h>
- #include <asm/uaccess.h>
- #include <asm/system.h>
- #include <asm/io.h>
- //#include <linux/kcom.h>
- #include <linux/random.h>
- //#include "stapp_main.h"
- #include "sti7105.h"
- #include "stsys.h"
- #include "stddefs.h"
- #include "sti2c.h"
- #include "staudlx_aic3104.h"
- //#include "stcommon.h"
- //#include "stavmem.h"
- ///PRE-DEFINITIONS/
- //module name string
- #define MOD_STR "aic3104"
- #define MOD_STR_E "aic3104 ERROR"
- //chip and id register addr
- #define CHIP_A_I2C_ADDR 0x30//0x30//0x18
- #define I2C0 0x00
- //#define TRUE (bool) 1
- /***************************************************
- (1). AIC3104 I2S work mode
- Define 0xd0 if work as master
- Define 0x00 if work as slave
- ***************************************************/
- #define AIC3104_WORK_MODE 0x00
- /***************************************************
- (2). Global debug info switch
- ***************************************************/
- #define GLOBAL_DEBUG
- //AIC3104 version info.
- #define AIC3104_VER_MIN 0// 0~63
- #define AIC3104_VER_SEC 0// 0~63
- #define AIC3104_VER_MAJ 1// 0~31
- #define AIC3104_VER_DAY 25// 1~31
- #define AIC3104_VER_MON 3// 1~12
- #define AIC3104_VER_YER 10// 00~63
- static STI2C_Handle_t i2c_handle;
- static int nbpages = 0, chains[2] = {0,0};
- typedef enum _tagDRV_ERR_CODE_
- {
- //general return code
- NO_ERROR = 0,
- ERR_NO_DEV ,
- ERR_GPIO_I2C_RD,
- ERR_GPIO_I2C_WR,
- ERR_VERSION_CHK,
- ERR_DRV_REG,
- ERR_OUT_OF_RANGE,
- ERR_INVALID_CMD
- }DRV_ERR_CODE;
- /*
- ST_ErrorCode_t STI2C_Read ( STI2C_Handle_t Handle, //chip, I2CHandle
- U8 *Buffer_p, //read reg
- U32 MaxLen, //MAX_BYTE_READ,
- U32 Timeout, //100,
- U32 *ActLen_p) //target buffer
- ST_ErrorCode_t STI2C_Write( STI2C_Handle_t Handle,// ----chip
- const U8 *Buffer_p, //write reg
- U32 NumberToWrite, // -- bytes
- U32 Timeout, //new
- U32 *ActLen_p) // source buffer
- //#define cfg_bytes_write(chip, reg, buf, bytes) gpio_i2c_write_multi(chip, reg, buf, bytes)
- //#define cfg_bytes_read(chip, reg, buf, bytes) gpio_i2c_read_multi(chip, reg, buf, bytes)
- */
- //#define cfg_bytes_write(buf,NumToWrite,Timeout,nwrite) STI2C_Write(i2c_handle,buf, NumToWrite, Timeout, nwrite)
- //#define cfg_bytes_read(buf,NumToRead,Timeout,nread) STI2C_Read(i2c_handle,buf, NumToRead, Timeout, nread)
- /// 模块软件版本定义
- typedef struct {
- unsigned minver : 6; // 0~63
- unsigned secver : 6; // 0~63
- unsigned majver : 5; // 0~31
- unsigned day : 5; // 日: 1~31
- unsigned month : 4; // 月: 1~12
- unsigned year : 6; // 年: 2000~2063
- } SWVERSION, *PSWVERSION;
- #define VINFO2STR(str, v) sprintf(str, "V%d.%d.%d build%04d%02d%02d\n", v.majver, v.secver, v.minver, v.year+2000, v.month, v.day)
- /*
- typedef struct {
- int minor;
- const char *name;
- const struct file_operations *fops;
- } miscdevice;
- */
- typedef struct aic3104_information {
- U8 *Buffer_p;
- U32 Size;
- } aic3104_info_t;
- //data type
- /*typedef unsigned char U8;
- typedef signed char S8;
- typedef unsigned short U16;
- typedef signed short S16;
- typedef unsigned int U32;
- typedef signed int S32;*/
- ///PRE-DEFINITIONS/
- static const U8 *MODULE_NAME = NULL, *MODULE_NAME_E = NULL;
- //aic3104初始化数据,拷贝自杨总的代码,未作任何修改
- static U8 init_data[] =
- {
- 2, 0x00,
- 4, 0xc0,
- 7, 0x0a,
- 8, AIC3104_WORK_MODE,
- 9, 0x08,
- 14, 0x88,
- 15, 0x00,
- 16, 0x00,
- 17, 0x0f,
- 18, 0xf0,
- 19, 0x7f,
- 22, 0x7f,
- 25, 0x80,
- 37, 0xd0,
- 38, 0x0c,
- 40, 0x82,
- 43, 0x00,
- 44, 0x00,
- 47, 0x80,
- 51, 0x0f,
- 64, 0x80,
- 65, 0x0f,
- 82, 0x80,
- 86, 0x0b,
- 92, 0x80,
- 93, 0x0b,
- 101, 0x01
- };
- ST_DeviceName_t PIO_DeviceName[] = { "PIO0","PIO1","PIO2","PIO3","PIO4","PIO5","PIO6","PIO7","PIO8","PIO9","PIO10","PIO11","PIO12","PIO13","PIO14","PIO15","PIO16","PIO17","PIO18","PIO19","PIO20","PIO21","PIO22","PIO23","PIO24","PIO25","PIO26"};
- extern S32 GetAudioHoldSignal(void);
- static S32 chip_detect(void)
- {
- U32 ErrorCode;
- U32 nread ,nwrite;
- U8 temp_buf[2];
- if (NULL == temp_buf)
- {
- return -1;
- }
- /* aic3104 doesn't provide read-only chip id registers, so a i2c read instead */
- // if(cfg_bytes_read(CHIP_A_I2C_ADDR, 0x08, &buf, 1))
- temp_buf[0] = 0x08;
- ErrorCode = STI2C_WriteNoStop(i2c_handle, temp_buf, 1, 100, &nwrite);
- if(ST_NO_ERROR != ErrorCode )
- {
- printk("I2C write addr error : 0x%x\n",ErrorCode);
- return ErrorCode;
- }
- ErrorCode = STI2C_Read(i2c_handle, temp_buf, 1, 100, &nread);
- if(ST_NO_ERROR != ErrorCode )
- {
- printk("I2C read data error : 0x%x\n",ErrorCode);
- return ErrorCode;
- }
- // printk("Reg 08 = 0x%x\n",temp_buf[0]);
- return NO_ERROR;
- }
- static U32 audio_detect(void)
- {
- #if 0
- S32 state;
- state = GetAudioHoldSignal();
- if(state < 0)
- {
- printk("\n%s: GetAudioHoldSignal() call failed!", MODULE_NAME_E);
- return -ERR_NO_DEV;//Not support audio
- }
- return state;
- #else