I have errors with this program.

Dependencies:   mbed FATFileSystem

Committer:
carlos_nascimento08
Date:
Sun Jul 22 20:01:51 2012 +0000
Revision:
0:ebf86c956c58
Error debug

Who changed what in which revision?

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