Files
base/middleware/usb/uC-USBH/App/HID/app_usbh_keyboard.c
2025-11-07 09:57:14 +08:00

293 lines
14 KiB
C

/*
*********************************************************************************************************
* EXAMPLE CODE
*
* This file is provided as an example on how to use Micrium products.
*
* Please feel free to use any application code labeled as 'EXAMPLE CODE' in
* your application products. Example code may be used as is, in whole or in
* part, or may be used as a reference only. This file can be modified as
* required to meet the end-product requirements.
*
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*
* USB HOST HID KEYBOARD TEST APPLICATION
*
* TEMPLATE
*
* Filename : app_usbh_keyboard.c
* Version : V3.42.01
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/
#define APP_USBH_KEYBOARD_MODULE
#include "app_usbh_keyboard.h"
/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*/
#define KBD_LEFT_CTRL 0x01u
#define KBD_LEFT_SHIFT 0x02u
#define KBD_LEFT_ALT 0x04u
#define KBD_LEFT_GUI 0x08u
#define KBD_RIGHT_CTRL 0x10u
#define KBD_RIGHT_SHIFT 0x20u
#define KBD_RIGHT_ALT 0x40u
#define KBD_RIGHT_GUI 0x80u
#define KBR_MAX_NBR_PRESSED 6u
/*
*********************************************************************************************************
* LOCAL CONSTANTS
*********************************************************************************************************
*/
static const CPU_INT08U App_USBH_KBD_HID_ToKBD[] = {
0u, 0u, 0u, 0u, 31u, 50u, 48u, 33u, 19u, 34u, 35u, 36u, 24u, 37u, 38u, 39u, /* 0x00 - 0x0F */
52u, 51u, 25u, 26u, 17u, 20u, 32u, 21u, 23u, 49u, 18u, 47u, 22u, 46u, 2u, 3u, /* 0x10 - 0x1F */
4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 43u, 110u, 15u, 16u, 61u, 12u, 13u, 27u, /* 0x20 - 0x2F */
28u, 29u, 42u, 40u, 41u, 1u, 53u, 54u, 55u, 30u, 112u, 113u, 114u, 115u, 116u, 117u, /* 0x30 - 0x3F */
118u, 119u, 120u, 121u, 122u, 123u, 124u, 125u, 126u, 75u, 80u, 85u, 76u, 81u, 86u, 89u, /* 0x40 - 0x4F */
79u, 84u, 83u, 90u, 95u, 100u, 105u, 106u, 108u, 93u, 98u, 103u, 92u, 97u, 102u, 91u, /* 0x50 - 0x5F */
96u, 101u, 99u, 104u, 45u, 129u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0x60 - 0x6F */
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0x70 - 0x7F */
0u, 0u, 0u, 0u, 0u, 107u, 0u, 56u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0x80 - 0x8F */
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0x90 - 0x9F */
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0xA0 - 0xAF */
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0xB0 - 0xBF */
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0xC0 - 0xCF */
0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, /* 0xD0 - 0xDF */
58u, 44u, 60u, 127u, 64u, 57u, 62u, 128u /* 0xE0 - 0xE7 */
};
static const CPU_INT08S App_USBH_KBD_Key[] = {
'\0', '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\0', '\0',
'\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\',
'\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\0', '\n',
'\0', '\0', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', '\0', '\0',
'\0', '\0', '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '7', '4', '1',
'\0', '/', '8', '5', '2',
'0', '*', '9', '6', '3',
'.', '-', '+', '\0', '\n', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
};
static const CPU_INT08S App_USBH_KBD_ShiftKey[] = {
'\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\0', '\0',
'\0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', '|',
'\0', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', '\0', '\n',
'\0', '\0', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0',
'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'
};
/*
*********************************************************************************************************
* LOCAL DATA TYPES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL TABLES
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
static CPU_BOOLEAN App_USBH_KBD_Shift;
static CPU_INT08U App_USBH_KBD_Keys[KBR_MAX_NBR_PRESSED];
static CPU_INT08U App_USBH_KBD_KeysNew[KBR_MAX_NBR_PRESSED];
static CPU_INT08U App_USBH_KBD_KeysLast[KBR_MAX_NBR_PRESSED];
static CPU_INT08U App_USBH_KBD_NbrKeys;
static CPU_INT08U App_USBH_KBD_KeyNewest;
static CPU_INT08U App_USBH_KBD_NbrKeysNew;
static CPU_INT08U App_USBH_KBD_NbrKeysLast;
/*
*********************************************************************************************************
* LOCAL FUNCTION PROTOTYPES
*********************************************************************************************************
*/
static void App_USBH_KBD_PrintKeys (CPU_INT08U *p_buf);
/*
*********************************************************************************************************
* LOCAL CONFIGURATION ERRORS
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*********************************************************************************************************
* GLOBAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* App_USBH_KBD_CallBack()
*
* Description : Callback function for keyboard events.
*
* Argument(s) : p_hid_dev Pointer to the HID class device.
*
* p_buf Pointer to the data sent by the keyboard.
*
* buf_len Buffer length.
*
* err Status of the callback.
*
* Return(s) : None.
*
* Note(s) : None.
*********************************************************************************************************
*/
void App_USBH_KBD_CallBack (USBH_HID_DEV *p_hid_dev,
void *p_buf,
CPU_INT08U buf_len,
USBH_ERR err)
{
(void)p_hid_dev;
if ((err == USBH_ERR_NONE) &&
(buf_len >= 3u)) {
App_USBH_KBD_PrintKeys(p_buf);
}
}
/*
*********************************************************************************************************
*********************************************************************************************************
* LOCAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/
/*
*********************************************************************************************************
* App_USBH_KBD_PrintKeys()
*
* Description : Print keys pressed.
*
* Argument(s) : p_buf Buffer pointer.
*
* Return(s) : None.
*
* Note(s) : None.
*********************************************************************************************************
*/
static void App_USBH_KBD_PrintKeys (CPU_INT08U *p_buf)
{
CPU_INT08U ix;
CPU_INT08U jx;
CPU_INT08U error;
App_USBH_KBD_NbrKeys = 0u; /* Initialize variables & key data. */
App_USBH_KBD_NbrKeysNew = 0u;
App_USBH_KBD_NbrKeysLast = 0u;
App_USBH_KBD_KeyNewest = 0u;
if ((p_buf[0u] == KBD_LEFT_SHIFT) || /* Determine if shift key pressed. */
(p_buf[0u] == KBD_RIGHT_SHIFT)) {
App_USBH_KBD_Shift = DEF_TRUE;
} else {
App_USBH_KBD_Shift = DEF_FALSE;
}
error = DEF_FALSE;
for (ix = 2u; ix < (2u + KBR_MAX_NBR_PRESSED); ix++) { /* Determine if error encountered. */
if ((p_buf[ix] == 0x01u) ||
(p_buf[ix] == 0x02u) ||
(p_buf[ix] == 0x03u)) {
error = DEF_TRUE;
}
}
if (error == DEF_TRUE) {
return;
}
App_USBH_KBD_NbrKeys = 0u; /* Determine which keys are pressed. */
App_USBH_KBD_NbrKeysNew = 0u;
for (ix = 2u; ix < (2u + KBR_MAX_NBR_PRESSED); ix++) {
if (p_buf[ix] != 0u) {
App_USBH_KBD_Keys[App_USBH_KBD_NbrKeys] = p_buf[ix];/* If pressed, add to array. */
App_USBH_KBD_NbrKeys++;
for (jx = 0u; jx < App_USBH_KBD_NbrKeysLast; jx++) {/* Determine if key was already pressed. */
if (p_buf[ix] == App_USBH_KBD_KeysLast[jx]) {
break;
}
}
/* If key was not already pressed, add to array. */
if (jx == App_USBH_KBD_NbrKeysLast) {
App_USBH_KBD_KeysNew[App_USBH_KBD_NbrKeysNew] = p_buf[ix];
App_USBH_KBD_NbrKeysNew++;
}
}
}
if (App_USBH_KBD_NbrKeysNew == 1u) { /* If only one new key pressed, print character. */
App_USBH_KBD_KeyNewest = App_USBH_KBD_KeysNew[0u];
if (App_USBH_KBD_Shift == DEF_TRUE) {
APP_TRACE_INFO(("%c", App_USBH_KBD_ShiftKey[App_USBH_KBD_HID_ToKBD[App_USBH_KBD_KeyNewest]]));
} else {
APP_TRACE_INFO(("%c", App_USBH_KBD_Key[App_USBH_KBD_HID_ToKBD[App_USBH_KBD_KeyNewest]]));
}
} else {
App_USBH_KBD_KeyNewest = 0x00u;
}
/* Prepare for next loop. */
App_USBH_KBD_NbrKeysLast = App_USBH_KBD_NbrKeys;
for (ix = 0u; ix < KBR_MAX_NBR_PRESSED; ix++) {
App_USBH_KBD_KeysLast[ix] = App_USBH_KBD_Keys[ix];
}
}
/*
*********************************************************************************************************
* END
*********************************************************************************************************
*/