通过USB驱动libusb介绍和使用示例

通过USB驱动libusb介绍和使用示例
通过USB驱动libusb介绍和使用示例

小知识:sudo insmod /lib/modules/2.6.22-14-generic/kernel/drivers/usb/serial/usbserial.ko vendor=0x8086 product=0xd001同时插上ttyUSB0和ttyUSB1(ch341),obm能将dkb下载下去,不过自动重起之后,就不能下载接下来的东西了,所以应该,需要close(ttyUSB0_handle);然后进行接下来的下载,分别调用两次不过应该自动关闭了,所以可能还是不能同时插上ttyUSB0和ttyUSB1lsusb 显示usb设备的vendor和product比如:b074@gliethttp:~$ lsusb Bus 002 Device 001: ID 0000:0000 Bus 001 Device 116: ID 8086:d001 Intel Corp. Bus 001 Device 003: ID 413c:2105 Dell Computer Corp. Bus 001 Device 002: ID 0461:4d15 Primax Electronics, Ltd Bus 001 Device 001: ID 0000:0000其中Bus 001 Device 116: ID 8086:d001 Intel Corp. 就是vendor=0x8086和product=0xd001能使用dmesg来查看具体的是ttyUSB0还是ttyUSB1了pidof hello.exepidof bash显示进程的pid值

波特率:

#define B0 0000000 /* hang up */

#define B50 0000001

#define B75 0000002

#define B110 0000003

#define B134 0000004

#define B150 0000005

#define B200 0000006

#define B300 0000007

#define B600 0000010

#define B1200 0000011

#define B1800 0000012

#define B2400 0000013

#define B4800 0000014

#define B9600 0000015

#define B19200 0000016

#define B38400 0000017

#define EXTA B19200

#define EXTB B38400

#define CSIZE 0000060

#define CS5 0000000

#define CS6 0000020

#define CS7 0000040

#define CS8 0000060

#define CSTOPB 0000100

#define CREAD 0000200

#define PARENB 0000400

#define PARODD 0001000

#define HUPCL 0002000

#define CLOCAL 0004000

#define CBAUDEX 0010000

#define BOTHER 0010000

#define B57600 0010001

#define B115200 0010002

#define B230400 0010003

#define B460800 0010004 //有些CDMA使用该波特率

#define B500000 0010005

#define B576000 0010006

#define B921600 0010007

#define B1000000 0010010

#define B1152000 0010011

#define B1500000 0010012

#define B2000000 0010013

#define B2500000 0010014

#define B3000000 0010015

#define B3500000 0010016

#define B4000000 0010017

Developing Linux Device Drivers using Libusb API

Written by vikram_cvk - 2004-07-16 18:05

Introduction

We often come across a situation where a USB device which runs perfectly on 视窗系统platform does not even get detected on Linux. Lack of support for USB devices is one of the reason why some people don’t embrace Linux. Now there is a new API by name Libusb which helps the developers to develop USB device drivers on the fly!

What is Libusb

Libusb is a high-level language API which conceals low-level kernel interactions with the USB modules. It provides a set of function which

are adequate to develop a device driver for a USB device from the Userspace.

Libusb is not complex

For any wannabe Linux

Kernel programmers developing device driver as a Kernel module is a herculean task. Developing kernel modules requires fair degree of proficiency in ’C’ language and also good idea of kernel subsystems,

data structures etc. All these are enough to put-off a developer from venturing into Device Driver programming.Libusb has been designed to address this shortcoming. Simplified interface allows developers to develop USB drivers from the userspace . Libusb library functions provide high level abstraction to the Kernel structures and allows the developers to have access to these structures through the

USBFS(USBfilesystem).

Its Cross-platform

Beauty of

Libusb lies in its cross platform functionality. Driver written for one platform could be easily ported onto another platform with little or no

changes, currently following operating systems are supported by Libusb.

Linux

FreeBSD

Darwin

OS X

This HOWTO focuses on how Libusb can be used on Linux platform. For information about other platforms goto

http://https://www.360docs.net/doc/06452496.html,/.

LIBUSB ON LINUX

Linux is the most popular platform for the Libusb API,the reason being growing popularity of Linux as a stable OS. On Linux Libusb makes of the USBFS file system. by default USBFS is automatically mounted when the system is booted.

What is USBFS

USBFS is a

filesystem specifically designed for USB devices, by default this filesystem gets mounted when the system is booted and it can be found at /proc/bus/usb/. This filesystem consists of information about all

the USB devices that are connected to the computer.Libusb makes use of this filesystem to interact with the USB devices.

Following C

program can be a stepping stone into the world of Libusb.This program can be used to gather all the technical/hardware details of a USB

device connected to the computer ,ensure that some USB device is connected into the USB port.

Details like Vendor-Id ,

Product-Id ,Endpoint addresses of a USB device is of paramount importance for a device driver developer.

/* testlibusb.c */

#include

#include

void print_endpoint(struct usb_endpoint_descriptor *endpoint)

{

printf(" bEndpointAddress: %02xh\n", endpoint->bEndpointAddress); printf(" bmAttributes: %02xh\n", endpoint->bmAttributes);

printf(" wMaxPacketSize: %d\n", endpoint->wMaxPacketSize);

printf(" bInterval: %d\n", endpoint->bInterval);

printf(" bRefresh: %d\n", endpoint->bRefresh);

printf(" bSynchAddress: %d\n", endpoint->bSynchAddress);

}

void print_altsetting(struct usb_interface_descriptor *interface)

{

int i;

printf(" bInterfaceNumber: %d\n", interface->bInterfaceNumber);

printf(" bAlternateSetting: %d\n", interface->bAlternateSetting);

printf(" bNumEndpoints: %d\n", interface->bNumEndpoints);

printf(" bInterfaceClass: %d\n", interface->bInterfaceClass);

printf(" bInterfaceSubClass: %d\n", interface->bInterfaceSubClass); printf(" bInterfaceProtocol: %d\n", interface->bInterfaceProtocol);

printf(" iInterface: %d\n", interface->iInterface);

for (i = 0; i bNumEndpoints; i++)

print_endpoint(&interface->endpoint);

}

void print_interface(struct usb_interface *interface)

{

int i;

for (i = 0; i num_altsetting; i++)

print_altsetting(&interface->altsetting);

}

