C语言调用libusb访问USB驱动

这篇具有很好参考价值的文章主要介绍了C语言调用libusb访问USB驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、环境搭建

1. 下载库文件

2. 解压

3. 配置VS工程

3.1 头文件的配置

3.2 静态库文件的处理

3.3 配置运行时库

二、生成自定义设备的驱动

1. 禁用Windows驱动程序强制签名

2. 设备描述符的设计

3. 设备枚举

4. 如何为自己的设备安装WinUSB驱动

三、测试

1. 测试代码

2. 小结


一、环境搭建

开发环境:win10/64位、VS2019企业版(Microsoft Visual Studio Enterprise 2019)

1. 下载库文件

先不关心源码,直接下载库文件,然后配置VS2019引用库文件即可。libusb-1.0.20下载地址:

https://udomain.dl.sourceforge.net/project/libusb/libusb-1.0/libusb-1.0.20/libusb-1.0.20.7z

2. 解压

解压之后,需要关注这两个个目录:

C语言调用libusb访问USB驱动

3. 配置VS工程

新建工程:略。如下,新建一个C工程,命名为test_for_usb。

C语言调用libusb访问USB驱动

 接下来要配置这个工程使用库(xxx.lib)文件。

3.1 头文件的配置

(1) 将解压目录里面的libusb.h拷贝到当前工程目录下

C语言调用libusb访问USB驱动

(2) 配置附加包含目录

添加libusb.h的路径(实际上就是当前工程的路径) 到“附加包含目录中”。

工程右键--->属性--->C/C++--->常规--->附加包含目录。最后单击“应用”按钮结束配置。

C语言调用libusb访问USB驱动

(3)将头文件添加到工程中

头文件--->添加--->现有项--->选择libusb.h

C语言调用libusb访问USB驱动

3.2 静态库文件的处理

(1)库文件的拷贝

对于64位的系统,选择MS64目录。将libusb-1.0.20\MS64\dll\下的libusb-1.0.lib文件复制到当前工程目录下:

C语言调用libusb访问USB驱动

(2)将libusb-1.0.lib添加到“附加依赖项”。

右键工程--->配置属性--->链接器--->输入--->附加依赖项。最后单击“确定”和“应用”结束配置。

C语言调用libusb访问USB驱动

(3)将libusb-1.0.lib所在目录添加到“附加库目录”

libusb-1.0.lib所在目录实际上就是当前工程所在目录。

右键工程--->配置属性--->链接器--->常规--->附加库目录。最后单击“确定”和“应用”结束配置。

C语言调用libusb访问USB驱动

3.3 配置运行时库

使用静态版本的libusb库,那么就要把“运行时库”设置为“多线程DLL(/MD)”。

右键工程--->配置属性--->C/C++--->代码生成--->运行库。最后单击“确定”和“应用”结束配置。

C语言调用libusb访问USB驱动

 注意:以上的所有配置,包括库文件的选择,都是针对64位平台(X64)的。

二、生成自定义设备的驱动

1. 禁用Windows驱动程序强制签名

如果不禁用Windows驱动程序强制签名,在安装自定义的驱动时,可能会碰到这个问题:

“System policy has been modified to reject unsigned drivers”,如下图。

C语言调用libusb访问USB驱动

 禁用驱动程序强制签名即可。以win10为例,解决过程:Win10怎么禁用驱动程序强制签名-百度经验 (baidu.com)

2. 设备描述符的设计

针对环境搭建,设计了一个简单的USB设备。设备实现Bulk传输,除控制传输端点0外,还有Bulk-IN1和Bulk-OUT2两个数据传输端点。把PID和VID都设计为0x10e6,设备描述符中的设备类、子类和协议都设置为0, 接口描述符中对应的三个字段都设置为0xff,表示这是一个自定义的设备(不使用MSC协议)。

附:设备描述符

---===>Device Information<===---

ConnectionStatus:                  
Current Config Value:              0x01  -> Device Bus Speed: High
Device Address:                    0x07
Open Pipes:                           2

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x02  -> Direction: OUT - EndpointID: 2
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00

          ===>Device Descriptor<===
bLength:                           0x12
bDescriptorType:                   0x01
bcdUSB:                          0x0200
bDeviceClass:                      0x00  -> This is an Interface Class Defined Device
bDeviceSubClass:                   0x00
bDeviceProtocol:                   0x00

bMaxPacketSize0:                   0x40 = (64) Bytes
idVendor:                        0x10E6 
idProduct:                       0x10E6

bcdDevice:                       0x0100
iManufacturer:                     0x00
iProduct:                          0x00
iSerialNumber:                     0x00
bNumConfigurations:                0x01

          ===>Configuration Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x02
