《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于SEP4020的嵌入式Linux 音频驱动程序设计
基于SEP4020的嵌入式Linux 音频驱动程序设计
程 杰,凌 明
东南大学 国家专用集成电路系统工程技术研究中心,江苏 南京 210096
摘要: 论述了Linux操作系统中声卡驱动程序的设计方法,主要介绍了基于OSS的声卡驱动设计原理以及Linux操作系统中声卡驱动程序的接口函数。针对具体硬件平台编写了相应的驱动程序,并介绍了在Linux操作系统中使用声卡设备的几种常见方法。实现了SEP4020处理器在Linux平台的声卡驱动。
Abstract:
Key words :

摘 要:论述了Linux操作系统中声卡驱动程序的设计方法,主要介绍了基于OSS的声卡驱动设计原理以及Linux操作系统中声卡驱动程序的接口函数。针对具体硬件平台编写了相应的驱动程序,并介绍了在Linux操作系统中使用声卡设备的几种常见方法。实现了SEP4020处理器在Linux平台的声卡驱动。
关键词:Linux驱动程序UDA1341;SEP4020

  目前,手机、MID、MP3等许多嵌入式设备都包含数字音频设备,数字音频系统一般由处理器通过IIS、AC97等接口连接外部音频编解码器(CODEC),音频解码器实现声音的AD和DA转换。音频编解码是数字音频系统的核心,衡量其性能的主要指标有采样频率和量化精度。在Linux系统中,为了处理数字音频相关工作,先后出现了2种音频设备框架:OSS和ALSA。ALSA完全开放,但是OSS更为成熟,本文将基于OSS架构介绍数字音频设备和音频设备接口。
1 软硬件平台
1.1 SEP4020嵌入式处理器
   本文所述驱动程序基于SEP4020嵌入式微处理器,SEP4020是由东南大学国家专用集成电路系统工程技术研究中心设计的一款处理器,采用0.18 μm 标准CMOS 的工艺设计,内嵌ASIX CORE(32 位RISC 内核,兼容ARM720T,带8 KB 指令数据Cache 和全功能MMU)。SEP4020芯片中集成各种功能,包括:
  (1)8/16 bit SRAM/NOR FALSH接口,16 bit SDRAM接口;
  (2)硬件NAND FLASH控制器,支持NAND FLASH自启动;
  (3)10 M/100 M自适应以太网MAC,支持RMII接口;
  (4)64 KB高速片上SRAM;
  (5)支持IIS音频接口;
  (6)支持MMC/SD卡;
  (7)LCD控制器,支持TFT彩屏和STN黑白、灰度屏;
  (8)RTC,支持日历功能/WatchDog,支持后备电源;
  (9)10通道TIMER,支持捕获、外部时钟驱动和MATCH OUT;
  (10)4通道PWM,支持高速GPIO;
  (11)4通道UART,均支持红外;
  (12)USB1.1 Device,全速11 Mb/s;
  (13)2 通道SSI,支持SPI 和Microwire 协议;
  (14)2 通道SmartCard 接口,兼容ISO7816 协议;
  (15)支持最多91个GPIO,14个外部中断;
  (16)支持外部DMA 传输;
  (17)片上DPLL,支持IDLE、SLOW、NORMAL、SLEEP等多种功耗模式。
1.2 IIS音频接口
  本文主要使用了SEP4020处理器的IIS音频接口,IIS接口(Inter-IC Sound)在20世纪80年代首先被Philips公司用于消费音频产品。IIS总线只处理声音数据,其他信号(如控制信号)必须单独传输。为了使芯片的引出管脚尽可能少,IIS只使用了3根串行总线,分别是提供分时复用功能的数据线、字段选择线(声道选择)、时钟信号线。SEP4020的IIS控制器具有如下功能:
  (1)支持MASTER 和SLAVE 模式;
  (2)支持TRANSMITTER 和RECEIVER 功能;
  (3)支持32、16、8 bit字长;
  (4)支持立体声和单声道;
  (5)支持静音和停止播放;
  (6)数据高位(MSB)先出/先入;
  (7)接收发送共享8×32 数据FIFO。
