Linux+libusb开发用户USB驱动程序(转)

Linux libusb USB开发(四)—— libusb例程,Linux环境下实现PC与USB设备的交互通信 (用的QT C++) 一、具体流程 用libusb函数库来完成电脑与USB设备的数据交互功能,主要有以下步骤: 1)初始化libusb函数库; 2)根据vid和pid查找某一具体设备,并获取设备描述符;(vid和pid为设备的id,且每台设备的都vid和pid是唯一的) 3)根据设备描述符打开相应设备,获取设备操作符; 4)用设备操作符配置usb设备的配置模式和接口; 5)调用相应传输函数向usb设备发送数... 阅读详情



注:在用户级的USB 驱动编写,不错,好像QT 嵌入式移植里面也是基于此的。
内核级的usb驱动在以下几个方面会有问题:


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的无驱设计了。


下文转自:http://blog.sina.com.cn/s/blog_8a84e6d301015uh7.html
在网上买了游戏摇杆和按键,他们通过usb口与电脑连接,于是乎我就想针对此手柄与按键开发自己的usb驱动,目的是为了以后玩的happy,哈哈。
   libusb是用户端驱动程序封装库,是USB主机对USB设备进行操作的函数集合,有了它我们针对某型号USB设备就不用去修改比较繁琐的linux内核驱动了,方便了对设备的使用与调试。我电脑的编程环境是ubuntu12.04+geany(一款linux下的集成开发工具,个人感觉挺好用的)。接下来分享一下代码:
#include<stdio.h>
#include <string.h>
#include <usb.h>

#define IdVendor0x0079      //这是我设备的厂商号
#define IdProduct0x0006     //这是我设备的产品号,当你的usb设备接入电脑时,使用lsusb-v命令来查看设备信息,请看下面第三张图片中的0079:0006
//#define PrintDev

char enp_num[8],buf8[8],is_change=0;

//端点描述符
static void print_endpoint(struct usb_endpoint_descriptor*endpoint)
{
 printf("     bEndpointAddress: xh\n",endpoint->bEndpointAddress);
 printf("     bmAttributes:    xh\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);
}

static 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 <interface->bNumEndpoints; i++)
   print_endpoint(&interface->endpoint[i]);
}

//显示设备所拥有的所有接口的描述符
static void print_interface(struct usb_interface *interface)
{
  int i;

  for (i = 0; i <interface->num_altsetting; i++)
   print_altsetting(&interface->altsetting[i]);
}

//配置描述符
static 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:        xh\n", config->bmAttributes);
  printf(" MaxPower:            %d\n", config->MaxPower);

  for (i = 0; i <config->bNumInterfaces; i++)
   print_interface(&config->interface[i]);
}

static void print_device(struct usb_device *dev)
{
   //读取描述符
    int i;
    chardescription[256];
   snprintf(description, sizeof(description),"X-X",dev->descriptor.idVendor,dev->descriptor.idProduct);
    printf("Dev#%d: %s\n", dev->devnum,description);
    for (i = 0;i <dev->descriptor.bNumConfigurations; i++)
     print_configuration(&dev->config[i]);

}

//因为我的游戏设备属于HID类型,所以他与电脑通过中断端点进行数据传输。当摇杆位置变化或者按键按下时,读取设备中断端点值
static int read_interupt(struct usb_device *dev)
{
   usb_dev_handle *udev;
   
    charbuf[256];
    intret,i;
   udev=usb_open(dev);
   
    //#ifdefPrintDev
      //print_device(dev);
   //#endif
 
   //使用libusb驱动前必须使接口脱离linux内核驱动
   usb_detach_kernel_driver_np(udev,0);
   //操作libusb接口函数时需要声明接口
   usb_claim_interface(udev,0);
   //读中断端点1
   ret=usb_interrupt_read(udev,1,buf8,8,0x0a);
   //printf("%d\n",ret);
   usb_release_interface(udev,0);
   for(i=0;i<8;i++)
    {
      if(i==2)   //为了消除第二项不稳定因素
         continue;
      if(enp_num[i]!=buf8[i])
       {
         is_change=1;
          break;
       }
    }
   
   if(is_change==1)
    {
      is_change=0;
      for(i=0;i<8;i++)
       {
         enp_num[i]=buf8[i];
          printf("%d",enp_num[i]);
                  
       }
      printf("\n");
    }
    if(udev)
      usb_close(udev);
    return0;
}

