6410 声卡wm9713 驱动分析

发布者:JoyfulSerenade最新更新时间:2024-11-11 来源: cnblogs关键字:声卡 手机看文章 扫描二维码
随时随地手机看文章

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初始化的代码 

======================================= 
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 

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 
Total Bits: 16bit+12*20=256bit 


2)默认WM9713上电后clock 位于MCLKA, PLL Power Down WM9713 Spec P17,18 

Refer: WM9713 Spec P84 BITCLK电气特性 

================================================ 
AC97_Configuration(): 
AC97_Configuration()====>AC97_SelectSamplingRate() 
====>AC97_SelectIntrMode() 

AC97_SelectSamplingRate():可以去掉由AC97_Init()中来赋值用,用宏USE_48K,USE_32K来分别设置为 
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 


关键字:声卡 引用地址:6410 声卡wm9713 驱动分析

上一篇:arm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依据什么来分类的
下一篇:最后一页

推荐阅读最新更新时间:2024-11-11 14:15

OK6410裸机学习第四天:4th_leds_params
start.S文件: .globl _start _start: 1、硬件相关的设置:把外设的基地址告诉CPU 0 ~ 0x6fff ffff为内存的地址空间,0x7000 0000 ~ 0x7fff ffff为外设寄存器的地址空间 ldr r0, =0x70000000 orr r0, r0, #0x13 mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff) 2、关看门狗 ,往WTCON(0x7E004000)写0 ldr r0, =0x7E004000 mov r1, #0 str r1, 3、设置栈,nand flash启动的时
[单片机]
在嵌入式Linux系统(OK6410)中移植Boa 服务器
OK6410的Boa服务器移植: 一 Boa的编译 1. 从 www.boa.org 下载 Boa 服务器的最新版:boa-0.94.13.tar.gz。 2. 解压:tar xzf boa-0.94.13.tar.gz 3. 进入解压后的文件夹 boa-0.94.13内部的 src文件夹,对源文件进行如下修改 1 由于arm-linux-gcc 编译器版本过高,对语法的支持有一些改变,所以需要修改compat.h中的 2 #define TIMEZONE_OFFSET(foo) foo##- tm_gmtoff 3 为: 4 5 #define TIMEZONE_OFFSET(foo) foo- tm_gm
[单片机]
在嵌入式Linux系统(OK<font color='red'>6410</font>)中移植Boa 服务器
基于Tiny 6410的内核移植 (NAND FLASH 、UBIFS篇)
一、环境 1、开发板 Tiny6410 NAND: 2G RAM: 256M MLC 2、操作系统 Ubuntu10 3、交叉工具编译链 arm-linux-gcc-4.5.1 二、下载内核源码包 linux-2.6.38 三、解压内核 tar –jxvf linux-2.6.38.tar.bz2 我解压的的路径是: 四、NAND FLASH移植 1、修改Makefile vim Makefile 将约191行改为: ARCH ? = arm CROSS_COMPILE ? = arm-linux- 2、cp arch/arm/configs/s3c6400_defconfig .config
[单片机]
在ubuntu下开发ARM裸机程序--S3C6410—LED
很多人都是在ads或者rvds或keil中开发ARM裸机程序,使用此类的开发工具虽然简单但是却不能使开发者很好的掌握更多程序原理,要想更好的掌握更多程序细节,感觉还是最好使用arm-linux-进行开发。 转载请注明出处,谢谢,张同浩:http://blog.csdn.net/muge0913/article/details/15016959 邮箱:muge0913@sina.com 下面是一个简单的点亮led灯的程序,在tiny6410上运行。其中set_peri_port函数是必须要添加的,这样才能访问到s3c6410的外设空间。 @ @ File:led_on.S @ 功能:LED点灯程序,点亮LED1 @
[单片机]
S3C6410输入子系统按键驱动程序
以前写的驱动程序要另外写一个测试程序,这样的驱动程序就有很大的局限性,只能自己用,为了通用性,别人的应用程序也可以用我的驱动程序就要引入输入子系统。在这个驱动程序里设置了5个按键L, S, ENTER, LEFTSHIFT, ESC.设置这几个按键主要是为了方便测试。以下是驱动程序button_input.c #include linux/module.h #include linux/init.h #include linux/fs.h #include linux/interrupt.h #include linux/irq.h #include linux/sched.h #include linux/pm.h
[单片机]
S3C<font color='red'>6410</font>输入子系统按键驱动程序
ARM Linux (S3C6410架构/2.6.35内核)的内存映射(五)
ARM Linux的访问权限控制 ARM1176JZF-S处理器为访问权限控制定义了两个层次:第一层是 域 (Domain)的访问类型,第二层是页或者段的 读写权限 (Access Permission)。具体来说,过程是这样的: 1. 在ARM处理器中,MMU将整个存储空间分成最多16个域,记作D0~D15,每个域对应一定的存储区域,该区域具有相同的访问控制属性。每个域的访问权限分别由CP15的C3寄存器中的两位来设定,c3寄存器的大小为32bits,刚好可以设置16个域的访问权限。 Bits 31, 30 29, 28 27, 26 25, 24 23, 22 21, 20 19,
[单片机]
基于S3C6410的ARM11学习(五) 核心初始化之关闭看门狗
之前已经完成了设置中断向量表和设置处理器模式。下一步,就是要关闭看门狗。 看门狗,这个东西,在嵌入式系统里面是很常见的一个东西。这个是芯片预先做好的硬件,软件可以对硬件进行配置。说白了,这个东西就是一个定时器,定时器溢出的时候,如果设置开启看门狗的话,就会强制CPU复位。这样,好处就是防止程序跑飞。因为程序正常执行的时候,我们肯定是要对看门狗计数清零的,这样才能保证看门狗不会溢出,不会使CPU复位。 S3C6410的看门狗有两个功能: 作为常规定时器,并且可以产生中断 作为看门狗定时器,当计数器递减为0,产生复位信号。 下面是看门狗的框图
[单片机]
基于S3C<font color='red'>6410</font>的ARM11学习(五) 核心初始化之关闭看门狗
s3c6410 完全由SD卡启动Linux流程
1. s3c6410 SD启动原理 s3c6410 支持Nand Flash本地启动Linux,包括内核,根文件系统,bootloader均写入在Nand Flash.这样可以独立运行. 很多情况下,Nand Flash的某种原因无法写入内核和Rootfs.而使用tftp下载内核,用NFS启动根文件系统比较慢.s3c6410 支持 SD卡启动,经过改造u-boot可以从SD卡引导内核,这样而Linux 又可以从SD卡的装载ext3根文件系统.这样可以制作一个完整的SD卡启动卡. 这样bootloader(u-boot)可以写入SD卡,引导扇区. bootloader的第一阶段把自己装入在内存高端地址看后,可以用两
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved