summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoryokota <yokota@FreeBSD.org>1999-12-13 10:36:36 +0000
committeryokota <yokota@FreeBSD.org>1999-12-13 10:36:36 +0000
commit5fa506591286dadad6dba89bf9ca24d1369beb33 (patch)
tree3be6f5cad606f048450dae2d9b08b19d7ab290d8 /sys
parentdd933059e17546022cfd5d8f0461def61da4153f (diff)
downloadFreeBSD-src-5fa506591286dadad6dba89bf9ca24d1369beb33.zip
FreeBSD-src-5fa506591286dadad6dba89bf9ca24d1369beb33.tar.gz
- Add a module event function to the ukbd driver and make the ukbd KLD
module work. - Delete unnecessary #include.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/kbd/kbd.c44
-rw-r--r--sys/dev/kbd/kbdreg.h5
-rw-r--r--sys/dev/usb/ukbd.c26
3 files changed, 69 insertions, 6 deletions
diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c
index 3b63404..793c84c 100644
--- a/sys/dev/kbd/kbd.c
+++ b/sys/dev/kbd/kbd.c
@@ -53,6 +53,9 @@ typedef struct genkbd_softc {
struct selinfo gkb_rsel;
} genkbd_softc_t;
+static SLIST_HEAD(, keyboard_driver) keyboard_drivers =
+ SLIST_HEAD_INITIALIZER(keyboard_drivers);
+
/* local arrays */
/*
@@ -150,6 +153,24 @@ kbd_set_maps(keyboard_t *kbd, keymap_t *keymap, accentmap_t *accmap,
kbd->kb_fkeytab_size = fkeymap_size;
}
+/* declare a new keyboard driver */
+int
+kbd_add_driver(keyboard_driver_t *driver)
+{
+ if (SLIST_NEXT(driver, link))
+ return EINVAL;
+ SLIST_INSERT_HEAD(&keyboard_drivers, driver, link);
+ return 0;
+}
+
+int
+kbd_delete_driver(keyboard_driver_t *driver)
+{
+ SLIST_REMOVE(&keyboard_drivers, driver, keyboard_driver, link);
+ SLIST_NEXT(driver, link) = NULL;
+ return 0;
+}
+
/* register a keyboard and associate it with a function table */
int
kbd_register(keyboard_t *kbd)
@@ -175,6 +196,13 @@ kbd_register(keyboard_t *kbd)
kbd->kb_callback.kc_func = NULL;
kbd->kb_callback.kc_arg = NULL;
+ SLIST_FOREACH(p, &keyboard_drivers, link) {
+ if (strcmp(p->name, kbd->kb_name) == 0) {
+ keyboard[index] = kbd;
+ kbdsw[index] = p->kbdsw;
+ return index;
+ }
+ }
list = (const keyboard_driver_t **)kbddriver_set.ls_items;
while ((p = *list++) != NULL) {
if (strcmp(p->name, kbd->kb_name) == 0) {
@@ -226,6 +254,10 @@ keyboard_switch_t
const keyboard_driver_t **list;
const keyboard_driver_t *p;
+ SLIST_FOREACH(p, &keyboard_drivers, link) {
+ if (strcmp(p->name, driver) == 0)
+ return p->kbdsw;
+ }
list = (const keyboard_driver_t **)kbddriver_set.ls_items;
while ((p = *list++) != NULL) {
if (strcmp(p->name, driver) == 0)
@@ -361,6 +393,10 @@ kbd_configure(int flags)
const keyboard_driver_t **list;
const keyboard_driver_t *p;
+ SLIST_FOREACH(p, &keyboard_drivers, link) {
+ if (p->configure != NULL)
+ (*p->configure)(flags);
+ }
list = (const keyboard_driver_t **)kbddriver_set.ls_items;
while ((p = *list++) != NULL) {
if (p->configure != NULL)
@@ -430,12 +466,18 @@ kbd_attach(keyboard_t *kbd)
int
kbd_detach(keyboard_t *kbd)
{
+ dev_t dev;
+
if (kbd->kb_index >= keyboards)
return EINVAL;
if (keyboard[kbd->kb_index] != kbd)
return EINVAL;
- /* XXX: unmake_dev() ? */
+ dev = makedev(kbd_cdevsw.d_maj, kbd->kb_index);
+ if (dev->si_drv1)
+ free(dev->si_drv1, M_DEVBUF);
+ destroy_dev(dev);
+
return 0;
}
diff --git a/sys/dev/kbd/kbdreg.h b/sys/dev/kbd/kbdreg.h
index 1b90871..83696bb 100644
--- a/sys/dev/kbd/kbdreg.h
+++ b/sys/dev/kbd/kbdreg.h
@@ -158,6 +158,7 @@ typedef struct keyboard_switch {
/* keyboard driver */
typedef struct keyboard_driver {
+ SLIST_ENTRY(keyboard_driver) link;
char *name;
keyboard_switch_t *kbdsw;
int (*configure)(int); /* backdoor for the console driver */
@@ -167,7 +168,7 @@ typedef struct keyboard_driver {
#define KEYBOARD_DRIVER(name, sw, config) \
static struct keyboard_driver name##_kbd_driver = { \
- #name, &sw, config \
+ { NULL }, #name, &sw, config \
}; \
DATA_SET(kbddriver_set, name##_kbd_driver);
@@ -176,6 +177,8 @@ extern keyboard_switch_t **kbdsw;
extern struct linker_set kbddriver_set;
/* functions for the keyboard driver */
+int kbd_add_driver(keyboard_driver_t *driver);
+int kbd_delete_driver(keyboard_driver_t *driver);
int kbd_register(keyboard_t *kbd);
int kbd_unregister(keyboard_t *kbd);
keyboard_switch_t *kbd_get_switch(char *driver);
diff --git a/sys/dev/usb/ukbd.c b/sys/dev/usb/ukbd.c
index 2870031..bc8c094 100644
--- a/sys/dev/usb/ukbd.c
+++ b/sys/dev/usb/ukbd.c
@@ -51,12 +51,10 @@
#include <sys/module.h>
#include <sys/bus.h>
#include <machine/clock.h>
-#include <sys/tty.h>
#include <sys/file.h>
#include <sys/select.h>
#include <sys/proc.h>
#include <sys/vnode.h>
-#include <sys/poll.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbhid.h>
@@ -66,7 +64,6 @@
#include <dev/usb/usb_quirks.h>
#include <dev/usb/hid.h>
-#include <sys/conf.h>
#include <dev/kbd/kbdreg.h>
#define UKBD_EMULATE_ATSCANCODE 1
@@ -115,6 +112,7 @@ typedef void usbd_intr_t(usbd_xfer_handle, usbd_private_handle, usbd_status);
typedef void usbd_disco_t(void *);
static usbd_intr_t ukbd_intr;
+static int ukbd_driver_load(module_t mod, int what, void *arg);
USB_DECLARE_DRIVER(ukbd);
@@ -215,7 +213,7 @@ ukbd_intr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status)
(*kbdsw[kbd->kb_index]->intr)(kbd, (void *)status);
}
-DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, usbd_driver_load, 0);
+DRIVER_MODULE(ukbd, uhub, ukbd_driver, ukbd_devclass, ukbd_driver_load, 0);
#include <machine/limits.h>
#include <machine/console.h>
@@ -1227,6 +1225,12 @@ ukbd_ioctl(keyboard_t *kbd, u_long cmd, caddr_t arg)
default:
splx(s);
return genkbd_commonioctl(kbd, cmd, arg);
+
+#ifdef UKBD_DEBUG
+ case USB_SETDEBUG:
+ ukbddebug = *(int *)arg;
+ break;
+#endif
}
splx(s);
@@ -1426,3 +1430,17 @@ keycode2scancode(int keycode, int shift, int up)
return (scancode | (up ? SCAN_RELEASE : SCAN_PRESS));
}
#endif /* UKBD_EMULATE_ATSCANCODE */
+
+static int
+ukbd_driver_load(module_t mod, int what, void *arg)
+{
+ switch (what) {
+ case MOD_LOAD:
+ kbd_add_driver(&ukbd_kbd_driver);
+ break;
+ case MOD_UNLOAD:
+ kbd_delete_driver(&ukbd_kbd_driver);
+ break;
+ }
+ return usbd_driver_load(mod, what, 0);
+}
OpenPOWER on IntegriCloud