diff options
author | yokota <yokota@FreeBSD.org> | 1999-12-13 10:36:36 +0000 |
---|---|---|
committer | yokota <yokota@FreeBSD.org> | 1999-12-13 10:36:36 +0000 |
commit | 5fa506591286dadad6dba89bf9ca24d1369beb33 (patch) | |
tree | 3be6f5cad606f048450dae2d9b08b19d7ab290d8 /sys | |
parent | dd933059e17546022cfd5d8f0461def61da4153f (diff) | |
download | FreeBSD-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.c | 44 | ||||
-rw-r--r-- | sys/dev/kbd/kbdreg.h | 5 | ||||
-rw-r--r-- | sys/dev/usb/ukbd.c | 26 |
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); +} |