mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-16 19:38:09 +00:00
trezorhal/usb: handle additional setup packets
This commit is contained in:
parent
ecd5fd858b
commit
13a91451f6
@ -33,7 +33,9 @@
|
|||||||
#define USB_D2H 0x80
|
#define USB_D2H 0x80
|
||||||
|
|
||||||
// Class-Specific Request Codes for PSTN subclasses
|
// Class-Specific Request Codes for PSTN subclasses
|
||||||
|
#define USB_CDC_SET_LINE_CODING 0x20
|
||||||
#define USB_CDC_GET_LINE_CODING 0x21
|
#define USB_CDC_GET_LINE_CODING 0x21
|
||||||
|
#define USB_CDC_SET_CONTROL_LINE_STATE 0x22
|
||||||
|
|
||||||
// Maximal length of packets on IN CMD EP
|
// Maximal length of packets on IN CMD EP
|
||||||
#define USB_CDC_MAX_CMD_PACKET_LEN 0x08
|
#define USB_CDC_MAX_CMD_PACKET_LEN 0x08
|
||||||
@ -347,19 +349,27 @@ static int usb_vcp_class_setup(USBD_HandleTypeDef *dev, usb_vcp_state_t *state,
|
|||||||
.bDataBits = 8,
|
.bDataBits = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (req->bmRequest & USB_REQ_TYPE_MASK) {
|
// TODO: make cmd buffer part of interface state
|
||||||
|
static uint8_t cmd_buffer[USB_CDC_MAX_CMD_PACKET_LEN];
|
||||||
|
|
||||||
|
if ((req->bmRequest & USB_REQ_TYPE_MASK) != USB_REQ_TYPE_CLASS) {
|
||||||
|
return USBD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
case USB_REQ_TYPE_CLASS:
|
|
||||||
switch (req->bmRequest & USB_REQ_DIR_MASK) {
|
switch (req->bmRequest & USB_REQ_DIR_MASK) {
|
||||||
|
|
||||||
case USB_D2H:
|
case USB_D2H:
|
||||||
switch (req->bRequest) {
|
switch (req->bRequest) {
|
||||||
|
|
||||||
case USB_CDC_GET_LINE_CODING:
|
case USB_CDC_GET_LINE_CODING:
|
||||||
USBD_CtlSendData(dev, (uint8_t *)(&line_coding), MIN(req->wLength, sizeof(line_coding)));
|
USBD_CtlSendData(dev, (uint8_t *)(&line_coding), MIN(req->wLength, sizeof(line_coding)));
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
USBD_CtlSendData(dev, cmd_buffer, MIN(req->wLength, sizeof(cmd_buffer)));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case USB_H2D:
|
||||||
|
if (req->wLength > 0) {
|
||||||
|
USBD_CtlPrepareRx(dev, cmd_buffer, MIN(req->wLength, sizeof(cmd_buffer)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -411,6 +421,7 @@ static uint8_t usb_vcp_class_sof(USBD_HandleTypeDef *dev, usb_vcp_state_t *state
|
|||||||
// We avoid sending full packets as they stall the hosts pipeline, see:
|
// We avoid sending full packets as they stall the hosts pipeline, see:
|
||||||
// <http://www.cypress.com/?id=4&rID=92719>
|
// <http://www.cypress.com/?id=4&rID=92719>
|
||||||
size_t len = state->max_packet_len - 1;
|
size_t len = state->max_packet_len - 1;
|
||||||
|
size_t mask = b->cap - 1;
|
||||||
size_t i;
|
size_t i;
|
||||||
for (i = 0; (i < len) && !ring_empty(b); i++) {
|
for (i = 0; (i < len) && !ring_empty(b); i++) {
|
||||||
buf[i] = b->buf[b->read & mask];
|
buf[i] = b->buf[b->read & mask];
|
||||||
|
Loading…
Reference in New Issue
Block a user