void print_configuration(struct usb_config_descriptor *config)

{

int i;

printf(" wTotalLength: %d\n", config->wTotalLength);

printf(" bNumInterfaces: %d\n", config->bNumInterfaces);

printf(" bConfigurationValue: %d\n", config->bConfigurationValue); printf(" iConfiguration: %d\n", config->iConfiguration);

printf(" bmAttributes: %02xh\n", config->bmAttributes);

printf(" MaxPower: %d\n", config->MaxPower);

for (i = 0; i bNumInterfaces; i++)

print_interface(&config->interface);

}

int main(void)

{

struct usb_bus *bus;

struct usb_device *dev;

usb_init();

usb_find_busses();

usb_find_devices();

printf("bus/device idVendor/idProduct\n");

for (bus = usb_busses; bus; bus = bus->next) {

for (dev = bus->devices; dev; dev = dev->next) {

int ret, i;

char string[256];

usb_dev_handle *udev;

printf("%s/%s %04X/%04X\n", bus->dirname, dev->filename,

dev->descriptor.idVendor, dev->descriptor.idProduct);

udev = usb_open(dev);

if (udev) {

if (dev->descriptor.iManufacturer) {

ret = usb_get_string_simple(udev, dev->descriptor.iManufacturer, string, sizeof(string)); if (ret > 0)

printf("- Manufacturer : %s\n", string);

else

printf("- Unable to fetch manufacturer string\n");

}

if (dev->descriptor.iProduct) {

ret = usb_get_string_simple(udev, dev->descriptor.iProduct, string, sizeof(string));

if (ret > 0)

printf("- Product : %s\n", string);

else

printf("- Unable to fetch product string\n");

}

if (dev->descriptor.iSerialNumber) {

ret = usb_get_string_simple(udev, dev->descriptor.iSerialNumber, string, sizeof(string));

if (ret > 0)

printf("- Serial Number: %s\n", string);

else

printf("- Unable to fetch serial number string\n");

}

usb_close (udev);

}

if (!dev->config) {

printf(" Couldn’t retrieve descriptors\n");

continue;

}

for (i = 0; i descriptor.bNumConfigurations; i++)

print_configuration(&dev->config);

}

}

return 0;

}

The above program should be compiled as

(root$)gcc -o usbdevice_details testlibusb.c -I/usr/local/include -L. -lnsl -lm -lc -L/usr/local/lib -lusb

(root$)./usbdevice_details (enter)

Following is the output of the above command ,its the listing of a USB pen drive connected to my system.

The first line displays the bus-name/device-name & device-id/product-id and rest of the listing is self-descriptive.

001/004 0EA0/2168

- Manufacturer : USB

- Product : Flash Disk

- Serial Number: 4CE45C4E403EE53D

wTotalLength: 39

bNumInterfaces: 1

bConfigurationValue: 1

iConfiguration: 0

bmAttributes: 80h

MaxPower: 100

bInterfaceNumber: 0

bAlternateSetting: 0

bNumEndpoints: 3

bInterfaceClass: 8

bInterfaceSubClass: 6

bInterfaceProtocol: 80

iInterface: 0

bEndpointAddress: 81h

bmAttributes: 02h

wMaxPacketSize: 64

bInterval: 0

bRefresh: 0

bSynchAddress: 0

bEndpointAddress: 02h

bmAttributes: 02h

wMaxPacketSize: 64

bInterval: 0

bRefresh: 0

bSynchAddress: 0

bEndpointAddress: 83h

bmAttributes: 03h

wMaxPacketSize: 2

bInterval: 1

bRefresh: 0

bSynchAddress: 0

Before executing the above program download the current version of

Libusb library from, http://https://www.360docs.net/doc/06452496.html,/. The above

program can also be found under the tests directory of Libusb directory

(after u install it)

Now I will explain in brief some of the functions and attributes dealt in the above program.

usb_init() - Used to initialize Libusb and establish connection with kernel structures .

usb_find_busses() - Looks for all the USB busses on the computer.

usb_find_devices() - Looks for all the USB devices connected to the computer.

usb_open(dev) - Opens the device ’dev’ which is given as argument to this function.

usb_get_string_simple() - Used to extract the string descriptor of the device taken argument.

Important attributes of USB devices useful in device driver coding

Configuration and Endpoints are one of the two important descriptors of

any USB device. These descriptors are defined using the ?struct

usb_config_descriptor? and ?struct_usb_endpoint_descriptor?

respectively .

dev->descriptor.idVendor ? Reveals the Vendor-Id of the USB device connected to the system.

dev->descriptor.idProduct - Reveals the Product-Id of the USB device connected to the system.

dev->descriptor.iManufacturer - Reveals the name of the Manufacturer USB device connected to the system.

EndpointAddress:Combination of endpoint address and endpoint direction on a USB device.

InterfaceNumber : One of the several interfaces that is allocated to the connected USB device.

AlternateSetting:This is part of the a single interface allocated to the USB device.

Prerequisites for Libusb programming

Linux system with Kernel 2.4 above series.

Proficiency in C language.

Good understanding of USB device internals.

Idea about USBFS.

Hope this HOWTO has enlightened you about Libusb API and I expect this

HOWTO will give you a head start in your device driver programming

endeavor .This HOWTO is just an introduction to Libusb ,for complete

documentation please goto http://https://www.360docs.net/doc/06452496.html,/

About Myself

My name is Vikram C , I’m a linux freak and currently working as Linux

developer in the city of Hyderabad India.You can reach me at

vikram_147@https://www.360docs.net/doc/06452496.html, / vikram@https://www.360docs.net/doc/06452496.html,

//================================================

2008年03月19日星期三 10:31

动研发向来是内核研发中工作量最多的一块,随着USB设备的普及,大量的USB设备的驱动研发也成为驱动研发者手头上做的最多的事情。本文主要介绍

Linux平台下基于libusb的驱动研发,希望能够给从事Linux驱动研发的朋友带来些帮助,更希望能够给其他平台上的无驱设计带来些帮助。文章是

我在工作中使用libusb的一些总结,难免有错误,如有不当的地方,还请指正。

Linux 平台上的usb驱动研发,主要有内核驱动的研发和基于libusb的无驱设计。

