Elle fonctionne avec l'application pour smartphone smart life, ce qui est étonnamment pratique (on communique les informations sur le WiFi (ESSID+mot-de-passe) et ensuite, on peut voir ce que voit la caméra (connectée au WiFi) partout là où l'on a accès à Internet avec son smartphone... Ce qui n'est bien sûr possible que parce que la caméra maintient un lien avec le 'cloud' de smart connect. On a, en quelque sorte, invité un cheval de Troie sur son réseau. Et, comme le bidule est équipé d'un processeur 32 bits à 1 GHz avec 64 MB de RAM (qui se met à jour automatiquement par le réseau), ce n'est pas anodin.
Le bidule ne semble pas encore 'rootable', ni sur OpenIPC.org, ni sur thingino.com. Ce n'est probablement qu'une question de temps...
lsusb(8) ne détecte rien, l'USB-C ne semble servir qu'à l'alimentation (pas de connexion et/ou pas de logiciel?). On pourrait imaginer que le bidule est bootable via la carte µSD (mais cela reste à prouver). Le WiFi en mode infrastructure nécessite une configuration, elle se fait via Bluetooth et l'application pour smartphone 'smart life'. Une fois configuré et que la caméra a contacté le cloud TUYA, nrf connect semble indiquer que le Bluetooth n'est plus actif. Quant au WiFi, nmap(1) indique que seul le port 6668 (IRC) est ouvert...
En face avant, on trouve 3 pastilles labellées 'Rx', 'Tx' et 'Gnd' et, de fait, il y a quelque chose qui sort sur le 'Tx', d'abord observé avec pulseview(1) et un clone Saleae et ensuite avec minicom(1) (115200 8N1)
$ minicom -b 115200 -8 --capturefile=$(date +"%Y%m%d.%H%M%S").txt -D /dev/ttyUSB0
Et c'est là que l'on voit que le T23 commence par exécuter U-Boot puis, si on ne l'interrompt pas, Linux et tout le logiciel nécessaire au bon fonctionnement de la caméra. On voit même un 'login:' apparaître mais sans connaître le nom d'utilisateur et le mot de passe, ce n'est pas d'une grande utilité. Si on interrompt U-Boot (il faut être rapide; mettre sous tension en maintenant une touche enfoncée), on se retrouve avec un moniteur dans lequel on peut lancer des commandes (par exemple, 'help'). On peut inspecter la mémoire, la modifier, charger des données à partir de la FLASH et ...uploader du code à un endroit donné, par exemple, avec la commande 'loady <adresse>'; sur minicom, on fera, '<ctrl>-A S' (send), on sélectionnera [ymodem] puis le fichier à envoyer.
Sur Ubuntu,
$ sudo apt-get install gcc-7-mips-linux-gnu $ mips-linux-gnu-gcc-7 -EL -nostartfiles -nodefaultlibs -T ld_spec.txt -static -o hello_world hello_world.c $ mips-linux-gnu-objcopy -S -O binary hello_world hello_world.bin $ nm hello_world |grep main $ # avec $ $ cat ld_spec.txt SECTIONS { . = 0x80600000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } }
0x80600000, c'est là où U-Boot dit qu'il met Linux. Les I/O sont 'mappés' en mémoire et les sources de U-Boot adaptées au T23 sont sur github : ingenic-u-boot-xburst1. On troue les adresse dans arch/mips/include/asm/arch-t23/base.h, la structure dans arch/mips/include/asm/jz_uart.h et le code (polling, pas d'interruption) dans arch/mips/cpu/xburst/jz_serial.c. En quick&dirty, cela donne :
#define SERIAL_DATA ((char*)0xb0031000) /* receive/transmit reg */ #define SERIAL_LSR ((char*)0xb0031014) /* line status reg */ void my_putc(char c) { if (c == '\r') my_putc('\n'); *SERIAL_DATA = c; while ((*SERIAL_LSR & 0x60) != 0x60) /* xmit fifo not empty */ ; } char my_getc() { while (!(*SERIAL_LSR & 0x01)) /* no data ready */ ; return(*SERIAL_DATA); }Et on peut donc ainsi, imprimer 'Hello world!' avec un programme compilé localement.
Tout ceci ne sert bien sûr à rien. C'est juste un exercice amusant (et on peut vérifier qu'il y a bien 64 MB de RAM). Tout cela pour 6.95€ (maintenant, elle est à 9.95€). La suite, c'est probablement d'utiliser flashrom(8) avec un CH341A, lire le contenu de la FLASH, analyser son contenu avec binwalk(1) et voir comment aller plus loin...
Dans le moniteur de U-Boot, les commandes 'printenv' et 'setenv' laissent entrevoir la possibilité de modifier les paramètres du boot Linux et, par exemple, remplacer le 'init=linuxrc' par 'init=/bin/bash' pour contourner le 'login:'? Pour je ne sais pour quelle raison, cela ne semble pas avoir fonctionné... À ré-essayer?