int main(int argc, char *argv[])
{
    structusb_bus *bus;
    structusb_device *dev;
   
   usb_init();
   usb_find_busses();
   usb_find_devices();
   
   memset(enp_num,0,sizeof(enp_num));
   memset(buf8,0,sizeof(buf8));
    for (bus =usb_busses; bus; bus = bus->next) {     
      for (dev = bus->devices; dev; dev =dev->next)     
         {
           if((dev->descriptor.idVendor==IdVendor)&&(dev->descriptor.idProduct==IdProduct))
           {                                   
               while(1)
                {
                  read_interupt(dev);
               }           
            }
          }
      }
  printf("*****************************\n");
  
   return 0;
}

//控制传输命令,通过控制端点(端点0)进行数据传输  
//renum=usb_control_msg(udev,0x80,USB_REQ_GET_DESCRIPTOR,
            //0x0100,0,description,USB_DT_DEVICE_SIZE,0);

如下面图片所示:
USB系列-LibUSB使用指南(1)-Windows下的报错与踩坑 Windows下的LibUSB开发的大怨种踩坑日记 阅读详情

相关推荐

Linux libusb USB开发(三)—— libusb函数库及接口函数介绍

一 libusb 介绍 libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,这些API 调用了内核的底层接口,和kernel driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得libusb的使用也比开发内核驱动相对容易的多。 二 libusb 的外部接口 2.1 核心初始化函数 ...

爱机械的假程序猿的博客 1万+

[S2C2440]_dnw2工具

已解决Cannot claim interface: Device or resource busy错误, 使用dnw2是不需要另外安装驱动的 安装需要的类库 $sudoapt-get install libusb-dev 不同的flash要在那个表单中加入一些设备相关的信息类似ID号,在程序加载的时候自动读取 芯片内部ID和这个相比较

郑朋桥的专栏 1448

虚拟机Linux访问usb设备,通过Libusb库方法实现读写usb设备所获取的实时图像数据

一、前言基于Linux 平台USB驱动开发,主要有内核驱动的开发和libusb的无驱设计;首先为什么要选第三方库Libusb,可能是基于Libusb的程序只涉及到应用层,使用起来更加方便;如果是在内核驱动,就要考虑到内核大小、内核版本的兼容,如果客户需要把你的USB模块加入他们的平台,那岂不是还要重新根据客户要求裁剪、编写内核?又假如有许多客气,而且每个客气的平台不一样,那是不是需要为每个客户定制一

psy6653的博客 1万+

基于libhid/libusb进行usb传输数据

一、libhid/libusb介绍 libusb介绍: libusb 设计了一系列的外部API 为应用程序所调用,通过这些API应用程序可以操作硬件,从libusb的源代码可以看出,这些API 调用了内核的底层接口(ioctl),和kernel driver中所用到的函数所实现的功能差不多,只是libusb更加接近USB 规范。使得libusb的使用也比开发内核驱动相对容易的多。相关资料见http...

深之JohnChen的专栏 1万+

玩转USB HID系列:Linux下使用C语言和libusb开发USB HID

玩转USB HID系列:Linux下使用C语言和libusb开发USB HID实验环境开发步骤安装libusb试试好用否我们来与HID设备通讯!探索、学习与注意:1.&ctx是个什么鬼2.print_devs(devs)->print_devs(&devs);3.操作端口这类程序加上sudo !4.libusb_interrupt_transfer这个函数是write和rea...

whstudio123的博客 1万+

Linux libusb USB开发(六)—— 扩展:windows下libusb的使用例程 (用QT C++实现)

一、具体流程 与Linux环境下一样,用libusb函数库来完成电脑与USB设备的数据交互功能,主要有以下步骤: 1)初始化libusb函数库; 2)根据vid和pid查找某一具体设备,并获取设备描述符;(vid和pid为设备的id,且每台设备的都vid和pid是唯一的) 3)根据设备描述符打开相应设备,获取设备操作符; 4)用设备操作符配置usb设备的配置模式和接口; 5)调用相应传...

