DSP

MTK 多媒体在驱动层表现

2019-07-13 16:02发布

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.3V4.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值部分代码