X-TOUCH to djay bridge

Dependencies:   mbed mbed-rtos FATFileSystem

Committer:
okini3939
Date:
Wed Jun 05 04:54:37 2019 +0000
Revision:
1:0dac72ab5910
sample

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 1:0dac72ab5910 1 /* mbed USBHost Library
okini3939 1:0dac72ab5910 2 * Copyright (c) 2006-2013 ARM Limited
okini3939 1:0dac72ab5910 3 *
okini3939 1:0dac72ab5910 4 * Licensed under the Apache License, Version 2.0 (the "License");
okini3939 1:0dac72ab5910 5 * you may not use this file except in compliance with the License.
okini3939 1:0dac72ab5910 6 * You may obtain a copy of the License at
okini3939 1:0dac72ab5910 7 *
okini3939 1:0dac72ab5910 8 * http://www.apache.org/licenses/LICENSE-2.0
okini3939 1:0dac72ab5910 9 *
okini3939 1:0dac72ab5910 10 * Unless required by applicable law or agreed to in writing, software
okini3939 1:0dac72ab5910 11 * distributed under the License is distributed on an "AS IS" BASIS,
okini3939 1:0dac72ab5910 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
okini3939 1:0dac72ab5910 13 * See the License for the specific language governing permissions and
okini3939 1:0dac72ab5910 14 * limitations under the License.
okini3939 1:0dac72ab5910 15 */
okini3939 1:0dac72ab5910 16
okini3939 1:0dac72ab5910 17 #ifdef TARGET_STM
okini3939 1:0dac72ab5910 18 #include "mbed.h"
okini3939 1:0dac72ab5910 19 #include "USBHALHost.h"
okini3939 1:0dac72ab5910 20 #include "dbg.h"
okini3939 1:0dac72ab5910 21 #include "pinmap.h"
okini3939 1:0dac72ab5910 22
okini3939 1:0dac72ab5910 23 #include "USBHALHost_STM_TARGET.h"
okini3939 1:0dac72ab5910 24
okini3939 1:0dac72ab5910 25 void HAL_HCD_Connect_Callback(HCD_HandleTypeDef *hhcd)
okini3939 1:0dac72ab5910 26 {
okini3939 1:0dac72ab5910 27 USBHALHost_Private_t *priv=(USBHALHost_Private_t *)(hhcd->pData);
okini3939 1:0dac72ab5910 28 USBHALHost *obj= priv->inst;
okini3939 1:0dac72ab5910 29 void (USBHALHost::*func)(int hub, int port, bool lowSpeed, USBHostHub * hub_parent ) = priv->deviceConnected;
okini3939 1:0dac72ab5910 30 (obj->*func)(0,1,0,NULL);
okini3939 1:0dac72ab5910 31 }
okini3939 1:0dac72ab5910 32 void HAL_HCD_Disconnect_Callback(HCD_HandleTypeDef *hhcd)
okini3939 1:0dac72ab5910 33 {
okini3939 1:0dac72ab5910 34 USBHALHost_Private_t *priv=(USBHALHost_Private_t *)(hhcd->pData);
okini3939 1:0dac72ab5910 35 USBHALHost *obj= priv->inst;
okini3939 1:0dac72ab5910 36 void (USBHALHost::*func1)(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr)= priv->deviceDisconnected;
okini3939 1:0dac72ab5910 37 (obj->*func1)(0,1,(USBHostHub *)NULL,0);
okini3939 1:0dac72ab5910 38 }
okini3939 1:0dac72ab5910 39 int HAL_HCD_HC_GetDirection(HCD_HandleTypeDef *hhcd,uint8_t chnum)
okini3939 1:0dac72ab5910 40 {
okini3939 1:0dac72ab5910 41 /* useful for transmission */
okini3939 1:0dac72ab5910 42 return hhcd->hc[chnum].ep_is_in;
okini3939 1:0dac72ab5910 43 }
okini3939 1:0dac72ab5910 44
okini3939 1:0dac72ab5910 45 uint32_t HAL_HCD_HC_GetMaxPacket(HCD_HandleTypeDef *hhcd,uint8_t chnum)
okini3939 1:0dac72ab5910 46 {
okini3939 1:0dac72ab5910 47 /* useful for transmission */
okini3939 1:0dac72ab5910 48 return hhcd->hc[chnum].max_packet;
okini3939 1:0dac72ab5910 49 }
okini3939 1:0dac72ab5910 50
okini3939 1:0dac72ab5910 51 void HAL_HCD_EnableInt(HCD_HandleTypeDef *hhcd,uint8_t chnum)
okini3939 1:0dac72ab5910 52 {
okini3939 1:0dac72ab5910 53 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
okini3939 1:0dac72ab5910 54 USBx_HOST->HAINTMSK |= (1 << chnum);
okini3939 1:0dac72ab5910 55 }
okini3939 1:0dac72ab5910 56
okini3939 1:0dac72ab5910 57
okini3939 1:0dac72ab5910 58 void HAL_HCD_DisableInt(HCD_HandleTypeDef *hhcd,uint8_t chnum)
okini3939 1:0dac72ab5910 59 {
okini3939 1:0dac72ab5910 60 USB_OTG_GlobalTypeDef *USBx = hhcd->Instance;
okini3939 1:0dac72ab5910 61 USBx_HOST->HAINTMSK &= ~(1 << chnum);
okini3939 1:0dac72ab5910 62 }
okini3939 1:0dac72ab5910 63 uint32_t HAL_HCD_HC_GetType(HCD_HandleTypeDef *hhcd,uint8_t chnum)
okini3939 1:0dac72ab5910 64 {
okini3939 1:0dac72ab5910 65 /* useful for transmission */
okini3939 1:0dac72ab5910 66 return hhcd->hc[chnum].ep_type;
okini3939 1:0dac72ab5910 67 }
okini3939 1:0dac72ab5910 68
okini3939 1:0dac72ab5910 69 void HAL_HCD_HC_NotifyURBChange_Callback(HCD_HandleTypeDef *hhcd,uint8_t chnum, HCD_URBStateTypeDef urb_state)
okini3939 1:0dac72ab5910 70 {
okini3939 1:0dac72ab5910 71 USBHALHost_Private_t *priv=(USBHALHost_Private_t *)(hhcd->pData);
okini3939 1:0dac72ab5910 72 USBHALHost *obj= priv->inst;
okini3939 1:0dac72ab5910 73 void (USBHALHost::*func)(volatile uint32_t addr)= priv->transferCompleted;
okini3939 1:0dac72ab5910 74
okini3939 1:0dac72ab5910 75 uint32_t addr = priv->addr[chnum];
okini3939 1:0dac72ab5910 76 uint32_t max_size = HAL_HCD_HC_GetMaxPacket(hhcd, chnum);
okini3939 1:0dac72ab5910 77 uint32_t type = HAL_HCD_HC_GetType(hhcd, chnum);
okini3939 1:0dac72ab5910 78 uint32_t dir = HAL_HCD_HC_GetDirection(hhcd,chnum);
okini3939 1:0dac72ab5910 79 uint32_t length;
okini3939 1:0dac72ab5910 80 if ( (addr!=0)) {
okini3939 1:0dac72ab5910 81 HCTD *td = (HCTD *)addr;
okini3939 1:0dac72ab5910 82
okini3939 1:0dac72ab5910 83 if ((type == EP_TYPE_BULK) || (type == EP_TYPE_CTRL )) {
okini3939 1:0dac72ab5910 84 switch (urb_state) {
okini3939 1:0dac72ab5910 85 case URB_DONE:
okini3939 1:0dac72ab5910 86 #if defined(MAX_NYET_RETRY)
okini3939 1:0dac72ab5910 87 td->retry = 0;
okini3939 1:0dac72ab5910 88 #endif
okini3939 1:0dac72ab5910 89 if (td->size > max_size) {
okini3939 1:0dac72ab5910 90 /* enqueue another request */
okini3939 1:0dac72ab5910 91 td->currBufPtr += max_size;
okini3939 1:0dac72ab5910 92 td->size -= max_size;
okini3939 1:0dac72ab5910 93 length = td->size <= max_size ? td->size : max_size;
okini3939 1:0dac72ab5910 94 MBED_ASSERT(HAL_HCD_HC_SubmitRequest(hhcd, chnum, dir ,type , !td->setup,(uint8_t*) td->currBufPtr, length, 0)==HAL_OK);
okini3939 1:0dac72ab5910 95 HAL_HCD_EnableInt(hhcd, chnum);
okini3939 1:0dac72ab5910 96 return;
okini3939 1:0dac72ab5910 97 }
okini3939 1:0dac72ab5910 98 break;
okini3939 1:0dac72ab5910 99 case URB_NOTREADY:
okini3939 1:0dac72ab5910 100 /* try again */
okini3939 1:0dac72ab5910 101 /* abritary limit , to avoid dead lock if other error than
okini3939 1:0dac72ab5910 102 * slow response is */
okini3939 1:0dac72ab5910 103 #if defined(MAX_NYET_RETRY)
okini3939 1:0dac72ab5910 104 if (td->retry < MAX_NYET_RETRY) {
okini3939 1:0dac72ab5910 105 /* increment retry counter */
okini3939 1:0dac72ab5910 106 td->retry++;
okini3939 1:0dac72ab5910 107 #endif
okini3939 1:0dac72ab5910 108 length = td->size <= max_size ? td->size : max_size;
okini3939 1:0dac72ab5910 109 MBED_ASSERT(HAL_HCD_HC_SubmitRequest(hhcd, chnum, dir ,type , !td->setup,(uint8_t*) td->currBufPtr, length, 0)==HAL_OK);
okini3939 1:0dac72ab5910 110 HAL_HCD_EnableInt(hhcd, chnum);
okini3939 1:0dac72ab5910 111 return;
okini3939 1:0dac72ab5910 112 #if defined(MAX_NYET_RETRY)
okini3939 1:0dac72ab5910 113 } else {
okini3939 1:0dac72ab5910 114 USB_ERR("urb_state != URB_NOTREADY");
okini3939 1:0dac72ab5910 115 }
okini3939 1:0dac72ab5910 116 #endif
okini3939 1:0dac72ab5910 117 break;
okini3939 1:0dac72ab5910 118 }
okini3939 1:0dac72ab5910 119 }
okini3939 1:0dac72ab5910 120 if ((type == EP_TYPE_INTR) ) {
okini3939 1:0dac72ab5910 121 /* reply a packet of length NULL, this will be analyse in call back
okini3939 1:0dac72ab5910 122 * for mouse or hub */
okini3939 1:0dac72ab5910 123 td->state =USB_TYPE_IDLE ;
okini3939 1:0dac72ab5910 124 HAL_HCD_DisableInt(hhcd, chnum);
okini3939 1:0dac72ab5910 125
okini3939 1:0dac72ab5910 126 } else {
okini3939 1:0dac72ab5910 127 td->state = (urb_state == URB_DONE) ? USB_TYPE_IDLE : USB_TYPE_ERROR;
okini3939 1:0dac72ab5910 128 }
okini3939 1:0dac72ab5910 129 td->currBufPtr +=HAL_HCD_HC_GetXferCount(hhcd, chnum);
okini3939 1:0dac72ab5910 130 (obj->*func)(addr);
okini3939 1:0dac72ab5910 131 } else {
okini3939 1:0dac72ab5910 132 if (urb_state !=0) {
okini3939 1:0dac72ab5910 133 USB_DBG_EVENT("spurious %d %d",chnum, urb_state);
okini3939 1:0dac72ab5910 134 }
okini3939 1:0dac72ab5910 135 }
okini3939 1:0dac72ab5910 136 }
okini3939 1:0dac72ab5910 137
okini3939 1:0dac72ab5910 138 USBHALHost * USBHALHost::instHost;
okini3939 1:0dac72ab5910 139
okini3939 1:0dac72ab5910 140
okini3939 1:0dac72ab5910 141 void USBHALHost::init()
okini3939 1:0dac72ab5910 142 {
okini3939 1:0dac72ab5910 143
okini3939 1:0dac72ab5910 144 NVIC_DisableIRQ(USBHAL_IRQn);
okini3939 1:0dac72ab5910 145 NVIC_SetVector(USBHAL_IRQn, (uint32_t)(_usbisr));
okini3939 1:0dac72ab5910 146 HAL_HCD_Init((HCD_HandleTypeDef *) usb_hcca);
okini3939 1:0dac72ab5910 147 NVIC_EnableIRQ(USBHAL_IRQn);
okini3939 1:0dac72ab5910 148 control_disable = 0;
okini3939 1:0dac72ab5910 149 HAL_HCD_Start((HCD_HandleTypeDef *) usb_hcca);
okini3939 1:0dac72ab5910 150 usb_vbus(1);
okini3939 1:0dac72ab5910 151 }
okini3939 1:0dac72ab5910 152
okini3939 1:0dac72ab5910 153 uint32_t USBHALHost::controlHeadED()
okini3939 1:0dac72ab5910 154 {
okini3939 1:0dac72ab5910 155 return 0xffffffff;
okini3939 1:0dac72ab5910 156 }
okini3939 1:0dac72ab5910 157
okini3939 1:0dac72ab5910 158 uint32_t USBHALHost::bulkHeadED()
okini3939 1:0dac72ab5910 159 {
okini3939 1:0dac72ab5910 160 return 0xffffffff;
okini3939 1:0dac72ab5910 161 }
okini3939 1:0dac72ab5910 162
okini3939 1:0dac72ab5910 163 uint32_t USBHALHost::interruptHeadED()
okini3939 1:0dac72ab5910 164 {
okini3939 1:0dac72ab5910 165 return 0xffffffff;
okini3939 1:0dac72ab5910 166 }
okini3939 1:0dac72ab5910 167
okini3939 1:0dac72ab5910 168 void USBHALHost::updateBulkHeadED(uint32_t addr)
okini3939 1:0dac72ab5910 169 {
okini3939 1:0dac72ab5910 170 }
okini3939 1:0dac72ab5910 171
okini3939 1:0dac72ab5910 172
okini3939 1:0dac72ab5910 173 void USBHALHost::updateControlHeadED(uint32_t addr)
okini3939 1:0dac72ab5910 174 {
okini3939 1:0dac72ab5910 175 }
okini3939 1:0dac72ab5910 176
okini3939 1:0dac72ab5910 177 void USBHALHost::updateInterruptHeadED(uint32_t addr)
okini3939 1:0dac72ab5910 178 {
okini3939 1:0dac72ab5910 179 }
okini3939 1:0dac72ab5910 180
okini3939 1:0dac72ab5910 181
okini3939 1:0dac72ab5910 182 void USBHALHost::enableList(ENDPOINT_TYPE type)
okini3939 1:0dac72ab5910 183 {
okini3939 1:0dac72ab5910 184 /* react when the 3 lists are requested to be disabled */
okini3939 1:0dac72ab5910 185 if (type == CONTROL_ENDPOINT) {
okini3939 1:0dac72ab5910 186 control_disable--;
okini3939 1:0dac72ab5910 187 if (control_disable == 0) {
okini3939 1:0dac72ab5910 188 NVIC_EnableIRQ(USBHAL_IRQn);
okini3939 1:0dac72ab5910 189 } else {
okini3939 1:0dac72ab5910 190 printf("reent\n");
okini3939 1:0dac72ab5910 191 }
okini3939 1:0dac72ab5910 192 }
okini3939 1:0dac72ab5910 193 }
okini3939 1:0dac72ab5910 194
okini3939 1:0dac72ab5910 195
okini3939 1:0dac72ab5910 196 bool USBHALHost::disableList(ENDPOINT_TYPE type)
okini3939 1:0dac72ab5910 197 {
okini3939 1:0dac72ab5910 198 if (type == CONTROL_ENDPOINT) {
okini3939 1:0dac72ab5910 199 NVIC_DisableIRQ(USBHAL_IRQn);
okini3939 1:0dac72ab5910 200 control_disable++;
okini3939 1:0dac72ab5910 201 if (control_disable > 1) {
okini3939 1:0dac72ab5910 202 printf("disable reentrance !!!\n");
okini3939 1:0dac72ab5910 203 }
okini3939 1:0dac72ab5910 204 return true;
okini3939 1:0dac72ab5910 205 }
okini3939 1:0dac72ab5910 206 return false;
okini3939 1:0dac72ab5910 207 }
okini3939 1:0dac72ab5910 208
okini3939 1:0dac72ab5910 209
okini3939 1:0dac72ab5910 210 void USBHALHost::memInit()
okini3939 1:0dac72ab5910 211 {
okini3939 1:0dac72ab5910 212 usb_hcca = (volatile HCD_HandleTypeDef *)usb_buf;
okini3939 1:0dac72ab5910 213 usb_edBuf = usb_buf + HCCA_SIZE;
okini3939 1:0dac72ab5910 214 usb_tdBuf = usb_buf + HCCA_SIZE +(MAX_ENDPOINT*ED_SIZE);
okini3939 1:0dac72ab5910 215 /* init channel */
okini3939 1:0dac72ab5910 216 memset((void*)usb_buf,0, TOTAL_SIZE);
okini3939 1:0dac72ab5910 217 for (int i=0; i < MAX_ENDPOINT; i++) {
okini3939 1:0dac72ab5910 218 HCED *hced = (HCED*)(usb_edBuf + i*ED_SIZE);
okini3939 1:0dac72ab5910 219 hced->ch_num = i;
okini3939 1:0dac72ab5910 220 hced->hhcd = (HCCA *) usb_hcca;
okini3939 1:0dac72ab5910 221 }
okini3939 1:0dac72ab5910 222 }
okini3939 1:0dac72ab5910 223
okini3939 1:0dac72ab5910 224 volatile uint8_t * USBHALHost::getED()
okini3939 1:0dac72ab5910 225 {
okini3939 1:0dac72ab5910 226 for (int i = 0; i < MAX_ENDPOINT; i++) {
okini3939 1:0dac72ab5910 227 if ( !edBufAlloc[i] ) {
okini3939 1:0dac72ab5910 228 edBufAlloc[i] = true;
okini3939 1:0dac72ab5910 229 return (volatile uint8_t *)(usb_edBuf + i*ED_SIZE);
okini3939 1:0dac72ab5910 230 }
okini3939 1:0dac72ab5910 231 }
okini3939 1:0dac72ab5910 232 perror("Could not allocate ED\r\n");
okini3939 1:0dac72ab5910 233 return NULL; //Could not alloc ED
okini3939 1:0dac72ab5910 234 }
okini3939 1:0dac72ab5910 235
okini3939 1:0dac72ab5910 236 volatile uint8_t * USBHALHost::getTD()
okini3939 1:0dac72ab5910 237 {
okini3939 1:0dac72ab5910 238 int i;
okini3939 1:0dac72ab5910 239 for (i = 0; i < MAX_TD; i++) {
okini3939 1:0dac72ab5910 240 if ( !tdBufAlloc[i] ) {
okini3939 1:0dac72ab5910 241 tdBufAlloc[i] = true;
okini3939 1:0dac72ab5910 242 return (volatile uint8_t *)(usb_tdBuf + i*TD_SIZE);
okini3939 1:0dac72ab5910 243 }
okini3939 1:0dac72ab5910 244 }
okini3939 1:0dac72ab5910 245 perror("Could not allocate TD\r\n");
okini3939 1:0dac72ab5910 246 return NULL; //Could not alloc TD
okini3939 1:0dac72ab5910 247 }
okini3939 1:0dac72ab5910 248
okini3939 1:0dac72ab5910 249
okini3939 1:0dac72ab5910 250 void USBHALHost::freeED(volatile uint8_t * ed)
okini3939 1:0dac72ab5910 251 {
okini3939 1:0dac72ab5910 252 int i;
okini3939 1:0dac72ab5910 253 i = (ed - usb_edBuf) / ED_SIZE;
okini3939 1:0dac72ab5910 254 edBufAlloc[i] = false;
okini3939 1:0dac72ab5910 255 }
okini3939 1:0dac72ab5910 256
okini3939 1:0dac72ab5910 257 void USBHALHost::freeTD(volatile uint8_t * td)
okini3939 1:0dac72ab5910 258 {
okini3939 1:0dac72ab5910 259 int i;
okini3939 1:0dac72ab5910 260 i = (td - usb_tdBuf) / TD_SIZE;
okini3939 1:0dac72ab5910 261 tdBufAlloc[i] = false;
okini3939 1:0dac72ab5910 262 }
okini3939 1:0dac72ab5910 263
okini3939 1:0dac72ab5910 264
okini3939 1:0dac72ab5910 265 void USBHALHost::resetRootHub()
okini3939 1:0dac72ab5910 266 {
okini3939 1:0dac72ab5910 267 // Initiate port reset
okini3939 1:0dac72ab5910 268 wait(0.2);
okini3939 1:0dac72ab5910 269 HAL_HCD_ResetPort((HCD_HandleTypeDef *)usb_hcca);
okini3939 1:0dac72ab5910 270 }
okini3939 1:0dac72ab5910 271
okini3939 1:0dac72ab5910 272
okini3939 1:0dac72ab5910 273 void USBHALHost::_usbisr(void)
okini3939 1:0dac72ab5910 274 {
okini3939 1:0dac72ab5910 275 if (instHost) {
okini3939 1:0dac72ab5910 276 instHost->UsbIrqhandler();
okini3939 1:0dac72ab5910 277 }
okini3939 1:0dac72ab5910 278 }
okini3939 1:0dac72ab5910 279
okini3939 1:0dac72ab5910 280 void USBHALHost::UsbIrqhandler()
okini3939 1:0dac72ab5910 281 {
okini3939 1:0dac72ab5910 282 HAL_HCD_IRQHandler((HCD_HandleTypeDef *)usb_hcca);
okini3939 1:0dac72ab5910 283 }
okini3939 1:0dac72ab5910 284 #endif