对于内核驱动的大部分设备,诸如带usb接口的hid设备,linux本身已自带了相关的驱动,我们只要操作设备文件便能完成对设备大部分的操

作,而另外一些设备,诸如自己设计的硬件产品,这些驱动就需要我们驱动工程师研发出相关的驱动了。内核驱动有他的好处,然而内核驱动在某些情况下会遇见如

下的一些问题:

1 当使用我们产品的客户有2.4内核的平台,同时也有2.6内核的平台,我们要设计的驱动是要兼容两个平台的,就连makefile 我们都要写两个。

2

当我们要把linux移植到嵌入平台上,你会发现原先linux自带的驱动移过去还挺大的,我的内核当然是越小越好拉,这样有必要么。这还不是最郁闷的地

方,如果嵌入平台是客户的,客户要购买你的产品,你忽然发现客户设备里的系统和你的环境不相同,他没有你要的驱动了,你的程式运行不了,你会先想:“没关

系,我写个内核驱动加载一下不就行了“。却发现客户连insmod加载模块的工具都没移植,那时你就看看老天,说声我怎么那么倒霉啊,客户可不想你动他花

了n时间移植的内核哦

3

花了些功夫写了个新产品的驱动,挺有成就感啊,代码质量也是相当的有水准啊。正当你沉醉在你的代码中时,客服不断的邮件来了,“客户需要2.6.5内核的

驱动,config文件我已发你了” “客户需要双核的 2.6.18-smp 的驱动” “客户的平台是自己制定的是2.6.12-xxx “

你恨不得把驱动的原始码给客户,这样省得编译了。你的一部分工作时间编译内核,制定驱动

有问题产生必然会有想办法解决问题的人,libusb的出现给我们带来了某些方便,即节约了我们的时间,也降低了公司的成本。所以在一些情况下,就能考虑使用libusb的无驱设计了。

下面我们就来周详讨论一下libusb, 并以写一个hid设备的驱动来讲解怎么运用libusb,至于文章中涉及的usb协议的知识,限于篇幅,就不周详讲解了,相关的可自行查看usb相关协议。

一libusb 介绍

libusb 设计了一系列的外部API

为应用程式所调用,通过这些API应用程式能操作硬件,从libusb的原始码能看出,这些API 调用了内核

的底层接口,和kernel

driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得libusb的使用也比研发内核驱动相对容易的多。

Libusb 的编译安装请查看Readme,这里不做详解

二libusb 的外部接口

2.1 初始化设备接口

这些接口也能称为核心函数,他们主要用来初始化并寻找相关设备。

usb_init

函数定义:void usb_init(void);

从函数名称能看出这个函数是用来初始化相关数据的,这个函数大家只要记住必须调用就行了,而且是一开始就要调用的.

usb_find_busses

函数定义:int usb_find_busses(void);

寻找系统上的usb总线,所有usb设备都通过usb总线和计算机总线通信。进而和其他设备通信。此函数返回总线数。

usb_find_devices

函数定义:int usb_find_devices(void);

寻找总线上的usb设备,这个函数必要在调用usb_find_busses()后使用。以上的三个函数都是一开始就要用到的,此函数返回设备数量。

usb_get_busses

函数定义:struct usb_bus *usb_get_busses(void);

这个函数返回总线的列表,在高一些的版本中已用不到了,这在下面的实例中会有讲解

2.2 操作设备接口

usb_open

函数定义:usb_dev_handle *usb_open(struct *usb_device dev);

打开要使用的设备,在对硬件进行操作前必须要调用usb_open 来打开设备,这里大家看到有两个结构体usb_dev_handle 和

usb_device 是我们在研发中经常碰到的,有必要把他们的结构看一看。在libusb 中的usb.h和usbi.h中有定义。

这里我们不妨理解为返回的usb_dev_handle 指针是指向设备的句柄,而行参里输入就是需要打开的设备。

usb_close

函数定义:int usb_close(usb_dev_handle *dev);

和usb_open相对应,关闭设备,是必须调用的, 返回0成功,Libusb库的使用

使用libusb之前你的linux系统必须装有usb文件系统,这里还介绍了使用hiddev设备文件来访问设备,目的在于不仅能比较出usb的易用性,还提供了一个转化成libusb驱动的案例。

3.1 find设备

所有驱动第一步首先是寻找到要操作的设备,我们先来看看HID驱动是怎样寻找到设备的。我们假设寻找设备的函数Device_Find(注:代码只是为了方便解说,不确保代码的健全)

/* 我们简单看一下使用hid驱动寻找设备的实现,然后在看一下libusb是怎么寻找设备的*/

int Device_Find()

{

char dir_str[100]; /* 这个变量我们用来保存设备文件的目录路径*/

char hiddev[100]; /* 这个变量用来保存设备文件的全路径*/

DIR dir;

/* 申请的字符串数组清空,这个编程习惯要养成*/

memset (dir_str, 0 , sizeof(dir_str));

memset (hiddev, 0 , sizeof(hiddev));

/* hiddev 的设备描述符不在/dev/usb/hid下面,就在/dev/usb 下面

这里我们使用opendir函数来检验目录的有效性

打开目录返回的值保存在变量dir里,dir前面有声明

*/

dir=opendir("/dev/usb/hid");

if(dir){

/* 程式运行到这里,说明存在/dev/usb/hid 路径的目录*/

sprintf(dir_str,"/dev/usb/hid/");

closedir(dir);

}else{

/* 如果不存在hid目录,那么设备文件就在/dev/usb下*/

sprintf(dir_str,"/dev/usb/");

}

/* DEVICE_MINOR 是指设备数,HID一般是16个*/

for(i = 0; i

/* 获得全路径的设备文件名,一般hid设备文件名是hiddev0 到hiddev16 */

sprintf(hiddev, "%shiddev%d", dir_str,i);

/* 打开设备文件,获得文件句柄*/

fd = open(hiddev, O_RDWR);

if(fd > 0) {

/* 操作设备获得设备信息*/

ioctl(fd, HIDIOCGDEVINFO, &info);

/* VENDOR_ID 和PRODUCT_ID 是标识usb设备厂家和产品ID,驱动都需要这两个参数来寻找设备,到此我们寻找到了设备*/

if(info.vendor== VENDOR_ID && info.product== PRODUCT_ID) {

/* 这里添加设备的初始化代码*/

device_num++; /* 找到的设备数*/

}

close(fd);

}

}

return device_num; /* 返回寻找的设备数量*/

}

