分类:
2011-05-31 18:58:51
S3c610
Codec移植的工作经验总结[bootloader级]
1.
S3C6410与WM9713的I2S,AC97,PCM相比较:
1.I2S,AC97,PCM是不同的,各是各的,三者时序不同,要双方通信,必须要是同一种时序,要么均是I2S,要么均是AC97,要么均是PCM
2.S3C6410的I2S,AC97,PCM复用同一组Pin脚,但同一时间只能用一种类型,
要么是I2S,要么是AC97,要么是PCM
3.WM9713有两大接口,一是AC97,另一是PCM/I2S
PCM/I2S是并非指两者相同,而是WM9713芯片设计时将PCM/I2S的格式兼容,硬件设计到同一个电路中去,可选配置该电路模块为PCM或是I2S
。WM9713
的AC97模块只接受对方以AC97
Timing发过来的时序,而不接受PCM|I2S的时序,类似WM9713
的I2S模块只接受对方以I2S
Timing发过来的时序,而不接受PCM|AC97的时序,WM9713
的PCM模块只接受对方以PCM
Timing发过来的时序,而不接受AC97|I2S的时序
4.看电路图知,WM9713的PCM/I2S的接口没接线,故WM9713的PCM|I2S没用上
而WM9713
AC97接了线接到S3C6410的复用口:PCM|I2S|AC97上
所以S3C6410的复用Pin脚组只能用AC97模式
5.WM9713
只有AC97模块能用,S3C6410只能配置成AC97,配成PCM|I2S将无法与WM9713的
AC97电路模块通信也说明为什么OTG代码中的有关PCM发声测试程序代码中没有对WM9713
进行PCM初始化的代码
=======================================
12.288MHz的BITCLK产生48KHz的SYNC的机理:
Refer: 6410手册35-5:
BITCLK:12.288MHz
SYNC:48KHz=12.288MHz/256bit
一个AC97帧由13个Slot组成,第1个
NO.0
Slot:16bit组成Tag
Phase
第2--13个即:NO.1--12
Slot:每个Slot
20bit,组成Data
Phase
2)默认WM9713上电后clock
位于MCLKA,
PLL Power Down WM9713 Spec P17,18
AC97_SelectSamplingRate():可以去掉由AC97_Init()中来赋值用,用宏USE_48K,USE_32K来分别设置为
2.有关AC97
Spec与WM9713的时钟关系:
1):24.576MHz外部晶振给WM9713供给MCLKA,[原理图]。再由WM9713于内部供给AC97
CLK:24.576MHz,此处于WM9713
Reg44h可配置
然后AC97
CLK:24.576MHz再供给BITCLK:12.288MHz,这个BITCLK再由WM9713提供给S3C6410用,6410再利用BITCLK:12.288MHz去产生SYNC:48KHz,这个48KHz的SYNC将反过来再供给WM9713芯片及6410的AC97
Controller,以使两者同步
Refer: WM9713
Spec P22
另外只要24.576MHz的外部晶振一定,供给WM9713的MCLKA,WM9713自动会将其分频至12.288MHz给BITCLK,送往6410
AC97 Controller
Total Bits: 16bit+12*20=256bit
Refer: WM9713 Spec P84
BITCLK电气特性
================================================
AC97_Configuration():
AC97_Configuration()====>AC97_SelectSamplingRate()
====>AC97_SelectIntrMode()
m_uSamplingFreq赋值,这里只须配成48KHz或是32KHz,其余部份的Sampling
Rate可以去掉
m_uSamplingFreq后面如何用?还须深入了解
AC97_SelectIntrMode():没用到中断,可以去掉
==========================================
有关AC97端口的设置:
AC97_SetPort(),AC97_ClosePort()可以照抄,开一个,就关闭另一个,关闭的方法是将其设置为Input
==========================================
AC97_ControllerState()的状态机:
1.开机与正常工作过程:INIT,READY,ACTIVE状态
上电开机进入INIT状态,然后ACLINK-ON后,进入READY状态,当Codec
Ready后或是开始数据传送或是
Normal
SYNC时,就切换至ACTIVE状态进行工作,直到要么cold_reset进入IDLE状态或是POWER_DOWN进入
LP Low
Power状态,还有一种情况,就是在ACTIVE状态时,收到!ACLINK_ON信号时,进入IDLE状态
2.Low
Power状态:
ACTIVE状态时,收到POWER_DOWN后,进入LP
Low Power状态,然后:
2-1:收到cold_reset后,进入IDLE状态
2-2:收到WARM_RESET后,进入WARM状态
3.WARM状态:
收到cold_reset或是CODEC_WAKEUP后,均是进入IDLE状态
4.状态同步信号:
状态与PCLK同步
5.状态监测:
AC_GLBSTAT
==========================================
AC97_CodecCmd()的AC97命令格式:
1.ac_codec_cmd
ac_codec_stat
Refer 6410 Spec P1153
2.注意两条命令发送间的延时为>=
1/48KHz=20.83uSec
3.读ac97
reg的方法:P1153
==========================================
cold reset &&
warm reset机理:
这部份与外围芯片相关:
cold
reset机理:
1.AC_GLBCTRL
Reg 设置过程:
1)cold reset
AC_GLBCTRL[cold reset] = 1
cold reset delay
> 1usec + 162.8nsec
AC_GLBCTRL[cold reset] = 0
2)AC-LINK
on
让SYNC信号送往9713
Codec
3)Transfer Data By AC-link En
2.Cold Rest
Timing:
Refer WM9713 P86
6410将9713
resetb pin脚拉低:至少1usec,然后resetb
pin脚拉高直到BITCLK
startup: >162.8nsec
----------------------------------
warm-reset:
1)warm-reset timing:
SYNC 拉高>1.3usec
+ >162.4ns 直到BIT_CLK开始工作
Refer 9713
P87
2.疑点:
AC97_ColdReset()中用到了AC97_WarmReset()
一是:要不要用???
二是:用的时机不对,此时AC-LINK
尚未on,会使得warm
reset中需要的SYNC无法送出???
估计是与下面向WM9713
Codec Reg 26h 发出0x00命令有关,里面有一个将9713的ac-link
interface 及internal
clock En的功能
先保留在cold-reset中进行warm
reset的作法,再试验是否由这个9713
ac-link interface及internal
clock EN来
即要使得warm-reset正常进行,6410当ac-link
on,9713也当ac-link
interface on且internal
clock on,所以这里的warm-reset当放在后面一点,让6410先En
ac-link interface on
3.与Cold-reset不同的地方:
向WM9713
codec发出了Reg
26h 0x00的命令,以Enable:
All output PGAs,internal clock, ac-link interface,VREF,stereo
DAC,stereo ADCS,record mux PGA,input PGAs,mixers
==========================================
AC97_CodecRegisterRW():
1.用来测试外围芯片的Codec
Reg的写入延时
2.但不要用23h,因为AC97,及WM9713均无此Reg
3.借鉴PCMCodecRegWR():
对Reg
04h写入读出以测试Reg能写入否,Reg
04h:HPL/HPR
==>只作参考由4代替
4.借鉴AC97_CodecCmdManually()手工发出命令对指定的外围Codec的芯片内部的
Reg进行读写
==========================================
WM9713_InitPCMOut():
0x26
0x4F00 开internal
clockk,AC-Link Interface enable[external clock off]
0x26与0x3c共同决定VREF的电路状态,以下两个共同决定
VRef Enable
0x26 0x4700 [在上面的基础上]
再加上
PR3开,VREF
Enable,Input PGAs,DACs,ADCs,mixers and Output En
0x3c 0xFBFF
Enable Ref
0x26与0x3c共同决定Mixer的电路状态,以下两个共同决定
Mixer En
0x26
0x4300: PR2开,Enable
Input PGAs & Mixers
0x3c 0xFBF3: Enable Left/Right headphone
mixer
0x26与0x3c共同决定Left/Right
DAC的电路状态,以下两个共同决定DAC
En
0x26 0x4100: Enable Stereo DAC PR1开
0x3c
0xFB33: Enable Left/Right DAC
0x26与0x3c共同决定PGA的电路状态,以下两个共同决定PGA
En
0x26 0x0100: Enable Output PGA
0x3c 0xF9FF: Enable HPL/HPR
Output PGA
设置Stereo
DAC Sampling Rate
0x2A 0x1: Enable Variable Rate audio
0x2c
48KHz|32KHz:设置Stereo
DAC Sample Rate
选择通道
0x12
0x8000: Mutes audio ADC Input
0x1c 0x00a0: HPL/HPR PGA Input
Select:HPMIXL,HPMIXR
0x04 0x0707 :设置HPL/HPR
Volume
0x04 0x0000 :设置HPL/HPR
Volume ==> 0DB
0x0c 0x6808 : Left/right DAC Input Gain to
all mixers: 18Bit DACL/Slot3 选入Headphone
Mixer L/R,而不入Speaker
Mixer与Mono
Mixer及Gain设定
0x04
0x0A0A: 设置HPL/HPR
Volume ZC关闭
==========================================
WM9713_CodecInitPCMIn():
1.P 25-5:
AC-Link Digital Interface Protocol:
MICInDMAMODE: ACLinkSlot6
== PCMMIC
PCMInOutDMAMODE: ACLinkSlot34 == PCM LEFT : Slot 3, PCM
RIGHT: Slot 4
--------------------
0x26 0x4F00 开internal
clockk,AC-Link Interface enable[external clock off]
0x26与0x3c共同决定VREF的电路状态,以下两个共同决定
VRef Enable:
0x26 0x4700 [在上面的基础上]
再加上
PR3开,VREF
Enable,Input PGAs,DACs,ADCs,mixers and Output En
0x3c 0xFBFF
Enable Ref
---------------------
0x26与0x3c共同决定Mixer的电路状态,以下两个共同决定
Mixer En:
0x26 0x4300: PR2开,Enable
Input PGAs & Mixers
Note:
PGAs:
LINEL,LINER,MIC至Mixer路径上的PGA
En(真正使能在后面与0x3E联用)
Mixers:Headphone L/R的Mixer,
Mono Mixer En, Speaker Mixer En
if为ACLinkSlot34==PCMInOutDMAMODE:
0x3c 0xFBC3:Left, Right ADC En + Left,Right Headphone Mixer En
可能的路径1:Mic或Line
L/R -->record mux(竖放的长梯形)-->Headphone
Mixer-->HPL/R
else if为ACLinkSlot6==PCMMIC
0x3c 0xFBCF: Left, Right ADC En
可能的路径2:Mic
-->record mux(竖放的长梯形)-->18bit
ADC
-->AC 97 Link
----------------------
0x26 0x4200:
Disable all output PGA要
PR5 on:
enable internal clock
PR4 on: enable AC-Link interface
PR3
on: Enable VRef, input PGAs, DACs,ADCs,mixers and outputs
PR2
on:Enable input PGAs and mixers
PR1 off: disable stereo DAC
PR0
on: Enable Stereo ADC & Record MUX PGA
----------------------
0x26与0x3E共同决定LINEL,LINER
PGA Enable
0x26 0x0200: Enable all output PGAs
0x3E
0xFF9F: Enable LINEL, LINER PGA
----------------------
0x2A
0x1: Enable Variable Rate audio
0x32 48KHz|32KHz:设置Audio
ADC Sample Rate
----------------------
if为ACLinkSlot34==PCMInOutDMAMODE:
0x14 0xFE12:
RECSR,RECSL: Record Mux Source Selection: LINE
L/R
RECBST:0:off: ADC record path无20dB
Gain Boost
R2MBST:0:off: 20dB Gain boost for record mux to mono
mixer
R2M: mute left&right record mux to mono mixer
R2HVOL:
111 : record mux gain to headphone mixer paths
R2H: 11: mute
left/right record mux to headphone
0X1C 0X00A0: HPL PGA input
select HPL/HPR PGA Input
0X04 0X0303: HPR/HPL Volume Set: 11_1111
Max dB
0X12 0X1010: Unmute ADC and Set ADC Recoding Volume
**********************
else if为ACLinkSlot6==PCMMIC
0x5C 0x2: ADC Slot Mapping: Left(Slot 6), Right(Slot 9)
0x14
0xFE12:
RECSR,RECSL: Record Mux Source Selection: LINE L/R
RECBST:0:off: ADC record path无20dB
Gain Boost
R2MBST:0:off: 20dB Gain boost for record mux to mono
mixer
R2M: mute left&right record mux to mono mixer
R2HVOL:
111 : record mux gain to headphone mixer paths
R2H: 11: mute
left/right record mux to headphone
0x1C 0x00A0: HPL PGA input
select HPL/HPR PGA Input
0X12 0X1010: Unmute ADC and Set ADC
Recoding Volume
1.MIC输入没接,均为LINE
L/R IN
2.路径配置:
录音路径:
LineL/R-->record
mux->无20dB->mute->mono
mixer (Mute)
LineL/R-->record mux->无20dB->18bitADC-->AC
97 Link (Mute)
LineL/R-->record mux->无20dB->mute->Headphone
Mixer-->这里为录音,mute了
(Mute)--录音
在这
放音的路径:
AC Link
-->18bit DAC-->Headphone Mixer-->HPL/R