diff --git a/sys/include/usb/usbus/cdc/ecm.h b/sys/include/usb/usbus/cdc/ecm.h index 254d402782..f117a32271 100644 --- a/sys/include/usb/usbus/cdc/ecm.h +++ b/sys/include/usb/usbus/cdc/ecm.h @@ -113,7 +113,7 @@ typedef struct usbus_cdcecm_device { unsigned active_iface; /**< Current active data interface */ /** - * @brief Buffer for received frames + * @brief Buffer for received frames from the host */ usbdev_ep_buf_t data_out[ETHERNET_FRAME_LEN]; diff --git a/sys/include/usb/usbus/hid.h b/sys/include/usb/usbus/hid.h index a7672796f4..f05191a988 100644 --- a/sys/include/usb/usbus/hid.h +++ b/sys/include/usb/usbus/hid.h @@ -77,6 +77,16 @@ struct usbus_hid_device { usbus_hid_cb_t cb; /**< Callback for data handlers */ event_t tx_ready; /**< Transmit ready event */ mutex_t in_lock; /**< mutex used for locking hid send */ + + /** + * @brief Host to device data buffer + */ + usbdev_ep_buf_t out_buf[CONFIG_USBUS_HID_INTERRUPT_EP_SIZE]; + + /** + * @brief Device to host data buffer + */ + usbdev_ep_buf_t in_buf[CONFIG_USBUS_HID_INTERRUPT_EP_SIZE]; }; /** diff --git a/sys/usb/usbus/cdc/ecm/cdc_ecm_netdev.c b/sys/usb/usbus/cdc/ecm/cdc_ecm_netdev.c index 08b40c3d48..587da8d4b6 100644 --- a/sys/usb/usbus/cdc/ecm/cdc_ecm_netdev.c +++ b/sys/usb/usbus/cdc/ecm/cdc_ecm_netdev.c @@ -142,6 +142,7 @@ static int _recv(netdev_t *netdev, void *buf, size_t max_len, void *info) return pktlen; } if (pktlen <= max_len) { + /* Copy the received data from the host to the netif buffer */ memcpy(buf, cdcecm->data_out, pktlen); } _signal_rx_flush(cdcecm); diff --git a/sys/usb/usbus/hid/hid.c b/sys/usb/usbus/hid/hid.c index d35e357014..33d95eaa6d 100644 --- a/sys/usb/usbus/hid/hid.c +++ b/sys/usb/usbus/hid/hid.c @@ -77,7 +77,7 @@ static void _handle_tx_ready(event_t *ev) { usbus_hid_device_t *hid = container_of(ev, usbus_hid_device_t, tx_ready); - usbdev_ep_ready(hid->ep_in->ep, hid->occupied); + usbdev_ep_xmit(hid->ep_in->ep, hid->in_buf, hid->occupied); } void usbus_hid_init(usbus_t *usbus, usbus_hid_device_t *hid, usbus_hid_cb_t cb, @@ -138,7 +138,8 @@ static void _init(usbus_t *usbus, usbus_handler_t *handler) usbus_enable_endpoint(hid->ep_out); /* signal that INTERRUPT OUT is ready to receive data */ - usbdev_ep_ready(hid->ep_out->ep, 0); + usbdev_ep_xmit(hid->ep_out->ep, hid->out_buf, + CONFIG_USBUS_HID_INTERRUPT_EP_SIZE); usbus_add_interface(usbus, &hid->iface); } @@ -222,8 +223,8 @@ static void _transfer_handler(usbus_t *usbus, usbus_handler_t *handler, size_t len; usbdev_ep_get(ep, USBOPT_EP_AVAILABLE, &len, sizeof(size_t)); if (len > 0) { - hid->cb(hid, ep->buf, len); + hid->cb(hid, hid->out_buf, len); } - usbdev_ep_ready(ep, 0); + usbdev_ep_xmit(ep, hid->out_buf, CONFIG_USBUS_HID_INTERRUPT_EP_SIZE); } } diff --git a/sys/usb/usbus/hid/hid_io.c b/sys/usb/usbus/hid/hid_io.c index a7b9137de5..d1267eddca 100644 --- a/sys/usb/usbus/hid/hid_io.c +++ b/sys/usb/usbus/hid/hid_io.c @@ -50,7 +50,7 @@ int usb_hid_io_read_timeout(void *buffer, size_t len, uint32_t timeout) void usb_hid_io_write(const void *buffer, size_t len) { assert(buffer); - uint8_t *buffer_ep = hid.ep_in->ep->buf; + uint8_t *buffer_ep = hid.in_buf; uint16_t max_size = hid.ep_in->maxpacketsize; size_t offset = 0;