我们再来看libusb是怎么来寻找和初始化设备

int Device_Find()

{

struct usb_bus *busses;

int device_num = 0;

device_num = 0; /* 记录设备数量*/

usb_init(); /* 初始化*/

usb_find_busses(); /* 寻找系统上的usb总线*/

usb_find_devices(); /* 寻找usb总线上的usb设备*/

/* 获得系统总线链表的句柄*/

busses = usb_get_busses();

struct usb_bus *bus;

/* 遍历总线*/

for (bus = busses; bus; bus = bus->next) {

struct usb_device *dev;

/* 遍历总线上的设备*/

for (dev = bus->devices; dev; dev = dev->next) {

/* 寻找到相关设备,*/

if(dev->descriptor.idVendor==VENDOR_ID&& dev->descriptor.idProduct == PRODUCT_ID) { /* 这里添加设备的初始化代码*/

device_num++; /* 找到的设备数*/

}

}

}

return device_num; /* 返回设备数量*/

}

注:在新版本的libusb中,usb_get_busses就能不用了,这个函数是返回系统上的usb总线链表句柄这里我们直接用usb_busses变量,这个变量在usb.h中被定义为外部变量

所以能直接写成这样:

struct usb_bus *bus;

for (bus = usb_busses; bus; bus = bus->next) {

struct usb_device *dev;

for (dev = bus->devices; dev; dev = dev->next) {

/* 这里添加设备的初始化代码*/

}

}

3.2 打开设备

假设我们定义的打开设备的函数名是device_open,

/* 使用hid驱动打开设备*/

int Device_Open()

{

int handle;

/* 传统HID驱动调用,通过open打开设备文件就可*/

hand le = open(“hiddev0”, O_RDONLY);

}

/* 使用libusb打开驱动*/

int Device_Open()

{

/* LIBUSB 驱动打开设备,这里写的是伪代码,不确保代码有用*/

struct usb_device* udev;

usb_dev_handle* device_handle;

/* 当找到设备后,通过usb_open打开设备,这里的函数就相当open 函数*/

device_handle = usb_open(udev);

}

3.3 读写设备和操作设备

假设我们的设备使用控制传输方式,至于批处理传输和中断传输限于篇幅这里不介绍

我们这里定义三个函数,Device_Write, Device_Read, Device_Report

Device_Report 功能发送接收函数

Device_Write 功能写数据

Device_Read 功能读数据

Device_Write和Device_Read调用Device_Report发送写的信息和读的信息,研发者根据发送的命令协议来设计,我们这里只简单实现发送数据的函数。

假设我们要给设备发送72字节的数据,头8个字节是报告头,是我们定义的和设备相关的规则,后64位是数据。

HID驱动的实现(这里只是用代码来有助理解,代码是伪代码)

int Device_Report(int fd, unsigned char *buffer72)

{

int ret; /* 保存ioctl函数的返回值*/

int index;

unsigned char send_data[72]; /* 发送的数据*/

unsigned char recv_data[72]; /* 接收的数据*/

struct hiddev_usage_ref uref; /* hid驱动定义的数据包*/

struct hiddev_report_info rinfo; /* hid驱动定义的

memset(send_data, 0, sizeof(send_data));

memset(recv_data, 0, sizeof(recv_data));

memcpy(send_data, buffer72, 72);

/* 这在发送数据之前必须调用的,初始化设备*/

ret = ioctl(fd, HIDIOCINITREPORT, 0);

if( ret !=0) {

return NOT_OPENED_DEVICE;/* NOT_OPENED_DEVICE 属于自己定义宏*/

}

/* HID设备每次传输一个字节的数据包*/

for(index = 0; index

/* 设置发送数据的状态*/

uref.report_type = HID_REPORT_TYPE_FEATURE;

uref.report_id = HID_REPORT_ID_FIRST;

https://www.360docs.net/doc/06452496.html,age_index = index;

uref.field_index = 0;

uref.value = send_data[index];

ioctl(fd, HIDIOCGUCODE, &uref);

ret=ioctl(fd, HIDIOCSUSAGE, &uref);

if(ret != 0 ){

return UNKNOWN_ERROR;

}

}

/* 发送数据*/

rinfo.report_type = HID_REPORT_TYPE_FEATURE; rinfo.report_id = HID_REPORT_ID_FIRST;

rinfo.num_fields = 1;

ret=ioctl(fd, HIDIOCSREPORT, &rinfo); /* 发送数据*/ if(ret != 0) {

return WRITE_REPORT;

}

/* 接受数据*/

ret = ioctl(fd, HIDIOCINITREPORT, 0);

for(index = 0; index

uref.report_type = HID_REPORT_TYPE_FEATURE; uref.report_id = HID_REPORT_ID_FIRST;

https://www.360docs.net/doc/06452496.html,age_index = index;

uref.field_index = 0;

ioctl(fd, HIDIOCGUCODE, &uref);

ret = ioctl(fd, HIDIOCGUSAGE, &uref);

if(ret != 0 ) {

return UNKNOWN_ERROR;

}

recv_data[index] = uref.value;

}

memcpy(buffer72, recv_data, 72);

return SUCCESS;

}

libusb驱动的实现

int Device_Report(int fd, unsigned char *buffer72)

