Пример #1
0
static int
write_kbd(KBDC kbdc, int command, int data)
{
    int s;

    /* prevent the timeout routine from polling the keyboard */
    if (!kbdc_lock(kbdc, TRUE))
        return EBUSY;

    /* disable the keyboard and mouse interrupt */
    s = spltty();
#if 0
    c = get_controller_command_byte(kbdc);
    if ((c == -1)
            || !set_controller_command_byte(kbdc,
                                            kbdc_get_device_mask(kbdc),
                                            KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT
                                            | KBD_DISABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) {
        /* CONTROLLER ERROR */
        kbdc_lock(kbdc, FALSE);
        splx(s);
        return EIO;
    }
    /*
     * Now that the keyboard controller is told not to generate
     * the keyboard and mouse interrupts, call `splx()' to allow
     * the other tty interrupts. The clock interrupt may also occur,
     * but the timeout routine (`scrn_timer()') will be blocked
     * by the lock flag set via `kbdc_lock()'
     */
    splx(s);
#endif

    if (send_kbd_command_and_data(kbdc, command, data) != KBD_ACK)
        send_kbd_command(kbdc, KBDC_ENABLE_KBD);

#if 0
    /* restore the interrupts */
    if (!set_controller_command_byte(kbdc,
                                     kbdc_get_device_mask(kbdc),
                                     c & (KBD_KBD_CONTROL_BITS | KBD_AUX_CONTROL_BITS))) {
        /* CONTROLLER ERROR */
    }
#else
    splx(s);
#endif
    kbdc_lock(kbdc, FALSE);

    return 0;
}
Пример #2
0
static int
probe_keyboard(KBDC kbdc, int flags)
{
	/*
	 * Don't try to print anything in this function.  The low-level 
	 * console may not have been initialized yet...
	 */
	int err;
	int c;
	int m;

	if (!kbdc_lock(kbdc, TRUE)) {
		/* driver error? */
		return ENXIO;
	}

	/* flush any noise in the buffer */
	empty_both_buffers(kbdc, 10);

	/* save the current keyboard controller command byte */
	m = kbdc_get_device_mask(kbdc) & ~KBD_KBD_CONTROL_BITS;
	c = get_controller_command_byte(kbdc);
	if (c == -1) {
		/* CONTROLLER ERROR */
		kbdc_set_device_mask(kbdc, m);
		kbdc_lock(kbdc, FALSE);
		return ENXIO;
	}

	/* 
	 * The keyboard may have been screwed up by the boot block.
	 * We may just be able to recover from error by testing the controller
	 * and the keyboard port. The controller command byte needs to be
	 * saved before this recovery operation, as some controllers seem 
	 * to set the command byte to particular values.
	 */
	test_controller(kbdc);
	test_kbd_port(kbdc);

	err = get_kbd_echo(kbdc);
	if (err == 0) {
		kbdc_set_device_mask(kbdc, m | KBD_KBD_CONTROL_BITS);
	} else {
		if (c != -1)
			/* try to restore the command byte as before */
			set_controller_command_byte(kbdc, 0xff, c);
		kbdc_set_device_mask(kbdc, m);
	}

	kbdc_lock(kbdc, FALSE);
	return err;
}
Пример #3
0
static int
probe_keyboard(KBDC kbdc, int flags)
{
    /*
     * Don't try to print anything in this function.  The low-level
     * console may not have been initialized yet...
     */
    int err;
    int c;
    int m;

    if (!kbdc_lock(kbdc, TRUE)) {
        /* driver error? */
        return ENXIO;
    }

    /* temporarily block data transmission from the keyboard */
    write_controller_command(kbdc, KBDC_DISABLE_KBD_PORT);

    /* flush any noise in the buffer */
    empty_both_buffers(kbdc, 100);

    /* save the current keyboard controller command byte */
    m = kbdc_get_device_mask(kbdc) & ~KBD_KBD_CONTROL_BITS;
    c = get_controller_command_byte(kbdc);
    if (c == -1) {
        /* CONTROLLER ERROR */
        kbdc_set_device_mask(kbdc, m);
        kbdc_lock(kbdc, FALSE);
        return ENXIO;
    }

    /*
     * The keyboard may have been screwed up by the boot block.
     * We may just be able to recover from error by testing the controller
     * and the keyboard port. The controller command byte needs to be
     * saved before this recovery operation, as some controllers seem
     * to set the command byte to particular values.
     */
    test_controller(kbdc);
    if (!(flags & KB_CONF_NO_PROBE_TEST))
        test_kbd_port(kbdc);

    err = get_kbd_echo(kbdc);

    /*
     * Even if the keyboard doesn't seem to be present (err != 0),
     * we shall enable the keyboard port and interrupt so that
     * the driver will be operable when the keyboard is attached
     * to the system later.  It is NOT recommended to hot-plug
     * the AT keyboard, but many people do so...
     */
    kbdc_set_device_mask(kbdc, m | KBD_KBD_CONTROL_BITS);
    setup_kbd_port(kbdc, TRUE, TRUE);
#if 0
    if (err == 0) {
        kbdc_set_device_mask(kbdc, m | KBD_KBD_CONTROL_BITS);
    } else {
        /* try to restore the command byte as before */
        set_controller_command_byte(kbdc, 0xff, c);
        kbdc_set_device_mask(kbdc, m);
    }
#endif

    kbdc_lock(kbdc, FALSE);
    return err;
}