Dependencies:   mbed

Committer:
iva2k
Date:
Thu Jan 21 01:15:42 2010 +0000
Revision:
0:1802fb31b938

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iva2k 0:1802fb31b938 1 /*
iva2k 0:1802fb31b938 2 **************************************************************************************************************
iva2k 0:1802fb31b938 3 * NXP USB Host Stack
iva2k 0:1802fb31b938 4 *
iva2k 0:1802fb31b938 5 * (c) Copyright 2008, NXP SemiConductors
iva2k 0:1802fb31b938 6 * (c) Copyright 2008, OnChip Technologies LLC
iva2k 0:1802fb31b938 7 * All Rights Reserved
iva2k 0:1802fb31b938 8 *
iva2k 0:1802fb31b938 9 * www.nxp.com
iva2k 0:1802fb31b938 10 * www.onchiptech.com
iva2k 0:1802fb31b938 11 *
iva2k 0:1802fb31b938 12 * File : usbhost_lpc17xx.h
iva2k 0:1802fb31b938 13 * Programmer(s) : Ravikanth.P
iva2k 0:1802fb31b938 14 * Version :
iva2k 0:1802fb31b938 15 *
iva2k 0:1802fb31b938 16 **************************************************************************************************************
iva2k 0:1802fb31b938 17 */
iva2k 0:1802fb31b938 18
iva2k 0:1802fb31b938 19 #ifndef USBHOST_LPC17xx_H
iva2k 0:1802fb31b938 20 #define USBHOST_LPC17xx_H
iva2k 0:1802fb31b938 21
iva2k 0:1802fb31b938 22 /*
iva2k 0:1802fb31b938 23 **************************************************************************************************************
iva2k 0:1802fb31b938 24 * INCLUDE HEADER FILES
iva2k 0:1802fb31b938 25 **************************************************************************************************************
iva2k 0:1802fb31b938 26 */
iva2k 0:1802fb31b938 27
iva2k 0:1802fb31b938 28 #include "usbhost_inc.h"
iva2k 0:1802fb31b938 29
iva2k 0:1802fb31b938 30 /*
iva2k 0:1802fb31b938 31 **************************************************************************************************************
iva2k 0:1802fb31b938 32 * PRINT CONFIGURATION
iva2k 0:1802fb31b938 33 **************************************************************************************************************
iva2k 0:1802fb31b938 34 */
iva2k 0:1802fb31b938 35
iva2k 0:1802fb31b938 36 #define PRINT_ENABLE 1
iva2k 0:1802fb31b938 37
iva2k 0:1802fb31b938 38 #if PRINT_ENABLE
iva2k 0:1802fb31b938 39 #define PRINT_Log(...) printf(__VA_ARGS__)
iva2k 0:1802fb31b938 40 #define PRINT_Err(rc) printf("ERROR: In %s at Line %u - rc = %d\r\n", __FUNCTION__, __LINE__, rc)
iva2k 0:1802fb31b938 41
iva2k 0:1802fb31b938 42 #else
iva2k 0:1802fb31b938 43 #define PRINT_Log(...) do {} while(0)
iva2k 0:1802fb31b938 44 #define PRINT_Err(rc) do {} while(0)
iva2k 0:1802fb31b938 45
iva2k 0:1802fb31b938 46 #endif
iva2k 0:1802fb31b938 47
iva2k 0:1802fb31b938 48 /*
iva2k 0:1802fb31b938 49 **************************************************************************************************************
iva2k 0:1802fb31b938 50 * GENERAL DEFINITIONS
iva2k 0:1802fb31b938 51 **************************************************************************************************************
iva2k 0:1802fb31b938 52 */
iva2k 0:1802fb31b938 53
iva2k 0:1802fb31b938 54 #define DESC_LENGTH(x) x[0]
iva2k 0:1802fb31b938 55 #define DESC_TYPE(x) x[1]
iva2k 0:1802fb31b938 56
iva2k 0:1802fb31b938 57
iva2k 0:1802fb31b938 58 #define HOST_GET_DESCRIPTOR(descType, descIndex, data, length) \
iva2k 0:1802fb31b938 59 Host_CtrlRecv(USB_DEVICE_TO_HOST | USB_RECIPIENT_DEVICE, GET_DESCRIPTOR, \
iva2k 0:1802fb31b938 60 (descType << 8)|(descIndex), 0, length, data)
iva2k 0:1802fb31b938 61
iva2k 0:1802fb31b938 62 #define HOST_SET_ADDRESS(new_addr) \
iva2k 0:1802fb31b938 63 Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_ADDRESS, \
iva2k 0:1802fb31b938 64 new_addr, 0, 0, NULL)
iva2k 0:1802fb31b938 65
iva2k 0:1802fb31b938 66 #define USBH_SET_CONFIGURATION(configNum) \
iva2k 0:1802fb31b938 67 Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_DEVICE, SET_CONFIGURATION, \
iva2k 0:1802fb31b938 68 configNum, 0, 0, NULL)
iva2k 0:1802fb31b938 69
iva2k 0:1802fb31b938 70 #define USBH_SET_INTERFACE(ifNum, altNum) \
iva2k 0:1802fb31b938 71 Host_CtrlSend(USB_HOST_TO_DEVICE | USB_RECIPIENT_INTERFACE, SET_INTERFACE, \
iva2k 0:1802fb31b938 72 altNum, ifNum, 0, NULL)
iva2k 0:1802fb31b938 73
iva2k 0:1802fb31b938 74 /*
iva2k 0:1802fb31b938 75 **************************************************************************************************************
iva2k 0:1802fb31b938 76 * OHCI OPERATIONAL REGISTER FIELD DEFINITIONS
iva2k 0:1802fb31b938 77 **************************************************************************************************************
iva2k 0:1802fb31b938 78 */
iva2k 0:1802fb31b938 79
iva2k 0:1802fb31b938 80 /* ------------------ HcControl Register --------------------- */
iva2k 0:1802fb31b938 81 #define OR_CONTROL_CLE 0x00000010
iva2k 0:1802fb31b938 82 #define OR_CONTROL_BLE 0x00000020
iva2k 0:1802fb31b938 83 #define OR_CONTROL_HCFS 0x000000C0
iva2k 0:1802fb31b938 84 #define OR_CONTROL_HC_OPER 0x00000080
iva2k 0:1802fb31b938 85 /* ----------------- HcCommandStatus Register ----------------- */
iva2k 0:1802fb31b938 86 #define OR_CMD_STATUS_HCR 0x00000001
iva2k 0:1802fb31b938 87 #define OR_CMD_STATUS_CLF 0x00000002
iva2k 0:1802fb31b938 88 #define OR_CMD_STATUS_BLF 0x00000004
iva2k 0:1802fb31b938 89 /* --------------- HcInterruptStatus Register ----------------- */
iva2k 0:1802fb31b938 90 #define OR_INTR_STATUS_WDH 0x00000002
iva2k 0:1802fb31b938 91 #define OR_INTR_STATUS_RHSC 0x00000040
iva2k 0:1802fb31b938 92 /* --------------- HcInterruptEnable Register ----------------- */
iva2k 0:1802fb31b938 93 #define OR_INTR_ENABLE_WDH 0x00000002
iva2k 0:1802fb31b938 94 #define OR_INTR_ENABLE_RHSC 0x00000040
iva2k 0:1802fb31b938 95 #define OR_INTR_ENABLE_MIE 0x80000000
iva2k 0:1802fb31b938 96 /* ---------------- HcRhDescriptorA Register ------------------ */
iva2k 0:1802fb31b938 97 #define OR_RH_STATUS_LPSC 0x00010000
iva2k 0:1802fb31b938 98 #define OR_RH_STATUS_DRWE 0x00008000
iva2k 0:1802fb31b938 99 /* -------------- HcRhPortStatus[1:NDP] Register -------------- */
iva2k 0:1802fb31b938 100 #define OR_RH_PORT_CCS 0x00000001
iva2k 0:1802fb31b938 101 #define OR_RH_PORT_PRS 0x00000010
iva2k 0:1802fb31b938 102 #define OR_RH_PORT_CSC 0x00010000
iva2k 0:1802fb31b938 103 #define OR_RH_PORT_PRSC 0x00100000
iva2k 0:1802fb31b938 104
iva2k 0:1802fb31b938 105
iva2k 0:1802fb31b938 106 /*
iva2k 0:1802fb31b938 107 **************************************************************************************************************
iva2k 0:1802fb31b938 108 * FRAME INTERVAL
iva2k 0:1802fb31b938 109 **************************************************************************************************************
iva2k 0:1802fb31b938 110 */
iva2k 0:1802fb31b938 111
iva2k 0:1802fb31b938 112 #define FI 0x2EDF /* 12000 bits per frame (-1) */
iva2k 0:1802fb31b938 113 #define DEFAULT_FMINTERVAL ((((6 * (FI - 210)) / 7) << 16) | FI)
iva2k 0:1802fb31b938 114
iva2k 0:1802fb31b938 115 /*
iva2k 0:1802fb31b938 116 **************************************************************************************************************
iva2k 0:1802fb31b938 117 * TRANSFER DESCRIPTOR CONTROL FIELDS
iva2k 0:1802fb31b938 118 **************************************************************************************************************
iva2k 0:1802fb31b938 119 */
iva2k 0:1802fb31b938 120
iva2k 0:1802fb31b938 121 #define TD_ROUNDING (USB_INT32U) (0x00040000) /* Buffer Rounding */
iva2k 0:1802fb31b938 122 #define TD_SETUP (USB_INT32U)(0) /* Direction of Setup Packet */
iva2k 0:1802fb31b938 123 #define TD_IN (USB_INT32U)(0x00100000) /* Direction In */
iva2k 0:1802fb31b938 124 #define TD_OUT (USB_INT32U)(0x00080000) /* Direction Out */
iva2k 0:1802fb31b938 125 #define TD_DELAY_INT(x) (USB_INT32U)((x) << 21) /* Delay Interrupt */
iva2k 0:1802fb31b938 126 #define TD_TOGGLE_0 (USB_INT32U)(0x02000000) /* Toggle 0 */
iva2k 0:1802fb31b938 127 #define TD_TOGGLE_1 (USB_INT32U)(0x03000000) /* Toggle 1 */
iva2k 0:1802fb31b938 128 #define TD_CC (USB_INT32U)(0xF0000000) /* Completion Code */
iva2k 0:1802fb31b938 129
iva2k 0:1802fb31b938 130 /*
iva2k 0:1802fb31b938 131 **************************************************************************************************************
iva2k 0:1802fb31b938 132 * USB STANDARD REQUEST DEFINITIONS
iva2k 0:1802fb31b938 133 **************************************************************************************************************
iva2k 0:1802fb31b938 134 */
iva2k 0:1802fb31b938 135
iva2k 0:1802fb31b938 136 #define USB_DESCRIPTOR_TYPE_DEVICE 1
iva2k 0:1802fb31b938 137 #define USB_DESCRIPTOR_TYPE_CONFIGURATION 2
iva2k 0:1802fb31b938 138 #define USB_DESCRIPTOR_TYPE_INTERFACE 4
iva2k 0:1802fb31b938 139 #define USB_DESCRIPTOR_TYPE_ENDPOINT 5
iva2k 0:1802fb31b938 140 /* ----------- Control RequestType Fields ----------- */
iva2k 0:1802fb31b938 141 #define USB_DEVICE_TO_HOST 0x80
iva2k 0:1802fb31b938 142 #define USB_HOST_TO_DEVICE 0x00
iva2k 0:1802fb31b938 143 #define USB_REQUEST_TYPE_CLASS 0x20
iva2k 0:1802fb31b938 144 #define USB_RECIPIENT_DEVICE 0x00
iva2k 0:1802fb31b938 145 #define USB_RECIPIENT_INTERFACE 0x01
iva2k 0:1802fb31b938 146 /* -------------- USB Standard Requests -------------- */
iva2k 0:1802fb31b938 147 #define SET_ADDRESS 5
iva2k 0:1802fb31b938 148 #define GET_DESCRIPTOR 6
iva2k 0:1802fb31b938 149 #define SET_CONFIGURATION 9
iva2k 0:1802fb31b938 150 #define SET_INTERFACE 11
iva2k 0:1802fb31b938 151
iva2k 0:1802fb31b938 152 /*
iva2k 0:1802fb31b938 153 **************************************************************************************************************
iva2k 0:1802fb31b938 154 * TYPE DEFINITIONS
iva2k 0:1802fb31b938 155 **************************************************************************************************************
iva2k 0:1802fb31b938 156 */
iva2k 0:1802fb31b938 157
iva2k 0:1802fb31b938 158 typedef struct hcEd { /* ----------- HostController EndPoint Descriptor ------------- */
iva2k 0:1802fb31b938 159 volatile USB_INT32U Control; /* Endpoint descriptor control */
iva2k 0:1802fb31b938 160 volatile USB_INT32U TailTd; /* Physical address of tail in Transfer descriptor list */
iva2k 0:1802fb31b938 161 volatile USB_INT32U HeadTd; /* Physcial address of head in Transfer descriptor list */
iva2k 0:1802fb31b938 162 volatile USB_INT32U Next; /* Physical address of next Endpoint descriptor */
iva2k 0:1802fb31b938 163 } HCED;
iva2k 0:1802fb31b938 164
iva2k 0:1802fb31b938 165 typedef struct hcTd { /* ------------ HostController Transfer Descriptor ------------ */
iva2k 0:1802fb31b938 166 volatile USB_INT32U Control; /* Transfer descriptor control */
iva2k 0:1802fb31b938 167 volatile USB_INT32U CurrBufPtr; /* Physical address of current buffer pointer */
iva2k 0:1802fb31b938 168 volatile USB_INT32U Next; /* Physical pointer to next Transfer Descriptor */
iva2k 0:1802fb31b938 169 volatile USB_INT32U BufEnd; /* Physical address of end of buffer */
iva2k 0:1802fb31b938 170 } HCTD;
iva2k 0:1802fb31b938 171
iva2k 0:1802fb31b938 172 typedef struct hcca { /* ----------- Host Controller Communication Area ------------ */
iva2k 0:1802fb31b938 173 volatile USB_INT32U IntTable[32]; /* Interrupt Table */
iva2k 0:1802fb31b938 174 volatile USB_INT32U FrameNumber; /* Frame Number */
iva2k 0:1802fb31b938 175 volatile USB_INT32U DoneHead; /* Done Head */
iva2k 0:1802fb31b938 176 volatile USB_INT08U Reserved[116]; /* Reserved for future use */
iva2k 0:1802fb31b938 177 volatile USB_INT08U Unknown[4]; /* Unused */
iva2k 0:1802fb31b938 178 } HCCA;
iva2k 0:1802fb31b938 179
iva2k 0:1802fb31b938 180 /*
iva2k 0:1802fb31b938 181 **************************************************************************************************************
iva2k 0:1802fb31b938 182 * EXTERN DECLARATIONS
iva2k 0:1802fb31b938 183 **************************************************************************************************************
iva2k 0:1802fb31b938 184 */
iva2k 0:1802fb31b938 185
iva2k 0:1802fb31b938 186 extern volatile HCED *EDBulkIn; /* BulkIn endpoint descriptor structure */
iva2k 0:1802fb31b938 187 extern volatile HCED *EDBulkOut; /* BulkOut endpoint descriptor structure */
iva2k 0:1802fb31b938 188 extern volatile HCTD *TDHead; /* Head transfer descriptor structure */
iva2k 0:1802fb31b938 189 extern volatile HCTD *TDTail; /* Tail transfer descriptor structure */
iva2k 0:1802fb31b938 190 extern volatile USB_INT08U *TDBuffer; /* Current Buffer Pointer of transfer descriptor */
iva2k 0:1802fb31b938 191 extern volatile USB_INT08U *FATBuffer; /* Buffer used by FAT file system */
iva2k 0:1802fb31b938 192 extern volatile USB_INT08U *UserBuffer; /* Buffer used by application */
iva2k 0:1802fb31b938 193
iva2k 0:1802fb31b938 194 /*
iva2k 0:1802fb31b938 195 **************************************************************************************************************
iva2k 0:1802fb31b938 196 * FUNCTION PROTOTYPES
iva2k 0:1802fb31b938 197 **************************************************************************************************************
iva2k 0:1802fb31b938 198 */
iva2k 0:1802fb31b938 199
iva2k 0:1802fb31b938 200 void Host_Init (void);
iva2k 0:1802fb31b938 201
iva2k 0:1802fb31b938 202 //void USB_IRQHandler(void) __irq;
iva2k 0:1802fb31b938 203 extern "C" void USB_IRQHandler(void) __irq;
iva2k 0:1802fb31b938 204
iva2k 0:1802fb31b938 205 USB_INT32S Host_EnumDev (void);
iva2k 0:1802fb31b938 206
iva2k 0:1802fb31b938 207 USB_INT32S Host_ProcessTD(volatile HCED *ed,
iva2k 0:1802fb31b938 208 volatile USB_INT32U token,
iva2k 0:1802fb31b938 209 volatile USB_INT08U *buffer,
iva2k 0:1802fb31b938 210 USB_INT32U buffer_len);
iva2k 0:1802fb31b938 211
iva2k 0:1802fb31b938 212 void Host_DelayUS ( USB_INT32U delay);
iva2k 0:1802fb31b938 213 void Host_DelayMS ( USB_INT32U delay);
iva2k 0:1802fb31b938 214
iva2k 0:1802fb31b938 215
iva2k 0:1802fb31b938 216 void Host_TDInit (volatile HCTD *td);
iva2k 0:1802fb31b938 217 void Host_EDInit (volatile HCED *ed);
iva2k 0:1802fb31b938 218 void Host_HCCAInit (volatile HCCA *hcca);
iva2k 0:1802fb31b938 219
iva2k 0:1802fb31b938 220 USB_INT32S Host_CtrlRecv ( USB_INT08U bm_request_type,
iva2k 0:1802fb31b938 221 USB_INT08U b_request,
iva2k 0:1802fb31b938 222 USB_INT16U w_value,
iva2k 0:1802fb31b938 223 USB_INT16U w_index,
iva2k 0:1802fb31b938 224 USB_INT16U w_length,
iva2k 0:1802fb31b938 225 volatile USB_INT08U *buffer);
iva2k 0:1802fb31b938 226
iva2k 0:1802fb31b938 227 USB_INT32S Host_CtrlSend ( USB_INT08U bm_request_type,
iva2k 0:1802fb31b938 228 USB_INT08U b_request,
iva2k 0:1802fb31b938 229 USB_INT16U w_value,
iva2k 0:1802fb31b938 230 USB_INT16U w_index,
iva2k 0:1802fb31b938 231 USB_INT16U w_length,
iva2k 0:1802fb31b938 232 volatile USB_INT08U *buffer);
iva2k 0:1802fb31b938 233
iva2k 0:1802fb31b938 234 void Host_FillSetup( USB_INT08U bm_request_type,
iva2k 0:1802fb31b938 235 USB_INT08U b_request,
iva2k 0:1802fb31b938 236 USB_INT16U w_value,
iva2k 0:1802fb31b938 237 USB_INT16U w_index,
iva2k 0:1802fb31b938 238 USB_INT16U w_length);
iva2k 0:1802fb31b938 239
iva2k 0:1802fb31b938 240
iva2k 0:1802fb31b938 241 void Host_WDHWait (void);
iva2k 0:1802fb31b938 242
iva2k 0:1802fb31b938 243
iva2k 0:1802fb31b938 244 USB_INT32U ReadLE32U (volatile USB_INT08U *pmem);
iva2k 0:1802fb31b938 245 void WriteLE32U (volatile USB_INT08U *pmem,
iva2k 0:1802fb31b938 246 USB_INT32U val);
iva2k 0:1802fb31b938 247 USB_INT16U ReadLE16U (volatile USB_INT08U *pmem);
iva2k 0:1802fb31b938 248 void WriteLE16U (volatile USB_INT08U *pmem,
iva2k 0:1802fb31b938 249 USB_INT16U val);
iva2k 0:1802fb31b938 250 USB_INT32U ReadBE32U (volatile USB_INT08U *pmem);
iva2k 0:1802fb31b938 251 void WriteBE32U (volatile USB_INT08U *pmem,
iva2k 0:1802fb31b938 252 USB_INT32U val);
iva2k 0:1802fb31b938 253 USB_INT16U ReadBE16U (volatile USB_INT08U *pmem);
iva2k 0:1802fb31b938 254 void WriteBE16U (volatile USB_INT08U *pmem,
iva2k 0:1802fb31b938 255 USB_INT16U val);
iva2k 0:1802fb31b938 256
iva2k 0:1802fb31b938 257 #endif