{

/* 定义设备句柄*/

usb_dev_handle* Device_handle;

/* save the data of send and receive */

unsigned char send_data[72];

unsigned char recv_data[72];

int send_len;

int recv_len;

/* 数据置空*/

memset(send_data, 0 , sizeof(send_data));

memset(recv_data, 0 , sizeof(recv_data));

/* 这里的g_list是全局的数据变量,里面能存储相关设备的所需信息,当然我们也能从函数形参中传输进来,设备的信息在打开设备时初始化,我们将在后面的总结中周详描述一下*/

Device_handle = (usb_dev_handle*)(g_list[fd].device_handle);

if (Device_handle == NULL) {

return NOT_OPENED_DEVICE;

}

/* 这个函数前面已说过,在操作设备前是必须调用的, 0是指用默认的设备*/

usb_claim_interface(Device_handle, 0);

/* 发送数据,所用到的宏定义在usb.h能找到,我列出来大家看一下

#define USB_ENDPOINT_OUT 0x00

#define USB_TYPE_CLASS (0x01

#define USB_RECIP_INTERFACE 0x01

#define HID_REPORT_SET 0x09 */

send_len = usb_control_msg(Device_handle,

USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE,

HID_REPORT_SET,

0x300,

0,

send_data, 72, USB_TIMEOUT);

/* 发送数据有错误*/

if (send_len

return WRITE_REPORT;

}

if (send_len != 72) {

return send_len;

}

/* 接受数据

#define USB_ENDPOINT_IN 0x80

#define USB_TYPE_CLASS (0x01

#define USB_RECIP_INTERFACE 0x01

#define HID_REPORT_GET 0x01

*/

recv_len = usb_control_msg(Device_handle,

USB_ENDPOINT_IN + USB_TYPE_CLASS + USB_RECIP_INTERFACE,

HID_REPORT_GET,

0x300,

0,

recv_data, 72, USB_TIMEOUT);

if (recv_len

printf("failed to retrieve report from USB device!\n");

return READ_REPORT;

}

if (recv_len != 72) {

return recv_len;

}

/* 和usb_claim_interface对应*/

usb_release_interface(RY2_handle, 0);

memcpy(buffer72, recv_data, 72);

return SUCCESS;

}

3.4 关闭设备

假设我们定义的关闭设备的函数名是Device_Close()

/* 使用hid驱动关闭设备*/

int Device_Close()

{

int handle;

handle = open(“hiddev0”, O_RDONLY);

/* 传统HID驱动调用,通过close()设备文件就可*/

close( handle );

/* 使用libusb关闭驱动*/

int Device_Close()

{

/* LIBUSB 驱动打开设备,这里写的是伪代码,不确保代码有用*/

struct usb_device* udev;

usb_dev_handle* device_handle;

device_handle = usb_open(udev);

/* libusb库使用usb_close关闭程式*/

usb_close(device_handle);

}

libusb的驱动框架

前面我们看了些主要的libusb函数的使用,这里我们把前面的内容归纳下:一般的驱动应该都包含如下接口:

Device_Find(); /* 寻找设备接口*/

Device_Open(); /* 打开设备接口*/

Device_Write(); /* 写设备接口*/

Device_Read(); /* 读设备接口*/

Device_Close(); /* 关闭设备接口*/

具体代码如下:

#include

/* usb.h这个头文件是要包括的,里面包含了必须要用到的数据结构*/

/* 我们将一个设备的属性用一个结构体来概括*/

typedef struct

{

struct usb_device* udev;

usb_dev_handle* device_handle;

/* 这里能添加设备的其他属性,这里只列出每个设备要用到的属性*/ } device_descript;

/* 用来设置传输数据的时间延迟*/

#define USB_TIMEOUT 10000

/* 厂家ID 和产品ID */

#define VENDOR_ID 0xffff

#define PRODUCT_ID 0xffff

/* 这里定义数组来保存设备的相关属性,DEVICE_MINOR能设置能够同时操作的设备数量,用全局变量的目的在于方便保存属性*/

#define DEVICE_MINOR 16

int g_num;

device_descript g_list[ DEVICE_MINOR ];

/* 我们写个设备先找到设备,并把相关信息保存在g_list 中*/

int Device_Find()

{

struct usb_bus *bus;

struct usb_device *dev;

g_num = 0;

usb_find_busses();

usb_find_devices();

/* 寻找设备*/

for (bus = usb_busses; bus; bus = bus->next) {

for (dev = bus->devices; dev; dev = dev->next) {

if(dev->descriptor.idVendor==VENDOR_ID&& dev->descriptor.idProduct == PRODUCT_ID) {

/* 保存设备信息*/

if (g_num

g_list[g_num].udev = dev;

g_num ++;

}

}

}

}

return g_num;

}

/* 找到设备后,我们根据信息打开设备*/

int Device_Open()

{

/* 根据情况打开你所需要操作的设备,这里我们仅列出伪代码*/

if(g_list[g_num].udev != NULL) {

g_list[g_num].device_handle = usb_open(g_list[g_num].udev);

}

}

/* 下面就是操作设备的函数了,我们就不列出来拉,大家能参考上面的介绍*/

int DeviceWite(int handle)

{

/* 填写相关代码,具体查看设备协议*/

}

int DeviceOpen(int handle)

{

/* 填写相关代码,具体查看设备协议*/

}

/* 最后不要忘记关闭设备*/

void Device_close(int handle)

{

/* 调用usb_close */

}

小结

到此,使用libusb进行驱动研发介绍完了,通过对库所提供的API的使用能体会到libusb的易用性。

usb驱动程序教程

编写Windows https://www.360docs.net/doc/06452496.html,的usb驱动程序教程 Windows https://www.360docs.net/doc/06452496.html, 是微软推出的功能强大的嵌入式操作系统,国内采用此操作系统的厂商已经很多了,本文就以windows https://www.360docs.net/doc/06452496.html,为例,简单介绍一下如何开发windows https://www.360docs.net/doc/06452496.html, 下的USB驱动程序。 Windows https://www.360docs.net/doc/06452496.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, // 存放返回字节数的指针

未能成功安装设备驱动程序MTPUSB设备安装失败的解决办法

未能成功安装设备驱动程序M T P U S B设备安装失败的解决办法 文件编码(GHTU-UITID-GGBKT-POIU-WUUI-8968)

M T P U S B设备安装失败未能成功安装设备驱动程序 终极解决方法 环境介绍:电脑系统win7(32位)已安装摩托罗拉手机驱动版本(其他版本应该也行,不行的话去摩托罗拉官网下载最新驱动) 手机型号:摩托罗拉defy mb525(系统) 备注:其他电脑操作系统和不同型号手机可参考此方法,找到相应设置项即可。 问题简介: 1.当我们把手机连接至电脑,把模式调制成“摩托罗拉手机门户”时,出现下列情况 2.过一会之后便会弹出提示说:未能成功安装设备驱动程序

3.单击查看详情便弹出窗口如下图所示: 4.此时桌面右下角图标出现黄色三角号,如图所示: 5.于是我们就开始不淡定了,怎么看怎么别扭、抓狂、按耐不住。下面介绍问题解决方案 解决方法: 1.我的电脑——右键单击——管理——设别管理器,之后会看到如图所示:在便携设备下有黄色三角号提示,即是我们纠结的MTP USB设备安装不成功的展示。

MIUI手机操作系统为例,其他手机操作系统需将USB绑定服务开启即可)。选择设置——系统——共享手机网络——USB绑定,将该选项设置为“开”,这是你会发现如图所示变化,在设备管理器面板中没有了便携设备选项及黄色三角号提醒,如图所示:(但桌面右下角的黄色三角警示还在)

