PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : keycodes über den Parallelport empfangen...



d@tenmaulwurf
01.01.05, 20:34
Moin!

Ich würde mir gerne ein paar "Extratasten" bauen.

Ich würde mir gerne eine einfach, wirklich einfache Schaltung bauen, welche auf Druck auf einen Taster einen keycode aussenden sollen, welchen ich dann mit xmodmap erfassen und auf z.B. F13 belegen kann.

Die Schaltung sollte wirklich einfach und nach Möglichkeit irgendwo step-by-step beschrieben sein.

Beim Suchen auf google oder in der SuFu bin ich immer auf (zu) komplexe Schaltungen getroffen :/

Es sollte für die parallele Schnittstelle geeignet sein, da die serielle bereits belegt ist.

Die Tastenanzahl sollte 4 nicht unterschreiten.

Vielen Dank im voraus,

d@tenmaulwurf

nobody0
13.01.05, 22:33
Du brauchst nur den Parallelport regelmäßig abzufragen und die Aktion dann mit dem Programm machen.
Alternativ kannst Du eine Interrupt-Hander schreiben für den interruptfähigen Pin am Parallelport, aber der ist im Kernel-Space.

Das Abfragen sieht z. B. in einem einfachen Fall so aus:



/* partest.c for testing the Parallel Port.
* E. g. "partest 888 255" puts the value 255 to the port 888 (e. g. lp0, lpt1)
* and prints if the port can be bidirectional and prints the status register
* Byte.
*
* This Program won't work on the sparc, where there's no concept of I/O space
* Tested with 2.2 on the x86
*
* important: this program won't work without the compiler-option -O or -02 ...
* and this program can only be run by a superuser (or another user after
* "chown root.root partest; chmod 4755 partest").
*
* It takes approx. 1,5us for one Parallel Port I/O (with an onboard Parallel Port).

The first version used a 150 Ohm resistor from a data pin to ground and another resistor to
a status pin but some parallel port do have status pins with a high level that is read (via
data port) as low.
This second version uses a 1000 uF capacitator between a data pin and ground and works correct with
every tested parallel port.
All tested parallel ports (CMOS and TTL versions), e. g. the one on the mainboard Tyan Tiger MPX,
are bidirectional.

Rolf Freitag
Lizenz: GPL

*/

#include <stdio.h>
#include <sys/io.h> /* or asm/io.h; for inb, ioperm, iopl ... */
#include <stdlib.h> /* atoi */
#include <unistd.h> // getuid()
#include <errno.h> // EPERM
#include <iso646.h> // and

int
main (int argc, char *argv[])
{ /* A wrong value can cause serious damage! */
int base = atoi (argv[1]);
int value = atoi (argv[2]);
unsigned char b = 0, b0;

if (geteuid () != 0)
{
printf ("\a\n\nError: $EUID==%d!=0 (you are not a superuser).\n\n", getuid ());
exit (-EPERM);
}
iopl (3); /* unlimited I/O access permission, nessesary above the 0x3ff limit e. g. at 0x9800=38912 */
outb (0x04, base + 2); /* write mode, interrupt disable, all controll pins high */
outb (0xb7, base + 1); // try to set the status pins high
outb (0x00, base); // write 0x00
usleep (1000000); // wait one second
outb (0x24, base + 2); /* read mode */
b = inb (base);
b0 = b; // store first byte
printf ("First read data port byte (after writing 0x00 for one second): 0x%2hhx.\n", b);
// if (b0)
// printf ("The port is not bidirectional (or damaged or something (maybe internall pullups) pulls up).\n");
outb (0x04, base + 2); /* write mode */
outb (0xff, base); // write 0xff
outb (0x24, base + 2); /* read mode */
usleep (1); // wait one microsecond
b = inb (base);
printf ("Second read data port byte (after writing 0xff for one microsecond): 0x%2hhx (should be 0xff if nothing is connected or all data pins are pulled up).\n", b);
if (b != 0xff) // port seems ok and something pulled down at second reading
printf ("The parallel port is bidirektional (or damaged)!\n");
else
{
printf ("The parallel port can be bidirektional. Check with one data pin connected to ground with 1000 uF capacitator (elko).\n");
printf ("If done so, the parallel port is not bidirektional.\n");
}
printf ("status register: %i = 0x%x\n", inb (base + 1), inb (base + 1));
outb (0x04, base + 2); /* write */
outb (value, base);
iopl (0); /* no I/O permission */
return 0;
};

zeeman
14.01.05, 15:31
Alternativ kannst Du eine Interrupt-Hander schreiben für den interruptfähigen Pin am Parallelport, aber der ist im Kernel-Space.

kannst du dazu ne paar infos geben?
wie das so abläuft und wie man das in ein c++-programm einbaut

und was noch viel wichtiger ist:
geht das auch mit ner seriellen schnittstelle?

