USB芯片

2024-08-19

USB芯片(共4篇)

USB芯片 篇1

USB总线由于支持即插即用和热拔插,以及速度快、易于扩展、总线供电等优点,目前己成为PC机与外部通信的主流接口,并迅速在自动化测试等许多领域中得到应用,以满足对数据通信更高的要求[1,2]。

USB设备的开发,大体可分为设备端开发和主机端开发两部分。设备端驱动程序是设备端开发的核心,它主要完成设备初始化、USB协议标准请求处理以及其它应用程序等。主机端开发[3,4],主要是在Windows下开发USB设备驱动程序。

设备控制端一般由单片机和USB控制芯片构成。在硬件设计中,要根据硬件系统的性能要求进行器件的选型,还要充分考虑性能价格比以及应用的方便。本文以ATMEL单片机和PHILIPS公司的PDIUSBD12构成USB设备控制端,对PDIUSBD12芯片及应用进行研究。

1 USB控制器PDIUSBD12

目前,市场上供应的USB控制器主要有两种:带USB接口的单片机(MCU)或纯粹的USB接口芯片。带USB接口的单片机,但由于价格、开发工具以及单片机性能有限等问题,所以一般不推荐选用。

纯粹的USB接口芯片仅处理USB通信,必须有一个外部微处理器来进行协议处理和数据交换。典型产品有PHILIPS公司的PDIUSBD11(I2C接口),PDIUSBD12(并行接口),NS公司的USBN9603/9604(并行接口),NetChip公司的NET2888等。USB接口芯片的主要特点是价格便宜、接口方便、可靠性高,尤其适合于产品的改型设计(硬件上仅需对并行总线和中断进行改动,软件则需要增加微处理器的USB中断处理和数据交换程序、PC机的USB接口通信程序,无需对原有产品系统结构做很大的改动)。PHILIPS公司的PDIUSBD12具有独特优点,常在USB接口系统中选用。

1.1 PDIUSBD12的特点

PDIUSBD12是一款性价比很高、符合通用串行总线(USB)1.1版规范的USB接口器件,它通常用在微控制器系统中实现微控制器与PC机进行通信的高速通用并行接口。它还支持本地的DMA传输。这种USB控制器使得设计者可以选择最合适的微控制器,从而使开发更具灵活性,减少了开发周期、风险及费用,进而为USB外设的实现提供了一种最快捷的解决方案。

除此之外,PDIUSBD12器件还具有以下特性:

1)高性能USB接口器件,集成了SIE,FIFO存储器、收发器以及电压调整器;

2)符合大多数器件的分类规格;

3)可与任何外部微控制器/微处理实现高速并行接口(2M字节/秒);

4)完全自治的直接内存存取(DMA)操作;集成320字节多结构FIFO存储器;

5)主端点的双缓冲配置增加了数据吞吐量并轻松实现实时数据传输;

6)在批量模式和同步模式下均可实现1 M字节/秒的数据传输速率;具有良好EMI特性的总线供电能力;

7)PDIUSBD12所具有的低功耗挂起连同LazyClock输出可以满足使用ACPI、OnNOW和USB电源管理的要求,低的操作功耗还使总线供电于外设成为可能;

8)可通过软件控制与USB的连接;

9)采用GoodLink技术的连接指示器,在通讯时使LED闪烁;

10)可编程的时钟频率输出;

11)双电源操作3.3±0.3 V或扩展的5V电源,范围为3.6V~5.5V;12)多中断模式,支持批量和同步传输。

1.2 PDIUSBD12的管脚配置

PDIUSBD12的管脚排列如图1所示,其管脚说明如表1所列。

1.3 PDIUSBD12的内部结构与功能

PDIUSBD 12的功能框图如图2所示,其功能和相关说明如下。

1)模拟收发器:

集成的模拟收发器接口可通过终端电阻直接与USB电缆相连。

2)电压调整器

片内集成了一个3.3V的调整器用于模拟收发器的供电。该电压还作为输出连接到1.5K?的内部上拉电阻。可选择PDIUSBD12提供的带1.5KΩ内部上拉电阻的软件连接技术。

3)PLL

片内集成了6M到48M的时钟乘法PLL,因此可使用6M晶振,既降低成本,又降低EMI。

4)位时钟恢复

位时钟恢复电路使用4X过采样规则,从进入的USB数据流中恢复时钟。它能跟踪USB规定范围内的抖动和频漂。

5)PHILIPS串行接口引擎(PSIE)

