- Led key, ACCA, 09:05 , 18-Май-16 (1)
- Led key, Andrei_redd, 11:10 , 18-Май-16 (2)
Ok, понял, т.е. это чтобы для конкретной клавы узнать нужно знать какой контроллер ей управляет ? То есть это не унифицированное общее адресное пространство ? Ну допустим адрес fffcb34 лед кап лок ????? (для примера)
- Led key, Andrei_redd, 11:11 , 18-Май-16 (3)
Если по этому адресу 1 то горит, если 0 то не горит .....
- Led key, Andrei_redd, 11:35 , 18-Май-16 (4)
А в общем нужно через порты 0x60 h Нашел вот это солнышко //********************************************************************* // мигание индикаторов // команда 0xED выдается не контроллеру, а самой клавиатуре, // поэтому пишем ее в порт 0х60 // Состояние индикаторов определяется следующим байтом, // 0-й бит == состояние Scroll Lock // 1-й бит == Caps Lock // 2-й бит == Num Lock // Бит ==1 -> зажечь светодиод, Бит == 0 -> погасить светодиод // Для комбинирования светодиодов юзаются битовые маски // (если записать "3", то включатся Scroll и Caps, а Num погаснет) // 0 == 000 (все погашены) // 1 == 001 (Scroll) // 2 == 010 (Caps) // 3 == 011 (Scroll + Caps) // 4 == 100 (Num) // 5 == 101 (Num + Scroll) // 6 == 110 (Num + Caps) // 7 == 111 (все включены) // Старшие биты (начиная с 3-го) игнорируются. // Если определить 1 == SCROLL_LOCK, 2 == CAPS_LOCK, 4 == NUM_LOCK, // то значения получаются установкой битов: // зажечь Num и Scroll: NUM_LOCK | SCROLL_LOCK (5 == 4 + 1) // сложение чисел заменяется установкой битов побитовым "или" static short int i=1; // вообще-то должно быть char... asm{ mov al, 0xED out 0x60, al mov ax, i // i занимает 2 байта, поэтому ax out 0x60, al // ah нас не интересует nop nop nop } if(i==1) i=2; else if(i==2) i=4; else i=1; //********************************************************************* тут, правда, вперемешку с Сишным кодом, но в целом проблем не возникнет :) по таймеру (или как больше нравится) вызываешь этот код -- и будет тебе счастье. Переменная i -- статическая, в АСМ сделай ее глобальной.
- Led key, Andrei_redd, 11:53 , 18-Май-16 (5)
Но хотелось бы более простое решение, 1> Caps Lock, или адрес (горит) 0> Caps Lock, или адрес (не горит)
- Led key, ACCA, 12:32 , 18-Май-16 (6)
> Ok, понял, т.е. это чтобы для конкретной клавы узнать нужно знать какой > контроллер ей управляет ? То есть это не унифицированное общее адресное Это я тебя стебал. Светодиодами управляет контроллер в клаве. Напрямую к нему добраться нельзя, нужно посылать команды либо через порт клавиатурного интерфейса (0x60), либо через USB, смотря в какое место у тебя клава воткнута. В адресном пространстве твоего компьютера "светодиодных регистров" нет.
- Led key, Andrei_redd, 12:42 , 18-Май-16 (7)
Ok, тогда такой вопрос, как программно определить какая клава PS/2 или USB ?
- Led key, Andrei_redd, 12:48 , 18-Май-16 (8)
Ну или вычислить все подключенные клавы, допустим подключена и USB и PS/2
- Led key, Andrei_redd, 13:00 , 18-Май-16 (9)
Для USB через вот эту функцию наверное нужно 166 static int usb_kbd_event(struct input_dev *dev, unsigned int type, 167 unsigned int code, int value) 168 { 169 unsigned long flags; 170 struct usb_kbd *kbd = input_get_drvdata(dev); 171 172 if (type != EV_LED) 173 return -1; 174 175 spin_lock_irqsave(&kbd->leds_lock, flags); 176 kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) | 177 (!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) | 178 (!!test_bit(LED_NUML, dev->led)); 179 180 if (kbd->led_urb_submitted){ 181 spin_unlock_irqrestore(&kbd->leds_lock, flags); 182 return 0; 183 } 184 185 if (*(kbd->leds) == kbd->newleds){ 186 spin_unlock_irqrestore(&kbd->leds_lock, flags); 187 return 0; 188 } 189 190 *(kbd->leds) = kbd->newleds; 191 192 kbd->led->dev = kbd->usbdev; 193 if (usb_submit_urb(kbd->led, GFP_ATOMIC)) 194 pr_err("usb_submit_urb(leds) failed\n"); 195 else 196 kbd->led_urb_submitted = true; 197 198 spin_unlock_irqrestore(&kbd->leds_lock, flags); 199 200 return 0; 201 }
- Led key, ACCA, 20:05 , 18-Май-16 (10)
> Ok, тогда такой вопрос, как программно определить какая клава PS/2 или USB?Видишь ли, у тебя может быть более, чем одна клава. Вот тебе задача - компьютер в Internet-кафе. Один корпус, 2 видеокарты по 4 видеовыхода HDMI. 8 клавиатур и мышей через USB + BMC, который в компьютере изображает из себя PS/2 клаву, мышу и видеокарту а сам подключен через Ethernet. Я подключён к BMC через Internet, у меня [Bluetooth] клава i-Rocks, на ней два светодиода. Узнай, какие именно и поморгай ими.
- Led key, _, 22:40 , 18-Май-16 (11)
> Вот тебе задача - компьютер в Internet-кафе. Один корпус, 2 видеокарты > по 4 видеовыхода HDMI. 8 клавиатур и мышей через USB + > BMCЧелябинск?! У нас обычно WiFi дают бесплатный и всио :)
- Led key, Andrei_redd, 11:17 , 20-Май-16 (12)
Наверно там просто энтузиаст мейнфреймов работает, скоро кластер соберет )По существу, клаву то по имени искать то чтоли ?
- Led key, Andrei_redd, 11:18 , 20-Май-16 (13)
Но это поверх драйверов уже, а как напрямую порты опросить на предмет наличия клав ?
|