爱机械的假程序猿的博客 4087

Linux USB开发:libusb开发指南

Linux USB开发:libusb开发指南 置顶2018年10月07日 20:18:44crazy_baoli阅读数 6123更多 分类专栏:LinuxUSBLinux ApplicationUSB开发 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.youkuaiyun.com/u01224...

feelinghappy的专栏 5936

linux下使用libusb获取系统usb设备具体信息

libusb简介

VizXu的博客 2万+

Linux+libusb开发用户USB无驱通讯

项目上需要将一个设备通过usb连接到电脑,怎么解决它们之间的通信是个问题。一般来说,不是通用的usb设备,则要这个设备写一个windows下的驱动,个人不会写windows下的驱动。于是在网上找到了这个使用libusb的方法。   写篇文章记录下开发过程,主要解决3个问题: ① libusb是什么? ② libusb有什么用? ③ libusb怎么用? 1. libusb是什么?libu

ymangu的专栏 1万+

如何在Linux下利用Libusb与HID USB设备通信!

由于公司的产品,导致我在Linux下写usb通信的代码出现了许多的问题,最后发现这些设备只能通过控制传输来操作设备,所以后面的问题就迎刃而解了。现在贴上当时在QT下写的代码,以防日后再碰到此类问题的时候翻查。 libusb_device **devs; libusb_device_handle *dev_handle; libusb_context *ctx=NULL;

a7082633的博客 1万+

USB - libusb

libusb 是一个用于访问 USB 设备的库,支持Linux、macOS、Windows (Vista and newer)、OpenBSD/NetBSD、Haiku、Solaris 用户空间和 WebAssembly的WebUSB等多种访问。如果你使用的是 Linux,你的发行版很可能已经包含 libusb,因此您可能只需在源代码中引用 libusb 头文件即可。它具有可移植性: 它使用单一的跨平台 API,可访问 Linux、macOS、Windows 等平台上的 USB 设备。

guoqx的专栏 1151

Linux libusb USB开发(一)—— USB设备基础概念

在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成:USB总线接口、USB逻辑设备和功能单元: a -- 这里的USB总线接口指的是USB设备中的串行接口引擎(SIE); b -- USB逻辑设备被USB系统软件看作是一个端点的集合; c -- 功能单元被客户软件看作是一个...

爱机械的假程序猿的博客 5031

Linux下libusb与hidusb的USB HID设备开发指南

hidusb库是基于libusb库,专门用于与人机接口设备(HID)类USB设备交互的库。HID设备包括键盘、鼠标、游戏控制器等,hidusb库为这些设备提供了更高级别的抽象和控制能力。libusb 是一个跨平台的 USB 库,支持在 Linux、macOS、Windows、Android 和其他操作系统上与 USB 设备进行通信。从最初发布以来,libusb 已经发展成为一个广泛使用的库,尤其在需要硬件抽象层来与 USB 设备交互的应用程序中。

weixin_36431145的博客 1639

Linux驱动学习day28(USB驱动,libusb操作)