PHILIPS SIE实现了全部的USB协议层,完全由硬件实现而无需固件的参与。该模块的功能包括:同步模式的识别、并行/串行转换、位填充/解除填充、CRC校验/产生、PID校验/产生、地址识别和握手评估/产生等功能。

注:在没有使用到DMA方式的时候,DMACK_N和EOT_N要求接上拉电阻。

6)SoftConnectTM

与USB的连接是通过1.5K?的上拉电阻将D+(用于告诉USB器件)置为高实现的。1.5KΩ上拉电阻集成在PDIUSBD12片内,默认状态下不与VCC相连。连接的建立通过外部系统微控制器发送命令来实现。这就允许系统微控制器在决定与USB建立连接之前完成初始化时序。USB总线连接可以重新初始化而不需要拔出电缆。

PDIUSBD12在连接可以建立之前会检测USB VBUS是否可用。VBUS可通过EOT_N管脚进行检测。

7)GoodLinkTM

GoodLinkTM技术可提供良好的USB连接指示。在枚举中,LED指示根据通信的状况间歇闪烁。当PDIUSBD12成功的枚举和配置后,LED指示将一直点亮。随后与PDIUSBD12之间成功的传输(带应答)将关闭LED,处于挂起状态时,LED将会关闭。

8)存储器管理单元(MMU)和集成RAM

在以12Mb/s的速率传输并与微控制器并口相连时,MMU和集成RAM作为USB之向速度差异的缓冲区。这就允许微控制器以它自己的速率对USB信息包进行读写。

9)并行和DMA接口

PDIUSBD12对于微控制器而言,看起来就象一个带有8位数据总线和一个地址位的存储器件。PDIUSBD12支持多路复用和非复用的地址和数据总线。还支持主端点(端点2)和本地共享RAM之间直接读取的DMA传输。支持单周期和突发模式的DMA传输,且可以和对其他端点的正常I/O操作交叉进行。DMA操作中的自动指针处理,在跨过缓冲区边界时无需本地CPU的干预。

1.4 PDIUSBD12的端点和指令集

PDIUSBD12的端点适用于不同类型的设备,如图像、打印机、海量存储器和通信设备。PDIUSBD12支持3个端点,其中主端点最多能保存128B,自动切换的双缓冲结构允许保存256B,允许USB和本地CPU之间的并行读写操作,这既增加了数据的吞吐量,也导致了缓冲区操作的透明性。

PDIUSBD12主端点可通过“SET MODE”命令配置为模式0~3四种不同的模式。模式0(NON-ISO模式)为非同步传输。模式1(ISO-OUT模式)为同步输出传输。模式2(ISO-IN模式)为同步输入传输。模式3(ISO-IO模式)为同步输入输出传输。

PDIUSBD12有自己的指令集,用于管理USB总线事务,这些指令在微处理器控制下执行,可以分为三类:初始化、数据流和通用命令。模式配置和指令集在此不作详述。

2 PDIUSBD12的典型连接

PDIUSBD12与单片机的接口有两种方式:多路地址/数据总线配置方式和单独地址/数据总线配置方式。当PDIUSBD12接收到主机的有效信息时,会产生一个中断通知单片机进行处理。

在多路地址/数据总线配置方式中使用了单片机的INT、ALE、WR、RD和P0口,PDIUSBD12在ALE下降沿的时候对单片机的输出地址进行锁存。在这种方式中单片机使用MOVX指令就可以对PDIUSBD12进行数据操作了。倘若输出地址为奇数表示对PDIUSBD12发送指令,输出的地址为偶数时则表示对PDIUSBD12进行数据传输。在我们的实际应用中,USB接口系统采用的就是多路地址/数据总线接口方式。

在USB接口电路的设计中,PDIUSBD12完成所有的USB传输功能,与PDIUSBD12相连的是微处理器AT89S51,微处理器底层应用程序完成USB总线枚举过程、PDIUSBD12的中断访问过程、电源管理功能和USB协议层的功能。USB控制芯片PDIUSBD12有能与微控制器接口的8位并行数据总线。基于PIUSBD12的USB接口电路原理图如图3。

PDIUSBD12具有内置的上电复位电路。所以RESET_N脚可以直接连到Vcc。但是如果静电放电足够大,会导致PDIUSBD12进入不确定状态。为了避免这种状态出现,在这使用外部控制源(AT89S51)提供PDIUSBD12的复位信号。而不是将RESET_N脚直接连到Vcc。另外有个好处就是复位变得容易,在PDIUSBD12在数据传输请求时可随时复位。

3 结束语

