Satellite Observers Workbench. NOT yet complete, just published for forum posters to \"cherry pick\" pieces of code as requiered as an example.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers usbeh.h Source File

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