搜档网
当前位置:搜档网 › (简易USB驱动)开发指导

(简易USB驱动)开发指导

(简易USB驱动)开发指导
(简易USB驱动)开发指导

实验七(2)设备驱动开发指导

块设备种类多,使用广泛,其驱动程序的开发也比字符设备复杂。通过本实验,大家要开发一个实际块设备(U盘)的驱动程序,将能够更深入地掌握块设备驱动程序的开发方法。Linux下已经有一个通用的U盘驱动程序usb-storage.o,其源程序放在目录drivers\usb\storage下(相对于内核源码根目录)。但这个驱动的实现相当复杂,本实验希望开发一个相对简单些的U盘驱动程序,不求高性能,只求结构明朗、清晰易懂,主要是让大家掌握一个实际块设备的驱动方式,从而加深理解。

事实上,本实验开发的驱动程序应该能够适用于所有基于Bulkonly传输协议的USB大容量存储设备(USB Mass Storage),比如USB移动硬盘和USB外置光驱,USB闪存盘(U 盘)只是其中的一种。由于USB大容量存储设备具有容量大、速度快、连接灵活、即插即用、总线供电等优点,它们得到了广泛使用,掌握这类设备驱动程序的开发技术无疑具有很强的实用性。

实验内容

编写一个U盘驱动程序myudisk,只要求能够驱动某个型号的U盘,能够支持U盘的常规操作,如命令hexdump、mke2fs和mount等。同时,要求在系统内核日志中显示出U盘的容量。若有余力,可增加多分区支持功能。

实验基础和思路

在教材中P130,讲解了如何编写一个Ramdisk块设备驱动程序(sbull.c),称为radimo;在文献《Linux Device Drivers》讲解了如何编写一个USB设备驱动程序,并以Linux源代码中的usb-skeleton.c为例。虽然前者驱动的并不是一个实际的块设备,且后者又只是针对usb字符设备,但是它们提供了一个不错的基础,通过合并我们就能基本得到一个支持usb块设备的驱动程序。之所以说基本得到,是因为合并后只是有了块设备、USB设备的驱动支持框架,但还缺一样:对U盘(USB块设备)的实际访问操作。USB块设备的访问方法与USB字符设备区别很大,有一套复杂的协议。把这样一套协议研究清楚,将花费大量时间,也远离了我们驱动程序开发的核心。这是一大难点,为此我们专门编写了一个U盘访问函数(myudisk_Bulk_transport),以减轻工作量。下一节将对该函数的使用方法和工作过程进行专门讲解。

简言之,合并radimo和usb-skeleton这两个参考驱动程序,以构造整体框架,调用帮助函数myudisk_Bulk_transport以访问U盘,从而打造一个简洁的U盘驱动程序。本节接下来介绍这两个参考驱动程序:radimo和usb-skeleton,着重讲解其工作原理及合并关键环节。

参考驱动程序一:块设备驱动程序sbull

请参看教材P130

参考驱动程序二:USB字符设备驱动程序usb_skeleton

请参看内核代码drivers\usb\usb-skeleton.c

U盘驱动的帮助函数

为了帮助大家编写U盘驱动程序、降低复杂性,我们以Linux下的通用USB驱动程序usb-storage为基础,整理出了一个U盘访问函数myudisk_Bulk_transport。此函数主要借鉴的是如下几个文件:

1)drivers/usb/storage/transport.c

2)drivers/usb/storage/transport.h

3)drivers/scsi/scsi.h

函数原型及其使用

该函数的原型如下所示:

int myudisk_Bulk_transport(struct usb_device *udev,

struct usb_interface *interface,

struct cmnd_struct *cs,

unsigned char *bulk_buffer, int bulk_size,

__u8 bulk_in_endpointAddr, __u8 bulk_out_endpointAddr);

其功能是向USB设备udev的接口interface发送一个命令,进行对应的数据传递,并获取反馈的状态信息。各参数解释如下:

●udev和interface:U盘的设备和接口指针,可直接使用usb_skel中的对应变量。

这里有必要澄清几个基本概念。USB协议规定,分四级来描述USB设备:一个USB

设备(device)可能有很多配置(configuration);每种配置下又可表现出多个子

设备,每个子设备用一个接口(interface)表示、真正对应于一个驱动程序;再

细了讲,子设备与USB控制器之间是通过管道(pipe)进行的,而管道的两端称为

端点(endpoint)。

●cs:指向一个cmnd_struct结构,描述发给U盘的命令,这些命令在UFI命令规范

(USB Mass Storage Class UFI Command Specification)中定义。UFI命令规范

是针对USB移动存储而制定的,实际上UFI命令格式是基于SFF-8070i和SCSI-2

规范,总共定义了19个12字节长度的操作命令。具体命令格式以及含义,请查阅

UFI规范文本。

●bulk_buffer和bulk_size:若上述命令需要有后续的数据传递,则使用缓冲区

bulk_buffer,其最大长度为bulk_size。

●bulk_in_endpointAddr和bulk_out_endpointAddr:分别用来建立起从USB控制器

到USB设备的输入管道和输出管道,进而传递命令(使用输出管道)、数据和状态

(使用输入管道)信息。依传输方向的不同,数据的传递既有可能使用输入管道,

也有可能使用输出管道。

下面以U盘容量获取为例进行解释。首先列出相应的代码片断:

/* prepare the command */

memset (dev->command.cmnd, 0, MAX_COMMAND_SIZE);

memset (dev->bulk_buffer, 0, dev->bulk_size);

dev->command.cmnd[0] = READ_CAPACITY; /* READ CAPACITY command */

dev->command.cmd_len = 10;

dev->command.sc_data_direction = SCSI_DATA_READ;

/* dev->command.data_payload_size: unused for this command, calculated automatically. But for other commands, such as READ_10, it may be unommittable */

/* read actually */

result = myudisk_Bulk_transport(dev->udev, dev->interface, &dev->command,

dev->bulk_buffer, dev->bulk_size,

dev->bulk_in_endpointAddr, dev->bulk_out_endpointAddr); if (result == MY_TRANSPORT_GOOD) {

/* now, the capacity parameters are in bulk_buffer.

* Analize capacity packet:

* buffer[0] to buffer[3] represent LBN num(n-1).Last Logical Block Address * buffer[4] to buffer[7] represent block size in byte.

*/

unsigned char * buffer = dev->bulk_buffer;

my_debug_data (__func__, dev->command.data_payload_actualSize, buffer);

dev->nsectors = ( (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | (buffer[3]) ) + 1;//(__u32*)buffer; block number LBN(n-1)

dev->hardsect_size = ( (buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | (buffer[7]) ); //(__u32*)buffer+4;block size.

if (dev->hardsect_size & ((1 << RADIMO_SECTOR_BITS)-1)) {

info("%s : unsupported block size %d.\n", name, dev->hardsect_size);

dev->nsectors = 0x1fffff;

dev->hardsect_size = RADIMO_SECTOR_SIZE;

info("%s : block size assumed to be %d bytes, disk size 1GB.\n",

name, dev->hardsect_size);

} else {

unsigned int sz = (dev->nsectors/2) * (dev->hardsect_size/256);

info("USB device %s : ""%u %d-byte hdwr blocks (%u MB)\n",

name, dev->nsectors, dev->hardsect_size, (sz - sz/625 + 974)/1950);

}

} else {

dev->nsectors = 0x1fffff;

dev->hardsect_size = RADIMO_SECTOR_SIZE;

info("%s : READ CAPACITY failed.", name);

}

正如加粗字体说标示的,上述代码片断可分为三大块:准备命令、执行命令、分析结果。命令和结果的具体格式请查阅UFI规范,也可参考相关的Linux驱动源程序。需要说明的是,对于数据长度固定的命令来说,“dev->command.data_payload_size”可以不设,但对于读、写这类命令来说,则需要设置。另外,my_debug_data、MY_TRANSPORT_GOOD、SCSI_DATA_READ 和MAX_COMMAND_SIZE是在mytransport.h中定义的,READ_CAPACITY等命令是在

scsi/scsi.h中定义的。

上述代码片断输出的内核日志如下,可见其中包括了31个字节的命令、8个字节的数据和13个字节的状态信息,结果显示U盘容量为33M。

/root/usb/mytransport.c (my_transfer_length): doDefault 0, data length 8

/root/usb/mytransport.h [command to send]: length = 31, data = << 55 53 42 43 01 00 00 00 08 00 00 00 80 00 0a 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >> /root/usb/mytransport.c (myudisk_Bulk_transport): Bulk command S 0x43425355 T 0x1 Trg 0 LUN 0 L 8 F 128 CL 10

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk command transfer result=0, xferred 31/31

/root/usb/mytransport.c (myudisk_Bulk_transport): ----cmnd end

/root/usb/mytransport.c (myudisk_Bulk_transport): xfer 8 bytes data

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk data transfer result: 0, xferred 8/8

/root/usb/mytransport.c (myudisk_Bulk_transport): ----data end

/root/usb/mytransport.c (myudisk_Bulk_transport): Attempting to get CSW...

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk status transfer result = 0, xferred 13/13

/root/usb/mytransport.h [status data recerived]: length = 13, data = << 55 53 42 53 01 00 00 00 00 00 00 00 00 >>

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk status Sig 0x53425355 T 0x1 R 0 Stat 0x0

/root/usb/mytransport.c (myudisk_Bulk_transport): transport indicates command was successful

/root/usb/mytransport.h [skel_probe]: length = 8, data = << 00 00 f9 ff 00 00 02 00 >>

/root/usb/main.c: USB device radimoa : 64000 512-byte hdwr blocks (33 MB)

工作原理和过程

USB大容量存储设备通常使用一个带有USB接口引擎的微控制器(MPU),用于处理主机发送的命令以及对存储设备进行操作。USB组织定义了大容量存储设备的类规范,这个类规范包括四个独立的子类规范,即:

(1)USB Mass Storage Class Control/Bulk/Interrupt(CBI)Transport

(2)USB Mass Storage Class Bulk-Only Transport

(3)USB Mass Storage Class ATA Command Block

(4)USB Mass Storage Class UFI Command Specification。

前两个子规范定义了数据/命令/状态在USB上的传输方法。Bulk-Only传输规范仅仅使用Bulk端点传送数据/命令/状态,CBI传输规范则使用Control/Bulk/Interrupt三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。

USB大容量存储设备软件结构示意图

图1 USB大容量存储设备软件结构示意

图1是USB大容量存储设备软件结构示意图。虚线左边部分是主机的驱动程序结构。最顶层是应用程序接口(API),用于提供给用户访问存储设备的方法;中间的UFI/ATA驱动层将应用程序的访问转换成UFI或ATA命令/数据格式,与外部存储设备之间按照子规范3或4的定义进行命令/状态/数据的交换;最底层则是USB传输驱动,负责将上层的UFI/ATA 数据发送到USB总线上以及接收从存储设备返回的状态/数据。虚线右边部分是大容量存储设备的固件(Firmware)功能结构。在USB总线接口上面是USB传输处理层,它与主机之间按照子规范1或2的定义进行通讯,将主机的命令/数据传递到UFI/ATA 命令处理层并将其状态/数据返回到主机,它还需要检查并处理数据传输过程中的错误。UFI /ATA 命令处理层负责对主机的UFI /ATA 命令进行处理,并将结果返回给主机。存储介质接口提供与不同存储介质连接的方法,负责将接收到的UFI /ATA 命令/数据转换成具体的物理信号发送到存储介质,并从存储介质获取状态/数据。

在具体实现上,存储设备可以选择支持两种传输规范(CBI或Bulk-Only)或者只支持其中的一种。实际上,Bulk-Only传输规范是一种更常用的方法。市面上大多数USB存储设备都是基于Bulk-Only传输规范和UFI命令规范设计的。

按照Bulk-Only传输规范,主机与大容量存储设备之间的交互应该遵守图所示的Command/Data/Status协议,即先由主机传输命令给设备,然后做数据传递(方向依命令而定),接着由设备将命令执行结果状态报给主机,如此反复。该协议同时规定了如果中间出现错误该如何恢复。对于第三步“Status Transport”,还特别定义了一个复杂的交互和恢复流程。

图2 Command/Data/Status协议[10]

事实上,现在来分析我们的myudisk_Bulk_transport函数,其关键语句展示如下。容易看出,此函数正是按照上述流程执行的。其中包含许多的错误处理语句,也遵守Bulk-Only 传输规范。

/* set up the command wrapper */

bcb->Signature = cpu_to_le32(MU_BULK_CB_SIGN);

......

bcb->Lun = cs->cmnd[1] >> 5;

bcb->Length = cs->cmd_len;

/* construct the pipe handle */

pipe = usb_sndbulkpipe(udev, bulk_out_endpointAddr);

/* copy the command payload */

memset(bcb->CDB, 0, sizeof(bcb->CDB));

memcpy(bcb->CDB, cs->cmnd, bcb->Length);

/* send it to out endpoint */

result = usb_bulk_msg(udev, pipe, bcb, MU_BULK_CB_WRAP_LEN, &partial,

MY_TIMEOUT);

......

/* if the command transfered well, then we go to the data stage */

if (result == 0) {

/* send/receive data payload, if there is any */

if (bcb->DataTransferLength) {

/* calculate the appropriate pipe and buffer information */

if (cs->sc_data_direction == SCSI_DATA_READ) {

pipe = usb_rcvbulkpipe(udev, bulk_in_endpointAddr);

......

}

} else {

......

}

/* transfer the data */

result = usb_bulk_msg(udev, pipe, buf, transfer_amount,

&partial, MY_TIMEOUT);

......

}

}

/* construct the pipe handle */

pipe = usb_rcvbulkpipe(udev, bulk_in_endpointAddr);

/* get CSW for device status */

result = usb_bulk_msg(udev, pipe, bcs, MU_BULK_CS_WRAP_LEN,

&partial, MY_TIMEOUT);

......

实验指南

按照上述方法,将sbull.c与usb-skeleton.c合并成为一个新文件main.c,在其中调用U盘访问函数myudisk_Bulk_transport()。然后使用如下的Makefile文件进行编译:#

# Makefile for the myudisk device drivers.

#

EXTRA_CFLAGS := -c -I /usr/src/linux-2.4.22/include -Wall

myudisk-objs := main.o mytransport.o

myudisk.o: $(myudisk-objs)

$(LD) -r -o $@ $(myudisk-objs)

main.o: main.c

gcc $(EXTRA_CFLAGS) main.c

mytransport.o: mytransport.c mytransport.h

gcc $(EXTRA_CFLAGS) mytransport.c

clean:

find . \( -name '*.[oas]' -o -name core \) -type f -print \

| xargs rm –f

编译后,会生成一个驱动程序模块myudisk.o。在加载之前,为避免干扰,最好将系统的通用USB驱动程序usb-storage.o备份并删除。如果是2.4.22的内核,那么该程序就放在目录/lib/modules/2.4.22/kernel/drivers/usb/storage/下。接着插上U盘,执行命令“insmod myudisk.o”以插入模块。如果一切正常的话,应该可以在内核消息日志中看到类似下列信息:

/root/usb/main.c: USB Skeleton device now attached to radimoa

......

/root/usb/mytransport.c (my_transfer_length): doDefault 0, data length 8

/root/usb/mytransport.h [command to send]: length = 31, data = << 55 53 42 43 01 00 00 00 08 00 00 00 80 00 0a 25 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >> /root/usb/mytransport.c (myudisk_Bulk_transport): Bulk command S 0x43425355 T 0x1 Trg 0 LUN 0 L 8 F 128 CL 10

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk command transfer result=0, xferred 31/31

/root/usb/mytransport.c (myudisk_Bulk_transport): ----cmnd end

......

/root/usb/mytransport.h [skel_probe]: length = 8, data = << 00 00 f9 ff 00 00 02 00 >>

/root/usb/main.c: USB device radimoa : 64000 512-byte hdwr blocks (33 MB) ......

radimoa:<7>/root/usb/main.c (radimo_transfer): read sector: sector = 0, nsect = 8

/root/usb/main.c (radimo_transfer): data size requested actually: 4096, blocksize: 512

/root/usb/mytransport.c (my_transfer_length): doDefault 1, data length 4096

/root/usb/mytransport.h [command to send]: length = 31, data = << 55 53 42 43 02 00 00 00 00 10 00 00 80 00 0a 28 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 >> /root/usb/mytransport.c (myudisk_Bulk_transport): Bulk command S 0x43425355 T 0x2 Trg 0 LUN 0 L 4096 F 128 CL 10

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk command transfer result=0, xferred 31/31

/root/usb/mytransport.c (myudisk_Bulk_transport): ----cmnd end

/root/usb/mytransport.c (myudisk_Bulk_transport): xfer 4096 bytes data

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk data transfer result: 0, xferred 4096/4096

/root/usb/mytransport.c (myudisk_Bulk_transport): ----data end

/root/usb/mytransport.c (myudisk_Bulk_transport): Attempting to get CSW...

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk status transfer result = 0, xferred 13/13

/root/usb/mytransport.h [status data recerived]: length = 13, data = << 55 53 42 53 02 00 00 00 00 00 00 00 00 >>

/root/usb/mytransport.c (myudisk_Bulk_transport): Bulk status Sig 0x53425355 T 0x2 R 0 Stat 0x0

/root/usb/mytransport.c (myudisk_Bulk_transport): transport indicates command was successful

/root/usb/main.c (radimo_transfer): read 4096 bytes successful.

......

unknown partition table

usbcore: registered new interface driver skeleton

这些信息依次包括:

1)USB设备连接信息

2)U盘容量获取信息,结果显示U盘容量为33M。

3)分区表信息,这部分会读出很多扇区,每次读都包括类似前面的命令、数据、状态

三部分,最后显示分区表内容不能识别,这是因为实验用的U盘没有分区。

4)USB设备驱动程序注册信息

此后,大家就可以对此U盘进行通常的hexdump、mke2fs和mount等操作,在mount之后就可以进行各种文件操作了。最后,执行命令“rmmod myudisk.o”卸载模块,同时将反注册usb驱动程序、断开设备,在内核日志中会看到类似下列信息:

usbcore: deregistering interface driver skeleton

/root/usb/main.c: Radimo #0 now disconnected

至此,恭喜你,亲爱的朋友,一个简洁的U盘驱动程序就诞生了。

usb驱动程序教程

编写Windows https://www.sodocs.net/doc/eb14817423.html,的usb驱动程序教程 Windows https://www.sodocs.net/doc/eb14817423.html, 是微软推出的功能强大的嵌入式操作系统,国内采用此操作系统的厂商已经很多了,本文就以windows https://www.sodocs.net/doc/eb14817423.html,为例,简单介绍一下如何开发windows https://www.sodocs.net/doc/eb14817423.html, 下的USB驱动程序。 Windows https://www.sodocs.net/doc/eb14817423.html, 的USB系统软件分为两层: USB Client设备驱动程序和底层的Windows CE实现的函数层。USB设备驱动程序主要负责利用系统提供的底层接口配置设备,和设备进行通讯。底层的函数提本身又由两部分组成,通用串行总线驱动程序(USBD)模块和较低的主控制器驱动程序(HCD)模块。HCD负责最最底层的处理,USBD模块实现较高的USBD函数接口。USB设备驱动主要利用 USBD接口函数和他们的外围设备打交道。 USB设备驱动程序主要和USBD打交道,所以我们必须详细的了解USBD提供的函数。 主要的传输函数有: abourttransfer issuecontroltransfer closetransfer issuein te rruptransfer getisochresult issueisochtransfer gettransferstatus istransfercomplete issuebulktransfer issuevendortransfer 主要的用于打开和关闭usbd和usb设备之间的通信通道的函数有: abortpipetransfers closepipe isdefaultpipehalted ispipehalted openpipe resetdefaultpipe resetpipe 相应的打包函数接口有: getframelength getframenumber releaseframelengthcontrol setframelength takeframelengthcontrol 取得设置设备配置函数: clearfeature setdescriptor getdescriptor setfeature

最新开发usb驱动程序的方法连载一

最新开发usb驱动程序的方法连载一 开发usb驱动程序的方法(连载二) NT还有更多其他的对象,例如中断对象、Controller对象、定时器对象等等,但在我们开发的驱动程序中并没有用到,因此在这里不做介绍。 I/O缓冲策略 很明显的,驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。这就就设计到设备的I/O缓冲策略。 读写请求的I/O缓冲策略 前面说到通过设置Device对象的Flag可以选择控制处理读写请求的I/O缓冲策略。下面对这些缓冲策略分别做一介绍。 1、缓冲I/O(DO_BUFFERED_IO) 在读写请求的一开始,I/O管理器检查用户缓冲区的可访问性,然后分配与调用者的缓冲区一样大的非分页池,并把它的地址放在IRP的AssociatedIrp.SystemBuffer域中。驱动程序就利用这个域来进行实际数据的传输。 对于IRP_MJ_READ读请求,I/O管理器还把IRP的UserBuffer域设置成调用者缓冲区的用户空间地址。当请求完成时,I/O管理器利用这个地址将数据从驱动程序的系统空间拷贝回调用者的缓冲区。对于IRP_MJ_WRITE写请求,UserBuffer被设置为NULL,并把用户缓冲区的数据拷贝到系统缓冲区中。 2、直接I/O(DO_DIRECT_IO) I/O管理器首先检查用户缓冲区的可访问性,并在物理内存中锁定它。然后它为该缓冲区创建一个内存描述表(MDL),并把MDL的地址存放在IRP的MdlAddress域中。AssociatedIrp.SystemBuffer和 UserBuffer 都被设置为NULL。驱动程序可以调用函数 MmGetSystemAddressForMdl得到用户缓冲区的系统空间地址,从而进行数据操作。这个函数将调用者的缓冲区映射到非份页的地址空间。驱动程序完成I/O请求后,系统自动从系统空间解除缓冲区的映射。 3、这两种方法都不是 这种情况比较少用,因为这需要驱动程序自己来处理缓冲问题。 I/O管理器仅把调用者缓冲区的用户空间地址放到IRP的UserBuffer 域中。我们并不推荐这种方式。 IOCTL缓冲区的缓冲策略 IOCTL请求涉及来自调用者的输入缓冲区和返回到调用者的输出缓冲区。为了理解IOCTL请求,我们先来看看WIN32 API DeviceIoControl函数的原型。 BOOL DeviceIoControl ( HANDLE hDevice, // 设备句柄 DWORD dwIoControlCode, // IOCTL请求操作代码 LPVOID lpInBuffer, // 输入缓冲区地址 DWORD nInBufferSize, // 输入缓冲区大小 LPVOID lpOutBuffer, // 输出缓冲区地址 DWORD nOutBufferSize, // 输出缓冲区大小 LPDWORD lpBytesReturned, // 存放返回字节数的指针

USB驱动程序的编写采用WDM驱动程序

U S B驱动程序的编写采用W D M驱动程序 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

USB驱动程序的编写采用WDM 驱动程序。WDM 驱动程序是一些例程的集合,它们被动地存在,等待主机系 统软件(PnP 管理器、I/O 管理器、电源管理器等)来调用或激活它们。具体驱动程序不同,其所包含 的例程也不同。一个WDM 驱动程序的基本组成包括以下5个例程:(1)驱动程序入口例程:处理驱动程序的初始化。 (2)即插即用例程:处理PnP 设备的添加、删除和停止。 (3)分发例程:处理用户应用程序发出的各种 I/O 请求。 (4)电源管理例程:处理电源管理请求。 (5)卸载例程:处理驱动程序的卸载。 包含文件: , , , , , makefile,sources) 在文件中,包含了上述五个例程: 中定义了各种数据结构还有各种IOCTL控制码,用于不同数据的读写。

中实现了各种驱动例程。包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动 程序入口例程得出一些信息。 驱动程序入口例程: NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS ntStatus = STATUS_SUCCESS; PDEVICE_OBJECT deviceObject = NULL; DriverObject->MajorFunction[IRP_MJ_CREATE] = Ezusb_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ezusb_Close; ources. If you want to add a new source # file to this

USB驱动开发

第17章USB设备驱动 USB设备驱动和PCI设备驱动是PC中最主要的两种设备驱动程序。与PCI协议相比,USB协议更复杂,涉及面较多。本章将介绍USB设备驱动开发。首先介绍USB协议,使读者对USB协议有个整体认识。然后介绍USB设备在WDM中的开发框架。由于操作系统的USB总线驱动程序提供了丰富的功能调用,因此开发USB驱动开发变得相对简单,只需要调用USB总线驱动接口。 17.1 USB总线协议 USB总线协议比PCI协议复杂的多,涉及USB物理层协议,又涉及USB传输层协议等。对于USB驱动程序开发者来说,不需要对USB协议的每个细节都很清楚。本节概要地介绍USB总线协议,并对驱动开发者需要了解的地方进行详细介绍。 17.1.1 USB设备简介 USB即通用串行总线(Universal Serial Bus),是一种支持即插即用的新型串行接口。也有人称之为“菊链(daisy-chaining)”,是因为在一条“线缆”上有链接127 个设备的能力。USB要比标准串行口快得多,其数据传输率可达每秒4Mb~12Mb(而老式的串行口最多是每秒115Kb)。除了具有较高的传输率外,它还能给外围设备提供支持。 需要注意的是,这不是一种新的总线标准,而是计算机系统连接外围设备(如键盘、鼠标、打印机等)的输入/输出接口标准。到现在为止,计算机系统连接外围设备的接口还没有统一的标准,例如,键盘的插口是圆的、连接打印机要用9针或25针的并行接口、鼠标则要用9针或25针的串行接口。USB能把这些不同的接口统一起来,仅用一个4针插头作为标准插头,如图17-1所示。通过这个标准插头,采用菊花链形式可以把所有的外设连接起来,并且不会损失带宽。USB正在取代当前PC上的串口和并口。

如何写驱动程序

我这里重点的介绍如何写驱动程序,对于一些应用程序我就不做介绍了,因为我对于那些高层的东西写得很少。倘若再讲,有班门弄斧之嫌,呵呵! 作为WIN98和WIN2K推荐的一项新技术来说,USB的驱动程序和以往的直接跟硬件打交道的WIN95的VXD的方式的驱动程序不同,它应该是WDM类型的。 USB的WDM接口框图如下(这个图可以说是USB软件总体框图) 对于HID的设备,就可以采用上图左上边的结构,其它类的话采用右上的结构,其实右边的结构可以又细分成两层,一层是Class Driver,一层是Miniport Driver。而倒数第三行的UHCD和OpenHCI分别是由INTEL和COMPAQ两位老大定的一个和硬件有关的底层驱动程序标准,各位可以根据所需要的选择。 对于USB的驱动程序,大家还得去了解WDM驱动程序的写法,或者早些时候的NT驱动程序,其实WDM驱动程序可以看做是NT驱动程序的一个update,只是增加了一些新的特性。 “写驱动程序是一个很漫长和繁琐的工作,在此之前,你最好要熟悉硬件,熟悉C/C++,还要用过DDK,会用一些调试程序,如SOFTICE和WINDBG之类。如果一切就绪,你就可以开始写驱动程序,工作的进程有时侯会取决于你的运气”。(这是一位留美的朋友对我说的,我写出来和大家共享) 下面是我从一个朋友那里得到的一篇文章的摘要: NT驱动程序的分层结构 驱动程序是指管理某个外围设备的一段程序代码。NT采用更灵活的分层驱动方法,允许杂应用程序和硬件之间存在几个驱动程序层次。分层机制允许NT更加广泛地定义驱动程序,包括文件系统、逻辑卷管理器和各种网络组件,各种物理设备驱动程序等等。 1、设备驱动程序 这些是管理实际数据传输和控制特定类型的物理设备的操作的驱动程序,包括开始和完成I/O操作,处理中断和执行特定的设备要求的任何差错处理。

(完整版)AT89C51单片机USB接口驱动和应用程序的开发毕业论文

北方民族大学 学士学位论文论文题目:AT89C51单片机USB接口驱动和应用程序的开发 院(部)名称:电信学院 学生姓名:杨闯 指导教师姓名:周春艳 论文提交时间: 2010年5月24日 论文答辩时间:2010年5月29日 学位授予时间:

北方民族大学教务摘要 通用串行总线USB是一种新兴的并逐渐取代其他接口标准的数据通信标准。USB,由于速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。 本论文以基于USB总线的数据采集系统的研制过程为主要内容,阐述了利用CH372与ATMEL的AT89C51等组成的一套数据采集系统的设计方案、开发方法和开发过程,并给出了具体实现方案。 论文首先简要介绍了USB总线的相关内容,然后介绍了数据采集系统的设计。数据采集系统的设计包括硬件设计、固件程序开发、驱动程序开发和应用程序开发四部分。在硬件设计部分,首先介绍了设计中所用的CH372的性能和特点,然后给出了具体硬件设计方案,并对设计中应该注意的问题进行了说明。驱动和应用程序主要完成USB设备的读写和即插即用功能,并提供一个友好的人机界面,对数据采集系统进行控制并显示采集后的数据。 本论文已完成了基于USB总线的数据采集系统的设计,用其实现了基本的数据采集功能。使用USB总线传输数据,为数据采集系统与计算机之间的通讯开辟了新的道路。 关键词:USB、驱动程序、应用程序、AT89C51、CH372

Abstract Universal serial bus USB is one kind of emerging and replace other interface standards of data communication standards. USB, due to fast, convenient and flexible easy to expand, to support plug and play, low cost advantages, such as widely application. The paper is mainly concerned with design process of data acquisition system that is based on USB bus. The design scheme, developing method and developing process of a suit of data acquisition system used with CH372 and ATMEL’s AT89C51 are expatiate. In addition, the paper also gives the material realization scheme. At fist, the paper introduces the protocol of USB bus in brief, and then discusses the design of data acquisition system, which includes four parts, , firmware design, device driver and application program. In the in detail; the questions which should be paid attention to in design is explained. Drivers and applications of the main equipment and USB plug and play function, and provide a friendly -machine interface, control of

编写USB驱动程序步骤

编写USB驱动程序步骤: 1所有usb驱动都必须创建主要结构体struct usb_driver struct usb_driver ->struct module *owner (有他可正确对该驱动程序引用计数,应为THIS_MODULE) ->const char *name (驱动名字,运行时可在查看 /sys/bus/usb/drivers/) ->const struct usb_device_id *id_table (包含该驱动可支持的所有不同类型的驱动设备,没添探测回调函数不会被调用) ->int (*probe)(struct usb_interface *intf,const struct usb_device_id *id) (usb驱动探测函数,确认后struct usb_interface 应恰当初始化,然后返0,如果出错则返负值) ->void(*disconnect)(struct usb_interface *intf) (当struct usb_interface 被从系统中移除或驱动正从usb核心中卸载时,usb核心将调用此函数)代码实例: static struct usb_driver skel_driver={ .owner = THIS_MODULE, .name = "skeleton", .id_table = skel_table, .probe = skel_probe, .disconnect = skel_disconnect, }; ↓ 2usb_register()注册将struct usb_driver 注册到usb核心,传统是在usb驱动程序模块初始化代码中完成该工作的

最新单片机USB接口驱动和应用程序的开发

单片机U S B接口驱动和应用程序的开发

北方民族大学 学士学位论文 论文题目:AT89C51单片机USB接口驱动和应用程序的开 发 院(部)名称:电信学院 学生姓名:杨闯 专业:测控技术与仪器学号:20060249 指导教师姓名:周春艳 论文提交时间: 2010年5月24日 论文答辩时间:2010年5月29日 学位授予时间: 北方民族大学教务摘要 通用串行总线USB是一种新兴的并逐渐取代其他接口标准的数据通信标准。USB,由于速度快,使用方便灵活,易于扩展,支持即插即用,成本低廉等一系列优点,得到了广泛的应用。

