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

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:

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路由算法

万方数据