Linux+libusb开发用户USB无驱通讯_libusb 无驱-程序员宅基地

技术标签: USB  

 项目上需要将一个自己开发的设备通过USB接口 连接到Linux系统或Android系统的设备,然后通过发送命令来控制我们的设备操作。要求做到“即插即用”,不需要再安装驱动,于是想到用libusb库来做。 
   在网上搜索了一些关于libusb的使用方法,写篇文章记录下开发过程,主要解决3个问题:
① libusb是什么?
② libusb有什么用?
③ libusb怎么用?
1. libusb是什么?libusb有什么用?
 usb驱动是内核态驱动硬件方面的东西; libusb是用户端程序封装库,是USB主机对USB设备进行操作的函数集合,有了它我们针对某型号USB设备就不用去修改比较繁琐的linux内核驱动了,方便了对设备的使用与调试。
  要使用libusb,需要在linux下安装、配置libusb环境。可以查看这篇文章:linux下libusb的安装与测试
  安装主要分为./configure ->make -> sudo make install
2. libusb怎么用?
  带着这个问题,找到了这篇文章
USB设备开发---- 基于libusb的无驱设计 ,不过这篇文章也只是简单介绍,实际写程序帮助不大。
   那对写程序帮助最大的资源是什么呢?无疑是源码。于是把 libusb-1.0.9.tar.bz2 库解压出来,然后建立一个SourceInsight工程查看源码。
  在 examples/ 下有3个示例程序,查看 dpfp.c ,然后知道了①用 libusb_init(NULL);来初始化这个libusb库;②调用 libusb_open_device_with_vid_pid();通过usb设备的vid、pid来打开我们的usb设备;返回一个struct libusb_device_handle *devh 结构。
  既然已经打开了设备,按照以前写驱动程序的步骤,下面就是进行读写操作了。但是通过在源码中查找,没有read()、write()函数。通过研究,原来它是通过transfer来进行传输,就是上面的文章中介绍的 控制传输、块传输和中断传输来完成。③于是调用 libusb_bulk_transfer()来对输出端点进行数据输出,但是返回的结果是-1. 再阅读源码,发现在传输之前要进行接口确认。④ 调用 libusb_claim_interface()确认interface,但返回-6.说是被占用了。再研究,找到了这篇文章: libusb下,多程序调用不同endpoint   ⑤被占用了,那就要调用 libusb_detach_kernel_driver()先让interface 与 kernel driver分离。然后再传输就成功鸟。

  既然要研究这个libusb库,索性就透彻一点,把网上找到的资料都整理一下,有个深刻的认识:
① 在网上找到了一篇用libusb来实现usb接口的游戏摇杆和按键与USB host通讯的文章: usb接口游戏摇杆和按键   ;文中实现了找到usb总线上的设备,通过比较vid、pid找到要通讯的设备。然后通过中断端点进行数据传输,当摇杆位置变化或者按键按下时,读取设备中断端点值。
该文章中使用的是libusb 0.1版本,现在都使用libusb 1.0版本的。它们之间有啥不同呢?
② 于是找到了这篇文章: Libusb For Linux(Android) 学习 <二> 使用API1.0 编程 ;   它与0.1 版本最明显的区别是:其function 都比0.1 API 多了个"lib"前缀.   这里的libusb_set_debug()方法比较好用。
 libusb开发者指南  ; 在这篇文章中介绍了libusb的各个API使用方法,不过也是 0.1 版本的,但是大体功能都差不多。                                               
接着一个问题又来了,libusb 怎么下载到linux设备上去用呢?
④ 这就要交叉编译了,可以查看这篇文章:Ubuntu上交叉编译libusb (1.0.9 & compat-0.1.4对旧版本兼容usb.h包和库)
说明一下:--build=i686-linux表示该软件在x86平台上被编译
                 --host=arm-linux表示该软件编译完成后在arm平台上运行
                 --prefix后面为软件安装目录

 那在Andorid平台上怎么使用libusb呢?
⑤ 可以查看这篇文章:只需 5 步移植 libusb 到 Beagleboard 上的 Android
现在Android版本上其实已经把这个libusb搞上去了,Android 喜欢把所有功能都自己实现一遍 toolbox -> busybox  bionic->gcc库 uevent+vold->udev.
那怎么操作呢?可以查看这篇文章:⑥android usb host 读写USB设备 ;还有这篇详细的介绍了操作的步骤和API的使用:⑦ Android下的USB Host介绍和开发
;还有这篇也不错: 
 

翻译Android USB HOST API  及这篇 :Android USB通信-实现lsusb

 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lqxandroid2012/article/details/78331032

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签