1.3 UDA1341音频编解码芯片
  SEP4020开发板使用的音频编解码芯片为NXP公司的UDA1341。UDA1341支持IIS总线数据格式,采用位元流转换技术进行信号处理,具有可编程增益放大器(PGA)和数字自动增益控制器(AGC)。 UDA1341对外提供2组音频信号输入接口,每组包括左右2个声道。由于IIS总线只处理音频数据,因此UDA1341还内置用于传输控制信号的L3总线接口。L3接口相当于混音器控制接口,可以控制输入/输出音频信号的低音及音量大小等。
1.4 Linux嵌入式操作系统
  软件平台采用Linux,版本号为2.6.16。Linux是当今最流行的操作系统之一,由于其源码开放性,现代操作系统设计的新思想和新技术能够不断用于其中,是一个非常好的学习平台。其次,Linux操作系统占用资源较少,对处理器要求低,可运行于大多数含MMU的处理器上,特别适合嵌入式领域。SEP4020处理器运行频率为88 MHz,拥有MMU单元,因此选择Linux操作系统作为其软件平台。此外,Linux平台具有完善的音频设备框架,基于该设备框架编写相应的驱动程序可以大幅简化开发难度,缩短开发时间。
2 Linux OSS音频设备驱动
  OSS(Open Sound System)是Unix平台上一个统一的音频接口。过去,每个Unix厂商都会提供一个自己专有的API用来处理音频。这就意味着为一种Unix平台编写的音频处理应用程序,在移植到另外一种Unix平台上时,必须要重新编写。OSS出现以后情况就大不一样了,只要音频处理应用程序按照OSS的API来编写,那么在移植到另外一个平台时,只需要重新编译即可。因此,OSS提供了源代码级的可移植性。由于Linux对Unix有着良好的兼容性,因此只需很少的改变,就可以使基于OSS的程序在Linux下正常运行,Linux内核也对OSS架构提供了完善的支持。
2.1 OSS驱动组成
  OSS标准有2个基本音频设备:DPS(数字信号处理器)和Mixer(混音器)。
  DSP也称为编解码器,可实现录音和放音的功能,其对应的设备文件是/dev/dsp或者/dev/sound/dsp。向该设备写数据即意味着激活CODEC上的D/A转换器进行播放,而向该设备读数据则意味着激活声卡上的A/D转换器进行录音。DSP的指标主要有:采样速率(电话为8kHz,CD为44.1 kHz)、通道数目(单声道、立体声)、量化精度(8 bit、16 bit)。
  Mixer设备用来控制多个输入、输出的音量,也控制输入(microphone、line-in、CD)之间的切换。
2.2 DSP和Mixer设备函数接口
  DSP设备接口函数中比较重要的有read( )、write( )和ioctl( )等。
  write( )函数的作用是从用户空间复制音频数据到内核空间缓冲区并最终发送到音频控制器。在数据从缓冲区复制到音频设备的过程中,通常会使用DMA。在放音时,驱动设置完DMA控制器的源地址和目的地址,DMA控制器会自动将数据发送到CODEC的FIFO中,直到发完设定数据再通知上层。
  read( )函数的作用是从音频控制器中获取录音数据到缓冲区并复制到用户空间。
  ioctl( )函数用来设定采样速率、通道数、量化精度、DMA缓冲区大小等参数。
  mixer设备主要通过ioctl( )函数来实现不同的功能。
2.3 OSS用户空间编程
  OSS的层次结构非常简单,用户通过调用API函数访问OSS驱动。开发OSS应用程序的一般流程是:
  (1)在应用程序中包含OSS结构的头文件#include <linux/soundcard.h>; 
  (2)打开设备文件,返回文件描述符;
  (3)使用ioctl( )函数设置设备参数;
  (4)使用read( )函数录音或使用write( )函数放音;
  (5)关闭打开的设备,结束应用程序。
3 SEP4020+UDA1341 OSS驱动设计
3.1 硬件接口描述
  如图1所示,SEP4020芯片与UDA1341相连,UDA1341的L3总线用来配置其自身的参数,可以用来控制输入/输出音频信号的音量大小、增益、低音等。IIS _SCK 为UDA1341 接口的时钟信号;GPIO_PG11 用作GPIO 来控制双向模拟开关4066,将处理器IIS 接口数据信号IIS_SD 连接在UDA1341的数据输入或者输出信号上,从而进行录音/放音的数据切换。SEP4020与UDA1341的详细接口描述如表1所示。

