kbd.c (fc8be383ecd6ce9edf06e2d7f144fbc14a261c6c) | kbd.c (e9deda23ae07ac86ee4f289ee3ac6979f2205627) |
---|---|
1/*- 2 * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * |
26 * $Id: kbd.c,v 1.2 1999/01/12 10:35:58 yokota Exp $ | 26 * $Id: kbd.c,v 1.3 1999/01/12 12:23:00 yokota Exp $ |
27 */ 28 29#include "kbd.h" 30#include "opt_kbd.h" 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/kernel.h> --- 19 unchanged lines hidden (view full) --- 54 55static int keyboards = 1; 56static keyboard_t *kbd_ini; 57static keyboard_t **keyboard = &kbd_ini; 58static keyboard_switch_t *kbdsw_ini; 59 keyboard_switch_t **kbdsw = &kbdsw_ini; 60 61#ifdef KBD_INSTALL_CDEV | 27 */ 28 29#include "kbd.h" 30#include "opt_kbd.h" 31 32#include <sys/param.h> 33#include <sys/systm.h> 34#include <sys/kernel.h> --- 19 unchanged lines hidden (view full) --- 54 55static int keyboards = 1; 56static keyboard_t *kbd_ini; 57static keyboard_t **keyboard = &kbd_ini; 58static keyboard_switch_t *kbdsw_ini; 59 keyboard_switch_t **kbdsw = &kbdsw_ini; 60 61#ifdef KBD_INSTALL_CDEV |
62 63#define ARRAY_DELTA 4 64 | |
65static struct cdevsw *kbdcdevsw_ini; 66static struct cdevsw **kbdcdevsw = &kbdcdevsw_ini; | 62static struct cdevsw *kbdcdevsw_ini; 63static struct cdevsw **kbdcdevsw = &kbdcdevsw_ini; |
64#endif |
|
67 | 65 |
68static void | 66#define ARRAY_DELTA 4 67 68static int |
69kbd_realloc_array(void) 70{ 71 keyboard_t **new_kbd; 72 keyboard_switch_t **new_kbdsw; | 69kbd_realloc_array(void) 70{ 71 keyboard_t **new_kbd; 72 keyboard_switch_t **new_kbdsw; |
73#ifdef KBD_INSTALL_CDEV |
|
73 struct cdevsw **new_cdevsw; | 74 struct cdevsw **new_cdevsw; |
75#endif |
|
74 int newsize; 75 int s; 76 77 s = spltty(); 78 newsize = ((keyboards + ARRAY_DELTA)/ARRAY_DELTA)*ARRAY_DELTA; 79 new_kbd = malloc(sizeof(*new_kbd)*newsize, M_DEVBUF, M_NOWAIT); | 76 int newsize; 77 int s; 78 79 s = spltty(); 80 newsize = ((keyboards + ARRAY_DELTA)/ARRAY_DELTA)*ARRAY_DELTA; 81 new_kbd = malloc(sizeof(*new_kbd)*newsize, M_DEVBUF, M_NOWAIT); |
82 if (new_kbd == NULL) { 83 splx(s); 84 return ENOMEM; 85 } |
|
80 new_kbdsw = malloc(sizeof(*new_kbdsw)*newsize, M_DEVBUF, M_NOWAIT); | 86 new_kbdsw = malloc(sizeof(*new_kbdsw)*newsize, M_DEVBUF, M_NOWAIT); |
87 if (new_kbdsw == NULL) { 88 free(new_kbd, M_DEVBUF); 89 splx(s); 90 return ENOMEM; 91 } 92#ifdef KBD_INSTALL_CDEV |
|
81 new_cdevsw = malloc(sizeof(*new_cdevsw)*newsize, M_DEVBUF, M_NOWAIT); | 93 new_cdevsw = malloc(sizeof(*new_cdevsw)*newsize, M_DEVBUF, M_NOWAIT); |
94 if (new_cdevsw == NULL) { 95 free(new_kbd, M_DEVBUF); 96 free(new_kbdsw, M_DEVBUF); 97 splx(s); 98 return ENOMEM; 99 } 100#endif |
|
82 bzero(new_kbd, sizeof(*new_kbd)*newsize); 83 bzero(new_kbdsw, sizeof(*new_kbdsw)*newsize); | 101 bzero(new_kbd, sizeof(*new_kbd)*newsize); 102 bzero(new_kbdsw, sizeof(*new_kbdsw)*newsize); |
84 bzero(new_cdevsw, sizeof(*new_cdevsw)*newsize); | |
85 bcopy(keyboard, new_kbd, sizeof(*keyboard)*keyboards); 86 bcopy(kbdsw, new_kbdsw, sizeof(*kbdsw)*keyboards); | 103 bcopy(keyboard, new_kbd, sizeof(*keyboard)*keyboards); 104 bcopy(kbdsw, new_kbdsw, sizeof(*kbdsw)*keyboards); |
105#ifdef KBD_INSTALL_CDEV 106 bzero(new_cdevsw, sizeof(*new_cdevsw)*newsize); |
|
87 bcopy(kbdcdevsw, new_cdevsw, sizeof(*kbdcdevsw)*keyboards); | 107 bcopy(kbdcdevsw, new_cdevsw, sizeof(*kbdcdevsw)*keyboards); |
108#endif |
|
88 if (keyboards > 1) { 89 free(keyboard, M_DEVBUF); 90 free(kbdsw, M_DEVBUF); | 109 if (keyboards > 1) { 110 free(keyboard, M_DEVBUF); 111 free(kbdsw, M_DEVBUF); |
112#ifdef KBD_INSTALL_CDEV |
|
91 free(kbdcdevsw, M_DEVBUF); | 113 free(kbdcdevsw, M_DEVBUF); |
114#endif |
|
92 } 93 keyboard = new_kbd; 94 kbdsw = new_kbdsw; | 115 } 116 keyboard = new_kbd; 117 kbdsw = new_kbdsw; |
118#ifdef KBD_INSTALL_CDEV |
|
95 kbdcdevsw = new_cdevsw; | 119 kbdcdevsw = new_cdevsw; |
120#endif |
|
96 keyboards = newsize; 97 splx(s); 98 99 if (bootverbose) 100 printf("kbd: new array size %d\n", keyboards); | 121 keyboards = newsize; 122 splx(s); 123 124 if (bootverbose) 125 printf("kbd: new array size %d\n", keyboards); |
126 127 return 0; |
|
101} 102 | 128} 129 |
103#endif /* KBD_INSTALL_CDEV */ 104 | |
105/* 106 * Low-level keyboard driver functions 107 * Keyboard subdrivers, such as the AT keyboard driver and the USB keyboard 108 * driver, call these functions to initialize the keyboard_t structure 109 * and register it to the virtual keyboard driver `kbd'. 110 */ 111 112/* initialize the keyboard_t structure */ 113void 114kbd_init_struct(keyboard_t *kbd, char *name, int type, int unit, int config, 115 int port, int port_size) 116{ 117 kbd->kb_flags = KB_NO_DEVICE; /* device has not been found */ 118 kbd->kb_name = name; 119 kbd->kb_type = type; 120 kbd->kb_unit = unit; | 130/* 131 * Low-level keyboard driver functions 132 * Keyboard subdrivers, such as the AT keyboard driver and the USB keyboard 133 * driver, call these functions to initialize the keyboard_t structure 134 * and register it to the virtual keyboard driver `kbd'. 135 */ 136 137/* initialize the keyboard_t structure */ 138void 139kbd_init_struct(keyboard_t *kbd, char *name, int type, int unit, int config, 140 int port, int port_size) 141{ 142 kbd->kb_flags = KB_NO_DEVICE; /* device has not been found */ 143 kbd->kb_name = name; 144 kbd->kb_type = type; 145 kbd->kb_unit = unit; |
121 kbd->kb_config = config; | 146 kbd->kb_config = config & ~KB_CONF_PROBE_ONLY; |
122 kbd->kb_led = 0; /* unknown */ 123 kbd->kb_io_base = port; 124 kbd->kb_io_size = port_size; 125 kbd->kb_data = NULL; 126 kbd->kb_keymap = NULL; 127 kbd->kb_accentmap = NULL; 128 kbd->kb_fkeytab = NULL; 129 kbd->kb_fkeytab_size = 0; | 147 kbd->kb_led = 0; /* unknown */ 148 kbd->kb_io_base = port; 149 kbd->kb_io_size = port_size; 150 kbd->kb_data = NULL; 151 kbd->kb_keymap = NULL; 152 kbd->kb_accentmap = NULL; 153 kbd->kb_fkeytab = NULL; 154 kbd->kb_fkeytab_size = 0; |
155 kbd->kb_delay1 = KB_DELAY1; /* these values are advisory only */ 156 kbd->kb_delay2 = KB_DELAY2; |
|
130} 131 132void 133kbd_set_maps(keyboard_t *kbd, keymap_t *keymap, accentmap_t *accmap, 134 fkeytab_t *fkeymap, int fkeymap_size) 135{ 136 kbd->kb_keymap = keymap; 137 kbd->kb_accentmap = accmap; --- 8 unchanged lines hidden (view full) --- 146 keyboard_driver_t **list; 147 keyboard_driver_t *p; 148 int index; 149 150 for (index = 0; index < keyboards; ++index) { 151 if (keyboard[index] == NULL) 152 break; 153 } | 157} 158 159void 160kbd_set_maps(keyboard_t *kbd, keymap_t *keymap, accentmap_t *accmap, 161 fkeytab_t *fkeymap, int fkeymap_size) 162{ 163 kbd->kb_keymap = keymap; 164 kbd->kb_accentmap = accmap; --- 8 unchanged lines hidden (view full) --- 173 keyboard_driver_t **list; 174 keyboard_driver_t *p; 175 int index; 176 177 for (index = 0; index < keyboards; ++index) { 178 if (keyboard[index] == NULL) 179 break; 180 } |
154 if (index >= keyboards) 155 return -1; | 181 if (index >= keyboards) { 182 if (kbd_realloc_array()) 183 return -1; 184 } |
156 157 kbd->kb_index = index; 158 KBD_UNBUSY(kbd); 159 KBD_VALID(kbd); 160 kbd->kb_active = 0; /* disabled until someone calls kbd_enable() */ 161 kbd->kb_token = NULL; 162 kbd->kb_callback.kc_func = NULL; 163 kbd->kb_callback.kc_arg = NULL; --- 247 unchanged lines hidden (view full) --- 411 412 s = spltty(); 413 kbd->kb_minor = minor(dev); 414 kbdcdevsw[kbd->kb_index] = cdevsw; 415 splx(s); 416 417 /* XXX: DEVFS? */ 418 | 185 186 kbd->kb_index = index; 187 KBD_UNBUSY(kbd); 188 KBD_VALID(kbd); 189 kbd->kb_active = 0; /* disabled until someone calls kbd_enable() */ 190 kbd->kb_token = NULL; 191 kbd->kb_callback.kc_func = NULL; 192 kbd->kb_callback.kc_arg = NULL; --- 247 unchanged lines hidden (view full) --- 440 441 s = spltty(); 442 kbd->kb_minor = minor(dev); 443 kbdcdevsw[kbd->kb_index] = cdevsw; 444 splx(s); 445 446 /* XXX: DEVFS? */ 447 |
419 if (kbd->kb_index + 1 >= keyboards) 420 kbd_realloc_array(); 421 | |
422 printf("kbd%d at %s%d\n", kbd->kb_index, kbd->kb_name, kbd->kb_unit); 423 return 0; 424} 425 426int 427kbd_detach(dev_t dev, keyboard_t *kbd, struct cdevsw *cdevsw) 428{ 429 int s; --- 410 unchanged lines hidden (view full) --- 840 case KDGKBTYPE: /* get keyboard type */ 841 *(int *)arg = kbd->kb_type; 842 break; 843 844 case GIO_KEYMAP: /* get keyboard translation table */ 845 bcopy(kbd->kb_keymap, arg, sizeof(*kbd->kb_keymap)); 846 break; 847 case PIO_KEYMAP: /* set keyboard translation table */ | 448 printf("kbd%d at %s%d\n", kbd->kb_index, kbd->kb_name, kbd->kb_unit); 449 return 0; 450} 451 452int 453kbd_detach(dev_t dev, keyboard_t *kbd, struct cdevsw *cdevsw) 454{ 455 int s; --- 410 unchanged lines hidden (view full) --- 866 case KDGKBTYPE: /* get keyboard type */ 867 *(int *)arg = kbd->kb_type; 868 break; 869 870 case GIO_KEYMAP: /* get keyboard translation table */ 871 bcopy(kbd->kb_keymap, arg, sizeof(*kbd->kb_keymap)); 872 break; 873 case PIO_KEYMAP: /* set keyboard translation table */ |
874#ifndef KBD_DISABLE_KEYMAP_LOAD |
|
848 bzero(kbd->kb_accentmap, sizeof(*kbd->kb_accentmap)); 849 bcopy(arg, kbd->kb_keymap, sizeof(*kbd->kb_keymap)); 850 break; | 875 bzero(kbd->kb_accentmap, sizeof(*kbd->kb_accentmap)); 876 bcopy(arg, kbd->kb_keymap, sizeof(*kbd->kb_keymap)); 877 break; |
878#else 879 splx(s); 880 return ENODEV; 881#endif |
|
851 852 case GIO_KEYMAPENT: /* get keyboard translation table entry */ 853 keyp = (keyarg_t *)arg; 854 if (keyp->keynum >= sizeof(kbd->kb_keymap->key) 855 /sizeof(kbd->kb_keymap->key[0])) { 856 splx(s); 857 return EINVAL; 858 } 859 bcopy(&kbd->kb_keymap->key[keyp->keynum], &keyp->key, 860 sizeof(keyp->key)); 861 break; 862 case PIO_KEYMAPENT: /* set keyboard translation table entry */ | 882 883 case GIO_KEYMAPENT: /* get keyboard translation table entry */ 884 keyp = (keyarg_t *)arg; 885 if (keyp->keynum >= sizeof(kbd->kb_keymap->key) 886 /sizeof(kbd->kb_keymap->key[0])) { 887 splx(s); 888 return EINVAL; 889 } 890 bcopy(&kbd->kb_keymap->key[keyp->keynum], &keyp->key, 891 sizeof(keyp->key)); 892 break; 893 case PIO_KEYMAPENT: /* set keyboard translation table entry */ |
894#ifndef KBD_DISABLE_KEYMAP_LOAD |
|
863 keyp = (keyarg_t *)arg; 864 if (keyp->keynum >= sizeof(kbd->kb_keymap->key) 865 /sizeof(kbd->kb_keymap->key[0])) { 866 splx(s); 867 return EINVAL; 868 } 869 bcopy(&keyp->key, &kbd->kb_keymap->key[keyp->keynum], 870 sizeof(keyp->key)); 871 break; | 895 keyp = (keyarg_t *)arg; 896 if (keyp->keynum >= sizeof(kbd->kb_keymap->key) 897 /sizeof(kbd->kb_keymap->key[0])) { 898 splx(s); 899 return EINVAL; 900 } 901 bcopy(&keyp->key, &kbd->kb_keymap->key[keyp->keynum], 902 sizeof(keyp->key)); 903 break; |
904#else 905 splx(s); 906 return ENODEV; 907#endif |
|
872 873 case GIO_DEADKEYMAP: /* get accent key translation table */ 874 bcopy(kbd->kb_accentmap, arg, sizeof(*kbd->kb_accentmap)); 875 break; 876 case PIO_DEADKEYMAP: /* set accent key translation table */ | 908 909 case GIO_DEADKEYMAP: /* get accent key translation table */ 910 bcopy(kbd->kb_accentmap, arg, sizeof(*kbd->kb_accentmap)); 911 break; 912 case PIO_DEADKEYMAP: /* set accent key translation table */ |
913#ifndef KBD_DISABLE_KEYMAP_LOAD |
|
877 bcopy(arg, kbd->kb_accentmap, sizeof(*kbd->kb_accentmap)); 878 break; | 914 bcopy(arg, kbd->kb_accentmap, sizeof(*kbd->kb_accentmap)); 915 break; |
916#else 917 splx(s); 918 return ENODEV; 919#endif |
|
879 880 case GETFKEY: /* get functionkey string */ 881 fkeyp = (fkeyarg_t *)arg; 882 if (fkeyp->keynum >= kbd->kb_fkeytab_size) { 883 splx(s); 884 return EINVAL; 885 } 886 bcopy(kbd->kb_fkeytab[fkeyp->keynum].str, fkeyp->keydef, 887 kbd->kb_fkeytab[fkeyp->keynum].len); 888 fkeyp->flen = kbd->kb_fkeytab[fkeyp->keynum].len; 889 break; 890 case SETFKEY: /* set functionkey string */ | 920 921 case GETFKEY: /* get functionkey string */ 922 fkeyp = (fkeyarg_t *)arg; 923 if (fkeyp->keynum >= kbd->kb_fkeytab_size) { 924 splx(s); 925 return EINVAL; 926 } 927 bcopy(kbd->kb_fkeytab[fkeyp->keynum].str, fkeyp->keydef, 928 kbd->kb_fkeytab[fkeyp->keynum].len); 929 fkeyp->flen = kbd->kb_fkeytab[fkeyp->keynum].len; 930 break; 931 case SETFKEY: /* set functionkey string */ |
932#ifndef KBD_DISABLE_KEYMAP_LOAD |
|
891 fkeyp = (fkeyarg_t *)arg; 892 if (fkeyp->keynum >= kbd->kb_fkeytab_size) { 893 splx(s); 894 return EINVAL; 895 } 896 kbd->kb_fkeytab[fkeyp->keynum].len = imin(fkeyp->flen, MAXFK); 897 bcopy(fkeyp->keydef, kbd->kb_fkeytab[fkeyp->keynum].str, 898 kbd->kb_fkeytab[fkeyp->keynum].len); 899 break; | 933 fkeyp = (fkeyarg_t *)arg; 934 if (fkeyp->keynum >= kbd->kb_fkeytab_size) { 935 splx(s); 936 return EINVAL; 937 } 938 kbd->kb_fkeytab[fkeyp->keynum].len = imin(fkeyp->flen, MAXFK); 939 bcopy(fkeyp->keydef, kbd->kb_fkeytab[fkeyp->keynum].str, 940 kbd->kb_fkeytab[fkeyp->keynum].len); 941 break; |
942#else 943 splx(s); 944 return ENODEV; 945#endif |
|
900 901 default: 902 splx(s); 903 return ENOIOCTL; 904 } 905 906 splx(s); 907 return 0; --- 291 unchanged lines hidden --- | 946 947 default: 948 splx(s); 949 return ENOIOCTL; 950 } 951 952 splx(s); 953 return 0; --- 291 unchanged lines hidden --- |