virtualmech / Mbed 2 deprecated VmRecorderV1dot1

Dependencies:   mbed

Committer:
JuanManuelAmador
Date:
Mon Jun 15 15:34:27 2015 +0000
Revision:
0:3d456b8ce449
prueba

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JuanManuelAmador 0:3d456b8ce449 1 /*
JuanManuelAmador 0:3d456b8ce449 2 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 3 * NXP USB Host Stack
JuanManuelAmador 0:3d456b8ce449 4 *
JuanManuelAmador 0:3d456b8ce449 5 * (c) Copyright 2008, NXP SemiConductors
JuanManuelAmador 0:3d456b8ce449 6 * (c) Copyright 2008, OnChip Technologies LLC
JuanManuelAmador 0:3d456b8ce449 7 * All Rights Reserved
JuanManuelAmador 0:3d456b8ce449 8 *
JuanManuelAmador 0:3d456b8ce449 9 * www.nxp.com
JuanManuelAmador 0:3d456b8ce449 10 * www.onchiptech.com
JuanManuelAmador 0:3d456b8ce449 11 *
JuanManuelAmador 0:3d456b8ce449 12 * File : usbhost_lpc17xx.c
JuanManuelAmador 0:3d456b8ce449 13 * Programmer(s) : Ravikanth.P
JuanManuelAmador 0:3d456b8ce449 14 * Version :
JuanManuelAmador 0:3d456b8ce449 15 *
JuanManuelAmador 0:3d456b8ce449 16 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 17 */
JuanManuelAmador 0:3d456b8ce449 18
JuanManuelAmador 0:3d456b8ce449 19 /*
JuanManuelAmador 0:3d456b8ce449 20 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 21 * INCLUDE HEADER FILES
JuanManuelAmador 0:3d456b8ce449 22 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 23 */
JuanManuelAmador 0:3d456b8ce449 24 #include "mbed.h"
JuanManuelAmador 0:3d456b8ce449 25 #include "usbhost_lpc17xx.h"
JuanManuelAmador 0:3d456b8ce449 26
JuanManuelAmador 0:3d456b8ce449 27 extern DigitalOut myled;
JuanManuelAmador 0:3d456b8ce449 28 extern Timer t;
JuanManuelAmador 0:3d456b8ce449 29
JuanManuelAmador 0:3d456b8ce449 30 /*
JuanManuelAmador 0:3d456b8ce449 31 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 32 * GLOBAL VARIABLES
JuanManuelAmador 0:3d456b8ce449 33 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 34 */
JuanManuelAmador 0:3d456b8ce449 35 int gUSBConnected;
JuanManuelAmador 0:3d456b8ce449 36
JuanManuelAmador 0:3d456b8ce449 37 volatile USB_INT32U HOST_RhscIntr = 0; /* Root Hub Status Change interrupt */
JuanManuelAmador 0:3d456b8ce449 38 volatile USB_INT32U HOST_WdhIntr = 0; /* Semaphore to wait until the TD is submitted */
JuanManuelAmador 0:3d456b8ce449 39 volatile USB_INT08U HOST_TDControlStatus = 0;
JuanManuelAmador 0:3d456b8ce449 40 volatile HCED *EDCtrl; /* Control endpoint descriptor structure */
JuanManuelAmador 0:3d456b8ce449 41 volatile HCED *EDBulkIn; /* BulkIn endpoint descriptor structure */
JuanManuelAmador 0:3d456b8ce449 42 volatile HCED *EDBulkOut; /* BulkOut endpoint descriptor structure */
JuanManuelAmador 0:3d456b8ce449 43 volatile HCTD *TDHead; /* Head transfer descriptor structure */
JuanManuelAmador 0:3d456b8ce449 44 volatile HCTD *TDTail; /* Tail transfer descriptor structure */
JuanManuelAmador 0:3d456b8ce449 45 volatile HCCA *Hcca; /* Host Controller Communications Area structure */
JuanManuelAmador 0:3d456b8ce449 46 USB_INT16U *TDBufNonVol; /* Identical to TDBuffer just to reduce compiler warnings */
JuanManuelAmador 0:3d456b8ce449 47 volatile USB_INT08U *TDBuffer; /* Current Buffer Pointer of transfer descriptor */
JuanManuelAmador 0:3d456b8ce449 48
JuanManuelAmador 0:3d456b8ce449 49 // USB host structures
JuanManuelAmador 0:3d456b8ce449 50 // AHB SRAM block 1
JuanManuelAmador 0:3d456b8ce449 51 #define HOSTBASEADDR 0x2007C000
JuanManuelAmador 0:3d456b8ce449 52 // reserve memory for the linker
JuanManuelAmador 0:3d456b8ce449 53 static USB_INT08U HostBuf[0x200] __attribute__((at(HOSTBASEADDR)));
JuanManuelAmador 0:3d456b8ce449 54 /*
JuanManuelAmador 0:3d456b8ce449 55 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 56 * DELAY IN MILLI SECONDS
JuanManuelAmador 0:3d456b8ce449 57 *
JuanManuelAmador 0:3d456b8ce449 58 * Description: This function provides a delay in milli seconds
JuanManuelAmador 0:3d456b8ce449 59 *
JuanManuelAmador 0:3d456b8ce449 60 * Arguments : delay The delay required
JuanManuelAmador 0:3d456b8ce449 61 *
JuanManuelAmador 0:3d456b8ce449 62 * Returns : None
JuanManuelAmador 0:3d456b8ce449 63 *
JuanManuelAmador 0:3d456b8ce449 64 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 65 */
JuanManuelAmador 0:3d456b8ce449 66
JuanManuelAmador 0:3d456b8ce449 67 void Host_DelayMS (USB_INT32U delay)
JuanManuelAmador 0:3d456b8ce449 68 {
JuanManuelAmador 0:3d456b8ce449 69 volatile USB_INT32U i;
JuanManuelAmador 0:3d456b8ce449 70
JuanManuelAmador 0:3d456b8ce449 71
JuanManuelAmador 0:3d456b8ce449 72 for (i = 0; i < delay; i++) {
JuanManuelAmador 0:3d456b8ce449 73 Host_DelayUS(1000);
JuanManuelAmador 0:3d456b8ce449 74 }
JuanManuelAmador 0:3d456b8ce449 75 }
JuanManuelAmador 0:3d456b8ce449 76
JuanManuelAmador 0:3d456b8ce449 77 /*
JuanManuelAmador 0:3d456b8ce449 78 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 79 * DELAY IN MICRO SECONDS
JuanManuelAmador 0:3d456b8ce449 80 *
JuanManuelAmador 0:3d456b8ce449 81 * Description: This function provides a delay in micro seconds
JuanManuelAmador 0:3d456b8ce449 82 *
JuanManuelAmador 0:3d456b8ce449 83 * Arguments : delay The delay required
JuanManuelAmador 0:3d456b8ce449 84 *
JuanManuelAmador 0:3d456b8ce449 85 * Returns : None
JuanManuelAmador 0:3d456b8ce449 86 *
JuanManuelAmador 0:3d456b8ce449 87 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 88 */
JuanManuelAmador 0:3d456b8ce449 89
JuanManuelAmador 0:3d456b8ce449 90 void Host_DelayUS (USB_INT32U delay)
JuanManuelAmador 0:3d456b8ce449 91 {
JuanManuelAmador 0:3d456b8ce449 92 volatile USB_INT32U i;
JuanManuelAmador 0:3d456b8ce449 93
JuanManuelAmador 0:3d456b8ce449 94
JuanManuelAmador 0:3d456b8ce449 95 for (i = 0; i < (4 * delay); i++) { /* This logic was tested. It gives app. 1 micro sec delay */
JuanManuelAmador 0:3d456b8ce449 96 ;
JuanManuelAmador 0:3d456b8ce449 97 }
JuanManuelAmador 0:3d456b8ce449 98 }
JuanManuelAmador 0:3d456b8ce449 99
JuanManuelAmador 0:3d456b8ce449 100 // bits of the USB/OTG clock control register
JuanManuelAmador 0:3d456b8ce449 101 #define HOST_CLK_EN (1<<0)
JuanManuelAmador 0:3d456b8ce449 102 #define DEV_CLK_EN (1<<1)
JuanManuelAmador 0:3d456b8ce449 103 #define PORTSEL_CLK_EN (1<<3)
JuanManuelAmador 0:3d456b8ce449 104 #define AHB_CLK_EN (1<<4)
JuanManuelAmador 0:3d456b8ce449 105
JuanManuelAmador 0:3d456b8ce449 106 // bits of the USB/OTG clock status register
JuanManuelAmador 0:3d456b8ce449 107 #define HOST_CLK_ON (1<<0)
JuanManuelAmador 0:3d456b8ce449 108 #define DEV_CLK_ON (1<<1)
JuanManuelAmador 0:3d456b8ce449 109 #define PORTSEL_CLK_ON (1<<3)
JuanManuelAmador 0:3d456b8ce449 110 #define AHB_CLK_ON (1<<4)
JuanManuelAmador 0:3d456b8ce449 111
JuanManuelAmador 0:3d456b8ce449 112 // we need host clock, OTG/portsel clock and AHB clock
JuanManuelAmador 0:3d456b8ce449 113 #define CLOCK_MASK (HOST_CLK_EN | PORTSEL_CLK_EN | AHB_CLK_EN)
JuanManuelAmador 0:3d456b8ce449 114
JuanManuelAmador 0:3d456b8ce449 115 /*
JuanManuelAmador 0:3d456b8ce449 116 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 117 * INITIALIZE THE HOST CONTROLLER
JuanManuelAmador 0:3d456b8ce449 118 *
JuanManuelAmador 0:3d456b8ce449 119 * Description: This function initializes lpc17xx host controller
JuanManuelAmador 0:3d456b8ce449 120 *
JuanManuelAmador 0:3d456b8ce449 121 * Arguments : None
JuanManuelAmador 0:3d456b8ce449 122 *
JuanManuelAmador 0:3d456b8ce449 123 * Returns :
JuanManuelAmador 0:3d456b8ce449 124 *
JuanManuelAmador 0:3d456b8ce449 125 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 126 */
JuanManuelAmador 0:3d456b8ce449 127 void Host_Init (void)
JuanManuelAmador 0:3d456b8ce449 128 {
JuanManuelAmador 0:3d456b8ce449 129 PRINT_Log("In Host_Init\n");
JuanManuelAmador 0:3d456b8ce449 130 NVIC_DisableIRQ(USB_IRQn); /* Disable the USB interrupt source */
JuanManuelAmador 0:3d456b8ce449 131
JuanManuelAmador 0:3d456b8ce449 132 // turn on power for USB
JuanManuelAmador 0:3d456b8ce449 133 LPC_SC->PCONP |= (1UL<<31);
JuanManuelAmador 0:3d456b8ce449 134 // Enable USB host clock, port selection and AHB clock
JuanManuelAmador 0:3d456b8ce449 135 LPC_USB->USBClkCtrl |= CLOCK_MASK;
JuanManuelAmador 0:3d456b8ce449 136 // Wait for clocks to become available
JuanManuelAmador 0:3d456b8ce449 137 while ((LPC_USB->USBClkSt & CLOCK_MASK) != CLOCK_MASK)
JuanManuelAmador 0:3d456b8ce449 138 ;
JuanManuelAmador 0:3d456b8ce449 139
JuanManuelAmador 0:3d456b8ce449 140 // it seems the bits[0:1] mean the following
JuanManuelAmador 0:3d456b8ce449 141 // 0: U1=device, U2=host
JuanManuelAmador 0:3d456b8ce449 142 // 1: U1=host, U2=host
JuanManuelAmador 0:3d456b8ce449 143 // 2: reserved
JuanManuelAmador 0:3d456b8ce449 144 // 3: U1=host, U2=device
JuanManuelAmador 0:3d456b8ce449 145 // NB: this register is only available if OTG clock (aka "port select") is enabled!!
JuanManuelAmador 0:3d456b8ce449 146 // since we don't care about port 2, set just bit 0 to 1 (U1=host)
JuanManuelAmador 0:3d456b8ce449 147 LPC_USB->OTGStCtrl |= 1;
JuanManuelAmador 0:3d456b8ce449 148
JuanManuelAmador 0:3d456b8ce449 149 // now that we've configured the ports, we can turn off the portsel clock
JuanManuelAmador 0:3d456b8ce449 150 LPC_USB->USBClkCtrl &= ~PORTSEL_CLK_EN;
JuanManuelAmador 0:3d456b8ce449 151
JuanManuelAmador 0:3d456b8ce449 152 // power pins are not connected on mbed, so we can skip them
JuanManuelAmador 0:3d456b8ce449 153 /* P1[18] = USB_UP_LED, 01 */
JuanManuelAmador 0:3d456b8ce449 154 /* P1[19] = /USB_PPWR, 10 */
JuanManuelAmador 0:3d456b8ce449 155 /* P1[22] = USB_PWRD, 10 */
JuanManuelAmador 0:3d456b8ce449 156 /* P1[27] = /USB_OVRCR, 10 */
JuanManuelAmador 0:3d456b8ce449 157 /*LPC_PINCON->PINSEL3 &= ~((3<<4) | (3<<6) | (3<<12) | (3<<22));
JuanManuelAmador 0:3d456b8ce449 158 LPC_PINCON->PINSEL3 |= ((1<<4)|(2<<6) | (2<<12) | (2<<22)); // 0x00802080
JuanManuelAmador 0:3d456b8ce449 159 */
JuanManuelAmador 0:3d456b8ce449 160
JuanManuelAmador 0:3d456b8ce449 161 // configure USB D+/D- pins
JuanManuelAmador 0:3d456b8ce449 162 /* P0[29] = USB_D+, 01 */
JuanManuelAmador 0:3d456b8ce449 163 /* P0[30] = USB_D-, 01 */
JuanManuelAmador 0:3d456b8ce449 164 LPC_PINCON->PINSEL1 &= ~((3<<26) | (3<<28));
JuanManuelAmador 0:3d456b8ce449 165 LPC_PINCON->PINSEL1 |= ((1<<26)|(1<<28)); // 0x14000000
JuanManuelAmador 0:3d456b8ce449 166
JuanManuelAmador 0:3d456b8ce449 167 PRINT_Log("Initializing Host Stack\n");
JuanManuelAmador 0:3d456b8ce449 168
JuanManuelAmador 0:3d456b8ce449 169 Hcca = (volatile HCCA *)(HostBuf+0x000);
JuanManuelAmador 0:3d456b8ce449 170 TDHead = (volatile HCTD *)(HostBuf+0x100);
JuanManuelAmador 0:3d456b8ce449 171 TDTail = (volatile HCTD *)(HostBuf+0x110);
JuanManuelAmador 0:3d456b8ce449 172 EDCtrl = (volatile HCED *)(HostBuf+0x120);
JuanManuelAmador 0:3d456b8ce449 173 EDBulkIn = (volatile HCED *)(HostBuf+0x130);
JuanManuelAmador 0:3d456b8ce449 174 EDBulkOut = (volatile HCED *)(HostBuf+0x140);
JuanManuelAmador 0:3d456b8ce449 175 TDBuffer = (volatile USB_INT08U *)(HostBuf+0x150);
JuanManuelAmador 0:3d456b8ce449 176
JuanManuelAmador 0:3d456b8ce449 177 /* Initialize all the TDs, EDs and HCCA to 0 */
JuanManuelAmador 0:3d456b8ce449 178 Host_EDInit(EDCtrl);
JuanManuelAmador 0:3d456b8ce449 179 Host_EDInit(EDBulkIn);
JuanManuelAmador 0:3d456b8ce449 180 Host_EDInit(EDBulkOut);
JuanManuelAmador 0:3d456b8ce449 181 Host_TDInit(TDHead);
JuanManuelAmador 0:3d456b8ce449 182 Host_TDInit(TDTail);
JuanManuelAmador 0:3d456b8ce449 183 Host_HCCAInit(Hcca);
JuanManuelAmador 0:3d456b8ce449 184
JuanManuelAmador 0:3d456b8ce449 185 Host_DelayMS(50); /* Wait 50 ms before apply reset */
JuanManuelAmador 0:3d456b8ce449 186 LPC_USB->HcControl = 0; /* HARDWARE RESET */
JuanManuelAmador 0:3d456b8ce449 187 LPC_USB->HcControlHeadED = 0; /* Initialize Control list head to Zero */
JuanManuelAmador 0:3d456b8ce449 188 LPC_USB->HcBulkHeadED = 0; /* Initialize Bulk list head to Zero */
JuanManuelAmador 0:3d456b8ce449 189
JuanManuelAmador 0:3d456b8ce449 190 /* SOFTWARE RESET */
JuanManuelAmador 0:3d456b8ce449 191 LPC_USB->HcCommandStatus = OR_CMD_STATUS_HCR;
JuanManuelAmador 0:3d456b8ce449 192 LPC_USB->HcFmInterval = DEFAULT_FMINTERVAL; /* Write Fm Interval and Largest Data Packet Counter */
JuanManuelAmador 0:3d456b8ce449 193
JuanManuelAmador 0:3d456b8ce449 194 /* Put HC in operational state */
JuanManuelAmador 0:3d456b8ce449 195 LPC_USB->HcControl = (LPC_USB->HcControl & (~OR_CONTROL_HCFS)) | OR_CONTROL_HC_OPER;
JuanManuelAmador 0:3d456b8ce449 196 LPC_USB->HcRhStatus = OR_RH_STATUS_LPSC; /* Set Global Power */
JuanManuelAmador 0:3d456b8ce449 197
JuanManuelAmador 0:3d456b8ce449 198 LPC_USB->HcHCCA = (USB_INT32U)Hcca;
JuanManuelAmador 0:3d456b8ce449 199 LPC_USB->HcInterruptStatus |= LPC_USB->HcInterruptStatus; /* Clear Interrrupt Status */
JuanManuelAmador 0:3d456b8ce449 200
JuanManuelAmador 0:3d456b8ce449 201
JuanManuelAmador 0:3d456b8ce449 202 LPC_USB->HcInterruptEnable = OR_INTR_ENABLE_MIE |
JuanManuelAmador 0:3d456b8ce449 203 OR_INTR_ENABLE_WDH |
JuanManuelAmador 0:3d456b8ce449 204 OR_INTR_ENABLE_RHSC;
JuanManuelAmador 0:3d456b8ce449 205
JuanManuelAmador 0:3d456b8ce449 206 NVIC_SetPriority(USB_IRQn, 0); /* highest priority */
JuanManuelAmador 0:3d456b8ce449 207 /* Enable the USB Interrupt */
JuanManuelAmador 0:3d456b8ce449 208 NVIC_EnableIRQ(USB_IRQn);
JuanManuelAmador 0:3d456b8ce449 209 PRINT_Log("Host Initialized\n");
JuanManuelAmador 0:3d456b8ce449 210 }
JuanManuelAmador 0:3d456b8ce449 211
JuanManuelAmador 0:3d456b8ce449 212 /*
JuanManuelAmador 0:3d456b8ce449 213 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 214 * INTERRUPT SERVICE ROUTINE
JuanManuelAmador 0:3d456b8ce449 215 *
JuanManuelAmador 0:3d456b8ce449 216 * Description: This function services the interrupt caused by host controller
JuanManuelAmador 0:3d456b8ce449 217 *
JuanManuelAmador 0:3d456b8ce449 218 * Arguments : None
JuanManuelAmador 0:3d456b8ce449 219 *
JuanManuelAmador 0:3d456b8ce449 220 * Returns : None
JuanManuelAmador 0:3d456b8ce449 221 *
JuanManuelAmador 0:3d456b8ce449 222 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 223 */
JuanManuelAmador 0:3d456b8ce449 224
JuanManuelAmador 0:3d456b8ce449 225 void USB_IRQHandler (void) __irq
JuanManuelAmador 0:3d456b8ce449 226 {
JuanManuelAmador 0:3d456b8ce449 227 USB_INT32U int_status;
JuanManuelAmador 0:3d456b8ce449 228 USB_INT32U ie_status;
JuanManuelAmador 0:3d456b8ce449 229
JuanManuelAmador 0:3d456b8ce449 230 int_status = LPC_USB->HcInterruptStatus; /* Read Interrupt Status */
JuanManuelAmador 0:3d456b8ce449 231 ie_status = LPC_USB->HcInterruptEnable; /* Read Interrupt enable status */
JuanManuelAmador 0:3d456b8ce449 232
JuanManuelAmador 0:3d456b8ce449 233 if (!(int_status & ie_status)) {
JuanManuelAmador 0:3d456b8ce449 234 return;
JuanManuelAmador 0:3d456b8ce449 235 } else {
JuanManuelAmador 0:3d456b8ce449 236
JuanManuelAmador 0:3d456b8ce449 237 int_status = int_status & ie_status;
JuanManuelAmador 0:3d456b8ce449 238 if (int_status & OR_INTR_STATUS_RHSC) { /* Root hub status change interrupt */
JuanManuelAmador 0:3d456b8ce449 239 if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CSC) {
JuanManuelAmador 0:3d456b8ce449 240 if (LPC_USB->HcRhStatus & OR_RH_STATUS_DRWE) {
JuanManuelAmador 0:3d456b8ce449 241 /*
JuanManuelAmador 0:3d456b8ce449 242 * When DRWE is on, Connect Status Change
JuanManuelAmador 0:3d456b8ce449 243 * means a remote wakeup event.
JuanManuelAmador 0:3d456b8ce449 244 */
JuanManuelAmador 0:3d456b8ce449 245 HOST_RhscIntr = 1;// JUST SOMETHING FOR A BREAKPOINT
JuanManuelAmador 0:3d456b8ce449 246 }
JuanManuelAmador 0:3d456b8ce449 247 else {
JuanManuelAmador 0:3d456b8ce449 248 /*
JuanManuelAmador 0:3d456b8ce449 249 * When DRWE is off, Connect Status Change
JuanManuelAmador 0:3d456b8ce449 250 * is NOT a remote wakeup event
JuanManuelAmador 0:3d456b8ce449 251 */
JuanManuelAmador 0:3d456b8ce449 252 if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_CCS) {
JuanManuelAmador 0:3d456b8ce449 253 if (!gUSBConnected) {
JuanManuelAmador 0:3d456b8ce449 254 HOST_TDControlStatus = 0;
JuanManuelAmador 0:3d456b8ce449 255 HOST_WdhIntr = 0;
JuanManuelAmador 0:3d456b8ce449 256 HOST_RhscIntr = 1;
JuanManuelAmador 0:3d456b8ce449 257 gUSBConnected = 1;
JuanManuelAmador 0:3d456b8ce449 258 }
JuanManuelAmador 0:3d456b8ce449 259 else
JuanManuelAmador 0:3d456b8ce449 260 PRINT_Log("Spurious status change (connected)?\n");
JuanManuelAmador 0:3d456b8ce449 261 } else {
JuanManuelAmador 0:3d456b8ce449 262 if (gUSBConnected) {
JuanManuelAmador 0:3d456b8ce449 263 LPC_USB->HcInterruptEnable = 0; // why do we get multiple disc. rupts???
JuanManuelAmador 0:3d456b8ce449 264 HOST_RhscIntr = 0;
JuanManuelAmador 0:3d456b8ce449 265 gUSBConnected = 0;
JuanManuelAmador 0:3d456b8ce449 266 }
JuanManuelAmador 0:3d456b8ce449 267 else
JuanManuelAmador 0:3d456b8ce449 268 PRINT_Log("Spurious status change (disconnected)?\n");
JuanManuelAmador 0:3d456b8ce449 269 }
JuanManuelAmador 0:3d456b8ce449 270 }
JuanManuelAmador 0:3d456b8ce449 271 LPC_USB->HcRhPortStatus1 = OR_RH_PORT_CSC;
JuanManuelAmador 0:3d456b8ce449 272 }
JuanManuelAmador 0:3d456b8ce449 273 if (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRSC) {
JuanManuelAmador 0:3d456b8ce449 274 LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC;
JuanManuelAmador 0:3d456b8ce449 275 }
JuanManuelAmador 0:3d456b8ce449 276 }
JuanManuelAmador 0:3d456b8ce449 277 if (int_status & OR_INTR_STATUS_WDH) { /* Writeback Done Head interrupt */
JuanManuelAmador 0:3d456b8ce449 278 HOST_WdhIntr = 1;
JuanManuelAmador 0:3d456b8ce449 279 HOST_TDControlStatus = (TDHead->Control >> 28) & 0xf;
JuanManuelAmador 0:3d456b8ce449 280 }
JuanManuelAmador 0:3d456b8ce449 281 LPC_USB->HcInterruptStatus = int_status; /* Clear interrupt status register */
JuanManuelAmador 0:3d456b8ce449 282 }
JuanManuelAmador 0:3d456b8ce449 283 return;
JuanManuelAmador 0:3d456b8ce449 284 }
JuanManuelAmador 0:3d456b8ce449 285
JuanManuelAmador 0:3d456b8ce449 286 /*
JuanManuelAmador 0:3d456b8ce449 287 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 288 * PROCESS TRANSFER DESCRIPTOR
JuanManuelAmador 0:3d456b8ce449 289 *
JuanManuelAmador 0:3d456b8ce449 290 * Description: This function processes the transfer descriptor
JuanManuelAmador 0:3d456b8ce449 291 *
JuanManuelAmador 0:3d456b8ce449 292 * Arguments : ed Endpoint descriptor that contains this transfer descriptor
JuanManuelAmador 0:3d456b8ce449 293 * token SETUP, IN, OUT
JuanManuelAmador 0:3d456b8ce449 294 * buffer Current Buffer Pointer of the transfer descriptor
JuanManuelAmador 0:3d456b8ce449 295 * buffer_len Length of the buffer
JuanManuelAmador 0:3d456b8ce449 296 *
JuanManuelAmador 0:3d456b8ce449 297 * Returns : OK if TD submission is successful
JuanManuelAmador 0:3d456b8ce449 298 * ERROR if TD submission fails
JuanManuelAmador 0:3d456b8ce449 299 *
JuanManuelAmador 0:3d456b8ce449 300 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 301 */
JuanManuelAmador 0:3d456b8ce449 302
JuanManuelAmador 0:3d456b8ce449 303 USB_INT32S Host_ProcessTD (volatile HCED *ed,
JuanManuelAmador 0:3d456b8ce449 304 volatile USB_INT32U token,
JuanManuelAmador 0:3d456b8ce449 305 volatile USB_INT08U *buffer,
JuanManuelAmador 0:3d456b8ce449 306 USB_INT32U buffer_len)
JuanManuelAmador 0:3d456b8ce449 307 {
JuanManuelAmador 0:3d456b8ce449 308 volatile USB_INT32U td_toggle;
JuanManuelAmador 0:3d456b8ce449 309
JuanManuelAmador 0:3d456b8ce449 310
JuanManuelAmador 0:3d456b8ce449 311 if (ed == EDCtrl) {
JuanManuelAmador 0:3d456b8ce449 312 if (token == TD_SETUP) {
JuanManuelAmador 0:3d456b8ce449 313 td_toggle = TD_TOGGLE_0;
JuanManuelAmador 0:3d456b8ce449 314 } else {
JuanManuelAmador 0:3d456b8ce449 315 td_toggle = TD_TOGGLE_1;
JuanManuelAmador 0:3d456b8ce449 316 }
JuanManuelAmador 0:3d456b8ce449 317 } else {
JuanManuelAmador 0:3d456b8ce449 318 td_toggle = 0;
JuanManuelAmador 0:3d456b8ce449 319 }
JuanManuelAmador 0:3d456b8ce449 320 TDHead->Control = (TD_ROUNDING |
JuanManuelAmador 0:3d456b8ce449 321 token |
JuanManuelAmador 0:3d456b8ce449 322 TD_DELAY_INT(0) |
JuanManuelAmador 0:3d456b8ce449 323 td_toggle |
JuanManuelAmador 0:3d456b8ce449 324 TD_CC);
JuanManuelAmador 0:3d456b8ce449 325 TDTail->Control = 0;
JuanManuelAmador 0:3d456b8ce449 326 TDHead->CurrBufPtr = (USB_INT32U) buffer;
JuanManuelAmador 0:3d456b8ce449 327 TDTail->CurrBufPtr = 0;
JuanManuelAmador 0:3d456b8ce449 328 TDHead->Next = (USB_INT32U) TDTail;
JuanManuelAmador 0:3d456b8ce449 329 TDTail->Next = 0;
JuanManuelAmador 0:3d456b8ce449 330 TDHead->BufEnd = (USB_INT32U)(buffer + (buffer_len - 1));
JuanManuelAmador 0:3d456b8ce449 331 TDTail->BufEnd = 0;
JuanManuelAmador 0:3d456b8ce449 332
JuanManuelAmador 0:3d456b8ce449 333 ed->HeadTd = (USB_INT32U)TDHead | ((ed->HeadTd) & 0x00000002);
JuanManuelAmador 0:3d456b8ce449 334 ed->TailTd = (USB_INT32U)TDTail;
JuanManuelAmador 0:3d456b8ce449 335 ed->Next = 0;
JuanManuelAmador 0:3d456b8ce449 336
JuanManuelAmador 0:3d456b8ce449 337 if (ed == EDCtrl) {
JuanManuelAmador 0:3d456b8ce449 338 LPC_USB->HcControlHeadED = (USB_INT32U)ed;
JuanManuelAmador 0:3d456b8ce449 339 LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_CLF;
JuanManuelAmador 0:3d456b8ce449 340 LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_CLE;
JuanManuelAmador 0:3d456b8ce449 341 } else {
JuanManuelAmador 0:3d456b8ce449 342 LPC_USB->HcBulkHeadED = (USB_INT32U)ed;
JuanManuelAmador 0:3d456b8ce449 343 LPC_USB->HcCommandStatus = LPC_USB->HcCommandStatus | OR_CMD_STATUS_BLF;
JuanManuelAmador 0:3d456b8ce449 344 LPC_USB->HcControl = LPC_USB->HcControl | OR_CONTROL_BLE;
JuanManuelAmador 0:3d456b8ce449 345 }
JuanManuelAmador 0:3d456b8ce449 346
JuanManuelAmador 0:3d456b8ce449 347 Host_WDHWait();
JuanManuelAmador 0:3d456b8ce449 348
JuanManuelAmador 0:3d456b8ce449 349 // if (!(TDHead->Control & 0xF0000000)) {
JuanManuelAmador 0:3d456b8ce449 350 if (!HOST_TDControlStatus) {
JuanManuelAmador 0:3d456b8ce449 351 return (OK);
JuanManuelAmador 0:3d456b8ce449 352 } else {
JuanManuelAmador 0:3d456b8ce449 353 return (ERR_TD_FAIL);
JuanManuelAmador 0:3d456b8ce449 354 }
JuanManuelAmador 0:3d456b8ce449 355 }
JuanManuelAmador 0:3d456b8ce449 356
JuanManuelAmador 0:3d456b8ce449 357 /*
JuanManuelAmador 0:3d456b8ce449 358 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 359 * ENUMERATE THE DEVICE
JuanManuelAmador 0:3d456b8ce449 360 *
JuanManuelAmador 0:3d456b8ce449 361 * Description: This function is used to enumerate the device connected
JuanManuelAmador 0:3d456b8ce449 362 *
JuanManuelAmador 0:3d456b8ce449 363 * Arguments : None
JuanManuelAmador 0:3d456b8ce449 364 *
JuanManuelAmador 0:3d456b8ce449 365 * Returns : None
JuanManuelAmador 0:3d456b8ce449 366 *
JuanManuelAmador 0:3d456b8ce449 367 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 368 */
JuanManuelAmador 0:3d456b8ce449 369
JuanManuelAmador 0:3d456b8ce449 370 USB_INT32S Host_EnumDev (void)
JuanManuelAmador 0:3d456b8ce449 371 {
JuanManuelAmador 0:3d456b8ce449 372 USB_INT32S rc;
JuanManuelAmador 0:3d456b8ce449 373
JuanManuelAmador 0:3d456b8ce449 374 PRINT_Log("Connect a Mass Storage device\n");
JuanManuelAmador 0:3d456b8ce449 375 while (!HOST_RhscIntr)
JuanManuelAmador 0:3d456b8ce449 376 __WFI();
JuanManuelAmador 0:3d456b8ce449 377 myled = 1;
JuanManuelAmador 0:3d456b8ce449 378 Host_DelayMS(100); /* USB 2.0 spec says atleast 50ms delay beore port reset */
JuanManuelAmador 0:3d456b8ce449 379 LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRS; // Initiate port reset
JuanManuelAmador 0:3d456b8ce449 380 while (LPC_USB->HcRhPortStatus1 & OR_RH_PORT_PRS)
JuanManuelAmador 0:3d456b8ce449 381 __WFI(); // Wait for port reset to complete...
JuanManuelAmador 0:3d456b8ce449 382 LPC_USB->HcRhPortStatus1 = OR_RH_PORT_PRSC; // ...and clear port reset signal
JuanManuelAmador 0:3d456b8ce449 383 Host_DelayMS(200); /* Wait for 100 MS after port reset */
JuanManuelAmador 0:3d456b8ce449 384
JuanManuelAmador 0:3d456b8ce449 385 EDCtrl->Control = 8 << 16; /* Put max pkt size = 8 */
JuanManuelAmador 0:3d456b8ce449 386 /* Read first 8 bytes of device desc */
JuanManuelAmador 0:3d456b8ce449 387 rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_DEVICE, 0, TDBuffer, 8);
JuanManuelAmador 0:3d456b8ce449 388 if (rc != OK) {
JuanManuelAmador 0:3d456b8ce449 389 PRINT_Err(rc);
JuanManuelAmador 0:3d456b8ce449 390 return (rc);
JuanManuelAmador 0:3d456b8ce449 391 }
JuanManuelAmador 0:3d456b8ce449 392 EDCtrl->Control = TDBuffer[7] << 16; /* Get max pkt size of endpoint 0 */
JuanManuelAmador 0:3d456b8ce449 393 rc = HOST_SET_ADDRESS(1); /* Set the device address to 1 */
JuanManuelAmador 0:3d456b8ce449 394 if (rc != OK) {
JuanManuelAmador 0:3d456b8ce449 395 PRINT_Err(rc);
JuanManuelAmador 0:3d456b8ce449 396 return (rc);
JuanManuelAmador 0:3d456b8ce449 397 }
JuanManuelAmador 0:3d456b8ce449 398 Host_DelayMS(2);
JuanManuelAmador 0:3d456b8ce449 399 EDCtrl->Control = (EDCtrl->Control) | 1; /* Modify control pipe with address 1 */
JuanManuelAmador 0:3d456b8ce449 400 /* Get the configuration descriptor */
JuanManuelAmador 0:3d456b8ce449 401 rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, 9);
JuanManuelAmador 0:3d456b8ce449 402 if (rc != OK) {
JuanManuelAmador 0:3d456b8ce449 403 PRINT_Err(rc);
JuanManuelAmador 0:3d456b8ce449 404 return (rc);
JuanManuelAmador 0:3d456b8ce449 405 }
JuanManuelAmador 0:3d456b8ce449 406 /* Get the first configuration data */
JuanManuelAmador 0:3d456b8ce449 407 rc = HOST_GET_DESCRIPTOR(USB_DESCRIPTOR_TYPE_CONFIGURATION, 0, TDBuffer, ReadLE16U(&TDBuffer[2]));
JuanManuelAmador 0:3d456b8ce449 408 if (rc != OK) {
JuanManuelAmador 0:3d456b8ce449 409 PRINT_Err(rc);
JuanManuelAmador 0:3d456b8ce449 410 return (rc);
JuanManuelAmador 0:3d456b8ce449 411 }
JuanManuelAmador 0:3d456b8ce449 412 rc = MS_ParseConfiguration(); /* Parse the configuration */
JuanManuelAmador 0:3d456b8ce449 413 if (rc != OK) {
JuanManuelAmador 0:3d456b8ce449 414 PRINT_Err(rc);
JuanManuelAmador 0:3d456b8ce449 415 return (rc);
JuanManuelAmador 0:3d456b8ce449 416 }
JuanManuelAmador 0:3d456b8ce449 417 rc = USBH_SET_CONFIGURATION(1); /* Select device configuration 1 */
JuanManuelAmador 0:3d456b8ce449 418 if (rc != OK) {
JuanManuelAmador 0:3d456b8ce449 419 PRINT_Err(rc);
JuanManuelAmador 0:3d456b8ce449 420 }
JuanManuelAmador 0:3d456b8ce449 421 Host_DelayMS(100); /* Some devices may require this delay */
JuanManuelAmador 0:3d456b8ce449 422 return (rc);
JuanManuelAmador 0:3d456b8ce449 423 }
JuanManuelAmador 0:3d456b8ce449 424
JuanManuelAmador 0:3d456b8ce449 425 /*
JuanManuelAmador 0:3d456b8ce449 426 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 427 * RECEIVE THE CONTROL INFORMATION
JuanManuelAmador 0:3d456b8ce449 428 *
JuanManuelAmador 0:3d456b8ce449 429 * Description: This function is used to receive the control information
JuanManuelAmador 0:3d456b8ce449 430 *
JuanManuelAmador 0:3d456b8ce449 431 * Arguments : bm_request_type
JuanManuelAmador 0:3d456b8ce449 432 * b_request
JuanManuelAmador 0:3d456b8ce449 433 * w_value
JuanManuelAmador 0:3d456b8ce449 434 * w_index
JuanManuelAmador 0:3d456b8ce449 435 * w_length
JuanManuelAmador 0:3d456b8ce449 436 * buffer
JuanManuelAmador 0:3d456b8ce449 437 *
JuanManuelAmador 0:3d456b8ce449 438 * Returns : OK if Success
JuanManuelAmador 0:3d456b8ce449 439 * ERROR if Failed
JuanManuelAmador 0:3d456b8ce449 440 *
JuanManuelAmador 0:3d456b8ce449 441 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 442 */
JuanManuelAmador 0:3d456b8ce449 443
JuanManuelAmador 0:3d456b8ce449 444 USB_INT32S Host_CtrlRecv ( USB_INT08U bm_request_type,
JuanManuelAmador 0:3d456b8ce449 445 USB_INT08U b_request,
JuanManuelAmador 0:3d456b8ce449 446 USB_INT16U w_value,
JuanManuelAmador 0:3d456b8ce449 447 USB_INT16U w_index,
JuanManuelAmador 0:3d456b8ce449 448 USB_INT16U w_length,
JuanManuelAmador 0:3d456b8ce449 449 volatile USB_INT08U *buffer)
JuanManuelAmador 0:3d456b8ce449 450 {
JuanManuelAmador 0:3d456b8ce449 451 USB_INT32S rc;
JuanManuelAmador 0:3d456b8ce449 452
JuanManuelAmador 0:3d456b8ce449 453
JuanManuelAmador 0:3d456b8ce449 454 Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
JuanManuelAmador 0:3d456b8ce449 455 rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
JuanManuelAmador 0:3d456b8ce449 456 if (rc == OK) {
JuanManuelAmador 0:3d456b8ce449 457 if (w_length) {
JuanManuelAmador 0:3d456b8ce449 458 rc = Host_ProcessTD(EDCtrl, TD_IN, TDBuffer, w_length);
JuanManuelAmador 0:3d456b8ce449 459 }
JuanManuelAmador 0:3d456b8ce449 460 if (rc == OK) {
JuanManuelAmador 0:3d456b8ce449 461 rc = Host_ProcessTD(EDCtrl, TD_OUT, NULL, 0);
JuanManuelAmador 0:3d456b8ce449 462 }
JuanManuelAmador 0:3d456b8ce449 463 }
JuanManuelAmador 0:3d456b8ce449 464 return (rc);
JuanManuelAmador 0:3d456b8ce449 465 }
JuanManuelAmador 0:3d456b8ce449 466
JuanManuelAmador 0:3d456b8ce449 467 /*
JuanManuelAmador 0:3d456b8ce449 468 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 469 * SEND THE CONTROL INFORMATION
JuanManuelAmador 0:3d456b8ce449 470 *
JuanManuelAmador 0:3d456b8ce449 471 * Description: This function is used to send the control information
JuanManuelAmador 0:3d456b8ce449 472 *
JuanManuelAmador 0:3d456b8ce449 473 * Arguments : None
JuanManuelAmador 0:3d456b8ce449 474 *
JuanManuelAmador 0:3d456b8ce449 475 * Returns : OK if Success
JuanManuelAmador 0:3d456b8ce449 476 * ERR_INVALID_BOOTSIG if Failed
JuanManuelAmador 0:3d456b8ce449 477 *
JuanManuelAmador 0:3d456b8ce449 478 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 479 */
JuanManuelAmador 0:3d456b8ce449 480
JuanManuelAmador 0:3d456b8ce449 481 USB_INT32S Host_CtrlSend ( USB_INT08U bm_request_type,
JuanManuelAmador 0:3d456b8ce449 482 USB_INT08U b_request,
JuanManuelAmador 0:3d456b8ce449 483 USB_INT16U w_value,
JuanManuelAmador 0:3d456b8ce449 484 USB_INT16U w_index,
JuanManuelAmador 0:3d456b8ce449 485 USB_INT16U w_length,
JuanManuelAmador 0:3d456b8ce449 486 volatile USB_INT08U *buffer)
JuanManuelAmador 0:3d456b8ce449 487 {
JuanManuelAmador 0:3d456b8ce449 488 USB_INT32S rc;
JuanManuelAmador 0:3d456b8ce449 489
JuanManuelAmador 0:3d456b8ce449 490
JuanManuelAmador 0:3d456b8ce449 491 Host_FillSetup(bm_request_type, b_request, w_value, w_index, w_length);
JuanManuelAmador 0:3d456b8ce449 492
JuanManuelAmador 0:3d456b8ce449 493 rc = Host_ProcessTD(EDCtrl, TD_SETUP, TDBuffer, 8);
JuanManuelAmador 0:3d456b8ce449 494 if (rc == OK) {
JuanManuelAmador 0:3d456b8ce449 495 if (w_length) {
JuanManuelAmador 0:3d456b8ce449 496 rc = Host_ProcessTD(EDCtrl, TD_OUT, TDBuffer, w_length);
JuanManuelAmador 0:3d456b8ce449 497 }
JuanManuelAmador 0:3d456b8ce449 498 if (rc == OK) {
JuanManuelAmador 0:3d456b8ce449 499 rc = Host_ProcessTD(EDCtrl, TD_IN, NULL, 0);
JuanManuelAmador 0:3d456b8ce449 500 }
JuanManuelAmador 0:3d456b8ce449 501 }
JuanManuelAmador 0:3d456b8ce449 502 return (rc);
JuanManuelAmador 0:3d456b8ce449 503 }
JuanManuelAmador 0:3d456b8ce449 504
JuanManuelAmador 0:3d456b8ce449 505 /*
JuanManuelAmador 0:3d456b8ce449 506 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 507 * FILL SETUP PACKET
JuanManuelAmador 0:3d456b8ce449 508 *
JuanManuelAmador 0:3d456b8ce449 509 * Description: This function is used to fill the setup packet
JuanManuelAmador 0:3d456b8ce449 510 *
JuanManuelAmador 0:3d456b8ce449 511 * Arguments : None
JuanManuelAmador 0:3d456b8ce449 512 *
JuanManuelAmador 0:3d456b8ce449 513 * Returns : OK if Success
JuanManuelAmador 0:3d456b8ce449 514 * ERR_INVALID_BOOTSIG if Failed
JuanManuelAmador 0:3d456b8ce449 515 *
JuanManuelAmador 0:3d456b8ce449 516 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 517 */
JuanManuelAmador 0:3d456b8ce449 518
JuanManuelAmador 0:3d456b8ce449 519 void Host_FillSetup (USB_INT08U bm_request_type,
JuanManuelAmador 0:3d456b8ce449 520 USB_INT08U b_request,
JuanManuelAmador 0:3d456b8ce449 521 USB_INT16U w_value,
JuanManuelAmador 0:3d456b8ce449 522 USB_INT16U w_index,
JuanManuelAmador 0:3d456b8ce449 523 USB_INT16U w_length)
JuanManuelAmador 0:3d456b8ce449 524 {
JuanManuelAmador 0:3d456b8ce449 525 int i;
JuanManuelAmador 0:3d456b8ce449 526 for (i=0;i<w_length;i++)
JuanManuelAmador 0:3d456b8ce449 527 TDBuffer[i] = 0;
JuanManuelAmador 0:3d456b8ce449 528
JuanManuelAmador 0:3d456b8ce449 529 TDBuffer[0] = bm_request_type;
JuanManuelAmador 0:3d456b8ce449 530 TDBuffer[1] = b_request;
JuanManuelAmador 0:3d456b8ce449 531 WriteLE16U(&TDBuffer[2], w_value);
JuanManuelAmador 0:3d456b8ce449 532 WriteLE16U(&TDBuffer[4], w_index);
JuanManuelAmador 0:3d456b8ce449 533 WriteLE16U(&TDBuffer[6], w_length);
JuanManuelAmador 0:3d456b8ce449 534 }
JuanManuelAmador 0:3d456b8ce449 535
JuanManuelAmador 0:3d456b8ce449 536
JuanManuelAmador 0:3d456b8ce449 537
JuanManuelAmador 0:3d456b8ce449 538 /*
JuanManuelAmador 0:3d456b8ce449 539 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 540 * INITIALIZE THE TRANSFER DESCRIPTOR
JuanManuelAmador 0:3d456b8ce449 541 *
JuanManuelAmador 0:3d456b8ce449 542 * Description: This function initializes transfer descriptor
JuanManuelAmador 0:3d456b8ce449 543 *
JuanManuelAmador 0:3d456b8ce449 544 * Arguments : Pointer to TD structure
JuanManuelAmador 0:3d456b8ce449 545 *
JuanManuelAmador 0:3d456b8ce449 546 * Returns : None
JuanManuelAmador 0:3d456b8ce449 547 *
JuanManuelAmador 0:3d456b8ce449 548 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 549 */
JuanManuelAmador 0:3d456b8ce449 550
JuanManuelAmador 0:3d456b8ce449 551 void Host_TDInit (volatile HCTD *td)
JuanManuelAmador 0:3d456b8ce449 552 {
JuanManuelAmador 0:3d456b8ce449 553
JuanManuelAmador 0:3d456b8ce449 554 td->Control = 0;
JuanManuelAmador 0:3d456b8ce449 555 td->CurrBufPtr = 0;
JuanManuelAmador 0:3d456b8ce449 556 td->Next = 0;
JuanManuelAmador 0:3d456b8ce449 557 td->BufEnd = 0;
JuanManuelAmador 0:3d456b8ce449 558 }
JuanManuelAmador 0:3d456b8ce449 559
JuanManuelAmador 0:3d456b8ce449 560 /*
JuanManuelAmador 0:3d456b8ce449 561 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 562 * INITIALIZE THE ENDPOINT DESCRIPTOR
JuanManuelAmador 0:3d456b8ce449 563 *
JuanManuelAmador 0:3d456b8ce449 564 * Description: This function initializes endpoint descriptor
JuanManuelAmador 0:3d456b8ce449 565 *
JuanManuelAmador 0:3d456b8ce449 566 * Arguments : Pointer to ED strcuture
JuanManuelAmador 0:3d456b8ce449 567 *
JuanManuelAmador 0:3d456b8ce449 568 * Returns : None
JuanManuelAmador 0:3d456b8ce449 569 *
JuanManuelAmador 0:3d456b8ce449 570 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 571 */
JuanManuelAmador 0:3d456b8ce449 572
JuanManuelAmador 0:3d456b8ce449 573 void Host_EDInit (volatile HCED *ed)
JuanManuelAmador 0:3d456b8ce449 574 {
JuanManuelAmador 0:3d456b8ce449 575
JuanManuelAmador 0:3d456b8ce449 576 ed->Control = 0;
JuanManuelAmador 0:3d456b8ce449 577 ed->TailTd = 0;
JuanManuelAmador 0:3d456b8ce449 578 ed->HeadTd = 0;
JuanManuelAmador 0:3d456b8ce449 579 ed->Next = 0;
JuanManuelAmador 0:3d456b8ce449 580 }
JuanManuelAmador 0:3d456b8ce449 581
JuanManuelAmador 0:3d456b8ce449 582 /*
JuanManuelAmador 0:3d456b8ce449 583 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 584 * INITIALIZE HOST CONTROLLER COMMUNICATIONS AREA
JuanManuelAmador 0:3d456b8ce449 585 *
JuanManuelAmador 0:3d456b8ce449 586 * Description: This function initializes host controller communications area
JuanManuelAmador 0:3d456b8ce449 587 *
JuanManuelAmador 0:3d456b8ce449 588 * Arguments : Pointer to HCCA
JuanManuelAmador 0:3d456b8ce449 589 *
JuanManuelAmador 0:3d456b8ce449 590 * Returns :
JuanManuelAmador 0:3d456b8ce449 591 *
JuanManuelAmador 0:3d456b8ce449 592 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 593 */
JuanManuelAmador 0:3d456b8ce449 594
JuanManuelAmador 0:3d456b8ce449 595 void Host_HCCAInit (volatile HCCA *hcca)
JuanManuelAmador 0:3d456b8ce449 596 {
JuanManuelAmador 0:3d456b8ce449 597 USB_INT32U i;
JuanManuelAmador 0:3d456b8ce449 598
JuanManuelAmador 0:3d456b8ce449 599
JuanManuelAmador 0:3d456b8ce449 600 for (i = 0; i < 32; i++) {
JuanManuelAmador 0:3d456b8ce449 601
JuanManuelAmador 0:3d456b8ce449 602 hcca->IntTable[i] = 0;
JuanManuelAmador 0:3d456b8ce449 603 hcca->FrameNumber = 0;
JuanManuelAmador 0:3d456b8ce449 604 hcca->DoneHead = 0;
JuanManuelAmador 0:3d456b8ce449 605 }
JuanManuelAmador 0:3d456b8ce449 606
JuanManuelAmador 0:3d456b8ce449 607 }
JuanManuelAmador 0:3d456b8ce449 608
JuanManuelAmador 0:3d456b8ce449 609 /*
JuanManuelAmador 0:3d456b8ce449 610 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 611 * WAIT FOR WDH INTERRUPT
JuanManuelAmador 0:3d456b8ce449 612 *
JuanManuelAmador 0:3d456b8ce449 613 * Description: This function is infinite loop which breaks when ever a WDH interrupt rises
JuanManuelAmador 0:3d456b8ce449 614 *
JuanManuelAmador 0:3d456b8ce449 615 * Arguments : None
JuanManuelAmador 0:3d456b8ce449 616 *
JuanManuelAmador 0:3d456b8ce449 617 * Returns : None
JuanManuelAmador 0:3d456b8ce449 618 *
JuanManuelAmador 0:3d456b8ce449 619 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 620 */
JuanManuelAmador 0:3d456b8ce449 621
JuanManuelAmador 0:3d456b8ce449 622 void Host_WDHWait (void)
JuanManuelAmador 0:3d456b8ce449 623 {
JuanManuelAmador 0:3d456b8ce449 624 while (!HOST_WdhIntr)
JuanManuelAmador 0:3d456b8ce449 625 __WFI();
JuanManuelAmador 0:3d456b8ce449 626
JuanManuelAmador 0:3d456b8ce449 627 HOST_WdhIntr = 0;
JuanManuelAmador 0:3d456b8ce449 628 }
JuanManuelAmador 0:3d456b8ce449 629
JuanManuelAmador 0:3d456b8ce449 630 /*
JuanManuelAmador 0:3d456b8ce449 631 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 632 * READ LE 32U
JuanManuelAmador 0:3d456b8ce449 633 *
JuanManuelAmador 0:3d456b8ce449 634 * Description: This function is used to read an unsigned integer from a character buffer in the platform
JuanManuelAmador 0:3d456b8ce449 635 * containing little endian processor
JuanManuelAmador 0:3d456b8ce449 636 *
JuanManuelAmador 0:3d456b8ce449 637 * Arguments : pmem Pointer to the character buffer
JuanManuelAmador 0:3d456b8ce449 638 *
JuanManuelAmador 0:3d456b8ce449 639 * Returns : val Unsigned integer
JuanManuelAmador 0:3d456b8ce449 640 *
JuanManuelAmador 0:3d456b8ce449 641 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 642 */
JuanManuelAmador 0:3d456b8ce449 643
JuanManuelAmador 0:3d456b8ce449 644 USB_INT32U ReadLE32U (volatile USB_INT08U *pmem)
JuanManuelAmador 0:3d456b8ce449 645 {
JuanManuelAmador 0:3d456b8ce449 646 USB_INT32U val = *(USB_INT32U*)pmem;
JuanManuelAmador 0:3d456b8ce449 647 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 648 return __REV(val);
JuanManuelAmador 0:3d456b8ce449 649 #else
JuanManuelAmador 0:3d456b8ce449 650 return val;
JuanManuelAmador 0:3d456b8ce449 651 #endif
JuanManuelAmador 0:3d456b8ce449 652 }
JuanManuelAmador 0:3d456b8ce449 653
JuanManuelAmador 0:3d456b8ce449 654 /*
JuanManuelAmador 0:3d456b8ce449 655 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 656 * WRITE LE 32U
JuanManuelAmador 0:3d456b8ce449 657 *
JuanManuelAmador 0:3d456b8ce449 658 * Description: This function is used to write an unsigned integer into a charecter buffer in the platform
JuanManuelAmador 0:3d456b8ce449 659 * containing little endian processor.
JuanManuelAmador 0:3d456b8ce449 660 *
JuanManuelAmador 0:3d456b8ce449 661 * Arguments : pmem Pointer to the charecter buffer
JuanManuelAmador 0:3d456b8ce449 662 * val Integer value to be placed in the charecter buffer
JuanManuelAmador 0:3d456b8ce449 663 *
JuanManuelAmador 0:3d456b8ce449 664 * Returns : None
JuanManuelAmador 0:3d456b8ce449 665 *
JuanManuelAmador 0:3d456b8ce449 666 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 667 */
JuanManuelAmador 0:3d456b8ce449 668
JuanManuelAmador 0:3d456b8ce449 669 void WriteLE32U (volatile USB_INT08U *pmem,
JuanManuelAmador 0:3d456b8ce449 670 USB_INT32U val)
JuanManuelAmador 0:3d456b8ce449 671 {
JuanManuelAmador 0:3d456b8ce449 672 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 673 *(USB_INT32U*)pmem = __REV(val);
JuanManuelAmador 0:3d456b8ce449 674 #else
JuanManuelAmador 0:3d456b8ce449 675 *(USB_INT32U*)pmem = val;
JuanManuelAmador 0:3d456b8ce449 676 #endif
JuanManuelAmador 0:3d456b8ce449 677 }
JuanManuelAmador 0:3d456b8ce449 678
JuanManuelAmador 0:3d456b8ce449 679 /*
JuanManuelAmador 0:3d456b8ce449 680 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 681 * READ LE 16U
JuanManuelAmador 0:3d456b8ce449 682 *
JuanManuelAmador 0:3d456b8ce449 683 * Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
JuanManuelAmador 0:3d456b8ce449 684 * containing little endian processor
JuanManuelAmador 0:3d456b8ce449 685 *
JuanManuelAmador 0:3d456b8ce449 686 * Arguments : pmem Pointer to the charecter buffer
JuanManuelAmador 0:3d456b8ce449 687 *
JuanManuelAmador 0:3d456b8ce449 688 * Returns : val Unsigned short integer
JuanManuelAmador 0:3d456b8ce449 689 *
JuanManuelAmador 0:3d456b8ce449 690 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 691 */
JuanManuelAmador 0:3d456b8ce449 692
JuanManuelAmador 0:3d456b8ce449 693 USB_INT16U ReadLE16U (volatile USB_INT08U *pmem)
JuanManuelAmador 0:3d456b8ce449 694 {
JuanManuelAmador 0:3d456b8ce449 695 USB_INT16U val = *(USB_INT16U*)pmem;
JuanManuelAmador 0:3d456b8ce449 696 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 697 return __REV16(val);
JuanManuelAmador 0:3d456b8ce449 698 #else
JuanManuelAmador 0:3d456b8ce449 699 return val;
JuanManuelAmador 0:3d456b8ce449 700 #endif
JuanManuelAmador 0:3d456b8ce449 701 }
JuanManuelAmador 0:3d456b8ce449 702
JuanManuelAmador 0:3d456b8ce449 703 /*
JuanManuelAmador 0:3d456b8ce449 704 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 705 * WRITE LE 16U
JuanManuelAmador 0:3d456b8ce449 706 *
JuanManuelAmador 0:3d456b8ce449 707 * Description: This function is used to write an unsigned short integer into a charecter buffer in the
JuanManuelAmador 0:3d456b8ce449 708 * platform containing little endian processor
JuanManuelAmador 0:3d456b8ce449 709 *
JuanManuelAmador 0:3d456b8ce449 710 * Arguments : pmem Pointer to the charecter buffer
JuanManuelAmador 0:3d456b8ce449 711 * val Value to be placed in the charecter buffer
JuanManuelAmador 0:3d456b8ce449 712 *
JuanManuelAmador 0:3d456b8ce449 713 * Returns : None
JuanManuelAmador 0:3d456b8ce449 714 *
JuanManuelAmador 0:3d456b8ce449 715 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 716 */
JuanManuelAmador 0:3d456b8ce449 717
JuanManuelAmador 0:3d456b8ce449 718 void WriteLE16U (volatile USB_INT08U *pmem,
JuanManuelAmador 0:3d456b8ce449 719 USB_INT16U val)
JuanManuelAmador 0:3d456b8ce449 720 {
JuanManuelAmador 0:3d456b8ce449 721 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 722 *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
JuanManuelAmador 0:3d456b8ce449 723 #else
JuanManuelAmador 0:3d456b8ce449 724 *(USB_INT16U*)pmem = val;
JuanManuelAmador 0:3d456b8ce449 725 #endif
JuanManuelAmador 0:3d456b8ce449 726 }
JuanManuelAmador 0:3d456b8ce449 727
JuanManuelAmador 0:3d456b8ce449 728 /*
JuanManuelAmador 0:3d456b8ce449 729 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 730 * READ BE 32U
JuanManuelAmador 0:3d456b8ce449 731 *
JuanManuelAmador 0:3d456b8ce449 732 * Description: This function is used to read an unsigned integer from a charecter buffer in the platform
JuanManuelAmador 0:3d456b8ce449 733 * containing big endian processor
JuanManuelAmador 0:3d456b8ce449 734 *
JuanManuelAmador 0:3d456b8ce449 735 * Arguments : pmem Pointer to the charecter buffer
JuanManuelAmador 0:3d456b8ce449 736 *
JuanManuelAmador 0:3d456b8ce449 737 * Returns : val Unsigned integer
JuanManuelAmador 0:3d456b8ce449 738 *
JuanManuelAmador 0:3d456b8ce449 739 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 740 */
JuanManuelAmador 0:3d456b8ce449 741
JuanManuelAmador 0:3d456b8ce449 742 USB_INT32U ReadBE32U (volatile USB_INT08U *pmem)
JuanManuelAmador 0:3d456b8ce449 743 {
JuanManuelAmador 0:3d456b8ce449 744 USB_INT32U val = *(USB_INT32U*)pmem;
JuanManuelAmador 0:3d456b8ce449 745 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 746 return val;
JuanManuelAmador 0:3d456b8ce449 747 #else
JuanManuelAmador 0:3d456b8ce449 748 return __REV(val);
JuanManuelAmador 0:3d456b8ce449 749 #endif
JuanManuelAmador 0:3d456b8ce449 750 }
JuanManuelAmador 0:3d456b8ce449 751
JuanManuelAmador 0:3d456b8ce449 752 /*
JuanManuelAmador 0:3d456b8ce449 753 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 754 * WRITE BE 32U
JuanManuelAmador 0:3d456b8ce449 755 *
JuanManuelAmador 0:3d456b8ce449 756 * Description: This function is used to write an unsigned integer into a charecter buffer in the platform
JuanManuelAmador 0:3d456b8ce449 757 * containing big endian processor
JuanManuelAmador 0:3d456b8ce449 758 *
JuanManuelAmador 0:3d456b8ce449 759 * Arguments : pmem Pointer to the charecter buffer
JuanManuelAmador 0:3d456b8ce449 760 * val Value to be placed in the charecter buffer
JuanManuelAmador 0:3d456b8ce449 761 *
JuanManuelAmador 0:3d456b8ce449 762 * Returns : None
JuanManuelAmador 0:3d456b8ce449 763 *
JuanManuelAmador 0:3d456b8ce449 764 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 765 */
JuanManuelAmador 0:3d456b8ce449 766
JuanManuelAmador 0:3d456b8ce449 767 void WriteBE32U (volatile USB_INT08U *pmem,
JuanManuelAmador 0:3d456b8ce449 768 USB_INT32U val)
JuanManuelAmador 0:3d456b8ce449 769 {
JuanManuelAmador 0:3d456b8ce449 770 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 771 *(USB_INT32U*)pmem = val;
JuanManuelAmador 0:3d456b8ce449 772 #else
JuanManuelAmador 0:3d456b8ce449 773 *(USB_INT32U*)pmem = __REV(val);
JuanManuelAmador 0:3d456b8ce449 774 #endif
JuanManuelAmador 0:3d456b8ce449 775 }
JuanManuelAmador 0:3d456b8ce449 776
JuanManuelAmador 0:3d456b8ce449 777 /*
JuanManuelAmador 0:3d456b8ce449 778 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 779 * READ BE 16U
JuanManuelAmador 0:3d456b8ce449 780 *
JuanManuelAmador 0:3d456b8ce449 781 * Description: This function is used to read an unsigned short integer from a charecter buffer in the platform
JuanManuelAmador 0:3d456b8ce449 782 * containing big endian processor
JuanManuelAmador 0:3d456b8ce449 783 *
JuanManuelAmador 0:3d456b8ce449 784 * Arguments : pmem Pointer to the charecter buffer
JuanManuelAmador 0:3d456b8ce449 785 *
JuanManuelAmador 0:3d456b8ce449 786 * Returns : val Unsigned short integer
JuanManuelAmador 0:3d456b8ce449 787 *
JuanManuelAmador 0:3d456b8ce449 788 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 789 */
JuanManuelAmador 0:3d456b8ce449 790
JuanManuelAmador 0:3d456b8ce449 791 USB_INT16U ReadBE16U (volatile USB_INT08U *pmem)
JuanManuelAmador 0:3d456b8ce449 792 {
JuanManuelAmador 0:3d456b8ce449 793 USB_INT16U val = *(USB_INT16U*)pmem;
JuanManuelAmador 0:3d456b8ce449 794 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 795 return val;
JuanManuelAmador 0:3d456b8ce449 796 #else
JuanManuelAmador 0:3d456b8ce449 797 return __REV16(val);
JuanManuelAmador 0:3d456b8ce449 798 #endif
JuanManuelAmador 0:3d456b8ce449 799 }
JuanManuelAmador 0:3d456b8ce449 800
JuanManuelAmador 0:3d456b8ce449 801 /*
JuanManuelAmador 0:3d456b8ce449 802 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 803 * WRITE BE 16U
JuanManuelAmador 0:3d456b8ce449 804 *
JuanManuelAmador 0:3d456b8ce449 805 * Description: This function is used to write an unsigned short integer into the charecter buffer in the
JuanManuelAmador 0:3d456b8ce449 806 * platform containing big endian processor
JuanManuelAmador 0:3d456b8ce449 807 *
JuanManuelAmador 0:3d456b8ce449 808 * Arguments : pmem Pointer to the charecter buffer
JuanManuelAmador 0:3d456b8ce449 809 * val Value to be placed in the charecter buffer
JuanManuelAmador 0:3d456b8ce449 810 *
JuanManuelAmador 0:3d456b8ce449 811 * Returns : None
JuanManuelAmador 0:3d456b8ce449 812 *
JuanManuelAmador 0:3d456b8ce449 813 **************************************************************************************************************
JuanManuelAmador 0:3d456b8ce449 814 */
JuanManuelAmador 0:3d456b8ce449 815
JuanManuelAmador 0:3d456b8ce449 816 void WriteBE16U (volatile USB_INT08U *pmem,
JuanManuelAmador 0:3d456b8ce449 817 USB_INT16U val)
JuanManuelAmador 0:3d456b8ce449 818 {
JuanManuelAmador 0:3d456b8ce449 819 #ifdef __BIG_ENDIAN
JuanManuelAmador 0:3d456b8ce449 820 *(USB_INT16U*)pmem = val;
JuanManuelAmador 0:3d456b8ce449 821 #else
JuanManuelAmador 0:3d456b8ce449 822 *(USB_INT16U*)pmem = (__REV16(val) & 0xFFFF);
JuanManuelAmador 0:3d456b8ce449 823 #endif
JuanManuelAmador 0:3d456b8ce449 824 }