示例#1
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;
}
示例#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;
    }

    /* 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;
}