December 20, 2005 WSKBD 9

### NAME

wskbd, wskbd_input, wskbd_rawinput, wskbd_cnattach, wskbd_cndetach, wskbddevprint - wscons keyboard support

### SYNOPSIS

```void` wskbd_input(```struct device *kbddev``, u_int type``, int value`)
```void` wskbd_rawinput(```struct device *kbddev``, u_char *buf``, int len`)
```void` wskbd_cnattach(```const struct wskbd_consops *consops``, void *conscookie``, const struct wskbd_mapdata *mapdata`)
```void` wskbd_cndetach(````)
```int` wskbddevprint(```void *aux``, const char *pnp`)

### DESCRIPTION

The wskbd module is a component of the wscons(9) framework to provide machine-independent keyboard support. Most of the support is provided by the wskbd(4) device driver, which must be a child of the hardware device driver.

### DATA TYPES

Keyboard drivers providing support for wscons keyboards will make use of the following data types:

```kbd_t`
  An opaque type describing keyboard properties.

```keysym_t`
  The wscons keyboard-independent symbolic representation of the keypress.

```struct` `wskbd_accessops`
  A structure used to specify the keyboard access functions. All keyboards must provide this structure and pass it to the wskbd(4) child device. It has the following members: `

              int     (*enable)(void *, int);
              void    (*set_leds)(void *, int);
              int     (*ioctl)(void *v, u_long cmd, void *data,
                              int flag, struct lwp *l);

  `

  The ```enable` member defines the function to be called to enable keypress passing to wscons. The ```set_leds` member defined the function to be called to set the LEDs on the keyboard. The ```ioctl` member defines the function to be called to perform keyboard-specific ioctl calls.

  There is a ```void``*` cookie provided by the keyboard driver associated with these functions, which is passed to them when they are invoked.

```struct` `wskbd_consops`
  A structure used to specify the keyboard console operations. All keyboards which can operate as a console must provide this structure and pass it to the wskbd(4) child device. If the keyboard cannot be a console, it is not necessary to specify this structure. It has the following members: `

              void    (*getc)(void *, u_int *, int *);
              void    (*pollc)(void *, int);
              void    (*bell)(void *, u_int, u_int, u_int);

  `

  There is a ```void``*` cookie provided by the keyboard driver associated with these functions, which is passed to them when they are invoked.

```struct` `wscons_keydesc`
  A structure used to describe a keyboard mapping table to convert keyboard-specific keycodes to wscons keysyms. It has the following members: `

              kbd_t   name;           /* name of this map */
              kbd_t   base;           /* map this one is based on */
              int     map_size;       /* size of map */
              const   keysym_t *map;  /* the map itself */

  `

```struct` `wskbd_mapdata`
  A structure used to describe the keyboard layout and operation to interpret the keyboard layout. it contains the following members: `

              const struct wscons_keydesc *keydesc;
              kbd_t layout;

  `

```struct` `wskbddev_attach_args`
  A structure used to attach the wskbd(4) child device. It has the following members: `

              int console;
              const struct wskbd_mapdata *keymap;
              const struct wskbd_accessops *accessops;
              void *accesscookie;

  `

#### Keymaps

Keymaps are a dense stream of ```keysym_t`. A declaration has the following fields:

pos [cmd] normal [shift] [altgr] [shift-altgr]

The fields have the following meanings:

pos
  Always specified as KC(pos) and starts the description of key pos.
cmd
  If the command modifier (KS_Cmd_XXX) is active, the optional command cmd is invoked.
normal
  The keysym if no modifiers are active.
shift
  The keysym if the shift modifier is active.
altgr
  The keysym if the alt-gr modifier is active.
shift-altgr
  The keysym if the shift-alt-gr modifier is active.

If the keysym after pos is not KS_Cmd_XXX, then cmd is empty. The shift, altgr and shift-altgr fields are determined from previous fields if they are not specified. Therefore, there are four valid keysym declarations:

pos [cmd] normal

pos [cmd] normal shift

pos [cmd] normal shift altgr

pos [cmd] normal shift altgr shift-altgr

### FUNCTIONS

wskbd_input(```kbddev``, type``, value`)
  Pass the keypress of value ```value` and type ```type` to wscons keyboard driver. Valid values of ```type` are:

  WSCONS_EVENT_KEY_UP
    Key released.

  WSCONS_EVENT_KEY_DOWN
    Key pressed.

wskbd_rawinput(```kbddev``, buf``, len`)
  Pass the raw keypress in the buffer ```buf` to the wscons keyboard driver. The buffer is ```len` bytes long. This function should only be called if the kernel option WSDISPLAY_COMPAT_RAWKBD is enabled.

wskbd_cnattach(```consops``, conscookie``, mapdata`)
  Attach this keyboard as the console input by specifying the console operations ```consops` and the keyboard mapping table information in ```mapdata`. The functions specified in ```consops` will be called with ```conscookie` as the first argument.

wskbd_cndetach(````)
  Detach this keyboard as the console input.

wskbddevprint(```aux``, pnp`)
  The default wskbd printing routine used by config_found(``). (see autoconf(9)).

### AUTOCONFIGURATION

Keyboard drivers which want to use the wskbd module must be a parent to the wskbd(4) device and provide an attachment interface. To attach the wskbd(4) device, the keyboard driver must allocate and populate a ```wskbddev_attach_args` structure with the supported operations and callbacks and call config_found(``) to perform the attach (see autoconf(9)). The ```keymap` member points to the wskbd_mapdata structure which describes the keycode mapping operations. The ```accessops` member points to the wskbd_accessops structure which describes the keyboard access operations. The ```console` member is a boolean to indicate to wscons whether this keyboard will be used for console input.

### OPERATION

If the keyboard belongs to the system console, it must register the ```wskbd_consops` structure specifying the console operations via wskbd_cnattach(``) at console attach time.

When a keypress arrives from the keyboard, the keyboard driver must perform any necessary character decoding to wscons events and pass the events to wscons via wskbd_input(``). If the kernel is compiled with the option WSDISPLAY_COMPAT_RAWKBD, then the keyboard driver must also pass the raw keyboard data to wscons via wskbd_rawinput(``).

The wscons framework calls back into the hardware driver by invoking the functions that are specified in the accessops structure. The enable(``) and set_leds(``) functions are relatively simple and self-explanatory. The ioctl(``) function is called by the wscons interface to perform keyboard-specific ioctl operations (see ioctl(2)). The argument ```cmd` to the ioctl(``) function specifies the specific command to perform using the data ```data`. Valid commands are listed in ```sys/dev/wscons/wsconsio.h`.

### CODE REFERENCES

This section describes places within the NetBSD source tree where actual code implementing or using the machine-independent wscons subsystem can be found. All pathnames are relative to ```/usr/src`.

The wscons subsystem is implemented within the directory ```sys/dev/wscons`. The wskbd module itself is implement within the files ```sys/dev/wscons/wskbd.c` and ```sys/dev/wscons/wskbdutil.c`. ioctl(2) operations are listed in ```sys/dev/wscons/wsconsio.h`.

### SEE ALSO

ioctl(2), autoconf(9), driver(9), intro(9), wsdisplay(9), wsmouse(9)