Autor Thema: Anleitung: USB-Mäuse und Tastaturen über Raspberry am ATARI Mega ST(E) und TT  (Gelesen 17520 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Was wir brauchen: 1 RJ 11 KAbel
1 Raspberry
1 SD Karte passend zum Raspberry.
Die Tastatur/maus Kombi, die  wir benutzen wollen.


Schritt 1. Man besorge sich ein normales raspian mit cc compiler und compiliere dann auf dem Raspberry folgenden Code:



#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <linux/input.h>
#include <termios.h>


int main(int argc,char *argv[])
{   


int i,j,code,lb=0,rb=0,mv=0,msdevnr=-1,kbddevnr = -1,serdevnr = -1;
struct input_event *ereignis,puffer[100];
struct termios seropt;
unsigned char serout[3];


char scancodes[] = {
0,  // (Nothing)
1,  // Esc
2,  // 1
3,  // 2
4,  // 3
5,  // 4
6,  // 5
7,  // 6
8,  // 7
9,  // 8
10, // 9
11, // 0
12, // - (ß)
13, // `
14, // Backspace
15, // Tab
16, // q
17, // w
18, // e
19, // r
20, // t
21, // y (z)
22, // u
23, // i
24, // o
25, // p
26, // [ (ü)
27, // ] (+)
28, // Enter
29, // Control
30, // a
31, // s
32, // d
33, // f
34, // g
35, // h
36, // j
37, // k
38, // l
39, // ; (ö)
40, // ' (ä)
43, // ~ (Mapped to ~) PC:^
42, // Lshift
41, // #
44, // z (y)
45, // x
46, // c
47, // v
48, // b
49, // n
50, // m
51, // ,
52, // .
53, // / (-)
54, // Rshift
102, // N* (PC:55)
56, // Alternate (left)
57, // Space
58, // CapsLock
59, // F1
60, // F2
61, // F3
62, // F4
63, // F5
64, // F6
65, // F7
66, // F8
67, // F9
68, // F10
0, // Num (PC:69)
0, // Rollen (PC:70)
103, // N7 (PC:71)
104, // N8 (PC:72)
105, // N9 (PC:73)
74, // N-
106, // N4 (PC:75)
107, // N5 (PC:76)
108, // N6 (PC:77)
78, // N+
109, // N1 (PC:79)
110, // N2 (PC:80)
111, // N3 (PC:81)
112, // N0 (PC:82)
113, // N. (PC:83)
0, // (Not used)
0, // (Not used)
96, // < (PC:86)
99, // F11 (PC:87) mapped to NUM (
100, // F12 (PC:88) mapped to NUM )
0, // (Not used)
0, // (Not used)
0, // (Not used)
0, // (Not used)
0, // (Not used)
0, // (Not used)
0, // (Not used)
114, // NEnter (PC:96)
29, // Control (PC:97 right CTRL)
101, // N/ (PC:98)
0, // Druck (PC:99)
56, // Alt (PC:100 Alt GR right)
0, // (Not used)
71, // Pos1 (Clr/Home) (PC:102)
72, // Arrow up (PC:103)
98, // Pg up (PC:104) mapped to Help
75, // Arrow left (PC:105)
77, // Arrow right (PC:106)
0, // Ende (PC:107)
80, // Arrow down (PC:108)
97, // Pg down (PC:109) mapped to Undo
82, // Insert (PC:110)
83, // Delete: (PC:111)
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
};


if ( argc != 3 ) {printf ("usage: ikbdemu kbddevfilename mousedevfilename\n");return(99);}


kbddevnr = open(argv[1],O_RDONLY | O_NONBLOCK);
msdevnr = open(argv[2],O_RDONLY | O_NONBLOCK);
serdevnr = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);
if (ioctl(kbddevnr, EVIOCGRAB, 1) != 0) return(98);
if (ioctl(msdevnr, EVIOCGRAB, 1) != 0) return(97);
if((kbddevnr == -1) || (msdevnr == -1) || (serdevnr == -1)) return(96);


tcgetattr(serdevnr,&seropt);
seropt.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
seropt.c_iflag = IGNPAR;
seropt.c_oflag=0;
seropt.c_lflag=0;
tcflush(serdevnr,TCIFLUSH);
tcsetattr(serdevnr,TCSANOW,&seropt);


while(1)
{
        j = read(msdevnr,puffer,sizeof(puffer)) / 16;
        for (i=0;i<j;i++)
        {
         ereignis = &puffer[i];
         if(ereignis->type == 1
         && ereignis->code < 274) {if (ereignis->code == 272) lb=2*ereignis->value;
   if (ereignis->code == 273) rb=ereignis->value;
   //printf("Mouse code: %d %d %d\n",248+lb+rb,0,0);
   serout[0]=248+lb+rb;
   serout[1]=0;serout[2]=0;
   write(serdevnr,&serout[0],3);
   }
         if(ereignis->type == 2
&& ereignis->code < 2) { mv=ereignis->value;
  while (mv < -100)
{serout[0]=248+lb+rb;serout[1]=0;serout[2]=0;
if (ereignis->code == 0)
{//printf("Mouse code: %d %d %d\n",248+lb+rb,156,0);
serout[1]=156;}
else {//printf("Mouse code: %d %d %d\n",248+lb+rb,0,156);
serout[2]=156;}
mv=mv+100;
write(serdevnr,&serout[0],3);
}
  while (mv > 100)
{serout[0]=248+lb+rb;serout[1]=0;serout[2]=0;
if (ereignis->code == 0)
{//printf("Mouse code: %d %d %d\n",248+lb+rb,100,0);
serout[1]=100;}
else {//printf("Mouse code: %d %d %d\n",248+lb+rb,0,100);
serout[2]=100;}
mv=mv-100;
write(serdevnr,&serout[0],3);
}

  if (mv < 0)
{serout[0]=248+lb+rb;serout[1]=0;serout[2]=0;
if (ereignis->code == 0)
{//printf("Mouse code: %d %d %d\n",248+lb+rb,256+mv,0);
serout[1]=256+mv;}
else {//printf("Mouse code: %d %d %d\n",248+lb+rb,0,256+mv);
serout[2]=256+mv;}
write(serdevnr,&serout[0],3);
}


  if (mv > 0)
{serout[0]=248+lb+rb;serout[1]=0;serout[2]=0;
if (ereignis->code == 0)
{//printf("Mouse code: %d %d %d\n",248+lb+rb,mv,0);
serout[1]=mv;}
else {//printf("Mouse code: %d %d %d\n",248+lb+rb,0,mv);
serout[2]=mv;}
write(serdevnr,&serout[0],3);
}
  }
        }
        j = read(kbddevnr,puffer,sizeof(puffer)) / 16;
        for (i=0;i<j;i++)
        {
         ereignis = &puffer[i];
         if(ereignis->type == 1 && ereignis->code < 128) {code=0;
  if (ereignis->value == 1) code=scancodes[ereignis->code];
  if (ereignis->value == 0) code=scancodes[ereignis->code]+128;
  serout[0]=code;
  if (code != 0 && code != 128){printf("KBD Code: %d \n",code);write(serdevnr,&serout[0],1);}}
        }
}
}



Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Das Ergebnis nenne man ikbdemu


