¿Qué controlador está a cargo de los botones de los auriculares en mi tableta?

Recientemente compré una tableta Lenovo Tab3 710F ( página del producto ) y estoy tratando de controlar la reproducción de música externamente con un pequeño circuito electrónico.

La idea es reproducir el mismo comportamiento que los botones que se pueden encontrar en un auricular externo que se conecta al puerto mini-jack.

Hay una página en la documentación de Android que especifica esta interfaz: Auriculares de 3,5 mm: Especificación de accesorios . En resumen, cada botón debe conectarse en serie con una resistencia de un valor determinado que permita que el dispositivo Android detecte qué botón se presionó y active la acción correspondiente.

El problema es que mi tableta realmente no responde de acuerdo con esa especificación (por ejemplo, el botón B activa la siguiente canción, en lugar de vol+). Además, el cableado de esta tableta parece estar invertido entre GND y MIC. Intenté abrir la tableta para encontrar el modelo de IC de detección de audio o auriculares, pero no tuve suerte ya que todo está sellado.

Por lo tanto, estaba pensando que tal vez podría obtener información del "software": ¿cómo puedo saber qué controlador maneja las acciones de los botones?

Entonces, la idea sería mirar el código fuente (disponible en el sitio web de Lenovo), para encontrar las diversas capacidades codificadas en el controlador, y tal vez incluso una referencia de IC que me ayudaría a ubicar la hoja de datos de IC para obtener más información.

Respuestas (1)

De acuerdo, chicos, estoy un poco sorprendido de no haber obtenido ninguna respuesta, pero supongo que se debe a que era más una pregunta de stackoverflow...

De todos modos, continué mi investigación y encontré la respuesta yo mismo, en particular gracias a este PDF que describe en detalle " La arquitectura de entrada de Android ".

El PDF proporciona todos los detalles, pero básicamente cada controlador registra input_devices con el kernel de Linux y se crea un archivo de dispositivo para cada evento en /dev/input/eventXX. Luego, hay un mecanismo de Android para enrutar esos eventos a las aplicaciones, pero esa no es la preocupación aquí.

Se puede usar el comando geteventpara obtener más información sobre estos eventos ( consulte también la documentación de Android ):

  • getevent -liproporciona una lista de los dispositivos de entrada registrados con los posibles eventos para cada dispositivo
  • getevent -lpimprime una nueva línea para cada evento recibido (el -lindicador muestra los tipos y nombres de eventos en texto sin formato en lugar de números)

Entonces, por ejemplo, en el caso de mi tableta Lenovo, encontramos que:

add device 6: /dev/input/event1
  bus:      0019
  vendor    0000
  product   0000
  version   0000
  name:     "ACCDET"
  location: ""
  id:       ""
  version:  1.0.1
  events:
    KEY (0001): KEY_VOLUMEDOWN        KEY_VOLUMEUP          KEY_HANGEUL
  KEY_NEXTSONG
                KEY_PLAYPAUSE         KEY_PREVIOUSSONG      KEY_STOPCD
  KEY_SEND
  input props:
    <none>

NOTA: Esto es solo un extracto de la salida completa, limitado a la detección de botones de auriculares.

Por lo tanto, el manejo de los botones de los auriculares parece ser realizado por algún componente "ACCDET". Ahora, todavía no he descubierto la forma "formal" de saber qué controlador registra este evento, pero al usar las palabras clave ACCDET y KEY_XX en una búsqueda de código fuente, pude encontrar el archivo fuente correspondiente (accdet.c) , que contenía la otra información que estaba buscando (a saber, los umbrales de voltaje para cada detección de botón).

Finalmente, también vale la pena señalar que uno puede simular eventos usando el sendeventscomando. Entonces, por ejemplo, para simular presionar (y soltar) el botón de reproducción/pausa, uno usaría:

sendevent /dev/input/event1 1 164 1; \
sendevent /dev/input/event1 1 164 0; \
sendevent /dev/input/event1 0 0 0

Espero que pueda ayudar a alguien más...