diff --git a/sys/arch/hpcmips/dev/skbd.c b/sys/arch/hpcmips/dev/skbd.c deleted file mode 100644 index 22f263801bb3..000000000000 --- a/sys/arch/hpcmips/dev/skbd.c +++ /dev/null @@ -1,400 +0,0 @@ -/* $NetBSD: skbd.c,v 1.5 2000/05/04 08:19:00 takemura Exp $ */ - -/*- - * Copyright (c) 1999, 2000 UCHIYAMA Yasushi. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -#include "opt_tx39xx.h" - -#include -#include -#include - -#include - -#include -#include - -#include -#include -#include - -#include "opt_wsdisplay_compat.h" -#include -#include -#include -#include -#include -#include -#ifdef WSDISPLAY_COMPAT_RAWKBD -#include -#endif - -#include -#include - -#ifdef TX39XX -#include -#include -#endif - -struct skbd_softc; - -struct skbd_chip { - skbd_tag_t sk_ic; - const u_int8_t *sk_keymap; - const int *sk_special; - int sk_polling; - int sk_console; - u_int sk_type; - int sk_data; - - int sk_enabled; - struct device *sk_wskbddev; - struct skbd_softc* sk_sc; /* back link */ -#ifdef WSDISPLAY_COMPAT_RAWKBD - int sk_rawkbd; -#endif -}; - -struct skbd_softc { - struct device sc_dev; - struct skbd_chip *sc_sk; -}; - -int skbd_match __P((struct device*, struct cfdata*, void*)); -void skbd_attach __P((struct device*, struct device*, void*)); - -int __skbd_input __P((void*, int, int)); -void __skbd_input_hook __P((void*)); - -int skbd_keymap_lookup __P((struct skbd_chip*)); - -struct cfattach skbd_ca = { - sizeof(struct skbd_softc), skbd_match, skbd_attach -}; - -/* wskbd accessopts */ -int skbd_enable __P((void *, int)); -void skbd_set_leds __P((void *, int)); -int skbd_ioctl __P((void *, u_long, caddr_t, int, struct proc *)); - -/* consopts */ -struct skbd_chip skbd_consdata; -void skbd_cngetc __P((void*, u_int*, int*)); -void skbd_cnpollc __P((void *, int)); - -const struct wskbd_accessops skbd_accessops = { - skbd_enable, - skbd_set_leds, - skbd_ioctl, -}; - -const struct wskbd_consops skbd_consops = { - skbd_cngetc, - skbd_cnpollc, -}; - -struct wskbd_mapdata skbd_keymapdata = { - pckbd_keydesctab, - KB_US -}; - -int -skbd_match(parent, cf, aux) - struct device *parent; - struct cfdata *cf; - void *aux; -{ - return (1); -} - -void -skbd_attach(parent, self, aux) - struct device *parent; - struct device *self; - void *aux; -{ - struct skbd_attach_args *saa = aux; - struct skbd_softc *sc = (void*)self; - struct skbd_chip *sk; - struct wskbddev_attach_args wa; - - sc->sc_sk = sk = &skbd_consdata; - sk->sk_polling = 0; - /* back link */ - sk->sk_sc = sc; - /* buffer/controller chip */ - sk->sk_ic = saa->saa_ic; - - /* - * platform dependent keymapping - */ - if (skbd_keymap_lookup(sk)) { - printf(": no keymap."); - } - - printf("\n"); - - /* - * register skbd function to parent controller. - */ - skbdif_establish(sk->sk_ic, __skbd_input, __skbd_input_hook, sk); - - wa.console = sk->sk_console; - wa.keymap = &skbd_keymapdata; - wa.accessops = &skbd_accessops; - wa.accesscookie = sk; - - sk->sk_wskbddev = config_found(self, &wa, wskbddevprint); -} - -int -skbd_print(aux, pnp) - void *aux; - const char *pnp; -{ - return (pnp ? QUIET : UNCONF); -} - -int -skbd_keymap_lookup(sk) - struct skbd_chip *sk; -{ - const struct skbd_keymap_table *tab; - platid_mask_t mask; - - for (tab = skbd_keymap_table; tab->st_keymap; tab++) { - - mask = PLATID_DEREF(&tab->st_platform); - - if (platid_match(&platid, &mask)) { - sk->sk_keymap = tab->st_keymap; - sk->sk_special = tab->st_special; - skbd_keymapdata.layout = tab->st_layout; - - return (0); - } - } - - /* no keymap. use default. */ - - sk->sk_keymap = default_keymap; - sk->sk_special = default_special_keymap; - skbd_keymapdata.layout = KB_US; - - return (1); -} - -void -__skbd_input_hook(arg) - void *arg; -{ - struct skbd_chip *sk = arg; - - if (sk->sk_polling) { - sk->sk_type = WSCONS_EVENT_ALL_KEYS_UP; - } -} - - -int -__skbd_input(arg, flag, scancode) - void *arg; - int flag, scancode; -{ - struct skbd_chip *sk = arg; - int type, key; - - if (flag) { -#ifdef TX39XX - tx_sound_click(tx_conf_get_tag()); -#endif - type = WSCONS_EVENT_KEY_DOWN; - } else { - type = WSCONS_EVENT_KEY_UP; - } - - if ((key = sk->sk_keymap[scancode]) == UNK) { - printf("skbd: unknown scan code %#x\n", scancode); - - return (0); - } - - if (key == IGN) { - return (0); - } - - if (key == SPL) { - if (!flag) - return (0); - - if (scancode == sk->sk_special[KEY_SPECIAL_OFF]) - printf("off button\n"); - else if (scancode == sk->sk_special[KEY_SPECIAL_LIGHT]) - config_hook_call(CONFIG_HOOK_BUTTONEVENT, - CONFIG_HOOK_BUTTONEVENT_LIGHT, - 0); - else - printf("unknown special key %d\n", scancode); - - return (0); - } - - if (sk->sk_polling) { - sk->sk_type = type; - sk->sk_data = sk->sk_keymap[scancode]; - } else { -#ifdef WSDISPLAY_COMPAT_RAWKBD - if (sk->sk_rawkbd) { - int n; - u_char data[16]; - n = pckbd_encode(type, sk->sk_keymap[scancode], data); - wskbd_rawinput(sk->sk_wskbddev, data, n); - } else -#endif - wskbd_input(sk->sk_wskbddev, type, - sk->sk_keymap[scancode]); - } - - return (0); -} - -/* - * console support routines - */ -int -skbd_cnattach(ic) - struct skbd_controller *ic; -{ - struct skbd_chip *sk = &skbd_consdata; - - sk->sk_console = 1; - - skbd_keymap_lookup(sk); - - /* attach controller */ - sk->sk_ic = ic; - - skbdif_establish(sk->sk_ic, __skbd_input, __skbd_input_hook, sk); - - wskbd_cnattach(&skbd_consops, sk, &skbd_keymapdata); - - return (0); -} - -void -skbd_cngetc(arg, type, data) - void *arg; - u_int *type; - int *data; -{ - struct skbd_chip *sk = arg; - int s; - - if (!sk->sk_console || !sk->sk_polling || !sk->sk_ic) { - return; - } - - s = splimp(); - - if (sk->sk_type == WSCONS_EVENT_ALL_KEYS_UP) { - /* inquire of controller */ - skbdif_poll(sk->sk_ic); - } - - *type = sk->sk_type; - *data = sk->sk_data; - - sk->sk_type = WSCONS_EVENT_ALL_KEYS_UP; - - splx(s); -} - -void -skbd_cnpollc(arg, on) - void *arg; - int on; -{ - struct skbd_chip *sk = arg; - int s = splimp(); - - sk->sk_polling = on; - - splx(s); -} - -int -skbd_enable(arg, on) - void *arg; - int on; -{ - struct skbd_chip *sk = arg; - - if (on) { - if (sk->sk_enabled) { - return (EBUSY); - } - - sk->sk_enabled = 1; - } else { - if (sk->sk_console) { - return (EBUSY); - } - - sk->sk_enabled = 0; - } - - - return (0); -} - -void -skbd_set_leds(arg, leds) - void *arg; - int leds; -{ - /* No LEDs */ -} - -int -skbd_ioctl(arg, cmd, data, flag, p) - void *arg; - u_long cmd; - caddr_t data; - int flag; - struct proc *p; -{ -#ifdef WSDISPLAY_COMPAT_RAWKBD - struct skbd_chip *sk = arg; -#endif - switch (cmd) { -#ifdef WSDISPLAY_COMPAT_RAWKBD - case WSKBDIO_SETMODE: - sk->sk_rawkbd = (*(int *)data == WSKBD_RAW); - return (0); -#endif - } - return (-1); -} diff --git a/sys/arch/hpcmips/dev/skbdkeymap.h b/sys/arch/hpcmips/dev/skbdkeymap.h deleted file mode 100644 index eb9ecd0bed7e..000000000000 --- a/sys/arch/hpcmips/dev/skbdkeymap.h +++ /dev/null @@ -1,177 +0,0 @@ -/* $NetBSD: skbdkeymap.h,v 1.7 2000/05/13 20:34:13 uch Exp $ */ - -/* - * Copyright (c) 1999, 2000, by UCHIYAMA Yasushi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the developer may NOT be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ -#define UNK 255 /* unknown */ -#define IGN 254 /* ignore */ -#define SPL 253 /* special key */ - -#define KEY_SPECIAL_OFF 0 -#define KEY_SPECIAL_LIGHT 1 - -const u_int8_t default_keymap[] = { -/* 0 1 2 3 4 5 6 7 */ -/* 0 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 1 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 2 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 3 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 4 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 5 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 6 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 7 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 8 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/* 9 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/*10 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/*11 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/*12 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/*13 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/*14 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK, -/*15 */ UNK, UNK, UNK, UNK, UNK, UNK, UNK, UNK -}; - -const int default_special_keymap[] = { - [KEY_SPECIAL_OFF] = -1, - [KEY_SPECIAL_LIGHT] = -1 -}; - -const u_int8_t tc5165_mobilon_keymap[] = { -/* 0 1 2 3 4 5 6 7 */ -/* 0 */ 37 , 45 , 44 , UNK, 9 , 51 , 23 , UNK, -/* 1 */ UNK, 56 , UNK, UNK, UNK, UNK, UNK, UNK, -/* 2 */ UNK, UNK, 29 , UNK, UNK, UNK, UNK, UNK, -/* 3 */ 24 , 203, UNK, 38 , 10 , 27 , 13 , UNK, -/* 4 */ 40 , UNK, UNK, 39 , 26 , 53 , 11 , 12 , -/* 5 */ UNK, UNK, UNK, 53 , 25 , UNK, UNK, SPL, /* Light */ -/* 6 */ 208, UNK, UNK, UNK, 52 , UNK, 43 , 14 , -/* 7 */ 205, 200, UNK, UNK, SPL, UNK, UNK, 28 , /* Off key */ -/* 8 */ UNK, 41 , 59 , 15 , 2 , UNK, UNK, UNK, -/* 9 */ 63 , 64 , 1 , UNK, 65 , 16 , 17 , UNK, -/*10 */ 60 , UNK, 61 , 62 , 3 , UNK, UNK, UNK, -/*11 */ UNK, UNK, UNK, 42 , 58 , UNK, UNK, UNK, -/*12 */ 47 , 33 , 46 , 5 , 4 , 18 , 19 , UNK, -/*13 */ 34 , 35 , 20 , 48 , 6 , 7 , 21 , 49 , -/*14 */ 22 , 31 , 32 , 36 , 8 , 30 , 50 , 57 , -/*15 */ UNK, IGN, UNK, UNK, UNK, UNK, UNK, UNK /* Windows key */ -}; - -const int tc5165_mobilon_special_keymap[] = { - [KEY_SPECIAL_OFF] = 60, - [KEY_SPECIAL_LIGHT] = 47 -}; - -const u_int8_t tc5165_telios_jp_keymap[] = { -/* 0 1 2 3 4 5 6 7 */ -/* 0 */ 58, 15, IGN, 1, IGN, IGN, IGN, IGN, -/* 1 */ IGN, IGN, IGN, IGN, 54, 42, IGN, IGN, -/* 2 */ 31, 18, 4, IGN, IGN, 32, 45, 59, -/* 3 */ 33, 19, 5, 61, IGN, 46, 123, 60, -/* 4 */ 35, 21, 8, 64, IGN, 48, 49, 63, -/* 5 */ 17, 16, 3, IGN, 2, 30, 44, 41, -/* 6 */ IGN, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/* 7 */ IGN, IGN, IGN, IGN, IGN, IGN, 56, IGN, -/* 8 */ 34, 20, 7, IGN, 6, 47, 57, 62, -/* 9 */ IGN, IGN, IGN, IGN, IGN, IGN, 29, IGN, -/*10 */ 27, 125, 13, 75, 80, 40, 115, 68, -/*11 */ 39, 26, 25, IGN, 12, 52, 53, 67, -/*12 */ 37, 24, 11, IGN, 10, 38, 51, 66, -/*13 */ 23, 22, 9, IGN, IGN, 36, 50, 65, -/*14 */ 28, 43, 14, 72, 77, IGN, IGN, 211, -/*15 */ IGN, IGN, IGN, IGN, IGN, IGN, 221, IGN -}; - -const u_int8_t tc5165_compaq_c_jp_keymap[] = { -/* 0 1 2 3 4 5 6 7 */ -/* 0 */ 38, 50, 49, 48, 47, 46, 45, 44, -/* 1 */ 56, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/* 2 */ 13, IGN, 112, 121, 123, 41, 28, 57, -/* 3 */ 77, 75, 80, 72, 39, 53, 52, 51, -/* 4 */ 24, 25, 40, IGN, 43, 26, 115, 58, -/* 5 */ 54, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/* 6 */ IGN, IGN, IGN, SPL, IGN, IGN, IGN, IGN, /* Light */ -/* 7 */ IGN, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/* 8 */ 42, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/* 9 */ 29, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/*10 */ 221, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/*11 */ 221, IGN, IGN, IGN, IGN, IGN, IGN, IGN, -/*12 */ 14, 27, 12, 11, 10, 15, 1, 125, -/*13 */ 9, 8, 7, 6, 5, 4, 3, 2, -/*14 */ 23, 22, 21, 20, 19, 18, 17, 16, -/*15 */ 37, 36, 35, 34, 33, 32, 31, 30 -}; - -const int tc5165_compaq_c_jp_special_keymap[] = { - [KEY_SPECIAL_OFF] = -1, /* don't have off button */ - [KEY_SPECIAL_LIGHT] = 51 -}; - -const u_int8_t m38813c_keymap[] = { -/* 0 1 2 3 4 5 6 7 */ -/* 0 */ 0, 1, 2, 3, 4, 5, 6, 7, -/* 1 */ 8, 9, 10, 11, 12, 13, 14, 15, -/* 2 */ 16, 17, 18, 19, 20, 21, 22, 23, -/* 3 */ 24, 25, 26, 27, 28, 29, 30, 31, -/* 4 */ 32, 33, 34, 35, 36, 37, 38, 39, -/* 5 */ 40, 41, 42, 43, 44, 45, 46, 47, -/* 6 */ 48, 49, 50, 51, 52, 53, 54, 55, -/* 7 */ 56, 57, 58, 59, 60, 61, 62, 63, -/* 8 */ 64, 65, 66, 67, 68, 69, 70, 71, -/* 9 */ 72, 73, 74, 75, 76, 77, 78, 79, -/*10 */ 80, 81, 82, 83, 84, 85, 86, 87, -/*11 */ 88, 89, 90, 91, 92, 93, 94, 95, -/*12 */ 96, 97, 98, 99, 100, 101, 102, 103, -/*13 */ 104, 105, 106, 107, 108, 109, 110, 111, -/*14 */ 112, 113, 114, 115, 116, 117, 118, 119, -/*15 */ 120, 121, 122, 123, 124, 125, 126, 127 -}; - -const struct skbd_keymap_table { - platid_t st_platform; - const u_int8_t *st_keymap; - const int *st_special; - kbd_t st_layout; -} skbd_keymap_table[] = { - {{{PLATID_WILD, PLATID_MACH_COMPAQ_C}}, - tc5165_compaq_c_jp_keymap, - tc5165_compaq_c_jp_special_keymap, - KB_JP}, - - {{{PLATID_WILD, PLATID_MACH_VICTOR_INTERLINK}}, - m38813c_keymap, - default_special_keymap, - KB_JP}, - - {{{PLATID_WILD, PLATID_MACH_SHARP_TELIOS}}, - tc5165_telios_jp_keymap, - default_special_keymap, - KB_JP}, - - {{{PLATID_WILD, PLATID_MACH_SHARP_MOBILON}}, - tc5165_mobilon_keymap, - tc5165_mobilon_special_keymap, - KB_US}, - - {{{0, 0}}, NULL, 0} -}; diff --git a/sys/arch/hpcmips/dev/skbdvar.h b/sys/arch/hpcmips/dev/skbdvar.h deleted file mode 100644 index 1e241cc3e9da..000000000000 --- a/sys/arch/hpcmips/dev/skbdvar.h +++ /dev/null @@ -1,63 +0,0 @@ -/* $NetBSD: skbdvar.h,v 1.1 1999/12/08 15:49:19 uch Exp $ */ - -/* - * Copyright (c) 1999, by UCHIYAMA Yasushi - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. The name of the developer may NOT be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -typedef struct skbd_controller *skbd_tag_t; - -struct skbd_controller { - /* controller interface */ - void *skif_v; - int (*skif_establish) __P((void*, - int (*)(void*, int, int), - void (*)(void*), - void*)); - int (*skif_poll) __P((void*)); - - /* keyboard interface */ - void *sk_v; - void (*sk_input_hook) __P((void*)); - int (*sk_input) __P((void*, int, int)); -}; - -struct skbd_attach_args { - skbd_tag_t saa_ic; -}; - -#define skbdif_establish(c, i, h, a) \ - (*(c)->skif_establish)((c)->skif_v, (i), (h), (a)) -#define skbdif_poll(c) \ - (*(c)->skif_poll)((c)->skif_v) - -#define skbd_input_hook(c) \ - (*(c)->sk_input_hook)((c)->sk_v) -#define skbd_input(c, f, a) \ - (*(c)->sk_input)((c)->sk_v, (f), (a)) - -int skbd_print __P((void*, const char*)); -int skbd_cnattach __P((struct skbd_controller*)); - -