This program plays an internet radio audio stream like Shoutcast.

Dependencies:   EthernetNetIf mbed HTTPClient

Committer:
parik
Date:
Tue Mar 01 06:22:50 2011 +0000
Revision:
0:37da71b87d96

        

Who changed what in which revision?

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