Меnu:


Nuestro teléfono. El Nokia N900, sigue en pleno funcionamiento hasta el día de hoy-2023 (este articulo se comenzó a escribir en el 2022), y esperamos que siga funcionando muchos años mas (siempre y cuando los operadores lo permitan, pues cada vez intentan apagar las redes celulares antiguas y concentrarse solo en las nuevas como 5G), aunque parece inevitable la migración a otro teléfono con GNU/Linux y teclado en el futuro cercano, o cuando el N900 deje de funcionar (como por ejemplo deje de conectarse a la red celular con facilidad).

De arranque fallido en maemo-leste a arranque fallido en Archlinux

Los usuarios de Maemo hemos observado como el N900 ya no tiene mayores actualizaciones desde hace varios años atrás. Algunos de los usuarios de Maemo decidieron emprender la actualización y poder correr el actual kernel de Linux en el teléfono Nokia N900. Así se inicio el proyecto maemo-leste.


https://maemo-leste.github.io/
https://leste.maemo.org/A33-TurboX-Twister

Lo que los chicos de maemo-leste están haciendo es increíble, los observamos desde la distancia. Como usuarios del N900 tradicional también conocido como freemantle, siempre anduvimos pensando como seria ejecutar Maemo en una computadora de escritorio, ya que lo logramos ejecutar en QEMU en el pasado. Llegada de las SBC. Cuando las SBC comenzaron a aparecer, estos dispositivos y los usuarios de maemo(thanks kotczarny) nos ayudaron a poder ejecutar un chroot para compilar paquetes en la SBC que luego podemos ejecutar sin problemas en el teléfono Nokia N900 (sin usar Scratchbox en x86).

El chroot para el Nokia N900 freemantle, nos hacia recordar nuestra vieja pregunta '¿como seria ejecutar maemo-leste en un SBC?', así que decidimos comprar un modulo EMMC con un adaptador a microSD , y decidimos instalarle allí el maemo-leste. Después de haber logrado crear una imagen booteable con ayuda de los chicos de maemo-leste, hicimos dd hacia el emmc+adapter, estabamos ansiosos viendo como aparecería el X y el Hildon en la pantalla HDMI, pero nada paso, solo un mensaje del kernel que decia que no podia montar el / (root).