本论文以基于USB总线的数据采集系统的研制过程为主要内容,阐述了利用CH372与ATMEL的AT89C51等组成的一套数据采集系统的设计方案、开发方法和开发过程,并给出了具体实现方案。 论文首先简要介绍了USB总线的相关内容,然后介绍了数据采集系统的设计。数据采集系统的设计包括硬件设计、固件程序开发、驱动程序开发和应用程序开发四部分。在硬件设计部分,首先介绍了设计中所用的CH372的性能和特点,然后给出了具体硬件设计方案,并对设计中应该注意的问题进行了说明。驱动和应用程序主要完成USB设备的读写和即插即用功能,并提供一个友好的人机界面,对数据采集系统进行控制并显示采集后的数据。 本论文已完成了基于USB总线的数据采集系统的设计,用其实现了基本的数据采集功能。使用USB总线传输数据,为数据采集系统与计算机之间的通讯开辟了新的道路。 关键词:USB、驱动程序、应用程序、AT89C51、CH372 Abstract Universal serial bus USB is one kind of emerging and replace other interface standards of data communication standards. USB, due to fast, convenient and flexible easy to expand, to support plug and play, low cost advantages, such as widely

USB驱动开发——USB描述符

USB驱动开发——USB描述符 观察USB设备 1.usbview 图1 通用串行总线控制器 usbview 在C:\WINDDK\2600\src\wdm\usb\usbview\objchk\i386文件夹下,如图2所示的usbview.exe文件。

图2 usbview目录 图3 usbview观察USB外接设备 如图3所示,可以看出端口8(port8),以及图形右边关于插入U盘的描述信息。

2.bus hound 使用指南 bus hound 5.0使用方法如下: 1.请下载安装bus hound 5.0全功能版:https://www.sodocs.net/doc/eb14817423.html,/down/view.asp?id=28 2.安装完毕后请一定要重启,否则软件不能工作; 3.进行USB监控的主要步骤如下: (1)启动软件,将USB设备插入USB口; (2)在DEVICE内选择设备,例如我的设备是一个U盘,则设备为USB DEVICE,选中该设备,可以在下面的PROPERTIES看到设备的总线类型,设备的电源以及各个端点的功能,在该设备下面还有两个分支:USB AUDIO DEVICE 和 "USB人体学输入设备"(这就是本设备占用的两个接口),一样在PROPERTIES里面可以看到他们的类代码为0x01和0x03。 (3)在看完基本信息后,将上述的某个接口,或者全部打勾。 (4)切换到"SETTING"选项卡,将MAX PHASE设置为512,这样你就可以看到完全的DESCRIPTOR 和其他的数据了。 (5)在"PHASE TO CAPTURE"里面的几个和USB相关的选项如下: CDB:命令描述符块; CTL:USB控制传输; DI/D数据输入/输出; LEN:数据长度; INSOC:同步传输; RSET:总线复位; URB:USB请求块; USTS:USB状态。 查看USB数据传输就把它们都打勾就行了; (6)在"Coloumn to display"里面,把里面的全部打勾。注意,这样要把窗体最大化才可以看见全部数据。 (7)在"CAPTURE"选项卡里面可以看捕捉的数据了,在文本框输入文字,再点旁边的箭头,可以查询。按STOP,再按START可以清屏。 (8)举个例子,接上设备,在文本框输入GET DESCRIPTOR(大小写无所谓),点箭头,可以找到你的DESCRIPTOR,但是值得注意的是这个DESCRIPTOR主要是CONFIG,如果是设备描述符会有专门的说明GET DEVICE DESCRIPTOR;这个软件好像不会捕捉STRING DESCRIPTOR。设备返回的信息在DI里面。

USB设备驱动程序的开发与USB协议

第1章绪论 1.1USB简介 USB是由世界著名计算机和通信公司等共同推出的新一代接口标准,全称为Universal Serial Bus(通用串行总线)[1],是一种快速、灵活的总线接口。它是为了解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信标准。USB应用十分广泛,并具有下述优点: 1、适用于多种外设,使它不需要为不同的外设准备不同的接口和协议; 2、Windows能自动检测到USB设备的热插拔,并自动配置; 3、PC机上的接口线非常紧缺,而USB设备并不需要用户设置端口故无论从用户使用方便性,或从对资源的占用方面看,USB都很优秀; 4、当接入一个USB设备时,全速USB接口可达12Mbit/s。考虑到状态、控制和出错信息,最大理论速度仍可达到9.6Mbit/s,这是其他串行接口协议所不能比拟的,且USB也支持1.5Mbit/s的低速传输。

5、USB接口芯片价格低廉,这也大大促进USB设备的开发与应用。 在USB出现之前,计算机典型接口有并行口、串行口、鼠标口、键盘口、显示器口,及各种卡式接口等,与这些接口对应的有各种不同的电缆,在传输速度方面,这些接口都存在速度偏低的问题。在技术方面,这种设计容易产生I/O冲突,中断不够用,以及对于每一种新的外设都必须设计新的接口卡等缺点。当今的计算机外部设备,都在追求高速度和高通用性。USB接口适应了这种要求,并以其速度快、使用方便、成本低等优点,迅速得到了众多PC厂商和半导体厂商的大力支持,外设向USB过度成为必然趋势。 1.2USB驱动程序的意义 如果PC主机不知道如何与USB外设通信,那么这个USB外设一点用处都没有,人机接口设备(HID)[2]类是Windows完全支持的USB设备类型中的一种,应用程序可以使用操作系统内设置的驱动与HID通信,但与HID 通信不像打开一个端口,设定几个参数,然后就可以读写数据那么简单,在应用程序能与HID交换数据之前,它先要找到设备,获取有关它的报告信息。为做到这些,应用程序必须通过访问通信API函数,使位于上层的应用程序与位于下层的设备驱动程序进行数据交换。应用程序可以使用任何能访问API函数的程序语言,VC++是一种能访问API函数的功能强大的语言,因此,我们应用Visual C++6.0环境下编写与USB设备通信的Windows程序。 1.3VC++软件的介绍 应用基于MFC AppWizard的应用程序。MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C++提供了相应的工具来完成这个工作:

开发usb驱动程序的方法

