android_alsa_audio

1. pcm

 http://wenku.baidu.com/view/7691023331126edb6f1a109f.html 

2. http://www.amobbs.com/thread-3901903-1-1.html telechips  资料


http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3212045&bbs_page_no=2&bbs_id=1000



一种使用SPI连接I2S接口的音频DAC的方法


年前搞了个LPC2148最小板,写了些简单的程序后,打算做一个WAV播放器玩玩。结果发现LPC2148不带I2S接口,而非I2S接口的音频DAC基本没有,这下有些后悔买的是不带I2S的片子。后来在网上转啊转,终于发现有人成功用SPI接口模拟I2S的:


1
http://www.k9spud.com/traxmod/


下了源代码后读了半天始终没搞懂SPICS信号是怎么控制的,而且PCM1770我这里还买不到。
2
、坛子里面有人用LPC2136连接PCM1716,不过据作者本人说只能有一个声道有声音
……
最后只好自己搞,研究了两个礼拜,终于成功搞了出来。

NXP的网站上可以找到I2S接口的说明书,分析一下I2S总线特点:1、数据不能断流;2、时序上有严格的要求。这两条决定了如果我打算用没有FIFOSPI接口模拟I2S总线,SPI就不可能工作在主机方式,事实上两面两个成功的例子当中SPI也都是工作在从机方式的。I2S总线上的数据位可以从16bit-24
bit
不等,为了使SPI就口有足够的时间装填数据,因此选择24bit的数据格式。剩下的就是如何产生I2S总线的2个信号BCLKLRCK,音频DAC的工作信号MCLKSPI接口的CS信号的问题了。起初打算用LPC2148自己产生这些信号,结果发现不行,因为没有足够的PWM通道。最后想了一个不太经济的方法,就是用单片机产生这些信号。起初用的是tiny2331 — 两路独立的PWMBCLKLRCK) 系统时钟输出(MCLK),但是CS的时序时钟调不好;后来打算换成mega8 — 三路独立的PWMBCLKLRCKCS) + 74HC04MCLK);在查找手册的时候发现mega48tiny2313一样有系统时钟输出功能,重要的是mega48时可以跑20MHz的,正好手头有一片mega48,就用它了。

整理一下方案:
I2S
数据输出使用LPC2148SPI接口,16-bit从机方式,MISO输出I2S数据,在中断中加载下一输出数据;
mega48
工作在16.9344.MHz,分别由PB0(设置熔丝位)、PD6PB1PB3输出MCLKLRCKBCLKCS,程序比较简单如下

#include <avr\io.h>
#include <util\delay.h>

#define SYS_LED     PD1

#define SET_LED  PORTD &= ~_BV(SYS_LED)
#define CLR_LED  PORTD |=  _BV(SYS_LED)

#define NOP __asm__ __volatile__("nop")

int main(void){
CLR_LED;
DDRB = _BV(PB0) | _BV(PB1) | _BV(PB3);
DDRD = _BV(PD6);

_delay_ms(10);

/* use Timer0 to generate LRCK : CTC mode, TOP = OCR0A, OCR0A toggle */
OCR0A  = 192 - 1;
TCCR0A = 0x42;

/* use Timer1 to generate SSEL : fast PWM mode, TOP = ICR1, OCR1A set on match and clear on TOP */
ICR1H = 0;
ICR1L = 192 - 1;
OCR1AH = 0;
OCR1AL = 128 - 1 - 2;
TCCR1A = 0xC2;

/* use Timer2 to generate BCLK : CTC mode, TOP = OCR2A, OCR1A toggle */
OCR2A  = 4 - 1;
TCCR2A = 0x42;

TCCR2B = 0x01;  // BCLK start
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
TCCR0B = 0x01;  // LRCK start
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
TCCR1B = 0x19;  // SSEL start

SET_LED;
while(1);

return 0;
}

用上述方法连接CS4334成功,两个声道均能正常发生;LPC2148中开两个1K(小了没试过)的Buffer可以流畅播放44.1KHz 16bitWAV文件(经过FAT系统,用fatgetc读取数据)。

不过用此法连接PCM1742的时候,输出有极大的噪音,不知道是DAC输出部分没搞好还是芯片有问题。有兴趣的朋友可以交流一下


SD卡看下图。模拟的难点不是产生BCLKLRCK,而是SPICS信号;因为这个CS信号并不是在LRCK跳变的时候变低的,而是在跳变之后的一个SCLK周期之后变低的,而且16SCLK周期之后要变高。也就是说CS信号的周期是LRCK的二倍,占空比低:高 = 21,与LRCK有固定“相位差”。我之前用LPC2148的定时器捕获SCLK然后产生CS信号,没能成功,主要是同步调不好,后来干脆这部分就全用单片机处理


以我做的为例:WAV音频文件的采样率是44.1KHz,也就是说LRCK的频率就是44.1KHz(高电平一个声道,低电平另一个声道),这个频率也称为fs;一般音频DAC要求MCLK256倍或者384倍的fs,我这里i2s采用的是24-bit格式,为了使MCLK能整除因此采用的是MCLK=384*fs,也就是16.9344MHz;而BCLK=fs*i2s位数*2=2.1168MHz。综上,采用mega48工作在16.9344MHzPB0输出系统时钟;一个定时器工作在CTC模式、不分频、计时192-1输出一翻转,这样得到LRCK;一个定时器工作在CTC模式、不分频、计时4-1输出一翻转,这样得到BCLK;一个定时器工作在PWM模式,周期192-1清零、比较匹配128-1-2(略小于16BCLK周期)时置位,这样得到SPI的片选信号。

你的意思是mega48SPI设置成主机向DAC送信号吧,这样做你的BCLK是不连续的,会出现问题


