Versión de Firmware con funciones de RAM incorporadas.

Dependencies:   mbed

Fork of VmRecorderV1dot1 by virtualmech

Committer:
JuanManuelAmador
Date:
Tue Jul 14 08:34:11 2015 +0000
Revision:
2:e818c80e6d5c
Parent:
0:3d456b8ce449
Funciones de memoria RAM introducidas.

Who changed what in which revision?

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