Привет, ЛОР!
Возникла проблема с драйвером клавиатуры для самопальной железки. Драйвер клавиатуры не выдаёт сведения о том, что клавиша была повторно нажата (и удерживается).
static void schedule_init_kbddev(struct work_struct *twork)
{
int32_t error;
// аллоцируем память под клавиатуру
kbd_dev = input_allocate_device();
if (!kbd_dev)
{
printk(KERN_ERR "kbd.c: Not enough memory\n");
return;
}
//устанавливаем определенные параметры
kbd_dev->name = "spi keyboard driver";
kbd_dev->phys = "kbd0";
kbd_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
//добавляем, работающие у нас кнопки
set_bit(KEY_F6, kbd_dev->keybit);
......
бла-бла-бла
......
set_bit(KEY_KPDOT, kbd_dev->keybit);
set_bit(KEY_RESERVED, kbd_dev->keybit);
//регистрируем устройство клавиатуры
error = input_register_device(kbd_dev);
if (error)
{
printk(KERN_ERR "kbd.c: Failed to register device\n");
input_free_device(kbd_dev);
return;
}
schedule_delayed_work(work, TIME_OF_SCHEDULE);
}
Функция считывания:
static void key_press(void)
{
if (last_scan_code != 0)
{
uint8_t i = 0;
for (; i < NUMBER_OF_KEYS; i++)
{
if (KEYS[i].scan_code == last_scan_code)
{
input_report_key(kbd_dev, KEYS[i].key, 1);
input_sync(kbd_dev);
input_report_key(kbd_dev, KEYS[i].key, 0);
input_sync(kbd_dev);
snd_squeak(3000, 120000, 240000);
}
}
}
}
В Documentation/input/input-programming.txt пишут, что
1.8 Key autorepeat
... is simple. It is handled by the input.c module. Hardware autorepeat is
not used, because it's not present in many devices and even where it is
present, it is broken sometimes (at keyboards: Toshiba notebooks). To enable
autorepeat for your device, just set EV_REP in dev->evbit. All will be
handled by the input system.
ЧЯДНТ?