wTotalLength:                    0x0020  -> Validated
bNumInterfaces:                    0x01
bConfigurationValue:               0x01
iConfiguration:                    0x00
bmAttributes:                      0x80  -> Bus Powered
MaxPower:                          0x96 = 300 mA

          ===>Interface Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x04
bInterfaceNumber:                  0x00
bAlternateSetting:                 0x00
bNumEndpoints:                     0x02
bInterfaceClass:                   0xFF  -> Vendor Specific Device
bInterfaceSubClass:                0xFF
*!*CAUTION:    This appears to be an invalid bInterfaceSubClass
bInterfaceProtocol:                0xFF
*!*WARNING:  must be set to PC_PROTOCOL_UNDEFINED 0 for this class
iInterface:                        0x00
*!*ERROR:  0xFF is the prerelease USB Video Class ID

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x81  -> Direction: IN - EndpointID: 1
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00

          ===>Endpoint Descriptor<===
bLength:                           0x07
bDescriptorType:                   0x05
bEndpointAddress:                  0x02  -> Direction: OUT - EndpointID: 2
bmAttributes:                      0x02  -> Bulk Transfer Type
wMaxPacketSize:                  0x0200 = 0x200 max bytes
bInterval:                         0x00
 

3. 设备枚举

USB设备插入PC,控制传输枚举阶段结束,设备管理器出现“未知设备”。

C语言调用libusb访问USB驱动

这个设备比较简单,设备端只需要处理几条控制传输指令(bulk传输指令可以不理会,事实上由于描述符有几个字段设置的原因,HOST也不会下发相关的SCSI指令)即可。如下:

C语言调用libusb访问USB驱动

4. 如何为自己的设备安装WinUSB驱动

需要下载Zadig,Zadig是一个Windows平台上专门用于安装USB相关驱动的小软件,下载后解压即可。连接如下:

https://udomain.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip

复制后,打开浏览器即可自动下载,如下图:

C语言调用libusb访问USB驱动

 解压之后,在bin目录下有可执行文件inf-wizard.exe

C语言调用libusb访问USB驱动

 选择自己这个未知的设备:

C语言调用libusb访问USB驱动

 注意:对应设备描述符中的VID和PID

厂商名称和设备名称可以自由填写

C语言调用libusb访问USB驱动

 找个目录保存生成的xxx.inf文件之后,开始安装驱动。

C语言调用libusb访问USB驱动

安装中

C语言调用libusb访问USB驱动

C语言调用libusb访问USB驱动

安装成功:

C语言调用libusb访问USB驱动

 驱动安装成功后,再查看设备管理器,设备驱动就正常了:

C语言调用libusb访问USB驱动

接下来libusb就可以访问设备了。

三、测试

1. 测试代码

main.c

#include <stdio.h>

#include "libusb.h"

int main(void)

{

    int res;

    struct libusb_device_handle* usb_handle = NULL;

    struct libusb_device* usb_dev = NULL;

    struct libusb_device_descriptor dev_desc;

    libusb_init(NULL);

    usb_handle = libusb_open_device_with_vid_pid(NULL, 0x10e6, 0x10e6);

    if (usb_handle != NULL) {

        usb_dev = libusb_get_device(usb_handle);

        if (usb_dev != NULL) {

            //get device descriptor

            res = libusb_get_device_descriptor(usb_dev, &dev_desc);

            if (res == 0) {

                printf("get device desc success\n");

                printf("bLength:0x%02x\n", dev_desc.bLength);

                printf("bDescriptorType:0x%02x\n", dev_desc.bDescriptorType);

                printf("bcdUSB:0x%04x\n", dev_desc.bcdUSB);

                printf("bDeviceClass:0x%02x\n", dev_desc.bDeviceClass);

            } else {

                printf("fail to get device desc\n");

                libusb_close(usb_handle);

            }

        }

    } else {

        printf("can not find device:0x1010\n");

    }

    libusb_exit(NULL);

    return 0;

}

运行如下:

C语言调用libusb访问USB驱动

程序可以访问USB驱动,并获取相关设备信息。接下来要实现数据的读写。

2. 小结

(1)配置VS,使用到的资源文件是libusb.h和libusb-1.0.lib

(2)整个环境搭建,会使用到这两个资源包

(3)关于驱动程序的编写和测试要有USB设备的配合。

关于libusb的详细API介绍和使用例程,官网Spec链接为:

libusb: libusb-1.0 API Reference

下一篇:实现Bulk数据双向传输。文章来源地址https://www.toymoban.com/news/detail-465801.html

