Android TV ODROID-C2 con Amazon Prime Video y Netflix

He estado usando un ODROID-C2 con LibreELEC durante bastante tiempo, pero me sentía muy decepcionado por la falta de compatibilidad con Amazon Prime Video y Netflix. También he estado usando un teclado/ratón inalámbrico para controlarlo, lo cual me permitía censurar a su compañero, ya que deseaba tener único un mando a distancia de TV para controlar tanto el televisor (encendido/volumen) como el ODROID-C2.

Aquí tienes el procedimiento que seguí. Doy por hecho que sabes moverte por Android, a la hora de buscar aplicaciones y realizar configuraciones, necesitarás usar Linux a través de Android Terminal Emulator.

Este procedimiento no consiste en instalar sólo Kodi, sino también Youtube TV, Amazon Prime Video, Netflix y algunas aplicaciones de Canales específicas. También te ayudara a instalar aplicaciones desde Google Playstore. Aunque Netflix no se instalaría desde Playstore, se puede descargar el APK e instalarlo. La configuración del mando a distancia lleva algo más tiempo, ya que no logre encontrar un solo tutorial en línea que detallase todo el proceso. Esperemos que este artículo ayude a otros con este tema.

El primer paso es instalar Android en una tarjeta Flash. Android para C2 se puede descargar desde https://goo.gl/cuLqSU. Cuando escribí este artículo, la v3.5 era la última versión, y esa es lo que yo usé. Descarga la imagen, descomprímela e instálala en la tarjeta flash con Etcher, que está disponible para muchos sistemas operativos, o win32diskimager que se ejecuta en Microsoft Windows, o usa la utilidad dd de Linux. Puede encontrar más información en https://goo.gl/RPyiwr.

Instala la tarjeta flash en el ODROID-C2 que tengas conectado a un televisor a través de HDMI junto con un teclado/ratón USB y enciéndelo. Tarda unos minutos, pero al final acabarás teniendo un nuevo y brillante sistema Android, y el ratón debería permitirle navegar por el sistema.

El primer paso después de arrancar Android es ajustar el overscan en la pantalla. Observé en mi televisor que faltaban todos los bordes. No podía ver la barra de notificaciones en la parte superior y los botones de la parte inferior estaban cortados en su gran mayoría. Esto se soluciona fácilmente usando la aplicación "ODROID Utility". A través de esta utilidad puede ajustar la resolución (el "autodetect" por defecto también me funciono), utilicé las flechas para ajustar el overscan y apagué el LED azul, que parpadea y distrae. Tras ajustar la configuración con esta aplicación, debes hacer clic en "Apply and Reboot", lo cual reiniciará el sistema.

El siguiente paso es instalar Google Apps para tener disponible la tienda Google Play. Utilizando el navegador por defecto, el APK de Google Apps se puede descargar desde http://opengapps.org/. En esta página yo seleccioné lo siguiente:

  • Platform: ARM
  • Android: 6.0
  • Variant: pico

Pico es la compilación mínima. También puedes intentar instalar nano y micro. Aunque no instalé el Calendario y otras aplicaciones en mi sistema, creo que funcionará.

Al pinchar en el botón de Descargar, se bajará un archivo ZIP a la carpeta de descargas. Este archivo ZIP debe tratarse como una actualización de Android y por lo tanto, se carga utilizando la misma aplicación Odroid Utility que se usó para actualizar Overscan y el LED azul. Ejecuta la aplicación Odroid Utility y haga clic en la esquina superior derecha (tres puntos). El menú que aparece tendrá la opción "Package install from storage" en el cual debes hacer clic. En la siguiente página, selecciona "File Manager" y navega hasta la carpeta de descargas donde debe seleccionar el archivo ZIP open_gapps. Se te pedirá que continúes, tras lo cual el odroid se reiniciará y se instalará Google Apps.

Una vez completada la instalación, puedes abrir la aplicación Google Play Store e instalar las siguientes aplicaciones:

  • Amazon Prime Video
  • Kodi
  • Chrome Browser
  • Pluto TV
  • Un cliente VPN (si quieres ... yo uso OpenVPN)

Aunque hay numerosas aplicaciones de video, no todas son aptas para TV. Instálalas una por una y pruébalas para asegurarse de que funcionan como esperas. Puedes desinstalar las aplicaciones que no funcionan correctamente.

Por defecto, la configuración de Android “Settings -> Security -> Untrusted Sources” está fijada en "Yes". Esto es necesario para instalar Netflix. Netflix era la única aplicación que no está disponible en Google Play Store. Sin embargo, Netflix tiene una página de ayuda con un enlace a su versión v4.16 del APK en https://goo.gl/22XXZi.

