Documentos de Académico
Documentos de Profesional
Documentos de Cultura
El Wii Remote, informalmente conocido como Wiimote, es el principal dispositivo de entrada de la consola Wii de Nintendo. Es un dispositivo sin cables, que usa la tecnologa estndar Bluetooth para comunicarse con la Wii. El Wiimote parte de una concepcin radicalmente distinta a los dispositivos que hemos venido explicando en el apartado anterior. Con forma de mando de television, el Wiimote incorpora acelermetros que pueden medir el movimiento que est produciendo el jugador en l. Tambin puede interaccionar con una barra de infrarrojos que aade la funcionalidad de puntero. Podemos conectarle otros dispositivos al mando, que le aaden versatilidad, para jugar a juegos que no requieran la capacidad de sentir el movimiento: un nunchuk y un controlador clsico. Por ltimo, incorpora como no, multitud de botones, y el dispositivo que marc un antes y un despus en la evolucin de los videojuegos, el D-Pad. 1
3.3. DISEO
El Wiimote es un diseo de control remoto de una sola mano, algo novedoso con respecto a los controladores tradicionales de las consolas previas. De esta forma, la sensibilidad de movimiento se hace ms intuitiva, como control remoto encaja perfectamente. Con este novedoso diseo se ayuda a uno de los objetivos de Nintendo con la salida de la Wii: acercar el mundo de los videojuegos a un perfil que no responde al clsico jugador. 2
El Wii Remote tiene un nombre de modelo genrico, usado por Nintendo, RVL-003, una referencia al nombre en clave del proyecto Wii: Revolution. El mando se comunica con la consola sin usar cables mediante una interfaz radio Bluetooth de corto alcance, de forma que es posible operar con hasta 4 controladores a una distancia de hasta 10 metros de la consola. Puede usarse ponindolo de forma horizontal y usarlo como un controlador ms clsico. Es posible incluso jugar con un mando en cada mano por ejemplo para juegos de disparo. A raz de la E3 2006 (congreso mundial de videojuegos) se realizaron algunos cambios en el Wiimote sobre el diseo previo presentado. El controlador se hizo ms alargado y se aadi un altavoz, en la parte central. Tambin se cambi la nomenclatura de la botonera y se redise el puerto de expansin.
entrada estndar. Sin embargo el mando no hace uso de los tipos de datos y descriptores HID estndar, y slo describe el formato y longitud. En realidad, el Wiimote usa un conjunto de operaciones bastante complejo, transmitidos a travs de los reports HID de salida (HID Output reports). De la misma forma, devuelve diferentes paquetes de datos a travs de reports de entrada (Input Reports), que contienen datos de sus perifricos. Recordemos que nos encontramos ante un problema de ingeniera inversa: no tenemos que disear algo, sino que tenemos algo ya diseado que puede sernos de utilidad, pero del que hay que conocer sus entresijos.
En este momento empiezan a parpadear las luces frontales y, siempre que haya un host en el alcance, conectado, mediante el protocolo Bluetooth SDP (Service Discovery Protocol), el Wiimote 4
devuelve gran cantidad de informacin que lo identifica respecto a otros dispositivos Bluetooth que pudieran estar conectados al host. Por ejemplo reporta la siguiente informacin:
Vendor ID 0x057e
Product ID 0x0306
El Wiimote no parece requerir ninguna de las caractersticas de autentificacin y encriptacin propias del estndar Bluetooth.
entrada o salida, y el tamao de la carga til para cada puerto. Como todos los dispositivos bluetooth HID, el Wiimote reporta su bloque descriptor HID cuando sea solicitado a travs del protocolo SDP. Hay que tener en cuenta que un InputReport se enva en direccin Wiimote-host, de forma que los OutputReports se envan desde el host al Wiimote. Veamos un ejemplo de report y as definir la notacin que usaremos en este apartado: (a1) 30 00 00 Representaremos entre parntesis el nmero de identificacin del report, y la carga til tal y como se describe en la secciones 7.3 y 7.4 de las especificaciones HID de BT[26]. Cada byte se escribe en hexadecimal, sin el prefijo 0x y separado por espacios. As en el ejemplo anterior (0xa1) se refiere al report ID, en este caso un paquete de datos de entrada, referido al canal 0x30, con una carga til, 0x00 0x00. En apartados siguientes se desarrollarn los perifricos que componen el mando y sus correspondiente reports asociados, aunque en los anexos se puede encontrar una lista completa de comandos. En general, podemos observar como desde el host se envan comandos de control y de peticin de informacin. El mando responde con comandos donde enva la informacin asociada al elemento solicitado.
-El bit 0 del primer byte (0x01) controla la vibracin del mando. -El bit 2 del mismo (0x04) es la bandera que activa o desactiva la caracterstica especfica asociada al Output Report, es decir, si nos referimos al altavoz del mando, si lo activamos en el Output Report asociado, activaremos el altavoz. Veamos un ejemplo para aclarar este concepto: si enviamos el siguiente report: (52) 19 04 6
Silenciaremos (con 0x04) el altavoz (al que se refiere el Report 0x19). Lo que sigue lo desilenciar: (52) 19 00 Todos los comportamiento: Output Reports siguientes tienen el mismo
(0x12), modo de envo de datos, (0x13), habilitacin del sensor de infrarrojos, (0x14), habilitacin del altavoz, (0x19), silenciar el altavoz. Pasemos ahora a estudiar cuales son los elementos y capacidades del mando a los que nos referimos y que lo hacen tan atractivo para un desarrollador de aplicaciones.
El BCM2042 es un dispositivo que, en un simple chip, integra el perfil completo, aplicaciones y la torre de protocos Bluetooth, de forma que cumple completamente con las especificaciones para dispositivos de interfaz humana del BT SIG (Special Interest Group de Bluetooth), siendo compatible con la versin 2.0, incluyendo las mejoras en el salto de frecuencia de forma adaptativa y conexin rpida, esenciales para aplicaciones con teclado y ratn en Pcs. En los anexos se incluye el DataSheet de este dispositivo, aunque las caractersticas principales que resumen lo anterior son: -Un dispositivo single-chip Bluetooth con el perfil completo de Human Interface Device y la pila de protocolos Bluetooth. -Un procesador 8051 y memorias RAM/ROM on-board. -Una solucin de coste ptimo para ratones y teclados que logra el menor coste a travs de la integracin de componentes externos. 7
El byte MM especifica el modo propiamente dicho. El modo se especifica por el identificador del output report a travs del cual se recibir. Veamos un ejemplo que aclare todo esto: (52) 12 00 33 Vemos que 0x12 es identificador de report de cambio de modo de envo de datos. Por otro lado, solicitamos un envo continuo 0x00. El byte que nos falta se ha ajustado a 0x33, de esta forma los datos llegarn a travs del Report de entrada 0x33. Tras el encendido, los datos nos llegan por defecto por el report 0x30. Por otro lado, despus de una conexin o desconexin en el puerto de expansin, se deshabilita el reporte de datos y el modo debe resetearse antes de que nuevos datos lleguen. Veamos todos los tipos de reports de entrada que transmiten datos del mando, aunque despus analizaremos significan estos datos segn el perifrico a que se refieran: nos qu
-0x30, Botones: Este modo devuelve los datos de la botonera del Wiimote, de la siguiente forma: (a1) 30 BB BB donde 30 es el ID de report, y BB son bits de la botonera. -0x31, Botones y acelermetros: Este valores de botonera y los acelermetros: (a1) 31 BB BB AA AA AA donde BB son los datos de botones y AA de los acelermetros. -0x32, Botones con 8 bytes de extensin: Junto a los datos de botones, se reciben datos del controlador del puerto de expansin conectado: (a1) 32 BB BB EE EE EE EE EE EE EE EE donde BB son los datos de botones y EE datos del controlador de extensin conectado actualmente al puerto de expansin. -0x33, Botones, acelermetros y 12 bytes de Infrarrojos: A los datos de botonera y acelermetros, se aaden 12 bytes de la cmara de IR: 9 modo devuelve los
10
(a1) 33 BB BB AA AA AA II II II II II II II II II II II II BB son los datos de botones, AA de los acelermetros e II son bytes de la cmara IR situada en el Wiimote. -0x34, Botones y 19 bytes de extensin: Similar al modo 0x32, pero con ms informacin destinada al controlador situado en el puerto de expansin: (a1) 34 BB BB EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE -0x35, Botones, acelermetros y 16 bytes de expansin: De la siguiente forma: (a1) 35 BB BB AA AA AA EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE con el mismo significado que los anteriores. -0x36, Botones con 10 bytes de IR y 9 de controlador externo: Este modo devuelve datos de los botones, junto con datos de la cmara de infrarrojos y 9 bytes del controlador conectado al puerto de expansin del Wiimote: (a1) 36 BB BB II II II II II II II II II II EE EE EE EE EE EE EE EE EE -0x37, Botones, acelermetros con 10 bytes de IR y 6 bytes de extensin: Similar al anterior pero quitamos carga de controlador externo para poder transmitir datos de acelermetros: (a1) 37 BB BB AA AA AA II II II II II II II II II II EE EE EE EE EE EE BB, botonera, AA, acelermetros, II, infrarrojos, EE, puerto de expansin. -0x3d, 21 bytes de extensin: Este modo devuelve slo datos del dispositivo conectado al puerto de expansin del Wiimo, de la siguiente forma: (a1) 37 EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE EE -0x3e/0x3f, Datos de botones, acelermetros y 36 bytes de IR entremezclados: Estos dos reports son equivalentes y devuelven alternativamente datos. Los datos se entremezclan, de forma que 10
11
la velocidad es la mitad que la de otros modos (son necesarios 2 reports). Sin embargo se devuelve mucha ms informacin: (a1) 3e BB BB AA II II II II II II II II II II II II II II II II II II (a1) 3f BB BB AA II II II II II II II II II II II II II II II II II II BB son los datos de botones, que se especificarn en el apartado sobre la botonera. AA son los datos de acelermetros, en el formato especfico que se describe en el apartado sobre acelermetros. Finalmente se reciben 36 bytes de la cmara IR.
3.4.5.1. Leyendo
Para leer datos de memoria y registros, debemos solicitarlo enviando el siguiente Output Report: (52) 17 MM FF FF FF SS SS El espacio lectura de los leer. report que se usa es el 0x17. El bit 2 de MM selecciona el de direcciones, sto es, si se borra este bit se har una de la EEPROM, mientras que activndolo hacemos una lectura registros. FF y SS son el offset y el tamao en bytes a hemos mencionado, como en otros reports, se directo de la bandera de vibracin, de forma al estado actual de vibracin, para que no se envo del comando.
Los datos leidos se devuelven a travs del Input Report 0x21 de la siguiente forma: (a1) 21 BB BB SE FF FF DD DD DD DD DD DD DD DD DD DD DD DD DD 11
12
DD DD DD BB es el estado de los botones, tal y como veremos. El motivo para recibir aqu el estado de los botones es el siguiente: mientras se realiza la lectura de memoria, el envo de otros datos se suspende temporalmente, salvo lo relacionado con la botonera que se hace de esta forma. FF es el offset del primer byte de datos devueltos. E es una bandera de error, donde algunos valores conocidos son 0 para no error, 7 cuando se intenta escribir en un registro de solo lectura y 8 cuando se pretende leer a una memoria que no existe. S es el tamao en bytes (menos uno) del paquete de datos. El valor habitual es 0xf (16 bytes), menos en el ltimo, que ser inferior si el tamao de datos solicitado no es mltiplo de 16. Los bytes DD son los datos propiamente dichos, rellenados con cero si es necesario. Si se requieren ms de 16 bytes, se recibirn mltiples paquetes.
3.4.5.2. Escribiendo
Para escribir datos, los comandos se envan al Output Report 0x16, de la siguiente forma: (52) 16 MM FF FF FF SS DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD El significado es el mismo, salvo que en este caso, el tamao mximo ser de 16 bytes.
13
memorias externas de tipo flash, aunque se ofrece la posibilidad de aadirlas para soportar nuevas caractersticas de cara a desarrolladores. En un Wiimote virgen, que no ha se ha comunicado nunca con un sistema final, la mayor parte de la memoria la encontraremos vaca, aunque los primeros bytes contienen lo que sigue:
0000: A1 AA 8B 99 AE 9E 78 30 A7 74 D3 000B: A1 AA 8B 99 AE 9E 78 30 A7 74 D3 0016: 82 82 82 15 9C 9C 9E 38 40 3E 0020: 82 82 82 15 9C 9C 9E 38 40 3E
Aunque no est del todo claro por qu se repiten las secuencias, se sabe que el ltimo bloque se refiere a datos de calibracin, mientras que el otro tiene propsitos de back-up en el caso de que hagamos actualizaciones de firmware. En concreto, los bytes que empiezan en 0x0016 y 0x0020 guardan los valores zero de los acelermetros. Hay que decir que muchos de los valores anteriores son distintos de un Wiimote a otro[1]. Los rangos conocidos en la memoria son: Comienzo 0x0000 0x002A 0x0FCA 0x12BA 0x15AA 0x16D0 Fin 0x0029 0x0FC9 0x12B9 0x15A9 0x16CF 0x16FF Longitud 0x002A 0x0FA0 0x02F0 0x02F0 0x0126 0x0030 Uso Valores de calibracin Datos de usuario Datos Mii (bloque 1) Datos Mii (bloque 2) Desconocido/sin uso Desconocido/sin uso
13
14
El Wiimote tiene varios espacios de memoria para registros que estn asociados a distintos perifricos, incluidos el altavoz, controladores de puerto de expansin y cmara de IR. En general, el primer byte de direccin especifica el perifrico que ser accedido y los 16 bits de orden menor especifican el registro concreto de dicho perifrico. Debido de nuevo al problema de ingeniera inversa en el que nos encontramos, el resto de bits tienen significado desconocido[1]. La lista siguiente: del espacio de memoria de los registros es el
3.4.6.1. Botones
En el Wiimote existen en total 12 botones, 11 de ellos en la parte frontal y un gatillo en la trasera. Cuatro de ellos corresponden a una cruceta de direccin y el resto con funciones adicionales. El botn de encendido es especial ya que es tratado de forma distinta por el Wiimote. El resto de botones son accesibles de forma independiente a travs de una mscara que es transmitida en primer lugar en la mayora de Reports de entrada. De esta forma, 14
15
si un botn es pulsado, el bit asociado est activo o si no a 0. Por defecto, el estado de la botonera lo recibiremos a travs del modo de reporte de datos dado por 0x30, y lo haremos slo cuando el estado de alguno de los botones cambie. Por ejemplo, si se pulsa el botn A, se recibe el siguiente paquete HID: (a1) 30 00 08: en este caso 30h se refiere al HID Report asociado al envo de paquete con slo estado de botones, los otros 2 Bytes no son ms que dicho estado. En este caso vemos que se ha pulsado un botn, ya que aparece el bit tercero a '1'. Los botones normales son: A, B (gatillo), cruceta de direccin con 4 botones, +, -, Home, 1 y 2. Su estado entonces lo podemos leer con una mscara de bits de 2 bytes, de la siguiente forma: Bit 0 1 2 3 4 5 6 7 Mscara 0x01 0x02 0x04 0x08 0x10 0x20 0x40 0x80 Primer byte Izquierda (D-Pad) Derecha (D-Pad) Abajo (D-Pad) Arriba (D-Pad) + Otros usos Otros usos Desconocido Segundo byte 2 1 B A Otros usos Otros usos Home
En cuanto al botn Power, cuando el Wiimote est apagado, si se pulsa el mismo, se intenta despertar la Wii que se ha sincronizado con l. De momento este mecanismo es desconocido. Si el Wiimote est encendido y conectado al sistema final, si se mantiene pulsado el botn de encendido durante unos segundos el Wiimote se apaga y solicita desconexin al sistema final, que usa este evento para apagarse.
15
16
El circuito que incorpora los acelermetros es el ADXL330 de Analog Devices[7]. Los acelermetros miden la aceleracin en un rango de -3g a 3g, donde g es el valor de la gravedad, con una sensibilidad del 10%. Para efectuar la medida, en el mando hay una estructura como la que se ilustra en la siguiente figura:
16
17
Vemos que tenemos un trozo de silicio, sujeto a un extremo y colocado entre el campo elctrico ejercido por dos capacidades. El movimiento se transmite cuando se desplaza el mando, ya que la barra de silicio queda ms cerca de alguno de los capacitores, lo que hace que el campo elctrico cambie, el cul es detectado. ste es convertido a voltage. Si el mando est en cada libre, nos mandar un report con aceleracin cero. En el resto de casos, nos mandar una aceleracin positiva. As por ejemplo, si lo colocamos horizontalmente sobre una mesa, recibiremos una aceleracin en Z igual al valor de la gravedad (9,8 m/s2). Estos valores de aceleracin nos permiten hallar la inclinacin, posicin,... Es importante considerar el estado inicial de los acelermetros, esto es, medida inicial que dan en estado de reposo y sobre la que se ajustan el resto de valores. Para ello es importante calibrar el mando antes de comenzar a usarlo. Bsicamente hay que seguir los siguientes pasos: -Poner el mando horizontalmente con el batn A arriba. Se obtienen los siguientes valores: ( x1 , y1 , z1 ) (1) hacia
( x2 , y2 , z2 )
(2)
( x3 , y3 , z3 )
(3)
Con cada paso lo que se consigue es medir el valor g en un eje, y el valor de equilibrio en los otros dos. La posicin cero se obtiene en cada eje segn (4),(5)y(6).
x0 =
x1 + x2 2
(4)
y0 =
y1 + y3 2
(5)
z0 =
Por tanto, sea
z 2 + z3 2
(6)
r r = { x, y , z}
18
r recibimos del mando, r = { x0 , y0 , z0 } el vector de datos que se corresponden con una fuerza nula en cada eje. Los factores de escala necesarios vienen dados por (7),(8)y(9).
kx =
1 x3 x0
1 y 2 y0
(7)
ky =
(8)
kz =
1 z1 z0
(9)
Una vez aplicado el factor de escala al eje correpondiente, r r r deberamos obtener respectivamente k , j e i , como vectores normalizados de aceleraciones en las posiciones de calibracin anteriormente definidas, dado que, tras el escalado, un valor unitario se corresponder con una fuerza g ejercida en esa direccin. El mando puede enviar la informacin asociada a los acelermetros, de distintas formas (junto a la informacin de distintos perifricos): --Reporte de acelermetro normal: En casi todos los modos que incluyen datos de acelermetro, los datos se reciben en 3 bytes de la siguiente forma: (a1) RR BB BB XX YY ZZ donde XX, YY y ZZ son los datos sin signo de la aceleracin en cada uno de los ejes, donde un valor de aceleracin cero equivale a 0x80. Un ejemplo podra ser: (a1) 31 40 20 86 8a a5: como se puede observar en los anexos, 31h se refiere al HID Report asociado al envo de paquete con estado de botones ms informacin de acelermetros. En concreto, los bytes 0x86 se refieren a la medida en el eje X, 0x8a en el eje Y, y 0xa5 para el eje Z. Los primeros bytes (0x40 y 0x20) del paquete se refieren al estado de los botones.
18
19
--Datos de acelermetro entremezclados: El modo de envo 0x3e/0x3f ya vimos que era distinto, ya que los datos se reciben en los 2 reports, de la siguiente forma: (a1) 3e BB BB XX (a1) 3f BB BB YY Como vemos los datos de eje X e Y se reciben en 1 byte simple, pero los datos del eje Z se codifican en los bits no usados de los bytes asociados a los botones, BB, de la siguiente forma: Bit Report ID 0x3e 0x3e 0x3f 0x3f Byte 0 1 0 1 7 6 5 4 3 2 1 0
Por otro lado, junto a la Wii, tenemos una barra sensora, consistente en 2 clusters de LED's IR que son usados por el 19
20
Wiimote para situar informacin de dnde se apunta. De esta forma, tenemos 2 fuentes de luz infrarroja, que actan como baliza, y un dispositivo que capta las seales y puede usar dicha informacin para localizar su posicin. Si se eliminara el filtro, se podra localizar cualquier objeto brillante (cualquier zona del espectro). -Inicializacin: Para iniciar seguir el siguiente proceso: la cmara IR se tiene que
-Habilitar la cmara IR del Wiimote: Activar el segundo bit en el Report 13. -Habilitar la cmara IR 2: Se procede de la misma forma con el Report nmero 1a. -Escribir 0x08 en el registro b00030. -Escribir b00000. -Escribir b00030. el el Bloque Bloque 1 2 de de sensibilidad sensibilidad en en el el registro registro
-Escribir el nmero de modo en el registro b00033. -Ajustes de Sensibilidad: La sensibilidad se controla por medio de 2 bloques de configuracin, a los que nos referimos antes. Respectivamente tienen 9 bytes y 2 bytes de longitud. Debido al problema de ingeniera inversa en el que nos encontramos, se ha encontrado [4] que las siguientes configuraciones funcionan de forma correcta: Bloque 1 00 00 00 00 00 00 90 00 C0 02 00 00 71 01 00 aa 00 64 Bloque 2 40 00 63 03
El ltimo byte de ambos bloques determina la sensibilidad intensidad, de forma que al aumentar dicho valor se reduce sensibilidad. El mando devolver datos de la mayor cantidad objetos posible cuando el ltimo byte del bloque 1 se pone con valor 41 y el segundo byte del bloque 2 a 00.
en la de el
20
21
-Formato de datos: La cmara IR devuelve diferentes conjuntos de datos describiendo los objetos que est apuntando. Cuando la cmara IR identifica un objeto, le asigna el primer slot disponible. Si el objeto se sale del campo de visin del Wiimote, su slot se marca como vaco (devuelve 0xFF), pero otros objetos conservan sus slot. Por ejemplo, si la cmara IR est siguiendo 2 objetos y el primero se sale del campo de visin, entonces se transmitiran los siguientes conjuntos de datos [vaco, segundo_objeto, vaco, vaco]. Con ms de 4 objetos visibles, la cmara conmuta rpidamente entre ellos, de forma que se permite la percepcin de ms de 4 objetos en un tiempo de respuesta relativamente rpido. Dependiendo de la cantidad de informacin relativa al sensor IR que nos manda el Wiimote tenemos los siguientes modos de funcionamiento, que como hemos visto se escogen en la inicializacin. Modo Bsico Extendido Completo Nmero de modo 1 3 5
Veamos cmo es la informacin que se manda en cada uno de los modos: -Modo bsico: En este caso se devuelve un total de 10 bytes de datos, que corresponden a la localizacin en los ejes X e Y de hasta cuatro puntos. Cada localizacin se codifica en 10 bits, con un rango en X que vara entre 0 y 1023, y de 0 a 767 para la coordenada Y. Cada par de puntos se empaqueta en 5 bytes, de forma que se transmiten 2 de estos paquetes asociados a los 4 puntos. Vemoslo de forma ms grfica como es uno de estos paquetes (codificacin de 2 objetos) en la tabla VII. -Modo extendido: En este modo, la Wiimote enva los mismos datos que se hacen en el caso anterior, adems de un valor aproximado del tamao para cada objeto. Los datos se envan en 12 bytes, 3 bytes por objeto. El tamao tiene un rango de 0 a 15 (4 bits). 21
22
Para cada objeto, el formato de los datos se representa en la tabla VIII. Bit Byte 0 1 2 3 4 Y1(9:8) X1(9:8) X2(7:0) Y2(7:0)
Tabla VII: Formato de datos IR en modo bsico
3 X1(7:0) Y1(7:0)
Y2(9:8)
X2(9:8)
-Modo completo: En el modo completo, la cmara IR devuelve incluso ms informacin: 9 bytes por objeto, que hacen un total de 36 bytes para los 4 puntos. Estos bits son repartidos entre 2 reports de entrada, 18 bytes cada uno (ver los modos de reporte de datos 0x3e/0x3f). Este modo de funcionamiento no ha sido todava desarrollado como problema de ingeniera inversa.
23
Por otro lado, los LEDs desempean otras funciones: mientras se est reconociendo el mando (sincronizacin), estos empiezan a parpadear; mientras parpadean, se iluminarn una cantidad de LEDs proporcional a la batera que le queda al mando. Es interesante de cara a nuestro programa el hecho de que el funcionamiento de los LEDs est totalmente a nuestro control: se pueden mostrar los patrones que deseemos, se puede controlar la luminosidad de los mismos,... Esto ltimo tiene un coste de ancho de banda demasiado elevado, aunque nos da una idea de la versatilidad del dispositivo. Los LEDs se controlan enviando: (52) 11 LL donde 11 se refiere, como se puede ver en los anexos al HID Report de los LEDs, y LL son bits que controlan el comportamiento de los LEDs, de la siguiente forma:
LEDs
3.4.7.1. Vibracin
El mando incorpora caractersticas de vibracin, todo gracias a un pequeo motor conectado a una aleta, de forma que empieza a vibrar cuando se activa. La vibracin puede activarse o apagarse con cualquier Output Report, de forma que si se activa el LSB del primer byte de cualquiera de ellos se activa. En otro caso se desactiva. Ya que acabamos de estudiar los LEDs, si usamos su report podemos tambin ajustar la vibracin. As si enviamos lo que sigue 23
24
encenderemos el motor de vibracin: (52) 11 01 Este detalle tiene un problema si se mira desde la siguiente perspectiva: como no hay ningn report de salida que slo afecte a la vibracin, y todos los reports afectan a la vibracin, es necesario ajustar la bandera de vibracin de forma adecuada en cada report, de forma que se eviten vibraciones accidentales.
3.4.7.3. Altavoz
El mando tiene un altavoz de baja calidad, usado para cortos y rpidos efectos de sonido mientras se juega. As por ejemplo, podemos escuchar el sonido de una pistola que dispara o una espada que se mueve. El flujo de sonido se recibe directamente desde el sistema final, donde el altavoz tiene algunos parmetros ajustables que estudiaremos a continuacin. Hay que decir que hasta ahora el conocimiento que se tiene del altavoz es escaso, de forma que el problema de ingeniera inversa no est totalmente solucionado. De hecho, prcticamente hasta la elaboracin de este documento, slo se producan sonidos distorsionados. Para el manejo del altavoz usamos 3 reports de salida, as como una pequea seccin del espacio de memoria de los registros. -El report 0x14 se usa para habilitar o deshabilitar el altavoz. Para ello activaremos o desactivaremos el segundo bit del mismo. As si enviamos el siguiente report, habilitamos el altavoz: (52) 14 04 -El report 0x19 se usa para silenciar o desilenciar el altavoz. De la misma forma, usaremos el segundo bit del mismo. Lo que sigue lo silencia: (52) 19 04 -El report 0x18 se usa para enviar los datos que sern reproducidos en el altavoz. Se pueden enviar de 1 a 20 bytes de una vez, siguiendo la siguiente estructura general: (52) 18 LL DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD DD 24
25
DD DD DD LL especifica la longitud de los datos que se transmiten, los bytes DD. La longitud se representa desplazando el valor 3 bits a la derecha. Los reports que tengan menos de 20 bytes han de ser rellenados con 0, y los datos se deben enviar a la tasa correcta. --Secuencia de inicializacin: Para iniciar la operacin del altavoz seguiremos la siguiente secuencia: 1. Habilitar el altavoz, mandando 0x04 al report 0x14. 2. Silenciarlo, mandando 0x04 al report de salida 0x19, tal y como hemos estudiado. 3. Escribir 0x01 al registro 0xa20009. 4. Escribir 0x08 al registro 0xa20001. 5. Escribir los 7 bytes de configuracin, que veremos a continuacin, cada uno en uno de los registros desde el 0xa20001 al 0xa20008. 6. Escribir 0x01 al registro 0xa20008. 7. Desilenciar el altavoz, mandando 0x00 al report 0x19. --Configuracin y formato de datos: El altavoz puede usar mltiples formatos, aunque todos ellos son muy desconocidos. De hecho si lo usamos con un PC, los drivers no pueden mantener todos los formatos. Los 7 bytes de configuracin a los que nos hemos referido antes, permiten ajustar algunos valores de altavoz, entre otras cosas el formato de audio. La estructura genrica de dicho bloque es la siguiente: 00 FF RR RR VV 00 Decimos genrica porque los bytes 0x00 no se conocen. El resto de parmetros son los siguientes: VV especifica el volumen, de forma que tenemos un volumen mximo terico de FF (255). FF configura el formato de datos de sonido. Si lo ajustamos a 0x40 se configura el altavoz en formato 8-bits PCM, mientras que si imponemos 0x00 se configura a un formato de 4 bits ADPCM. Todos ellos son muy desconocidos. RR es la tasa de muestreo, de forma que tiene que ajustarse al formato seleccionado. Veamos algunas configuraciones: 25
26 tonos en el modo
00 00 4bitADPCM.
00
0D
40
00
00:
Se
producirn
00 40 00 1A 40 00 00: Se configura a 8bit-PCM a una tasa de 1794Hz (0x1A). El formato por defecto del altavoz es actualmente desconocido, pero parece que es 4-ADPCM, con una tasa de muestreo ms flexible. Decimos parece ya que si se repiten los mismos valores de 4 bits no se comportan como esperamos. El formato de 8-bit PCM parece ms cercano al estndar, pero en este caso no se pueden usar los valores superiores de frecuencia, ya que la calidad ya no es mala sino psima. En [8] encontramos una pequea tabla (Tabla X) con algunos valores de tasa de muestreo. Valor 11 (0x0B) 12 (0x0C) 13 (0x0D) 14 (0x0E) 15 (0x0F) Frecuencia de mustreo 4000-4364 Hz 3692-4000 Hz 3429-3692 Hz 3200-3429 Hz 3000-3200 Hz
Si observamos la tabla anterior, la relacin valor-tasa de muestreo es inversamente proporcional. Si hacemos las cuentas la mxima frecuencia que podemos conseguir es de unos 7 Khz.
26
27
--Registros e inicializacin: Los controles de extensin se mapean en la direccin 0xa40000 y tiene en total 100 bytes de longitud. Los registros se pueden leer y escribir. Los datos estn encriptados. El cdigo de encriptacin se configura al principio del registro 0xa40040. Si se escribe un valor nulo, se inicia el perifrico y hace uso de un esquema de encriptacin muy sencillo. Si queremos recuperar la informacin original hemos de usar la siguiente transformacin:
decrypted_byte = (encrypted_byte XOR 0x17) + 0x17
El resultado debe truncarse a 8 bits. --Identificacin: Los ltimos 2 bytes del bloque de registros para el controlador de expansin, identifican al dispositivo concreto conectado al puerto. Si se hace una lectura de 2 bytes en el registro 0xa400fe tendremos estos bytes. Podemos encontrar los valores registrados en la tabla XI. Encriptado 0x0000 0xFFFF 0xFEFE 0xFDFD Desencriptado 0x2E2E 0xFFFF 0x0000 0x0101 Significado Nada insertado Parcialmente insertado Nunchuk conectado Controlador clsico conectado
El caso Parcialmente insertado se produce cuando el conector se pierde o hay una mala conexin. 27
28
28