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设备一直接着。
|