Wireless Gas Meter Reading System Data Logger

Dependencies:   mbed

Committer:
harrisjunaid
Date:
Tue Apr 17 15:54:02 2012 +0000
Revision:
0:a67cda7c126f

        

Who changed what in which revision?

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