MTK 音频和BMT简介

声明:本资料来自公司同事整理提供

 

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~音量67个音量等级和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,所以人们把它简称为MP3MP3是利用 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

 MIDIMusical 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(电源管理芯片)不能提供VcoreVdd等电压,CPU处于关机状态,这时CPU是不工作的!手机是没有任何反应的,在这个模式只要BATDET脚通过下拉电阻置低,即可进行预充!

充电电流Ipre=10mV/Rsense  现在MTK平台Rsense=0.33R, 可知Ipre=30mA

 

2).  3.3V  PMICLDO开始输出电压,从而cpu开始工作,这是进入恒流充电阶段充电电流Icc=160mV/Rsense ,现在MTK平台Rsense=0.33R,可知Icc=480mA

   

3).  Vbat>4.2V 进入恒压充电阶段,这个阶段电流逐渐变小,电压维持不变!当电流减小到接近为0时,CPU发出控制信号这时停止充电!

 

 

以下为充电状态图:

 

                                         

 

   

3.当充电器插入时,亦即为PMIC充电模块提供了Vcharge电压,只要把PMICBATDET脚接地即可启动充电模块,这时会产生一个充电中断信号到CPU,通知CPU现在已经进入充电状态。这时PMIC会产生一个中断给CPUCPU开始启动如下模块:

 

一、ADC采样,主要是采集VchrgVbat及从MOSFET漏极输出的电压。

 

二、发消息给MMI层,让它显示充电状态及一些采样数据

 

三、检测电池电压有没有超过保护电压及电池连接是否连接正确,如果有问题即可通过CHRCTRLGPI031)切断充电电路!

 

四、平时显示“充电器没有连接”警告,是因为PMICBATDETfloat(悬空),MOSFET没有打开,从而没有充电电流引起的

 

PMIC 会通过电池BAT ID脚来判断要不要给电池充电,并不是用来区分是锂电还是镍氢电池!区别锂电还是镍氢电池是通过PMICBATUSE脚,低电平是选择锂电!我们目前使用的电池ID电阻是10k左右,只要电池三个脚都接到电池connector上,就可以通过电池ID电阻把BATDET脚接地,充电也就开始了(包括预充电)!插充电器后,只要把PMICBATDET脚接地,就可以保证有电流流入了,电池的电压只影响充电状态(比如是预充还是恒流充电),如果电池电压较低,只是预充的时间稍长一些,最多一两个小时应该可以完成预充电,进入恒流充电状态!

一般电池都有自保护,一块合格的电池不应该会出现是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充电时的电流限制分别为650ma450ma

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

 

你可能感兴趣的:(源码类,MTK)