LINUX.ORG.RU

[linux kernel] [input subsystem] [autorepeat]

 


0

1

Привет, ЛОР!

Возникла проблема с драйвером клавиатуры для самопальной железки. Драйвер клавиатуры не выдаёт сведения о том, что клавиша была повторно нажата (и удерживается).

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.

ЧЯДНТ?

★★★★★

поможет иль нет
там нету авторепиата - есть просто таймер который эмулирует это - по крайней мере дял usb клавиатур

ae1234 ★★
()

ох уж эти любители велосипедов...

anonymous
()
Ответ на: комментарий от ttnl

KDKBDREP - эту хрень из юзерспейса включил?

что за бред, как можно включить задефайненную константу из юзерспейса?!

anonymous
()
Ответ на: комментарий от anonymous

При том, что без выполнения некоторых ioctls консоль не примет такой вид, к которому мы привыкли.

В обычной системе это делает init, а как клава подцепляется у TC, мы не знаем.

Если бы ты хоть раз разрабатывал что-нибудь связанное с устройствами ввода, ты бы знал, что на голой консоли даже CTRL+C не работает без специальной настройки с помощью ioctls.

ttnl ★★★★★
()

Так работает

        if (KEYS[i].scan_code == last_scan_code)
			{
				input_report_key(kbd_dev, KEYS[i].key, 1);
                                input_sync(kbd_dev);
				snd_squeak(3000, 120000, 240000);
			}
ymn ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.