-
基于
Linux
的
US
B
主
/
从设备之间的三种通信方式
p>
随着简单易用的
USB
< br>接口日益流行,在
嵌入式系统
中添加对
< br>USB
接口的支持已
成为大势所趋。本文通过介绍
Linux
中支持
USB
的各种模块和库,分析了在
Linux
上利用
USB
实现高速串口和以太网连接等通信方式的具体方法。
< br>
通用串行总线
(USB,Universal
Serial Bus)
是一种非常实用的通信接口,其应
用日
益广泛。有三种方法可以使运行
Linux
操作系统的嵌入式系
统支持
USB
接
口,本文将对这三种方
法逐一进行介绍。
基于
Linux
的
USB
设备与
USB
主机一般有以下三种通信方式:
1
.一些功能最完
备结构也最复杂的设备采用用户定制核模块来实现在标准
USB
总线上运行复杂
的高级协议,而由
USB
主机上相应的用户驱动程序和应用来完成连接。
< br>2
.另一
些基于
Linux
p>
的
USB
设备则利用
USB
总线来实现与主机上所运行的某个应用的
简单的点对点
串行连接。主机上的应用虽然利用了主操作系统所提供的
USB
编
程接口,但表面看来却似乎是在通过一个典型的串口进行通信。
3
.最后,还有
些设备以主计算机作为网关,将
USB
设备连接到办公局域网或互联网上,从而
使<
/p>
USB
设备看起仿佛构成了一个以太网。这种方法专业性较强,但
通常可行,
是主机驱动程序使该方法成为可能。
在这三种方法中,您可以根据预留给开发的时间长短和期望
USB
接口在嵌入式
应用中所扮演的角色来决定选用那一种方法比较恰当。为了
帮助您做出正确的
选择,下一节将向您介绍这三种方法分别应用于基于
< br>Linux
的
USB
设备时的情
况,但首先让我们对
USB
接口做一个
大致介绍。
USB
概述
USB
是一种方便快捷的接口,可用于为计算机工作站连接一些小配件。根据
USB
规的定义,鼠标、键盘、音频播放和录音设备、照相机、大容量存
储设备以及
许多其他设备均可以通过
USB
接口,以高达
480Mbps
的速度连接到一台主计算
p>
机。协议定制者对
USB
上运行的这种复杂
的主从式协议做出了仔细的说明,这
就帮助保证了所有这些设备之间具备互操作性和兼容
性。例如,该协议规定,
USB
设备只有在被询问时才可以回答
,并且
USB
主机会根据所连接的
US
B
设备
类型的不同,采用某些特定的格式,在某些特定的时间段
从不同的设备获取数
据。
USB<
/p>
设备和主机之间通常通过专用的总线控制芯片建立连接。在
USB
主机上,
名为
UHCI
或
OHCI
等的控制芯片通过插卡形式加入主机或直接
集成到工作站的
主板上。在主机一端的总线控制驱动程序管理着主机控制芯片,它同时还
跟踪
监视着主机目前连接的是哪些
USB
设备,从而决定应如何与它们通信。
可用于连接照相机和
鼠标之类
USB
设备的总线控制器有很多种。其中的一种就
p>
在一块芯片上同时集成了
USB
接口以及另
一端的串口、
I2C
接口或并口。
US
B
控
制器
(
包
括主机上的和
USB
设备上的控制器
)
也可能集成到英特尔
StrongARM
或
Hitachi H8
之类的微
控制器中去。这些芯片及其外围部件有点类似以太网和
CAN
控
制器,不同的是他们用于连接
USB
设备,并运行
USB
协议。
很多人都
知道
Linux
操作系统中包含了
US
B
主机控制器的驱动程序,因而
USB
键盘、数码相机以及其他一些
USB
设备都可以在一个运行
p>
Linux
操作系统的桌
面工作站上使用。
但很少有人知道
Linux
中还包含了一组
USB
设备控制器的驱
动程序,尤其是集成到
StrongARM SA1110
处理器中的控制器。有了这些控制器
p>
驱动程序,基于
Linux
的嵌入式系统就
能利用
USB
接口来与主计算机
(
p>
运行
Linux
或其他操作系统
)
通信。大多数
USB
通
信的实现过程都是双端的。主机利
用一个核模块或驱动程序来与
USB
设备通信,而
USB
设备则通过
其自身的驱动
程序来与主机通信。根据主机和
USB
设备所采用的通信风格的不同,驱动程序
可以很简单明白,也可以很复杂,
很具挑战性。本文主要关注
USB
设备端的通
< br>信过程,但也在适当的地方包含了关于主机端通信过程实现的信息。
以下讨论的技术应当引起读者的注意。本文的目的是介绍如何在数码相机和
PDA
等基于
Linux
的
USB
设备上使用
Linux
< br>。此处所指的
USB
设备是严格意义上
< br>的
USB
设备,即带正方形连接器的完整的设备,而不是
哪些连接器形状为扁平
矩形的设备。此外,
USB
连接的另一端
(
通常是一台
PC
工作站
)
,应该是一台
USB
主机。
关于<
/p>
USB
信息包的格式和通信参数的详细信息,见本文的参考文献。
通过编写核模块添加
USB
接口
1.
USB
设备端通信过程
向一个基于
Linux
的设备中添加
USB
接口的第一种方法是编写一个用户定制的
Linux
< br>核模块,这也是可实现最完备功能的一种做法。采用这种方法时通常需
要针对主机
的操作系统
(Windows, Linux
等
)
开发相应的驱动程序。
一旦在设备中实现了用户定制的核模块,就可以使该设备完成相当复杂的功
能,例如仿真一个文件系统,从而允许嵌入式应用将其
USB
主机当作一个远程
存储设备。除此以外,采用这种方法之后,设备还可以具备存
储转发
(store-
and-forward)
的功能,因而能够在与
USB
主机的连接建立之前对
来自嵌入式应
用的数据流进行缓冲。
在基于
StrongARM
的
Lin
ux
设备中,核代码用于管理芯片所携带的
USB
设备控
制器外设,通过调用函数
sa1100_us
b_open()
来初始化。在初始化之后,核模
块还会调用函
数
sa1100_usb_get_descriptor_ptr()
和
sa1100_usb_set_string_descriptor(
)
来设置在设备查询期间传送给
USB
主机
的描述符,其中包含设备的数字厂商号和产品标识符,以及可以让主机用来识
别设备的字符串,甚至还有一个序列号域,以便主机可以唯一地识别一个连接
< br>在
USB
接口上的设备,或者在同种型号的多个设备中进
行区分。
设备查询过程是由
USB
设备控制器驱动的,并且一旦和
USB
主机连上之后会自
动执行,所以核模块必须在
USB
通信开始之前设置好每个设备的描述符。当准
备工作就绪之后,
USB
设备模块就会调用函数
sa1100_us
b_start()
来通知核接
收主机发来的
< br>USB
连接请求。如果设备模块在连上
USB
主机之前调用了函数
sa1100_set_configured_c
allback()
,那么接着核模块就会在查询过程结束时
调
用回调函数。回调函数很适合用来在设备上发出警告或给出一些形象的暗
示,说明连接已
经建立。
如果不再需要进行
USB
通信,那么设备的核模块就会先调用函数
sa1100_usb
_stop()
,然后调用
sa1100_usb_close
()
,来关闭
SA1100
上的
USB
控制器。
StrongARM
的
USB
控制器支持
bulk-
in
和
bulk-out
两种数据传送
方式。当接收
来自
USB
主机的数据包
时,核模块会调用
sa1100_usb_recv()
,将一
个数据缓
冲区的地址和一个回调函数送给它。然后核中的
USB
设备控制代码会从主机取
回一个
bul
k-
out
数据包,将其容存入制定的缓冲区,接着调用回调函数。
下一步,回调函数从接收缓冲区中提取出数据,将其存放到其他地方,或者将
缓冲区空间添加到一个队列中,然后分配一个新的缓冲区来接收下一个数据
包。然后,如果还有数据需要接收,那么回调函数会重新调用
sa1100_usb_r
ecv()
,准备接收另一个数据包。
向
USB
主机发送数据的过程与此类
似。核模块收集了一帧数据之后,将数据的
存放地址、数据长度和回调函数的地址送给<
/p>
sa1100_usb_send()
函数。接着,
在数据传送结束之后,核模块会调用回调函数。
在
ed./(arch/arm/mach-
sa1100/usb-char.c)
可以找到一
个叫做
p>
usb-
char
的模块,这是一个很好的设备端
SA1110
Linux USB
模块的例
子。该模块将
USB
设备与
USB
主机之间的连接变成一种高速串行。此外,
usb-eth( arch/arm/mach-sa1100/usb-eth.c
)
模块也是个不错的例子,该模块
将
U
SB
变成了一种虚拟的以太型网络。后面会深入探讨这两种模块。
-
-
-
-
-
-
-
-
-
上一篇:汽车零部件中英文对照81084499
下一篇:[英语口语话题Topic]