firmware+controller: Initial USB device

This commit is contained in:
2024-12-09 13:41:22 +00:00
parent db683dbc71
commit 768ee410d8
13 changed files with 229 additions and 3 deletions

View File

@@ -1,3 +1,3 @@
idf_component_register(
SRCS "valconomy.c" "ui.c"
SRCS "valconomy.c" "ui.c" "usb.c"
INCLUDE_DIRS ".")

View File

@@ -1,5 +1,6 @@
## IDF Component Manager Manifest File
dependencies:
espressif/esp_tinyusb: "^1.5.0"
lvgl/lvgl: "^9.2.2"
esp_lcd_touch_gt911: "^1.1.1"
## Required IDF version

116
firmware/main/usb.c Normal file
View File

@@ -0,0 +1,116 @@
#include <inttypes.h>
#include "esp_log.h"
#include "esp_mac.h"
#include "tinyusb.h"
#include "class/hid/hid_device.h"
#define TUSB_DESC_TOTAL_LEN (TUD_CONFIG_DESC_LEN + CFG_TUD_HID * TUD_HID_DESC_LEN)
static const char *TAG = "valconomy-usb";
// See https://github.com/hathach/tinyusb/blob/cb22301f91f0465a5578be35d9be284657ddd31d/src/common/tusb_types.h#L331
const tusb_desc_device_t val_usb_dev_descriptor = {
.bLength = sizeof(tusb_desc_device_t),
.bDescriptorType = TUSB_DESC_DEVICE,
// BCD-coded USB version (?)
.bcdUSB = 0x0200,
.bDeviceClass = 0x00,
.bDeviceSubClass = 0x00,
.bDeviceProtocol = 0x00,
.bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,
.idVendor = 0x6969,
.idProduct = 0x0004,
// BCD-coded device version (0.1)
.bcdDevice = 0x0010,
// Indices of strings
.iManufacturer = 0x01,
.iProduct = 0x02,
.iSerialNumber = 0x03,
.bNumConfigurations = 0x01,
};
const uint8_t val_hid_report_descriptor[] = {
TUD_HID_REPORT_DESC_KEYBOARD(HID_REPORT_ID(HID_ITF_PROTOCOL_KEYBOARD)),
};
char val_dev_serial[13];
const char* val_hid_string_descriptor[5] = {
// 0: is supported language is English (0x0409)
(char[]){0x09, 0x04},
// 1: Manufacturer
"/dev/player0",
// 2: Product
"Valorant Economy Helper",
// 3: Serials, should use chip ID
val_dev_serial,
// 4: HID
"Valconomy HID interface",
};
static const uint8_t val_hid_conf_descriptor[] = {
// Configuration number, interface count, string index, total length, attribute, power in mA
TUD_CONFIG_DESCRIPTOR(1, 1, 0, TUSB_DESC_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),
// Interface number, string index, boot protocol, report descriptor len, EP In address, size & polling interval
TUD_HID_DESCRIPTOR(0, 4, false, sizeof(val_hid_report_descriptor), 0x81, 16, 10),
};
// TinyUSB callbacks
// Invoked when received GET HID REPORT DESCRIPTOR request
// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete
uint8_t const *tud_hid_descriptor_report_cb(uint8_t instance) {
// We use only one interface and one HID report descriptor, so we can ignore parameter 'instance'
return val_hid_report_descriptor;
}
// Invoked when received GET_REPORT control request
// Application must fill buffer report's content and return its length.
// Return zero will cause the stack to STALL request
uint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) {
(void) instance;
(void) report_id;
(void) report_type;
(void) buffer;
(void) reqlen;
return 0;
}
// Invoked when received SET_REPORT control request or
// received data on OUT endpoint ( Report ID = 0, Type = 0 )
void tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) {}
void val_usb_init(void) {
ESP_LOGI(TAG, "Initializing USB");
// Use MAC address for serial number
uint8_t mac[6] = { 0 };
ESP_ERROR_CHECK(esp_read_mac(mac, ESP_MAC_EFUSE_FACTORY));
snprintf(
val_dev_serial, sizeof(val_dev_serial),
"%02x%02x%02x%02x%02x%02x", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
const tinyusb_config_t cfg = {
.device_descriptor = &val_usb_dev_descriptor,
.string_descriptor = val_hid_string_descriptor,
.string_descriptor_count = sizeof(val_hid_string_descriptor) / sizeof(char *),
.external_phy = false,
#if (TUD_OPT_HIGH_SPEED)
// HID configuration descriptor for full-speed and high-speed are the same
.fs_configuration_descriptor = val_hid_conf_descriptor,
.hs_configuration_descriptor = val_hid_conf_descriptor,
.qualifier_descriptor = NULL,
#else
.configuration_descriptor = val_hid_conf_descriptor,
#endif // TUD_OPT_HIGH_SPEED
};
ESP_ERROR_CHECK(tinyusb_driver_install(&cfg));
}

View File

@@ -1,5 +1,4 @@
#include <inttypes.h>
#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
@@ -37,6 +36,7 @@ static i2c_master_dev_handle_t exio_cfg_handle, exio_o_handle;
// LVGL library is not thread-safe, we will call LVGL APIs from different tasks, so use a mutex to protect it
static SemaphoreHandle_t lvgl_mtx = NULL;
extern void val_usb_init(void);
extern void val_lvgl_ui(lv_display_t *disp);
bool val_lvgl_lock(int timeout_ms) {
@@ -293,6 +293,8 @@ void val_setup_lvgl(esp_lcd_panel_handle_t lcd_panel, esp_lcd_touch_handle_t tou
void app_main(void) {
val_i2c_master_init();
val_usb_init();
esp_lcd_panel_handle_t lcd_panel = val_setup_lcd();
assert(lcd_panel);
esp_lcd_touch_handle_t touch_panel = val_setup_touch();