aboutsummaryrefslogtreecommitdiff
path: root/stmhal/usbdev/class/src
diff options
context:
space:
mode:
authorPavol Rusnak2017-01-17 20:17:15 +0100
committerDamien George2017-01-19 12:35:09 +1100
commit0883a7e72f7122b307798205441c96120446bf75 (patch)
treec7c2f164ed8ee1f013cadccf21f4eb44968d9cd3 /stmhal/usbdev/class/src
parent6ace84b08962baff5baae09443e9d4f968d11e84 (diff)
stmhal: Implement SNAK/CNAK mechanism for USB HID receive.
This implements flow control in case user does not call recv method often enough (it tells host side to stop sending more data).
Diffstat (limited to 'stmhal/usbdev/class/src')
-rw-r--r--stmhal/usbdev/class/src/usbd_cdc_msc_hid.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/stmhal/usbdev/class/src/usbd_cdc_msc_hid.c b/stmhal/usbdev/class/src/usbd_cdc_msc_hid.c
index 3ebc7d828..cfae7224d 100644
--- a/stmhal/usbdev/class/src/usbd_cdc_msc_hid.c
+++ b/stmhal/usbdev/class/src/usbd_cdc_msc_hid.c
@@ -1093,6 +1093,24 @@ uint8_t USBD_HID_SendReport(USBD_HandleTypeDef *pdev, uint8_t *report, uint16_t
return USBD_OK;
}
+uint8_t USBD_HID_SetNAK(USBD_HandleTypeDef *pdev) {
+ // get USBx object from pdev (needed for USBx_OUTEP macro below)
+ PCD_HandleTypeDef *hpcd = pdev->pData;
+ USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
+ // set NAK on HID OUT endpoint
+ USBx_OUTEP(HID_OUT_EP_WITH_CDC)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK;
+ return USBD_OK;
+}
+
+uint8_t USBD_HID_ClearNAK(USBD_HandleTypeDef *pdev) {
+ // get USBx object from pdev (needed for USBx_OUTEP macro below)
+ PCD_HandleTypeDef *hpcd = pdev->pData;
+ USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
+ // clear NAK on HID OUT endpoint
+ USBx_OUTEP(HID_OUT_EP_WITH_CDC)->DOEPCTL |= USB_OTG_DOEPCTL_CNAK;
+ return USBD_OK;
+}
+
// CDC/MSC/HID interface class callback structure
USBD_ClassTypeDef USBD_CDC_MSC_HID = {
USBD_CDC_MSC_HID_Init,