logo资料库

基于ARM9_Linux的楼宇对讲系统.pdf

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
第17卷 第1期 2011年3月 烟台职业学院学报 Journal of Yantai Vocational College 烟台职业学院学报 Vol.17 No.1 Mar. 2011 第17卷 基于ARM9_Linux的楼宇对讲系统* (1.海军航空工程学院,山东 烟台 264001;2.烟台职业学院,山东 烟台 264001 ) 李海燕1,2 摘要:近年,基于ARM内核的处理器被广泛应用,越来越多的楼宇对讲设备增加了语音、图像等多媒体处理能 力。本文利用三星的ARM9微处理器S3C2440和Philips公司的UDAl341芯片构建了一个嵌入式楼宇对讲系统,并给 出硬件电路的设计和基于Linux的实现,测试结果表明该系统采样、传输的语音信号清晰、流畅,可以双工通 话,可以应用于网络监控、视频传输等多种系统中。 关键词:嵌入式;ARM;Linux;音频;驱动程序 中图分类号:TP391.41 文献标识码:B 文章编号:1673-5382(2011)01-0052-06 1 问题的提出 双向语音通信是楼宇对讲系统的基本功能,随着嵌入式处理器技术的发展,原来被广泛采用的模拟语音 通信技术正逐渐被基于I P的数字语音技术所代替,如何设计一个高效率的双向语音对讲系统对基于其上的多 种应用都有很现实的技术意义。由此,本文提出一种利用三星公司的ARM9 2440处理器和Linux操作系统的 楼宇对讲系统[1]。 2 关键技术与实现 2.1 硬件平台的设计 本文采用的嵌入式微处理器为S3C2440,该芯片是一款使用A R M公司的A R M920T处理器核、0.18u m制 造工艺的32位微控制器;其拥有独立的16KB指令Cache、16KB数据Cache和存储器管理单元,最高可运行在 533M H z,具有更高的指令和数据处理能力,能够运行完整的L i nu x系统。同时它集成了USB控制器、以太网 控制、RTC、SPI、I2C等丰富的外围设备,系统采用的硬件平台的总体结构如图1所示。 收稿日期:2011-01-11 基金项目:山东省职业教育与成人教育十一五规划课题(编号:2007yt030). 作者简介:李海燕(1973-),女,山东牟平人,烟台职业学院讲师.海军航空工程学院在读硕士生. 52
第1期 李海燕:基于ARM9_Linux的楼宇对讲系统 图1 系统硬件设计 与本设计有关的有:中国台湾DAVICOM公司的以太网接口芯片DM9000A,该芯片集成10/100M物理层接 口,内部带有用来接收发送数据的FIFO缓存SRAM 16K字节,支持8/16bit两种主机工作模式,是实现嵌入式 设备网络接口的理想选择;一片采用SAMSUNG公司的64M NAND FLASH 芯片K9F1208;两片现代公司的 32M SDRAM芯片;IIS音频接口[2]。 2.2 音频系统的硬件设计 S3C2440内置数字音频接口IIS,IIS(Inter-IC Sound )是Philips公司提出的串行数字音频总线协议。目 前很多音频芯片和MCU都提供了对IIS的支持,UDA1341就是Philips公司生产的一款通用的支持IIS接口的音 频芯片,其采用位元流转换技术进行信号处理,具有可编程增益放大器(P G A)和数字自动增益控制器(AG C), 提供两组音频信号输入接口,每组包括左右2个声道。由于IIS总线只处理音频数据,因此UDA1341还内置用于 传输控制信号的L3总线接口,L3接口相当于混音器控制接口,可以控制输入/输出音频信号的高低音及音量大 小等,uda1341的L3总线由时钟,数据,模式3 根线构成,uda1341和S3C2440的连接如图2所示: 图2 UDA1341硬件原理图 由于S3C2440具备I I S总线接口,所以可直接外接8/16比特的立体声C O D E C,它还可以给F I F O通道提 供D M A传输模式,从而使数据发送和接收同时进行。I I S为了处理声音数据,提供了4根串行总线:串行数据 输入(I2SSDI)、串行数据输出(I2SSDO)、左右声道选择(IISLRCK)和串行位时钟(IISCLK)。另外,CDCLK 为 UDA1341 芯片提供音频A/D、D/A 采样时的时钟信号。S3C2440的IIS总线信号与UDAl34l的IIS信号直接相 53
烟台职业学院学报 第17卷 连。 S3C2440的TOUT2、TCLK0和TOUT3通用数据输出引脚和UDA1341TS的引脚L3MODE、L3CLOCK和 L3DATA分别连接,可以控制输入/输出音频信号的低音及音量大小,UDAl34l对外提供两组音频信号输入接 口,每组包括左右2个声道,本设计使用了其中的一组。 UDA l34l的VOUTL、VOUTR分别经过电容C405、C406和电阻R400、R401、R402、R403组成的低通滤 波电路和耳机相连接。VINL1、VINR1经过电容c407和话筒相连。 3 Linux下音频驱动的实现 音频设备驱动程序除了对硬件的控制实现音频流的传输,还要向上层提供标准的音频接口。设备驱动程 序需要完成的工作包括:对设备以及资源初始化及释放;读取应用程序传送给设备文件的数据转交给系统底 层处理,并回送应用程序请求的数据。U DA1341芯片的驱动程序结构如图3所示,从上到下可以划分为:用户 接口层、数据I/O层、硬件接口层三个层次。 图3 音频芯片的驱动程序结构框图 设备驱动的具体实现包括设备初始化、D S P驱动、M I X E R驱动和释放设备四部分。m i x e r(混音器)和 d s p(数字信号处理器) 是两个最基本的音频设备,m i x e r的作用是是将多个信号组合或者叠加在一起,在 L i u n x下,其对应的设备文件是/d e v/m i x e r,D S P为编解码器,实现录音和放音功能,其对应的设备文件是 /dev/dsp[3]。 3.1 DSP驱动的实现 DSP设备读取数据时,从麦克输入的模拟信号经过低通滤波以后发送给A/D转换器,A/D转换器将模拟信 号转变成数字信号并保存在音频驱动程序的内核缓冲区中,同时还要向应用程序提供read()系统调用接口。当向 D SP设备写入数据时,数字信号会经过D/A转换器变成模拟信号,应用程序可以通过w r it e()系统调用完成这个 过程。DSP驱动实现的主要工作就是完成file_operations中的open()、read()、write()、ioctl()等函数,其中ioctl() 函数能够对采样率、量化精度、DMA缓冲区块大小等参数进行设置[4]。 为了提高传输速度和系统性能,本系统使用DM A技术直接将需要回放或录制的声音存放在内核的DM A 缓存区中,由于S3C2440的DMA控制器没有内置的DMA存储区域,因而驱动程序必须在内存中为音频设备分 配D M A缓存区。缓冲区大小的设置对系统性能有很大的影响。因为音频数据量通常较大,缓存太小容易造成 缓存溢出,而如果要填充大的缓冲区,C P U就要一次处理大量的数据,这样处理数据时间较长,容易造成延 54
第17卷 第1期 2011年3月 第1期 烟台职业学院学报 Journal of Yantai Vocational College 李海燕:基于ARM9_Linux的楼宇对讲系统 Vol.17 No.1 Mar. 2011 迟。为此,本文采用一个环形缓冲区(ring buffer),将DMA缓冲区分成多个固定大小的块,块的大小可以通 过ioctl()系统调用来调整,驱动程序每次在声音缓冲区传送一个块的数据到用户的应用程序中。控制循环缓冲 区的两个结构为: typedef struct { int size; char *start; dma_addr_t dma_addr; struct semaphore sem; int master; } audio_buf_t; typedef struct { audio_buf_t *buffers; audio_buf_t *buf; u_int buf_idx; u_int fragsize; u_int nbfrags; dmach_t dma_ch;} audio_stream_t; audio_buf_t内记录了每个DMA缓存区的长度,虚拟地址,物理地址以及一个用来防止多个write对缓存 区同时操作的信号量。audio_stream_t内包含了指向循环缓存区开始的指针,正被使用的缓存区的指针,每个 缓存区的大小,缓存区的个数以及使用的dma通道号。 如果要驱动DSP,还需要注册一个DSP设备,注册函数为:Int register_sound_dsp(struct_file_operatio ns *fops,int dev);参数fops是一个文件操作接口,第二个参数dev是设备编号,如果值为-1,则系统自动分配 一个设备编号。 3.2 MIXER驱动的实现 M I X E R驱动只控制混音效果,可以控制输入/输出音频信号的低音及音量大小等。其中最主要的函数为 static int mixdev_ioctl(struct inode* inod,struct file *file,unsigned int cmd,unsigned long arg); Ioctl()函数通过不同的I/O控制命令来实现mixter的不同功能。本文实现的主要控制命令有: 表1 MIXER主要控制命令 用户的应用程序可以调用ioctl()函数对mixer进行控制。 3.3 L3接口设计 L3接口由S3C2440的引脚TOUT2、TCLK0和TOUT3组成,与S3C2440的B组通用寄存器GBB2、GPB3、 GPB4复用。在设备mixer工作之前,需要对这些端口进行初始化,本文是用了下面的宏将引脚初始化为输出模 式、低电平触发。 set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_B4); set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_B3); 55
烟台职业学院学报 第17卷 set_gpio_ctrl(GPIO_MODE_OUT | GPIO_PULLUP_DIS | GPIO_B2); 3.4 设备的安装与卸载 在UDA1341 加载模块中,除了需要初始化IIS接口、设置L3总线对应的GPIO、设置UDA1341的工作模式, 还需要申请DMA通道和注册dsp 和mixer接口。 S3C2440具有4个D M A通道,为了实现存储器和I/O之间的传输,本文采用D M A通道1输出声音数据, DMA通道2来输入声音数据,其初始化的过程代码为: output_stream.dma_ch = DMA_CH2; if (audio_init_dma(&output_stream, "UDA1341 out")) { channels\n" ); audio_clear_dma(&output_stream); printk( KERN_WARNING AUDIO_NAME_VERBOSE ": unable to get DMA return -EBUSY;} input_stream.dma_ch = DMA_CH1; if (audio_init_dma(&input_stream, "UDA1341 in")) { audio_clear_dma(&input_stream); printk( KERN_WARNING AUDIO_NAME_VERBOSE ": unable to get DMA channels\n" ); return -EBUSY;} 设备的卸载由注销函数c l o s e()来完成。注销函数释放驱动程序使用的各种系统资源,如D M A和缓冲区 等。 3.5 录音与放音 设备驱动程序完成以后,就可以在用户空间实现数据的输入和输出,其程序流程图为: 图4 用户录放音程序 采样率设置为44.1khz,位数为16bit,格式为立体声,双声道,主要实现了对DSP接口的读写,读数据的过 程就是录音的过程,写数据的过程就是播放的过程。测试用的读函数格式为: Static ssize_t audio_read(struct file *file,char *buffer,size_t count,loff_t *ppos); 测试用的写函数格式为: Static ssize_t audio_write(struct file *file,char *buffer,size_t count,loff_t *ppos); 参数file是要操作的设备,在使用之前必须要打开,buffer 是一个环形的缓冲区,每次读写缓冲区的大小 由count来设定,ppos为用来控制数据的指针。 4 数据的传输 56
第17卷 第1期 2011年3月 第1期 烟台职业学院学报 Journal of Yantai Vocational College 李海燕:基于ARM9_Linux的楼宇对讲系统 Vol.17 No.1 Mar. 2011 为了实现设备之间的对讲,还要能够在设备间进行数据传输,数据传输是利用S O CK E T来实现的,在每 一个终端上都实现了一个服务器应用程序,监听端口是3391,如果接收到一个响应,就利用服务器管理程序进 行数据处理。考虑到楼宇对讲系统的特点,不会有两个网络请求同时到达同一个终端的情况,所以本文采用循 环服务器模型来处理数据,在同一时刻只能处理一个客户机请求。服务器在接收到一个客户机请求之后,立 即处理,在处理完这个请求之后再继续下一个。在处理一个请求的过程中,下一个请求将等待[5]。 5 测试 整个测试系统分为前端设备和终端设备两部分,拓扑结构如图五所示。 驱动程序被单独编译为一个可加载的模块,模块的加载代码写在文件/etc/profile文件中,在liunx内核启 动以后,会自动执行这个脚本文件,在控制终端可以看到有“UDA1341 audio driver initialized” 信息,说 图5 系统测试模型 明设备已经初始化。进入终端之后,查看设备文件名: ls -al /dev/sound/* crw------- 1 root root 14, 3 Jan 1 00:00 /dev/sound/dsp crw------- 1 root root 14, 0 Jan 1 00:00 /dev/sound/mixer 可见,设备已经成功驱动。此时运行用户空间的音频信号采集、播放、数据传输程序就可以实现双向语音 对讲[6]。 本文提出一种在嵌入式系统中构建基于I I S总线的音频系统的可行方法,并且实现了音频的播放和录音 的采集、数据传输功能。该系统已经在基于S3C2440的开发平台上得到了实现,可以顺利进行音频的播放和采 集。语音数据的高效、可靠传输是实现网络监控、可视的一个重要基础,本设计可以为进一步的应用提供参考[7]。 参考文献: [1]佚名.跨平台的音频接口简介[EB/OL].http://www.ibm.com/developerworks/cn/linux/l-ossapi/index.html,2003. [2]白冰,张跃.基于ARM的远程实时心电监护仪软件设计实现[J].计算机工程与设计,2009,30(12):2830-2833. [3]宋宝华.Linux设备驱动开发祥解[M].北京:人民邮电出版社,2008. [4]W.Richard Stevens,Stephen A.Rago Advanced Programming in the UNIX Environment,Second Edition,2008,12. [5]W.Richard Stevens,Bill Genner, Andrew M.Rudoff, UNIX Networking Programming,Volume 1:The Sockets Netwirking API,3E,2006,1. [6]张跃进,谢昕.嵌入式网络数字视频监控系统的设计[J].计算机工程与设计,2009,30(4):805-807. [7]张海滨,李辉.基于S3C2410的WMA开源解码程序优化[J].计算机工程与设计,2009,30(1):13-14. (责任编辑 侯中岩) 57
分享到:
收藏