From ef9aca055cc154d4981c12fcd220f4eca2de6bfd Mon Sep 17 00:00:00 2001 From: Hubert Denkmair Date: Thu, 14 Apr 2016 22:37:32 +0200 Subject: [PATCH] (hopefully) solve usb problems through double buffering --- .cproject | 14 ++++++++++++++ src/main.c | 2 -- src/usbd_conf.c | 21 ++++++++++++++------- src/usbd_gs_can.c | 2 +- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/.cproject b/.cproject index 569017b..f3154ac 100644 --- a/.cproject +++ b/.cproject @@ -150,6 +150,20 @@ + + diff --git a/src/main.c b/src/main.c index 203e716..27cc124 100644 --- a/src/main.c +++ b/src/main.c @@ -68,8 +68,6 @@ int main(void) struct gs_host_frame *frame = queue_pop_front(q_from_host); if (frame != 0) { // send can message from host - USBD_GS_CAN_PrepareReceive(&hUSB); - if (can_send(&hCAN, frame)) { send_to_host_or_enqueue(frame); } else { diff --git a/src/usbd_conf.c b/src/usbd_conf.c index dee30eb..48bf806 100644 --- a/src/usbd_conf.c +++ b/src/usbd_conf.c @@ -266,19 +266,26 @@ USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) hpcd_USB_FS.Instance = USB; hpcd_USB_FS.Init.dev_endpoints = 5; hpcd_USB_FS.Init.speed = PCD_SPEED_FULL; - hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_32; + hpcd_USB_FS.Init.ep0_mps = DEP0CTL_MPS_64; hpcd_USB_FS.Init.phy_itface = PCD_PHY_EMBEDDED; hpcd_USB_FS.Init.low_power_enable = DISABLE; hpcd_USB_FS.Init.lpm_enable = DISABLE; HAL_PCD_Init(&hpcd_USB_FS); - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 0x18); + /* + * PMA layout + * + * 0x00 - 0x18 (24 bytes) metadata? + * 0x18 - 0x58 (64 bytes) EP0 OUT + * 0x58 - 0x98 (64 bytes) EP0 IN + * 0x98 - 0xD8 (64 bytes) EP1 IN + * 0xD8 - 0x118 (64 bytes) EP1 OUT (buffer 1) + * 0x118 - 0x158 (64 bytes) EP1 OUT (buffer 2) + */ + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x00 , PCD_SNG_BUF, 24); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x80 , PCD_SNG_BUF, 0x58); - - //HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_DBL_BUF, 0x01000140); - //HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x02 , PCD_DBL_BUF, 0x018001C0); - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x0100); - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x02 , PCD_SNG_BUF, 0x0180); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x81 , PCD_SNG_BUF, 0x98); + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , 0x02 , PCD_DBL_BUF, 0x00D80118); return USBD_OK; } diff --git a/src/usbd_gs_can.c b/src/usbd_gs_can.c index c6c6fdc..a1a1270 100644 --- a/src/usbd_gs_can.c +++ b/src/usbd_gs_can.c @@ -332,7 +332,7 @@ static uint8_t USBD_GS_CAN_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum) { } retval = USBD_OK; } - //USBD_GS_CAN_PrepareReceive(pdev); + USBD_GS_CAN_PrepareReceive(pdev); return retval; }