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 ---