Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
a0664c4
refactor: split grid_esp32_usb into ACM, HID, MIDI submodules
SukuWc May 23, 2026
d3f44bd
fix: apply clang-format to HID_REPORT_DESCRIPTOR_CONTENT macro
SukuWc May 23, 2026
c5f78e4
chore: add TinyUSB 0.19.0 as git submodule at common/dep/tinyusb
SukuWc May 24, 2026
c88fc5b
feat(usb): replace esp_tinyusb managed component with upstream TinyUS…
SukuWc May 24, 2026
682d283
style: apply clang-format to tinyusb component files
SukuWc May 24, 2026
a66dffa
ci: init git submodules on checkout for firmware build
SukuWc May 24, 2026
a7761b2
fix(tinyusb): fix typo synopsis -> synopsys in DWC2 source paths
SukuWc May 24, 2026
cb57c25
ci: add synopsys to codespell ignore-words
SukuWc May 24, 2026
1cc012a
d51: replace ASF4 USB stack with TinyUSB 0.19.0
SukuWc May 24, 2026
646617e
style: clang-format d51 USB files
SukuWc May 24, 2026
87c6d8d
refactor(d51): split USB into acm/midi/hid files, remove comments
SukuWc May 25, 2026
05042bb
SUKU formatting fixed
SukuWc May 25, 2026
9a21850
SUKU usb drivers moved to common
SukuWc May 26, 2026
b3d73ba
SUKU format fixed
SukuWc May 26, 2026
070e151
SUKU mouse axis enum renamed, tusd config included
SukuWc May 26, 2026
6894f18
SUKU renaming and slight HID refactor
SukuWc May 26, 2026
61f7e41
SUKU cosmetic cleanup
SukuWc May 26, 2026
1d39c6b
SUKU fix unit test CI: add tusb_config.h stub to gitignore allowlist
SukuWc May 26, 2026
508900b
SUKU platform specific files use tud via grid_usb now, config files s…
SukuWc Jun 1, 2026
a01cceb
SUKU submodule pointed to fork, midi tx flow control updated
SukuWc Jun 1, 2026
fbb7831
SUKU midirx queue handled properly to generate backpressure for usb e…
SukuWc Jun 1, 2026
ed75eca
SUKU buffer renamed for consistency
SukuWc Jun 1, 2026
745ddc2
SUKU midi tx message drop reporting mechanizm implemented
SukuWc Jun 1, 2026
8c1a39c
SUKU hid flow control implemented properly
SukuWc Jun 1, 2026
6e9d519
SUKU acm flowcontrol corrected
SukuWc Jun 1, 2026
4474eaf
SUKU cdc flow control added to dropped message logic
SukuWc Jun 1, 2026
2730fd7
SUKU dropped midi is now accumulated with usb is disconnected
SukuWc Jun 1, 2026
5252e43
SUKU use GRID_CLASS_HIDKEYBOARD_frame_end macro instead of manual ETX…
SukuWc Jun 2, 2026
ad256d5
Merge main into SUKU-usb-d51, rename grid_usb_keyboard_state in grid_…
SukuWc Jun 2, 2026
07730d5
Merge branch 'main' into SUKU-usb-d51
SukuWc Jun 2, 2026
8963e4b
Merge remote-tracking branch 'origin/main' into SUKU-usb-d51
SukuWc Jun 3, 2026
21814eb
Merge branch 'main' into SUKU-usb-d51
SukuWc Jun 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build-and-push-firmware.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ jobs:
uses: actions/checkout@v6
with:
ref: ${{ github.ref }}
submodules: recursive

