SD

Dependents:   Andar_Linha_Reta_Robo_Claw_v1

Fork of MSCFileSystem by Chris Styles

Committer:
carlos_nascimento08
Date:
Sun Sep 16 15:00:33 2012 +0000
Revision:
5:59daf2b48180
Parent:
4:dcc326e4d358
USB;

Who changed what in which revision?

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