,---- [ mensage-error-al-tratar-arrancar-kernel ]
| sunxi-mmc 1c0f000.mmc: send stop command failed
`----

Foto del emmc conectado al adaptador y un microSD en la parte inferior:






¿Que paso?. No salíamos de nuestro asombro, esto debería de funcionar sin ningún problema. Lo dejamos allí y comenzamos a usar el emmc+adapter solo como memoria USB (ello es un desperdicio, ya que hay memorias USB de 64 Gb mas baratas). Y así estuvimos por un largo tiempo. Pueden imaginar lo desilusionados que estábamos aquel día.

Ya cuando el tiempo lo permitió, decidimos poner solo Archlinux-armv7 y no maemo-leste en el emmc+adapter y volvió a fallar con archlinux-armv7 tan igual como fallo al intentar ejecutar el maemo-leste previamente. Investigando logramos encontrar casos parecidos.

Como al intentar arrancar con Archlinux el arranque tampoco fue posible, y el error era el mismo que tuvimos inicialmente cuando intentamos arrancar maemo-leste. Era obvio que no era problema del maemo-leste, sino existía un problema para que el kernel pueda reconocer el emmc+adapter debidamente. Paso bastante tiempo (meses). Hasta que lo volvimos a intentar y logramos un arranque exitoso.

Paro lograr el arranque exitoso fue necesario poner un cambio en el dts que nos permitió arrancar el Archlinux. Hasta allí todo bien. Entonces que hacemos ahora?. Volvemos a intentar poner maemo-leste?.

diff -u /tmp/sun8i-h3-orangepi-pc_5139.dts /tmp/sun8i-h3-orangepi-pc.dts
--- /tmp/sun8i-h3-orangepi-pc_5139.dts  2023-07-14 18:46:10.840974161 +0000
+++ /tmp/sun8i-h3-orangepi-pc.dts       2023-07-14 18:46:35.404384580 +0000
@@ -174,12 +174,13 @@
                        status = "okay";
                        #address-cells = <0x01>;
                        #size-cells = <0x00>;
-                       compatible = "allwinner,sun7i-a20-mmc";
+                       compatible = "allwinner,sun7i-a20-mmc\0allwinner,sun50i-h5-emmc";
                        clocks = <0x03 0x16 0x03 0x47 0x03 0x49 0x03 0x48>;
                        clock-names = "ahb\0mmc\0output\0sample";
                        vmmc-supply = <0x0b>;
                        bus-width = <0x04>;
                        cd-gpios = <0x0c 0x05 0x06 0x01>;
+                       no-1-8-v;
                        phandle = <0x3e>;
                };

Diff finished.  Fri Jul 14 18:47:04 2023

Volvemos a intentar maemo-leste?

Después de pensarlo por algunos meses la respuesta es NO, ya que el emmc+adapter, nos funciona como un disco externo para las SBC, y podemos arrancar indistintamente en un SBC orange-pi-pc así como en un SBC orange-pi-plus-2e. Todo ese espacio que es 4 veces mayor a lo que viene en el orange-pi-plus-2e (su emmc tiene solo 16GB), nos ayuda un montón, nos permite ir compilando el kernel, u otros paquetes en un segundo SBC y no en nuestro SBC que esta siempre encendido. Nos ayuda también a tener un respaldo de nuestra maquina que esta siempre encendida.

Adicionalmente cabe anotar, con respecto a la afirmación 'que con una misma microSD|SD|USB-pendrive se puede arrancar diferentes dispositivos', en este caso opipc, opiplus2e, A721, para que esto sea posible solo es necesario cambiar el binario del u-boot, el u-boot es el gestor de arranque para los SBC. En el caso de las maquinas con x86, el u-boot es el equivalente al BIOS.

Sigue siendo una tarea pendiente el maemo-leste. Intentaremos maemo-leste en un futuro. Pero ese futuro no esta tan cercano, pueden pasar varios meses e incluso años, depende mucho de nuestra disponibilidad de tiempo mas que de nuestras ganas.

Archlinux en la tableta Topwise A721

Pasa el tiempo y llegamos al kernel 5.13, el cual habilita el dtb para la tableta Topwise A721. La cual tenemos a la mano. Para ejecutar Archlinux en la tableta primero le ponemos la versión de u-boot adecuada para la tableta y luego le hacemos la misma modificación que hicimos para arrancar la opipc al dtb de la tableta Topwise A721 y debe arrancar con el emmc+adapter. Que puede salir mal?. Nada. Verdad?. Los parches para el u-boot fueron compartidos por Pascal Roeleven.

,---- [ tratando-de-arrancar-topwise-a721-nos-encontramos-nuevamente-con-el-error ]
| sunxi-mmc 1c0f000.mmc: send stop command failed
`----

Foto del emmc con el adaptador conectado a la tableta Topwise A721:



Como al intentar arrancar la tableta Topwise A721 con Archlinux esta 'No arranco', y el error era el mismo que tuvimos anteriormente cuando intentamos arrancar Archlinux en la opipc. Hicimos un parche de emergencia en el kernel y la tableta arranco. La tableta arrancaba, pero se demoraba bastante en arrancar al consultarlo con nuestros amigos del canal irc linux-sunxi(thanks apritzel). Ellos nos alcanzaron un tip para poder aumentar la velocidad. El tip consistía en cambiar la frecuencia del lector microSD. Aplicamos el tip y comenzo a arrancar mas rapido. Y también al aplicar el tip ya pudimos deshacernos de nuestro parche de emergencia.

diff -u /tmp/sun4i-a10-topwise-a721_as-was.dts /tmp/sun4i-a10-topwise-a721.dts
--- /tmp/sun4i-a10-topwise-a721_as-was.dts      2022-06-29 22:35:52.000000000 +0000
+++ /tmp/sun4i-a10-topwise-a721.dts     2023-07-04 01:39:32.000000000 +0000
@@ -413,7 +413,9 @@
                        #address-cells = <0x01>;
                        #size-cells = <0x00>;
                        vmmc-supply = <0x17>;
+                       max-frequency = <0x2625a00>;
                        bus-width = <0x04>;
                        cd-gpios = <0x18 0x07 0x01 0x01>;
+                       no-1-8-v;
                        phandle = <0x49>;
                };

Diff finished.  Fri Jul 14 18:51:00 2023

Así que aparte del tip (cambiar la frecuencia) era necesario poner una opción en el dtb que le indicara al kernel que el el lector microSD (hardware) no soporta el voltaje 1.8.

Versión de u-boot instalada en la tableta Topwise A721:

U-Boot SPL 2021.07-dirty (Nov 19 2021 - 00:54:34 +0000)


https://www.denx.de/project/u-boot/

Pascal Roeleven patch:


https://disk.yandex.com/d/jfzosuFG8gl4pg

u-boot (binario):


https://disk.yandex.com/d/Yu1li8NL89lfsQ

versión de Android instalada en la tableta

Les compartimos una foto de la tableta Topwise A721 con Archlinux el emmc+adapter y el teclado Onboard. Genial no?. Recordemos también que esta tableta vino con Android 4.04 y en el pasado la hemos migrado a 4.1.1 y creemos que seria posible con ayuda de nuestros amigos de h3droid llevarla hasta 4.4.0. ¿Eso seria interesante, verdad?




problema del kernel al apagar la tableta

Existe un inconveniente al apagar la tableta Topwise A721, no apaga completamente, así que hay que apretar el botón de encendido/apagado unos 10s, para que apague completamente la tableta (ahora que si tienen en osciloscopio a la mano, el osciloscopio les ayudaría). Dicho inconveniente ya esta resuelto en el kernel 6.1. Pero cuando intentamos arrancar la tableta con el kernel 6.1. La tableta no pudo arrancar. No hemos dispuesto del tiempo suficiente para depurar este problema debidamente aun.

Link al hilo de la lista de correo, donde se discutía la razón de que no apagara la tableta debidamente:


https://lore.kernel.org/linux-sunxi/9f8a0fc3-1d9a-b271-3c26-4f7373b8a3e9@gmail.com/

Tableta Topwise A721 conectada con un teclado bluetooth (ver foto rmail abajo):




reproducción de vídeo

Comentarles que con mainline y mesa la reproducción de un vídeo en la tableta Topwise A721 no es posible, ya que hay una des-sincronizacion entre el audio y la imagen. Los amigos de maemo-leste si lograron reproducir un vídeo usando el maemo-leste en una tableta con un chip A33, la Topwise A721 tiene el chip A10, sin embargo ambas tabletas comparten el mismo GPU mali-400. El comando que usaron en ese vídeo era el mpv con la opción '-vo=gpu'. Hemos intentando encontrar el video mencionado nuevamente sin éxito, ya que queríamos probar dicha opción en la tableta Topwise A721 con Archlinux y el emmc+adapter.

agregando adaptador bluetooth a la tableta (Mejora)

Recordemos que esta tableta por defecto no tiene adaptador bluetooth incluido (Pero ahora que ya tenemos instalado el GNU/Linux solo le ponemos un adaptador y ya le agregamos bluetooth).

En realidad, aparte de conector el adaptador bluetooth al único puerto Usb de la tableta, tenemos un script que inicia el servicio bluetooth y también crea una red NAP, además de ello en el onehandmenu (que se inicia por defecto al encender la tableta) existe un comando para conectarse a nuestro teclado bluetooth en caso de que la tableta Topwise A721 no haya sido el ultimo dispositivo bluetooth al que este teclado se conecto