开发驱动程序的方法(连载一) 开始驱动程序设计 下面的文字是从的帮助中节选出来的,它让我们明白在开始设计驱动程序应该注意些什么问题,这些都是具有普遍意义的开发准则。应该支持哪些请求在开始写任何代码之前,应该首先确定我们的驱动程序应该处理哪些例程。 如果你在设计一个设备驱动程序,你应该支持和其他相同类型设备的驱动程序相同的和请求代码。 如果你是在设计一个中间层驱动程序,应该首先确认你下层驱动程序所管理的设备,因为一个高层的驱动程序必须具有低层驱动程序绝大多数例程入口。高层驱动程序在接到请求时,在确定自身当前堆栈单元参数有效的前提下,设置好中下一个低层驱动程序的堆栈单元,然后再调用将请求传递给下层驱动程序处理。 一旦决定好了你的驱动程序应该处理哪些,就可以开始确定驱动程序应该有多少个例程。当然也可以考虑把某些处理的例程合并为同一例程处理。例如在和里,对和处理的例程就是同一函数。对和处理的例程也是同一个函数。 应该有多少个对象? 一个驱动程序必须为它所管理的每个可能成为请求的目标的物理和逻辑设备创建一个命名对象。一些低层的驱动程序还可能要创建一些不确定数目的对象。例如一个硬盘驱动程序必须为每一个物理硬盘创建一个对象,同时还必须为每个物理磁盘上的每个逻辑分区创建一个对象。 一个高层驱动驱动程序必须为它所代表的虚拟设备创建一个对象,这样更高层的驱动程序才能连接它们的对象到这个驱动程序的对象。另外,一个高层驱动程序通常为它低层驱动程序所创建的对象创建一系列的虚拟或逻辑对象。 尽管你可以分阶段来设计你的驱动程序,因此一个处在开发阶段的驱动程序不必一开始就创建出所有它将要处理的所有对象。但从一开始就确定好你最终要创建的所有对象将有助于设计者所要解决的任何同步问题。另外,确定所要创建的对象还有助于你定义对象的的内容和数据结构。 开始驱动程序开发 驱动程序的开发是一个从粗到细逐步求精的过程。的\ 目录下有一个庞大的样板代码,几乎覆盖了所有类型的设备驱动程序、高层驱动程序和过滤器驱动程序。在开始开发你的驱动程序之前,你应该在这个样板库下面寻找是否有和你所要开发的类似类型的例程。例如我们所开发的驱动程序,虽然对描述得不是很详细,我们还是可以在\\目录发现很多和设备有关的驱动程序。下面我们来看开发驱动程序的基本步骤。 最简的驱动程序框架 、写一个例程,在里面调用创建一个对象。 、写一个处理请求的例程的基本框架 (参见 4.4.3描述的一个例程所要完成的最基本工作。当然写了例程后,要在例程为初始化例程入口)。如果驱动程序创建了多于一个对象,则必须为请求写一个例程,该例程通常情况下可以和共用一个例程,参见参见。 、编译连接你的驱动程序。 用下面的方法来测试你的驱动程序。 首先按上面介绍的方法安装好驱动程序。 其次我们还得为逻辑设备名称和目标对象名称之间建立起符号连接,我们在前面已经知道对象名称对用户模式是不可见的,是不能直接通过来访问的,只能访问逻辑设备名称。我们可以通过修改注册表来建立这两种名称之间的符号连接。运行在\\ \ \\ \ 下建立起符号连接(这种符号连接也可以在驱动程序里调用函数来创建)。

通用串行总线USB的驱动程序设计

文章编号:1009-8119(2005)04-0040-03 基于WDM的USB驱动程序设计 赵娟1 仲顺安1 郭磊2 (1.北京理工大学信息科学技术学院,北京 100081 2.石家庄陆军参谋指挥学院教育技术专业,石家庄 050064) 摘要简单介绍了USB的特性。为了介绍USB驱动,重点阐述了WDM驱动程序的原理和Windows系统内核管理机制和应用程序的区别。并给出了利用Driverstudio的C++语言编写的例程。 关键词 USB设备,WDM,操作系统,驱动程序 The Implementation of the USB Driver Based on WDM Zhao Juan Zhong Shun'an Guo Lei Abstrct The attribute of the USB is descripted in the paper. For developing usb driver, the mechanism of kenerl management and the privilege level of applications in window2000 are introduced in the paper. An example of the driver handling USB transfer programmed by using C++ with the help of the driverstudio is given. Keyword USB device,WDM,OS,Driver 1 引言 USB,全称是Universal Serial Bus(通用串行总线),它是由Compaq、Microsoft、Intel、IBM等七家公司共同开发的,旨在解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信的标准,自1995年在Comdex上亮相以来已广泛地为各PC厂家支持。现在市场上几乎所有的PC机器都配备了USB接口,其优点是: ? 速度快。USB有高速和低速两种方式,主模式为高速模式,速率为12Mbps;另外,为了适应一些不需要很大吞吐量和很高实时性的设备,如鼠标等,USB还提供低速方式,速率为1.5Mbps。 ? 设备安装和配置容易。安装USB设备不必再打开机箱,加减己安装过的设备完全不用关闭计算机。所有USB设备支持热插拔,系统对其进行自动配置,彻底抛弃了过去的跳线和拨码开关设置。 ? 易于扩展。通过使用Hub扩展可连接多达127个外设。标准USB电缆长度为3m(5m 低速)。通过Hub或中继器可以使外设距离达到30m。 ? 能够采用总线供电。USB总线提供最大达5V电压和500mA电流。 ? 使用灵活。USB共有4种传输模式:控制传输(control)、同步传输(synchronization)、中断传输(interrupt)、批量传输(bulk),以适应不同设备的需要。 2 WDM驱动程序的介绍 WDM(Windows Driver Model)是微软提出的一种全新的设备驱动程序模型。它是在Windows NT内核驱动程序模型(Kernel_model Driver Mode)的基础上发展起来的,增加了对即插即用(PnP)、高级电源管理(Power Management)、Windows管理接口(WMI)的支持。更重要的是,WDM是一种通用的驱动模式,提供了包括USB、IEEE1394和HID等在内的一系列驱动程序类。在 Windows 98和 Windows 2000中, WDM驱动程序均可正常使用。 在大多数操作系统中,应用程序和操作系统本身是分开的:操作系统代码运行在特权处理器模式(也称核心态),并有权访问系统数据和硬件;应用程序运行在非特权处理器模式(也称用户态)。当用户态程序调用系统服务时,处理器捕获该调用,然后把调用的线程切换到核

(简易USB驱动)开发指导

