Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
 
Software Developer
308 / 224 / 111
Регистрация: 03.05.2017
Сообщений: 1,122
1

USB HID Keyboard scan codes

09.12.2020, 01:41. Просмотров 476. Ответов 1
Метки нет (Все метки)

Привет всем.
Питаюсь сделать для себя переходник из PS/2 в USB.
Использую модуль от Digispark с ATtiny85.
Прошивку написал, всё работает как надо. С клавиатуры считывает нажатия и отправляет по USB на компьютер.
Но несколько клавиш так и не удалось послать по USB. С клавиатуры их считывает нормально.
Проблемные клавиши (в душках коды клавиш PS/2):
Media Select (0x50)
Play/Pause (0x34)
Mute (0x23)
Volume Up (0x32)
Volume Down (0x21)
Favorites (0x18)
E-Mail (0x48)
WWW (0x3A)

Таблица с кодами для преобразования - тыц.
Разбираюсь сначала с одной клавишей Volume Up (потом, если получиться, доделаю и все остальные).
Из таблицы ясно что код для USB - 0xE9, но ничего не работает.
Думаю дело в HID Usage Page, так как для этой клавиши он 0x0C, а для остальных которые работают он 0x07.
Пытался изменить USAGE_PAGE в usbHidReportDescriptor в DigiKeyboard.h, но ничего не получилось.
Если кто знаком с библиотеками от Digispark или просто разбирается в протоколе USB, буду рад услышать совет.
Файл DigiKeyboard.h
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
/*
 * Based on Obdev's AVRUSB code and under the same license.
 *
 * TODO: Make a proper file header. :-)
 * Modified for Digispark by Digistump
 */
#ifndef __DigiKeyboard_h__
#define __DigiKeyboard_h__
 
#include <Arduino.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <string.h>
 
#include "usbdrv.h"
#include "scancode-ascii-table.h"
 
// TODO: Work around Arduino 12 issues better.
//#include <WConstants.h>
//#undef int()
 
typedef uint8_t byte;
 
 
#define BUFFER_SIZE 2 // Minimum of 2: 1 for modifiers + 1 for keystroke 
 
 
static uchar    idleRate;           // in 4 ms units 
 
 
/* We use a simplifed keyboard report descriptor which does not support the
 * boot protocol. We don't allow setting status LEDs and but we do allow
 * simultaneous key presses. 
 * The report descriptor has been created with usb.org's "HID Descriptor Tool"
 * which can be downloaded from http://www.usb.org/developers/hidpage/.
 * Redundant entries (such as LOGICAL_MINIMUM and USAGE_PAGE) have been omitted
 * for the second INPUT item.
 */
const PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = { /* USB report descriptor */
  0x05, 0x01,                    // USAGE_PAGE (Generic Desktop) 
  0x09, 0x06,                    // USAGE (Keyboard) 
  0xa1, 0x01,                    // COLLECTION (Application) 
  0x05, 0x07,                    //   USAGE_PAGE (Keyboard) 
  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 (simultaneous keystrokes) 
  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 
};
 
 
 
/* Keyboard usage values, see usb.org's HID-usage-tables document, chapter
 * 10 Keyboard/Keypad Page for more codes.
 */
#define MOD_CONTROL_LEFT    (1<<0)
#define MOD_SHIFT_LEFT      (1<<1)
#define MOD_ALT_LEFT        (1<<2)
#define MOD_GUI_LEFT        (1<<3)
#define MOD_CONTROL_RIGHT   (1<<4)
#define MOD_SHIFT_RIGHT     (1<<5)
#define MOD_ALT_RIGHT       (1<<6)
#define MOD_GUI_RIGHT       (1<<7)
 
#define KEY_A       4
#define KEY_B       5
#define KEY_C       6
#define KEY_D       7
#define KEY_E       8
#define KEY_F       9
#define KEY_G       10
#define KEY_H       11
#define KEY_I       12
#define KEY_J       13
#define KEY_K       14
#define KEY_L       15
#define KEY_M       16
#define KEY_N       17
#define KEY_O       18
#define KEY_P       19
#define KEY_Q       20
#define KEY_R       21
#define KEY_S       22
#define KEY_T       23
#define KEY_U       24
#define KEY_V       25
#define KEY_W       26
#define KEY_X       27
#define KEY_Y       28
#define KEY_Z       29
#define KEY_1       30
#define KEY_2       31
#define KEY_3       32
#define KEY_4       33
#define KEY_5       34
#define KEY_6       35
#define KEY_7       36
#define KEY_8       37
#define KEY_9       38
#define KEY_0       39
 
#define KEY_ENTER   40
 
#define KEY_SPACE   44
 
#define KEY_F1      58
#define KEY_F2      59
#define KEY_F3      60
#define KEY_F4      61
#define KEY_F5      62
#define KEY_F6      63
#define KEY_F7      64
#define KEY_F8      65
#define KEY_F9      66
#define KEY_F10     67
#define KEY_F11     68
#define KEY_F12     69
 
#define KEY_ARROW_LEFT 0x50
 
 
class DigiKeyboardDevice : public Print {
 public:
  DigiKeyboardDevice () {
    cli();
    usbDeviceDisconnect();
    _delay_ms(250);
    usbDeviceConnect();
 
 
    usbInit();
      
    sei();
 
    // TODO: Remove the next two lines once we fix
    //       missing first keystroke bug properly.
    memset(reportBuffer, 0, sizeof(reportBuffer));      
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }
    
  void update() {
    usbPoll();
  }
    