给大家一个技术参考,timsp430i2spdf
一直没找到焊接TLV320AIC23B的转接板,心痒了好久
这个资料应该很有用

另外TLV320AIC23B还有一个dsp模式
nxp
luminaryssp接口(估计他们的ip核是一样的)都有一个ti serial模式,
23b可以非常方便的连接.(时序也有少许不同,但更好处理)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
wolfson公司音频芯片的ppt介绍,将音频开发的大致流程和关键点都写出来了,新手值得一看。V. wolfson Android audio stack Applications MediaPlayer Media Recorder Audio Flinger iaudio 3@2011 Wolfson Microelectronics plc April2011www.wolfsonmicro.com V. wolfson Modern smartphone audio subsystems HDM CPU Earpiece Speaker Mixing DSP Headset Dock Cellular Bluetooth modem 4@ 2011 Wolfson Microelectronics plc April2011www.wolfsonmicro.com V. wolfson Flexibility and complexity zua Lrm l t H LD1 CHARGE PUMP CB INlLNO 一IN2 LNDMICDAT1 CHPOUT1L IN2LPVRXP IN1RNO oHPOUT1R INIRP t-IN2RNDMICDAT2 HI HEADPHONE HPOUT1FB RIVERS IN2RPNRXNO 4 Digital MIC CHPOUT2P POUT2N → Channels E ERVER CUTPL ANALOGUE PKOUTLP ARc MULTHCHANNEL DIGITA MIXER dSPKOUTLN INTERFACE ADCL H FILTERS MIXING osPKOUTRP MPUT JsPKOUTRN MERS RrTurcMabik LOUDSPEAKER P限 AMIETRKC EQUALISE FILTERE DRTERS VOLIME 口 FNAMIC RANGE COONTROL VCLUME凵DAc LINEOUT1P RECORD CD STEREO EXPYNSICN 4 MIC OLINEOUTIN DMICDAT1 DIGITAL MIG CHANNELS HIGH ASYNCHRONOU DMICDAT2 PASS R八 TE CONVERS|N NTERFAGE QLINEOUT2P DMICCLKO4 FILT-R5 DLINEOUT2N MICDET ACCESSORY MIC AcUNy derect GPiO RECORD DETECT LINE CRIERS LINEOUTFB MICBIAS10* FLL1 12S/PCM#1 12SPCM #2 12S/PCM#3 INTERFACE MICBIAS2O+ 5 02011 Wolfson Microelectronics plc April2011www.wolfsonmicro.com V. wolfson Traditional driver model Memory Processing Analogue 6 O2011 Wolfson Microelectronics plo April2011www.wolfsonmicro.com V. wolfson Traditional driver model Monolithic driver for each card No structure for managing off-CPU hardware Very little reuse Tight coupling between application and kernel code Per-use case register settings Detailed register level knowledge of components Time consuming 7@2011 Wolfson Microelectronics plc April2011www.wolfsonmicro.com V. wolfson The Linux solution ASoC embedded audio framework Merged since 2.6.21, April 2007 e Provides standard aLSA interface to applications Reusable drivers for each chip Minimal per-system drivers Use case configuration done by userspace Automatic and transparent power management More reuse, less coupling g 8@2011 Wolfson Microelectronics plc April2011www.wolfsonmicro.com V. wolfson Dynamic Audio Power Management Looks for audio paths connecting inputs to outputs Powers only components in an active path Automatically activates DACs and ADCs DAC Speaker Mixer FM radio Headset 9 C 2011 Wolfson Microelectronics plc April2011www.wolfsonmicro.com V wolfson ASoC coDEC drivers Four classes of control Audio processing controls(eg, volume, effects) Audio routing controls(DAPM controls and routes Power controls(DAPM widgets, bias Stream control (Digital audio streaming) Mostly direct mapping into register map SOC DOUBlE R TLV DACI Volume WM8994 DAC1 LEFT VOLUME WM8994 DACI RIGHT VOLUME 1, 96,0, digital tlv 10@ 2011 Wolfson Microelectronics plc April2011www.wolfsonmicro.com
Android凭借其开源,良好的用户体验,高性价比,庞大的应用程序等优势迅速发展起来并保持强劲的发展势头。如今Android智能手机、Android平板电脑等移动产品已走入人们的日常生活,成为人们通讯、娱乐的重要工具。本设计以malata采用RK2918方案的Android平板电脑项目为背景,主要任务是设计和实现Android平板电脑的音频系统,为广大平板用户提供良好的音频体验。 ALSA(Advanced Linux Sound Architecture,高级Linux声音架构)在Linux操作系统上提供了音频和MIDI(Musical Instrument Digital Interface,音乐设备数字化接口)的支持。它的主要特性包括:高效地支持从消费类入门级声卡到专业级音频设备所有类型的音频接口,完全模块化的设计,支持对称多处理和线程安全,对OSS(Open Sound System,开放声音系统)的向后兼容,以及提供了用户空间的alsa-lib库来简化应用程序的开发[1]。基于ALSA的音频系统能够很好的适应硬件的多样性,因此Android设备厂商能够更灵活地根据不同需求选择不同的音频编解码芯片。ALC5625是一款高度集成低功耗高保真的带I2S/PCM接口并具有多路输入输出的音频编解码器,可满足本次设计的各项需求。 基于ALSA的Andorid音频系统拥有一个标准和健全的架构,自上而下由Audio应用程序、Audio Java框架层、Audio本地框架层、AudioFlinger、Audio硬件抽象层、alsa-lib和底层Audio驱动几个部分组成。本文分析音频系统架构的各个层次,并着重阐述ALSAAndroid音频系统中的应用以及Audio驱动的详细实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值