Descargué esta APK y la instalé con FileManager. Funciona bien con el mando a distancia. Hay versiones más recientes de la APK de Netflix disponibles en https://goo.gl/tkDbkz. Sin embargo, cuando las descargué, observé que no funcionaba muy bien con el mando a distancia. No tengo muy claro por qué.

La configuración de las aplicaciones es la misma en todas las plataformas. La instalación de mi Kodi se comunica con un back-end de MythTV en otro servidor que hace todas las grabaciones de LiveTV y administra mi colección de películas. Encontrar el complemento MythTV PVR fue todo un desafío en Krypton. Está en Addons-> My Addons, pero está desactivado.

Mando a distancia

Utilizo un ODROID-C2 TV con algunos televisores antiguos que heredé, cuyos mandos a distancia originales se perdieron hace mucho tiempo. Sin embargo, dispongo de algunos mandos a distancia Dish Network 3.0 IR PVR. Estos se pueden conseguir en Ebay por menos de10$. En mi opinión, estos son mandos a distancia bastante resistentes, su tacto es muy bueno y cuentas con suficientes botones para poder hacer lo que necesitas. También son "programables", ya que vienen con una lista de TVs y otros códigos de dispositivo permitiendo emular los mandos a distancia del otro fabricante.

Fue bastante fácil encontrar el código para controlar mi viejo televisor. Encender, subir volumen, bajar volumen y silenciar es todo lo que verdaderamente necesitaba. Deseaba que "Input select" funcionase para poder cambiar los puertos HDMI, pero nada de lo que probé hizo que ese botón funcionara. Afortunadamente, el ODROID-C2 es el único dispositivo de entrada que tengo, así que no es necesario cambiarlo. Si alguna vez coloco un segundo dispositivo HDMI, posiblemente será necesario volver a investigar hasta encontrar una solución viable.

El primer origen de mi frustración fue encontrar un código de dispositivo que activase todos los botones con el protocolo correcto. El ODROID-C2 utiliza el chip Amlogic S905 que contiene una interfaz para el receptor de infrarrojos. La instalación del sistema operativo Android de Hardkernel contiene el driver "amremote" integrado en el kernel (es decir, no se carga como un módulo). Por lo que el driver "amremote" solo reconoce el protocolo de infrarrojos NEC. Los códigos IR en otros protocolos (R5 / R6 o Sony) simplemente son ignorados por el driver "amremote". Si desea saber más sobre Consumer IR, visita https://goo.gl/WLgtv9.

Dotado con una lista de unos cuantos cientos de códigos, busqué un código de dispositivo de mando a distancia que enviara códigos NEC para todos los botones. Me llevé un chasco cuando descubrí que muchos dispositivos compatibles con el mando a distancia Dish Network solo enviaba códigos para un conjunto limitado de botones. Me costó bastante encontrar uno que enviase códigos para los 5 botones de navegación (arriba, abajo, izquierda, derecha y centro). Muchos códigos sólo facilitarían 3 opciones (arriba/abajo/centro o izquierda/derecha/centro), o 4 o 5 de las opciones. Finalmente encontré un reproductor de DVD Memorex (código 709) que ofrecía las 5 direcciones de navegación y todos los botones numéricos del mando a distancia. No permite enviar los códigos '*', '#', Volumen o Mute. Los códigos de Volumen y Mute son relegados al código de TV y por lo tanto, solo puedo controlar el Volumen de TV con los botones, no con el Volumen de Android.

Puesto que las "teclas numéricas" son en su gran mayoría inútiles para un TV (a excepción de los números de los canal), las reasigné en el remote.conf para realizar operaciones como son Home en Android, Subir volumen/Bajar volumen/Mute en Android y Avance Rápido/Volver atrás.

Para entender cómo una señal de IR entrante llega a la aplicación correctamente, debes tener en cuenta que hay 3 señales independientes involucradas:

  • el código IR enviado por el mando a distancia
  • el KEYCODE de Linux, y
  • el código ACTION de Android

El truco está en asignar el código IR entrante al código ACTION de Android correcto a través de un KEYCODE de Linux, y esta conversión se realiza mediante dos archivos independientes en Android:

/system/etc/remote.conf -- maps IR code to Linux KEYCODE
/system/usr/keylayout/Vendor_0001_Product_0001.kl -- maps Linux KEYCODE to Android ACTION
En mi caso, ambos archivos requirieron tratamiento, aunque procure limitar los cambios a la distribución de las teclas. Para modificar estos archivos, utilicé la aplicación Android Terminal Emulator, que me proporciona un intérprete de comandos "bash" y el editor "vi". Si no sabe usar el editor "vi", puede copiar los archivos en /storage, usar la aplicación FileManager que está instalada y editarlos usando esta App, y luego copiar de nuevo a la ubicación /system. Más adelante me valgo de "vi" y de varios comandos de Linux para hacer este trabajo.