3.2 注册驱动及初始化硬件接口
  在UDA1341 OSS驱动的模块加载函数中,将完成以下工作,初始化代码参见图2。

  

  (1)初始化3根GPIO口,模拟UDA1341的控制总线——L3总线;
  (2)初始化IIS的控制口,配置成IIS模式;
  (3)初始化PWM,提供CDCLOCK信号;
  (4)调用init_sep4020_iis_bus( )函数,初始化IIS寄存器;
  (5)调用init_uda1341( )函数,初始化UDA1341芯片;
  (6)调用audio_init_dma( )函数,初始化DMA控制器;
  (7)注册DSP和Mixer2个设备。
  初始化PWM给CDCLK提供信号时,由于UDA1341芯片本身要配一个分频系数(256、384、512),这里使用了256,所以PWM频率要配成接近44.1 kHz×256,最终配出的CDCLK和采样率如下:
  88 MHz/(4×2)=11 MHz (PWM4_DIV_V =0×4)
  11 MHz/256=42.96 kHz
  初始化IIS时也要配置一个分频系数,即SCK时钟分频参数,参考SEP4020数据手册,计算得到88 MHz主频时配为0×1F最接近44.1 kHz。
  初始化UDA1341芯片时首先完成2个函数,uda1341_l3_address( )和uda1341_l3_data( )。SEP4020使用GPIO用口线模拟,初始化参数中,重音、清晰度随便配即可,分频比配置为256 fs;SEP4020的工作模式必须配置成IIS方式,否则是杂音;音效可以尝试替换各种参数,以获得最佳效果。
3.3 DSP接口音频数据传输
  OSS声卡驱动中,DSP接口的读写函数是核心,编写OSS声卡驱动程序需要完整的最关键的函数是read( )和write( )。
  以write( )函数为例,在函数现实中使用了Ring Buffer(环形缓冲区)技术。具体实现方法为:初始化设备时开辟8个环形缓冲区(缓冲区数量可自由配置),从内存中申请了8块独立空间。当驱动调用write( )函数时,系统以此使用这8个缓冲区,并不断地填充数据进入缓冲区。当每一个缓冲区填充完毕,就将其排列进DMA列队,然后继续填充下一个缓冲区。如果所有缓冲区都进入DMA列队,则进程进入挂起状态,等它出现空闲缓冲区。
  同时,write( )函数负责配置SEP4020的硬件DMA,每次DMA传输前需要清空相应通道上的DMA传输完成中断寄存器。每次传输的数据大小为8 196 B,DMA的burst长度配置为4,源端地址配置为缓冲区地址,目的地址配置为IIS硬件寄存器FIFO地址。特别需要注意的是由于Linux操作系统采用虚拟内存管理,所有经过CPU处理的数据(包括寄存器地址)都必须使用虚地址。由于DMA操作不经过CPU处理,因此对其配置时,DMA源和目的地址需要填入物理地址。具体配置代码见代码清单2,更详细的说明请参考SEP4020用户手册[4]。
  本文介绍了针对SEP4020处理器在Linux操作系统下声卡驱动的开发流程,叙述了Linux OSS层、SEP4020的IIS控制器和UDA1341音频解码芯片的基本原理。本驱动的开发主要为Linux OSS层和IIS-UDA1341硬件编写接口函数和数据结构,为底层硬件和上层软件提供了连接的桥梁。在Linux OSS基础上,用户可以开发丰富多彩的应用程序,满足客户提出的多媒体音频需求,为嵌入式Linux的应用开辟了更广阔的道路。
  IIS-DMA寄存器配置代码清单如图3所示。

 

参考文献
[1] 冯国进.嵌入式Linux驱动程序设计从入门到精通 [M]. 北京:清华大学出版社,2008.
[2] 韦东山.嵌入式Linux应用开发完全手册 [M]. 北京:人民邮电出版社,2008.
[3] 宋宝华. Linux设备驱动开发详解 [M]. 北京:人民邮电出版社,2008.
[4] SEP4020用户手册v1.7.1[Z].南京博芯电子技术有限公司,2009.
[5] Superlp.s3c2410-uda1341.c[Z].三星电子有限公司,2008.
 

此内容为AET网站原创,未经授权禁止转载。