tipo - usb type c
¿Por qué estoy recibiendo 0 bytes de datos de la salida usb de la transferencia masiva de libusb? (1)
Pulso una cámara USB con un pulso de 5v y toma una foto. Al pulsar la cámara, se envía una señal USB a un pi de frambuesa. Estoy escribiendo un programa para recolectar las imágenes enviadas por USB. A continuación está mi código para que la función comience a recibir información de la cámara después de que se active.
void opendevice()
{
libusb_device_handle* dev;
struct libusb_device_descriptor* desc;
int r;
int err;
int transfered;
libusb_init(NULL);
dev = libusb_open_device_with_vid_pid( NULL, 0x2a0b, 0x00f8);
if (dev == NULL)
{
printf("device not found/n");
}
if(libusb_kernel_driver_active(dev, 0) == 1)
{
printf("Driver active/n");
if(libusb_detach_kernel_driver(dev, 0) == 0)
{
printf("Kernel Driver Detached/n");
}
}
libusb_set_configuration(dev,1);
err = libusb_claim_interface(dev, 0);
if(err != 0)
{
printf("cannot claim interface/n");
}
unsigned char usb_data[4];
int size = sizeof(unsigned int) *1280 *960;
unsigned *data;
data = (unsigned int *)malloc(size);
r = libusb_bulk_transfer(dev, LIBUSB_ENDPOINT_IN | 0x83, usb_data, sizeof(data), &transfered, 0);
if(r == 0)
{
printf("data has been transfered/n");
}
else{
printf("error code %d/n", r);
printf("bytes transfered %d/n", transfered);
}
}
Localizo el control de desconexión del dispositivo para ver si el kernel lo está utilizando, y si es así, lo desconecto. Después de desconectarlo reclamo la interfaz y luego espero a que ocurra una transferencia dentro de la transferencia masiva. Sin embargo, nunca recibo datos de la transferencia. Incluso cuando desenchufa la cámara del puerto usb, r devuelve el valor -1 y mi transferencia es de tamaño 0. ¿Alguien puede decirme qué es lo que me falta aquí?
Avíseme si necesita más información.
Su código tiene un desbordamiento de búfer:
unsigned char usb_data[4]; // <---
int size = sizeof(unsigned int) *1280 *960;
unsigned *data; // <-- not used!
data = (unsigned int *)malloc(size);
r = libusb_bulk_transfer(dev, LIBUSB_ENDPOINT_IN | 0x83, usb_data //<
,sizeof(data), &transfered, 0)
Probablemente haya deseado utilizar "datos" como receptor en la llamada libusb_bulk_transfer()
, pero en realidad usó usb_data
que tiene solo 4 bytes de longitud.