描述符
USB描述符用来 描述USB硬件设备信息
分别有:
设备描述符 (重点:VID、PID、配置描述符数量)
配置描述符 (重点:接口数量)
字符串描述符
接口描述符 (重点:接口号,接口端点数量)
端点描述符 (重点:传输方向、端点号、传输方式)
API
初始化
int libusb_init_context(
libusb_context **ctx,
const struct libusb_init_option options[],
int num_options)
libusb_init_context(NULL,NULL,0)创建默认上下文
作用:初始化libusb库,创建上下文。调用其他libusb库函数之前必须先调用该函数
返回值:
成功:0
失败:LIBUSB_ERROR
void libusb_exit(libusb_context *ctx)
作用:取消libusb的初始化
要在 所有打开的设备关闭之后 调用
热插拔
回调函数指针类型
typedef int (*libusb_hotplug_callback_fn)(
libusb_context *ctx,
libusb_device *device,
libusb_hotplug_event event,
void *user_data)
int libusb_hotplug_register_callback(
libusb_context *ctx,
int events,
int flags,
int vendor_id,
int product_id,
int dev_class,
libusb_hotplug_callback_fn cb_fn,
void *user_data,
libusb_hotplug_callback_handle *callback_handle)
作用:注册usb热插拔回调函数
参数:
ctx :填NULL
events : 触发回调函数的事件 , 可以用 "|" 来让回调函数插入和拔出都触发
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED : 插入触发
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT : 拔出触发
flags:
0:不使用标志
LIBUSB_HOTPLUG_ENUMERATE:
使用这个标志,会在注册完后,对符合vendor_id 、product_id条件的 已连接设备立刻进行触发一次回调函数
vendor_id 、product_id : 如果要指定就填写usb设备的id,不指定填 LIBUSB_HOTPLUG_MATCH_ANY
dev_class :设备类,填 LIBUSB_HOTPLUG_MATCH_ANY
cb_fn : 回调函数
user_data : 传递给回调函数的实参
callback_handle :回调函数句柄,可以用于注销回调函数,也可以填写NULL
返回值:
成功:LIBUSB_SUCCESS
失败:LIBUSB_ERROR
void libusb_hotplug_deregister_callback(
libusb_context *ctx,
libusb_hotplug_callback_handle callback_handle)
作用:注销回调函数
参数:
ctx: 填NULL
callback_handle : 填注册回调函数最后参数的句柄
等待事件完成
int libusb_handle_events_completed(libusb_context *ctx ,int *completed)
作用:阻塞情况下,处理被挂起的事件
libusb_handle_events_completed(NULL,NULL);
返回值:
成功:0
失败:LIBUSB_ERROR
示例代码
热拔插
int hotplug_callback( struct libusb_context *ctx,
struct libusb_device *device,
libusb_hotplug_event event,
void *user_data)
{
if( event == LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED )
{
printf("ARRIVED\n");
}
else if( event == LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT )
{
printf("LEFT\n");
}
else
{
printf("don't know\n");
}
}
int main(int argc, char const *argv[])
{
int ret;
libusb_hotplug_callback_handle callback_handle;
ret = libusb_init_context(NULL,NULL,0);
if( ret != 0 )
{
printf("init error\n");
return -1;
}
ret = libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG);
if( !ret )
{
printf("no has hot plug\n");
return -1;
}
ret = libusb_hotplug_register_callback(NULL,
LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED|LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT,
0,
0x2a5f,
0x2005,
LIBUSB_HOTPLUG_MATCH_ANY,
hotplug_callback,
NULL,
&callback_handle);
if( ret != LIBUSB_SUCCESS )
{
printf("register error\n");
return -1;
}
while( 1 )
{
ret = libusb_handle_events_completed(NULL,NULL);
if( ret != 0 )
{
printf("completed failed: %s\n", libusb_error_name(ret));
}
}
libusb_hotplug_deregister_callback(NULL,callback_handle);
libusb_exit(NULL);
return 0;
}