[Shell-Start] Ich habe versucht, die Shell mit einem billigen Linux-Board-G-Cluster auf dem Fernseher anzuzeigen

In diesem Artikel

Wenn Sie das billige G-Cluster der Linux-Karte an den Fernseher anschließen und die USB-Tastatur drücken, können Sie die Shell anzeigen!

output.gif

Voraussetzungen

In dem Artikel, den ich das letzte Mal gepostet habe, [Vorbereitung] habe ich mit dem billigen Linux-Board-G-Cluster gespielt (keine Bildschirmausgabe) ", von einem PC mit UART Beginnen Sie mit dem Zugriff auf die G-Cluster-Shell! !!

Dieses Mal werden wir mit dem Ziel fortfahren, "freie Zeichenfolgen auf dem Bildschirm anzuzeigen"! (Dieses Mal werde ich Python nicht vorstellen, das ich das letzte Mal geplant habe. Ich kann es das nächste Mal tun.)

Selbst wenn Sie sagen, dass Sie eine Zeichenfolge anzeigen möchten, ist es langweilig, nur die Zeichen anzuzeigen. Daher möchte ich die Anzeige einer einfachen Shell ermöglichen.

Grobe Prozedur

  1. Analysieren Sie verschiedene Apps, um Informationen zur Bildschirmanzeige zu erhalten
  2. Machen Sie es möglich, Informationen von einer USB-Tastatur abzurufen
  3. Schreiben Sie ein geeignetes Programm als Shell

Analysieren Sie verschiedene Apps, um mehr über die Bildschirmanzeige zu erfahren

Wenn Sie "Eine Shell auf den Bildschirm legen" hören, denken Sie möglicherweise, dass Sie mit "Strg + Alt + F1" zu tty wechseln können. Aber das ist die Geschichte auf X. Da X nicht auf G-Cluster ausgeführt wird (ich möchte es in Zukunft tun), muss ich es selbst vom Bildschirm aus erstellen.

Im Dateisystem gab es eine Pipe mit dem Namen "remotectl_pipe", die anscheinend für die Bildschirmanzeige verwendet wird. Deshalb habe ich versucht, mit diesem Namen zu arbeiten.

Dann fand ich so etwas wie das Folgende

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

Auf diese Weise scheint es, dass im Grunde der Bildschirm, der immer vorbereitet ist, angefordert und mit einer Pipe angezeigt wird.

Während ich diesen Befehl auf verschiedene Arten drückte, bemerkte ich hier etwas.

In echo gc_warning Firmware found> / cavium / remotectl_pipe hier scheint es, dass Sie den Teil von Firmware found frei ändern können.

Deshalb können Sie jetzt jedes Zeichen auf dem Bildschirm anzeigen. Sie können auch \ n und Japanisch verwenden, daher scheint es schwierig zu sein, es anzuzeigen.

Ermöglichen, dass Informationen von einer USB-Tastatur abgerufen werden

Auf Linux-Kernel-Ebene gibt es eine Funktion, die beim Einstecken einer USB-Tastatur automatisch aktiviert wird. Wenn Sie es tatsächlich erstechen, wird / dev / event * hinzugefügt, und wenn Sie die Tastatur berühren, während sie mit cat geöffnet ist, werden Zeichen ausgegeben.

output2.gif

Aber es ist nicht gut geformt, also weiß ich nicht, was es ist. Ich habe versucht, den Schlüsselcode auf dem Fernseher anzuzeigen. Der Code lautet Zugriff auf Schlüssel vom Linux-Eingabegerät Fast dieselbe Site, nur der Anzeigeteil wird geändert.

#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;
}

Sie können jetzt den Schlüsselcode auf dem Bildschirm anzeigen.

output3.gif

Schreiben Sie ein geeignetes Programm als Shell

Ich habe es geschrieben, ohne darüber nachzudenken, also habe ich weder Groß- oder Kleinschreibung noch Bildlauf implementiert, aber ich kann die Shell so verschieben.

#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;
}

Jetzt können Sie die Shell auf dem Fernseher wie das GIF am Anfang bewegen.

von jetzt an

Dieses Mal bin ich ehrlich gesagt nicht sehr zufrieden, weil ich gerade geschrieben habe, dass ich die Shell ausführen und vorerst den Fernsehbildschirm verwenden kann.

