logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR USB][C] Klawiatura multimedialna HID

ololukiXP 04 Kwi 2010 16:10 4826 3
REKLAMA
  • #1 7919679
    ololukiXP
    Poziom 19  
    Witam.
    Na początku chciałbym zaznaczyć, iż dotychczas pisałem tylko w BASCOM'ie, a o C mam słabe pojęcie.
    Chciałbym zbudować klawiaturę, a w zasadzie potrzeba tylko przycisków multimedialnych (play/pauza/stop) na USB. Znalazłem projekt HIDKeys, który uruchomiłem na procesorze ATMega8515 (mniejsza z tym, bo to kwestia jednej linijki w Makefile). Zaprogramowałem procesor, podłączyłem i układ został wykryty jako klawiatura HID, działa prawidłowo, wysyła kody przycisków standardowej klawiatury, która w raporcie USB jest oznaczona USAGE_PAGE 0x07. żeby było możliwe wysyłanie kodów przycisków klawiatury multimedialnej należy ustawić w raporcie USAGE_PAGE 0x0C i tutaj zaczyna się problem. Znalazłem w kodzie źródłowym część odpowiedzialną za raport USB, ale gdy coś zmienię, klawiatura przestaje działać.
    Kody które próbowałem wysyłać, ale żaden program na nie nie reagował to:
    176
    181
    182
    183
    205
    Tutaj źródło tych kodów:
    http://www.usb.org/developers/devclass_docs/Hut1_12.pdf
    http://download.microsoft.com/download/1/6/1/...512-40e2-4cc9-843a-923143f3456c/translate.pdf

    Jak zamienić to HID Page, aby klawiatura działała prawidłowo jako klawiatura multimedialna? Jakie kody wysyłają standardowe klawiatury multimedialne? Jak można zmodyfikować program aby kody były wysyłane jako 16 bitowe (o ile się nie mylę, teraz są wysyłane jako 8 bit)?

    PROGMEM char usbHidReportDescriptor[35] = { /* USB report descriptor */
        0x05, 0x01,            // USAGE_PAGE (Generic Desktop)
        0x09, 0x06,            // USAGE (Keyboard)
        0xa1, 0x01,            // COLLECTION (Application)
        0x05, 0x07,            //   USAGE_PAGE (Keyboard)  Tutaj chyba trzeba zmienić na 0x0c
        0x19, 0xe0,            //   USAGE_MINIMUM (Keyboard LeftControl)
        0x29, 0xe7,            //   USAGE_MAXIMUM (Keyboard Right GUI)
        0x15, 0x00,            //   LOGICAL_MINIMUM (0)
        0x25, 0x01,            //   LOGICAL_MAXIMUM (1)
        0x75, 0x01,            //   REPORT_SIZE (1)
        0x95, 0x08,            //   REPORT_COUNT (8)
        0x81, 0x02,            //   INPUT (Data,Var,Abs)
        0x95, 0x01,            //   REPORT_COUNT (1)
        0x75, 0x08,            //   REPORT_SIZE (8)
        0x25, 0x65,            //   LOGICAL_MAXIMUM (101)
        0x19, 0x00,            //   USAGE_MINIMUM (Reserved (no event indicated))
        0x29, 0x65,            //   USAGE_MAXIMUM (Keyboard Application)
        0x81, 0x00,            //   INPUT (Data,Ary,Abs)
        0xc0                     // END_COLLECTION
    };
  • REKLAMA
  • #2 7935377
    rpal
    Poziom 27  
    Zaznaczam że moge się mylić, ale skoro klawiatura USB ma być widziana przez PC-ta jako klawiatura to wysyłany kod klawisza powinien być ten sam co w zwykłej więc sterownik klawiatury wysyła po przynajmniej po dwa bajty znak klawiatury+znak naciśnięcia/ upuszczenia klawisza. Zdaje się ze znaki specjalne wysyłają więcej bajtów. Piszę to kierując się zdrowym rozsądkiem :)
  • REKLAMA
  • #3 7940062
    henxa
    Poziom 11  
    Klawiatura standardowo wysyła kody jedno bajtowe. Strzałki oraz znaki z klawiatury multimedialnej są poprzedzone kodem 0xE0. podniesienie klawisza jest zawsze poprzedzone kodem 0xF0. Tez mi się wydaje że powinny być wysyłane standardowe scankody klawiatury. Odsyłam do książki mikrokontrolery pic16f8x może się przydać gdyby okazało się prawdą to że każda klawiatura wysyła te same scankody.
    [AVR USB][C] Klawiatura multimedialna HID
  • #4 7940882
    rpal
    Poziom 27  
    Anatomia PC ta cegla wszystko wyjasnia
REKLAMA