本文讨论了USB核心芯片PDIUSBD12的特性,给出了PDIUSBD12与AT89S51连接的电路图,可以看出PDIUSBD12控制器为USB外设的实现提供了一种最快捷的解决方案,可以使设计者选择最合适的微控制器,从而使开发更加灵活,缩短了开发周期、降低了风险和开发费用。本文对USB协议、软件设计以及USB外设的固件编程没有做更深入的探讨。

参考文献

[1]武安河.Windows2000/XP WDM设备驱动程序开发[M].北京:电子工业出版社,2003:284-325.

[2]周涛,张辉.采用PDlUSBU12的USB系统固件程序设计[J].电子技术应用[J].200329(5):70-72.

[3]陈军波.USB接口芯片PDIUSBD12及应用[J].国外电子元器件,2002,11:47-49.

[4]万利峰.基于PDIUSBD12的USB数据采集系统的设计[J].微计算机信息,2006,22(5-1):110-111.

USB芯片 篇2

因此对数据采集系统提出了要求:一方面, 要求接口简单灵活且有较高的数据传输率;另一方面, 由于数据量通常都较大, 要求主机能够对实时数据做出快速响应, 并及时进行分析和处理, 并在单片机和PC机之间进行高速和可靠的通讯。传统的外设与主机的通信接口难以满足上述第一个方面的要求, 一般采用PCI布线或RS-232串行总线, PCI总线虽然有很高的传输率, 还能“即插即用”, 但是它们的扩展槽有限, 且插拔不方便;RS-232串行总线虽然连接方便, 可是它的带宽有限, 传输速度太慢, 而且1条RS-232串口通信电缆只能连接1个物理设备。

USB技术正是顺应这一要求提出的, 它集PCI和RS-232的优点于一身:具有较高的传输速率, 实现了真正意义上的“即插即用”, 同时USB上最多可以连接127个外设, 解决了如资源冲突、中断请求和直接数据通道等问题。因此, USB技术非常适合实时数据采集的场合, 是目前较为流行的通讯方式。

1 USB接口及芯片选择

1.1 USB接口

当今的计算机外设, 都在追求高速度和通用性, 为了满足用户的需求, 以Intel为首的7家公司于1994年推出了USB (Universal Serial Bus通用串行总线) 总线协议, 专用于低、中速的计算机外设。目前, USB端口已成为了微机主板的标准端口。

USB接口和普通并口及串口相比较而言, 主要优势表现在以下几个方面:

(1) 使用方便, 连接外设不必再打开机箱;允许外设热插拔, 而不必关闭主机电源。

(2) 速度快, USB支持3种设备传输速率:1.5Mb/s (低速设备) 、12Mb/s (中速设备) 和480Mb/s (高速设备) 。

(3) 独立供电, USB接口提供了内置电源。

(4) 连接灵活, 1个USB接口可以连接127个USB设备, 既可以使用串行连接, 也可以使用集线器Hub, 把多个设备连接在一起, 再同PC机的USB口相接。

(5) 成本低, 为了把外设连接到PC上, USB提供了一种低成本的解决方案。

1.2 USB100模块与同类产品的比较

USB100模块在传输速率上具有突出优势, 对系统没有特殊的要求, 是其中性价比最高又能实现高速数据传输要求的最佳选择, 见表1。

2 微控制器选型

当今微控制器的种类很多, 从生产厂家来说有几十家, 例如:美国Intel公司、TI公司、美国微芯公司、韩国现代 (LG) 公司、台湾义隆公司和凌阳公司等。下面通过对当前流行的微控制器的介绍, 阐述选择PIC单片机的依据。

2.1 凌阳16位单片机

随着单片机功能集成化的发展, 其应用领域也逐渐地由传统控制扩展为控制处理、数据处理以及数字信号处理等领域;它的CPU内核采用凌阳最新推出的μ′n SPTM (Microcontroller and Signal Processor) 16位微处理器芯片 (以下简称μ′nSPTM) 。围绕μ′nSPTM所形成的16位μ′n SPTM系列单片机采用的是模块式集成结构, 以μ′n SPTM内核为中心集成不同规模的ROM、RAM和功能丰富的各种外设接口部件, 借助这种通用结构附加可选结构的积木式的构成, 便可形成各种不同系列派生产品, 以适合不同的应用场合, 这样做使每一种派生产品具有更强的功能和更低的成本。

从目前的应用来看, 凌阳16位单片机的优势在于它具有强大的语音处理功能, 然而, 它在工业控制现场的应用案例较少, 在控制领域并不具备突出的竞争力。

2.2 MCS-51系列单片机

传统的51系列微控制器, 在国内使用时间比较长, 开发产品的资料也比较多, 但其片内资源较少, 在外围电路中需加入多种模块, 如:A/D转换器、PWM、RAM和ROM存储器等。它的优点是外围电路易于扩展, 尤其是存储器的容量可以按需求增大, 缺点是在线调试程序不方便。如果应用到数据采集中, 外围扩展电路比较复杂, 电路板空间和制造成本较大, 而且在硬件电路的制作和调试方面也有一定的困难。

2.3 PIC系列单片机

PIC系列单片机是美国微芯公司 (Microchip) 的主要产品, 有PIC16系列、PIC17系列和PIC18系列等。PIC系列单片机CPU采用RISC结构, 它具有运行速度快、工作电压低、功耗低、较大的输入输出直接驱动能力、价格低和体积小等优点。

选用的PIC16F877单片机是PIC系列的中档产品, 其内部资源非常丰富, 含有8K的FLASH程序存储器、368B的RAM数据存储器、256B的EEPROM数据存储器、8通道10位A/D转换器、3个定时器、2个捕捉/比较/脉宽调制、1个同步串行端口SPI和通用同步/异步收发器?USART等。另外, 它具有外围接口电路简单、工作性能稳定等特点。

选择该芯片作为下位机控制器的核心, 利用上述丰富的资源来完成A/D转换、收发数据和输出显示信号等处理和指定的控制任务。

3 USB100模块的典型应用电路

图1为PIC16F877单片机与USB100模块通信的原理图, 其可取之处在于:

(1) 用USB自带的5V直流电源供电, 减小了系统的硬件电路制作量, 充分利用了现有的系统资源。

(2) USB传输线、电源线 (USBVCC) 与地线之间加两级滤波电容, 能有效的抑制传输过程中的噪声干扰。

(3) USB100模块输出电源VCC先经过电源开关, 接0.3A保险丝后为PIC单片机及其他用电器件供电;这样既为单片机安全用电提供了一定的保证, 又为其他器件用电留下了余量。

(4) PIC单片机的电源线和地线之间接入LED指示电路, 起到工作指示作用。它可以明确的反映出单片机是否有电源接入, 并能起到相当好的电路自检作用。

(5) 复位电路中将电容换成了电阻, 并装上了复位按钮, 可以方便地执行复位操作。

(6) USB100的I/O数据口和标志位控制端子均接入1.8kΩ的电阻, 即使发生短路等严重事故输入输出电流也不会超过3mA, 最大限度保证了电路的安全工作。

4 单片机硬件设计

美国Microchip技术公司的PIC系列单片机采用精简指令集计算机 (RISC———Reduced Instruction Set Computer) 、哈佛 (Harvard) 双总线和两级指令流水线结构的高性能价格比的8位嵌入式控制器;其高速度、低工作电压、低功耗和较大的输入输出直接驱动LED能力、一次性编程芯片的低价位、小体积、指令简单易学易用等特点, 都体现了单片机工业发展的新趋势。在全球都可以看到PIC单片机在不同领域的广泛应用, 它在世界单片机市场份额排名中逐年提前, 以致成为一种新的8位单片机的世界标准和最有影响力的主流嵌入式控制器, 所以选用PIC16F877作为主控制器。

PIC单片机外围电路如图2所示, PIC16F877微控制器的引脚功能配置如下:

(1) 端口D作为LED输出接口显示控制。

(2) RA0口为压力模拟信号输入端。

(3) RA1和RA2为USB100模块的标志位RXF和TXE。

(4) RA3和RC7为USB100模块的存入 (WR) 和读出 (RD) 标志位。

(5) 端口RC0、RC1、RC2、RC3分别为4位LED动态显示的片选控制端。

(6) B口作为USB100模块的数字I/O口。

(7) RA5可以根据编程设置, 起到工作状态监视作用。

5 结论

本文主要介绍了USB100模块的特点, 微控制器PIC16F877单片机的选择及外围电路的设计, 还简要介绍了USB100和PIC16F877单片机的典型应用案例, 在单片机应用中有一定的参考价值。

参考文献

[1]刘和平, 等.单片机原理及应用[M].重庆:重庆大学出版社, 2010.

[2]邹慧君编著机械系统设计原理[M].北京:科学出版社, 2011.

[3]刘启中, 李荣正, 等.PIC单片机原理及应用[M].北京:北京航空航天大学出版社, 2010.

USB芯片 篇3

关键词:CH375,USB,单片机

0 引言

随着计算机技术的快速发展,USB移动存储设备的使用已经非常普遍。usb协议数据传输速度快,存储量大,基本上已经成为行业内数据传输和储存的标准。由此相继而生的USB移动存储设备接口的芯片将应用与一些需要转存数据的设备、仪器上。作为USB移动存储设备接口的芯片之一的CH375支持HOST主机方式和SLAVE设备方式,是一个USB总线的通用接口芯片。

1 芯片简介

CH375作为一个USB总线的通用接口芯片,支持USB-HOST主机方式USB-DEVICE/SLAVE设备方式。一方面,在本地端,CH375具有可以方便地挂接到单片机/DSP/MCU/MPU等控制器的系统总线上的8位数据总线和读、写、片选控制线以及中断输出;另一方面,CH375还提供了串行通讯方式,即在USB主机方式下,通过串行输入、串行输出和中断输出与单片机/DSP/MCU/MPU等相连接。

常用的USB全速设备受CH375的USB主机方式的支持,通过CH375按照相应的USB协议,外部单片机可以与USB设备通讯。另外,由于CH375内置了处理Mass-Storage海量存储设备的专用通讯协议的固件,外部单片机还可以直接以扇区为基本单位读写常用的USB存储设备(包括USB硬盘/USB闪存盘/U盘)。

2 CH375的工作原理

CH375的USB主机方式支持并行接口和串行接口。CH375支持各种常用的USB全速设备因此在USB主机方式下,外部单片机与USB的设备通讯,需要编写固件程序并且依照相应的USB协议。但是一般而言,外部单片机不需要编写固件程序,就可以直接通讯。因为就USB存储设备来说,CH375内置了相关协议的。

3 CH375与89C52的接口电路

3.1 并口方式

通过1KΩ左右的下拉电阻,CH375的TXD引脚可以接地或者直接接地,因而使得CH375工作于并口方式。一对5V电源线和一对数据信号线组成USB总线,一般情况下,+5V电源线是红色,接地线是黑色,D+信号线是绿色,D-信号线是白色。可以直接连接USB设备的USB插座P1可以在必要的时候提供快速电子开关给USB设备的+5V电源线上串接具有限流的作用。USB电源电压必须控制在5V。设计印刷线路板PCB时,留意的事项有:退耦电容C3和C4尽可能的靠近CH375的相连引脚;为贴近平行布线的D+和D-信号线两侧提供地线或者覆铜,以便减少来自外界的信号干扰;在缩短XI和XO引脚相关信号线的长度的同时,在相关元器件周边环绕地线或者覆铜可以减少高频时钟对外界的干扰。

3.2 串口方式

CH375工作于串口方式的时候CH375芯片的TXD引脚处于悬空或者没有通过下拉电阻接地。在串口方式下,其它所有引脚的悬空CH375只需要与单片机/DSP/MCU连接3个信号线,TXD引脚、RXD引脚以及INT#引脚。为INT#引脚或者TXD引脚上加阻值为2KΩ~5KΩ的上拉电阻,可以维持相对稳定的的高电平。完成CH375芯片复位之后,INT#引脚和TXD引脚则能够为5m A的高电平提供输出电流或者为5m A的低电平提供吸入电流。

4 单片机读写U盘文件

4.1 读写u盘文件原理简介

因为CH375直接提供了数据块的读写接口,并且以512字节的物理扇区为基本读写单位,从而USB存储设备被简化为一种外部数据存储器,因此单片机在自由读写USB存储设备中的数据的同时,也可以自由定义其数据结构。由于计算机将USB存储设备组织为文件系统,单片机处理上图左边的最顶层即可以将USB存储设备组织为文件系统,方便了单片机通过USB移动存储设备与计算机之间交换数据。

CH375为C语言子程序库提供了USB存储设备的文件级接口。包含了常用的文件级操作的这些应用层接口API,可以移植并嵌入到各种常用的单片机程序中。

4.2 单片机读写U盘文件流程(图3)

4.3 源程序实例

以下为串行方式下读写U盘的部分程序代码。

5 结束语

本文以USB接口芯片CH375为基础,详细讨论了CH375的工作原理,和C51单片机的并行接口设计和串行接口设计,并以串口设计为例介绍了单片机读写U盘文件的原理和方法,并给出了读写文件的源程序。此设计方案已经在仪表的开发中采用,投入了正常运行。

参考文献

[1]余永权.ATMEL89系列单片机应用技术[M].北京航空航天大学出版社,2002.

[2]马忠梅.单片机C语言Windows环境编程宝典[M].北京航空航天大学出版社,2003.

USB芯片 篇4

日常生活中,人们对USB设备的使用越来越多,大部分的USB设备能够即插即用,非常方便,像USB接口的键盘、鼠标等。但有些USB设备生产商在他们的产品中使用了特殊的协议或是增加了特别的功能,因此就得为这种产品开发特定的驱动程序。多数情况下,厂商会为用户提供这样的驱动程序。当没有提供与用户操作系统平台相应的驱动程序的时候,开发驱动就只能由用户来完成了。Linux以其开放源代码的优点受到越来越多人的欢迎,开放源码的好处一方面在于可以根据实际需要来配置内核,另一方面在于为开发设备驱动程序提供了借鉴。鉴于此,以Cypress公司推出的USB 2.0控制器CY 7C 68013为例,论述了Linux下USB设备驱动程序开发的一般方法,对相同环境下其它的设备驱动开发具有借鉴意义。在论述开发方法之前,有必要介绍USB协议及CY 7C 68013芯片的相关知识。

1 USB介绍

USB—Universal Serial Bus,意为通用串行总线,它最初是为了替代许多不同的低速总线(包括并行、串行和键盘连接)而设计的,它以单一类型的总线连接各种不同的类型的设备。USB的发展已经超越了这些低速的连接方式,它现在可以支持几乎所有可以连接到PC上的设备。最新的USB 2.0协议版本于2000年4月推出,支持3种速度模式,修订了理论上高达480Mbps的高速连接。

USB是一个非常复杂的系统,并且由许多不同逻辑单元组成,Linux内核提供了一个称为USB核心[1]的子系统来把这一复杂的系统抽象化。USB设备的逻辑单元包括配置(configuration)、接口(interface)和端点(endpoint)。这些单元之间的关系可简单地描述如下:

设备通常有一个或多个配置;

配置常常有一个或多个接口;

接口常常有一个或多个设置;

接口有一个或多个端点。

USB通信最基本的形式是通过端点(USB端点分中断、批量、等时、控制四种,每种用途不同),它来描述数据如何被传送。USB端点只能往一个方向传送数据,从主机到设备或者从设备到主机,端点可以看作是单向的管道(pipe)。驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否已经安装了硬件。USB核心使用一个列表(是一个包含制造商ID和设备号ID的一个结构体)来判断对于一个设备该使用哪一个驱动程序,热插拨脚本使用它来确定当一个特定的设备插入到系统时该自动加载哪一个驱动程序。

2 CY 7C 68013接口芯片特性简介

CY 7C 68013接口芯片是Cypress公司的EZ-USBFX 2系列中一种同时兼容USB 2.0和USB 1.1协议的功能强大的接口芯片,图1是它的结构框图。它集成USB 2.0收发器、SIE(SerialInterfaceEngine,串行接口引擎)、增强的8051微控制器以及可编程成的外部接口等于一个单片中,无需外加芯片即可完成高速USB传输,性价比较高。GPIF(The GeneralProgrammableInterface,通用可编程接口)、主从端点FIFO(8位或16位数据总线)提供了一种容易而且是无缝地与流行的接口进行连接的方法,如ATA、UTOPIA、EPP、PCMCIA以及大部分的DSP/处理器。

3 驱动开发

编写、定制驱动程序最好的方法就是在已有的Linux源代码中找到一个与目标设备相似的设备驱动程序,以它为例,再根据自己设备的特殊要求在原有程序上进行部分修改,最后编译内核或者作为模块加载即可。有关USB总线的通用操作(设备枚举、数据传输等)已经在主机控制器驱动程序完成,所以编写设备端驱动程序的主要任务是完成与具体设备相关的具体设备操作函数[3]。写一个USB的驱动程序最基本的工作是要做四件事:列出驱动程序要支持的设备、注册USB驱动程序、探测和断开、提交和控制urb(USB请求块)(当然也可以不用urb来传输数据)。

Linux的内核源码目录中,/usrsrc/linux/driver/usb/usb-skeleton.c是一个基本的USB驱动骨架程序,对其作相应改动,就可以完成一个 USB设备的驱动。

3.1 驱动注册

注册所用的函数是 usb_register()。通常,注册操作在驱动程序的初始化函数里:

static int _init usb_skel_init(void)

{

int result;

/* 驱动程序注册到USB子系统中*/

result= usb_register(&skel_driver);

if (result<0) {

err("usb_register failed. Error number %d", result);

return -1;

}

info(DRIVER_DESC" "DRIVER_VERSION);

return 0;

}

static void _exit usb_skel_exit(void)

{

/* 从子系统注销驱动程序 */

usb_deregister(&skel_driver);

}

module_init(usb_skel_init);

module_exit(usb_skel_exit);

当USB驱动程序将要被卸开时,需要把struct usb_driver从内核中注销。通过调用usb_deregister_driver()来完成这个工作,当调用发生时,当前绑定到该驱动程序上的任何USB接口都被断开,断开函数将被调用。

USB驱动程序首先要做的事情就是向 USB核心注册,提供该驱动程序的相关信息 ,例如此驱动程序支持什么设备,设备插拔时,应该做些什么。这些信息放在一个叫usb_driver的结构体里,usb_driver结构体如下所示 :

define USB_SKEL_MINOR_BASE 192

static struct usb_driver skel_driver= {

name:"skeleton",

probe:skel_probe,

disconnect:skel_disconnect,

fops:&skel_fops,

minor:USB_SKEL_MIONR_BASE,

id_table:skel_table,

};

其中,name是指向驱动程序名字的指针,用户可以随意修改这个名字,例如可以把它改成“CY7C68013”,以此来表示它是CY7C68013的驱动程序。 id_ table用来告诉内核该模块支持的设备。USB子系统通过设备的VENDOR_ID和 PRODUCT_ID的组合来识别设备 ,并调用相关的驱动程序作处理。相关代码如下:

define USB_SKEL_VENDOR_ID 0x04b4

define USB_SKEL_VENDOR_ID 0x8612

static struct usb_device_id skel_table []= {

{USB_DEVICE(USB_SKEL_VENDOR_ID,

USB_SKEL_PRODUCT_ID) },

{ } /* Terminating entry */

};

MODULE_DEVICE_TABLE (usb, skel_table);

该结构体表明了该驱动程序支持哪些设备,空的{}是终止标志,表示设备列表结束。当某 USB设备被插上时,系统就会检查此设备的VENDOR_ID和 PRODUCT_ID,如果与上面结构体中的设备列表的USB_SKEL_VENDOR_ID、USB_SKEL_PRODUCT_ID

相同,此驱动程序将被调用,并且调用该驱动程序的 probe函数 ,也就是探测函数。注意,probe ()函数也是 usb_driver中的一员 ,usb_driver被注册后,系统先对 id_table进行确认,成功后才调用 probe()函数,否则不调用。

将 CY7C68013插入 PC后,在终端上输入:cat /proc/bus/usb/devices,就可以看到它的VENDOR_ID和 PRODUCT_ID的值了(可以通过修改 CY7C68013的固件),再将驱动程序中 USB_SKEL_VENDOR_ID,USB_SKEL _PRODUCT_ID的值作出相应的修改即可。

3.2 探测和断开函数

当USB设备插入PC时,USB核心通过设备标识确定该设备的驱动程序,调用probe()函数,将从 USB设备获得的具体信息通过 struct usb_interface *interface结构体传递给 probe()函数,这个结构体描述了 USB接口的信息 。前已提及,一个 USB接口可以有一种或多种设置,每种设置中对端点的配置都不一样。probe()函数通过一个循环语句对各端点进行探测,确定这些端点的类型和传输方向,并将端点地址、数据包大小等信息存入一个(struct usb_skel *dev)数据结构体中,便于以后的read,write等函数调用。需要注意的是,usb_skel结构体中只能容纳一个批量读端点和一个批量写端点的信息,如果设备中有多个批量读或写端点,那就需要对此循环语句进行修改 ,从端点的具体信息(例如端点地址 )筛选需要的端点。

当释放设备文件句柄时,skel_disconnect() 这个函数会被调用。MOD_DEC_USE_COUNT宏会被用到,它表示计数器值自减1。首先,确认当前是否有其它的程序正在访问这个设备,如果是最后一个用户在使用,可以关闭任何正在发生的写操作。

USB 设备可以在任何时间点从系统中取走,驱动程序必须能够很好地处理解决此问题,它需要能够切断任何当前的读写,同时通知用户空间程序:usb设备已经被取走。对于每一次设备读写等其它函数操作,都要检查usb_device结构是否存在。如果不存在,就表明设备已经消失,并返回一个-ENODEV错误给用户程序。设备使用完毕,程序会调用release() 函数,此时,无论usb_device结构是否存在,它都会清空skel_disconnect()函数所作工作。

3.3 提交和控制urb及驱动注册

当驱动程序有数据要发送到USB设备时,要分配一个urb来把数据传输给设备。 urb被成功分配后,还要创建一个DMA缓冲区,传递给驱动程序的数据要复制到这块缓冲中去。当数据从用户空间正确复制到局部缓冲区后,urb必须在可以被提交给USB核心之前被正确初始化,然后urb就可以被提交给USB核心以传输到设备了。之后,urb回调函数将被USB核心调用。

