Просмотр исходного кода

platform: lvgl: update features and support both LVGL 8 and LVGL 9

Signed-off-by: Runcheng Lu <runcheng.lu@hpmicro.com>
Runcheng Lu 8 месяцев назад
Родитель
Сommit
d012974a0e
3 измененных файлов с 310 добавлено и 78 удалено
  1. 1 1
      platform/README.md
  2. 107 1
      platform/lvgl/image_cursor.c
  3. 202 76
      platform/lvgl/usbh_hid_lvgl.c

+ 1 - 1
platform/README.md

@@ -33,7 +33,7 @@ lwip support with usb host net class(cdc_ecm/cdc_ncm/cdc_rndis/asix/rtl8152/bl61
 
 ## LVGL
 
-- lvgl index support with usb host mouse and keyboard.
+- lvgl indev support with usb host mouse and keyboard. support both LVGL8.x.x and LVGL9.x.x
 
 ## Blackmagic
 

+ 107 - 1
platform/lvgl/image_cursor.c

@@ -1,5 +1,6 @@
 /*
  * SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
+ * Copyright (c) 2025 RCSN
  *
  * SPDX-License-Identifier: Apache-2.0
  */
@@ -27,6 +28,7 @@
 #define LV_ATTRIBUTE_IMG_DUST
 #endif
 
+#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9)
 static const
 LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_DUST
 uint8_t img_cursor_20px_map[] = {
@@ -63,4 +65,108 @@ const lv_img_dsc_t img_cursor = {
     .header.stride = 80,
     .data_size = 1600,
     .data = img_cursor_20px_map,
-};
+};
+#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8)
+const uint8_t mouse_cursor_icon_map[] = {
+#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
+    /*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
+    0x24, 0xb8, 0x24, 0xc8, 0x00, 0x13, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcc, 0xdb, 0xff, 0x49, 0xcc, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xc8, 0xff, 0xff, 0xff, 0xff, 0x49, 0xe0, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcb, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x6d, 0xf3, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0xff, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0xff, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0xb6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0x24, 0xab, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x24, 0xbb, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x49, 0xd8, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xef, 0x00, 0x4f, 0x00, 0x00,
+    0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x92, 0xff, 0x00, 0x6b,
+    0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x92, 0xf7, 0x92, 0xf8, 0x6e, 0xfb, 0x92, 0xf8, 0x6d, 0xff, 0x00, 0xb3,
+    0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x24, 0xb7, 0x00, 0x1b, 0x00, 0x14, 0x00, 0x13, 0x00, 0x0c, 0x25, 0x07,
+    0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6e, 0xf0, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0xcc, 0xff, 0xff, 0xff, 0xff, 0x49, 0xd8, 0x00, 0x78, 0x92, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xff, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x6d, 0xd3, 0xff, 0xff, 0x6d, 0xef, 0x00, 0x34, 0x00, 0x00, 0x49, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6d, 0xdc, 0x00, 0x14, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+    0x49, 0xe0, 0x6d, 0xff, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x92, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xff, 0x00, 0x78, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+    0x00, 0x68, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x49, 0xd0, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0x6d, 0xd8, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xb7, 0xff, 0xff, 0xff, 0x92, 0xff, 0x49, 0xac, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x25, 0xd7, 0x49, 0xc7, 0x00, 0x47, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#endif
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
+    /*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
+    0xc3, 0x18, 0xb8, 0xe4, 0x20, 0xc8, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x49, 0x4a, 0xcc, 0x96, 0xb5, 0xff, 0xc7, 0x39, 0xcc, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xe7, 0x39, 0xc8, 0xbf, 0xff, 0xff, 0xfb, 0xde, 0xff, 0x28, 0x42, 0xe0, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xe7, 0x39, 0xcb, 0x3d, 0xef, 0xff, 0xff, 0xff, 0xfc, 0x3d, 0xef, 0xff, 0xcb, 0x5a, 0xf3, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xe7, 0x39, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0x8e, 0x73, 0xff, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xe8, 0x41, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x51, 0x8c, 0xff, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x9c, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xe8, 0x41, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x14, 0xa5, 0xff, 0xa2, 0x10, 0xab, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0x42, 0xcb, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd7, 0xbd, 0xff, 0x04, 0x21, 0xbb, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0xff, 0xe8, 0x41, 0xd8, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe6, 0xff, 0xab, 0x5a, 0xef, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00,
+    0x08, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xff, 0xaf, 0x7b, 0xff, 0x00, 0x00, 0x6b,
+    0x28, 0x42, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a, 0xd6, 0xff, 0x10, 0x84, 0xf7, 0xae, 0x73, 0xf8, 0x6e, 0x73, 0xfb, 0x8e, 0x73, 0xf8, 0xcb, 0x5a, 0xff, 0x61, 0x08, 0xb3,
+    0x28, 0x42, 0xcc, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x59, 0xce, 0xff, 0xa2, 0x10, 0xb7, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13, 0x00, 0x00, 0x0c, 0x45, 0x29, 0x07,
+    0x29, 0x4a, 0xcc, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xde, 0xff, 0xec, 0x62, 0xff, 0x1c, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x63, 0xf0, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x29, 0x4a, 0xcc, 0xdf, 0xff, 0xff, 0x7d, 0xef, 0xff, 0x49, 0x4a, 0xd8, 0x00, 0x00, 0x78, 0x51, 0x8c, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x38, 0xc6, 0xff, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xcb, 0x5a, 0xd3, 0xdb, 0xde, 0xff, 0xec, 0x62, 0xef, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xe7, 0x39, 0xc7, 0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0xff, 0xaa, 0x52, 0xdc, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+    0xe8, 0x41, 0xe0, 0xaa, 0x52, 0xff, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x72, 0x94, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x96, 0xb5, 0xff, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x61, 0x08, 0x04, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x68, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x69, 0x4a, 0xd0, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xfc, 0xbe, 0xf7, 0xff, 0xaa, 0x52, 0xd8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x75, 0xad, 0xff, 0xbf, 0xff, 0xff, 0x10, 0x84, 0xff, 0x86, 0x31, 0xac, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x41, 0x08, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x66, 0x31, 0xd7, 0xc7, 0x39, 0xc7, 0x00, 0x00, 0x47, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#endif
+#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
+    /*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit  BUT the 2  color bytes are swapped*/
+    0x18, 0xc3, 0xb8, 0x20, 0xe4, 0xc8, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x4a, 0x49, 0xcc, 0xb5, 0x96, 0xff, 0x39, 0xc7, 0xcc, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x39, 0xe7, 0xc8, 0xff, 0xbf, 0xff, 0xde, 0xfb, 0xff, 0x42, 0x28, 0xe0, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x39, 0xe7, 0xcb, 0xef, 0x3d, 0xff, 0xff, 0xff, 0xfc, 0xef, 0x3d, 0xff, 0x5a, 0xcb, 0xf3, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x39, 0xe7, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x73, 0x8e, 0xff, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x41, 0xe8, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8c, 0x51, 0xff, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xd3, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x41, 0xe8, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa5, 0x14, 0xff, 0x10, 0xa2, 0xab, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x42, 0x08, 0xcb, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xd7, 0xff, 0x21, 0x04, 0xbb, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x42, 0x08, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x59, 0xff, 0x41, 0xe8, 0xd8, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x42, 0x08, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfc, 0xff, 0x5a, 0xab, 0xef, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00,
+    0x42, 0x08, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbe, 0xff, 0x7b, 0xaf, 0xff, 0x00, 0x00, 0x6b,
+    0x42, 0x28, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0x7a, 0xff, 0x84, 0x10, 0xf7, 0x73, 0xae, 0xf8, 0x73, 0x6e, 0xfb, 0x73, 0x8e, 0xf8, 0x5a, 0xcb, 0xff, 0x08, 0x61, 0xb3,
+    0x42, 0x28, 0xcc, 0xef, 0x7d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0x59, 0xff, 0x10, 0xa2, 0xb7, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x14, 0x00, 0x00, 0x13, 0x00, 0x00, 0x0c, 0x29, 0x45, 0x07,
+    0x4a, 0x29, 0xcc, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xde, 0xdb, 0xff, 0x62, 0xec, 0xff, 0xe7, 0x1c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x63, 0x0c, 0xf0, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x4a, 0x29, 0xcc, 0xff, 0xdf, 0xff, 0xef, 0x7d, 0xff, 0x4a, 0x49, 0xd8, 0x00, 0x00, 0x78, 0x8c, 0x51, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0x38, 0xff, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x5a, 0xcb, 0xd3, 0xde, 0xdb, 0xff, 0x62, 0xec, 0xef, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x39, 0xe7, 0xc7, 0xef, 0x5d, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbe, 0xff, 0x52, 0xaa, 0xdc, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+    0x41, 0xe8, 0xe0, 0x52, 0xaa, 0xff, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x94, 0x72, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb5, 0x96, 0xff, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x08, 0x61, 0x04, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x68, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4a, 0x69, 0xd0, 0xef, 0x7d, 0xff, 0xff, 0xff, 0xfc, 0xf7, 0xbe, 0xff, 0x52, 0xaa, 0xd8, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xe4, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xad, 0x75, 0xff, 0xff, 0xbf, 0xff, 0x84, 0x10, 0xff, 0x31, 0x86, 0xac, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x08, 0x41, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x31, 0x66, 0xd7, 0x39, 0xc7, 0xc7, 0x00, 0x00, 0x47, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#endif
+#if LV_COLOR_DEPTH == 32
+    0x19, 0x19, 0x19, 0xb8, 0x1e, 0x1e, 0x1e, 0xc8, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x48, 0x48, 0x48, 0xcc, 0xb2, 0xb2, 0xb2, 0xff, 0x3a, 0x3a, 0x3a, 0xcc, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x3b, 0x3b, 0x3b, 0xc8, 0xf6, 0xf6, 0xf6, 0xff, 0xdc, 0xdc, 0xdc, 0xff, 0x43, 0x43, 0x43, 0xe0, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x3b, 0x3b, 0x3b, 0xcb, 0xe6, 0xe6, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xe5, 0xe5, 0xe5, 0xff, 0x59, 0x59, 0x59, 0xf3, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x3c, 0x3c, 0x3c, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf5, 0xf5, 0xff, 0x72, 0x72, 0x72, 0xff, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x3d, 0x3d, 0x3d, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8a, 0x8a, 0x8a, 0xff, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x99, 0x99, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x3e, 0x3e, 0x3e, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa2, 0xa2, 0xa2, 0xff, 0x13, 0x13, 0x13, 0xab, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x3f, 0x3f, 0x3f, 0xcb, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb7, 0xb7, 0xb7, 0xff, 0x1f, 0x1f, 0x1f, 0xbb, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x41, 0x41, 0x41, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xca, 0xca, 0xca, 0xff, 0x3d, 0x3d, 0x3d, 0xd8, 0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x41, 0x41, 0x41, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xde, 0xde, 0xde, 0xff, 0x56, 0x56, 0x56, 0xef, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00,
+    0x42, 0x42, 0x42, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf3, 0xf3, 0xff, 0x76, 0x76, 0x76, 0xff, 0x00, 0x00, 0x00, 0x6b,
+    0x43, 0x43, 0x43, 0xcc, 0xea, 0xea, 0xea, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xce, 0xce, 0xce, 0xff, 0x80, 0x80, 0x80, 0xf7, 0x74, 0x74, 0x74, 0xf8, 0x6d, 0x6d, 0x6d, 0xfb, 0x72, 0x72, 0x72, 0xf8, 0x57, 0x57, 0x57, 0xff, 0x0c, 0x0c, 0x0c, 0xb3,
+    0x44, 0x44, 0x44, 0xcc, 0xeb, 0xeb, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xfb, 0xfb, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x13, 0x13, 0x13, 0xb7, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0c, 0x29, 0x29, 0x29, 0x07,
+    0x45, 0x45, 0x45, 0xcc, 0xe8, 0xe8, 0xe8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd9, 0xd9, 0xd9, 0xff, 0x5e, 0x5e, 0x5e, 0xff, 0xe2, 0xe2, 0xe2, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x62, 0x62, 0x62, 0xf0, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x45, 0x45, 0x45, 0xcc, 0xf9, 0xf9, 0xf9, 0xff, 0xec, 0xec, 0xec, 0xff, 0x4a, 0x4a, 0x4a, 0xd8, 0x00, 0x00, 0x00, 0x78, 0x8a, 0x8a, 0x8a, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0xc3, 0xff, 0x00, 0x00, 0x00, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x58, 0x58, 0x58, 0xd3, 0xd9, 0xd9, 0xd9, 0xff, 0x5e, 0x5e, 0x5e, 0xef, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x3b, 0x3b, 0xc7, 0xe9, 0xe9, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xf4, 0xf4, 0xff, 0x54, 0x54, 0x54, 0xdc, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+    0x3e, 0x3e, 0x3e, 0xe0, 0x54, 0x54, 0x54, 0xff, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x8e, 0x8e, 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb0, 0xb0, 0xb0, 0xff, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x4c, 0x4c, 0x4c, 0xd0, 0xec, 0xec, 0xec, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xf4, 0xf4, 0xf4, 0xff, 0x53, 0x53, 0x53, 0xd8, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x1e, 0x1e, 0x00, 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0xab, 0xab, 0xab, 0xff, 0xf6, 0xf6, 0xf6, 0xff, 0x80, 0x80, 0x80, 0xff, 0x31, 0x31, 0x31, 0xac, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x09, 0x09, 0x09, 0x03, 0x02, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x2e, 0x2e, 0x2e, 0xd7, 0x38, 0x38, 0x38, 0xc7, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+#endif
+};
+
+const lv_img_dsc_t img_cursor = {
+    .header.always_zero = 0,
+    .header.w = 14,
+    .header.h = 20,
+    .data_size = 280 * LV_IMG_PX_SIZE_ALPHA_BYTE,
+    .header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
+    .data = mouse_cursor_icon_map,
+};
+#endif

+ 202 - 76
platform/lvgl/usbh_hid_lvgl.c

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2025, sakumisu
+ * Copyright (c) 2025, RCSN
  *
  * SPDX-License-Identifier: Apache-2.0
  */
@@ -13,6 +14,66 @@
 /* LVGL image of cursor */
 LV_IMG_DECLARE(img_cursor)
 
+const uint8_t keycode2ascii[57][2] = {
+    {0, 0}, /* HID_KEY_NO_PRESS */
+    {0, 0}, /* HID_KEY_ROLLOVER */
+    {0, 0}, /* HID_KEY_POST_FAIL */
+    {0, 0}, /* HID_KEY_ERROR_UNDEFINED */
+    {'a', 'A'}, /* HID_KEY_A */
+    {'b', 'B'}, /* HID_KEY_B */
+    {'c', 'C'}, /* HID_KEY_C */
+    {'d', 'D'}, /* HID_KEY_D */
+    {'e', 'E'}, /* HID_KEY_E */
+    {'f', 'F'}, /* HID_KEY_F */
+    {'g', 'G'}, /* HID_KEY_G */
+    {'h', 'H'}, /* HID_KEY_H */
+    {'i', 'I'}, /* HID_KEY_I */
+    {'j', 'J'}, /* HID_KEY_J */
+    {'k', 'K'}, /* HID_KEY_K */
+    {'l', 'L'}, /* HID_KEY_L */
+    {'m', 'M'}, /* HID_KEY_M */
+    {'n', 'N'}, /* HID_KEY_N */
+    {'o', 'O'}, /* HID_KEY_O */
+    {'p', 'P'}, /* HID_KEY_P */
+    {'q', 'Q'}, /* HID_KEY_Q */
+    {'r', 'R'}, /* HID_KEY_R */
+    {'s', 'S'}, /* HID_KEY_S */
+    {'t', 'T'}, /* HID_KEY_T */
+    {'u', 'U'}, /* HID_KEY_U */
+    {'v', 'V'}, /* HID_KEY_V */
+    {'w', 'W'}, /* HID_KEY_W */
+    {'x', 'X'}, /* HID_KEY_X */
+    {'y', 'Y'}, /* HID_KEY_Y */
+    {'z', 'Z'}, /* HID_KEY_Z */
+    {'1', '!'}, /* HID_KEY_1 */
+    {'2', '@'}, /* HID_KEY_2 */
+    {'3', '#'}, /* HID_KEY_3 */
+    {'4', '$'}, /* HID_KEY_4 */
+    {'5', '%'}, /* HID_KEY_5 */
+    {'6', '^'}, /* HID_KEY_6 */
+    {'7', '&'}, /* HID_KEY_7 */
+    {'8', '*'}, /* HID_KEY_8 */
+    {'9', '('}, /* HID_KEY_9 */
+    {'0', ')'}, /* HID_KEY_0 */
+    {'\r', '\r'}, /* HID_KEY_ENTER */
+    {0, 0},       /* HID_KEY_ESC */
+    {'\b', 0},    /* HID_KEY_DEL */
+    {0, 0},       /* HID_KEY_TAB */
+    {' ', ' '},   /* HID_KEY_SPACE */
+    {'-', '_'},   /* HID_KEY_MINUS */
+    {'=', '+'},   /* HID_KEY_EQUAL */
+    {'[', '{'},   /* HID_KEY_OPEN_BRACKET */
+    {']', '}'},   /* HID_KEY_CLOSE_BRACKET */
+    {'\\', '|'},  /* HID_KEY_BACK_SLASH */
+    {'\\', '|'},  /* HID_KEY_SHARP */
+    {';', ':'},   /* HID_KEY_COLON */
+    {'\'', '"'},  /* HID_KEY_QUOTE */
+    {'`', '~'},   /* HID_KEY_TILDE */
+    {',', '<'},   /* HID_KEY_LESS */
+    {'.', '>'},   /* HID_KEY_GREATER */
+    {'/', '?'}    /* HID_KEY_SLASH */
+};
+
 struct usbh_hid_lvgl {
     struct {
         lv_indev_t *indev;   /* LVGL mouse input device driver */
@@ -33,6 +94,7 @@ static struct usbh_hid_lvgl g_hid_lvgl;
 USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t hid_mouse_buffer[64];
 USB_NOCACHE_RAM_SECTION USB_MEM_ALIGNX uint8_t hid_keyboard_buffer[64];
 
+#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9)
 static void usbh_hid_lvgl_read_mouse(lv_indev_t *indev_drv, lv_indev_data_t *data)
 {
     int16_t width = 0;
@@ -51,13 +113,13 @@ static void usbh_hid_lvgl_read_mouse(lv_indev_t *indev_drv, lv_indev_data_t *dat
     /* Screen borders */
     if (ctx->mouse.x < 0) {
         ctx->mouse.x = 0;
-    } else if (ctx->mouse.x > width * ctx->mouse.sensitivity) {
-        ctx->mouse.x = width * ctx->mouse.sensitivity;
+    } else if (ctx->mouse.x >= width * ctx->mouse.sensitivity) {
+        ctx->mouse.x = (width * ctx->mouse.sensitivity) - 1;
     }
     if (ctx->mouse.y < 0) {
         ctx->mouse.y = 0;
-    } else if (ctx->mouse.y > height * ctx->mouse.sensitivity) {
-        ctx->mouse.y = height * ctx->mouse.sensitivity;
+    } else if (ctx->mouse.y >= height * ctx->mouse.sensitivity) {
+        ctx->mouse.y = (height * ctx->mouse.sensitivity) - 1;
     }
 
     /* Get coordinates by rotation with sensitivity */
@@ -89,6 +151,79 @@ static void usbh_hid_lvgl_read_mouse(lv_indev_t *indev_drv, lv_indev_data_t *dat
 
 static void usbh_hid_lvgl_read_keyboard(lv_indev_t *indev_drv, lv_indev_data_t *data)
 {
+    (void)indev_drv;
+    struct usbh_hid_lvgl *ctx = &g_hid_lvgl;
+
+    data->key = ctx->kb.last_key;
+    if (ctx->kb.pressed) {
+        data->state = LV_INDEV_STATE_PRESSED;
+        ctx->kb.pressed = false;
+    } else {
+        data->state = LV_INDEV_STATE_RELEASED;
+        ctx->kb.last_key = 0;
+    }
+}
+
+#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8)
+static lv_indev_drv_t indev_drv;
+static lv_indev_drv_t keyboard_drv;
+static void hpm_lvgl_indev_read_cb(lv_indev_drv_t *indev_drv, lv_indev_data_t *data)
+{
+    int16_t width = 0;
+    int16_t height = 0;
+    struct usbh_hid_lvgl *ctx = &g_hid_lvgl;
+    
+    if ((indev_drv->disp->driver->rotated == LV_DISP_ROT_NONE) || (indev_drv->disp->driver->rotated == LV_DISP_ROT_180)) {
+        width = indev_drv->disp->driver->hor_res;
+        height = indev_drv->disp->driver->ver_res;
+    } else {
+        width = indev_drv->disp->driver->ver_res;
+        height = indev_drv->disp->driver->hor_res;    
+    }
+
+
+    /* Screen borders */
+    if (ctx->mouse.x < 0) {
+        ctx->mouse.x = 0;
+    } else if (ctx->mouse.x >= width * ctx->mouse.sensitivity) {
+        ctx->mouse.x = (width * ctx->mouse.sensitivity) - 1;
+    }
+    if (ctx->mouse.y < 0) {
+        ctx->mouse.y = 0;
+    } else if (ctx->mouse.y >= height * ctx->mouse.sensitivity) {
+        ctx->mouse.y = (height * ctx->mouse.sensitivity) - 1;
+    }
+
+    /* Get coordinates by rotation with sensitivity */
+    switch (indev_drv->disp->driver->rotated) {
+    case LV_DISP_ROT_NONE:
+        data->point.x = ctx->mouse.x / ctx->mouse.sensitivity;
+        data->point.y = ctx->mouse.y / ctx->mouse.sensitivity;
+        break;
+    case LV_DISP_ROT_90:
+        data->point.y = width - ctx->mouse.x / ctx->mouse.sensitivity;
+        data->point.x = ctx->mouse.y / ctx->mouse.sensitivity;
+        break;
+    case LV_DISP_ROT_180:
+        data->point.x = width - ctx->mouse.x / ctx->mouse.sensitivity;
+        data->point.y = height - ctx->mouse.y / ctx->mouse.sensitivity;
+        break;
+    case LV_DISP_ROT_270:
+        data->point.y = ctx->mouse.x / ctx->mouse.sensitivity;
+        data->point.x = height - ctx->mouse.y / ctx->mouse.sensitivity;
+        break;
+    }
+
+    if (ctx->mouse.left_button) {
+        data->state = LV_INDEV_STATE_PRESSED;
+    } else {
+        data->state = LV_INDEV_STATE_RELEASED;
+    }
+}
+
+static void usbh_hid_lvgl_read_keyboard(lv_indev_drv_t *indev_drv, lv_indev_data_t *data)
+{
+    (void)indev_drv;
     struct usbh_hid_lvgl *ctx = &g_hid_lvgl;
 
     data->key = ctx->kb.last_key;
@@ -100,9 +235,11 @@ static void usbh_hid_lvgl_read_keyboard(lv_indev_t *indev_drv, lv_indev_data_t *
         ctx->kb.last_key = 0;
     }
 }
+#endif
 
 lv_indev_t *usbh_hid_lvgl_add_mouse(uint8_t sensitivity)
 {
+    int32_t ver_res, hor_res;
     lv_indev_t *indev;
 
     /* Initialize USB HID */
@@ -111,20 +248,32 @@ lv_indev_t *usbh_hid_lvgl_add_mouse(uint8_t sensitivity)
     /* Mouse sensitivity cannot be zero */
     hid_ctx->mouse.sensitivity = (sensitivity == 0 ? 1 : sensitivity);
 
-    int32_t ver_res = lv_display_get_vertical_resolution(lv_display_get_default());
-    int32_t hor_res = lv_display_get_physical_horizontal_resolution(lv_display_get_default());
-
+#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9)
+    ver_res = lv_display_get_vertical_resolution(lv_display_get_default());
+    hor_res = lv_display_get_physical_horizontal_resolution(lv_display_get_default());
+#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8)
+    lv_disp_t * disp = lv_disp_get_default();
+    ver_res = disp->driver->hor_res;
+    hor_res = disp->driver->ver_res;
+#endif
     /* Default coordinates to screen center */
     hid_ctx->mouse.x = (hor_res * hid_ctx->mouse.sensitivity) / 2;
     hid_ctx->mouse.y = (ver_res * hid_ctx->mouse.sensitivity) / 2;
 
     /* Register a mouse input device */
+#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9)
     indev = lv_indev_create();
     lv_indev_set_type(indev, LV_INDEV_TYPE_POINTER);
     lv_indev_set_read_cb(indev, usbh_hid_lvgl_read_mouse);
     lv_indev_set_driver_data(indev, hid_ctx);
     hid_ctx->mouse.indev = indev;
-
+#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8)
+    lv_indev_drv_init(&indev_drv);
+    indev_drv.read_cb = hpm_lvgl_indev_read_cb;
+    indev_drv.type = LV_INDEV_TYPE_POINTER;
+    indev_drv.user_data = (void *)hid_ctx;
+    indev = lv_indev_drv_register(&indev_drv);
+#endif
     /* Set image of cursor */
     lv_obj_t *cursor;
     cursor = lv_img_create(lv_scr_act());
@@ -142,12 +291,19 @@ lv_indev_t *usbh_hid_lvgl_add_keyboard(void)
     struct usbh_hid_lvgl *hid_ctx = &g_hid_lvgl;
 
     /* Register a keyboard input device */
+#if defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 9)
     indev = lv_indev_create();
     lv_indev_set_type(indev, LV_INDEV_TYPE_KEYPAD);
     lv_indev_set_read_cb(indev, usbh_hid_lvgl_read_keyboard);
     lv_indev_set_driver_data(indev, hid_ctx);
     hid_ctx->kb.indev = indev;
-
+#elif defined(LVGL_VERSION_MAJOR) && (LVGL_VERSION_MAJOR == 8)
+    lv_indev_drv_init(&keyboard_drv);
+    keyboard_drv.read_cb = usbh_hid_lvgl_read_keyboard;
+    keyboard_drv.type = LV_INDEV_TYPE_KEYPAD;
+    keyboard_drv.user_data = (void *)hid_ctx;
+    indev = lv_indev_drv_register(&keyboard_drv);
+#endif
     return indev;
 }
 
@@ -176,74 +332,39 @@ void usbh_hid_mouse_callback(void *arg, int nbytes)
 static char usb_hid_get_keyboard_char(uint8_t key, uint8_t shift)
 {
     char ret_key = 0;
-
-    const uint8_t keycode2ascii[57][2] = {
-        { 0, 0 },       /* HID_KEY_NO_PRESS        */
-        { 0, 0 },       /* HID_KEY_ROLLOVER        */
-        { 0, 0 },       /* HID_KEY_POST_FAIL       */
-        { 0, 0 },       /* HID_KEY_ERROR_UNDEFINED */
-        { 'a', 'A' },   /* HID_KEY_A               */
-        { 'b', 'B' },   /* HID_KEY_B               */
-        { 'c', 'C' },   /* HID_KEY_C               */
-        { 'd', 'D' },   /* HID_KEY_D               */
-        { 'e', 'E' },   /* HID_KEY_E               */
-        { 'f', 'F' },   /* HID_KEY_F               */
-        { 'g', 'G' },   /* HID_KEY_G               */
-        { 'h', 'H' },   /* HID_KEY_H               */
-        { 'i', 'I' },   /* HID_KEY_I               */
-        { 'j', 'J' },   /* HID_KEY_J               */
-        { 'k', 'K' },   /* HID_KEY_K               */
-        { 'l', 'L' },   /* HID_KEY_L               */
-        { 'm', 'M' },   /* HID_KEY_M               */
-        { 'n', 'N' },   /* HID_KEY_N               */
-        { 'o', 'O' },   /* HID_KEY_O               */
-        { 'p', 'P' },   /* HID_KEY_P               */
-        { 'q', 'Q' },   /* HID_KEY_Q               */
-        { 'r', 'R' },   /* HID_KEY_R               */
-        { 's', 'S' },   /* HID_KEY_S               */
-        { 't', 'T' },   /* HID_KEY_T               */
-        { 'u', 'U' },   /* HID_KEY_U               */
-        { 'v', 'V' },   /* HID_KEY_V               */
-        { 'w', 'W' },   /* HID_KEY_W               */
-        { 'x', 'X' },   /* HID_KEY_X               */
-        { 'y', 'Y' },   /* HID_KEY_Y               */
-        { 'z', 'Z' },   /* HID_KEY_Z               */
-        { '1', '!' },   /* HID_KEY_1               */
-        { '2', '@' },   /* HID_KEY_2               */
-        { '3', '#' },   /* HID_KEY_3               */
-        { '4', '$' },   /* HID_KEY_4               */
-        { '5', '%' },   /* HID_KEY_5               */
-        { '6', '^' },   /* HID_KEY_6               */
-        { '7', '&' },   /* HID_KEY_7               */
-        { '8', '*' },   /* HID_KEY_8               */
-        { '9', '(' },   /* HID_KEY_9               */
-        { '0', ')' },   /* HID_KEY_0               */
-        { '\r', '\r' }, /* HID_KEY_ENTER           */
-        { 0, 0 },       /* HID_KEY_ESC             */
-        { '\b', 0 },    /* HID_KEY_DEL             */
-        { 0, 0 },       /* HID_KEY_TAB             */
-        { ' ', ' ' },   /* HID_KEY_SPACE           */
-        { '-', '_' },   /* HID_KEY_MINUS           */
-        { '=', '+' },   /* HID_KEY_EQUAL           */
-        { '[', '{' },   /* HID_KEY_OPEN_BRACKET    */
-        { ']', '}' },   /* HID_KEY_CLOSE_BRACKET   */
-        { '\\', '|' },  /* HID_KEY_BACK_SLASH      */
-        { '\\', '|' },
-        /* HID_KEY_SHARP           */ // HOTFIX: for NonUS Keyboards repeat HID_KEY_BACK_SLASH
-        { ';', ':' },                 /* HID_KEY_COLON           */
-        { '\'', '"' },                /* HID_KEY_QUOTE           */
-        { '`', '~' },                 /* HID_KEY_TILDE           */
-        { ',', '<' },                 /* HID_KEY_LESS            */
-        { '.', '>' },                 /* HID_KEY_GREATER         */
-        { '/', '?' }                  /* HID_KEY_SLASH           */
-    };
+    static bool cap_lock = false;
 
     if (shift > 1) {
         shift = 1;
     }
 
     if ((key >= HID_KBD_USAGE_A) && (key <= HID_KBD_USAGE_QUESTION)) {
+        ret_key = (cap_lock == false) ?  keycode2ascii[key][0] : keycode2ascii[key][1];
+    } else if ((key >= HID_KBD_USAGE_1) && (key <= HID_KBD_USAGE_QUESTION)) {
         ret_key = keycode2ascii[key][shift];
+    } else if ((key >= HID_KBD_USAGE_KPD1) && (key <= HID_KBD_USAGE_KPD0)) {
+        ret_key = keycode2ascii[(key - HID_KBD_USAGE_KPD1) + HID_KBD_USAGE_1][0];
+    } else if ((key >= HID_KBD_USAGE_KPDDIV) && (key <= HID_KBD_USAGE_KPDEMTER)) {
+        switch (key) {
+        case HID_KBD_USAGE_KPDDIV:
+            ret_key = '/';
+            break;
+        case HID_KBD_USAGE_KPDMUL:
+            ret_key = '*';
+            break;
+        case HID_KBD_USAGE_KPDHMINUS:
+            ret_key = '-';
+            break;
+        case HID_KBD_USAGE_KPDPLUS:
+            ret_key = '+';
+            break;
+        default:
+            break;
+        }
+    } else if (key == HID_KBD_USAGE_KPDDELETE) {
+        ret_key = '.';
+    } else if (key == HID_KBD_USAGE_CAPSLOCK) {
+        cap_lock = !cap_lock;
     }
 
     return ret_key;
@@ -258,12 +379,12 @@ void usbh_hid_keyboard_callback(void *arg, int nbytes)
         struct usb_hid_kbd_report *keyboard = (struct usb_hid_kbd_report *)hid_keyboard_buffer;
 
         for (int i = 0; i < 6; i++) {
-            if (keyboard->key[i] > HID_KBD_USAGE_MAX) {
+            if ((keyboard->key[i] <= HID_KBD_USAGE_MAX) && (keyboard->key[i] > HID_KBD_USAGE_NONE)) {
                 char key = 0;
 
                 /* LVGL special keys */
                 if (keyboard->key[i] == HID_KBD_USAGE_TAB) {
-                    if (((keyboard->modifier & HID_MODIFER_LSHIFT) || (keyboard->modifier & HID_MODIFER_RSHIFT))) {
+                    if (((keyboard->modifier & HID_MODIFIER_LSHIFT) || (keyboard->modifier & HID_MODIFIER_RSHIFT))) {
                         key = LV_KEY_PREV;
                     } else {
                         key = LV_KEY_NEXT;
@@ -279,14 +400,16 @@ void usbh_hid_keyboard_callback(void *arg, int nbytes)
                 } else if (keyboard->key[i] == HID_KBD_USAGE_ENTER || keyboard->key[i] == HID_KBD_USAGE_KPDEMTER) {
                     key = LV_KEY_ENTER;
                 } else if (keyboard->key[i] == HID_KBD_USAGE_DELETE) {
-                    key = LV_KEY_DEL;
+                    key = LV_KEY_BACKSPACE;
                 } else if (keyboard->key[i] == HID_KBD_USAGE_HOME) {
                     key = LV_KEY_HOME;
                 } else if (keyboard->key[i] == HID_KBD_USAGE_END) {
                     key = LV_KEY_END;
+                } else if (keyboard->key[i] == HID_KBD_USAGE_DELFWD) {
+                    key = LV_KEY_DEL;
                 } else {
                     /* Get ASCII char */
-                    key = usb_hid_get_keyboard_char(keyboard->key[i], ((keyboard->modifier & HID_MODIFER_LSHIFT) || (keyboard->modifier & HID_MODIFER_RSHIFT)));
+                    key = usb_hid_get_keyboard_char(keyboard->key[i], ((keyboard->modifier & HID_MODIFIER_LSHIFT) || (keyboard->modifier & HID_MODIFIER_RSHIFT)));
                 }
 
                 if (key == 0) {
@@ -298,16 +421,18 @@ void usbh_hid_keyboard_callback(void *arg, int nbytes)
         }
 
         usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_keyboard_buffer, hid_class->intin->wMaxPacketSize, 0,
-                          usbh_hid_mouse_callback, hid_class);
+                        usbh_hid_keyboard_callback, hid_class);
         usbh_submit_urb(&hid_class->intin_urb);
     } else if (nbytes == -USB_ERR_NAK) { /* only dwc2 should do this */
         usbh_int_urb_fill(&hid_class->intin_urb, hid_class->hport, hid_class->intin, hid_keyboard_buffer, hid_class->intin->wMaxPacketSize, 0,
-                          usbh_hid_mouse_callback, hid_class);
+                        usbh_hid_keyboard_callback, hid_class);
         usbh_submit_urb(&hid_class->intin_urb);
     } else {
     }
 }
 
+extern int usbh_hid_set_protocol(struct usbh_hid *hid_class, uint8_t protocol);
+
 void usbh_hid_run(struct usbh_hid *hid_class)
 {
     usbh_hid_set_protocol(hid_class, 0);
@@ -326,4 +451,5 @@ void usbh_hid_run(struct usbh_hid *hid_class)
 
 void usbh_hid_stop(struct usbh_hid *hid_class)
 {
+    (void)hid_class;
 }