Committer:
apm_litoral
Date:
Tue Apr 10 03:34:23 2012 +0000
Revision:
0:78a36db66fbb

        

Who changed what in which revision?

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