vkbd(4)
NAME
vkbd - the virtual AT keyboard interface
SYNOPSIS
device vkbd
DESCRIPTION
- The vkbd interface is a software loopback mechanism that can
- be loosely
described as the virtual AT keyboard analog of the pty(4), - that is, vkbd
does for virtual AT keyboards what the pty(4) driver does - for terminals.
- The vkbd driver, like the pty(4) driver, provides two inter
- faces: a keyboard interface like the usual facility it is simulating (a
- virtual AT
keyboard in the case of vkbd, or a terminal for pty(4)), and - a characterspecial device ``control'' interface.
- The virtual AT keyboards are named vkbd0, vkbd1, etc., one
- for each control device that has been opened.
- The vkbd interface permits opens on the special control de
- vice
/dev/vkbdctl. When this device is opened, vkbd will return - a handle for
the lowest unused vkbdctl device (use devname(3) to deter - mine which).
- Each virtual AT keyboard supports the usual keyboard inter
- face ioctl(2)s,
and thus can be used with kbdcontrol(1) like any other key - board. The
control device supports exactly the same ioctl(2)s as the - virtual AT keyboard device. Writing AT scan codes to the control device
- generates an
input on the virtual AT keyboard, as if the (non-existent) - hardware had
just received it. - The virtual AT keyboard control device, normally
- /dev/vkbdctl<N>, is
exclusive-open (it cannot be opened if it is already open) - and is
restricted to the super-user. A read(2) call will return - the virtual AT
keyboard status structure (defined in if one is available; - if not, it
will either block until one is or return EWOULDBLOCK, de - pending on
whether non-blocking I/O has been enabled. - A write(2) call passes AT scan codes to be ``received'' from
- the virtual
AT keyboard. Each AT scan code must be passed as unsigned - int. Although
AT scan codes must be passes as unsigned ints, the size of - the buffer
passed to write(2) still should be in bytes, i.e.,
static unsigned int codes[] =
{
/* Make Break */0x1e, 0x9e- };
- int
main(void)
{int fd, len;fd = open("/dev/vkbdctl0", O_RDWR);
if (fd < 0)err(1, "open"); - /* Note sizeof(codes) - not 2! */
len = write(fd, codes, sizeof(codes));
if (len < 0) - err(1, "write");
- close(fd);
- return (0);
- }
- Write will block if there is not enough space in the input
- queue.
- The control device also supports select(2) for read and
- write.
- On the last close of the control device, the virtual AT key
- board is
removed. All queued scan codes are thrown away.
SEE ALSO
kbdcontrol(1), atkbdc(4), pcvt(4), psm(4), syscons(4)
CAVEATS
- The vkbd interface is a software loopback mechanism, and,
- thus ddb(4)
will not work with it. Current implementation of the - syscons(4) driver
can accept input from only one keyboard, even if it is vir - tual. Thus it
is not possible to have both wired and virtual keyboard to - be active at
the same time. It is, however, in principal possible to ob - tain AT scan
codes from the different sources and write them into the - same virtual
keyboard. The virtual keyboard state synchronization is the - user's
responsibility.
HISTORY
The vkbd module was implemented in FreeBSD 6.0.
AUTHORS
- Maksim Yevmenkin <m_evmenkin@yahoo.com>
- BSD August 12, 2004