3.在完成以上步骤后,用手机打开WIFI并登录无线WLAN,手机打开网页检验连接是否正常,若正常则如下图所示,黄色三角号警示消失,问题解决;若以上步骤没有解决问题,请先连接WIFI并登录WLAN之后,再按步骤操作。 4.完成以上步骤并解决问题后,选择电脑桌面网络——右键单击——属性,如下图所示:此时不仅手机能上网,而且电脑也能正常连接网络,正常上网。(我的体验是连接数据不稳定,时不时的要手机重新登陆WIFI,才有数据传输,可能是高校WLAN的问题,在家网速快的可以尝试一下) 5.通过这个问题的解决,我才知道原来MTP USB设备安装失败,未能成 功安装设备驱动程序的原因是我们手机里面没有启用该设备服务。今天 才知道MTP USB设备是与手机里的共享手机网络中“USB绑定”服务相关 联的,是电脑用来使用手机WIFI网络连接进行上网的工具。

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设备驱动程序设计

USB设备驱动程序设计 引言 USB 总线是1995 年微软、IBM 等公司推出的一种新型通信标准总线, 特点是速度快、价格低、独立供电、支持热插拔等,其版本从早期的1.0、1.1 已经发展到目前的2.0 版本,2.0 版本的最高数据传输速度达到480Mbit/s,能 满足包括视频在内的多种高速外部设备的数据传输要求,由于其众多的优点,USB 总线越来越多的被应用到计算机与外设的接口中,芯片厂家也提供了多种USB 接口芯片供设计者使用,为了开发出功能强大的USB 设备,设计者往往 需要自己开发USB 设备驱动程序,驱动程序开发一直是Windows 开发中较难 的一个方面,但是通过使用专门的驱动程序开发包能减小开发的难度,提高工 作效率,本文使用Compuware Numega 公司的DriverStudio3.2 开发包,开发了基于NXP 公司USB2.0 控制芯片ISP1581 的USB 设备驱动程序。 USB 设备驱动程序的模型 USB 设备驱动程序是一种典型的WDM(Windows Driver Model)驱动程序,其程序模型如图1 所示。用户应用程序工作在Windows 操作系统的用户模式层,它不能直接访问USB 设备,当需要访问时,通过调用操作系统的 API(Application programming interface)函数生成I/O 请求信息包(IRP),IRP 被传输到工作于内核模式层的设备驱动程序,并通过驱动程序完成与UBS 外设通 信。设备驱动程序包括两层:函数驱动程序层和总线驱动程序层,函数驱动程 序一方面通过IRP 及API 函数与应用程序通信,另一方面调用相应的总线驱动 程序,总线驱动程序完成和外设硬件通信。USB 总线驱动程序已经由操作系统 提供,驱动程序开发的重点是函数驱动程序。 USB 设备驱动程序的设计

USB WDM 设备驱动程序

USB WDM 设备驱动程序DriverStudio 引言 随着微机技术水平的日益提高,传统的计算接口已经不能满足当前计算机高速发展的需求,计算机业界迫切需要新的通用型、高速总线接口。通用外设接口标准USB应运而生。USB,全称为通用串行总线(Universal Serial Bus),它是Compaq、IBM等PC大厂商联合开发的一种新型的、基于令牌的、高速的串行总线标准。开发者要设计USB设备接口,就必须首先了解USB协议,在此基础上有针对性的开发USB设备驱动程序。 USB简介 在众多的PC机总线中,USB以其突出的优点独树一帜:①使用方便。支持热拔插,不涉及中断请求(IRQ)冲突等问题,能真正做到“即插即用”。②传输速率高。目前的USB 2.0协议速度高达480Mbps 。③易于扩展。通过使用Hub扩展可连接多达127个外设。④使用灵活。USB共有4种传输模式:控制(control)、同步(Synchronization)、中断(interrupt)、批量(bulk),以适应不同设备的需要。⑤独立供电。正由于上述优点,开发USB接口的设备已成为一种发展趋势。 一个完整的USB系统包括主机系统和USB设备。所有的传输事务都是由主机发起的。一个主机系统又可以分为以下几个层次结构,如图1所示:

图1 USB 互连通信模型 USB总线接口包括USB主控制器和根集线器,其中USB主控制器负责处理主机与设备之间电气和协议层的互连,根集线器提供USB设备连接点。USB系统使用USB主控制器来管理主机和USB设备之间的数据传输,另外它也负责管理USB资源,如带宽等。应用软件不能直接访问USB设备硬件,而通过USB系统和USB总线接口与USB设备进行交互。 USB设备包含一些向主机软件提供一系列USB设备的特征和能力的信息的设备描述符,用来配置设备和定位USB设备驱动程序。这些信息确保了主机以正确的方式访问设备。通常,一个设备有一个或多个配置(Configuration)来控制其行为。配置是接口(Interface)的集合,接口指出软件应该如何访问硬件。接口又是端点(endpoint)的集合,每一个与USB交换数据的硬件就为端点,它是作为通信管道的一个终点。图1显示了一个多层次结构的通信模型,它表明了端点和管道所扮演的角色。 WDM驱动程序和USB驱动程序的分层结构 设备驱动程序实际上是指一系列控制硬件设备的函数,是操作系统中控制和连接硬件的关键模块。它提供连接到计算机的硬件设备的软件接口。

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操作,处理中断和执行特定的设备要求的任何差错处理。

安装USB驱动过程中可能遇到的问题及解决方案

