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