[Démarrage du shell] J'ai essayé d'afficher le shell sur le téléviseur avec un G-cluster à carte Linux bon marché

Dans cet article

Si vous connectez le G-cluster de la carte Linux bon marché au téléviseur et que vous poignardez le clavier USB, vous pourrez afficher le shell!

output.gif

Conditions préalables

Dans l'article que j'ai posté la dernière fois, [Préparation] J'ai joué avec le G-cluster de la carte Linux bon marché (je ne sort pas l'écran) ", à partir d'un ordinateur personnel avec UART Commencez par accéder au shell G-cluster! !!

Cette fois, nous allons procéder dans le but de "permettre d'afficher des chaînes de caractères gratuites à l'écran"! (Cette fois, je ne présenterai pas Python que j'avais prévu la dernière fois. Je pourrais le faire la prochaine fois)

Même si vous dites que vous voulez afficher une chaîne de caractères, c'est ennuyeux juste d'afficher les caractères, donc j'aimerais rendre possible l'affichage d'un simple shell.

Procédure approximative

  1. Analysez diverses applications pour en savoir plus sur l'affichage de l'écran
  2. Rendre possible d'obtenir des informations à partir d'un clavier USB
  3. Ecrire un programme approprié pour être un shell

Analysez diverses applications pour en savoir plus sur l'affichage de l'écran

Quand vous entendez "mettre un shell sur l'écran", vous pourriez penser que vous pouvez passer à tty en faisant "Ctrl + Alt + F1". Mais c'est l'histoire de X. Puisque X ne fonctionne pas sur G-cluster (je veux le faire à l'avenir), je dois le faire à partir de l'écran par moi-même.

Sur le système de fichiers, il y avait un tube appelé "remotectl_pipe" qui semble être utilisé pour l'affichage à l'écran, j'ai donc essayé de faire un string avec ce nom.

Puis j'ai trouvé quelque chose comme ce qui suit

echo "firstboot $WELCOME" > /cavium/remotectl_pipe
echo 'firstboot 5' > /cavium/remotectl_pipe
echo gc_warning Firmware found > /cavium/remotectl_pipe
echo wifi_err ap > /cavium/remotectl_pipe
echo network_connect > /cavium/remotectl_pipe
echo network_disconnect > /cavium/remotectl_pipe

De cette façon, il semble que, fondamentalement, l'écran qui est toujours préparé est demandé et affiché avec un tuyau.

Ici, en appuyant sur cette commande de différentes manières, j'ai remarqué quelque chose.

Dans ʻecho gc_warning Firmware found> / cavium / remotectl_pipeici, il semble que vous puissiez librement changer la partie deFirmware found`.

C'est pourquoi vous pouvez désormais afficher n'importe quel caractère à l'écran. Vous pouvez également utiliser \ n et le japonais, il semble donc difficile de l'afficher.

Autoriser l'obtention d'informations à partir d'un clavier USB

Au niveau du noyau Linux, il existe une fonction qui se monte automatiquement lorsque vous insérez un clavier USB. Lorsque vous le poignardez, / dev / event * sera ajouté, et si vous touchez le clavier alors qu'il est ouvert avec cat, les caractères sortiront.

output2.gif

Mais ce n'est pas bien formé, donc je ne sais pas ce que c'est. J'ai essayé d'afficher le code clé sur le téléviseur. Le code est Accessing Keys from Linux Input Device Presque sur le même site, seule la partie d'affichage est modifiée.

#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <string.h>
#include <stdio.h>

static const char *const evval[3] = {
    "RELEASED",
    "PRESSED ",
    "REPEATED"
};

int main(void)
{
    const char *dev = "/dev/input/event1";
    struct input_event ev;
    ssize_t n;
    int fd;

    fd = open(dev, O_RDONLY);
    if (fd == -1) {
        fprintf(stderr, "Cannot open %s: %s.\n", dev, strerror(errno));
        return EXIT_FAILURE;
    }

    while (1) {
        n = read(fd, &ev, sizeof ev);
        if (n == (ssize_t)-1) {
            if (errno == EINTR)
                continue;
            else
                break;
        } else
        if (n != sizeof ev) {
            errno = EIO;
            break;
        }
        if (ev.type == EV_KEY && ev.value >= 0 && ev.value <= 2)
        printf("%s 0x%04x (%d)\n", evval[ev.value], (int)ev.code, (int)ev.code);
    }

    fflush(stdout);
    fprintf(stderr, "%s.\n", strerror(errno));
    return EXIT_FAILURE;
}

Vous pouvez maintenant afficher le code clé à l'écran.

output3.gif

Ecrire un programme approprié pour être un shell

Je l'ai écrit sans y penser, donc je n'ai pas implémenté de capitalisation ou de défilement, mais je peux déplacer le shell comme ça.

#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <string.h>
#include <stdio.h>

#define N 100000

static const char *const evval[3] = {
    "RELEASED",
    "PRESSED ",
    "REPEATED"
};

int main(void)
{
    const char *dev = "/dev/event1";
    // const char *dev = "/dev/input/event3";

    // ref: https://gist.github.com/rickyzhang82/8581a762c9f9fc6ddb8390872552c250
    const int keytable[127] = {' ', ' ', '1', '2', '3', '4', '5', '6', '7', '8', 
                               '9', '0', '-', '=', ' ', ' ', 'q', 'w', 'e', 'r', 
                               't', 'y', 'u', 'i', 'o', 'p', '[', ']', ' ', ' ', 
                               'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 
                               '\'', '`', ' ', '\\', 'z', 'x', 'c', 'v', 'b', 'n', 
                               'm', ',', '.', '/', ' ', '*', ' ', ' ', ' ', ' ', 
                               ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
                               ' ', ' ', ' ', ' ', '-', ' ', ' ', ' ', '+', ' ', 
                               ' ', ' ', ' ', ' ', ' ', '.', ' ', ' ', ' ', ' ', 
                               ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
                               ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
                               ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', 
                               ' ', ' ', ' ', ' ', ' ', ' ', ' '
   };
  
    struct input_event ev;
    ssize_t n;
    int fd;
    char result[N] = {'\0'};
    
    char inputing[N] = {'\0'};
    char inputkey;
    int inputi = 0;
  
    FILE *file;
	  char line[N];

    fd = open(dev, O_RDONLY);
    if (fd == -1) {
        fprintf(stderr, "Cannot open %s: %s.\n", dev, strerror(errno));
        return EXIT_FAILURE;
    }

    while (1) {
        n = read(fd, &ev, sizeof ev);
        if (n == (ssize_t)-1) {
            if (errno == EINTR)
                continue;
            else
                break;
        } else
        if (n != sizeof ev) {
            errno = EIO;
            break;
        }
        if (ev.type == EV_KEY && ev.value == 1) {
          inputkey = keytable[(int)ev.code];
          if((int)ev.code == 28) {
            sprintf(result, "%s &> cmdtmp", inputing);
            system(result);
            
            strcat(inputing, "\\n");
            file = fopen("cmdtmp", "r");
	          while(fgets(line, N, file)!=NULL){
              line[strcspn(line, "\r\n")] = 0;
		          strcat(inputing, line);
              strcat(inputing, "\\n");
	          }          
	          fclose(file);
                                   
            sprintf(result, "echo \"gc_warning > %s\" > /cavium/remotectl_pipe", inputing);
            printf("%s\n", result);
            system(result);
            
            inputing[0] = '\0';
            inputi = 0;
          } else {
            inputing[inputi] = inputkey;
            inputing[inputi+1] = '\0';
            inputi++;
            sprintf(result, "echo \"gc_warning > %s\" > /cavium/remotectl_pipe", inputing);
            printf("%s\n", result);
            system(result);
          }
          //printf("%s 0x%04x (%d)\n", evval[ev.value], (int)ev.code, (int)ev.code);
          //sprintf(result, "echo \"gc_warning %s 0x%04x (%d)\" > /cavium/remotectl_pipe", evval[ev.value], (int)ev.code, (int)ev.code);
          //sprintf(result, "echo \"gc_warning %s 0x%04x (%d)\" > remotectl_pipe", evval[ev.value], (int)ev.code, (int)ev.code);
          //system(result);
          //printf("%s\n", result);
        }
        
    }

    fflush(stdout);
    fprintf(stderr, "%s.\n", strerror(errno));
    return EXIT_FAILURE;
}

