ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:29.27KB ,
资源ID:8473407      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-8473407.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(基于libusb的无驱设计Word格式.docx)为本站会员(b****5)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

基于libusb的无驱设计Word格式.docx

1、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.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_han

3、dle *dev); 与usb_open相对应,关闭设备,是必须调用的, 返回0成功,0 失败。 usb_set_configuration int usb_set_configuration(usb_dev_handle *dev, int configuration); 设置当前设备使用的configuration,参数configuration 是你要使用的configurtation descriptoes中的bConfigurationValue, 返回0成功,0失败( 一个设备可能包含多个configuration,比如同时支持高速和低速的设备就有对应的两个configuratio

4、n,详细可查看usb标准) usb_set_altinterface int usb_set_altinterface(usb_dev_handle *dev, int alternate); 和名字的意思一样,此函数设置当前设备配置的interface descriptor,参数alternate是指interface descriptor中的bAlternateSetting。返回0成功,0失败 usb_resetep int usb_resetep(usb_dev_handle *dev, unsigned int ep); 复位指定的endpoint,参数ep 是指bEndpointA

5、ddress,。这个函数不经常用,被下面介绍的usb_clear_halt函数所替代。 usb_clear_halt int usb_clear_halt (usb_dev_handle *dev, unsigned int ep); 复位指定的endpoint,参数ep 是指bEndpointAddress。这个函数用来替代usb_resetep usb_reset int usb_reset(usb_dev_handle *dev); 这个函数现在基本不怎么用,不过这里我也讲一下,和名字所起的意思一样,这个函数reset设备,因为重启设备后还是要重新打开设备,所以用usb_close就已经

6、可以满足要求了。 usb_claim_interface int usb_claim_interface(usb_dev_handle *dev, int interface); 注册与操作系统通信的接口,这个函数必须被调用,因为只有注册接口,才能做相应的操作。Interface 指 bInterfaceNumber. (下面介绍的usb_release_interface 与之相对应,也是必须调用的函数) usb_release_interface int usb_release_interface(usb_dev_handle *dev, int interface); 注销被usb_cl

7、aim_interface函数调用后的接口,释放资源,和usb_claim_interface对应使用。 2.3 控制传输接口 usb_control_msgint usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout); 从默认的管道发送和接受控制数据 usb_get_string int usb_get_string(usb_dev_handle *dev, int index, int langi

8、d, char *buf, size_t buflen); usb_get_string_simple int usb_get_string_simple(usb_dev_handle *dev, int index, char *buf, size_t buflen); usb_get_descriptor int usb_get_descriptor(usb_dev_handle *dev, unsigned char type, unsigned char index, void *buf, int size); usb_get_descriptor_by_endpoint int us

9、b_get_descriptor_by_endpoint(usb_dev_handle *dev, int ep, unsigned char type, unsigned char index, void *buf, int size); 2.4 批传输接口 usb_bulk_write int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, int timeout); usb_interrupt_read int usb_interrupt_read(usb_dev_handle *dev, int ep

10、, char *bytes, int size, int timeout);2.5 中断传输接口usb_bulk_writeusb_interrupt_read基本上libusb所经常用到的函数就有这些了,和usb协议确实很接近吧。下面我们实例在介绍一个应用。基于libusb的无驱设计(二) 使用libusb之前你的linux系统必须装有usb文件系统,这里还介绍了使用hiddev设备文件来访问设备,目的在于不仅可以比较出usb的易用性,还提供了一个转化成libusb驱动的案例。3.1 find 设备任何驱动第一步首先是寻找到要操作的设备,我们先来看看HID驱动是怎样寻找到设备的。我们假设寻找

11、设备的函数Device_Find(注:代码只是为了方便解说,不保证代码的健全)cpp:nogutter view plaincopyprint?1. ./*我们简单看一下使用hid驱动寻找设备的实现,然后在看一下libusb是如何寻找设备的*/2. intDevice_Find()3. 4. chardir_str100;这个变量我们用来保存设备文件的目录路径5. hiddev100;这个变量用来保存设备文件的全路径6. DIRdir;7. 8. 申请的字符串数组清空,这个编程习惯要养成9. memset(dir_str,0,sizeof(dir_str);10. .(hiddev,sizeo

12、f(hiddev);11. .12. .hiddev的设备描述符不在/dev/usb/hid下面,就在/dev/usb下面13. .这里我们使用opendir函数来检验目录的有效性14. 14.打开目录返回的值保存在变量dir里,dir前面有声明15. .16. .dir=opendir(/dev/usb/hid);17. .if(dir)18. .程序运行到这里,说明存在/dev/usb/hid路径的目录19. .sprintf(dir_str,/dev/usb/hid/20. .closedir(dir);21. .else22. .如果不存在hid目录,那么设备文件就在/dev/usb下

13、23. ./dev/usb/24. .25. .26. .DEVICE_MINOR是指设备数,HID一般是16个27. .for(i=0;i0)34. .35. .操作设备获得设备信息36. .ioctl(fd,HIDIOCGDEVINFO,&info);37. .38. .VENDOR_ID和PRODUCT_ID是标识usb设备厂家和产品ID,39. .驱动都需要这两个参数来寻找设备,到此我们寻找到了设备40. .if(info.vendor=info.product=PRODUCT_ID)41. .这里添加设备的初始化代码42. .43. .44. .device_num+;找到的设备数4

14、5. .46. .close(fd);47. .48. .49. .returndevice_num;返回寻找的设备数量50. .我们再来看libusb是如何来寻找和初始化设备structusb_bus*busses;device_num记录设备数量usb_init();初始化usb_find_busses();寻找系统上的usb总线usb_find_devices();寻找usb总线上的usb设备获得系统总线链表的句柄14. .bussesusb_get_busses();*bus;遍历总线for(busbusses;bus;busbus-next)usb_device*dev;遍历总线上的

15、设备(devdevices;dev;devdev-寻找到相关设备,if(dev-descriptor.idVendor=VENDOR_ID&descriptor.idProduct=PRODUCT_ID)返回设备数量注:在新版本的libusb中,usb_get_busses就可以不用了 ,这个函数是返回系统上的usb总线链表句柄这里我们直接用usb_busses变量,这个变量在usb.h中被定义为外部变量所以可以直接写成这样:1. .2. .usb_busses;3. .4. .5. .6. .7. .3.2 打开设备假设我们定义的打开设备的函数名是device_open,1使用hid驱动打开

16、设备Device_Open()handle;传统HID驱动调用,通过open打开设备文件就可handleopen(“hiddev0”,O_RDONLY);使用libusb打开驱动LIBUSB驱动打开设备,这里写的是伪代码,不保证代码有用usb_device*udev;usb_dev_handle*device_handle;当找到设备后,通过usb_open打开设备,这里的函数就相当open函数device_handleusb_open(udev);3.3 读写设备和操作设备假设我们的设备使用控制传输方式,至于批处理传输和中断传输限于篇幅这里不介绍我们这里定义三个函数,Device_Write

17、, Device_Read, Device_ReportDevice_Report 功能发送接收函数Device_Write 功能写数据Device_Read 功能读数据Device_Write和Device_Read调用Device_Report发送写的信息和读的信息,开发者根据发送的命令协议来设计,我们这里只简单实现发送数据的函数。假设我们要给设备发送72字节的数据,头8个字节是报告头,是我们定义的和设备相关的规则,后64位是数据。HID驱动的实现(这里只是用代码来有助理解,代码是伪代码) Device_Report(intfd,unsigned*buffer72)ret;保存ioctl函数的返回值index;send_data72;发送的数据

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2