script que configura el bluetooth dongle:

#!/bin/sh

# check bnap
if ! btmgmt info | grep '0 items' > /dev/null 2>&1 && ! ip addr show  | grep pan0  > /dev/null 2>&1; then
    MYIP=10.1.24.1 # also on above (ip see mybr on bashrc)
    pactl unload-module module-bluetooth-discover; pactl load-module module-bluetooth-discover # check pactl is available
    sudo brctl addbr pan0; sudo brctl setfd pan0 0; sudo brctl stp pan0 off; sudo ip addr add $MYIP/24 dev pan0; sudo ip link set pan0 up
    sudo systemctl start bluetooth # bt on systemctl should not be enabled
    echo -e "power on" | bluetoothctl
    # below is manual not enabled
    systemctl --user start peru-nap-bt-network.service
    MYIP2=$(echo $MYIP | awk -F '.' '{printf("%d.%d.%d.%d", $1, $2, $3,0)}') # also on above (ip see mybr on bashrc)
    sudo bash -c "echo 1  > /proc/sys/net/ipv4/ip_forward"
    sudo iptables -t nat -A POSTROUTING -s $MYIP2/24 -j MASQUERADE
    # doing manually by now, 4 receiving files. should be an automatic way on systemd
    sudo sed -i -e 's/ExecStart=\/usr\/lib\/bluetooth\/obexd$/ExecStart=\/usr\/lib\/bluetooth\/obexd -a/g' /usr/lib/systemd/user/obex.service #for always receiving files
    systemctl --user start obex #{/usr/lib/systemd/user/obex.service; ~/.config/systemd/}
    #sh ~/manual_autostart.sh; # try to work with this on .config/openbox/autostart.sh
    # rm some lines (@worstCase next startup dnsmasq would be ok) {this is just 4 headless}
    #sudo sed -i '/interface=w/,$d' /etc/dnsmasq.conf
else
    if ! btmgmt info | grep '0 items' > /dev/null 2>&1 && ip addr show  | grep pan0  > /dev/null 2>&1; then
        sudo systemctl start bluetooth # bt on systemctl should not be enabled
        echo -e "power on" | bluetoothctl
        # below is manual not enabled
        systemctl --user start peru-nap-bt-network.service
    fi
fi

Como la tableta Topwise A721 no fue pensada para usar un emmc+adapter, y la entrada microSD viene en la parte inferior del dispositivo, no podríamos apoyar la tableta en una superficie plana de esta manera, así que para poder apoyar la tableta en una superficie plana, debemos rotarla, al rotar físicamente la tableta, también necesitamos rotar el vídeo que se muestra en la pantalla LCD de la tableta.

Para invertir el vídeo de la tableta es necesario ejecutar el siguiente comando:

~ $ xrandr -o 2; xinput set-prop "generic ft5x06 (91)" 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1;

Como en el Nokia N800, nosotros podíamos escuchar musica, estar en los chat y también escribir correos. Podemos hacer lo mismo con la tableta Topwise A721. Pero al intentarlo nos dimos cuenta que necesitamos activar el audio primero.

Comando para activar el audio, que esta desactivado por defecto.

~ $ amixer -c0 cset numid=17 1; amixer -c0 cset numid=15 1; amixer -c0 cset numid=1 50;

Foto del Nokia N900 y la tableta Topwise A721 un dispositivo al lado del otro.




sobre los botones de la tableta

Hicimos un driver usando libevdev, pero no funcionaba adecuadamente, igual se los compartiremos, podría servir de referencia.

Prueba del concepto del driver para los botones de la tableta Topwise A721:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <libevdev.h>
// cc -I /usr/include/libevdev-1.0/libevdev/ -o remapping_touch.out -l evdev
int main (int argc, char **argv) {
  struct libevdev *dev = NULL;
  char buf[256];
  char text[8];
  int fd;
  int rc = 1;
  int flag_tracking_sequential, flag_position_value, flag_touch_one, flag_x_value, flag_tracking_minus_one; //flag_touch_zero
  int x_val;

  sprintf (text, "%s", argv[1]);
  strncpy (buf, "/dev/input/event", 16);
  buf [16] = text[0];
  buf [17] = 0;
  fprintf (stdout, "%s", buf);
  fd = open (buf, O_RDONLY|O_NONBLOCK);
  rc = libevdev_new_from_fd(fd, &dev);
  if (rc < 0) {
    fprintf(stderr, "Failed to init libevdev (%s)\n", strerror(-rc));
    exit(1);
  }
  printf("Input device name: \"%s\"\n", libevdev_get_name(dev));
  printf("Input device ID: bus %#x vendor %#x product %#x\n",
         libevdev_get_id_bustype(dev),
         libevdev_get_id_vendor(dev),
         libevdev_get_id_product(dev));
  flag_tracking_sequential = flag_position_value = flag_touch_one = flag_x_value = flag_tracking_minus_one = 0;
  do {
    struct input_event ev;
    rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
    if (rc == 0) {
      if (ev.type == 3 && ev.code == 57 && ev.value > 0) {
        flag_tracking_sequential = 1;
      }
      if (flag_tracking_sequential && ev.type == 3 && ev.code == 53 ) {
        flag_position_value = 1;
        x_val = ev.value;
      } // the second time button is pressed, NO x_position comes, so for now change button
      if (flag_position_value && ev.type == 1 && ev.code == 330 && ev.value == 1 ) {
        flag_touch_one = 1;
      }

      if (flag_touch_one && ev.type == 3 && ev.code == 0 && ev.value == x_val ) {
        flag_x_value = 1;
      }

      if (flag_x_value && ev.type == 3 && ev.code == 57 && ev.value == -1) {
        flag_tracking_minus_one = 1;
      }
      if (flag_tracking_minus_one && ev.type == 1 && ev.code == 330 && ev.value == 0 ) {
        if (x_val > 699)
            system ("xdotool key Alt+F3");
        flag_tracking_sequential = flag_position_value = flag_touch_one = flag_x_value = flag_tracking_minus_one = 0;
      }
      if ( (ev.type == 3 && ev.code == 54) || (ev.type == 3 && ev.code == 1) ) {
        flag_tracking_sequential = flag_position_value = flag_touch_one = flag_x_value = flag_tracking_minus_one = 0;
      }
    }
    usleep(250 * 1000);// a quarter second {1000 *250}
  } while (rc == 1 || rc == 0 || rc == -EAGAIN);
} //main

unas fotos de algunos de nuestros aplicativos ejecutándose en la tableta

Foto del aplicativo OneHandMenu:



Foto de Timeline:



Foto de Faena:



Foto de lyricus-mode on emacs tui:



Foto de lyricus-mode on emacs X-frame:



Foto de rmail y un mbox file:



Conclusión

Porque y para que hemos hecho este experimento, cual podría ser la utilidad en un futuro?. En nuestro caso podríamos usar la tableta para hacer demos de nuestros productos.

Además de que estamos reutilizando un producto que caería en desuso, que imagino ya muchas personas no usan y tienen abandonados en sus hogares, si es que no han sido ya enviados al reciclaje. Así nos ayudamos como sociedad a no generar tanta basura. Aunque con Android aun es posible usar esta tableta con RadioDroid para escuchar streams de musica.

casi olvidandonos: sobre arranque exitoso usando fel-mode

En kipuamutay también hemos tenido éxito usando fel-mode para arrancar la SBC opipc usando un disco externo conectado por USB.

Last change: 18.07.2023 10:29

blog comments powered by Disqus