Fork of the official USBDevice library

Fork of USBDevice by mbed official

Committer:
screamer
Date:
Fri Apr 28 17:01:10 2017 +0000
Branch:
device-files
Revision:
76:f0fd8d911b24
Parent:
USBDevice/TARGET_STM/USBHAL_STM_144_64pins.h@74:13306e96d108
Changed the layout of USBDevice implementation for various targets to match mbed-os/targets. This also reduces the amount of files being compiled as USBDevice code for other targets is not compiled.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 74:13306e96d108 1 /* Copyright (c) 2016 mbed.org, MIT License
screamer 74:13306e96d108 2 *
screamer 74:13306e96d108 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
screamer 74:13306e96d108 4 * and associated documentation files (the "Software"), to deal in the Software without
screamer 74:13306e96d108 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
screamer 74:13306e96d108 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
screamer 74:13306e96d108 7 * Software is furnished to do so, subject to the following conditions:
screamer 74:13306e96d108 8 *
screamer 74:13306e96d108 9 * The above copyright notice and this permission notice shall be included in all copies or
screamer 74:13306e96d108 10 * substantial portions of the Software.
screamer 74:13306e96d108 11 *
screamer 74:13306e96d108 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
screamer 74:13306e96d108 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
screamer 74:13306e96d108 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
screamer 74:13306e96d108 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
screamer 74:13306e96d108 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
screamer 74:13306e96d108 17 */
screamer 74:13306e96d108 18 #ifndef USBHAL_STM32_144_64
screamer 74:13306e96d108 19 #define USBHAL_STM32_144_64
screamer 74:13306e96d108 20
screamer 74:13306e96d108 21 #define USBHAL_IRQn OTG_FS_IRQn
screamer 74:13306e96d108 22 /* must be multiple of 4 bytes */
screamer 74:13306e96d108 23 #define NB_ENDPOINT 4
screamer 74:13306e96d108 24 #define MAXTRANSFER_SIZE 0x200
screamer 74:13306e96d108 25 #define FIFO_USB_RAM_SIZE (MAXTRANSFER_SIZE+MAX_PACKET_SIZE_EP0+MAX_PACKET_SIZE_EP1+MAX_PACKET_SIZE_EP2+MAX_PACKET_SIZE_EP3)
screamer 74:13306e96d108 26 #if (FIFO_USB_RAM_SIZE > 0x500)
screamer 74:13306e96d108 27 #error "FIFO dimensioning incorrect"
screamer 74:13306e96d108 28 #endif
screamer 74:13306e96d108 29
screamer 74:13306e96d108 30 typedef struct
screamer 74:13306e96d108 31 {
screamer 74:13306e96d108 32 USBHAL *inst;
screamer 74:13306e96d108 33 void (USBHAL::*bus_reset)(void);
screamer 74:13306e96d108 34 void (USBHAL::*sof)(int frame);
screamer 74:13306e96d108 35 void (USBHAL::*connect_change)(unsigned int connected);
screamer 74:13306e96d108 36 void (USBHAL::*suspend_change)(unsigned int suspended);
screamer 74:13306e96d108 37 void (USBHAL::*ep0_setup)(void);
screamer 74:13306e96d108 38 void (USBHAL::*ep0_in)(void);
screamer 74:13306e96d108 39 void (USBHAL::*ep0_out)(void);
screamer 74:13306e96d108 40 void (USBHAL::*ep0_read)(void);
screamer 74:13306e96d108 41 bool (USBHAL::*ep_realise)(uint8_t endpoint, uint32_t maxPacket, uint32_t flags);
screamer 74:13306e96d108 42 bool (USBHAL::*epCallback[2*NB_ENDPOINT-2])(void);
screamer 74:13306e96d108 43 /* memorize dummy buffer used for reception */
screamer 74:13306e96d108 44 uint32_t pBufRx[MAXTRANSFER_SIZE>>2];
screamer 74:13306e96d108 45 uint32_t pBufRx0[MAX_PACKET_SIZE_EP0>>2];
screamer 74:13306e96d108 46 uint8_t epComplete[2*NB_ENDPOINT];
screamer 74:13306e96d108 47 }USBHAL_Private_t;
screamer 74:13306e96d108 48
screamer 74:13306e96d108 49 uint32_t HAL_PCDEx_GetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo)
screamer 74:13306e96d108 50 {
screamer 74:13306e96d108 51 uint32_t len;
screamer 74:13306e96d108 52 if (fifo == 0) len = hpcd->Instance->DIEPTXF0_HNPTXFSIZ>>16;
screamer 74:13306e96d108 53 else
screamer 74:13306e96d108 54 len = hpcd->Instance->DIEPTXF[fifo - 1] >> 16;
screamer 74:13306e96d108 55 return len*4;
screamer 74:13306e96d108 56 }
screamer 74:13306e96d108 57 void HAL_PCD_SOFCallback(PCD_HandleTypeDef *hpcd)
screamer 74:13306e96d108 58 {
screamer 74:13306e96d108 59 USBHAL_Private_t *priv=((USBHAL_Private_t *)(hpcd->pData));
screamer 74:13306e96d108 60 USBHAL *obj= priv->inst;
screamer 74:13306e96d108 61 USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;
screamer 74:13306e96d108 62 uint32_t sofnum = (USBx_DEVICE->DSTS & USB_OTG_DSTS_FNSOF) >> 8;
screamer 74:13306e96d108 63 void (USBHAL::*func)(int frame) = priv->sof;
screamer 74:13306e96d108 64 (obj->*func)(sofnum);
screamer 74:13306e96d108 65 }
screamer 74:13306e96d108 66
screamer 74:13306e96d108 67
screamer 74:13306e96d108 68 USBHAL * USBHAL::instance;
screamer 74:13306e96d108 69
screamer 74:13306e96d108 70 USBHAL::USBHAL(void) {
screamer 74:13306e96d108 71 /* init parameter */
screamer 74:13306e96d108 72 USBHAL_Private_t *HALPriv = new(USBHAL_Private_t);
screamer 74:13306e96d108 73 hpcd.Instance = USB_OTG_FS;
screamer 74:13306e96d108 74 memset(&hpcd.Init, 0, sizeof(hpcd.Init));
screamer 74:13306e96d108 75 hpcd.Init.dev_endpoints = NB_ENDPOINT;
screamer 74:13306e96d108 76 hpcd.Init.ep0_mps = MAX_PACKET_SIZE_EP0;
screamer 74:13306e96d108 77 hpcd.Init.phy_itface = PCD_PHY_EMBEDDED;
screamer 74:13306e96d108 78 hpcd.Init.Sof_enable = 1;
screamer 74:13306e96d108 79
screamer 74:13306e96d108 80 hpcd.Init.speed = PCD_SPEED_FULL;
screamer 74:13306e96d108 81 //hpcd.Init.vbus_sensing_enable = 0;
screamer 74:13306e96d108 82 //hpcd.Init.lpm_enable = 0;
screamer 74:13306e96d108 83 /* pass instance for usage inside call back */
screamer 74:13306e96d108 84 HALPriv->inst = this;
screamer 74:13306e96d108 85 HALPriv->bus_reset = &USBHAL::busReset;
screamer 74:13306e96d108 86 HALPriv->suspend_change = &USBHAL::suspendStateChanged;
screamer 74:13306e96d108 87 HALPriv->connect_change = &USBHAL::connectStateChanged;
screamer 74:13306e96d108 88 HALPriv->sof = &USBHAL::SOF;
screamer 74:13306e96d108 89 HALPriv->ep0_setup = &USBHAL::EP0setupCallback;
screamer 74:13306e96d108 90 HALPriv->ep_realise = &USBHAL::realiseEndpoint;
screamer 74:13306e96d108 91 HALPriv->ep0_in = &USBHAL::EP0in;
screamer 74:13306e96d108 92 HALPriv->ep0_out = &USBHAL::EP0out;
screamer 74:13306e96d108 93 HALPriv->ep0_read = &USBHAL::EP0read;
screamer 74:13306e96d108 94 hpcd.pData = (void*)HALPriv;
screamer 74:13306e96d108 95 HALPriv->epCallback[0] = &USBHAL::EP1_OUT_callback;
screamer 74:13306e96d108 96 HALPriv->epCallback[1] = &USBHAL::EP1_IN_callback;
screamer 74:13306e96d108 97 HALPriv->epCallback[2] = &USBHAL::EP2_OUT_callback;
screamer 74:13306e96d108 98 HALPriv->epCallback[3] = &USBHAL::EP2_IN_callback;
screamer 74:13306e96d108 99 HALPriv->epCallback[4] = &USBHAL::EP3_OUT_callback;
screamer 74:13306e96d108 100 HALPriv->epCallback[5] = &USBHAL::EP3_IN_callback;
screamer 74:13306e96d108 101 instance = this;
screamer 74:13306e96d108 102 // Enable power and clocking
screamer 74:13306e96d108 103 /* board 144 pin all similar */
screamer 74:13306e96d108 104 __HAL_RCC_GPIOA_CLK_ENABLE();
screamer 74:13306e96d108 105 pin_function(PA_8, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
screamer 74:13306e96d108 106 pin_function(PA_9, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF10_OTG_FS));
screamer 74:13306e96d108 107 pin_function(PA_10, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS));
screamer 74:13306e96d108 108 pin_function(PA_11, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
screamer 74:13306e96d108 109 pin_function(PA_12, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF10_OTG_FS));
screamer 74:13306e96d108 110
screamer 74:13306e96d108 111 __HAL_RCC_USB_OTG_FS_CLK_ENABLE();
screamer 74:13306e96d108 112 __HAL_RCC_SYSCFG_CLK_ENABLE();
screamer 74:13306e96d108 113 hpcd.State = HAL_PCD_STATE_RESET;
screamer 74:13306e96d108 114 HAL_PCD_Init(&hpcd);
screamer 74:13306e96d108 115 /* 1.25kbytes */
screamer 74:13306e96d108 116 /* min value 16 (= 16 x 4 bytes) */
screamer 74:13306e96d108 117 /* max value 256 (= 1K bytes ) */
screamer 74:13306e96d108 118 /* maximum sum is 0x140 */
screamer 74:13306e96d108 119 HAL_PCDEx_SetRxFiFo(&hpcd, (MAXTRANSFER_SIZE/4));
screamer 74:13306e96d108 120 /* bulk/int 64 bytes in FS */
screamer 74:13306e96d108 121 HAL_PCDEx_SetTxFiFo(&hpcd, 0, (MAX_PACKET_SIZE_EP0/4)+1);
screamer 74:13306e96d108 122 /* bulk/int bytes in FS */
screamer 74:13306e96d108 123 HAL_PCDEx_SetTxFiFo(&hpcd, 1, (MAX_PACKET_SIZE_EP1/4)+1);
screamer 74:13306e96d108 124 HAL_PCDEx_SetTxFiFo(&hpcd, 2, (MAX_PACKET_SIZE_EP2/4));
screamer 74:13306e96d108 125 /* ISOchronous */
screamer 74:13306e96d108 126 HAL_PCDEx_SetTxFiFo(&hpcd, 3, (MAX_PACKET_SIZE_EP3/4));
screamer 74:13306e96d108 127 NVIC_SetVector(USBHAL_IRQn, (uint32_t)&_usbisr);
screamer 74:13306e96d108 128 NVIC_SetPriority(USBHAL_IRQn, 1);
screamer 74:13306e96d108 129 HAL_PCD_Start(&hpcd);
screamer 74:13306e96d108 130 }
screamer 74:13306e96d108 131 #endif
screamer 74:13306e96d108 132