Compact Flash I/O test

Dependencies:   mbed

Committer:
emh203
Date:
Fri Dec 30 21:02:16 2011 +0000
Revision:
1:dc171f34db9b

        

Who changed what in which revision?

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