有时候USB驱动程序只是要发送或者接收一些简单的数据,驱动程序也可以不用urb来进行数据的传输,这里涉及到两个简单的接口函数:usb_bulk_msg和usb_control_msg ,读操作就是这样的一个应用。

这些完成后,还要注册设备(3.1是注册驱动程序),注册设备的函数是 devfs_register ()。 以下就可以为设备创建设备节点了。设备节点是一个代表设备的文件,它将具体的设备以文件的形式表现出来,因为Linux将设备当作文件来对待。

创建设备节点的终端命令是:mknod /dev/CY7C68013 c 180 192,该命令将在/dev文件夹下创建一个名为CY7C68013、字符类型的设备节点 ,其主设备号是 180,次设备号是 192。

mknod生成一个虚拟设备文件,属性只有主设备号180及次设备号192,而一个USB设备只有VENDOR_ID和 PRODUCT_ID两个标识属性,它们是怎么对应起来的?关键就在注册USB设备驱动程序时,有:

#define USB_SKEL_VENDOR_ID 0x04b4

#define USB_SKEL_PRODUCT_ID 0x8612

#define USB_SKEL_MINOR_BASE 192

这样设备驱动程序里就有了两边的所有信息(USB主设备号默认是180),从而把它们连到一起。即设备插入时系统会根据设备标识去找对应的驱动程序;而当应用程序对一个设备文件(就是对设备)进行读写操作时,系统又根据这个主、次设备号去找对应的驱动程序。间接地,它们就对应起来了。

3.4 操作函数

现在,用户程序就可以通过此设备节点对设备进行操作了。这又涉及到一个重要的结构体:

static struct file_operations skel_fops={

owner:THIS_MODULE,

read:skel_read,

write:skel_write,

open:skel_open,

release:skel_release,

};

当用户应用程序执行read()、write()等操作时,skel_read() 、skel_write()将会被调用。

至此,一个比较简单的USB驱动程序就完成了。

4 编译内核

有时为了实现某些功能,比如实现对一些硬件的支持等,需要重新编译内核。编译过程如下:

# cd /usr/src

# tar zvxf linux-2.6.12.3.tar.gz

# ln –s /usr/src/linux-2.6.12.3 linux

# cd linux

# make mrproper

# make menuconfig

# make bzImage

# make modules

#make modules_install

#cp /usr/src/linux/System.map /boot/System.map-2.6.12.3

#cp /usr/src/linux/arch/i386/boot/bzImage

/boot/vmlinuz-2.6.12.3

# cd /boot

# /sbin/mkinitrd initrd-2.6.12.3.img 2.6.12.3

# vi /boot/grub/grub.conf (修改相应配置)

# reboot

5 驱动模块的编译和使用

驱动程序编译成模块就可以把它插入到内核中运行了,编译的Makefile文件可以这样来写:

ifneq (MYM(KERNELRELEASE),)

obj-m:= skeleton.o

else

KERNELDIR = /lib/modules/MYM(shell uname -r)/build

PWD:= MYM(shell pwd)

default:

MYM(MAKE) -C MYM(KERNELDIR) M=MYM(PWD) modules

endif

clean:

rm -rf *.mod.* *.o *.ko.*.ko.*.tmp*.*.mod.o.*.*.o.*

uname -r得到当前运行的内核版本信息。在linux下直接执行make就可以生成驱动模块(skeleton.ko)。使用insmod skeleton.ko就可以插入到内核中运行了,用命令cat /proc/bus/usb/devices,可以看到驱动程序已经绑定到接口上。

6 结束语

设备驱动程序开发的有效方法是搜索加模仿。当模块编译不成功时,还需要作进一步的调试。另外,测试用的应用程序也是必要的。模块加载成功后,用户就可以开发自己的应用程序了。

摘要:虽然USB接口的设备在日常生活中很多,但Linux的硬件配置尚不能全部支持设备的即插即用。不过,Linux操作系统以其开放源码的特性为设备驱动程序开发提供了便利。以CY7C68013芯片为例,论述了Linux下USB设备驱动程序的开发方法,并介绍了与开发相关的内核编译过程。

关键词:CY7C68013芯片,Linux,USB设备驱动程序

参考文献

[1]杨伟,刘强,顾新.Linux下USB设备驱动研究与开发.计算机工程,Vol.32 No.19,2006;10,283—284

[2]扈啸,张玘,张连超.USB2.0控制器CY7C68013特点与应用.单片机与嵌入式系统应用,2002年第10期,48—50

上一篇:怎样学好数学下一篇:效用价值