41static const uint8_t g_pui8LangDescriptor[] = {
42 4, USB_DTYPE_STRING, USBShort(USB_LANG_EN_US)};
49static const uint8_t g_pui8ManufacturerString[] = {
50 (17 + 1) * 2, USB_DTYPE_STRING,
'T', 0,
'e', 0,
'x', 0,
'a', 0,
's', 0,
' ',
51 0,
'I', 0,
'n', 0,
's', 0,
't', 0,
'r', 0,
'u', 0,
'm', 0,
'e', 0,
'n', 0,
60static const uint8_t g_pui8ProductString[] = {(16 + 1) * 2, USB_DTYPE_STRING,
61 'K', 0,
'e', 0,
'y', 0,
'b', 0,
'o', 0,
'a', 0,
'r', 0,
'd', 0,
' ', 0,
'E',
62 0,
'x', 0,
'a', 0,
'm', 0,
'p', 0,
'l', 0,
'e', 0};
69static const uint8_t g_pui8SeriailNumberString[] = {(8 + 1) * 2,
70 USB_DTYPE_STRING,
'1', 0,
'2', 0,
'3', 0,
'4', 0,
'5', 0,
'6', 0,
'7', 0,
78static const uint8_t g_pui8HIDInterfaceString[] = {(22 + 1) * 2,
79 USB_DTYPE_STRING,
'H', 0,
'I', 0,
'D', 0,
' ', 0,
'K', 0,
'e', 0,
'y', 0,
80 'b', 0,
'o', 0,
'a', 0,
'r', 0,
'd', 0,
' ', 0,
'I', 0,
'n', 0,
't', 0,
'e',
81 0,
'r', 0,
'f', 0,
'a', 0,
'c', 0,
'e', 0};
88static const uint8_t g_pui8ConfigString[] = {(26 + 1) * 2, USB_DTYPE_STRING,
89 'H', 0,
'I', 0,
'D', 0,
' ', 0,
'K', 0,
'e', 0,
'y', 0,
'b', 0,
'o', 0,
'a',
90 0,
'r', 0,
'd', 0,
' ', 0,
'C', 0,
'o', 0,
'n', 0,
'f', 0,
'i', 0,
'g', 0,
91 'u', 0,
'r', 0,
'a', 0,
't', 0,
'i', 0,
'o', 0,
'n', 0};
98static const uint8_t *
const g_ppui8StringDescriptors[] = {g_pui8LangDescriptor,
99 g_pui8ManufacturerString, g_pui8ProductString, g_pui8SeriailNumberString,
100 g_pui8HIDInterfaceString, g_pui8ConfigString};
102#define NUM_STRING_DESCRIPTORS \
103 (sizeof(g_ppui8StringDescriptors) / sizeof(uint8_t *))
111static const int8_t g_ppi8KeyUsageCodes[][2] = {
120 {0, HID_KEYB_USAGE_BACKSPACE},
122 {0, HID_KEYB_USAGE_ENTER},
144 {0, HID_KEYB_USAGE_SPACE},
145 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_1},
146 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_FQUOTE},
147 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_3},
148 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_4},
149 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_5},
150 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_7},
151 {0, HID_KEYB_USAGE_FQUOTE},
152 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_9},
153 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_0},
154 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_8},
155 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_EQUAL},
156 {0, HID_KEYB_USAGE_COMMA},
157 {0, HID_KEYB_USAGE_MINUS},
158 {0, HID_KEYB_USAGE_PERIOD},
159 {0, HID_KEYB_USAGE_FSLASH},
160 {0, HID_KEYB_USAGE_0},
161 {0, HID_KEYB_USAGE_1},
162 {0, HID_KEYB_USAGE_2},
163 {0, HID_KEYB_USAGE_3},
164 {0, HID_KEYB_USAGE_4},
165 {0, HID_KEYB_USAGE_5},
166 {0, HID_KEYB_USAGE_6},
167 {0, HID_KEYB_USAGE_7},
168 {0, HID_KEYB_USAGE_8},
169 {0, HID_KEYB_USAGE_9},
170 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_SEMICOLON},
171 {0, HID_KEYB_USAGE_SEMICOLON},
172 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_COMMA},
173 {0, HID_KEYB_USAGE_EQUAL},
174 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_PERIOD},
175 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_FSLASH},
176 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_2},
177 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_A},
178 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_B},
179 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_C},
180 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_D},
181 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_E},
182 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_F},
183 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_G},
184 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_H},
185 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_I},
186 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_J},
187 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_K},
188 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_L},
189 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_M},
190 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_N},
191 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_O},
192 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_P},
193 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Q},
194 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_R},
195 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_S},
196 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_T},
197 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_U},
198 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_V},
199 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_W},
200 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_X},
201 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Y},
202 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_Z},
203 {0, HID_KEYB_USAGE_LBRACKET},
204 {0, HID_KEYB_USAGE_BSLASH},
205 {0, HID_KEYB_USAGE_RBRACKET},
206 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_6},
207 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_MINUS},
208 {0, HID_KEYB_USAGE_BQUOTE},
209 {0, HID_KEYB_USAGE_A},
210 {0, HID_KEYB_USAGE_B},
211 {0, HID_KEYB_USAGE_C},
212 {0, HID_KEYB_USAGE_D},
213 {0, HID_KEYB_USAGE_E},
214 {0, HID_KEYB_USAGE_F},
215 {0, HID_KEYB_USAGE_G},
216 {0, HID_KEYB_USAGE_H},
217 {0, HID_KEYB_USAGE_I},
218 {0, HID_KEYB_USAGE_J},
219 {0, HID_KEYB_USAGE_K},
220 {0, HID_KEYB_USAGE_L},
221 {0, HID_KEYB_USAGE_M},
222 {0, HID_KEYB_USAGE_N},
223 {0, HID_KEYB_USAGE_O},
224 {0, HID_KEYB_USAGE_P},
225 {0, HID_KEYB_USAGE_Q},
226 {0, HID_KEYB_USAGE_R},
227 {0, HID_KEYB_USAGE_S},
228 {0, HID_KEYB_USAGE_T},
229 {0, HID_KEYB_USAGE_U},
230 {0, HID_KEYB_USAGE_V},
231 {0, HID_KEYB_USAGE_W},
232 {0, HID_KEYB_USAGE_X},
233 {0, HID_KEYB_USAGE_Y},
234 {0, HID_KEYB_USAGE_Z},
235 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_LBRACKET},
236 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_BSLASH},
237 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_RBRACKET},
238 {HID_KEYB_LEFT_SHIFT, HID_KEYB_USAGE_BQUOTE},
241static uint32_t static_keyboard_handler(
242 void *pvCBData, uint32_t ui32Event, uint32_t ui32MsgData,
void *pvMsgData)
245 ui32Event, ui32MsgData, pvMsgData);
248TivaUsbKeyboardDev::TivaUsbKeyboardDev(
const char *name, uint32_t interrupt)
250 , tivaKeyboardDevice_{USB_VID_TI_1CBE, USB_PID_KEYBOARD, 500,
251 USB_CONF_ATTR_SELF_PWR | USB_CONF_ATTR_RWAKE, static_keyboard_handler,
252 (void *)&tivaKeyboardDevice_, g_ppui8StringDescriptors,
263 MAP_IntPrioritySet(interrupt, 0xff);
265 USBStackModeSet(0, eUSBModeDevice, 0);
266 USBDHIDKeyboardInit(0, &tivaKeyboardDevice_);
297 uint32_t ui32Char = (*data);
301 g_ppi8KeyUsageCodes[ui32Char][1],
false) != KEYB_SUCCESS)
312 g_ppi8KeyUsageCodes[ui32Char][0],
313 g_ppi8KeyUsageCodes[ui32Char][1],
true) != KEYB_SUCCESS)
323 uint32_t ui32Event, uint32_t ui32MsgData,
void *pvMsgData)
330 case USB_EVENT_CONNECTED:
341 case USB_EVENT_DISCONNECTED:
352 case USB_EVENT_TX_COMPLETE:
365 case USB_EVENT_SUSPEND:
374 case USB_EVENT_RESUME:
390 case USBD_HID_KEYB_EVENT_SET_LEDS:
392 uint8_t response = ui32MsgData & 0xff;
412 USB0DeviceIntHandler();
#define NUM_STRING_DESCRIPTORS
number of string descriptors
void usb0_interrupt_handler(void)
Handle interrupts for USB0.
size_t pending()
Return the number of items in the queue.
size_t consume(size_t items)
Remove a number of items from the buffer by advancing the readIndex.
void signal_condition_from_isr()
Signal the wakeup condition from an ISR context.
size_t put(const T *buf, size_t items)
Insert a number of items to the buffer.
size_t data_read_pointer(T **buf)
Get a reference to the current location in the buffer for read.
Private data for a serial device.
DeviceBuffer< uint8_t > * rxBuf
receive buffer
DeviceBuffer< uint8_t > * txBuf
transmit buffer
unsigned int overrunCount
overrun count
static TivaUsbKeyboardDev * instance()
tUSBDHIDKeyboardDevice tivaKeyboardDevice_
Keyboard driver structure.
uint8_t isConnected_
Whether the USB host has connected to this device.
uint8_t isSuspended_
Whether the USB bus is suspended.
void tx_char() override
Function to try and transmit a character.
bool send_next_event()
Internal implementation that sends a single keyboard event, from a critical section or in an interrup...
unsigned errorCount_
Number of transmission errors. These occur in the USB device stack.
uint8_t txPending_
Whether we have a pending unfinished send.
uint8_t keyUpPending_
Whether we need to send a key up command still.
uint32_t keyboard_handler(uint32_t ui32Event, uint32_t ui32MsgData, void *pvMsgData)
Callback from the keyboard driver. Called in an interrupt context.
#define HASSERT(x)
Checks that the value of expression x is true, else terminates the current process.