1 音頻的通路有兩種: i. T卡-->內(nèi)存-->DSP解碼-->PCM信號--> 模擬基帶(ABB)--> [外部功放]-->輸出 ii. FM/TV chip-->模擬基帶(ABB)--> [外部功放]-->輸出 注:由于耳機(jī)功率相對較小所以在驅(qū)動耳機(jī)時只需要ABB內(nèi)部的一級放大即可,二在驅(qū)動speaker的時候需要較高的功率所以需要經(jīng)過一級外部功放。另外耳機(jī)的立體聲是BB的兩路信號(MP3_OUTR&MP3_OUTL)直接差分輸出的而speaker只使用了其中的一路,另一路信號被舍棄。 由于音頻信號經(jīng)過數(shù)字和模擬兩個階段,所以對信號的放大可以分為數(shù)字增益和模擬增益。其中模擬增益依靠硬件電路完成,范圍內(nèi)線性度好不容易失真;而數(shù)字增益則是通過軟件完成,該方式線性度差容易出現(xiàn)失真等問題。在Afe2.c文件中有函數(shù) void AFE_SetLevelVolume(kal_uint8 aud_func, kal_uint8 MaxAnalogGain, kal_uint8 step, kal_uint8 level)是通過改變模擬增益改變輸出音量大小的函數(shù)。其原理是更改ABB中可編程放大器的放大倍數(shù)來改變聲音的大小。而函數(shù) void AFE_SetOutputVolume( kal_uint8 aud_func, kal_uint8 volume1, kal_int8 digital_gain_index )則是通過調(diào)整數(shù)字增益來改變音量的。
Pcm編解碼電路的任務(wù)是數(shù)字信號與模擬信號的轉(zhuǎn)換 Pcm緩沖區(qū)的數(shù)據(jù)處理:在event_callback里收到MEDIA_DATA_REQUEST后按如下流程處理。 a.PCM_Strm_Open; b. 調(diào)用setBuffer; c. 填數(shù)據(jù); GetWriteBuffer d. 調(diào)用WriteDataDone; e. 調(diào)用FinishWriteData; f. 播放play(mdi_audio_play_string_with_vol_path)
2.音頻對應(yīng)的驅(qū)動主要有以下文件: Afe2.c------AFE_GetOutputVolume(),AFE_SetLevelVolume(), Afe_turnonextamplifier(),afe_turnonextamplfier(); Afe.c------afe_switchextamplifier(char sw_on)等
audcoeff.c:此文件要注意outputchanal的配置,配置錯誤將沒有聲音出現(xiàn) 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: 定義語音增強(qiáng)參數(shù);
gpio_drv.c: 設(shè)置模式以及方向
nvram_default_audio.c: 配置各音階的音量,每個參數(shù)里有“音量0~音量6”7個音量等級和16 Level Setting模擬增益調(diào)節(jié) 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 // 數(shù)字聲音 #define L1SP_FM_RADIO 7 // FM聲音。
手機(jī)里的音頻參數(shù)有如下內(nèi)容
FIR = Finite filter, IIR= Infinite filter, 調(diào)整響應(yīng)曲線 ES = Echo suppression, 抑制回音 AEC = Acoustic echo canceller, 消除回音 AGC = Automatic gain control, 自動增益補(bǔ)償 NS = Noise suppression, 背景噪音抑制
3.音頻格式: MP3 MP3的全稱是Moving Picture Experts Group Audio Layer III。簡單的說,MP3就是一種音頻壓縮技術(shù),由于這種壓縮方式的全稱叫MPEG Audio Layer3,所以人們把它簡稱為MP3。MP3是利用 MPEG Audio Layer 3 的技術(shù),將音樂以1:10 甚至 1:12 的壓縮率,壓縮成容量較小的file,換句話說,能夠在音質(zhì)丟失很小的情況下把文件壓縮到更小的程度。而且還非常好的保持了原來的音質(zhì)。正是因?yàn)镸P3體積小,音質(zhì)高的特點(diǎn)使得MP3格式幾乎成為網(wǎng)上音樂的代名詞。每分鐘音樂的MP3格式只有1MB左右大小,這樣每首歌的大小只有3-4兆字節(jié)。使用MP3播放器對MP3文件進(jìn)行實(shí)時的解壓縮(解碼),這樣,高品質(zhì)的MP3音樂就播放出來了。
WMA WMA (Windows MediaAudio)格式是來自于微軟的重量級選手,后臺強(qiáng)硬,音質(zhì)要強(qiáng)于MP3格式,更遠(yuǎn)勝于RA格式, RealAudio RealAudio主要適用于在網(wǎng)絡(luò)上的在線音樂欣賞,這些格式的特點(diǎn)是可以隨網(wǎng)絡(luò)帶寬的不同而改變聲音的質(zhì)量,在保證大多數(shù)人聽到流暢聲音的前提下,令帶寬較富裕的聽眾獲得較好的音質(zhì)。 MIDI MIDI(Musical InstrumentDigitalInterface) MID文件并不是一段錄制好的聲音,而是記錄聲音的信息,然后在告訴聲卡如何再現(xiàn)音樂的一組指令。
CD *.cda格式,就是CD音軌。標(biāo)準(zhǔn)CD格式也就是44.1K的采樣頻率,速率88K/秒,16位量化位數(shù),因?yàn)镃D音軌可以說是近似無損的,因此它的聲音基本上是忠于原聲的,因此如果你如果是一個音響發(fā)燒友的話,CD是你的首選。
4.“POP”噪聲是指音頻器件在上電、斷電瞬間以及上電穩(wěn)定后,各種操作帶來的瞬態(tài)沖擊所產(chǎn)生的爆破聲。產(chǎn)生“POP”噪聲的瞬態(tài)沖擊通常是一種很窄的尖脈沖...... 如何消除pop音: 開始播放時的pop音:先輸出音頻,延遲一段時間后,再打開音頻功放 這種方式只是利用軟件掩飾的指標(biāo)方法,真正的消除應(yīng)從硬件著手:比如減小輸出端的偶合電容,改用橋式電路等; 5.音頻放大器 音頻放大器分為A類、B類和AB類和D類以及k類放大器,一般情況下用D類放大器,因?yàn)樾矢撸w積小。 設(shè)計的時候一般音頻輸入輸出采用差分方式,雙聲道給耳機(jī),偏置一路給功放。
BMT充電介紹:
1.電池充電相關(guān)文件:bmt.c chr_parameter.c
2.充電有三個過程:預(yù)充電、恒流充電、恒壓充電 1) 當(dāng)Vbat<3.3V 屬于預(yù)充階段,在這個階段充電跟電池還有多少電壓沒有關(guān)系,即使電池電壓為0V也應(yīng)該可以沖進(jìn)電(一般正規(guī)廠商電池內(nèi)部有保護(hù)電路,當(dāng)放電到兩點(diǎn)幾伏時已經(jīng)截止,不能放出電了),只要電池本身沒問題!關(guān)鍵是確保BATDET腳是否處于低電平!手機(jī)充電是沒有任何反應(yīng)的。 2) 當(dāng)電池電壓低于3.3V時,PMIC(電源管理芯片)不能提供Vcore、Vdd等電壓,CPU處于關(guān)機(jī)狀態(tài),這時CPU是不工作的!手機(jī)是沒有任何反應(yīng)的,在這個模式只要BATDET腳通過下拉電阻置低,即可進(jìn)行預(yù)充! 充電電流Ipre=10mV/Rsense 現(xiàn)在MTK平臺Rsense=0.33R, 可知Ipre=30mA
2). 當(dāng)3.3V<bat<4.2V PMIC的LDO開始輸出電壓,從而cpu開始工作,這是進(jìn)入恒流充電階段充電電流Icc=160mV/Rsense ,現(xiàn)在MTK平臺Rsense=0.33R,可知Icc=480mA
3). Vbat>4.2V 進(jìn)入恒壓充電階段,這個階段電流逐漸變小,電壓維持不變!當(dāng)電流減小到接近為0時,CPU發(fā)出控制信號這時停止充電!
以下為充電狀態(tài)圖:
3.當(dāng)充電器插入時,亦即為PMIC充電模塊提供了Vcharge電壓,只要把PMIC的BATDET腳接地即可啟動充電模塊,這時會產(chǎn)生一個充電中斷信號到CPU,通知CPU現(xiàn)在已經(jīng)進(jìn)入充電狀態(tài)。這時PMIC會產(chǎn)生一個中斷給CPU,CPU開始啟動如下模塊:
一、ADC采樣,主要是采集Vchrg,Vbat及從MOSFET漏極輸出的電壓。
二、發(fā)消息給MMI層,讓它顯示充電狀態(tài)及一些采樣數(shù)據(jù)
三、檢測電池電壓有沒有超過保護(hù)電壓及電池連接是否連接正確,如果有問題即可通過CHRCTRL(GPI031)切斷充電電路!
四、平時顯示“充電器沒有連接”警告,是因?yàn)镻MIC的BATDET腳float(懸空),MOSFET沒有打開,從而沒有充電電流引起的
PMIC 會通過電池BAT ID腳來判斷要不要給電池充電,并不是用來區(qū)分是鋰電還是鎳氫電池!區(qū)別鋰電還是鎳氫電池是通過PMIC的BATUSE腳,低電平是選擇鋰電!我們目前使用的電池ID電阻是10k左右,只要電池三個腳都接到電池connector上,就可以通過電池ID電阻把BATDET腳接地,充電也就開始了(包括預(yù)充電)!插充電器后,只要把PMIC的BATDET腳接地,就可以保證有電流流入了,電池的電壓只影響充電狀態(tài)(比如是預(yù)充還是恒流充電),如果電池電壓較低,只是預(yù)充的時間稍長一些,最多一兩個小時應(yīng)該可以完成預(yù)充電,進(jìn)入恒流充電狀態(tài)! 一般電池都有自保護(hù),一塊合格的電池不應(yīng)該會出現(xiàn)是0V的情況!
附: 1.當(dāng)電池電壓過低時,即進(jìn)入鎖定狀態(tài),用萬用表測得電池兩端的電壓為0V!手機(jī)在低電壓鎖定后不能充電跟手機(jī)的充電電路沒有關(guān)系! 2.電池保護(hù)IC主要有過沖保護(hù)、過放保護(hù)、大電流保護(hù)等功能。 3.鋰電池不能把電全部放完,必須加保護(hù)IC,如果電池電壓放電低于2V,就不能充進(jìn)電了! 4.電池被鎖定后,需要激活電壓把電池喚醒。 5.電池在低壓時充不進(jìn)去電,與電池廠家選用的保護(hù)IC有關(guān)! 在Chr_parmeter.c文件中有如下數(shù)據(jù)結(jié)構(gòu),其中定義了有關(guān)電池和充電部分的全部典型值。 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*/ 快速充電關(guān)閉電流 120000,/*I_TOPOFF2FULL_THRES*/ /*120ma,TOPOFF->BATFULL*/ 正常充電關(guān)閉電流 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 以下為手機(jī)電壓檢測部分的ADC校準(zhǔn)值 { { 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是關(guān)于電池和充電器的驅(qū)動文件。 在文件Auxmain.c文件AUX_task_main函數(shù)中 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; 部分是開機(jī)后進(jìn)入工程模式下讀取電源相關(guān)ADC值部分代碼
|
|