Vous pouvez maintenant déplacer la coque sur le téléviseur comme le gif au début.

à partir de maintenant

Cette fois, je ne suis honnêtement pas très satisfait car je viens d'écrire que je peux exécuter le shell et utiliser l'écran du téléviseur pour le moment.

Mon prochain objectif est d'utiliser la fonction de mise à jour du micrologiciel USB de G-cluster pour graver des images et exécuter des programmes arbitraires sans modifications matérielles. Cela prendra plus de temps, alors soyez patient. ..

Après cela, depuis que j'ai acheté une grande quantité de g-cluster, je prévois de jouer à divers "jeux" tels que les organiser comme des modules Wi-Fi à intervalles réguliers et les utiliser pour la détection de position.

Je le posterai quand des progrès seront faits! Merci beaucoup.

Recommended Posts

[Démarrage du shell] J'ai essayé d'afficher le shell sur le téléviseur avec un G-cluster à carte Linux bon marché
J'ai essayé d'enregistrer une station sur la plateforme IoT "Rimotte"
J'ai essayé de démarrer avec Bitcoin Systre le week-end
J'ai essayé d'afficher l'interface graphique sur Mac avec le système X Window
J'ai essayé de créer des taureaux et des vaches avec un programme shell
[Python] J'ai essayé de visualiser la nuit du chemin de fer de la galaxie avec WordCloud!
J'ai écrit un diagramme de configuration du système avec des diagrammes sur Docker
J'ai essayé avec les 100 meilleurs packages PyPI> J'ai essayé de représenter graphiquement les packages installés sur Python
J'ai essayé d'afficher la valeur d'altitude du DTM dans un graphique
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé d'utiliser Linux avec Discord Bot
J'ai essayé de jouer avec la calculatrice avec tkinter
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé d'installer le noyau Linux sur virtualbox + vagrant
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
[Ne pas se référer au 04.02.17] Afficher le capteur de température dans un graphique en temps réel avec rasberry pi 3
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé d'analyser les émotions de tout le roman "Weather Child" ☔️
J'ai essayé d'afficher les données du groupe de points DB de la préfecture de Shizuoka avec Vue + Leaflet
Je voulais faire fonctionner le moteur avec une tarte à la râpe, alors j'ai essayé d'utiliser la carte de commande du moteur de Waveshare
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
J'ai essayé de réécrire le serveur WEB de la 1ère édition de programmation Linux normale avec C ++ 14
J'ai essayé de notifier les informations de retard de train avec LINE Notify
[Linux] Copie des données de Linux vers Windows avec un script shell
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
J'ai essayé d'afficher l'heure et la météo d'aujourd'hui w
J'ai essayé de réintroduire Linux
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé de lancer le cluster ipython au minimum sur AWS
J'ai essayé d'écrire dans un modèle de langage profondément appris
Lors de la génération d'un grand nombre de graphiques avec matplotlib, je ne souhaite pas afficher le graphique à l'écran (environnement jupyter)
J'ai essayé de déverrouiller l'entrée 2 lock sésame d'une simple pression sur le bouton AWS IoT
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé d'utiliser "Asciichart Py" qui peut dessiner un beau graphique sur la console avec Python.
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
J'ai essayé de créer une configuration RAID logicielle SATA qui démarre le système d'exploitation sur Ubuntu Server
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10
J'ai essayé de créer un environnement de MkDocs sur Amazon Linux
J'ai essayé de décrire le trafic en temps réel avec WebSocket
J'ai essayé de résoudre l'édition du débutant du livre des fourmis avec python
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé la validation croisée basée sur le résultat de la recherche de grille avec scikit-learn
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio