发布libusb讲解

This commit is contained in:
weidongshan
2022-09-20 15:43:24 +08:00
parent 6e0770b163
commit f225b34b4e
30 changed files with 6128 additions and 72 deletions

View File

@@ -39,7 +39,7 @@ libusb封装了更好用的函数这些函数的使用可以分为5个步骤
* 传输
* 关闭设备
![image-20220919162539849](pic/54_libusb_flow.png)
![image-20220920101859185](pic/54_libusb_flow.png)
@@ -75,11 +75,11 @@ if (r == 0 && actual_length == sizeof(data)) {
### 2.2 初始化
### 2.2 初始化/反初始化
```c
/**
* 初始化libusb这个函数必须先其他libusb的函数执行
/** \ingroup libusb_lib
* 初始化libusb这个函数必须先其他libusb的函数执行
*
* 如果传入NULL那么函数内部会穿件一个默认的context
* 如果已经创建过默认的context这个context会被重新使用(不会重新初始化它)
@@ -97,6 +97,23 @@ int API_EXPORTED libusb_init(libusb_context **ctx);
程序退出前,调用如下函数:
```c
/** \ingroup libusb_lib
* 发初始化libusb
* 在关闭usb设备(libusb_close)后、退出程序前调用此函数
*
* 参数:
* ctx : context, 传入NULL表示default context
*/
void API_EXPORTED libusb_exit(libusb_context *ctx);
```
### 2.3 获取设备
可以使用`libusb_get_device_list`取出所有设备,函数接口如下:
@@ -210,10 +227,58 @@ libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(
```
### 2.6 描述符相关函数
### 2.6 detach/attach驱动
#### 2.6.1 获得设备描述符
#### 2.6.1 两种方法
```c
/** \ingroup libusb_desc
* 获得设备描述符
*
* 参数:
* dev - 哪个设备
* desc - 输出参数, 用来保存设备描述符
*
* 返回值:
* 0 - 成功, 或其他LIBUSB_ERROR错误码
*/
int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev,
struct libusb_device_descriptor *desc);
```
#### 2.6.2 获得/释放配置描述符
```c
/** \ingroup libusb_desc
* 获得指定的配置描述符
*
* 参数:
* dev - 哪个设备
* config_index - 哪个配置
* config - 输出参数, 用来保存配置描述符, 使用完毕要调用libusb_free_config_descriptor()释放掉
*
* 返回值:
* 0 - 成功
* LIBUSB_ERROR_NOT_FOUND - 没有这个配置
* 其他LIBUSB_ERROR错误码
*/
int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev,
uint8_t config_index, struct libusb_config_descriptor **config);
/** \ingroup libusb_desc
* Free a configuration descriptor obtained from
* 前面使用libusb_get_active_config_descriptor()或libusb_get_config_descriptor()获得配置描述符,
* 用完后调用libusb_free_config_descriptor()释放掉
*/
void API_EXPORTED libusb_free_config_descriptor(
struct libusb_config_descriptor *config);
```
### 2.7 detach/attach驱动
#### 2.7.1 两种方法
使用libusb访问USB设备时需要先移除(detach)设备原来的驱动程序,然后认领接口(claim interface)。有两种办法:
@@ -224,7 +289,7 @@ libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(
// 使用libusb_claim_interface时会detach原来的驱动
libusb_set_auto_detach_kernel_driver(hdev, 1);
// 给interface安装驱动程序标记这个interface已经被使用认领了
// 标记这个interface已经被使用认领了
libusb_claim_interface(hdev, interface_number);
```
@@ -234,13 +299,13 @@ libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid(
// detach原来的驱动
libusb_detach_kernel_driver(hdev, interface_number);
// 给interface安装驱动程序标记这个interface已经被使用认领了
// 标记这个interface已经被使用认领了
libusb_claim_interface(hdev, interface_number);
```
#### 2.6.2 函数原型
#### 2.7.2 函数原型
函数`libusb_detach_kernel_driver`原型如下:
@@ -331,54 +396,6 @@ int API_EXPORTED libusb_release_interface(libusb_device_handle *dev_handle,
### 2.7 描述符相关函数
#### 2.7.1 获得设备描述符
```c
/** \ingroup libusb_desc
* 获得设备描述符
*
* 参数:
* dev - 哪个设备
* desc - 输出参数, 用来保存设备描述符
*
* 返回值:
* 0 - 成功, 或其他LIBUSB_ERROR错误码
*/
int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev,
struct libusb_device_descriptor *desc);
```
#### 2.7.2 获得/释放配置描述符
```c
/** \ingroup libusb_desc
* 获得指定的配置描述符
*
* 参数:
* dev - 哪个设备
* config_index - 哪个配置
* config - 输出参数, 用来保存配置描述符, 使用完毕要调用libusb_free_config_descriptor()释放掉
*
* 返回值:
* 0 - 成功
* LIBUSB_ERROR_NOT_FOUND - 没有这个配置
* 其他LIBUSB_ERROR错误码
*/
int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev,
uint8_t config_index, struct libusb_config_descriptor **config);
/** \ingroup libusb_desc
* Free a configuration descriptor obtained from
* 前面使用libusb_get_active_config_descriptor()或libusb_get_config_descriptor()获得配置描述符,
* 用完后调用libusb_free_config_descriptor()释放掉
*/
void API_EXPORTED libusb_free_config_descriptor(
struct libusb_config_descriptor *config);
```
### 2.8 同步传输函数
@@ -504,11 +521,11 @@ int API_EXPORTED libusb_interrupt_transfer(libusb_device_handle *dev_handle,
使用libusb的异步函数时有如下步骤
* 分配:分配一个`libus_transfer`结构体
* 填充:填充`libus_transfer`结构体比如想访问哪个endpoint、数据buffer、长度等等
* 提交:提交`libus_transfer`结构体启动传输
* 处理事件:检查传输的结果,调用`libus_transfer`结构体的回调函数
* 释放:释放资源,比如释放`libus_transfer`结构体
* 分配:分配一个`libusb_transfer`结构体
* 填充:填充`libusb_transfer`结构体比如想访问哪个endpoint、数据buffer、长度等等
* 提交:提交`libusb_transfer`结构体启动传输
* 处理事件:检查传输的结果,调用`libusb_transfer`结构体的回调函数
* 释放:释放资源,比如释放`libusb_transfer`结构体
@@ -832,17 +849,11 @@ dnw是s3c2440时代的工具使用它可以从PC给开发板传输文件。
### 3.2 adb
### 3.3 openocd
### 3.2 openocd
openocd是一个开源的USB JTAG调试软件它也是使用libusb涉及USB的操作代码如下。
#### 3.3.1 找到设备
#### 3.2.1 找到设备
```c
static int cmsis_dap_usb_open(struct cmsis_dap *dap, uint16_t vids[], uint16_t pids[], const char *serial)
@@ -1184,7 +1195,7 @@ static int cmsis_dap_usb_open(struct cmsis_dap *dap, uint16_t vids[], uint16_t p
#### 3.3.2 读写数据
#### 3.2.2 读写数据
```c
static int cmsis_dap_usb_read(struct cmsis_dap *dap, int timeout_ms)

Binary file not shown.

View File

@@ -0,0 +1,16 @@
# 使用libusb读取鼠标数据 #
参考资料:
* libusb API接口https://libusb.sourceforge.io/api-1.0/
* libusb 示例https://github.com/libusb/libusb/tree/master/examples
* HID规范https://www.usb.org/sites/default/files/hid1_11.pdf (文件已经下载放在GIT仓库)
* 文档USB Human Interface Devices, https://wiki.osdev.org/USB_Human_Interface_Devices
## 1. HID协议

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.