Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.
usbeh.h
00001 /**************************************************************************** 00002 * Copyright 2010 Andy Kirkham, Stellar Technologies Ltd 00003 * 00004 * This file is part of the Satellite Observers Workbench (SOWB). 00005 * 00006 * SOWB is free software: you can redistribute it and/or modify 00007 * it under the terms of the GNU General Public License as published by 00008 * the Free Software Foundation, either version 3 of the License, or 00009 * (at your option) any later version. 00010 * 00011 * SOWB is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with SOWB. If not, see <http://www.gnu.org/licenses/>. 00018 * 00019 * $Id: main.cpp 5 2010-07-12 20:51:11Z ajk $ 00020 * 00021 ***************************************************************************/ 00022 00023 #ifndef USBEH_H 00024 #define USBEH_H 00025 00026 #include "sowb.h" 00027 00028 /* Definitions */ 00029 #define USBEH_HcRevision LPC_USB->HcRevision 00030 #define USBEH_HcControl LPC_USB->HcControl 00031 #define USBEH_HcCommandStatus LPC_USB->HcCommandStatus 00032 #define USBEH_HcInterruptStatus LPC_USB->HcInterruptStatus 00033 #define USBEH_HcInterruptEnable LPC_USB->HcInterruptEnable 00034 #define USBEH_HcInterruptDisable LPC_USB->HcInterruptDisable 00035 #define USBEH_HcHCCA LPC_USB->HcHCCA 00036 #define USBEH_entED LPC_USB->entED 00037 #define USBEH_HcControlHeadED LPC_USB->HcControlHeadED 00038 #define USBEH_HcControlCurrentED LPC_USB->HcControlCurrentED 00039 #define USBEH_HcBulkHeadED LPC_USB->HcBulkHeadED 00040 #define USBEH_HcBulkCurrentED LPC_USB->HcBulkCurrentED 00041 #define USBEH_HcDoneHead LPC_USB->HcDoneHead 00042 #define USBEH_HcFmInterval LPC_USB->HcFmInterval 00043 #define USBEH_HcFmRemaining LPC_USB->HcFmRemaining 00044 #define USBEH_HcFmNumber LPC_USB->HcFmNumber 00045 #define USBEH_HcPeriodicStart LPC_USB->HcPeriodicStart 00046 #define USBEH_HcLSTreshold LPC_USB->HcLSTreshold 00047 #define USBEH_HcRhDescriptorA LPC_USB->HcRhDescriptorA 00048 #define USBEH_HcRhDescriptorB LPC_USB->HcRhDescriptorB 00049 #define USBEH_HcRhStatus LPC_USB->HcRhStatus 00050 #define USBEH_HcRhPortStatus1 LPC_USB->HcRhPortStatus1 00051 #define USBEH_HcRhPortStatus2 LPC_USB->HcRhPortStatus2 00052 #define USBEH_Module_ID LPC_USB->Module_ID 00053 #define USBEH_OTGIntSt LPC_USB->OTGIntSt 00054 #define USBEH_OTGIntEn LPC_USB->OTGIntEn 00055 #define USBEH_OTGIntSet LPC_USB->OTGIntSet 00056 #define USBEH_OTGIntClr LPC_USB->OTGIntClr 00057 #define USBEH_OTGStCtrl LPC_USB->OTGStCtrl 00058 #define USBEH_OTGTmr LPC_USB->OTGTmr 00059 #define USBEH_USBDevIntSt LPC_USB->USBDevIntSt 00060 #define USBEH_USBDevIntEn LPC_USB->USBDevIntEn 00061 #define USBEH_USBDevIntClr LPC_USB->USBDevIntClr 00062 #define USBEH_USBDevIntSet LPC_USB->USBDevIntSet 00063 #define USBEH_USBCmdCode LPC_USB->USBCmdCode 00064 #define USBEH_USBCmdData LPC_USB->USBCmdData 00065 #define USBEH_USBRxData LPC_USB->USBRxData 00066 #define USBEH_USBTxData LPC_USB->USBTxData 00067 #define USBEH_USBRxPLen LPC_USB->USBRxPLen 00068 #define USBEH_USBTxPLen LPC_USB->USBTxPLen 00069 #define USBEH_USBCtrl LPC_USB->USBCtrl 00070 #define USBEH_USBDevIntPri LPC_USB->USBDevIntPri 00071 #define USBEH_USBEpIntSt LPC_USB->USBEpIntSt 00072 #define USBEH_USBEpIntEn LPC_USB->USBEpIntEn 00073 #define USBEH_USBEpIntClr LPC_USB->USBEpIntClr 00074 #define USBEH_USBEpIntSet LPC_USB->USBEpIntSet 00075 #define USBEH_USBEpIntPri LPC_USB->USBEpIntPri 00076 #define USBEH_USBReEp LPC_USB->USBReEp 00077 #define USBEH_USBEpInd LPC_USB->USBEpInd 00078 #define USBEH_USBMaxPSize LPC_USB->USBMaxPSize 00079 #define USBEH_USBDMARSt LPC_USB->USBDMARSt 00080 #define USBEH_USBDMARClr LPC_USB->USBDMARClr 00081 #define USBEH_USBDMARSet LPC_USB->USBDMARSet 00082 #define USBEH_USBUDCAH LPC_USB->USBUDCAH 00083 #define USBEH_USBEpDMASt LPC_USB->USBEpDMASt 00084 #define USBEH_USBEpDMAEn LPC_USB->USBEpDMAEn 00085 #define USBEH_USBEpDMADis LPC_USB->USBEpDMADis 00086 #define USBEH_USBDMAIntSt LPC_USB->USBDMAIntSt 00087 #define USBEH_USBDMAIntEn LPC_USB->USBDMAIntEn 00088 #define USBEH_USBEoTIntSt LPC_USB->USBEoTIntSt 00089 #define USBEH_USBEoTIntClr LPC_USB->USBEoTIntClr 00090 #define USBEH_USBEoTIntSet LPC_USB->USBEoTIntSet 00091 #define USBEH_USBNDDRIntSt LPC_USB->USBNDDRIntSt 00092 #define USBEH_USBNDDRIntClr LPC_USB->USBNDDRIntClr 00093 #define USBEH_USBNDDRIntSet LPC_USB->USBNDDRIntSet 00094 #define USBEH_USBSysErrIntSt LPC_USB->USBSysErrIntSt 00095 #define USBEH_USBSysErrIntClr LPC_USB->USBSysErrIntClr 00096 #define USBEH_USBSysErrIntSet LPC_USB->USBSysErrIntSet 00097 #define USBEH_I2C_RX LPC_USB->I2C_RX 00098 #define USBEH_I2C_WO LPC_USB->I2C_WO 00099 #define USBEH_I2C_STS LPC_USB->I2C_STS 00100 #define USBEH_I2C_CTL LPC_USB->I2C_CTL 00101 #define USBEH_I2C_CLKHI LPC_USB->I2C_CLKHI 00102 #define USBEH_I2C_CLKLO LPC_USB->I2C_CLKLO 00103 #define USBEH_USBClkCtrl LPC_USB->USBClkCtrl 00104 #define USBEH_OTGClkCtrl LPC_USB->OTGClkCtrl 00105 #define USBEH_USBClkSt LPC_USB->USBClkSt 00106 #define USBEH_OTGClkSt LPC_USB->OTGClkSt 00107 00108 void user_wait_ms(uint32_t ms); 00109 //#define USBEH_OS_DELAY_MS(x) wait_ms(x); 00110 #define USBEH_OS_DELAY_MS(x) user_wait_ms(x); 00111 00112 #define USBEH_U32 uint32_t 00113 #define USBEH_U16 unsigned short int 00114 #define USBEH_U08 unsigned char 00115 #define USBEH_S32 int32_t 00116 #define USBEH_S16 short int 00117 #define USBEH_S08 char 00118 00119 #define USBEH_MAX_ENDPOINTS_TOTAL 16 00120 #define USBEH_MAX_DEVICES 8 00121 #define USBEH_MAX_ENDPOINTS_PER_DEVICE 8 00122 00123 #define USBEH_ENDPOINT_CONTROL 0 00124 #define USBEH_ENDPOINT_ISOCRONOUS 1 00125 #define USBEH_ENDPOINT_BULK 2 00126 #define USBEH_ENDPOINT_INTERRUPT 3 00127 00128 #define USBEH_DESCRIPTOR_TYPE_DEVICE 1 00129 #define USBEH_DESCRIPTOR_TYPE_CONFIGURATION 2 00130 #define USBEH_DESCRIPTOR_TYPE_STRING 3 00131 #define USBEH_DESCRIPTOR_TYPE_INTERFACE 4 00132 #define USBEH_DESCRIPTOR_TYPE_ENDPOINT 5 00133 00134 #define USBEH_DESCRIPTOR_TYPE_HID 0x21 00135 #define USBEH_DESCRIPTOR_TYPE_REPORT 0x22 00136 #define USBEH_DESCRIPTOR_TYPE_PHYSICAL 0x23 00137 #define USBEH_DESCRIPTOR_TYPE_HUB 0x29 00138 00139 #define USBEH_HOST_CLK_EN (1 << 0) 00140 #define USBEH_PORTSEL_CLK_EN (1 << 3) 00141 #define USBEH_AHB_CLK_EN (1 << 4) 00142 #define USBEH_CLOCK_MASK (USBEH_HOST_CLK_EN | USBEH_PORTSEL_CLK_EN | USBEH_AHB_CLK_EN) 00143 #define USBEH_FRAMEINTERVAL (12000-1) // 1ms 00144 #define USBEH_DEFAULT_FMINTERVAL ((((6 * (USBEH_FRAMEINTERVAL - 210)) / 7) << 16) | USBEH_FRAMEINTERVAL) 00145 #define USBEH_HOST_CONTROLLER_RESET 0x01 00146 #define USBEH_HOST_CONTROLLER_FUNCTIONAL_STATE 0xC0 00147 #define USBEH_OPERATIONAL_MASK 0x80 00148 #define USBEH_SET_GLOBAL_POWER 0x00010000 00149 00150 #define USBEH_WRITEBACK_DONE_HEAD 0x00000002 00151 #define USBEH_START_OF_FRAME 0x00000004 00152 #define USBEH_RESUME_DETECTED 0x00000008 00153 #define USBEH_UNRECOVERABLE_ERROR 0x00000010 00154 #define USBEH_FRAME_NUMBER_OVERFLOW 0x00000020 00155 #define USBEH_ROOT_HUB_STATUS_CHANGE 0x00000040 00156 #define USBEH_OWNERSHIP_CHANGE 0x00000080 00157 #define USBEH_MASTER_IRQ_ENABLE 0x80000000 00158 00159 enum USB_CLASS_CODE { 00160 CLASS_DEVICE, 00161 CLASS_AUDIO, 00162 CLASS_COMM_AND_CDC_CONTROL, 00163 CLASS_HID, 00164 CLASS_PHYSICAL = 0x05, 00165 CLASS_STILL_IMAGING, 00166 CLASS_PRINTER, 00167 CLASS_MASS_STORAGE, 00168 CLASS_HUB, 00169 CLASS_CDC_DATA, 00170 CLASS_SMART_CARD, 00171 CLASS_CONTENT_SECURITY = 0x0D, 00172 CLASS_VIDEO = 0x0E, 00173 CLASS_DIAGNOSTIC_DEVICE = 0xDC, 00174 CLASS_WIRELESS_CONTROLLER = 0xE0, 00175 CLASS_MISCELLANEOUS = 0xEF, 00176 CLASS_APP_SPECIFIC = 0xFE, 00177 CLASS_VENDOR_SPECIFIC = 0xFF 00178 }; 00179 00180 #define USBEH_DEVICE_TO_HOST 0x80 00181 #define USBEH_HOST_TO_DEVICE 0x00 00182 #define USBEH_REQUEST_TYPE_CLASS 0x20 00183 #define USBEH_RECIPIENT_DEVICE 0x00 00184 #define USBEH_RECIPIENT_INTERFACE 0x01 00185 #define USBEH_RECIPIENT_ENDPOINT 0x02 00186 #define USBEH_RECIPIENT_OTHER 0x03 00187 00188 #define USBEH_SETUP_TYPE_MASK_STANDARD 0x00 00189 #define USBEH_SETUP_TYPE_MASK_CLASS 0x20 00190 #define USBEH_SETUP_TYPE_MASK_VENDOR 0x40 00191 #define USBEH_SETUP_TYPE_MASK_RESERVED 0x60 00192 00193 #define USBEH_GET_STATUS 0 00194 #define USBEH_CLEAR_FEATURE 1 00195 #define USBEH_SET_FEATURE 3 00196 #define USBEH_SET_ADDRESS 5 00197 #define USBEH_GET_DESCRIPTOR 6 00198 #define USBEH_SET_DESCRIPTOR 7 00199 #define USBEH_GET_CONFIGURATION 8 00200 #define USBEH_SET_CONFIGURATION 9 00201 #define USBEH_GET_INTERFACE 10 00202 #define USBEH_SET_INTERFACE 11 00203 #define USBEH_SYNCH_FRAME 11 00204 00205 // Status flags from hub 00206 #define USBEH_PORT_CONNECTION 0 00207 #define USBEH_PORT_ENABLE 1 00208 #define USBEH_PORT_SUSPEND 2 00209 #define USBEH_PORT_OVER_CURRENT 3 00210 #define USBEH_PORT_RESET 4 00211 #define USBEH_PORT_POWER 8 00212 #define USBEH_PORT_LOW_SPEED 9 00213 00214 #define USBEH_C_PORT_CONNECTION 16 00215 #define USBEH_C_PORT_ENABLE 17 00216 #define USBEH_C_PORT_SUSPEND 18 00217 #define USBEH_C_PORT_OVER_CURRENT 19 00218 #define USBEH_C_PORT_RESET 20 00219 00220 #define USBEH_IO_PENDING -100 00221 #define USBEH_ERR_ENDPOINT_NONE_LEFT -101 00222 #define USBEH_ERR_ENDPOINT_NOT_FOUND -102 00223 #define USBEH_ERR_DEVICE_NOT_FOUND -103 00224 #define USBEH_ERR_DEVICE_NONE_LEFT -104 00225 #define USBEH_ERR_HUB_INIT_FAILED -105 00226 #define USBEH_ERR_INTERFACE_NOT_FOUND -106 00227 00228 #define USBEH_TOKEN_SETUP 0 00229 #define USBEH_TOKEN_IN 1 00230 #define USBEH_TOKEN_OUT 2 00231 00232 #define USBEH_TD_ROUNDING (USBEH_U32)0x00040000 00233 #define USBEH_TD_SETUP (USBEH_U32)0x00000000 00234 #define USBEH_TD_IN (USBEH_U32)0x00100000 00235 #define USBEH_TD_OUT (USBEH_U32)0x00080000 00236 #define USBEH_TD_DELAY_INT(x) (USBEH_U32)((x) << 21) 00237 #define USBEH_TD_TOGGLE_0 (USBEH_U32)0x02000000 00238 #define USBEH_TD_TOGGLE_1 (USBEH_U32)0x03000000 00239 #define USBEH_TD_CC (USBEH_U32)0xF0000000 00240 00241 typedef struct { 00242 USBEH_U08 bLength; 00243 USBEH_U08 bDescriptorType; 00244 USBEH_U16 bcdUSB; 00245 USBEH_U08 bDeviceClass; 00246 USBEH_U08 bDeviceSubClass; 00247 USBEH_U08 bDeviceProtocol; 00248 USBEH_U08 bMaxPacketSize; 00249 USBEH_U16 idVendor; 00250 USBEH_U16 idProduct; 00251 USBEH_U16 bcdDevice; 00252 USBEH_U08 iManufacturer; 00253 USBEH_U08 iProduct; 00254 USBEH_U08 iSerialNumber; 00255 USBEH_U08 bNumConfigurations; 00256 } USBEH_deviceDescriptor; 00257 00258 typedef struct { 00259 USBEH_U08 bLength; 00260 USBEH_U08 bDescriptorType; 00261 USBEH_U16 wTotalLength; 00262 USBEH_U08 bNumInterfaces; 00263 USBEH_U08 bConfigurationValue; 00264 USBEH_U08 iConfiguration; 00265 USBEH_U08 bmAttributes; 00266 USBEH_U08 bMaxPower; 00267 } USBEH_configurationDescriptor; 00268 00269 typedef struct { 00270 USBEH_U08 bLength; 00271 USBEH_U08 bDescriptorType; 00272 USBEH_U08 bInterfaceNumber; 00273 USBEH_U08 bAlternateSetting; 00274 USBEH_U08 bNumEndpoints; 00275 USBEH_U08 bInterfaceClass; 00276 USBEH_U08 bInterfaceSubClass; 00277 USBEH_U08 bInterfaceProtocol; 00278 USBEH_U08 iInterface; 00279 } USBEH_interfaceDescriptor; 00280 00281 typedef struct { 00282 USBEH_U08 bLength; 00283 USBEH_U08 bDescriptorType; 00284 USBEH_U08 bEndpointAddress; 00285 USBEH_U08 bmAttributes; 00286 USBEH_U16 wMaxPacketSize; 00287 USBEH_U08 bInterval; 00288 } USBEH_endpointDescriptor; 00289 00290 typedef struct { 00291 USBEH_U08 bLength; 00292 USBEH_U08 bDescriptorType; 00293 USBEH_U16 bcdHID; 00294 USBEH_U08 bCountryCode; 00295 USBEH_U08 bNumDescriptors; 00296 USBEH_U08 bDescriptorType2; 00297 USBEH_U16 wDescriptorLength; 00298 } USBEH_HIDDescriptor; 00299 00300 typedef struct { 00301 volatile USBEH_U32 control; 00302 volatile USBEH_U32 tailTd; 00303 volatile USBEH_U32 headTd; 00304 volatile USBEH_U32 next; 00305 } USBEH_HCED; 00306 00307 typedef struct { 00308 volatile USBEH_U32 control; 00309 volatile USBEH_U32 currentBufferPointer; 00310 volatile USBEH_U32 next; 00311 volatile USBEH_U32 bufferEnd; 00312 } USBEH_HCTD; 00313 00314 typedef struct { 00315 volatile USBEH_U32 interruptTable[32]; 00316 volatile USBEH_U16 frameNumber; 00317 volatile USBEH_U16 frameNumberPad; 00318 volatile USBEH_U32 doneHead; 00319 volatile USBEH_U08 Reserved[120]; 00320 } USBEH_HCCA; 00321 00322 typedef struct { 00323 USBEH_U08 bm_request_type; 00324 USBEH_U08 b_request; 00325 USBEH_U16 w_value; 00326 USBEH_U16 w_index; 00327 USBEH_U16 w_length; 00328 } USBEH_Setup; 00329 00330 typedef void (*USBEH_callback)(int device, int endpoint, int status, USBEH_U08* data, int len, void* userData); 00331 00332 #define USBEH_SOF_COUNTER_INC 1 00333 #define USBEH_SOF_COUNTER_DEC 2 00334 #define USBEH_SOF_COUNTER_DEC_HALT_AT_ZERO 4 00335 #define USBEH_SOF_COUNTER_RELOAD 8 00336 00337 typedef struct _sof_counter { 00338 USBEH_U08 mode; 00339 USBEH_U08 flag; 00340 USBEH_U32 counter; 00341 USBEH_U32 reload; 00342 USBEH_U32 userData; 00343 void (*callback)(struct _sof_counter *); 00344 _sof_counter *next; 00345 } USBEH_SOF_COUNTER; 00346 00347 //typedef void (*USBCallback)(int device, int endpoint, int status, USBEH_U08* data, int len, void* userData); 00348 00349 00350 // Macros. 00351 00352 #define USBEH_CURRENT_CONNECT_STATUS 0x01 00353 #define USBEH_CONNECT_STATUS_CHANGE (USBEH_CURRENT_CONNECT_STATUS << 16) 00354 #define USBEH_PORT_RESET_STATUS 0x10 00355 #define USBEH_PORT_RESET_STATUS_CAHNGE (USBEH_PORT_RESET_STATUS << 16) 00356 #define USBEH_CONTROL_LIST_ENABLE 0x10 00357 #define USBEH_CONTROL_LIST_FILLED 0x02; 00358 #define USBEH_BULK_LIST_ENABLE 0x20 00359 #define USBEH_BULK_LIST_FILLED 0x04 00360 #define USBEH_PERIODIC_LIST_ENABLE 0x04 00361 #define USBEH_PORT_RESET_STATUS 0x10 00362 #define USBEH_PORT_RESET_STATUS_CHANGE (USBEH_PORT_RESET_STATUS << 16) 00363 #define USBEH_LOW_SPEED_DEVICE 0x200 00364 #define USBEH_HIGH_SPEED_DEVICE 0x400 00365 00366 #endif
Generated on Tue Jul 12 2022 18:05:35 by 1.7.2