You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.3 KiB
196 lines
5.3 KiB
--- a/keyboard.c
|
|
+++ b/keyboard.c
|
|
@@ -21,7 +21,6 @@
|
|
#include "keyboard.h"
|
|
|
|
#ifdef __sparc__
|
|
-#include <asm/kbio.h>
|
|
#include <asm/openpromio.h>
|
|
#include <asm/types.h>
|
|
#endif
|
|
@@ -96,7 +95,15 @@
|
|
{0, 0}
|
|
};
|
|
|
|
-#if !defined(__s390__) && !defined(__s390x__)
|
|
+#if defined(__sparc__)
|
|
+static int termcmp(struct termios *a, struct termios *b)
|
|
+{
|
|
+ if (a->c_iflag != b->c_iflag || a->c_oflag != b->c_oflag ||
|
|
+ a->c_cflag != b->c_cflag || a->c_lflag != b->c_lflag)
|
|
+ return 1;
|
|
+ return memcmp(a->c_cc, b->c_cc, sizeof(a->c_cc));
|
|
+}
|
|
+#elif !defined(__s390__) && !defined(__s390x__)
|
|
static int termcmp(struct termios *a, struct termios *b)
|
|
{
|
|
if (a->c_iflag != b->c_iflag || a->c_oflag != b->c_oflag ||
|
|
@@ -110,150 +117,6 @@
|
|
struct device *keyboardProbe(enum deviceClass probeClass, int probeFlags,
|
|
struct device *devlist)
|
|
{
|
|
-#ifdef __sparc__
|
|
- int fd;
|
|
- char buf[256];
|
|
- struct keyboardDevice *kbddev;
|
|
-
|
|
- if (probeClass & CLASS_KEYBOARD) {
|
|
- static struct {
|
|
- int layout0, layout1, layout2;
|
|
- char *symbols;
|
|
- int use_iso9995_3;
|
|
- } sunkbd_translate[] = {
|
|
- { 0, 33, 80, "", 0, },
|
|
- { 1, 34, 81, "", 0, },
|
|
- { 2, -1, -1, "fr_BE", 0, },
|
|
- { 3, -1, -1, "ca", 0, },
|
|
- { 4, 36, 83, "dk", 1, },
|
|
- { 5, 37, 84, "de", 1, },
|
|
- { 6, 38, 85, "it", 1, },
|
|
- { 7, 39, 86, "nl", 0, },
|
|
- { 8, 40, 87, "no", 1, },
|
|
- { 9, 41, 88, "pt", 1, },
|
|
- { 10, 42, 89, "es", 1, },
|
|
- { 11, 43, 90, "se", 1, },
|
|
- { 12, 44, 91, "fr_CH",1, },
|
|
- { 13, 45, 92, "de_CH",1, },
|
|
- { 14, 46, 93, "gb", 1, },
|
|
- { 16, 47, 94, "ko", 0, },
|
|
- { 17, 48, 95, "tw", 0, },
|
|
- { 32, 49, 96, "jp", 0, },
|
|
- { 50, 97, -1, "fr_CA",0, },
|
|
- { 51, -1, -1, "hu", 0, },
|
|
- { 52, -1, -1, "pl", 0, },
|
|
- { 53, -1, -1, "cs", 0, },
|
|
- { 54, -1, -1, "ru", 0, },
|
|
- { -1, -1, -1, NULL, 0, }
|
|
- };
|
|
-
|
|
- char twelve = 12;
|
|
- int fdstd = 0;
|
|
- char buf[4096];
|
|
-
|
|
- for (fd = 0; fd <= 2; fd++) {
|
|
- sprintf (buf, "/proc/self/fd/%d", fd);
|
|
- if (readlink (buf, buf, 4096) == 12 &&
|
|
- !strncmp (buf, "/dev/console", 12)) {
|
|
- fdstd = 1;
|
|
- break;
|
|
- }
|
|
- }
|
|
- if (!fdstd) {
|
|
- fd = open("/dev/console", O_RDWR);
|
|
- if (fd < 0) return devlist;
|
|
- }
|
|
-
|
|
- kbddev=keyboardNewDevice(NULL);
|
|
- kbddev->type=CLASS_KEYBOARD;
|
|
- if (devlist)
|
|
- kbddev->next = devlist;
|
|
- devlist = (struct device *) kbddev;
|
|
-
|
|
- if (ioctl (fd, TIOCLINUX, &twelve) < 0) {
|
|
- /* Serial console */
|
|
- char desc[64];
|
|
- struct serial_struct si;
|
|
- int line = 0;
|
|
-
|
|
- if (ioctl (fd, TIOCGSERIAL, &si) >= 0) {
|
|
- if (si.line & 1)
|
|
- /* ttyb */
|
|
- line = 1;
|
|
- }
|
|
- if (!fdstd) close(fd);
|
|
- sprintf (desc, "Serial console tty%c", line + 'a');
|
|
- fd = open("/dev/openprom", O_RDONLY);
|
|
- if (fd >= 0) {
|
|
- struct openpromio *op = (struct openpromio *)buf;
|
|
- sprintf (op->oprom_array, "tty%c-mode", line + 'a');
|
|
- op->oprom_size = 4096-128-4;
|
|
- if (ioctl (fd, OPROMGETOPT, op) >= 0 &&
|
|
- op->oprom_size > 0 && op->oprom_size < 40) {
|
|
- strcat (desc, " ");
|
|
- op->oprom_array [op->oprom_size] = 0;
|
|
- strcat (desc, op->oprom_array);
|
|
- }
|
|
- close (fd);
|
|
- }
|
|
- kbddev->desc=strdup(desc);
|
|
- kbddev->device=strdup("console");
|
|
- return devlist;
|
|
- }
|
|
-
|
|
- if (!fdstd) close(fd);
|
|
- fd=open("/dev/kbd", O_RDWR);
|
|
- if (fd < 0) {
|
|
- /* PS/2 keyboard */
|
|
- kbddev->desc=strdup("Generic PS/2 Keyboard");
|
|
- } else {
|
|
- /* Sun keyboard */
|
|
- int kbdtype, kbdlayout, i;
|
|
- char *desc, *desclayout = NULL;
|
|
-
|
|
- kbddev->device=strdup("kbd");
|
|
- desc = "Sun Type4 ";
|
|
- if (ioctl(fd, KIOCTYPE, &kbdtype) >= 0)
|
|
- switch (kbdtype) {
|
|
- case 2: desc = "Sun Type2 "; break;
|
|
- case 3: desc = "Sun Type3 "; break;
|
|
- case 4: ioctl(fd, KIOCLAYOUT, &kbdlayout);
|
|
- if (kbdlayout < 33)
|
|
- desc = "Sun Type4 ";
|
|
- else switch (kbdlayout) {
|
|
- case 33: case 47: case 48: case 49:
|
|
- case 80: case 94: case 95: case 96:
|
|
- desc = "Sun Type5 "; break;
|
|
- case 34: case 81:
|
|
- desc = "Sun Type5 Unix "; break;
|
|
- default:
|
|
- desc = "Sun Type5 Euro "; break;
|
|
- }
|
|
- for (i = 0; sunkbd_translate[i].layout0 != -1; i++) {
|
|
- if (sunkbd_translate[i].layout0 == kbdlayout ||
|
|
- sunkbd_translate[i].layout1 == kbdlayout ||
|
|
- sunkbd_translate[i].layout2 == kbdlayout)
|
|
- break;
|
|
- }
|
|
- if (sunkbd_translate[i].layout0 != -1 &&
|
|
- sunkbd_translate[i].symbols[0])
|
|
- desclayout = sunkbd_translate[i].symbols;
|
|
- break;
|
|
- }
|
|
- if (desclayout) {
|
|
- kbddev->desc = malloc(strlen(desc) + strlen(desclayout) + 1 + strlen("Keyboard") + 1);
|
|
- strcpy (kbddev->desc, desc);
|
|
- strcat (kbddev->desc, desclayout);
|
|
- strcat (kbddev->desc, " Keyboard");
|
|
- } else {
|
|
- kbddev->desc = malloc(strlen(desc) + strlen("Keyboard") + 1);
|
|
- strcpy (kbddev->desc, desc);
|
|
- strcat (kbddev->desc, "Keyboard");
|
|
- }
|
|
- }
|
|
- close (fd);
|
|
- }
|
|
-#else
|
|
int fd;
|
|
char twelve = 12;
|
|
int fdstd = 0;
|
|
@@ -311,7 +174,7 @@
|
|
kbddev->device = strdup("ttySG0");
|
|
}
|
|
#endif
|
|
-#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__)
|
|
+#if defined(__i386__) || defined(__x86_64__) || defined(__ia64__) || defined(__sparc__)
|
|
int cfd;
|
|
struct termios cmode, mode;
|
|
|
|
@@ -397,7 +260,6 @@
|
|
kbddev->device=strdup(desc);
|
|
}
|
|
}
|
|
-#endif
|
|
out:
|
|
return devlist;
|
|
}
|