引言
源码开放的μClinux由于其强大的网络功能和较低的成本,得到了广泛的应用。嵌入式蓝牙公共交换电话网络PSTN(Public Switched Telephone Network)语音接入点,就是我们和广东省电信科学研究院合作,在μClinux系统上开发的一种具有广阔前景的应用。其应用场景如图1所示。
蓝牙GSM双模手机在进入蓝牙PSTN语音接入点的信号覆盖范围后,即自动通过接入点在PSTN网络上登记,这样用户的话务就被转移到PSTN网络,使用时只需缴纳固定电话费;网关具有小型交换机的功能,可以为多个蓝牙手机提供类似的服务;而且同一个接入点信号覆盖范围之内的蓝牙手机间,还可以不经过PSTN直接进行相互间通话,就像对讲机一样,不用付费。本文主要介绍接入点软硬件以及设备驱动程序的设计与实现。

1 硬件的设计与实现
嵌入式蓝牙PSTN语音接入点的硬件系统框图如图2所示。整个接入点主要由网关控制模块、电话线路接口模块和蓝牙收发模块组成。

1.1 网关控制模块
网关控制模块是整个网关软件的运行平台。ΜClinux操作系统运行于此硬件平台之上,而所有应用软件又运行于操作系统之上。复杂的控制流程以及大量的外扩模块要求MPU具有较强的处理能力。经多方权衡,本设计最终选用了Motorola公司的ColdFire嵌入式处理器MCF5272。
MCF5272内部的SRAM和ROM对于运行μClinux操作系统是远远不够的。本设计对MCF5272的RAM和ROM进行了扩充,外扩了16MB的SDRAM和4MB的Flash ROM。这样的存储器配置不仅满足了语音接入点软件的需要,还为网关增加各种功能留有较多的余地。
1.2 电话线路接口模块
电话线路接口模块是网关和PSTN的接口,由线路切换继电器、电话线接口芯片、DTMF接收电路、DTMF发送电路和FSK解调及振铃接收电路组成。它通过MCF5272的12根GPIO线和4个外部中断线和网关控制模块相连。线路切换继电器用于实现电话线上的信号在振铃接收电路和语音电路之间的切换,即实现摘机挂机的功能。在待机状态下继电器触点切换在振铃接收电路一侧,等待接收振铃信号。当需要摘机时,MCF5272控制继电器切换到话音电路一侧。
电话线路接口芯片选用Philips公司的TEA1062A。TEA1062A把电话线上送来的模拟语音信号放大后发送到蓝牙收到模块的PCM编解码器;相反,也把PCM编解码器送来的语音信号放大后,放到电话线上传输。此外,它还提供了消侧音、自动增益控制等功能。
网关还需具备转发来电显示信息的功能。常见的来电显示标准分为DTMF和FSK两种。我国的来电显示国家标准是FSK制式的,大部分PSTN交换机也支持FSK标准的来电显示信息;但是也有少量PSTN交换机和一些用户内部交换机发送的是DTMF标准的来电显示信息。我们HOLTEK的HT9170D以及HT9032C芯片分别接收DTMF及FSK来电显示信息。
网关向PSTN交换机拨号和普通的电话一样,采用DTMF信号,同时也可以用DTMF信号向PSTN交换机发送一些信令信息。网关的DTMF发送选用FOLTEK的HT92
在μClinux下,所有的硬件设备都被视为文件,从设备接收输入数据和将输出送到设备就像从普通文件接收输入和将输出送到文件一样,可以使用read()、write()等系统调用。应用程序通过系统调用和内核交互,而内核则通过设备驱动程序和具体硬件交互,如图3所示。一般来说,操作系统内核需要访问三类主要设备:字符型设备、块型设备以及网络设备。本接入点的驱动程序属于字符设备驱动程序。

每个驱动都有一个称为file_operations的数据结构,包含指向驱动程序内部大多数函数的指针。当系统引导时,驱动程序初始化函数将file_operations结构的指针送给内核,内核就可以通过该指针访问驱动程序内的函数。因而,这些函数就是进入驱动程序的基本入口点。当用户程序执行系统调用时,将导致驱动程序内相应的函数被调用。
2.2 需求分析
嵌入式蓝牙PSTN语音接入点的硬件设计中,电话线路接口模块、蓝牙收发模块是外扩的模块,需要在μClinux内核为基提供支持。
蓝牙收发模块通过MCF5272的串口2和网关控制模块相连,因而直接使用μClinux自带的串口驱动程序就可以完成对此模块的控制;而电话线路接口模块通过GPIO口以及外部中断线与网关控制模块相连,必须由我们自由提供驱动程序。
2.3 FSK来电显示芯片驱动的设计与实现
FSK来电显示驱动的主要任务就是完成FSK来电显示信息的接收,总工作流程如图4所示。其主要功能由设备驱动程序基本入口点中的open、release、read、ioctl、select函数,以及设备初始化函数、中断处理函数、下半部分处理函数、定时器超时处理函数完成。下面对其中一些关键的函数进行简要介绍。

(1)read函数
read、write称为对设备的I/O操作。当用户进程对设备执行I/O操作时,设备可能并不具备

对于设置为双模的蓝牙手机,必须先向网络登记,网络返回成功信息的方可与网关建立物理和逻辑链路;而在双模手机主动与网关拆开物理链路时,也必须向网络登记。接入点可以发现已登记的双模手机是否离开本网关信号覆盖范围,并自动向网络登记,将双模手机的话务切换回移动网络中,而并模终端无需这样的操作。网关可同时与7个蓝牙终端建立ACL(Asynchronous Connection Less)对于不同调制方式(FSK及DTMF)来电均能接收号码以及振铃,并根据来电号码分析被呼叫方,根据蓝牙无绳电话协议CTP(Cordless Telephony Profile)建立起TCS(Telephone Control Specification)链路、SCO(Synchronous Connection Oriented)链路。当来电显示为非特服号开头的号码时,表示来电来普通电话,所有与网关相连的分机终端都振铃。某一终端接听后,其它终端停止振铃,回到空闲状态。当来电显示为特服号开头的时候,表示来电为访问特定终端的话务,可以分析来电显示的格式得到接入顺序号,并使对应的蓝牙终端振铃。蓝牙双模或者单模终端能通过网关、PSTN网络拨打外部电话,网关支持终端多次拨号,并且外部电话能收到来电显示。
我们设计的应用程序流程如图6所示。在μClinux系统中,此应用程序被视为一个用户进程。在系统启动rc脚本文件的末尾添加该进程,则系统在完成初始化工作后会自动启动该进程。对用户进程而言,硬件设备被视为设备描述文件,它和普通的文件没有区别,可用文件描述符(一个非负整数)表示。在程序启动时,用Linux系统提供的open函数打开这些设备,同时设置这些设备的工作方式;启动蓝牙协议栈,并设置工作模式、服务发现数据库和其它参数,使网关始终处于被发现和被动建链的一方。

此后应用程序地侦听、等待各设备数据的到来,我们采用了I/O多咱转接的技术来实现对多个描述符的读、写和管理。该技术的基本思想是:先构造一张有关描述符的表,然后调用一个函数,它要到描述符中的一个已准备好表示I/O时才返回。在返回时,它告诉进程哪一个描述符已准备好可以进行I/O。select函数可以执行I/O多路转换,传向该函数的参数告诉内核我们所关心的描述符、对于每个描述符我们所关心的条件(是否读一个给定的描述符?是否想写一个给定的描述符?是否关心一个描述符的异常条件?)以及希望等待的时间(可以永远等待、等待固定时间或完全不等待)。我们在程序中设置了永远等待,即只有所指定的描述符中的一个已准备好或捕捉到一个信号才返回。从select返回时,内核告诉我们已准备好的描述符的数量和哪一个描述符已准备好读、写或异常条件,应用程序这个信息进入相应的处理子模块。
结语
基于嵌入式μClinux系统的蓝牙PSTN网关实现了上术的所有功能,使蓝牙三合一电话的应用成为现实。最多7个蓝牙终端能同时与该网关建立物理和逻辑链路,网关能建立起一条语音链路。经实测,在传输距离不超过10m的前提下,话音质量良好,清晰无失真;在传输