安装USB 驱动过程中可能遇到的问题及解决方案 概述: 本文列举了在安装USB 驱动程序过程中可能遇到的常见问题,并提供了常用的解 决方案。对于其他特殊的情况,如:驱动安装之后出现打印乱码等现象,将在相 关的技术文档中予以进一步的说明。 本文包括: 1. 故障现象: 在打印时遇到:打印到DOT4_00x 端口错误。 故障分析: 1 ).USB 端口没有被正确地识别。USB 电缆不符合规范,长度太长,或者加装 延长线,转接线,共享器等附加设备; 2 ).端口选择不正确; 3 ). 打印机驱动程序未正确安装;如果安装了不匹配的驱动也会出现端口错误。 比如:lj1010 打印机安装了同系列1015 的PCL5e 驱动; 4)). 系统和USB Host Controller 的影响; 5 ).端口供电不足。 解决方案: 1 ).正确连接USB 线,保证USB 电缆长度应小于 2 米,通讯质量较好;取 消延长线和共享器等附加设备; 2 ).检查打印机驱动属性中的端口选项,如果存在多个DOT4 端口, 则首选数 目较高的端口;查看是否有USB 端口,选择USB 端口打印测试; 3 ).取消双向支持;

4 ).完全卸载当前驱动,然后重新启动或热拔插USB 电缆,若系统自动找到新硬件,取消,在device manager 里发现usb printing support 后,再利用“添加打印机向导”添加打印机,安装与打印机语言相匹配的驱动程序,此时,应该选择USB-00X 端口;若系统无法检测到新硬件,要检查系统是否正确识别USB 芯片组,步骤如下: 在Windows 2000/XP 中(Windows 9x/Me 的操作步骤基本类似) ,依次点击“开始→设置→控制面板→系统→硬件→设备管理器”,找到并双击“通用串行总线控制器”。其中应当至少列出两类条目,一类是USB 控制器,另一个是USB Root Hub。如果PC 主板支持USB 2.0 ,并正常安装了驱动程序,一般会在此处显示USB 2.0 Root Hub 。 如果Windows 无法识别出USB 控制器,或在“其他设备”中出现“ USB 控制器”,那么说明主板芯片组的驱动程序或USB 2.0 的驱动程序没有安装成功。建议到芯片组官方网站下载最新的驱动程序,并确认Windows 能正确识别; 5 ).建议将打印机安装到其他计算机上测试; 6 ).保证USB 接口获得足够的电力。USB 设备包含从计算机通过USB 电缆驱动USB 通讯的电源。计算机在100mA 的低电力级别下可以检测到设备,但是需要500mA 才能维持大功率USB 设备的高速通讯(movable disk) 。当打印机得不到充分的电流供应时,也可能造成DOT4 无法正确的设定。建议将打印机直接插在屋内的电源插孔上,而非插在延长线上与其他的电器共用电流,同时尽量使用HP 所附的电源线而非其他可能不合格的电源线,或者为计算机添加有源的USB 集线器。 2. 故障现象: 1 ) . 激光打印机在运行光盘安装驱动程序,插入USB 电缆后或者在出现的新硬件向导下安装打印机时会发生这个错误“ 无法安装这个硬件,在安装LaserJet 1020 时出现了一个问题。安装该设备是发生了一个错误:这个设备的驱动程序丢失了一个必需的项,这可能是由于inf 是为Windows 95 或更新版本而写的。联系您的硬件供应商。”; 2 ).设备控制器的USB 主控制器中出现黄色叹号。 故障分析: 当用打印机驱动光盘的Windows 98 第二版的USB 打印支持驱动程序,而不是使用系统自带的USB 打印支持驱动程序时会发生这种错误。Windows 98 USB 打印驱动程序与更高版本的Windows 操作系统不兼容。

(完整版)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接口模拟成传统的串行口(通常为COM3),从而使用现有的编程软件或通信软件,通过编程电缆与PLC等设备的传统接口进行通信。 功能 ●支持的操作系统Windows2000/Windows XP ●完全兼容USB V1.1和USB CDC V1.1规范 ●USB总线供电(非隔离电缆)、或USB总线供电与PLC的编程口同时供 电(隔离型电缆) ●波特率:300bps~1Mbps自动适应 ●每台PC只支持一根USB编程电缆 系统要求 请在使用USB编程电缆之前确认你的电脑是IBM PC兼容型并具备以下最低系统要求: ●Intel兼容586DX4-100MHz中央处理器或更高 ●一个标准的USB接口(4-pin A型插座) ●运行操作系统为Windows2000或Windows XP 驱动程序的安装 驱动程序的安装非常简单,只需按提示进行即可,以Windows XP为例,按以下步骤进行: 1、打开将要连接USB编程电缆的电脑电源,并确认电脑的USB口已经启 动并正常工作。 2、将USB编程电缆插入电脑的USB接口,Windows将检测到设备并运行 添加新硬件向导帮助你设置新设备,插入驱动程序光盘并单击下一步继 续。 如果Windows没有提示找到新硬件,那么在设备管理器的硬件列表中, 展开“通用串行总线控制器”,选择带问号的USB设备,单击鼠标右键 并运行更新驱动程序。

3、Windows将检测到安装信息,显示“FOURSTAR USB Composite Device ” 设备,并出现如下没有通过Windows徽标测试的信息框,单击“仍然继续”。

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.360docs.net/doc/06452496.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 HID 设备驱动程序设计