Nun besorge man sich ein Minimalimage für den raspi (um die bootzeit klein zu halten), z.B. Minibian


http://sourceforge.net/projects/minibian/files/2015-11-12-jessie-minibian.tar.gz/download


Auf der Minibian sd-Karte legt man im root-ordner ein Unterverzeichnis an, z.B. inputcode, das unter minibian ja im Verzeichnis /boot gemounted wird (da, wo auch die config.txt und die cmdline.txt liegt)


In dieses Verzeichnis lege man oben erzeugte ikbdemu, sowie eine ikbdstart.sh folgenden Inhalts:




sleep 3
KBDDEV=`ls -1t /dev/input/by-id/*event-kbd | tail -1`
MOUSEDEV=`ls -1t /dev/input/by-id/*event-mouse | tail -1`
./ikbdemu $KBDDEV $MOUSEDEV

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Nun sorge man dafür, dass die serielle Schnittstelle nutzbar wird, z.B. wie folgt:


http://www.raspberrypi-spy.co.uk/2013/12/free-your-raspberry-pi-serial-port/


Ausserdem muss man den seriellen Port des Raspberry noch auf 7812.5 statt 9600
programmieren, das erreicht man, indem man in der config.txt die Zeilen einfügt:


init_uart_clock=2441406
init_uart_baud=9600
dtparam=uart0_clkrate=3000000

