2012-05-06 9 views
11

Estoy tratando de escribir código Java para permitir que mi XOOM se comunique con nuestro dispositivo incorporado a través de un cable USB a serie.explicación sobre controltransferencia en android para configurar la comunicación USB

He utilizado este chunck de código:

connection.controlTransfer(0x21, 34, 0, 0, null, 0, 0); 
connection.controlTransfer(0x21, 32, 0, 0, new byte[] { (byte) 0x80, 
           0x25, 0x00, 0x00, 0x00, 0x00, 0x08 }, 7, 0); 

Sé que esto es para enviar la petición de configuración para el dispositivo USB. No entiendo por qué requestType es 0x21, por qué requestID es 32, 34, etc.

De acuerdo con las especificaciones aquí: http://www.beyondlogic.org/usbnutshell/usb6.shtml#SetupPacket, en la solicitud de dispositivo estándar, solicitud de interfaz estándar y solicitud de punto final estándar, ninguno de los requestType es 0x21 y ninguno de los requestID es 32 o 34. ¿Hay alguna explicación para estos parámetros, incluido el datebuffer transmitido?

Respuesta

20

El primer byte (bmRequestType) en el paquete de instalación se compone de 3 campos. Los primeros (menos significativos) 5 bits son el destinatario, los siguientes 2 bits son el tipo, y el último bit es la dirección.

Si tiene un valor de 0x21, tiene la representación binaria de 100001. Si lo divide en campos individuales, este es 0 01 00001, que corresponde a host-a-dispositivo, clase e interfaz, para los campos de dirección, tipo y destinatario, respectivamente.

Este es un mensaje de control que se envía a una interfaz en particular, que se define mediante una clase de usb estándar.

Ya que menciona que esto era para comunicar a un adaptador de USB a serie, voy a suponer que esto probablemente está siendo enviado a una interfaz de comunicación, según la USB Class Definitions for Communication Devices

por ese documento, un valor Brequest de 34 (0x22) corresponde a un mensaje SET_CONTROL_LINE_STATE, mientras que 32 (0x20) corresponde a un mensaje SET_LINE_CODING (páginas 51 y 53), lo que parece tener sentido como parte de la configuración/inicialización de un dispositivo serie.

Los detalles para cada uno de estos mensajes se define más abajo, en las páginas 57 y 58.

+2

Gracias Jesús. Ahora funciona. Te votaré después de obtener cuatro puntos más en mi reputación. – dan

+0

Hola. Estoy usando xamarin para desarrollar una aplicación que use este tipo de chip. En xamarin, el método ControlTransfer() da una enumeración como primer parámetro. Cada vez que llamo a esta función con estos valores, devuelve -1. ControlTransfer (UsbAddressing.Out, 0x0000, 0x0001, 0, nulo, 0, 5000); ¿Podrías ayudarme a solucionar este problema también? –

+1

@ a.toraby - siéntase libre de hacer una pregunta. Si lo desea, haga "ping me" en los comentarios para asegurarse de que lo veo – JesusFreke