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!
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.
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.
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.
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.
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.
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