This program is an example of of using the MSCUSBHost code with a raw build of ELM Chan Fat Fs. This was done to add both Long File Name Support along with proper time/date stamps (assuming you have a battery hooked up to keep time). This code exposes the Chan API (see main.cpp) and is NOT a c++ class: http://elm-chan.org/fsw/ff/00index_e.html The diskio.c file has the mapping needed to link the filesystem to the MSC stuff

Dependencies:   mbed

Committer:
emh203
Date:
Sun Jan 23 18:35:43 2011 +0000
Revision:
0:2dbbafe1b1fb
1st test version.   Test with raw mbed and Samtec USB-RA type A connector wired directly to pins.

Who changed what in which revision?

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