- 注册时间
- 2011-10-23
- 最后登录
- 2011-10-31
- 阅读权限
- 30
- 积分
- 498
- 精华
- 0
- 帖子
- 169
 
升级   99.33%
|
相关的主题文章:
可加入午间的瑜伽课程
奈何岔路
要问钱在哪
各省加起来的比国度大
4、坐姿忌陷
寻找体系上的usb总线,任何usb装备都通过usb总线和盘算机总线通讯。进而跟其余设备通信。此函数返回总线数。
函数定义: int usb_find_busses(void);
2.1 初始化设备接口
usb_interrupt_read
函数定义: int usb_interrupt_read(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout);
usb_reset
函数定义:int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
复位指定的endpoint,参数ep 是指bEndpointAddress,。这个函数不时常用,被下面介绍的usb_clear_halt函数所替代。
函数定义: int usb_find_devices(void);
3 花了些工夫写了个新产品的驱动,挺有成绩感啊,代码品质也是相称的有水准啊。合法你陶醉在你的代码中时,客服一直的邮件来了,“客户须要2.6.5内核的驱动,config文件我已经发你了” “客户需要双核的 2.6.18-smp 的驱动” “客户的平台是本人定制的是2.6.12-xxx “ 你巴不得把驱动的源代码给客户,这样省得编译了。你的一局部工作时光编译内核,定制驱动
二 libusb 的外部接口
usb_get_string
和名字的意思一样,此函数设置当前设备配置的interface descriptor,参数alternate是指interface descriptor中的bAlternateSetting。返回0成功,<0失败
usb_resetep
注册与操作系统通信的接口,这个函数必须被调用,因为只有注册接口,才干做相应的操作。
有问题发生必定会有想措施解决问题的人, libusb的呈现给我们带来了某些方便,即节俭了我们的时间,也下降了公司的本钱。 所以在一些情况下,就可以斟酌使用libusb的无驱设计了。
usb_bulk_write
//----------------===================================
2 当我们要把linux移植到嵌入平台上,你会发明本来linux自带的驱动移从前还挺大的,我的内核当然是越小越好拉,这样有必要么。这还不是最愁闷的处所,如果嵌入平台是客户的,客户要购置你的产品,你忽然发现客户设备里的系统和你的环境不一样,它不你要的驱动了,你的程序运行不了,你会先想:“不要紧,我写个内核驱动加载一下不就行了“。却发现客户连insmod加载模块的工具都没移植,那时你就看看老天,说声我怎么那么不幸啊,客户可不想你动他花了n时间移植的内核哦
usb_get_string_simple
函数定义: int usb_get_descriptor_by_endpoint(usb_dev_handle *dev, int ep, unsigned char type, unsigned char index, void *buf, int size);
usb_set_configuration
usb_close
usb_open
函数定义: int usb_clear_halt (usb_dev_handle *dev, unsigned int ep);
2.3 掌握传输接口
函数定义: struct usb_bus *usb_get_busses(void);
函数定义: int usb_set_configuration(usb_dev_handle *dev, int configuration);
2.4 批传输接口
使用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 < DEVICE_MINOR; 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打开设备文件就可 */handle = 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_ReportDevice_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 < 72; index++) { /* 设置发送数据的状况 */ uref.report_type = HID_REPORT_TYPE_FEATURE; uref.report_id = HID_REPORT_ID_FIRST; uref.usage_index = index; uref.field_index = 0; uref.value = send_data[ind |
|