mirror of
https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git
synced 2025-12-02 04:41:19 +08:00
发布libusb讲解
This commit is contained in:
@@ -39,7 +39,7 @@ libusb封装了更好用的函数,这些函数的使用可以分为5个步骤
|
||||
* 传输
|
||||
* 关闭设备
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
BIN
IMX6ULL/doc_pic/12_USB/06_libusb的使用流程.tif
Normal file
BIN
IMX6ULL/doc_pic/12_USB/06_libusb的使用流程.tif
Normal file
Binary file not shown.
16
IMX6ULL/doc_pic/12_USB/07_使用libusb读取鼠标数据.md
Normal file
16
IMX6ULL/doc_pic/12_USB/07_使用libusb读取鼠标数据.md
Normal 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 |
BIN
IMX6ULL/doc_pic/12_USB/usb_20_20211008/hid1_11.pdf
Normal file
BIN
IMX6ULL/doc_pic/12_USB/usb_20_20211008/hid1_11.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user