Mein nächstes Ziel ist es, die USB-Firmware-Aktualisierungsfunktion von G-Cluster zu verwenden, um Bilder zu brennen und beliebige Programme ohne Hardwaremodifikationen auszuführen. Es wird länger dauern, bitte haben Sie etwas Geduld. ..

Da ich eine große Menge an G-Cluster gekauft habe, plane ich danach, verschiedene "Spiele" zu spielen, z. B. sie in regelmäßigen Abständen als Wi-Fi-Module anzuordnen und zur Positionserkennung zu verwenden.

Ich werde es veröffentlichen, wenn Fortschritte erzielt wurden! Vielen Dank.

Recommended Posts

[Shell-Start] Ich habe versucht, die Shell mit einem billigen Linux-Board-G-Cluster auf dem Fernseher anzuzeigen
Ich habe versucht, einen Sender auf der IoT-Plattform "Rimotte" zu registrieren.
Ich habe am Wochenende versucht, mit Bitcoin Systre zu beginnen
Ich habe versucht, die GUI auf einem Mac mit X Window System anzuzeigen
Ich habe versucht, Bulls and Cows mit einem Shell-Programm zu erstellen
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich habe ein Systemkonfigurationsdiagramm mit Diagrams on Docker geschrieben
Ich habe es mit den Top 100 PyPI-Paketen versucht.> Ich habe versucht, die auf Python installierten Pakete grafisch darzustellen
Ich habe versucht, den Höhenwert von DTM in einem Diagramm anzuzeigen
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, mit tkinter mit dem Taschenrechner zu spielen
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, Soma Cube mit Python zu lösen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe versucht, den Linux-Kernel auf virtualbox + vagrant zu installieren
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
[Siehe nicht 04.02.17] Zeigen Sie den Temperatursensor in Echtzeit in einem Diagramm mit Himbeer-Pi 3 an
Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren
Ich habe versucht, die Emotionen des gesamten Romans "Wetterkind" zu analysieren
Ich habe versucht, die Punktgruppendaten-DB der Präfektur Shizuoka mit Vue + Leaflet anzuzeigen
Ich wollte den Motor mit einer Raspeltorte laufen lassen, also habe ich versucht, das Motor Driver Board von Waveshare zu verwenden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Ich habe versucht, den WEB-Server der normalen Linux-Programmierung 1st Edition mit C ++ 14 neu zu schreiben
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
[Linux] Kopieren Sie Daten mit einem Shell-Skript von Linux nach Windows
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Ich habe versucht, die Uhrzeit und das heutige Wetter anzuzeigen
Ich habe versucht, Linux wieder einzuführen
Ich habe auch versucht, die Funktionsmonade und die Zustandsmonade mit dem Generator in Python nachzuahmen
Ich habe versucht, eine zufällige FizzBuzz-Spalte mit Blasensortierung zu sortieren.
Ich schrieb einen Test in "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren".
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe versucht, den Ipython-Cluster unter AWS auf das Minimum zu starten
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Wenn ich mit matplotlib eine große Anzahl von Diagrammen generiere, möchte ich das Diagramm nicht auf dem Bildschirm anzeigen (Jupyter-Umgebung).
Ich habe versucht, den Sesam für Eingang 2 mit einem einzigen Druck auf die AWS IoT-Taste zu entsperren
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Ich habe versucht, "Asciichart Py" zu verwenden, mit dem mit Python ein schönes Diagramm auf der Konsole gezeichnet werden kann.
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Ich habe versucht, eine SATA-Software-RAID-Konfiguration zu erstellen, die das Betriebssystem unter Ubuntu Server startet
Ich habe versucht, eine Serverumgebung zu erstellen, die unter Windows 10 ausgeführt wird
Ich habe versucht, eine Umgebung von MkDocs unter Amazon Linux zu erstellen
Ich habe versucht, den Datenverkehr mit WebSocket in Echtzeit zu beschreiben
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
[Linux] Ich habe versucht, die Ressourcenbestätigungsbefehle zusammenzufassen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ein Memorandum beim automatischen Erwerb mit Selen
Ich habe eine Kreuzvalidierung basierend auf dem Rastersuchergebnis mit scikit-learn versucht
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen