libuvc是基于libusb的USB摄像头驱动库,vsflinux之前就做好了libusb的移植,所以基本上直接可以编译运行libuvc。
当然,实际上libuvc的代码需要做如下修改:
1. USB事件的轮询方式
void *_uvc_handle_events(void *arg) {
uvc_context_t *ctx = (uvc_context_t *) arg;
while (!ctx->kill_handler_thread)
+ {
libusb_handle_events_completed(ctx->usb_ctx, &ctx->kill_handler_thread);
+ usleep(1000);
+ }
return NULL;
}
在libuvc的轮询usb事件代码里,不使用死循环的方式轮询,增加了1ms延迟。当然最好的方式还是用poll的方式来等待事件,有事件的时候才需要轮询。
2. USB设备检测的时候,如果返回0表示没检测到USB设备,这里要返回
num_usb_devices = libusb_get_device_list(ctx->usb_ctx, &usb_dev_list);
- if (num_usb_devices < 0) {
+ if (num_usb_devices <= 0) {
UVC_EXIT(UVC_ERROR_IO);
return UVC_ERROR_IO;
}
不过,我发现不少使用libusb的代码,如果返回0都会继续。不过毕竟MCU不同,不会有这么多USB设备一直接着。
|