Я пытаюсь установить связь с камерой, в частности с Panasonic G9, с помощью PTP (протокол передачи изображений) и библиотеки usblib .Я работаю под Ubuntu 16 с последней версией usblib.
Я пытаюсь получить дескриптор устройства камеры.однако я не могу выполнить передачу BULK OUT требуемой команды.Я продолжаю получать сообщение об ошибке при выполнении экземпляра libusb_bulk_transfer
с ошибкой -7 , что на самом деле означает Operation timed out
, и появляется следующее сообщение : Ресурс временно недоступен .Может кто-нибудь помочь мне выяснить, почему истекло время ожидания команды.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libusb-1.0/libusb.h>
#define CAMERA_IDVENDOR 0x04da
#define CAMERA_IDPRODUCT 0x2374
#define CAMERA_BINTERFACE_NUMBER 0x00
#define CAMERA_BALTERNATE_SETTING 0x00
#define CAMERA_OUT_ENDPOINT 0x01
#define CAMERA_IN_ENDPOINT 0x82
#define DATA_BUFFER_SIZE 500
int main(int argc, char *argv[])
{
libusb_device_handle *camera;
int transfer_size;
int ret;
unsigned char data[DATA_BUFFER_SIZE];
memset(data,0,DATA_BUFFER_SIZE);
libusb_init(NULL);
camera = libusb_open_device_with_vid_pid(NULL, CAMERA_IDVENDOR, CAMERA_IDPRODUCT);
if (camera == NULL)
{
perror("Failed to find Panasonic G9\n");
EXIT_FAILURE;
}
ret = libusb_reset_device( camera );
if (ret != 0)
{
printf("ret = %d\n",ret);
perror("Failed to reset USB port\n");
EXIT_FAILURE;
}
usleep(10000);
ret = libusb_clear_halt(camera,CAMERA_OUT_ENDPOINT);
if (ret != 0)
{
printf("ret = %d\n",ret);
perror("Failed to clear halt out endpoint\n");
EXIT_FAILURE;
}
ret = libusb_clear_halt(camera,CAMERA_IN_ENDPOINT);
if (ret != 0)
{
printf("ret = %d\n",ret);
perror("Failed to clear halt in endpoint\n");
EXIT_FAILURE;
}
usleep(10000);
ret = libusb_claim_interface(camera, CAMERA_BINTERFACE_NUMBER);
if (ret != 0)
{
perror("Failed to claim interface\n");
EXIT_FAILURE;
}
ret = libusb_set_interface_alt_setting(camera, CAMERA_BINTERFACE_NUMBER, CAMERA_BALTERNATE_SETTING);
if (ret != 0)
{
perror("Failed to set alternate setting\n");
EXIT_FAILURE;
}
data[0] = (unsigned char)((0x1001 & 0xFF00)>> 8);
data[1] = (unsigned char)(0x1001 & 0x00FF);
for (int i = 0; i < 18; i++)
{
printf("%02x ",data[i]);
}
printf("\n");
ret = libusb_bulk_transfer (camera, CAMERA_OUT_ENDPOINT , data, 14, &transfer_size, 1000);
if (ret != 0)
{
printf("ret = %d\n",ret);
printf("transfer_size = %d\n", transfer_size);
perror("Failed to BULK OUT transfer\n");
return EXIT_FAILURE;
}
return 0;
}
ниже я добавил вывод команды lsusb
.
Bus 004 Device 010: ID 04da:2374 Panasonic (Matsushita) Lumix Camera (PTP mode)
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 3.00
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 9
idVendor 0x04da Panasonic (Matsushita)
idProduct 0x2374 Lumix Camera (PTP mode)
bcdDevice 1.00
iManufacturer 1 Panasonic
iProduct 2 DC-G9
iSerial 3 0000000000000000000XER1809100032
bNumConfigurations 2
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 57
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 224mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 6 Imaging
bInterfaceSubClass 1 Still Image Capture
bInterfaceProtocol 1 Picture Transfer Protocol (PIMA 15470)
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 0
bMaxBurst 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 0
bMaxBurst 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 5
bMaxBurst 0
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 57
bNumInterfaces 1
bConfigurationValue 2
iConfiguration 0
bmAttributes 0xc0
Self Powered
MaxPower 2mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 6 Imaging
bInterfaceSubClass 1 Still Image Capture
bInterfaceProtocol 1 Picture Transfer Protocol (PIMA 15470)
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 0
bMaxBurst 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0400 1x 1024 bytes
bInterval 0
bMaxBurst 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 5
bMaxBurst 0
Binary Object Store Descriptor:
bLength 5
bDescriptorType 15
wTotalLength 22
bNumDeviceCaps 2
USB 2.0 Extension Device Capability:
bLength 7
bDescriptorType 16
bDevCapabilityType 2
bmAttributes 0x00000000
(Missing must-be-set LPM bit!)
SuperSpeed USB Device Capability:
bLength 10
bDescriptorType 16
bDevCapabilityType 3
bmAttributes 0x00
wSpeedsSupported 0x000e
Device can operate at Full Speed (12Mbps)
Device can operate at High Speed (480Mbps)
Device can operate at SuperSpeed (5Gbps)
bFunctionalitySupport 1
Lowest fully-functional device speed is Full Speed (12Mbps)
bU1DevExitLat 10 micro seconds
bU2DevExitLat 1023 micro seconds
Device Status: 0x0000
(Bus Powered)