2011-11-01 27 views
11

Actualmente estoy tratando de hacer interfaz con un dispositivo de audio USB desde el usuario. Actualmente tengo el dispositivo completamente enumerado y configuré la interfaz y configuré la interfaz alternativa para la interfaz alternativa de ancho de banda distinto de cero.Modo de usuario Transferencia isócrona USB de dispositivo a servidor

En primer lugar, tengo que decir que no puedo usar nada como libusb. Tengo que hacer esto a través del sistema de archivos de dispositivos USB de Linux.

Por lo que puedo ver, estoy listo para comenzar a recibir datos isócronos. Sin embargo, puedo encontrar muy poca información sobre cómo hacer una transferencia isócrona.

Por lo que puedo decir, necesito completar una estructura usbdevfs_urb, pero no estoy seguro de cómo exactamente llenar esta estructura.

Además, una vez que me he llenado esta estructura estoy en lo cierto al pensar que tengo que llamar al siguiente:

int retSubmit = ioctl(fd, USBDEVFS_SUBMITURB, &usbRequest); 

y luego una vez presenté puedo esperar a que la solicitud para completar usando

USBDEVFS_REAPURBNDELAY 

En el caso de REAPURBNDELAY, ¿cuál es exactamente el parámetro que necesito aprobar?

¿Incluso estoy ladrando en el árbol correcto?

Cualquier información sería muy apreciada.

¡Gracias de antemano!

Editar:

que intento hacer la transferencia isócrona de la siguiente manera:

usbdevfs_urb& urbRequest  = *(usbdevfs_urb*)malloc(384); 
urbRequest.type     = USBDEVFS_URB_TYPE_ISO; 
urbRequest.endpoint    = mpEndpoint->GetEndpointAddress();//mpEndpoint->GetEndpointIndex(); 
urbRequest.status    = 0; 
urbRequest.flags    = USBDEVFS_URB_ISO_ASAP; 
urbRequest.buffer    = pData; 
urbRequest.buffer_length  = 0; 
urbRequest.actual_length  = 0; 
urbRequest.start_frame   = 0; 
urbRequest.number_of_packets = 1; 
urbRequest.error_count   = 0; 
urbRequest.signr    = 0; 
urbRequest.usercontext   = pData; 

usbdevfs_iso_packet_desc* pIsoPacketDesc = &urbRequest.iso_frame_desc[0]; 
pIsoPacketDesc->length   = 384; 
pIsoPacketDesc->actual_length = 0; 
pIsoPacketDesc->status   = 0; 

Unfgortunately esto me da un error de -28 (ENOSPC).

<7>[ 3184.243163] usb 1-1: usbfs: usb_submit_urb returned -28 

No entiendo por qué no habría suficiente ancho de banda del bus USB. Solo hay 1 puerto usb y mi dispositivo es el único conectado.

¿Alguna idea?

+0

¿Por qué no puedes usar libusb? –

+0

@Jim Clay Porque la plataforma específica en cuestión es android y ya tengo un descriptor de archivo abierto y no puedo, debido a los permisos, abrir un dispositivo usando libusb ... – Goz

+0

Hola Goz, actualmente estoy tratando de resolver el mismo problema - el de las transferencias isócronas en Android, evitando libusb. ¿Hay alguna manera de publicar una muestra de código de trabajo? Mi punto de fricción actualmente son las definiciones de estructura y los valores de solicitud. ¿De dónde sacas estos? Gracias por adelantado. – Gusdor

Respuesta

5

Ok, así que resulta que el problema se debe al hecho de que el sistema operativo Android ha colocado un controlador HID para manejar los controles de HID. Esto parece bloquear el ancho de banda. Al desconectar estos controladores de las interfaces HID se libera el ancho de banda permitiendo que proceda la transferencia isócrona.

extrae el controlador del núcleo de la siguiente manera:

usbdevfs_ioctl command; 
command.ifno  = mpInterface->GetInterfaceNumber(); 
command.ioctl_code = USBDEVFS_DISCONNECT; 
command.data  = NULL; 

int ret = ioctl(fd, USBDEVFS_IOCTL, &command); 

De lo contrario lo que he hecho es correcto.

3

Entiendo que la única razón por la que no está utilizando libusb es que no puede abrir el dispositivo usb por su cuenta, pero tiene un descriptor de archivo que lo señala.

Si todo esto es correcto, ¿por qué intentas volver a implementar todo lo que hay en libusb en lugar de simplemente volver a implementar la función usb_open() que tomaría un descriptor de archivo como argumento y tu estructura usb_device *. Puede tomar la mayor parte del código del código fuente de libusb usb_open() y usar libusb para el resto.

+0

Porque entonces me falta la licencia LGPL ... – Goz

+2

No entiendo su problema con la LGPL, ¿está desarrollando un software propietario? Si este es el caso, aún puede vincularlo con una biblioteca LGPL, a diferencia de una biblioteca GPL. La única obligación que tendría, si no recuerdo mal, sería proporcionar una forma de vincularse con otra biblioteca. Si está distribuyendo un binario vinculado dinámicamente, entonces no tiene problema. Si está proporcionando un binario estáticamente vinculado, entonces deberá proporcionar el archivo objeto de su binario para que las personas puedan volver a vincularse con otra cosa fácilmente. –

+0

Lamentablemente no puedo tomar esa decisión. – Goz

1

He escrito una clase Java para la transferencia isócrona modo de usuario USB: UsbIso

Utiliza JNA para acceder a la API a través de USBFS IOCTL llama.

+0

Agradable, marcado como favorito :) – Goz

Cuestiones relacionadas