La primera tarea es cambiar el sistema de archivos de /sistem de ReadOnly a ReadWrite para que podamos actualizar los archivos. Abre la aplicación Android Terminal Emulator y escribe:

$ su -
# mount -o remount,rw /system
El primer comando (su -) te otorga privilegios de SuperUser. La primera vez que la uses aparecerá una ventana emergente que te pregunta si esta aplicación (Android Terminal Emulator) siempre debe tener este privilegio. Yo respondí "Yes" y la hice permanente. Se supone que todos los comandos que se ejecuten se cargarán con privilegios de SuperUser. Si abandonas Android Terminal Emulator y regresas de nuevo, es posible que necesite ejecutar nuevamente el comando "su -".

El segundo comando cambiará el sistema de archivos de /system de ReadOnly a ReadWrite. A continuación, debemos editar /system/etc/remote.conf para activar la depuración. La depuración nos permitirá determinar qué códigos estamos recibiendo. Cambia "debug_enable" de "0" a "1" con vi y actívalo con remotecfg:

# vi /system/etc/remote.conf
# remotecfg /system/etc/remote.conf
Remotecfg lee el archivo remote.conf, el cual analizará los contenidos y luego enviará la información al software amremote en el kernel Linux. Esto normalmente se hace una vez en el arranque tal y como se especifica en /system/init.odroidc2.rc. Esto supone una gran ventaja, ya que podemos hacer cambios y luego activarlos de inmediato.

Con debug_enable fijado en "1", cualquier mando a distancia que envíe un protocolo NEC será detectado, y el software amremote registrará los errores en el registro log del sistema. Usaremos "dmesg" para ver el registro log del sistema. Prueba el cambio usando estos comandos:

$ dmesg -c > /dev/null # clear previous log contents
$ while sleep 1; do dmesg; dmesg -c > /dev/null; done
Con el modo "while sleep" activado, al presionar un botón en el mando a distancia debería aparecer algo como esto:
[98086.788285@0] remote: Wrong custom code is 0x7c83ff00
Los últimos cuatro dígitos del número que aparece al final del mensaje de registro log nos dicen qué tipo de mando a distancia es este (0xff00 en mi caso). El remote.conf por defecto de Android Odroid busca el código 0x4db2. No estoy seguro de cuál es la probabilidad de que cuentes con un mando a distancia con ese código si no estás utilizando el mando a distancia disponible en HardKernel (https://goo.gl/yVLVLC). Si no tiene suerte, y el mando a distancia que estás utilizando transmite 0x4db2, entonces verá algo más en dmesg. Si no ves nada en dmesg, entonces es que no está usando un mando a distancia que transmite el protocolo NEC y debe buscar otro mando a distancia (o código de dispositivo).

En mi caso, aquí es donde empecé a buscar los códigos del dispositivo Dish Network 3.0 IR investigado el dispositivo adecuado. Configuré el código del dispositivo en el mando a distancia y presioné los botones para ver si obtenía las respuestas en dmesg. Probé muchos códigos hasta que estuve lo suficientemente cerca de mis necesidades con el código 709 de DVD Memorex, que transmite el tipo de mando a distancia 0xff00.

El extenso número HEX 0x7c83ff00 es en realidad 2 trozos de información. Descomponiéndolos en bytes: 7c 83 ff 00, deberías observar que los primeros 2 bytes son complementarios entre sí (es decir, 01111100 -> 10000011 - ceros y unos invertidos). De manera similar, los 3º / 4º bytes son complementarios en muchos casos (pero no en todos). La “verdadera” información está en los bytes 2 y 3/4 (0x83 es el botón, 0xff00 es el tipo de mando a distancia).

En remote.conf, ahora es el momento de configurar el tipo de mando a distancia que estás utilizando en remote.conf configurando la entrada para "factory_code" y reemplazando el XXXX con el código de 4 dígitos que aparece arriba (ajuste el mío en 0xff000001):

$ vi remote.conf
$ remotecfg /system/etc/remote.conf
$ while sleep 1;do dmesg;dmesg -c > /dev/null;done
Tras introducir estos comandos, deberías presionar nuevamente los botones y ocurrirá una de estas dos cosas: ver un error que indique que el botón del mando a distancia no está asignado a nada, o ver información sobre la asignación del botón.
[101131.973324@0] remote: scancode is 0x00c5,invalid key is 0x0000.
or
[101214.803355@0] remote: press ircode = 0xc5
[101214.903456@0] remote: scancode = 0x74,maptable = 0,code:0x3ac5ff00
[101214.903492@0]
[101214.993555@0] remote: release ircode 0xc5
[101214.997312@0] remote: scancode = 0x74,maptable = 0,code:0x00000000
La primera sucede porque el botón 0xc5 no está en remote.cfg. La segunda ocurre cuando el botón se encuentra en remote.cfg. Si el mando a distancia que estás utilizando envía códigos similares a los del mando a distancia de Hardkernel, verás el segundo tipo de mensaje.

Aquí es donde empieza la diversión. Debes presionar cada botón y ver qué código envía, y tenerlo en cuenta. Luego debes averiguar qué quieres que haga y encontrar la acción Android en el archivo Vendor_0001_Product_0001.kl que corresponda a la acción que deseas que haga el botón. Finalmente, debes conseguir el KEYCODE de Linux desde Vendor_0001_Product_0001.kl que se usará para unirlo todo.

Estas son las acciones de ANDROID que he usado:

  • POWER -- key 116
  • HOME -- key 102
  • BACK -- key 15
  • MENU -- key 139
  • DPAD_CENTER -- key 97
  • DPAD_LEFT 1 -- key 105
  • DPAD_RIGHT -- key 106
  • DPAD_UP -- key 103
  • DPAD_DOWN -- key 108
  • VOLUME_UP -- key 115
  • VOLUME_DOWN -- key 114
  • VOLUME_MUTE -- key 113
  • MEDIA_REWIND -- key 121
  • MEDIA_FAST_FORWARD -- key 120
  • APP_SWITCH -- NO KEY available!

¡El último, "APP_SWITCH" no está en Vendor_0001_Product_0001.kl! Me llevó 2 horas solucionar el tema. Me apropié de una tecla (158, que anteriormente era BACK) actualizando Vendor_0001_Product_0001.kl con vi y cambiando "BACK" a "APP_SWITCH" en la línea correspondiente.

Ahora pégalo todo junto actualizando remote.conf en la sección key_begin/key_end y posiblemente en la sección repeat_key_begin/repeat_key_end. No suelo valerme de las repeticiones de teclas, de modo que mi sección repeat_key_begin/repeat_key_end está vacía. Tampoco suelo apoyar en la sección mouse_begin/mouse_end.

Mi archivo remote.conf resultante es así:

work_mode = 0
repeat_enable = 1
repeat_delay = 40
repeat_period = 39
release_delay = 121
debug_enable = 0
factory_code = 0xff000001
left_key_scancode = 0x88
right_key_scancode = 0xc8
up_key_scancode = 0xc9
down_key_scancode = 0xd7
ok_key_scancode = 0x8b
mouse_begin
mouse_end
key_begin
0xc5 116 # Power
0x8b 97 # Center
0xc9 103 # Up
0xd7 108 # down
0x88 105 # Left
0xc8 106 # Right
0x93 15  # cancel
0x93 15  # Info
0x81 114   # 1 -- becomes VOLUME DOWN
0x83 113   # 2 -- becomes MUTE
0xc1 115   # 3 -- becomes VOLUME UP
0x82 121   # 4 -- becomes REWIND
0x80 139   # 5 -- becomes MENU
0xc0 120   # 6 -- becomes FF
0x8d 8     # 7
0x8f 158   # 8 -- APP SWITCH
0xcd 10  # 9
0x8c 102  # 0 -- becomes HOME
key_end
repeat_key_begin
repeat_key_end
Ten en cuenta que también apagué "debug_enable" fijándolo en cero. Después de actualizar remote.conf nuevamente, escribe el siguiente comando:
$ remotecfg /system/etc/remote.conf
Ahora es el momento de probar el mando a distancia. Deberías probarlo con cada aplicación, ya que ésta puede reaccionar de forma diferente a un código en particular o ignorarlo por completo. Todavía no estoy seguro de tener todos los botones configurados correctamente, pero el sistema es funcional y amigable.

Realicé una copia de seguridad de Vendor_0001_Product_0001.kl y remote.conf copiándolos en /storage/emulated/0/Download y me aseguré de que estuvieran guardados en el sistema de archivos /system. Si actualizas Android, es posible que necesites restaurar estos archivos o tu mando a distancia no funcionará. Espero que todo esto le sea útil al menos a una persona. Probablemente necesitare sacarlo a la luz en el futuro para recordar lo que hice en su momento. Para comentarios, preguntas y sugerencias, visita el post original del foro en https://goo.gl/6sc8GU.

Be the first to comment

Leave a Reply