Ткните носом где найти адреса регистров светодиодов клавиатуры ?
> Ткните носом где найти адреса регистров светодиодов клавиатуры ?От контроллера зависит.
Для 83C51KB посмотри здесь http://datasheets.chipdb.org/Intel/MCS51/MANUALS/27280101.PDFНа третьем порту есть четыре бита для светодиодов.
Ok, понял, т.е. это чтобы для конкретной клавы узнать нужно знать какой контроллер ей управляет ? То есть это не унифицированное общее адресное пространство ?
Ну допустим адрес fffcb34 лед кап лок ????? (для примера)
Если по этому адресу 1 то горит, если 0 то не горит .....
А в общем нужно через порты 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 -- статическая, в АСМ сделай ее глобальной.
Но хотелось бы более простое решение,
1> Caps Lock, или адрес (горит)
0> Caps Lock, или адрес (не горит)
> Ok, понял, т.е. это чтобы для конкретной клавы узнать нужно знать какой
> контроллер ей управляет ? То есть это не унифицированное общее адресноеЭто я тебя стебал.
Светодиодами управляет контроллер в клаве. Напрямую к нему добраться нельзя, нужно посылать команды либо через порт клавиатурного интерфейса (0x60), либо через USB, смотря в какое место у тебя клава воткнута.
В адресном пространстве твоего компьютера "светодиодных регистров" нет.
Ok, тогда такой вопрос, как программно определить какая клава PS/2 или USB ?
Ну или вычислить все подключенные клавы, допустим подключена и USB и PS/2
Для 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 }
> Ok, тогда такой вопрос, как программно определить какая клава PS/2 или USB?Видишь ли, у тебя может быть более, чем одна клава.
Вот тебе задача - компьютер в Internet-кафе. Один корпус, 2 видеокарты по 4 видеовыхода HDMI. 8 клавиатур и мышей через USB + BMC, который в компьютере изображает из себя PS/2 клаву, мышу и видеокарту а сам подключен через Ethernet.
Я подключён к BMC через Internet, у меня [Bluetooth] клава i-Rocks, на ней два светодиода. Узнай, какие именно и поморгай ими.
> Вот тебе задача - компьютер в Internet-кафе. Один корпус, 2 видеокарты
> по 4 видеовыхода HDMI. 8 клавиатур и мышей через USB + > BMCЧелябинск?!
У нас обычно WiFi дают бесплатный и всио :)
Наверно там просто энтузиаст мейнфреймов работает, скоро кластер соберет )По существу, клаву то по имени искать то чтоли ?
Но это поверх драйверов уже, а как напрямую порты опросить на предмет наличия клав ?