Ejercicio1 Libusb
Ejercicio1 Libusb
Ejercicio1 Libusb
Software
Cliente ep15
(aplicación)
Dispositivo
epX
Cada endpoint tiene un propósito específico
(ej.: recibir comandos, transmitir datos, etc.)
Hasta 16 endpoints (solo 3 en dispositivos de
baja velocidad).
El endpoint “0” esta siempre disponible: se usa
para las inicializaciones y para obtener cuales
otros endpoints están disponibles en el
dispositivo
Cada endpoint se caracteriza por su número
(cualquier número decidido por el diseñador),
ancho de banda, tipo de modo de
transferencia, etc.
Los endpoints se agrupan en “interfaces” y estas en
“configuraciones”.
Estas entidades lógicas tienen una
representación en el código basada en
descriptores
Dos tipos de pipes:
◦ Para transportar mensajes con datos concernientes a USB
◦ Para transportar flujos (streams): con datos que solo
interesan a la aplicación y el dispositivo.
Cuatro tipos de transferencia (siempre por
paquetes):
◦ Transferencias para control: comandos o pedidos de
estado
◦ Transferencias para interrupción: iniciada por el
dispositivo para que el host haga algo
◦ Transferencias isosíncronas: para transportar datos donde
el tiempo es crítico (video, voz, etc.)
◦ Transferencias “bulk” (paquete o bulto): que usan todo el
ancho de banda pero no tienen requisitos estrictos de
tiempo
Permite comunicar una aplicación de nivel de
usuario (“userspace”) con dispositivos USB
//esto setea el nivel de "verbosidad" de las llamadas a funciones (vea que tiene disponible)
libusb_set_debug(contexto, LIBUSB_LOG_LEVEL_NONE);
//obtener la lista de dispositivos (notar la TRIPLE indireccion)
cantidad = libusb_get_device_list(contexto, &dispositivos);
if(cantidad < 0) {
cout<<"Hubo un error"<<endl;
return 1;
}
//barro la lista
for(i = 0; i < cantidad; i++) {
cout<< "Dispositivo "<< i+1 <<endl;
printdev(dispositivos[i]);
printdev(dispositivos[i]); //muestro algunos datos de los dispositivos
}
//libero la lista
libusb_free_device_list(dispositivos, 1);
//cierro la sesion
libusb_exit(contexto);
return 0;
}
Ahora la función:
void printdev(libusb_device *dev) {
libusb_device_descriptor descriptor;
//obtengo la descripcion del dispositivo
int resultado = libusb_get_device_descriptor(dev, &descriptor);
if (resultado < 0) {
cout<<"No se pudo obtener la descripcion del dispositivor"<<endl;
return;
}
cout<<"Configuraciones posibles: "<<(int)descriptor.bNumConfigurations<<" ";
cout<<"Clase de dispositivo: "<<(int)descriptor.bDeviceClass<<" ";
cout<<"Fabricante (vendorID): "<<descriptor.idVendor<<" ";
cout<<"Producto ID: "<<descriptor.idProduct<<endl;
libusb_config_descriptor *config;
libusb_get_config_descriptor(dev, 0, &config);