From c02a5ed4843b478c20e9fc091d625494c2b3a56f Mon Sep 17 00:00:00 2001 From: R Date: Sat, 13 Apr 2024 02:41:52 +0100 Subject: [PATCH] add additional device requests --- bootloader.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/bootloader.c b/bootloader.c index 7561e4c..275b837 100644 --- a/bootloader.c +++ b/bootloader.c @@ -90,6 +90,7 @@ const uint8_t USB_CONF_DESC[0x12] __attribute__((aligned(16))) = { #define STATE_GET_DEV_DESC 0x01 #define STATE_GET_CONF_DESC 0x02 #define STATE_CTRL_STATUS_OUT 0x03 +#define STATE_CTRL_SIMPLE_IN 0x04 int main(void) { // PLL setup: system clock 96 MHz @@ -137,7 +138,13 @@ int main(void) { if (ep0_status & (1 << 11)) { // setup, STAT_RX and STAT_TX both now NAK uint16_t bRequest_bmRequestType = USB_EP0_OUT(0); - if (bRequest_bmRequestType == 0x0500) { + if (bRequest_bmRequestType == 0x0080) { + // GET_STATUS + USB_EP0_IN(0) = 0; + USB_DESCS[0].count_tx = 2; + master_state = (STATE_CTRL_SIMPLE_IN << 24); + R16_USBD_EPR(0) = (0b01 << 9) | (0b11 << 12) | (0b01 << 4); // STALL for OUT, ACK for IN + } else if (bRequest_bmRequestType == 0x0500) { // SET_ADDRESS master_state = (STATE_SET_ADDR << 24) | USB_EP0_OUT(2); USB_DESCS[0].count_tx = 0; @@ -173,6 +180,12 @@ int main(void) { // bad descriptor R16_USBD_EPR(0) = (0b01 << 9) | (0b11 << 12) | (0b11 << 4); // STALL for both } + } else if (bRequest_bmRequestType == 0x0880) { + // GET_CONFIGURATION + USB_EP0_IN(0) = active_config; + USB_DESCS[0].count_tx = 1; + master_state = (STATE_CTRL_SIMPLE_IN << 24); + R16_USBD_EPR(0) = (0b01 << 9) | (0b11 << 12) | (0b01 << 4); // STALL for OUT, ACK for IN } else if (bRequest_bmRequestType == 0x0900) { // SET_CONFIGURATION uint32_t wValue = USB_EP0_OUT(2); @@ -186,7 +199,6 @@ int main(void) { } else { // unknown R16_USBD_EPR(0) = (0b01 << 9) | (0b11 << 12) | (0b11 << 4); // STALL for both - while (1) {} } } else { switch (master_state >> 24) { @@ -254,6 +266,11 @@ int main(void) { } } break; + case STATE_CTRL_SIMPLE_IN: + // ready for OUT status ACK, no more IN + master_state = (STATE_CTRL_STATUS_OUT << 24); + R16_USBD_EPR(0) = (0b01 << 9) | (0b10 << 12) | (1 << 8) | (0b11 << 4); + break; } } }