In früheren Linux Versionen für den Raspi musste man noch einen Kernelparameter in der cmdline.txt einfügen statt der dtparam= Zeile, das ist mit einem aktuellen minibian oder raspbian unnötig.
« Letzte Änderung: Mo 28.12.2015, 16:46:44 von nobox »

Offline neogain

  • Benutzer
  • Beiträge: 1.313
  • ...?
genial, danke nobox!  :D :D :D :D

ich werde das am Wochenende auf jeden Fall ausprobieren.

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Nun verbindet man das RJ11 Kabel mit dem GPIO des Raspberry, und zwar:
PIN2 der KBD-Schnittstelle mit  PIN2 GPIO (5V)
PIN5 der KBD-Schnittstelle mit  PIN6 GPIO (GND)
PIN4 der KBD-Schnittstelle mit  PIN8 GPIO (RX bzw TX)

Ausserdem muss man für einen Autostart der ikbdstart.sh sorgen, am besten, indem man in die /etc/rc.local einträgt:

cd /boot/inputcode
./ikbdstart.sh >/dev/tty1


Der Raspberry wird von  dem Atari mit Strom versorgt und braucht etwa 12 sec zum booten.
D.h. etwa ab dem 5.- 6. Minuszeichen bei Memorytest kann man denselben mit Druck auf Space abbrechen.
« Letzte Änderung: Mo 28.12.2015, 18:23:55 von nobox »

Offline 1ST1

  • Benutzer
  • Beiträge: 8.661
  • Gesperrter User
Coolomat! Ist es egal, welchen Rapi man nimmt? Dann müsste doch auch das neue Mini-Teil gehen?!

Jetzt noch ein fertig modifiziertes Minibian-Image was man nur noch auf ne SD schreiben müsste, und fertig...

Zusatzanregung: Im IKBD ist doch eine Uhr, soweit ich das sehe, wird die von deinem Programm nicht emuliert. Die müsste man doch setzen und auslesen können, und wohl auch mit einem NTP-Server syncronisieren können. Tools, um die IKBD-Uhr im Autoordner auszulesen und in die Systemzeit zu schreiben, gibts ja auch.

Und noch eine Frage: Wie sähe es mit einer Joystick-Emulation mit einem oder besser zwei USB-Joystick aus?
« Letzte Änderung: Mo 28.12.2015, 18:44:27 von 1ST1 »
Ausgeloggter Mitleser, der hier NIE mehr aktiv wird. Am besten, meine Inhalte komplett löschen. Dabei berufe ich mich auf mein Urheberrecht, die DSGVO und auf die Rechte, die mir unter Impressunm&Datenschutz zugestanden werden. Tschö!

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Ein fertiges Image kann ich erstellen. Aber wie lade ich da hier hoch ?
Zip geht ja immer noch nicht.


Das mit der Uhr würde auch mehr Hardware erfordern. Momentan transportiere ich nur Daten aus dem rasperry in den Atari.  Anfragen des Atari (reset, pause, Uhr) werden geflissentlich ignoriert, weil ich Signale vom Atari gar nicht auswerte.


Sollte ich das einführen, müsste ich mich des Problems der unterschiedlichen Spannung annnehmen: Raspberry 3,3V Atari 5V. Bei 3V out auf 5V in macht das nix, weil reicht.  Andersrum 5V Atari out auf 3V raspi in würde es den raspi grillen.


Theoretisch sollte jeder raspi gehen, auch der Zero.
Auspropiert habe ich es nur mit dem Raspi 1B.


Offline czietz

  • Benutzer
  • Beiträge: 3.570
Sollte ich das einführen, müsste ich mich des Problems der unterschiedlichen Spannung annnehmen: Raspberry 3,3V Atari 5V. Bei 3V out auf 5V in macht das nix, weil reicht.  Andersrum 5V Atari out auf 3V raspi in würde es den raspi grillen.

