基于Linux下TDM模块的USB主机端驱动的开发

2011-08-09 05:04辉,向涛,张
电视技术 2011年19期
关键词:驱动程序命令串口

刘 辉,向 涛,张 杰

(1.重庆邮电大学重庆信科设计有限公司,重庆 400065;2.重庆邮电大学通信新技术应用研究所,重庆 400065)

责任编辑:孙 卓

0 引言

TDM330是重邮信科通信技术有限公司研发的TDSCDMA无线模块。模块提供了100PIN或者MINIPCI接口,为语音传输、短消息和数据业务的开发提供了接口,支持2.8 Mbit/s的HSDPA数据和2.2 Mbit/s的HSUPA传输速率。TDM330在硬件上不仅提供了RS-232串口,也提供一种易于使用的高速率数据传输的USB接口。全速USB的速率理论值能达到12 Mbit/s,而RS-232串口速率的理论值只能达到几百kbit/s。相对于 USB而言,RS-232串口传输的速度受到很大的限制,会导致在传输过程出现严重的数据丢包现象,因此本文通过开发USB的主机端驱动来使之开发板子DM6467与TD无线上网TDM330之间通过USB接口进行传输数据。同时,TDM芯片主机端的USB驱动将成为TD无线传输项目开发的必要环节。

1 TDM330适配的USB驱动分析

TDM330设备支持USB接口连接,应用层的数据需要通过USB接口与TDM330模块设备进行交互。根据USB主机端驱动[1-2]结构图(见图1)可以了解到用户只能和TTY层、字符设备等层之间进行数据的交流,而不能直接与USB驱动层进行数据的交流。由于TDM330在开发中仅仅用于数据业务通信,因此可以把USB设备驱动的上层看成TTY层。用户可以通过TTY层与USB设备驱动层进行通信。所以Linux的用户需要针对TDM330模块开发USB主机端驱动,使之能够枚举多个ttyUSB串口(至少2个),使其在使用TDM330模块设备时,1个串口用于数据的传输,1个串口用于命令的传输。例如1个C口,可以用来进行AT命令交互,如启动协议栈(AT^SPSS=0)。C口一般对应设备描述名为/dev/ttyUSB1。1个是D口,用来拨号。D口一般对应设备描述名为/dev/ttyUSB0。

图1 Linux主机端的驱动

由于USB驱动程序绑定在USB接口而不是USB设备,所以TDM330模块USB驱动只需要实现接口驱动。其针对TDM330模块开发USB接口驱动,至少要满足能够枚举出用于命令和数据传输的2个tty串口的需要,所以TDM330模块USB主机端的驱动还要负责将USB转成串口,生成tty串口。

2 USB转tty串口分析

对于本次开发,由于USB设备驱动上层可看成tty设备,不属于任何USB设备类型,一般USB都可以使用这个usbserial模块驱动来作为主机端USB设备驱动。因此,TDM330的主机端驱动就以usbserial模块作为设备驱动程序。根据图1可知,由于和应用层交互数据的是TTY层,因此,必须用usbserial模块把USB设备映射成一个tty设备(即在/dev/目录下为该USB设备创建一个tty设备文件),然后才能用串口与tty设备交互数据[3],并通过USB接口与设备端的设备(TDM330)通信。

2.1 分析usbserial模块

分析内核 Linux 2.6.10 的./drivers/usb/serial/makefile为:

通过以上的makefile可以得出usbserial模块主要由usb -serial.c,generic.c 和 bus.c 三部分组成:

1)usb-serial.c就是usbserial模块的核心,主要用来接收设备端发来的数据并传送到上层,同时也是接收来自上层应用的数据,并组装成urb包发送发给设备。

2)generic.c是对某一设备的单独操作,相当于设备自己的驱动程序,由于很多设备具有通用性,所以对于没有特殊要求的设备都可以使用这个驱动作为自己的设备驱动程序。

3)bus.c每个USB驱动和设备都必须要归入某一条总线上,即都是归属于某条总线的,只有这样系统才能从特定的某一条总线开始找每个驱动和设备并为之匹配,这个文件是用来模拟一条总线,而usbserial的每个驱动和总线都会注册到这条总线上来。

2.2 数据在usbserial模块的通信过程[4]

对于发送过程。tty设备文件在获取了用户数据要求之后传递到下层usbserial模块的核心层,而该模块核心层就是将数据打包成USB格式的数据,并通过USB主机控制器发送到USB设备端去。

对于接收过程。usbserial模块会在该设备打开时启动一个URB等待设备发送数据过来,收到数据后就调用push函数把数据推到上层的tty设备的缓冲区去,tty设备收到数据以后就直接发给用户,或者直接显示在串口工具上。

3 内核模块的加载

Linux操作系统为了扩展其功能,使用可动态加载和卸载的内核模块LKM[5]。Linux 使用insmod/modprobe 来加载内核模块,使用rmmod命令来卸载内核模块。LKM的优点是可以通过动态加载和卸载内核模块来使内核保持很小的尺寸并非常灵活,无须重构整个内核来运行新的内核代码。

根据Linux 2.6的makefile写法[6]写 USB转 serial的usbserial内核模块的makefile,再进行make编译生成usbserial.ko,由于开发板上的usb转serial芯片被该内核识别为通用芯片,即该内核下的Documentationusbusb-serial文档没有提到的一些USB转串口芯片,并且由于TDM330的vendorID为0x1234,productID为0X0033,因此只需用命令modprobe usbserial vendor=0x1234 product=0x0033动态加载usbserial.ko时即可,不用加载USB转serial具体芯片的驱动,卸载模块命令为rmmod usbserial。

4 运行结果

开发板子上电并通过USB接口插上TDM330模块,运行加载usbserial模块命令,命令为modprobe usbserial vendor=0x1234 product=0x0033,加载这个模块以后,详细信息如图2所示。

图2 加载模块后的详细信息(截图)

根据此结果可以得出,generic converter芯片被检测到,并且该芯片的驱动挂载到ttyUSB的3个设备文件上,然后用户就可以像操作tty串口文件一样的操作该设备文件。运行查看USB设备所映射的串口ttyUSB设备文件的命令ls/dev/ttyUSB*[7],具体如图3所示。

图3 运行命令图(截图)

根据以上结果可以得出USB设备映射成ttyUSB0,tty-USB1,ttyUSB2三个设备文件。应用程序通过这些文件可对实际的USB进行操作。用串行通信调试工具(SCT)进行串口通信调试。调试步骤为:1)运行命令sct启动协议栈;2)通过命令setbuf 1 hex设置buf1的数据;3)通过命令port/dev/ttyUSB0指定使用的端口;4)通过命令open打开指定的端口;5)通过命令sendrecv 10向打开的端口发送buf 1的数据,并把接收的数据存到buf 0,同时在终端显示接收到的数据。如图4所示。

图4 显示结果(截图)

根据以上结果的分析得出,已经把USB设备映射为串口设备,相应的驱动已经挂载在相应的接口上,并且可以通过串口ttyUSB*来操作USB设备。这样就可以通过PPP拨号与无线网络连接在一起,然后应用于TD网络的无线传输。

[1]夏传凯,吴乃陵.基于AT91RM9200的USB主机端的linux驱动[J].现代电子技术,2008(12):49-50.

[2]孙天泽,袁文菊,张海峰,等.嵌入式设计及Linux驱动开发指南-基于ARM9处理器[M].北京:电子工业出版社,2007.

[3]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.

[4]徐维迪,石绍应,乔建军.Linux环境USB转串口设备的驱动程序开发[J].空军雷达学院学报,2008,22(1):65 -67.

[5]罗苑棠.嵌入式Linux驱动程序和系统开发实例讲解[M].北京:电子工业出版社,2009.

[6]陈刚,卢显斌.基于linux-2.6内核模块程序设计[J].福建电脑,2004(6):15-16.

[7]周金和,刘泉华.基于ISP1161的USB摄像头嵌入式Linux设备驱动[J].电视技术,2006,30(3):81 -84.

猜你喜欢
驱动程序命令串口
只听主人的命令
浅谈AB PLC串口跟RFID传感器的通讯应用
计算机硬件设备驱动程序分析
移防命令下达后
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
这是人民的命令
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信
基于MPC8280的CPU单元与内部总线驱动程序设计
妙用鼠标驱动