URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 10099
[ Назад ]

Исходное сообщение
"Led key"

Отправлено Andrei_redd , 17-Май-16 19:04 
Ткните носом где найти адреса регистров светодиодов клавиатуры ?

Содержание

Сообщения в этом обсуждении
"Led key"
Отправлено ACCA , 18-Май-16 09:05 
> Ткните носом где найти адреса регистров светодиодов клавиатуры ?

От контроллера зависит.
Для 83C51KB посмотри здесь http://datasheets.chipdb.org/Intel/MCS51/MANUALS/27280101.PDF

На третьем порту есть четыре бита для светодиодов.


"Led key"
Отправлено Andrei_redd , 18-Май-16 11:10 
Ok, понял, т.е. это чтобы для конкретной клавы узнать нужно знать какой контроллер ей управляет ? То есть это не унифицированное общее адресное пространство ?


Ну допустим адрес fffcb34 лед кап лок ????? (для примера)


"Led key"
Отправлено Andrei_redd , 18-Май-16 11:11 
Если по этому адресу 1 то горит, если 0 то не горит .....

"Led key"
Отправлено Andrei_redd , 18-Май-16 11:35 
А в общем нужно через порты 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 , 18-Май-16 11:53 
Но хотелось бы более простое решение,
1> Caps Lock, или адрес (горит)
0> Caps Lock, или адрес (не горит)

"Led key"
Отправлено ACCA , 18-Май-16 12:32 
> Ok, понял, т.е. это чтобы для конкретной клавы узнать нужно знать какой
> контроллер ей управляет ? То есть это не унифицированное общее адресное

Это я тебя стебал.

Светодиодами управляет контроллер в клаве. Напрямую к нему добраться нельзя, нужно посылать команды либо через порт клавиатурного интерфейса (0x60), либо через USB, смотря в какое место у тебя клава воткнута.

В адресном пространстве твоего компьютера "светодиодных регистров" нет.


"Led key"
Отправлено Andrei_redd , 18-Май-16 12:42 
Ok, тогда такой вопрос, как программно определить какая клава PS/2 или USB ?

"Led key"
Отправлено Andrei_redd , 18-Май-16 12:48 
Ну или вычислить все подключенные клавы, допустим подключена и USB и PS/2

"Led key"
Отправлено Andrei_redd , 18-Май-16 13:00 
Для 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 , 18-Май-16 20:05 
> Ok, тогда такой вопрос, как программно определить какая клава PS/2 или USB?

Видишь ли, у тебя может быть более, чем одна клава.

Вот тебе задача -  компьютер в Internet-кафе. Один корпус, 2 видеокарты по 4 видеовыхода HDMI. 8 клавиатур и мышей через USB + BMC, который в компьютере изображает из себя PS/2 клаву, мышу и видеокарту а сам подключен через Ethernet.

Я подключён к BMC через Internet, у меня [Bluetooth] клава i-Rocks, на ней два светодиода. Узнай, какие именно и поморгай ими.


"Led key"
Отправлено _ , 18-Май-16 22:40 
> Вот тебе задача -  компьютер в Internet-кафе. Один корпус, 2 видеокарты
> по 4 видеовыхода HDMI. 8 клавиатур и мышей через USB + > BMC

Челябинск?!

У нас обычно WiFi дают бесплатный и всио :)


"Led key"
Отправлено Andrei_redd , 20-Май-16 11:17 
Наверно там просто энтузиаст мейнфреймов работает, скоро кластер соберет )

По существу, клаву то по имени искать то чтоли ?


"Led key"
Отправлено Andrei_redd , 20-Май-16 11:18 
Но это поверх драйверов уже, а как напрямую порты опросить на предмет наличия клав ?