Billigste Lösung dafür: Widerstand in Serie, um den Strom zu begrenzen, den Rest erledigen die Dioden im Raspberry Pi.

PS: Gelungene und hilfreiche Anleitung!
« Letzte Änderung: Mo 28.12.2015, 19:23:24 von czietz »

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Jaja, wie man den Spannungsteiler für serial in machen müsste, ist mir schon klar, macht dann hard und software aber wieder komplizierter

Offline 1ST1

  • Benutzer
  • Beiträge: 8.661
  • Gesperrter User
Ein fertiges Image kann ich erstellen. Aber wie lade ich da hier hoch ?
Zip geht ja immer noch nicht.
Dropbox, OneDrive, Google-Drive, irgendwas davon wirst du ja haben. Oder der Chef richtet mal für solche Projekte einen FTP-Ordner ein.
Zitat

Das mit der Uhr würde auch mehr Hardware erfordern. Momentan transportiere ich nur Daten aus dem rasperry in den Atari.  Anfragen des Atari (reset, pause, Uhr) werden geflissentlich ignoriert, weil ich Signale vom Atari gar nicht auswerte.
Das Datensignal über einen Widerstand noch an einen zweiten IO-Pin legen und dort einlesen.
Zitat
Sollte ich das einführen, müsste ich mich des Problems der unterschiedlichen Spannung annnehmen: Raspberry 3,3V Atari 5V. Bei 3V out auf 5V in macht das nix, weil reicht.  Andersrum 5V Atari out auf 3V raspi in würde es den raspi grillen.
Und nicht vergessen, der ST kann diese Daten auch so jederzeit selbst senden, das heißt, selbst wenn du nicht auswertest, liegt der TTL-Pegel dennoch an.
Zitat
Theoretisch sollte jeder raspi gehen, auch der Zero.
Auspropiert habe ich es nur mit dem Raspi 1B.
So ein Zero wird genau dafür in meinen Lighthouse-TT einziehen. Hoffentlich dann auch mit Uhren- und Joystick-Unterstützung.
Ausgeloggter Mitleser, der hier NIE mehr aktiv wird. Am besten, meine Inhalte komplett löschen. Dabei berufe ich mich auf mein Urheberrecht, die DSGVO und auf die Rechte, die mir unter Impressunm&Datenschutz zugestanden werden. Tschö!

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Zitat von: 1ST1
Zitat von: nobox
Ein fertiges Image kann ich erstellen. Aber wie lade ich da hier hoch ?
Zip geht ja immer noch nicht.
Dropbox, OneDrive, Google-Drive, irgendwas davon wirst du ja haben. Oder der Chef richtet mal für solche Projekte einen FTP-Ordner ein.

Nö, habe nix davon. Warte immer noch auf eine Möglichkeit, hier was anderes  als JPG oder PDF hochzuladen.

Zitat von: 1ST1
Und nicht vergessen, der ST kann diese Daten auch so jederzeit selbst senden, das heißt, selbst wenn du nicht auswertest, liegt der TTL-Pegel dennoch an.

Nö, kann er nicht. wenn du meine anleitung mal durchliest, tx vom Atari zum RX Raspi wird gar nicht verdrahtet.
« Letzte Änderung: Mo 28.12.2015, 20:00:22 von nobox »

Offline tuxie

  • Benutzer
  • Beiträge: 6.830
  • Falcon! Milan! Schuetzt die Raubvoegel!
Ihr könnt es gern auf Newtosworld.de hochladen.
http://www.newtosworld.de/downloads
Tschau Ingo

Burkhard Mankel

  • Gast
Ein fertiges Image kann ich erstellen. Aber wie lade ich da hier hoch ?
Zip geht ja immer noch nicht.
Dropbox, OneDrive, Google-Drive, irgendwas davon wirst du ja haben. Oder der Chef richtet mal für solche Projekte einen FTP-Ordner ein.
Ihr könnt es gern auf Newtosworld.de hochladen.
http://www.newtosworld.de/downloads
Was für'n Aufwasch!
Man müßte das bei dem jeweiligen Hoster selbst nochmal öffnen um es hier verlinken zu können, damit auch andere zugriff drauf haben!
Einfacher halte ich die Lösung: einfach Dateityp nach "*.pdf" ändern - dann läßt es sich auch hier anhängen - unter der Vorraussetzung, daß die Datei nicht zu groß ist!

