2024年4月16日发(作者:)
2008年第4期
仪表技术
・5・
基于ARM一LINUX平台的USB采集卡
设备驱动程序的设计
荆 蕾‘,黄帷公‘,徐鹤2,王磊2,焦来磊,
(1.西华大学,四川成都610039; 2.坊市农村信用社,山东滩坊261041;
3.烟台通源科技有限公司,山东烟台264005)
摘要:将ARM -LI NUX平台作为USB主机,数据采集卡作为USB设备,设计一套通过USB总线传输数据的高速数据采集系
统
O
针对数据采集卡,着重讲述USB字符设备驭动程序的设计。
关键词:USB字符设备;驱动;数据采集
中图分类号:TP39文献标识码:B文章编号:1006 -2394(2008)04 -0005 -03
Des ign of USB Sampling Card's Driver Based on ARM一LINUX Platform
J ING Lei',HUANG Wei-gong',XU Peng2,WANG Lei2,JIAO Lai-lei'
(1. Xihua University,Chengdu 610039,China; 2. Rural Credit Cooperatives of Weifang,Weifang 261041,China;
3. TongYuan Technologies Ltd, Yantai 264005, China)
Abstract:In this paper,
a high speed data sampling system is designed,which
uses ARM一
LINUX platform as
US
B
host
and
usb data sampling card as device. The design of usb character devices driver is
emphasized.
Key
words:
USB device;driver; data sampling
1前言
化工作,包括电源、时钟、寄存器等。
ARM一LINUX平台下的USB系统正常工作需要
USBD(USB驱动)是整个USB主机驱动的核心,
包括下面几个部分,如图1所示。HCD(主机控制器
主要功能有:USB总线、USB总线设备、USB总线带宽
驱动)是直接与主机硬件交互的软件模块,共有三种
等的管理,USB的4种类型数据传输(中断传输、批量
HCD,分别对应三种不同的USB芯片。EHCI专门为
传输、等时传输、控制传输),USB HUB驱动,为USB
USB2.0芯片提供支持;OHCI用来为非PC上的USB
设备类提供接口等。
系统提供支持;UHCI为大多数其他PC主板上的USB
USB设备类驱动是最终与应用程序交互的软件模
提供支持。本设计中选用了OHCI,由LINUX内核提
块,它处在物理设备与用户任务进程之间,为用户屏蔽
供,要移植到S3 C2410上面,只需要做一些与硬件相
了具体的硬件,封装了控制的细节,并防止对硬件的非
关的改动,主要完成S3C2410 USB HOST设备的初始.
法操作,主要完成对特定USB设备的访问,向系统内
核注册文件系统等功能。本文主要介绍该驱动部分的
应用软件
设计。当应用程序访问设备时,Linux内核通过访问该
文件系统
设备对应的文件节点,利用虚拟文件系统调用该设备
USB设备N州USB设备类驱动程序
的相关处理函数,而这些函数的处理过程就是设备类
驱动程序要完成的重点。
USBD(USB内核、USB HUB驱动)
2 USB设备类驱动中虚拟文件系统的使用
HCD WHO驱动、UHCI驱动、EHCI驱动)
Linux将所有设备都作为文件进行处理,采用分层
封装的方法向应用层提供一种通用的文件系统接口,
USB硬件接口(OHCI控制器、UHC胜制器、EHCI控制器)
所以对设备的操作像对文件的操作一样方便。对用户
图1 ARM -LI NUX平台下USB系统架构
而言,访问硬件只需要调用文件操作的标准函数来实
收稿日期
2007一11
作者简介
荆曹(1980-),女,硕士研究生,研究方向为工业测控;黄惟公,男,教授。
万方数据
。6・
仪表技术
2008年第4期
现。以打开设备为例,用户调用函数fd = open( "/dev/
usb/usb_sd", 0_RDWR ),可以读写方式打开设备,并
返回设备句柄。
据不能直接互访,必须要借助copyefr om user( ) ,copy-
to-user()两个函数在两个空间中传递。
4驱动模块的加载方式
每一个设备都对应一个/dev目录下的设备文件,
也就是设备节点。标识设备需要三个因素,即设备类
型和主、次设备号。在本设计中,在/dev/usb/目录下,
Li nux内核采用可加载的模块化设计,编译的驱动
程序作为模块加载进内核。这样做的好处是,不需要
mknod usb_sd c 180 200,建立一个名字为usb_sd ( usb
sample device)的字符设备节点,主设备号180,次设备
号为200。主设备号对应某一类设备,这里是指USB
设备,内核利用主设备号将设备与相应的驱动程序对
应起来。当设备文件系统向内核注册后,内核就知道
了该驱动程序对应什么设备。
在内核内部有一个f ile结构识别设备,内核用file
operations结构访间驱动程序的函数。file-operations
结构是一个函数指针表。本例中,
s tatic struct file-operations sample-fops二1
read: sample-read,
write
sample-
ioctl:
w
1侣ccu,
rite
open:
sample-open,
release:
sample-release
};
可以看到,这个结构就是应用程序调用的标准函
数和驱动程序的接口。sample-read等函数的功能由
驱动负责实现。
3对硬件的操作
实现对硬件的操作也不需要驱动直接操作设备I/
0,只需调用内核支持的API函数,例如读取批量设备数
据调用usb bulk_msg(),读取成功后将读取上来保存在
内核空间的数据传递给用户空间用copy-to-user( ),以
读设备的sample read)为例,流程如图2所示。
交返回读取到的数据个攀夕
图2 sample-read流程
内核空间和用户空间有所不同,驱动程序属于内
核空间,普通的应用程序属于用户空间,两个空间的数
万方数据
该模块的时候,不用将其放人内核,给内核瘦身,也减
少了出错的机会。通常使用insmod, rmmod加载和卸
载模块。insmod命令执行时,驱动程序中的人口点是
init_module ( ),在该函数中实现驱动向内核的注册。
rmmod时,驱动程序中的入口点是cleanup-module( ) ,
在该函数中实现该驱动从内核中卸载。
5获取调试的验证信息
驱动程序不像其他应用程序那样,可以放在调试
器中调试,比较通用的调试方法主要有下面几种。
5. 1使用printk, info)调试
在程序中需要验证的地方加入pr intk ( ) , info ( )
等, 这是在程序调试过程中最普通但却很有效的方法。
程序开始#de fine DEBUG 1,打开调试,允许信息输出。
例如打印出主次设备号:
i f(DEBUG)
l info(“USB Sample device now attached to USB%
d, %d",USB_MAJOR,dev一>minor);}
如此,当调试驱动时, 如果允许了信息输出,cat/
var/lo岁messages可以在系统的日志文件中查找到输
出信息如下:
Oct 18 13,09:10 localhost kernel; usb_sd. c:USB
Sample device now attached to USB 180 , 200 0
程序完成后, 将DEBUG的定义改为0,关闭调试,
关闭信息输出。
这种方法只会在调试时增加程序代码量,一旦成
.型,就不会影响代码量大小。
5. 2使用/proc文件系统
/proc文件系统与任何设备都没有关系,是个伪文
件系统。该目录下的文件都是在被读取时由内核创建
的。这个伪文件系统让用户和内核内部数据结构进行
交互, 获取有关进程的有用信息。与其他文件系统不
同在于, 该文件系统存在于内存中而不在硬盘上。
使用/proc,首先mount-t usbdevfs none/proc/bus/
us b将usbdevfs挂载到/proc/bus/usb这个目录下,便
于查看usb设备的相关信息。挂载之后,我们的操作
在/pr oc/bus/usb目录下的某些文件中就能反映出来。
例如i nsmod usb_ad.。插人设备驱动模块后,cat/proc/
bus /usb/drive。可看到下面信息:
2008年第4期
仪表技术
・7・
[root@ localhost driver] # cat/proc/bus/usb/drivers
press,产品标识是EZ一USB FX2,该设备对应的驱动
名称是usb_ sd,该设备由两个端点,分别为端点2和
hub
96一111:hiddev
6,一个输出、一个输人,且都是最大包为64字节的块
hi d
端点。
200一215: usb-sd
这些调试信息在驱动的开发阶段能帮助我们正确
可以看到,关于usb的所有驱动信息在这打印出
定位错误,解决故障。
来,还增加了名字为usb sd的USB驱动和我们刚刚挂
载的usbdevfs o usb-sd就是数据采集卡的设备驱动程
6总结
序模块。
USB总线虽然从技术层面来说比较简单,但因为
驱动加载上了, 硬件接人时,能不能识别出来设备
其支持固定带宽传输和即插即用的特性,使得其应用
就是用了该驱动的呢?将采集卡通过usb口接入,在
越来越广泛。单从驱动方面来说,很多特点相同的设
终端上cal/proc/bus/usb/devices,观察到下面的信息:
备都可以非常方便的共用相同的驱动,开发也比较简
[r oot@ localhost driver] # cat/proc/bus/usb/devices
……(略掉了与采集卡无关的信息)
单,是工程应用中很好的选择。
T: Bus二01 Lev二01 Pmt二01 Port二(00 Cnt = 01 Dev#=3 Spd二12
MxCh二0
参考文献:
D:Ver=2. 00 Cla二00( > ifc) Sub二00 Prot=00 MxPS二64 #Cfg。二1
P: Vendor二0547 ProdlD二1002 Rev二0.00
[1〕孙琼.嵌人式Linux应用程序开发详解【M].人民邮电出版
S: Manufacturer = Cypress
社,2006.
S: Product=EZ一USB FX2
[2〕张晓林,崔迎炜,等.嵌人式系统设计与实践【M〕北京航
C:*#I fs =1 Cfg#二1 Atr二a0 MxPwr =100mA
I: If# =0 Alt二0 #EPs二2 Cls二ff( vend. )Sub二(00 Prot = 00 Driver=
空航天大学出版社, 2006.
usb_ sd
[31 ALESSANDRO RUBINI著,LISOLEG译.LINUX设备驱动
E: Ad二02 (0) Au二02 (Bulk) MxPS = 64 Ivl =0ms
程序〔M].中国电力出版社, 2004.
E: Ad = 86( I) Atr =02 ( Bulk) MxPS二64 Ivl =0m8
[4〕孙天泽,袁文菊,张海峰.嵌人式设计及Linux驱动开发指
可以得到这些有用信息,检测到有设备接人平台,
南— 基于ARM9处理器【M].电子工业出版社,2005.
该设备的PID/VID =Ox O547/Ox1002,制造商是Cy-
(许雪军编发)
(上接第4页)
[M].北京:北京航空航天大学出版社,2007.
节点在路由选择和路由维护时,ZigBee的路由算法
(丁云编发)
使用了路由成本的度量方法来比较路由的好坏。成本
(链路成本)与路由中的每一个链路相关。组成路由的
链路成本之和为路由成本。ZigBee路由和协调器需要
对路由表进行维护。ZigBee路由和协调器也保存一定
数量的人口,仅仅在路由维护时使用这些人口。或者在
耗尽所有其他的路由容量的情况下使用这些人口。路
由选择是在网络中的设备相互合作条件下的选择,并建
立路由的一个流程,该流程通常与特定的源地址和目的
地址相对应。路由选择包括如下的一个流程:1)路由搜
索的初始化。2)接收路由请求命令帧。3)接收路由应
答命令帧。ZigBee基本的路由算法如图4所示。
参考文献:
[1]粗雷一种新的无线网络通信技术ZigBee[J].单片机与嵌
人式应用, 2006,(1).
[2〕安庆敏,吴光明,等.ZigB,的无线通信网络平台【J].现代
建筑电气篇, 2007,(6).
[3〕王东,张金荣,等・利用ZigBee技术构建无线传感器网络
[J].重庆大学学报,2006,(8).
[4]李文仲,段朝玉,等.ZigBee无线网络技术人门与实战
图4 ZigBee路由算法
万方数据


发布评论