状态切换流程图当我们将一个USB设备插入PC中,host会给USB设备上电,上电之后发出reset信号,在此过程中检测设备的速率类型(低速、全速或高速),这时候设备进入到,一个属于默认状态的USB设备其,以后这个PC机会使用地址0与这个USB设备通信,会访问地址为0的设备,访问其端点0,将新地址发送给USB设备,之后就工作于,PC会使用新地址于之通信。PC配置USB设备,使其工作于某一种配置下(,这就是设备的枚举过程。

weixin_71568456的博客 1165

安装USB驱动时出现的问题解决办法

在win7 64bit 系统下安装USB驱动出现数字签名问题的解决办法

深度学习 tesorflow2.0版本 入门第一章

为什么要学tensflow 深度学习发展迅猛 框架灵活 google开发 公司应用广泛 2.0更加灵活 后面会学习的项目 图像分类 房价预测 泰坦尼克号生存预测 文本分类 文本生成 机器翻译 核心部分 模型训练 tesorboard----> 查看模型训练进度 模型保存和部署 分布式训练-----> 加速训练速度,提升训练效率 TensorFlow常用库:Tfds, tfhub,tensor2tensor 多平台云端环境GPU:Goolgle cloud环境配置,AWS环境配置 kaggle平

weixin_46969441的博客 1236

Linux libusb USB开发(二)—— libusb安装与调试

一、libusb 下载 在官网http://libusb.info/可以下载到,如下图: 下载里面的 libusb-1.0.22.tar.bz2  二、libusb的安装  1、环境 Ubuntu 16.04  2、安装主要分3个步骤,如下: a:执行./configure来配置安装包。 b:执行make编译该安装包。 c:执行make install安装 3、具体操作流...

爱机械的假程序猿的博客 1万+

Centos7安装NVIDIA驱动并在docker容器中使用GPU

Centos7安装NVIDIA驱动并在docker容器中使用GPU

运维giao的博客 2084

嵌入式linux libusb编译,嵌入式Linux下基于libusb的USB驱动开发

对于不用的Linux内核版本,驱动程序也会有不同的版本。不利于升级和维护。Linux自带的驱动程序开发,需要对内核的重新编译,而且开发出来的驱动模块比较大。所以,如果我们能够找到一个为用户空间提供与内核版本无关的通用接口的方法,就能够不必重新改变编译好的内核,也不必为内核版本兼容性问题而头痛,只需在用户空间开发程序。这样就极大地提高了开发效率,缩短了开发周期。USB协议是目前使用最广泛的外部总线协...

weixin_42405371的博客 419

37张图详解MAC地址、以太网、二层转发、VLAN

MAC 地址 每个网卡或三层网口都有一个 MAC 地址, MAC 地址是烧录到硬件上,因此也称为硬件地址。MAC 地址作为数据链路设备的地址标识符,需要保证网络中的每个 MAC 地址都是唯一的,才能正确识别到数据链路上的设备。 MAC 地址由 6 个字节组成。前 3 个字节表示厂商识别码,每个网卡厂商都有特定唯一的识别数字。后 3 个字节由厂商给每个网卡进行分配。厂商可以保证生产出来的网卡不会有相同 MAC 地址的网卡。 现在可以通过软件修改 MAC 地址,虚拟机使用物理机网卡的 MAC 地址,并不能保.

networktp的博客 4745

无迹卡尔曼滤波(UKF)推导

提出,使用了一种不同的方法来计算误差协方差矩阵。它不使用(连续时间)黎卡提方程(Riccati Equations,形如。的一类非线性方程)或(离散时间)协方差传播和更新规律。关键的思想是基于一组特殊的样本点来估计误差协方差,这些点被称为。无迹卡尔曼滤波(Unscented Kalman Filter),最初由。点(Sigma Points),这些点直接通过原始非线性模型传播。无迹变换表示有三个特殊样本点的高斯分布,称为。

生活如此美好,致敬每一个热爱“热爱”的人! 1777

Linux libusb "LIBUSB_ERROR_ACCESS" libusb_open返回值为-3 error解决方法

Linux下libusb开发遇到如下问题 在Linux下用libusb进行usb设备打开时遇到“LIBUSB_ERROR_ACCESS  libusb_open函数返回值为-3” 此问题原因为该用户没有权限! 解决方法 第一步:执行以下命令 sudo chmod -R 777 /dev/bus/usb/ 重新运行测试程序,若还报错,执行第二步 第二步:永久修改 USB 设备权限 ...

爱机械的假程序猿的博客 1万+

拆解歌尔2718硅麦:2.75mm超小封装背后的MEMS技术解析

本文深度解析歌尔2718硅麦的2.75mm超小封装技术,探讨MEMS麦克风在微型化过程中的声学性能与结构可靠性平衡。通过ASIC芯片堆叠、纳米级应力控制等创新技术,歌尔2718在TWS耳机和智能手机中实现卓越性能,同时克服微型化带来的声学挑战。

weixin_28292761的博客 610
上一篇: Linux TTY驱动--Serial Core层
下一篇: 嵌入式车载平台的GPRS网络实现(转)
shareCode
博客等级 码龄15年 125粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值