edit: ganz zu schweigen davon, daß man meißt bei den anderen Hostern - zB Dropbox - Kunde sein muß, um was downloaden zu können (für einen Upload bei jedem Hoster sowieso ein Muß)!
« Letzte Änderung: Di 29.12.2015, 03:27:00 von Burkhard Mankel »

Offline 1ST1

  • Benutzer
  • Beiträge: 8.661
  • Gesperrter User
Das stimmt nicht, bei Dropbox kann man das mit dem Anmeden wegklicken und dann die Sachen so runterladen.
Ausgeloggter Mitleser, der hier NIE mehr aktiv wird. Am besten, meine Inhalte komplett löschen. Dabei berufe ich mich auf mein Urheberrecht, die DSGVO und auf die Rechte, die mir unter Impressunm&Datenschutz zugestanden werden. Tschö!

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
So, das image ist fertig. Ich würde es gerne auf NewTosWorld hochladen, aber wie bekomme ich da einen Account ?

Offline tuxie

  • Benutzer
  • Beiträge: 6.830
  • Falcon! Milan! Schuetzt die Raubvoegel!
Ich richte dir einen ein, gib mir 10 minuten...
Tschau Ingo

Burkhard Mankel

  • Gast
Das stimmt nicht, bei Dropbox kann man das mit dem Anmeden wegklicken und dann die Sachen so runterladen.
Das ist  nicht korrekt - mein Neffe war letztes Jahr eine Weile längere Zeit in Brasilien und hat Erlebnis- und Info-Videos auf Dropbox der Familie verfügbar gemacht. Ich mußte einen Account setzen, um sie dort ansehen geschweige denn downloaden zu können! Da seine Eltern (mein Bruder und seine Frau) als Unternehmer weniger Zeit für solche Dinge haben, habe ich dann auch meinen Account genutzt, um per Download ihnen ebenfalls diese Videos zeitnah zur Ansicht bringen zu können! Ohne Account kam ich an die Filmchen gar nicht heran!

Offline nobox

  • Benutzer
  • Beiträge: 227
  • Ich liebe dieses Forum!
Noch ein Wort zu den Pinnummern: Ich beziehe mich dabei auf die Numerierung hier:


http://www.allpinouts.org/index.php/Keyboard_Atari_MEGA_ST(e)/TT


und hier:


https://www.elektronik-kompendium.de/sites/raspberry-pi/1907101.htm

Und wenn der Raspi am Atari hängt, darf man natürlich kein Netzteil mehr anschließen !

Wie immer gilt: Alles auf eigene Gefahr. Wer seinen Raspi oder Atari grillt, ist selber schuld.
« Letzte Änderung: Di 29.12.2015, 11:27:56 von nobox »

Offline tuxie

  • Benutzer
  • Beiträge: 6.830
  • Falcon! Milan! Schuetzt die Raubvoegel!
Lieber Burkhardt diskutiere mit uns nicht rum wenn du es nicht besser weißt.. dann hat er seine Links nicht geteilt damit brauchst du einen account.. natürlich kannst du in einer Dropbox Dateien jeden zur Verfügung stellen ohne das sich die Person registrieren muß. Dies ist gang und gebe und wird ständig verwendet.

Datei ist gleich auf newtosworld online.

http://www.newtosworld.de/downloads/platinenlayout-s-fur-atari-st-co
« Letzte Änderung: Di 29.12.2015, 11:40:31 von tuxie »
Tschau Ingo

Burkhard Mankel

  • Gast
Das hat nix mit herumdiskutieren zu tun - ich komme über die Anmelde- bzw Registrieren-Seite nicht rüber !!!

Und so war es auch, als ich von meinem Neffen die Links vermittelt bekam und die Videos sehen bzw downloaden wollte!