libusb库学习
libusb是一个使用C编写的库,它提供USB设备的通用的访问方法。APP通过它,可以方便地访问USB设备,无需编写USB设备驱动程序。
libusb源码的移植
通过网址下载源码https://github.com/libusb/libusb/releases,之后进行交叉编译。
1
| ./configure --host=arm-linux --disable-udev --prefix=/home/moss/linux/tool/libusb --CC=arm-linux-gnueabihf-gcc
|
配置完成后就可以进行编译了,
之后可以发现生成了libusb.h文件,但是缺少里面调用的usb.h文件,所以需要将usbcompat的源码包进行交叉编译。
下载usbcompat源码包
1
| ./configure --host=arm-linux --disable-udev --prefix=/home/moss/linux/tool/libusb --CC=arm-linux-gnueabihf-gcc
|
配置完以后进行编译
1 2 3
| sudo -i make make install
|
用法
libusb: 应用程序编程接口 (sourceforge.io)
libusb封装了更好用的函数,这些函数的使用可以分为5个步骤:
初始化
打开设备
移除原驱动/认领接口
传输
关闭设备

设备枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| ssize_t libusb_get_device_list (libusb_context *ctx, libusb_device ***list)
void libusb_free_device_list (libusb_device **list, int unref_devices)
uint8_t libusb_get_bus_number (libusb_device *dev)
uint8_t libusb_get_port_number (libusb_device *dev)
int libusb_get_port_numbers (libusb_device *dev, uint8_t *port_numbers, int port_numbers_len)
int libusb_get_port_path (libusb_context *ctx, libusb_device *dev, uint8_t *port_numbers, uint8_t port_numbers_len) uint8_t libusb_get_device_address (libusb_device *dev)
int libusb_get_device_speed (libusb_device *dev)
int libusb_get_max_packet_size (libusb_device *dev, unsigned char endpoint)
int libusb_get_max_iso_packet_size (libusb_device *dev, unsigned char endpoint)
void libusb_unref_device (libusb_device *dev)
int libusb_wrap_sys_device (libusb_context *ctx, intptr_t sys_dev, libusb_device_handle **dev_handle) (不常用,略) int libusb_open (libusb_device *dev, libusb_device_handle **dev_handle)
void libusb_close (libusb_device_handle *dev_handle)
libusb_device * libusb_get_device (libusb_device_handle *dev_handle)
int libusb_get_configuration (libusb_device_handle *dev_handle, int *config)
int libusb_set_configuration (libusb_device_handle *dev_handle, int configuration)
int libusb_claim_interface (libusb_device_handle *dev_handle, int interface_number)
int libusb_release_interface (libusb_device_handle *dev_handle, int interface_number)
int libusb_set_interface_alt_setting (libusb_device_handle *dev_handle, int interface_number, int alternate_setting)
int libusb_clear_halt (libusb_device_handle *dev_handle, unsigned char endpoint)
int libusb_reset_device (libusb_device_handle *dev_handle)
int libusb_kernel_driver_active (libusb_device_handle *dev_handle, int interface_number)
int libusb_detach_kernel_driver (libusb_device_handle *dev_handle, int interface_number)
int libusb_attach_kernel_driver (libusb_device_handle *dev_handle, int interface_number)
int libusb_set_auto_detach_kernel_driver (libusb_device_handle *dev_handle, int enable)
|
同步传输
1 2 3 4 5 6 7 8 9 10
| void libusb_set_debug (libusb_context *ctx, int level)
void libusb_set_log_cb (libusb_context *ctx, libusb_log_cb cb, int mode)
int libusb_set_option (libusb_context *ctx, enum libusb_option option,...)
int libusb_init (libusb_context **context)
void libusb_exit (libusb_context *ctx)
|
异步传输
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| struct libusb_transfer * libusb_alloc_transfer(int iso_packets)
void libusb_free_transfer(struct libusb_transfer *)
int libusb_submit_transfer(struct libusb_transfer *)
int libusb_cancel_transfer(struct libusb_transfer *)
uint32_t libusb_transfer_get_stream_id(struct libusb_transfer *)
*libusb_control_transfer_get_data(struct libusb_transfer *)
unsigned char *libusb_control_transfer_get_setup(const struct libusb_transfer *transfer);
void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *buffer, int length, libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout);
int libusb_handle_events_timeout(libusb_context *ctx, struct timeval *tv)
int libusb_handle_events(libusb_context *ctx)
|