diff --git a/firmware/glasgow.h b/firmware/glasgow.h index 6700c86f2..8eea92481 100644 --- a/firmware/glasgow.h +++ b/firmware/glasgow.h @@ -175,6 +175,7 @@ void iobuf_read_alert_cache_ina233(__xdata uint8_t *mask, bool clear); // Pull API bool iobuf_set_pull(uint8_t selector, uint8_t enable, uint8_t level); bool iobuf_get_pull(uint8_t selector, __xdata uint8_t *enable, __xdata uint8_t *level); +bool iobuf_get_input(uint8_t selector, __xdata uint8_t *value); // FIFO API void fifo_init(); diff --git a/firmware/main.c b/firmware/main.c index 10d167e33..a9d8b7e6e 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -759,13 +759,23 @@ void handle_pending_usb_setup() { if(arg_get) { while(EP0CS & _BUSY); - if(glasgow_config.revision < GLASGOW_REV_C0 || - !iobuf_get_pull(arg_selector, - (__xdata uint8_t *)EP0BUF + 0, - (__xdata uint8_t *)EP0BUF + 1)) { + if(glasgow_config.revision < GLASGOW_REV_C0) { goto stall_ep0_return; + } + if (req->wIndex & 0x100) { + if (!iobuf_get_input(arg_selector, (__xdata uint8_t *)EP0BUF + 0)) { + goto stall_ep0_return; + } else { + SETUP_EP0_BUF(1); + } } else { - SETUP_EP0_BUF(2); + if (!iobuf_get_pull(arg_selector, + (__xdata uint8_t *)EP0BUF + 0, + (__xdata uint8_t *)EP0BUF + 1)) { + goto stall_ep0_return; + } else { + SETUP_EP0_BUF(2); + } } } else { SETUP_EP0_BUF(2); diff --git a/firmware/pull.c b/firmware/pull.c index 140201b9f..349d7234d 100644 --- a/firmware/pull.c +++ b/firmware/pull.c @@ -73,3 +73,7 @@ bool iobuf_get_pull(uint8_t selector, __xdata uint8_t *enable, __xdata uint8_t * *enable = ~*enable; return true; } + +bool iobuf_get_input(uint8_t selector, __xdata uint8_t *value) { + return pull_read(selector, TCA9534_CMD_INPUT_PORT, value); +}