http://blog.csdn.net/jiangyu912/article/details/5738758
声明:本资料来自公司同事整理提供
1 音频的通路有两种:
i. T卡-->内存-->DSP解码-->PCM信号--> 模拟基带(ABB)--> [外部功放]-->输出
ii. FM/TV chip-->模拟基带(ABB)--> [外部功放]-->输出
注:由于耳机功率相对较小所以在驱动耳机时只需要ABB内部的一级放大即可,二在驱动speaker的时候需要较高的功率所以需要经过一级外部功放。另外耳机的立体声是BB的两路信号(MP3_OUTR&MP3_OUTL)直接差分输出的而speaker只使用了其中的一路,另一路信号被舍弃。
由于音频信号经过数字和模拟两个阶段,所以对信号的放大可以分为数字增益和模拟增益。其中模拟增益依靠硬件电路完成,范围内线性度好不容易失真;而数字增益则是通过软件完成,该方式线性度差容易出现失真等问题。在Afe2.c文件中有函数
void AFE_SetLevelVolume(kal_uint8 aud_func, kal_uint8 MaxAnalogGain, kal_uint8 step, kal_uint8 level)是通过改变模拟增益改变输出音量大小的函数。其原理是更改ABB中可编程放大器的放大倍数来改变声音的大小。而函数
void AFE_SetOutputVolume( kal_uint8 aud_func, kal_uint8 volume1, kal_int8 digital_gain_index )则是通过调整数字增益来改变音量的。
Pcm编解码电路的任务是数字信号与模拟信号的转换
Pcm缓冲区的数据处理:在event_callback里收到MEDIA_DATA_REQUEST后按如下流程处理。
a.PCM_Strm_Open;
b. 调用setBuffer;
c. 填数据; GetWriteBuffer
d. 调用WriteDataDone;
e. 调用FinishWriteData;
f. 播放play(mdi_audio_play_string_with_vol_path)
2.音频对应的驱动主要有以下文件:
Afe2.c------AFE_GetOutputVolume(),AFE_SetLevelVolume(),
Afe_turnonextamplifier(),afe_turnonextamplfier();
Afe.c------afe_switchextamplifier(char sw_on)等
audcoeff.c:此文件要注意outputchanal的配置,配置错误将没有声音出现
const unsigned char L1SP_MICROPHONE1 = L1SP_LNA_0;
const unsigned char L1SP_MICROPHONE2 = L1SP_LNA_1;
const unsigned char L1SP_SPEAKER1 = L1SP_BUFFER_0;
const unsigned char L1SP_SPEAKER2 = L1SP_BUFFER_ST;
const unsigned char L1SP_LOUD_SPEAKER = L1SP_BUFFER_ST_M|L1SP_BUFFER_EXT;;
audcoeff_default.h: 定义语音增强参数;
gpio_drv.c: 设置模式以及方向
nvram_default_audio.c: 配置各音阶的音量,每个参数里有“音量0~音量6”7个音量等级和16 Level Setting模拟增益调节
GAIN_NOR_CTN_VOL //call wait tone
GAIN_NOR_KEY_VOL //keypad volume;
GAIN_NOR_MIC_VOL //microphone input
GAIN_NOR_GMI_VOL // fm radio sound
GAIN_NOR_SPH_VOL // speech sound
GAIN_NOR_SID_VOL //side tone
GAIN_NOR_MED_VOL //music
在l1audio.h中有如下定义。
#define L1SP_KEYTONE 0 // 按键音。
#define L1SP_TONE 1 // 单音和弦。
#define L1SP_SPEECH 2 // 语音。
#define L1SP_SND_EFFECT 3 // 声效。
#define L1SP_AUDIO 4 // MP3等
#define L1SP_VOICE 5 // 录音
#define L1SP_DAI 6 // 数字声音
#define L1SP_FM_RADIO 7 // FM声音。
手机里的音频参数有如下内容
FIR = Finite filter, IIR= Infinite filter, 调整响应曲线
ES = Echo suppression, 抑制回音
AEC = Acoustic echo canceller, 消除回音
AGC = Automatic gain control, 自动增益补偿
NS = Noise suppression, 背景噪音抑制
3.音频格式:
MP3
MP3的全称是Moving Picture Experts Group Audio Layer III。简单的说,MP3就是一种音频压缩技术,由于这种压缩方式的全称叫MPEG Audio Layer3,所以人们把它简称为MP3。MP3是利用 MPEG Audio Layer 3 的技术,将音乐以1:10 甚至 1:12 的压缩率,压缩成容量较小的file,换句话说,能够在音质丢失很小的情况下把文件压缩到更小的程度。而且还非常好的保持了原来的音质。正是因为MP3体积小,音质高的特点使得MP3格式几乎成为网上音乐的代名词。每分钟音乐的MP3格式只有1MB左右大小,这样每首歌的大小只有3-4兆字节。使用MP3播放器对MP3文件进行实时的解压缩(解码),这样,高品质的MP3音乐就播放出来了。
WMA
WMA (Windows MediaAudio)格式是来自于微软的重量级选手,后台强硬,音质要强于MP3格式,更远胜于RA格式,
RealAudio
RealAudio主要适用于在网络上的在线音乐欣赏,这些格式的特点是可以随网络带宽的不同而改变声音的质量,在保证大多数人听到流畅声音的前提下,令带宽较富裕的听众获得较好的音质。
MIDI
MIDI(Musical InstrumentDigitalInterface)
MID文件并不是一段录制好的声音,而是记录声音的信息,然后在告诉声卡如何再现音乐的一组指令。
CD
*.cda格式,就是CD音轨。标准CD格式也就是44.1K的采样频率,速率88K/秒,16位量化位数,因为CD音轨可以说是近似无损的,因此它的声音基本上是忠于原声的,因此如果你如果是一个音响发烧友的话,CD是你的首选。
4.“POP”噪声是指音频器件在上电、断电瞬间以及上电稳定后,各种操作带来的瞬态冲击所产生的爆破声。产生“POP”噪声的瞬态冲击通常是一种很窄的尖脉冲......
如何消除pop音:
开始播放时的pop音:先输出音频,延迟一段时间后,再打开音频功放
这种方式只是利用软件掩饰的指标方法,真正的消除应从硬件着手:比如减小输出端的偶合电容,改用桥式电路等;
5.音频放大器
音频放大器分为A类、B类和AB类和D类以及k类放大器,一般情况下用D类放大器,因为效率高,体积小。
设计的时候一般音频输入输出采用差分方式,双声道给耳机,偏置一路给功放。
BMT充电介绍:
1.电池充电相关文件:bmt.c chr_parameter.c
2.充电有三个过程:预充电、恒流充电、恒压充电
1) 当Vbat<3.3V 属于预充阶段,在这个阶段充电跟电池还有多少电压没有关系,即使电池电压为0V也应该可以冲进电(一般正规厂商电池内部有保护电路,当放电到两点几伏时已经截止,不能放出电了),只要电池本身没问题!关键是确保BATDET脚是否处于低电平!手机充电是没有任何反应的。
2) 当电池电压低于3.3V时,PMIC(电源管理芯片)不能提供Vcore、Vdd等电压,CPU处于关机状态,这时CPU是不工作的!手机是没有任何反应的,在这个模式只要BATDET脚通过下拉电阻置低,即可进行预充!
充电电流Ipre=10mV/Rsense 现在MTK平台Rsense=0.33R, 可知Ipre=30mA
2). 当3.3V 3). Vbat>4.2V 进入恒压充电阶段,这个阶段电流逐渐变小,电压维持不变!当电流减小到接近为0时,CPU发出控制信号这时停止充电! 以下为充电状态图: 3.当充电器插入时,亦即为PMIC充电模块提供了Vcharge电压,只要把PMIC的BATDET脚接地即可启动充电模块,这时会产生一个充电中断信号到CPU,通知CPU现在已经进入充电状态。这时PMIC会产生一个中断给CPU,CPU开始启动如下模块: 一、ADC采样,主要是采集Vchrg,Vbat及从MOSFET漏极输出的电压。 二、发消息给MMI层,让它显示充电状态及一些采样数据 三、检测电池电压有没有超过保护电压及电池连接是否连接正确,如果有问题即可通过CHRCTRL(GPI031)切断充电电路! 四、平时显示“充电器没有连接”警告,是因为PMIC的BATDET脚float(悬空),MOSFET没有打开,从而没有充电电流引起的 PMIC 会通过电池BAT ID脚来判断要不要给电池充电,并不是用来区分是锂电还是镍氢电池!区别锂电还是镍氢电池是通过PMIC的BATUSE脚,低电平是选择锂电!我们目前使用的电池ID电阻是10k左右,只要电池三个脚都接到电池connector上,就可以通过电池ID电阻把BATDET脚接地,充电也就开始了(包括预充电)!插充电器后,只要把PMIC的BATDET脚接地,就可以保证有电流流入了,电池的电压只影响充电状态(比如是预充还是恒流充电),如果电池电压较低,只是预充的时间稍长一些,最多一两个小时应该可以完成预充电,进入恒流充电状态! 一般电池都有自保护,一块合格的电池不应该会出现是0V的情况! 附: 1.当电池电压过低时,即进入锁定状态,用万用表测得电池两端的电压为0V!手机在低电压锁定后不能充电跟手机的充电电路没有关系! 2.电池保护IC主要有过冲保护、过放保护、大电流保护等功能。 3.锂电池不能把电全部放完,必须加保护IC,如果电池电压放电低于2V,就不能充进电了! 4.电池被锁定后,需要激活电压把电池唤醒。 5.电池在低压时充不进去电,与电池厂家选用的保护IC有关! 在Chr_parmeter.c文件中有如下数据结构,其中定义了有关电池和充电部分的全部典型值。 bmt_customized_struct bmt_custom_chr_def = { #ifndef __CUST_NEW__ 31,/*GPIO_CHRCTRL*/ 14,/*GPIO_BATDET*/ 7,/*GPIO_VIBRATOR*/ #endif /*__CUST_NEW__*/ /*charing parameters*/ /*Check Phy parameters,Maybe changed*/ 1100000,/*Typical_LI_BATTYPE*/ 锂电池典型值(容量) 1100000,/*Typical_NI_BATTYPE*/ 镍氢电池典型值(容量) 1000000,/*ICHARGE_ON_HIGH*/ 最大充电电流 0,/*ICHARGE_ON_LOW*/ 最小充电电流 1000000,/*ICHARGE_OFF_HIGH*/ //??50000 4050000,/*V_FAST2TOPOFF_THRES*/ 2500000,/*BATTMP_MINUS_40C*/ 1469409,/*BATTMP_0C*/ 520042,/*BATTMP_45C*/ 6000000,/*MAX_VBAT_LI*/ 锂电池最大VBAT值 5500000,/*MAX_VBAT_NI*/ 镍氢电池最大VBAT值 3400000,/*V_PRE2FAST_THRES*/ 250000,/*I_TOPOFF2FAST_THRES*/ /*250ma,TOPOFF->FAST*/ 快速充电关闭电流 120000,/*I_TOPOFF2FULL_THRES*/ /*120ma,TOPOFF->BATFULL*/ 正常充电关闭电流 4110000,/*V_FULL2FAST_THRES*/ /*BATFULL->FAST*/ 414557,/*V_TEMP_FAST2FULL_THRES_NI*/ /*50oC,FAST->BATFULL*/ 4050000,/*V_FULL2FAST_THRES_NI*/ 600000,/*FAST_ICHARGE_HIGHLEVEL*/ /*600ma,for table search*/ 快速充电最高限制电流 400000,/*FAST_ICHARGE_LOWLEVEL*/ /*400ma,for table search*/ 快速充电最低限制电流 4050000,/*V_PROTECT_HIGH_LI*/ 3800000,/*V_PROTECT_LOW_LI*/ #if defined(__RGT_DRV_M100__) //M100 support Nokia charger 7000000, 诺基亚充电器电压 7v #else 6500000,/*VCHARGER_HIGH*/ 普通充电器电压为6.5v #endif 0,/*VCHARGER_LOW*/ /*Time delay*/ /* PRE CHARGE ,search table*/ /*TON = 3s,TOFF=2s*/ 3,/*PRE_TON*/ 2,/*PRE_TOFF*/ /* FAST CHARGE ,search table*/ /*TON = 3s,TOFF=0s*/ 3,/*TOPOFF_TON*/ 0,/*TOPOFF_TOFF*/ 6,/*BATFULL_TON_LI*/ /*unit : second*/ 0,/*BATFULL_TOFF_LI*/ 1,/*BATFULL_TON_NI*/ /*unit : second*/ 9,/*BATFULL_TOFF_NI*/ 6,/*BATFULL_TOFF*/ 10,/*BATHOLD_OFF*/ 5,/*ADC_ISENSE_RESISTANCE_FACTOR*/ /*1/0.2*/ 24, /*bmt_measure_discard_time*/ /*24 ticks*/ //ADC_CALIDATA adc_cali_param 以下为手机电压检测部分的ADC校准值 { { 5524, 5524, 5524, 5524, 5524, 5524 }, { (23286), (23286), (23286), (23286), (23286), (23286) } }, /*ratio = adc_volt_factor/100*/ //const kal_uint16 adc_volt_factor[ADC_MAX_CHANNEL] { 50, 50, 50, 100, 50, 50 }, //const kal_uint8 TONOFFTABLE[6][2] = { {7,1}, {8,1}, {9,1}, {7,1},/*talk */ {8,1},/*talk */ {9,1}/*talk */ }, //const kal_int32 CurrOffset[3] = { 100000, //100ma 100000, 100000 }, KAL_FALSE, /* enable checking temperature while charging */ #if defined(__MT6253_PLATFORM_SUPPORT__) KAL_TRUE /* enable checking charging voltage while charging */ #else KAL_FALSE /* enable checking charging voltage while charging */ #endif }; Pmic_custom.c文件中宏 #define AC_CHR_CURRENT CHR_CURRENT_650 #define USB_CHR_CURRENT CHR_CURRENT_450 分別是对交流充电器和USB充电时的电流限制分别为650ma和450ma Bmt_main.c是关于电池和充电器的驱动文件。 在文件Auxmain.c文件AUX_task_main函数中 case MSG_ID_READ_ALL_ADC_CHANNEL_REQ: adc_measure_count=0; vbat_value = 0; aux_read_adc_channel(vbat_adc_logic_id); visense_value = 0; aux_read_adc_channel(visense_adc_logic_id); vcharger_value = 0; aux_read_adc_channel(vcharger_adc_logic_id); vbattemp_value = 0; aux_read_adc_channel(vbattemp_adc_logic_id); vaux_value = 0; aux_read_adc_channel(vaux_adc_logic_id); break; 部分是开机后进入工程模式下读取电源相关ADC值部分代码