USB HID 设备驱动程序设计 引自:https://www.360docs.net/doc/06452496.html,/hudaweikevin/archive/2009/11/02/4756394.aspx 摘要:USB(Universal Serial Bus)即“通用串行总线”是一种应用在计算机领域的新型接口技术。它的出现大大简化了PC机和外围设备的连接过程,使PC机接口的扩展变得更加容易。USB作为近年来计算机和嵌入式领域中的热点,推动了计算机外设的飞速发展。本文介绍了适用于PC的嵌入式操作系统的USB HID设备驱动的设计,并给出了具体的实现方法。关键词:USB HID设备PC 嵌入式驱动程序 从USB 1.1到USB2.0再到目前的USB OTG(On-The-Go),USB在不断自我完善,并走向成熟。USB具有高速度、低成本、低功耗、即插即用和使用维护方便等优点,不仅成为了PC主板上的标准接口,而且成为了所有PC外部设备如键盘、鼠标、显示器、打印机、数码相机等与PC相连的标准协议之一,迅速占领了计算机中、低速外部设备的市场。 USB(Universal Serial Bus)即“通用串行总线”是一种应用在计算机领域的新型接口技术。USB的拓扑结构中居于核心地位的是Host(也称为主机)。任何一次USB的数据传输都必须由主机来发起和控制,所有的USB外设都只能和主机建立连接,任何两个外设之间或是两个主机之间无法直接通信。而目前,大量的扮演主机角色的是个人电脑PC。 随着USB应用领域的逐渐扩大,对于USB的期望也越来越高。我们希望USB能应用在各种计算机领域中,希望能通过PDA等移动设备直接和USB外设通信,使得USB能应用在没有PC的领域中。 而我们目前所使用的USB移动设备,大多数都是USB的外设,比如USB的移动硬盘、USB 接口的数码相机等。所有这些设备都只能在PC上使用,只能通过PC来进行相互的文件和数据交换。 本驱动程序是为完善我们自行设计的嵌入式操作系统,使得它具备能识别USB HID设备的功能而开发的。所使用的编程语言为C语言,并下载到目标机上,通过测试验证可以识别USB HID设备,如USB键盘,USB鼠标等。本文探讨的即是PC上实现USB HID设备驱动的方法。 ⒈HID 设备驱动简介 为简化USB设备的开发过程,USB提出了设备类的概念。HID设备类,即人机接口设备。典型的HID设备如键盘、鼠标。 所有设备类都必须支持标准USB描述符和标准USB设备请求。如果有必要,设备类还可以自行定义其专用的描述符和设备请求,这分别被称为设备类定义描述符和设备类定义请求。另外,一个完整的设备类还将指明其接口和端点的使用方法,如如接口所包含端点的个数、端点的最大数据包长度等。 HID设备既可以是低速设备也可以是全速设备,其典型的数据传输类型为中断IN传输,即它适用于主机接收USB设备发来的小量到中等量的数据。HID具有以下的功能特点:1)适用于传输少量或中量的数据;2)传输的数据具有突发性;3)传输的最大速率有限制;4)无固定

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++提供了相应的工具来完成这个工作:

未能成功安装设备驱动程序MTPUSB设备安装失败的解决办法

M T P U S B设备安装失败未能成功安装设备驱动程序 终极解决方法 环境介绍:电脑系统win7(32位)已安装摩托罗拉手机驱动版本(其他版本应该也行,不行的话去摩托罗拉官网下载最新驱动) 手机型号 备注:其他电脑操作系统和不同型号手机可参考此方法,找到相应设置项即可。 问题简介: 1.当我们把手机连接至电脑,把模式调制成“摩托罗拉手机门户”时,出现下列情况 2.过一会之后便会弹出提示说:未能成功安装设备驱动程序 3.单击查看详情便弹出窗口如下图所示: 4.此时桌面右下角图标出现黄色三角号,如图所示: 5.于是我们就开始不淡定了,怎么看怎么别扭、抓狂、按耐不住。下面介绍问题解决方案 解决方法: 1.我的电脑——右键单击——管理——设别管理器,之后会看到如图所示:在便携设备下有黄色三角号提示,即是我们纠结的MTP USB设备安装不成功的展示。 2.对手机进行设置(这是关键步骤),(备注:以MIUI手机操作系统为例,其他手机操作系统需将USB 绑定服务开启即可)。选择设置——系统——共享手机网络——USB绑定,将该选项设置为“开”,这是你会发现如图所示变化,在设备管理器面板中没有了便携设备选项及黄色三角号提醒,如图所示:(但桌面右下角的黄色三角警示还在) 3.在完成以上步骤后,用手机打开WIFI并登录无线WLAN,手机打开网页检验连接是否正常,若正常则如下图所示,黄色三角号警示消失,问题解决;若以上步骤没有解决问题,请先连接WIFI并登录WLAN之后,再按步骤操作。 4.完成以上步骤并解决问题后,选择电脑桌面网络——右键单击——属性,如下图所示:此时不仅手机能上网,而且电脑也能正常连接网络,正常上网。(我的体验是连接数据不稳定,时不时的要手机重新登陆WIFI,才有数据传输,可能是高校WLAN的问题,在家网速快的可以尝试一下) 5.通过这个问题的解决,我才知道原来MTP USB设备安装失败,未能成功安装设备驱动程序的原因是我 们手机里面没有启用该设备服务。今天才知道MTP USB设备是与手机里的共享手机网络中“USB绑定”服 务相关联的,是电脑用来使用手机WIFI网络连接进行上网的工具。

怎样写linux下的USB设备驱动程序

怎样写linux下的USB设备驱动程序 发布时间:2007年11月19日 引言 随着人们生活水平的提高,我们用到的USB设备也越来越多,但是Linux在硬件配置上仍然没有做到完全即插即用,对于Linux怎样配置和使用他们,也越来越成为困扰我们的一大问题;本文的目地是使大家了解怎样编制USB设备驱动,为更好地配置和使用USB设备提供方便;对于希望开发Linux系统下USB设备驱动的人员,也可作为进一步学习USB驱动的大体架构进而编写出特殊USB设备的驱动程序。 USB基础知识 USB是英文Universal Serial Bus的缩写,意为通用串行总线。USB最初是为了替代许多不同的低速总线(包括并行、串行和键盘连接)而设计的,它以单一类型的总线连接各种不同的类型的设备。USB的发展已经超越了这些低速的连接方式,它现在可以支持几乎所有可以连接到PC上的设备。最新的USB规范修订了理论上高达480Mbps的高速连接。Linux内核支持两种主要类型的USB驱动程序:宿主系统上的驱动程序和设备上的驱动程序,从宿主的观点来看(一个普通的宿主也就是一个PC机),宿主系统的USB设备驱动程序控制插入其中的USB设备,而USB设备的驱动程序控制该设备如何作为一个USB设备和主机通信。本文将详细介绍运行于PC机上的USB系统是如何运作的。并同时用USB驱动程序的框架程序当例子作详细的说明,我们在此文中不讨论USB器件的驱动程序。 USB驱动程序基础 在动手写USB驱动程序这前,让我们先看看写的USB驱动程序在内核中的结构,如下图: USB驱动程序存在于不同的内核子系统和USB硬件控制器之间,USB核心为USB驱动程序提供了一个用于访问和控制USB硬件的接口,而不必考虑系统当前存在的各种不同类型的USB硬件控制器。USB是一个非常复杂的设备,linux内核为我们提供了一个称为USB的核心的子系统来处理大部分的复杂性,USB

相关文档
最新文档