到了这里,关于C语言调用libusb访问USB驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Maven环境搭建及Maven部分目录分析

    Maven 本身就是⼀套由 Java 开发的软件,所以 Maven 的运⾏需要依赖 JDK 环境。在安装 Maven 之前请 确认JDK 是否配置正确(主要依赖 JAVA_HOME 环境变量)。如果没有正确安装和配置 JDK ,则运⾏ Maven 时 会出现以下错误信息:          The JAVA_HOME environment variable is not defined correct

    2024年01月20日
    浏览(30)
  • 【树莓派不吃灰】基础篇⑲ 搭建usb摄像头MJPG-streamer图片流监控,支持远程视频监控访问

    ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️ ❤️ 本篇创建记录 2022-11-12 ❤️ ❤️ 本篇更新记录 2022-11-12 ❤️ 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言 📝 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正

    2023年04月15日
    浏览(28)
  • 搭建feign远程调用环境

    在我的SpringCloud专栏中已经介绍过SpringCloud五大组件的环境搭建,各个环境的搭建都有详细的步骤讲解,之前我们说过各个服务搭建都是不依赖于之前的环境的,本节介绍的Feign服务间远程调用也是,本次也是侧重于环境搭建,Feign的作用我们之前已经介绍过了。可以查看:0

    2024年01月17日
    浏览(26)
  • linux驱动开发环境搭建

    使用的是parallel 创建的ubuntu 16.04 ubuntu20.04虚拟机 在编译的时候把虚拟机分配8核,8G内存,开发的时候2核,4G内存就够了 https://blog.csdn.net/inf4inf/article/details/110272531 https://blog.csdn.net/yaoxinJJJ/article/details/115433638 https://zhuanlan.zhihu.com/p/409007775?utm_id=0

    2024年02月06日
    浏览(29)
  • IMX6ULL网络环境搭建---电脑WIFI上网、开发板和电脑通过USB转网口连接

    使用场景:一般电脑都是有一个以太网网口的,但是一些超薄本、商务本电脑没有以太网网口,这样并不方便我们的开发。我们可以使用 USB 转网口设备来给电脑拓展出一个以太网网口,因为开发板必选通过有线的方式连接到电脑上。USB 转网口设备如下图所示。 设备:电脑(

    2024年02月02日
    浏览(33)
  • 树莓派驱动开发--搭建环境篇(保姆级)

            1.1、 虚拟机环境搭建 下载虚拟机vm,然后建立一个虚拟机,我这边用的ubantu版本是16.04,正点原子的,很稳定这个版本,推荐! 链接:https://pan.baidu.com/s/1r6NEANYDDbs7bg_lmPMeXA?pwd=hsw1  提取码:hsw1         1.2、 ssh、nfs、ftp搭建 使用命令搭建ssh 按步骤使用命令搭建nfs 

    2024年04月29日
    浏览(34)
  • (三)(Driver)驱动开发之双机调试环境搭建及内核驱动的运行

    请参考另一篇:https://blog.csdn.net/qq_41273999/article/details/133341733 请参考另一篇:https://blog.csdn.net/qq_41273999/article/details/133376458 准备好安装包,勾选将VMware Workstation控制台工具添加到系统PATH。 输入秘钥:ZF71R-DMX85-08DQY-8YMNC-PPHV8,如果失效,勾选试用30天。 下载完成后, 以管理员身份

    2024年02月06日
    浏览(25)
  • 深度学习环境搭建-Nvidia驱动与Cuda安装

    说实话,笔者毕业后已经从业多年了,但是仍然有很多开发环境配置的问题让人懵圈,好在笔者一直有写笔记的习惯,之前一直是记录在私人云,如今整理出来分享给各位,并且除了说明步骤,还会尽可能解释这么做的原因,方便读者厘清逻辑。 注意:本文针对linux系统 本文

    2024年02月10日
    浏览(60)
  • 【STM32开发环境搭建】 - st-link驱动安装和串口驱动安装

    下载地址:https://download.csdn.net/download/weixin_39035140/86248921 包含软件如下: 1、下载线我们使用了st-link,为了能够下载程序到开发板,需要先安装st-link驱动。打开设备管理器,可以通过热插拔法确认是哪一个设备(STM32 STLink显示感叹号就是缺少驱动),右击更新驱动,选择浏览

    2024年02月12日
    浏览(36)
  • selenium环境搭建,浏览器驱动下载教程,超详细!

    本周是基于selenium这个工具展开的,其实是Python里面的一个库。 1.selenium客户端库安装 #注意,目前直接安装将会安装最新的4.0版本,我们需要3.0版本,安装时则要指定版本 在命令行输入以下安装地址: 2.下载浏览器 selenium支持的浏览器谷歌、火狐、edge、欧朋浏览器都支持,

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包