- name: Prepare image
uses: ./.github/actions/prepare-image
Expand Down
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "common/dep/tinyusb"]
path = common/dep/tinyusb
url = https://github.com/intechstudio/tinyusb.git
3 changes: 3 additions & 0 deletions common/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,8 @@
!dep/vmp
!dep/vmp/**

!dep/tinyusb
!dep/tinyusb/**

!test/tests.h
!test/*.c
1 change: 1 addition & 0 deletions common/dep/tinyusb
Submodule tinyusb added at 975c48
49 changes: 19 additions & 30 deletions common/src/c/grid_decode.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ uint8_t grid_decode_midi_to_usb(char* header, char* chunk) {
.byte3 = param2,
};

grid_midi_tx_push(event);
grid_usb_midi_tx_push(&grid_usb_midi_state, event);

return 0;
}
Expand All @@ -94,8 +94,6 @@ uint8_t grid_decode_sysex_to_usb(char* header, char* chunk) {
grid_port_debug_printf("sysex invalid: %d %d", first, last);
}

uint32_t packets_dropped = 0;

struct grid_midi_event_desc event;
for (uint16_t i = 0; i < length;) {

Expand Down Expand Up @@ -128,12 +126,7 @@ uint8_t grid_decode_sysex_to_usb(char* header, char* chunk) {
}
}

// grid_port_debug_printf("packet: %d %d %d %d", event.byte0, event.byte1, event.byte2, event.byte3);
packets_dropped += grid_midi_tx_push(event);
}

if (packets_dropped) {
grid_port_debug_printf("sysex_to_usb: %d packets dropped", packets_dropped);
grid_usb_midi_tx_push(&grid_usb_midi_state, event);
}

return 0;
Expand All @@ -150,14 +143,14 @@ uint8_t grid_decode_mousebutton_to_usb(char* header, char* chunk) {
uint8_t state = grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_HIDMOUSEBUTTON_STATE);
uint8_t button = grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_HIDMOUSEBUTTON_BUTTON);

struct grid_usb_keyboard_event_desc key = {
.ismodifier = 3, // 0: no, 1: yes, 2: mousemove, 3: mousebutton, f: delay
struct grid_macro_event_desc key = {
.type = GRID_MACRO_EVENT_TYPE_MOUSE_BUTTON,
.ispressed = state,
.keycode = button,
.delay = 1,
};

if (grid_usb_keyboard_tx_push(&grid_usb_keyboard_state, key)) {
if (grid_usb_macro_tx_push(&grid_macro_state, key)) {
grid_port_debug_printf("mouse button: packet dropped");
}

Expand All @@ -175,14 +168,14 @@ uint8_t grid_decode_mousemove_to_usb(char* header, char* chunk) {
uint8_t position = grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_HIDMOUSEMOVE_POSITION);
uint8_t axis = grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_HIDMOUSEMOVE_AXIS);

struct grid_usb_keyboard_event_desc key = {
.ismodifier = 2, // 0: no, 1: yes, 2: mousemove, 3: mousebutton, f: delay
struct grid_macro_event_desc key = {
.type = GRID_MACRO_EVENT_TYPE_MOUSE_MOVE,
.ispressed = position,
.keycode = axis,
.delay = 1,
};

if (grid_usb_keyboard_tx_push(&grid_usb_keyboard_state, key)) {
if (grid_usb_macro_tx_push(&grid_macro_state, key)) {
grid_port_debug_printf("mouse move: packet dropped");
}

Expand All @@ -202,7 +195,7 @@ uint8_t grid_decode_gamepadmove_to_usb(char* header, char* chunk) {

int8_t position = position_raw - 128;

grid_usb_gamepad_axis_move(axis, position);
grid_usb_gamepad_axis_move(&grid_gamepad_state, axis, position);

return 0;
}
Expand All @@ -218,7 +211,7 @@ uint8_t grid_decode_gamepadbutton_to_usb(char* header, char* chunk) {
uint8_t button = grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_HIDGAMEPADBUTTON_BUTTON);
uint8_t state = grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_HIDGAMEPADBUTTON_STATE);

grid_usb_gamepad_button_change(button, state);
grid_usb_gamepad_button_change(&grid_gamepad_state, button, state);

return 0;
}
Expand All @@ -245,9 +238,9 @@ uint8_t grid_decode_keyboard_to_usb(char* header, char* chunk) {

if (key_ismodifier == 0 || key_ismodifier == 1) {

struct grid_usb_keyboard_event_desc key = {
struct grid_macro_event_desc key = {
key.keycode = key_code,
key.ismodifier = key_ismodifier,
key.type = key_ismodifier ? GRID_MACRO_EVENT_TYPE_MODIFIER : GRID_MACRO_EVENT_TYPE_KEY,
key.ispressed = key_state,
key.delay = default_delay,
};
Expand All @@ -256,40 +249,36 @@ uint8_t grid_decode_keyboard_to_usb(char* header, char* chunk) {
if (key_state == 2) {

key.ispressed = 1;
packets_dropped += grid_usb_keyboard_tx_push(&grid_usb_keyboard_state, key);
packets_dropped += grid_usb_macro_tx_push(&grid_macro_state, key);
key.ispressed = 0;
packets_dropped += grid_usb_keyboard_tx_push(&grid_usb_keyboard_state, key);
packets_dropped += grid_usb_macro_tx_push(&grid_macro_state, key);
}
// Single press or release
else {

packets_dropped += grid_usb_keyboard_tx_push(&grid_usb_keyboard_state, key);
packets_dropped += grid_usb_macro_tx_push(&grid_macro_state, key);
}

} else if (key_ismodifier == 0xf) {

uint16_t delay = grid_frame_get_parameter((uint8_t*)chunk, GRID_CLASS_HIDKEYBOARD_DELAY_offset + i, GRID_CLASS_HIDKEYBOARD_DELAY_length);

// Special delay event
struct grid_usb_keyboard_event_desc key = {
key.ismodifier = key_ismodifier,
struct grid_macro_event_desc key = {
key.type = GRID_MACRO_EVENT_TYPE_DELAY,
key.ispressed = 0,
key.keycode = 0,
key.delay = delay,
};

packets_dropped += grid_usb_keyboard_tx_push(&grid_usb_keyboard_state, key);
packets_dropped += grid_usb_macro_tx_push(&grid_macro_state, key);

} else {

grid_platform_printf("invalid key_ismodifier parameter %d\n", key_ismodifier);
}
}

if (packets_dropped) {
grid_port_debug_printf("keyboard: %d packets dropped", packets_dropped);
}

return 0;
}

Expand Down Expand Up @@ -1253,7 +1242,7 @@ uint8_t grid_decode_config_to_ui(char* header, char* chunk) {
case GRID_INSTR_EXECUTE_code: {

// Disable HID
grid_usb_keyboard_disable(&grid_usb_keyboard_state);
grid_usb_keyboard_disable(&grid_keyboard_state);

uint16_t scriptlength = grid_msg_get_parameter_raw((uint8_t*)chunk, CLASS_CONFIG_ACTIONLENGTH);

Expand Down
2 changes: 1 addition & 1 deletion common/src/c/grid_lua_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -534,7 +534,7 @@ int l_grid_cat(lua_State* L) {
return 0;
}

/*static*/ int l_grid_usb_keyboard_send(lua_State* L) {
/*static*/ int l_grid_keyboard_send(lua_State* L) {

int nargs = lua_gettop(L);

Expand Down
2 changes: 1 addition & 1 deletion common/src/c/grid_lua_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ extern void grid_platform_delay_ms(uint32_t delay_milliseconds);
/*static*/ int l_grid_elementname_get(lua_State* L);
/*static*/ int l_grid_string_get(lua_State* L);

/*static*/ int l_grid_usb_keyboard_send(lua_State* L);
/*static*/ int l_grid_keyboard_send(lua_State* L);
/*static*/ int l_grid_mousemove_send(lua_State* L);
/*static*/ int l_grid_mousebutton_send(lua_State* L);

Expand Down
4 changes: 0 additions & 4 deletions common/src/c/grid_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,6 @@ extern void grid_platform_send_frame(void* swsr, uint32_t size, uint8_t dir);

extern uint8_t grid_platform_reset_grid_transmitter(uint8_t direction);

extern int32_t grid_platform_usb_serial_ready();

extern int32_t grid_platform_usb_serial_write(char* buffer, uint32_t length);

extern void* grid_platform_allocate_volatile(size_t size);

extern char* grid_platform_read_file_contents(const char* path);
Expand Down
12 changes: 8 additions & 4 deletions common/src/c/grid_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@
#include "grid_decode.h"
#include "grid_platform.h"
#include "grid_protocol.h"
#include "grid_usb_acm.h"

extern bool grid_usb_connected(void);

extern struct grid_decoder_collection* grid_decoder_to_ui_reference;
extern struct grid_decoder_collection* grid_decoder_to_usb_reference;
Expand Down Expand Up @@ -242,6 +245,10 @@ void grid_port_send_usb(struct grid_port* port) {

assert(port->type == GRID_PORT_USB);

if (grid_usb_connected() && !grid_usb_acm_tx_ready(&grid_usb_acm_state)) {
return;
}

struct grid_swsr_t* tx = grid_port_get_tx(port);

// Allocated statically due to the implementation of usb serial writes
Expand All @@ -253,10 +260,7 @@ void grid_port_send_usb(struct grid_port* port) {
}

grid_port_decode_msg(grid_decoder_to_usb_reference, &msg);

if (grid_platform_usb_serial_ready()) {
grid_platform_usb_serial_write(msg.data, msg.length);
}
grid_usb_acm_write(&grid_usb_acm_state, msg.data, msg.length);
}

void grid_port_send_ui(struct grid_port* port) {
Expand Down
2 changes: 1 addition & 1 deletion common/src/c/grid_protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@

#define GRID_LUA_FNC_G_KEYBOARD_SEND_short "gks"
#define GRID_LUA_FNC_G_KEYBOARD_SEND_human "keyboard_send"
#define GRID_LUA_FNC_G_KEYBOARD_SEND_fnptr l_grid_usb_keyboard_send
#define GRID_LUA_FNC_G_KEYBOARD_SEND_fnptr l_grid_keyboard_send

#define GRID_LUA_FNC_G_MOUSEMOVE_SEND_short "gmms"
#define GRID_LUA_FNC_G_MOUSEMOVE_SEND_human "mouse_move_send"
Expand Down
6 changes: 6 additions & 0 deletions common/src/c/grid_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include <stdlib.h>
#include <string.h>

#include "grid_usb_acm.h"

struct grid_transport grid_transport_state;

void grid_transport_malloc(struct grid_transport* transport, size_t port_count) {
Expand Down Expand Up @@ -250,6 +252,10 @@ void grid_transport_rx_broadcast_tx(struct grid_transport* transport, struct gri
grid_alert_all_set(&grid_led_state, GRID_LED_COLOR_BLUE, 128);
}

if (type == GRID_PORT_USB) {
grid_usb_acm_state.tx_dropped++;
}

continue;
}

Expand Down
2 changes: 1 addition & 1 deletion common/src/c/grid_ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -915,7 +915,7 @@ static void grid_ui_page_read(struct grid_ui_model* ui, uint8_t page) {

grid_lua_semaphore_release(&grid_lua_state);

grid_usb_keyboard_enable(&grid_usb_keyboard_state);
grid_usb_keyboard_enable(&grid_keyboard_state);
}

#pragma GCC diagnostic push
Expand Down
Loading
Loading