实验七(2)设备驱动开发指导 块设备种类多,使用广泛,其驱动程序的开发也比字符设备复杂。通过本实验,大家要开发一个实际块设备(U盘)的驱动程序,将能够更深入地掌握块设备驱动程序的开发方法。Linux下已经有一个通用的U盘驱动程序usb-storage.o,其源程序放在目录drivers\usb\storage下(相对于内核源码根目录)。但这个驱动的实现相当复杂,本实验希望开发一个相对简单些的U盘驱动程序,不求高性能,只求结构明朗、清晰易懂,主要是让大家掌握一个实际块设备的驱动方式,从而加深理解。 事实上,本实验开发的驱动程序应该能够适用于所有基于Bulkonly传输协议的USB大容量存储设备(USB Mass Storage),比如USB移动硬盘和USB外置光驱,USB闪存盘(U 盘)只是其中的一种。由于USB大容量存储设备具有容量大、速度快、连接灵活、即插即用、总线供电等优点,它们得到了广泛使用,掌握这类设备驱动程序的开发技术无疑具有很强的实用性。 实验内容 编写一个U盘驱动程序myudisk,只要求能够驱动某个型号的U盘,能够支持U盘的常规操作,如命令hexdump、mke2fs和mount等。同时,要求在系统内核日志中显示出U盘的容量。若有余力,可增加多分区支持功能。 实验基础和思路 在教材中P130,讲解了如何编写一个Ramdisk块设备驱动程序(sbull.c),称为radimo;在文献《Linux Device Drivers》讲解了如何编写一个USB设备驱动程序,并以Linux源代码中的usb-skeleton.c为例。虽然前者驱动的并不是一个实际的块设备,且后者又只是针对usb字符设备,但是它们提供了一个不错的基础,通过合并我们就能基本得到一个支持usb块设备的驱动程序。之所以说基本得到,是因为合并后只是有了块设备、USB设备的驱动支持框架,但还缺一样:对U盘(USB块设备)的实际访问操作。USB块设备的访问方法与USB字符设备区别很大,有一套复杂的协议。把这样一套协议研究清楚,将花费大量时间,也远离了我们驱动程序开发的核心。这是一大难点,为此我们专门编写了一个U盘访问函数(myudisk_Bulk_transport),以减轻工作量。下一节将对该函数的使用方法和工作过程进行专门讲解。 简言之,合并radimo和usb-skeleton这两个参考驱动程序,以构造整体框架,调用帮助函数myudisk_Bulk_transport以访问U盘,从而打造一个简洁的U盘驱动程序。本节接下来介绍这两个参考驱动程序:radimo和usb-skeleton,着重讲解其工作原理及合并关键环节。 参考驱动程序一:块设备驱动程序sbull 请参看教材P130

USB驱动程序编写

USB驱动程序编写 linux下usb驱动编写(内核2.4)——2.6与此接口有区别2006-09-15 14:57我们知道了在Linux下如何去使用一些最常见的USB设备。但对于做系统设计的程序员来说,这是远远不够的,我们还需要具有驱动程序的阅读、修改和开发能力。在此下篇中,就是要通过简单的USB驱动的例子,随您一起进入USB驱动开发的世界。 USB骨架程序(usb-skeleton),是USB驱动程序的基础,通过对它源码的学习和理解,可以使我们迅速地了解USB驱动架构,迅速地开发我们自己的USB硬件的驱动。 USB驱动开发 在掌握了USB设备的配置后,对于程序员,我们就可以尝试进行一些简单的USB驱动的修改和开发了。这一段落,我们会讲解一个最基础USB框架的基础上,做两个小的USB 驱动的例子。 USB骨架 在Linux kernel源码目录中driver/usb/usb-skeleton.c为我们提供了一个最基础的USB驱动程序。我们称为USB骨架。通过它我们仅需要修改极少的部分,就可以完成一个USB 设备的驱动。我们的USB驱动开发也是从她开始的。 那些linux下不支持的USB设备几乎都是生产厂商特定的产品。如果生产厂商在他们的产品中使用自己定义的协议,他们就需要为此设备创建特定的驱动程序。当然我们知道,有些生产厂商公开他们的USB协议,并帮助Linux驱动程序的开发,然而有些生产厂商却根本不公开他们的USB协议。因为每一个不同的协议都会产生一个新的驱动程序,所以就有了这个通用的USB驱动骨架程序,它是以pci 骨架为模板的。 如果你准备写一个linux驱动程序,首先要熟悉USB协议规范。USB主页上有它的帮助。一些比较典型的驱动可以在上面发现,同时还介绍了USB urbs的概念,而这个是usb驱动程序中最基本的。 Linux USB 驱动程序需要做的第一件事情就是在Linux USB 子系统里注册,并提供一些相关信息,例如这个驱动程序支持那种设备,当被支持的设备从系统插入或拔出时,会有哪些动作。所有这些信息都传送到USB 子系统中,在usb骨架驱动程序中是这样来表示的:

studio10分钟完成一个USB驱动程序

10分钟完成一个USB驱动程序 (Rayyang2000倾情奉献) 很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的。但是,现在也有不少人都开始借助一些辅助工具。笔者去年开始接触到driverStudio,发现它真的是一个不错的开发工具,不仅写代码的时候思路清晰,而且和DDK的结合很好。 当然,也有很多人觉得用DriverStudio不够正宗,或者说不能很好的理解Windows Device Driver的架构。我感觉这就有点像MFC和SDK的关系,关于这个问题在很多地方都有争论,比如在万千新闻组上,就讨论了将近2个月。每个人都有自己的最爱,都有自己的习惯,只要你能把事情做好,我想用什么方法应该都是一样的。如果你已经习惯了用DDK开发,那完全还可以继续用下去;如果你觉得DriverStudio不错,那尝试用一个可以给你按照OOP概念来编程的工具有什么不好呢? 在驱动开发网上,经常看到有人询问一些关于DriverStudio的使用的问题。我正好很有幸用它作了几个驱动程序,包括VXD, KMD和WDM,稍微有点心得,因此想写下来给大家作一个小小的参考。如果其中有错误,欢迎大家给我指出,谢谢。 下面我就介绍一下用DriverStudio开发一个USB驱动程序的过程。这个USB设备有3个双向端点,每个端点的配置如下: EP 类型地址 buffer(Bytes) 0 IN/OUT Control 0x80/0x00 16/16 1 IN/OUT Bulk 0x81/0x01 16/16 2 IN/OUT Bulk 0x82/0x02 64/64 我们的驱动程序需要实现的功能就是控制设备上的LED灯的亮和灭,以及通过Endpoint 2对设备进行读写。由于DriveStudio由几个部分组成,我们写这个驱动程序只要用到DriverWorks,因此下面我们就简称它为DW。在这里,我们假定读者已经正确的安装了DW,并且已经编译好了各个库文件。 1. 首先,我们通过快捷方式“Setup DDK and Start MSVC“来启动VC IDE。这个快捷方式所指向的程序,会进行一些必要的设置,然后再启动VC IDE,这样我们的程序就可以使用DDK和DW的头文件和库了。 2. 从VC IDE的菜单"DriverStudio"中选择"DriverWizard", 在如图1所示的对话框中, 写上项目名称. 在这里, 我们将这个项目称为: TEST, 所在的目录为D:\TEST. 然后点按钮"Next >".

相关主题