    // delay while updating until we are finished delaying
    void delay(long milli) {
        unsigned long last = millis();
      while (milli > 0) {
        unsigned long now = millis();
        milli -= now - last;
        last = now;
        update();
      }
    }
  
  //sendKeyStroke: sends a key press AND release
  void sendKeyStroke(byte keyStroke) {
    sendKeyStroke(keyStroke, 0);
  }
 
  //sendKeyStroke: sends a key press AND release with modifiers
  void sendKeyStroke(byte keyStroke, byte modifiers) {
    sendKeyPress(keyStroke, modifiers);
    // This stops endlessly repeating keystrokes:
    sendKeyPress(0,0);
  }
 
  //sendKeyPress: sends a key press only - no release
  //to release the key, send again with keyPress=0
  void sendKeyPress(byte keyPress) {
    sendKeyPress(keyPress, 0);
  }
 
  //sendKeyPress: sends a key press only, with modifiers - no release
  //to release the key, send again with keyPress=0
  void sendKeyPress(byte keyPress, byte modifiers) {
    while (!usbInterruptIsReady()) {
      // Note: We wait until we can send keyPress
      //       so we know the previous keyPress was
      //       sent.
        usbPoll();
        _delay_ms(5);
    }
    
    memset(reportBuffer, 0, sizeof(reportBuffer));
        
    reportBuffer[0] = modifiers;
    reportBuffer[1] = keyPress;
    
    usbSetInterrupt(reportBuffer, sizeof(reportBuffer));
  }
  
  size_t write(uint8_t chr) {
    uint8_t data = pgm_read_byte_near(ascii_to_scan_code_table + (chr - 8));
    sendKeyStroke(data & 0b01111111, data >> 7 ? MOD_SHIFT_RIGHT : 0);
    return 1;
  }
    
  //private: TODO: Make friend?
  uchar    reportBuffer[2];    // buffer for HID reports [ 1 modifier byte + (len-1) key strokes]
  using Print::write;
};
 
DigiKeyboardDevice DigiKeyboard = DigiKeyboardDevice();
 
#ifdef __cplusplus
extern "C"{
#endif 
  // USB_PUBLIC uchar usbFunctionSetup
    uchar usbFunctionSetup(uchar data[8]) {
    usbRequest_t    *rq = (usbRequest_t *)((void *)data);
 
    usbMsgPtr = DigiKeyboard.reportBuffer; //
    if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) {
      /* class request type */
 
      if (rq->bRequest == USBRQ_HID_GET_REPORT) {
                /* wValue: ReportType (highbyte), ReportID (lowbyte) */
 
                /* we only have one report type, so don't look at wValue */
        // TODO: Ensure it's okay not to return anything here?    
                return 0;
 
      } else if (rq->bRequest == USBRQ_HID_GET_IDLE) {
                //usbMsgPtr = &idleRate;
                //return 1;
                return 0;
                
      } else if (rq->bRequest == USBRQ_HID_SET_IDLE) {
                idleRate = rq->wValue.bytes[1];
                
      }
    } else {
      /* no vendor specific requests implemented */
    }
        
    return 0;
  }
#ifdef __cplusplus
} // extern "C"
#endif
 
 
#endif // __DigiKeyboard_h__

Ссылку на библиотеку не дам, так как она кажеться поставилась вместе с платами из менеджера плат в Arduino IDE... или нет... не помню точно.
Короче заранее огромное СПАСИБО.

Добавлено через 2 часа 24 минуты
Цитата Сообщение от fastb1t Посмотреть сообщение
Ссылку на библиотеку не дам, так как она кажеться поставилась вместе с платами из менеджера плат в Arduino IDE... или нет... не помню точно.
Не, нашел - вот.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2020, 01:41
Ответы с готовыми решениями:

HID Class на V-USB (статья USB для AVR. Часть 2.)
Здравствуйте. Решил перейти от библиотеки Libusb на HIDlibrary и как раз нашел эту статью. Но...

USB для AVR. Часть 2. HID Class на V-USB
Прочитал статью &quot;USB для AVR. Часть 2. HID Ctoss на V-USB&quot;, решил собрать все по примеру и все...

USB-HID библиотека с st.com STM32f105 "Устройство USB не .."
Товарищи. Взял USB библиотеку с st.com (On-The-Go host omd divice library), для STM32F105...

stm32f103 usb keyboard
Добрый день! Необходимо сделать usb клавиатуру на stm32f103, перерыл весь инет, не нашел ни одного...

1
Software Developer
308 / 224 / 111
Регистрация: 03.05.2017
Сообщений: 1,122
09.12.2020, 13:44  [ТС] 2
Ещё переписал под библиотеку TrinketHidCombo, но библиотека очень нестабильная и глючная, но там мультимедийные клавиши работают.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2020, 13:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

STM32F4 + USB Keyboard
Взял тут напиленный пример драйвера USB хоста. То ли на сонную голову, то ли на что еще, но все...

USB keyboard controller — ищу
Здрасте! Итак, 2 дня уже решаю одну из задач для собственного HTPC. Нужна как бы клава на переднюю...

STM32F4Discovery + USB HID
Народ, помогите раздуплить этот гребаный USB !!! (никогда не использовал, но вот пришлось) ...

hid класс на v-usb
Всем доброе утро. Я собрал схему с этой статьи http://we.iosyitistromyss.ru/itistro-an ......

V-USB, hid-устройство
Доброго времени суток. Собрал схему для работы с V-USB. Делаю все по данному мануалу:...

FreeRTOS+USB-HID
Добрый день форумчане! Пытаюсь подключить freertos и usb-hid с помощью библиотеки от stm. Но при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.