Import Library

Committer:
carlos_nascimento08
Date:
Sun Jul 22 20:46:05 2012 +0000
Revision:
0:10643735c105
USBHostFile
;

Who changed what in which revision?

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