kbdmux(4) keyboard multiplexer integration

o Add two new ioctl's KBADDKBD and KBRELKBD. These are used to add and remove
  keyboard to (and from) kbdmux(4) keyboard multiplexer;

o Introduce new kbd_find_keyboard2() function. It does exactly the same job
  as kbd_find_keyboard() function except it allows to specify starting index.
  This function can be used to iterate over keyboards array;

o Re-implement kbd_find_keyboard() as call to kbd_find_keyboard2() with starting
  index of zero;

o Make sure syscons(4) passed KBADDKBD and KBRELKBD ioctl's onto currently
  active keyboard.

These changes should not have any visible effect.

MFC after:	1 week
This commit is contained in:
Maksim Yevmenkin 2005-07-13 23:58:57 +00:00
parent 2eb9396fb7
commit 04551c6ce5
4 changed files with 29 additions and 3 deletions

View File

@ -282,13 +282,19 @@ keyboard_switch_t
* exclusive use.
*/
/* find the keyboard specified by a driver name and a unit number */
/*
* find the keyboard specified by a driver name and a unit number
* starting at given index
*/
int
kbd_find_keyboard(char *driver, int unit)
kbd_find_keyboard2(char *driver, int unit, int index)
{
int i;
for (i = 0; i < keyboards; ++i) {
if ((index < 0) || (index >= keyboards))
return (-1);
for (i = index; i < keyboards; ++i) {
if (keyboard[i] == NULL)
continue;
if (!KBD_IS_VALID(keyboard[i]))
@ -299,9 +305,17 @@ kbd_find_keyboard(char *driver, int unit)
continue;
return (i);
}
return (-1);
}
/* find the keyboard specified by a driver name and a unit number */
int
kbd_find_keyboard(char *driver, int unit)
{
return (kbd_find_keyboard2(driver, unit, 0));
}
/* allocate a keyboard */
int
kbd_allocate(char *driver, int unit, void *id, kbd_callback_func_t *func,

View File

@ -196,6 +196,7 @@ int kbd_release(keyboard_t *kbd, void *id);
int kbd_change_callback(keyboard_t *kbd, void *id,
kbd_callback_func_t *func, void *arg);
int kbd_find_keyboard(char *driver, int unit);
int kbd_find_keyboard2(char *driver, int unit, int index);
keyboard_t *kbd_get_keyboard(int index);
/* a back door for the console driver to tickle the keyboard driver XXX */

View File

@ -1164,6 +1164,13 @@ scioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td)
*(int *)data = scp->status & LED_MASK;
return 0;
case KBADDKBD: /* add/remove keyboard to/from mux */
case KBRELKBD:
error = kbd_ioctl(sc->kbd, cmd, data);
if (error == ENOIOCTL)
error = ENODEV;
return error;
case CONS_SETKBD: /* set the new keyboard */
{
keyboard_t *newkbd;

View File

@ -60,6 +60,10 @@
/* set keyboard repeat rate (obsolete, use KDSETREPEAT below) */
#define KDSETRAD _IO('K', 67 /*, int */)
/* add/remove keyboard to/from mux */
#define KBADDKBD _IOW('K', 68, int) /* add keyboard */
#define KBRELKBD _IOW('K', 69, int) /* release keyboard */
/* see console.h for the definition of the following ioctl */
#if notdef
#define KDRASTER _IOW('K', 100, scr_size_t)