atomical
14.01.05, 15:41
mal auf linuxfocus.org stöbern ... afaik gabs da ein display für den parallelen und in den kommentaren war eine weiterentwicklung mit 15 tasten verlinkt ...

nobody0
14.01.05, 16:14
kannst du dazu ne paar infos geben?
wie das so abläuft und wie man das in ein c++-programm einbaut


Normalerweise baut man den Interrupt-Handler in ein C- oder Assembler-Programm und baut ihn in den Kernel oder lädt ihn als Modul. Ein-/Ausgabe erfolgt über eine Datein in /dev oder /proc.




und was noch viel wichtiger ist:
geht das auch mit ner seriellen schnittstelle?

Wenn man nur einzelne Pins auf +12 oder -12 V setzten will ist es wie beim Parallelport ohne IRQ, also ein Bit in einem Register entspricht low oder high eines Pins. Dazu muß man nur die Adresses des Registers und die Position des Bits wissen und vielleicht noch etwas Vorbereitung wie Daten-Richtung und Schnittstellen-Modus, denn beim Parallelport können die Datenleitungen als Eingang oder Ausgang genutzt werden.
Wenn man Daten ausgeben möchte, geht das mit einem Eingang nämlich nicht und in die andere Richtung gilt dasselbe.

zeeman
15.01.05, 09:57
ich werde zwar gleich mal google bemühen, aber so direkt ne howto oder ne buchtipp zu diesem kernel-modul-programmieren hast du nicht, oder?

problem bei der parallelen schnittstelle ist, das selbige schon durch ein display belegt ist :ugly:

derguteweka
15.01.05, 10:18
Moin,


ich werde zwar gleich mal google bemühen, aber so direkt ne howto oder ne buchtipp zu diesem kernel-modul-programmieren hast du nicht, oder?

problem bei der parallelen schnittstelle ist, das selbige schon durch ein display belegt ist :ugly:

Guggst du z.b. hier:
http://www.xml.com/ldd/chapter/book/

Ich mein bloss, dass da leider nix drinnensteht, wie man so n Dingens fuer einen 2.6er Kernel baut, da hat sich ja was geaendert, der Treiber heisst ja dann treiber.ko und nicht mehr treiber.o

Gruss
WK

atomical
15.01.05, 13:38
mal auf linuxfocus.org stöbern ... afaik gabs da ein display für den parallelen und in den kommentaren war eine weiterentwicklung mit 15 tasten verlinkt ...

die seite ist leider nicht mehr erreichbar und per email ist der autor leider auch nicht zu erreichen ...
Benutzer hat zuviele Mails auf dem Server. / User has too many messages on the server.

nobody0
15.01.05, 21:26
Ich mein bloss, dass da leider nix drinnensteht, wie man so n Dingens fuer einen 2.6er Kernel baut, da hat sich ja was geaendert, der Treiber heisst ja dann treiber.ko und nicht mehr treiber.o


Der Name ist egal, wenn man den als Parameter übergibt (für insmod, modprobe).
Bei den Modulen hat sich nich allzu viel geändert; am meisten hat sich bei den Optionen geändert, denn da muß man die CPU angeben und die Kernel-Sourcen z. B. so:
gcc -DCONFIG_M386 -Wall -Werror -I/lib/modules/`uname-r`/kernel/include -O2 -DLINUX -D__KERNEL__ -DMODULE -c Beispiel.c

Dazu noch dieser Hinzweis:

To build kernel modules please do the following:"
o Have the kernel sources installed"
o Make sure that the symbolic link"
/lib/modules/`uname -r`/build exists and points to"
the matching kernel source directory"
o Configure kernel sources:"
- cd /usr/src/linux"
- make mrproper"
- make cloneconfig"
- make dep"
o When compiling, make sure to use the following"
compiler option to use the correct include files:"
-I/lib/modules/`uname -r`/build/include"
instead of"
-I/usr/include/linux"
Please adjust the Makefile accordingly."

7.e.Q
19.01.05, 13:25
Zur Linux Treiber Entwicklung mit dem Kernel 2.6 gibt es ein sehr interessantes und einleuchtendes Buch (sogar auf deutsch!):

"Linux-Treiber entwickeln" von Jürgen Quade und Eva-Katharina Kunst.
ISBN: 3-89864-238-0

In diesem Buch ist sehr detailiert beschrieben, wie man einen Treiber für den Linux Kernel 2.6 erstellt. Desweiteren kann ich nur empfehlen, daß man sich Informationen über das neue Kernel-Build System einholt. Man kann spezielle Makefiles schreiben, anhand derer make gleich weiß, daß es sich bei dem zu erstellenden Objekt um ein Kernel-Modul handelt.

Mit einem solchen minimalistischen Treiber sollte es ein leichtes sein, sowohl die Tastatur, als auch das Display anzusteuern.