The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Led key, !*! Andrei_redd, 17-Май-16, 19:04  [смотреть все]
Ткните носом где найти адреса регистров светодиодов клавиатуры ?
  • Led key, !*! ACCA, 09:05 , 18-Май-16 (1)
    > Ткните носом где найти адреса регистров светодиодов клавиатуры ?

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

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

    • 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, !*! 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 дают бесплатный и всио :)




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру