Pendrive to sd card data transfer coding

Dependencies:   FatFileSystem TextLCD mbed

Fork of MSCUsbHost by gavin beardall

Committer:
sathguru
Date:
Thu Apr 16 05:12:20 2015 +0000
Revision:
1:77e50c06ea01
Parent:
0:e6a539e59b52
Pendrive to sd card data transfer coding

Who changed what in which revision?

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