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

Dependencies:   mbed

Revision:
0:0a841b89d614
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usbeh/usbeh.h	Mon Oct 11 10:34:55 2010 +0000
@@ -0,0 +1,366 @@
+/****************************************************************************
+ *    Copyright 2010 Andy Kirkham, Stellar Technologies Ltd
+ *    
+ *    This file is part of the Satellite Observers Workbench (SOWB).
+ *
+ *    SOWB is free software: you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation, either version 3 of the License, or
+ *    (at your option) any later version.
+ *
+ *    SOWB is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with SOWB.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *    $Id: main.cpp 5 2010-07-12 20:51:11Z ajk $
+ *    
+ ***************************************************************************/
+ 
+#ifndef USBEH_H
+#define USBEH_H
+
+#include "sowb.h"
+
+/* Definitions */
+#define USBEH_HcRevision            LPC_USB->HcRevision
+#define USBEH_HcControl             LPC_USB->HcControl
+#define USBEH_HcCommandStatus       LPC_USB->HcCommandStatus
+#define USBEH_HcInterruptStatus     LPC_USB->HcInterruptStatus
+#define USBEH_HcInterruptEnable     LPC_USB->HcInterruptEnable
+#define USBEH_HcInterruptDisable    LPC_USB->HcInterruptDisable
+#define USBEH_HcHCCA                LPC_USB->HcHCCA
+#define USBEH_entED                 LPC_USB->entED
+#define USBEH_HcControlHeadED       LPC_USB->HcControlHeadED
+#define USBEH_HcControlCurrentED    LPC_USB->HcControlCurrentED
+#define USBEH_HcBulkHeadED          LPC_USB->HcBulkHeadED
+#define USBEH_HcBulkCurrentED       LPC_USB->HcBulkCurrentED
+#define USBEH_HcDoneHead            LPC_USB->HcDoneHead
+#define USBEH_HcFmInterval          LPC_USB->HcFmInterval
+#define USBEH_HcFmRemaining         LPC_USB->HcFmRemaining
+#define USBEH_HcFmNumber            LPC_USB->HcFmNumber
+#define USBEH_HcPeriodicStart       LPC_USB->HcPeriodicStart
+#define USBEH_HcLSTreshold          LPC_USB->HcLSTreshold
+#define USBEH_HcRhDescriptorA       LPC_USB->HcRhDescriptorA
+#define USBEH_HcRhDescriptorB       LPC_USB->HcRhDescriptorB
+#define USBEH_HcRhStatus            LPC_USB->HcRhStatus
+#define USBEH_HcRhPortStatus1       LPC_USB->HcRhPortStatus1
+#define USBEH_HcRhPortStatus2       LPC_USB->HcRhPortStatus2
+#define USBEH_Module_ID             LPC_USB->Module_ID
+#define USBEH_OTGIntSt              LPC_USB->OTGIntSt
+#define USBEH_OTGIntEn              LPC_USB->OTGIntEn
+#define USBEH_OTGIntSet             LPC_USB->OTGIntSet
+#define USBEH_OTGIntClr             LPC_USB->OTGIntClr
+#define USBEH_OTGStCtrl             LPC_USB->OTGStCtrl
+#define USBEH_OTGTmr                LPC_USB->OTGTmr
+#define USBEH_USBDevIntSt           LPC_USB->USBDevIntSt
+#define USBEH_USBDevIntEn           LPC_USB->USBDevIntEn
+#define USBEH_USBDevIntClr          LPC_USB->USBDevIntClr
+#define USBEH_USBDevIntSet          LPC_USB->USBDevIntSet
+#define USBEH_USBCmdCode            LPC_USB->USBCmdCode
+#define USBEH_USBCmdData            LPC_USB->USBCmdData
+#define USBEH_USBRxData             LPC_USB->USBRxData
+#define USBEH_USBTxData             LPC_USB->USBTxData
+#define USBEH_USBRxPLen             LPC_USB->USBRxPLen
+#define USBEH_USBTxPLen             LPC_USB->USBTxPLen
+#define USBEH_USBCtrl               LPC_USB->USBCtrl
+#define USBEH_USBDevIntPri          LPC_USB->USBDevIntPri
+#define USBEH_USBEpIntSt            LPC_USB->USBEpIntSt
+#define USBEH_USBEpIntEn            LPC_USB->USBEpIntEn
+#define USBEH_USBEpIntClr           LPC_USB->USBEpIntClr
+#define USBEH_USBEpIntSet           LPC_USB->USBEpIntSet
+#define USBEH_USBEpIntPri           LPC_USB->USBEpIntPri
+#define USBEH_USBReEp               LPC_USB->USBReEp
+#define USBEH_USBEpInd              LPC_USB->USBEpInd
+#define USBEH_USBMaxPSize           LPC_USB->USBMaxPSize
+#define USBEH_USBDMARSt             LPC_USB->USBDMARSt
+#define USBEH_USBDMARClr            LPC_USB->USBDMARClr
+#define USBEH_USBDMARSet            LPC_USB->USBDMARSet
+#define USBEH_USBUDCAH              LPC_USB->USBUDCAH
+#define USBEH_USBEpDMASt            LPC_USB->USBEpDMASt
+#define USBEH_USBEpDMAEn            LPC_USB->USBEpDMAEn
+#define USBEH_USBEpDMADis           LPC_USB->USBEpDMADis
+#define USBEH_USBDMAIntSt           LPC_USB->USBDMAIntSt
+#define USBEH_USBDMAIntEn           LPC_USB->USBDMAIntEn
+#define USBEH_USBEoTIntSt           LPC_USB->USBEoTIntSt
+#define USBEH_USBEoTIntClr          LPC_USB->USBEoTIntClr
+#define USBEH_USBEoTIntSet          LPC_USB->USBEoTIntSet
+#define USBEH_USBNDDRIntSt          LPC_USB->USBNDDRIntSt
+#define USBEH_USBNDDRIntClr         LPC_USB->USBNDDRIntClr
+#define USBEH_USBNDDRIntSet         LPC_USB->USBNDDRIntSet
+#define USBEH_USBSysErrIntSt        LPC_USB->USBSysErrIntSt
+#define USBEH_USBSysErrIntClr       LPC_USB->USBSysErrIntClr
+#define USBEH_USBSysErrIntSet       LPC_USB->USBSysErrIntSet
+#define USBEH_I2C_RX                LPC_USB->I2C_RX
+#define USBEH_I2C_WO                LPC_USB->I2C_WO
+#define USBEH_I2C_STS               LPC_USB->I2C_STS
+#define USBEH_I2C_CTL               LPC_USB->I2C_CTL
+#define USBEH_I2C_CLKHI             LPC_USB->I2C_CLKHI
+#define USBEH_I2C_CLKLO             LPC_USB->I2C_CLKLO
+#define USBEH_USBClkCtrl            LPC_USB->USBClkCtrl
+#define USBEH_OTGClkCtrl            LPC_USB->OTGClkCtrl
+#define USBEH_USBClkSt              LPC_USB->USBClkSt
+#define USBEH_OTGClkSt              LPC_USB->OTGClkSt
+
+void user_wait_ms(uint32_t ms);
+//#define USBEH_OS_DELAY_MS(x)    wait_ms(x);
+#define USBEH_OS_DELAY_MS(x)    user_wait_ms(x);
+
+#define USBEH_U32   uint32_t
+#define USBEH_U16   unsigned short int
+#define USBEH_U08   unsigned char
+#define USBEH_S32   int32_t
+#define USBEH_S16   short int
+#define USBEH_S08   char
+
+#define USBEH_MAX_ENDPOINTS_TOTAL       16
+#define USBEH_MAX_DEVICES               8
+#define USBEH_MAX_ENDPOINTS_PER_DEVICE  8
+
+#define USBEH_ENDPOINT_CONTROL 0
+#define USBEH_ENDPOINT_ISOCRONOUS 1
+#define USBEH_ENDPOINT_BULK 2
+#define USBEH_ENDPOINT_INTERRUPT 3
+
+#define USBEH_DESCRIPTOR_TYPE_DEVICE        1
+#define USBEH_DESCRIPTOR_TYPE_CONFIGURATION 2
+#define USBEH_DESCRIPTOR_TYPE_STRING        3
+#define USBEH_DESCRIPTOR_TYPE_INTERFACE     4
+#define USBEH_DESCRIPTOR_TYPE_ENDPOINT      5
+
+#define USBEH_DESCRIPTOR_TYPE_HID         0x21
+#define USBEH_DESCRIPTOR_TYPE_REPORT      0x22
+#define USBEH_DESCRIPTOR_TYPE_PHYSICAL    0x23
+#define USBEH_DESCRIPTOR_TYPE_HUB         0x29
+
+#define USBEH_HOST_CLK_EN                       (1 << 0)
+#define USBEH_PORTSEL_CLK_EN                    (1 << 3)
+#define USBEH_AHB_CLK_EN                        (1 << 4)
+#define USBEH_CLOCK_MASK                        (USBEH_HOST_CLK_EN | USBEH_PORTSEL_CLK_EN | USBEH_AHB_CLK_EN)
+#define USBEH_FRAMEINTERVAL                     (12000-1)    // 1ms
+#define USBEH_DEFAULT_FMINTERVAL                ((((6 * (USBEH_FRAMEINTERVAL - 210)) / 7) << 16) | USBEH_FRAMEINTERVAL)
+#define USBEH_HOST_CONTROLLER_RESET             0x01
+#define USBEH_HOST_CONTROLLER_FUNCTIONAL_STATE  0xC0
+#define USBEH_OPERATIONAL_MASK                  0x80
+#define USBEH_SET_GLOBAL_POWER                  0x00010000
+
+#define USBEH_WRITEBACK_DONE_HEAD       0x00000002
+#define USBEH_START_OF_FRAME            0x00000004
+#define USBEH_RESUME_DETECTED           0x00000008
+#define USBEH_UNRECOVERABLE_ERROR       0x00000010
+#define USBEH_FRAME_NUMBER_OVERFLOW     0x00000020
+#define USBEH_ROOT_HUB_STATUS_CHANGE    0x00000040
+#define USBEH_OWNERSHIP_CHANGE          0x00000080
+#define USBEH_MASTER_IRQ_ENABLE         0x80000000
+    
+enum USB_CLASS_CODE {
+    CLASS_DEVICE,
+    CLASS_AUDIO,
+    CLASS_COMM_AND_CDC_CONTROL,
+    CLASS_HID,
+    CLASS_PHYSICAL = 0x05,
+    CLASS_STILL_IMAGING,
+    CLASS_PRINTER,
+    CLASS_MASS_STORAGE,
+    CLASS_HUB,
+    CLASS_CDC_DATA,
+    CLASS_SMART_CARD,
+    CLASS_CONTENT_SECURITY      = 0x0D,
+    CLASS_VIDEO                 = 0x0E,
+    CLASS_DIAGNOSTIC_DEVICE     = 0xDC,
+    CLASS_WIRELESS_CONTROLLER   = 0xE0,
+    CLASS_MISCELLANEOUS         = 0xEF,
+    CLASS_APP_SPECIFIC          = 0xFE,
+    CLASS_VENDOR_SPECIFIC       = 0xFF
+};
+
+#define USBEH_DEVICE_TO_HOST         0x80
+#define USBEH_HOST_TO_DEVICE         0x00
+#define USBEH_REQUEST_TYPE_CLASS     0x20
+#define USBEH_RECIPIENT_DEVICE       0x00
+#define USBEH_RECIPIENT_INTERFACE    0x01
+#define USBEH_RECIPIENT_ENDPOINT     0x02
+#define USBEH_RECIPIENT_OTHER        0x03
+
+#define USBEH_SETUP_TYPE_MASK_STANDARD  0x00
+#define USBEH_SETUP_TYPE_MASK_CLASS     0x20
+#define USBEH_SETUP_TYPE_MASK_VENDOR    0x40
+#define USBEH_SETUP_TYPE_MASK_RESERVED  0x60
+
+#define USBEH_GET_STATUS            0
+#define USBEH_CLEAR_FEATURE         1
+#define USBEH_SET_FEATURE           3
+#define USBEH_SET_ADDRESS           5
+#define USBEH_GET_DESCRIPTOR        6
+#define USBEH_SET_DESCRIPTOR        7
+#define USBEH_GET_CONFIGURATION     8
+#define USBEH_SET_CONFIGURATION     9
+#define USBEH_GET_INTERFACE         10
+#define USBEH_SET_INTERFACE         11
+#define USBEH_SYNCH_FRAME           11
+
+//    Status flags from hub
+#define USBEH_PORT_CONNECTION       0
+#define USBEH_PORT_ENABLE           1
+#define USBEH_PORT_SUSPEND          2
+#define USBEH_PORT_OVER_CURRENT     3
+#define USBEH_PORT_RESET            4
+#define USBEH_PORT_POWER            8
+#define USBEH_PORT_LOW_SPEED        9
+
+#define USBEH_C_PORT_CONNECTION     16
+#define USBEH_C_PORT_ENABLE         17
+#define USBEH_C_PORT_SUSPEND        18
+#define USBEH_C_PORT_OVER_CURRENT   19
+#define USBEH_C_PORT_RESET          20
+
+#define USBEH_IO_PENDING                -100
+#define USBEH_ERR_ENDPOINT_NONE_LEFT    -101
+#define USBEH_ERR_ENDPOINT_NOT_FOUND    -102
+#define USBEH_ERR_DEVICE_NOT_FOUND      -103
+#define USBEH_ERR_DEVICE_NONE_LEFT      -104
+#define USBEH_ERR_HUB_INIT_FAILED       -105
+#define USBEH_ERR_INTERFACE_NOT_FOUND   -106
+
+#define USBEH_TOKEN_SETUP   0
+#define USBEH_TOKEN_IN      1
+#define USBEH_TOKEN_OUT     2
+
+#define USBEH_TD_ROUNDING      (USBEH_U32)0x00040000
+#define USBEH_TD_SETUP         (USBEH_U32)0x00000000
+#define USBEH_TD_IN            (USBEH_U32)0x00100000
+#define USBEH_TD_OUT           (USBEH_U32)0x00080000
+#define USBEH_TD_DELAY_INT(x)  (USBEH_U32)((x) << 21)
+#define USBEH_TD_TOGGLE_0      (USBEH_U32)0x02000000
+#define USBEH_TD_TOGGLE_1      (USBEH_U32)0x03000000
+#define USBEH_TD_CC            (USBEH_U32)0xF0000000
+
+typedef struct {
+    USBEH_U08   bLength;
+    USBEH_U08   bDescriptorType;
+    USBEH_U16   bcdUSB;
+    USBEH_U08   bDeviceClass;
+    USBEH_U08   bDeviceSubClass;
+    USBEH_U08   bDeviceProtocol;
+    USBEH_U08   bMaxPacketSize;
+    USBEH_U16   idVendor;
+    USBEH_U16   idProduct;
+    USBEH_U16   bcdDevice;    
+    USBEH_U08   iManufacturer;
+    USBEH_U08   iProduct;
+    USBEH_U08   iSerialNumber;
+    USBEH_U08   bNumConfigurations;
+} USBEH_deviceDescriptor;
+
+typedef struct {
+    USBEH_U08   bLength;
+    USBEH_U08   bDescriptorType;
+    USBEH_U16   wTotalLength;
+    USBEH_U08   bNumInterfaces;
+    USBEH_U08   bConfigurationValue;
+    USBEH_U08   iConfiguration;
+    USBEH_U08   bmAttributes;
+    USBEH_U08   bMaxPower;
+} USBEH_configurationDescriptor;
+
+typedef struct {
+    USBEH_U08   bLength;
+    USBEH_U08   bDescriptorType;
+    USBEH_U08   bInterfaceNumber;
+    USBEH_U08   bAlternateSetting;
+    USBEH_U08   bNumEndpoints;
+    USBEH_U08   bInterfaceClass;
+    USBEH_U08   bInterfaceSubClass;
+    USBEH_U08   bInterfaceProtocol;
+    USBEH_U08   iInterface;
+} USBEH_interfaceDescriptor;
+
+typedef struct {
+    USBEH_U08   bLength;
+    USBEH_U08   bDescriptorType;
+    USBEH_U08   bEndpointAddress;
+    USBEH_U08   bmAttributes;
+    USBEH_U16   wMaxPacketSize;
+    USBEH_U08   bInterval;
+} USBEH_endpointDescriptor;
+
+typedef struct {
+  USBEH_U08 bLength;
+  USBEH_U08 bDescriptorType;
+  USBEH_U16 bcdHID;
+  USBEH_U08 bCountryCode;
+  USBEH_U08 bNumDescriptors;
+  USBEH_U08 bDescriptorType2;
+  USBEH_U16 wDescriptorLength;
+} USBEH_HIDDescriptor;
+
+typedef struct {
+    volatile USBEH_U32  control;
+    volatile USBEH_U32  tailTd;
+    volatile USBEH_U32  headTd;
+    volatile USBEH_U32  next;
+} USBEH_HCED;
+
+typedef struct {
+    volatile USBEH_U32  control;
+    volatile USBEH_U32  currentBufferPointer;
+    volatile USBEH_U32  next;
+    volatile USBEH_U32  bufferEnd;
+} USBEH_HCTD;
+
+typedef struct {
+    volatile USBEH_U32  interruptTable[32];
+    volatile USBEH_U16  frameNumber;
+    volatile USBEH_U16  frameNumberPad;
+    volatile USBEH_U32  doneHead;
+    volatile USBEH_U08  Reserved[120];
+} USBEH_HCCA;
+
+typedef struct {
+    USBEH_U08   bm_request_type;
+    USBEH_U08   b_request;
+    USBEH_U16   w_value;
+    USBEH_U16   w_index;
+    USBEH_U16   w_length;
+} USBEH_Setup;
+
+typedef void (*USBEH_callback)(int device, int endpoint, int status, USBEH_U08* data, int len, void* userData);
+
+#define USBEH_SOF_COUNTER_INC               1
+#define USBEH_SOF_COUNTER_DEC               2
+#define USBEH_SOF_COUNTER_DEC_HALT_AT_ZERO  4
+#define USBEH_SOF_COUNTER_RELOAD            8
+
+typedef struct _sof_counter {
+    USBEH_U08       mode;
+    USBEH_U08       flag;
+    USBEH_U32       counter;
+    USBEH_U32       reload;
+    USBEH_U32       userData;
+    void            (*callback)(struct _sof_counter *);
+    _sof_counter    *next;
+} USBEH_SOF_COUNTER;
+
+//typedef void (*USBCallback)(int device, int endpoint, int status, USBEH_U08* data, int len, void* userData);
+
+
+// Macros.
+
+#define USBEH_CURRENT_CONNECT_STATUS    0x01
+#define USBEH_CONNECT_STATUS_CHANGE     (USBEH_CURRENT_CONNECT_STATUS << 16)
+#define USBEH_PORT_RESET_STATUS         0x10
+#define USBEH_PORT_RESET_STATUS_CAHNGE  (USBEH_PORT_RESET_STATUS << 16)
+#define USBEH_CONTROL_LIST_ENABLE       0x10
+#define USBEH_CONTROL_LIST_FILLED       0x02;
+#define USBEH_BULK_LIST_ENABLE          0x20
+#define USBEH_BULK_LIST_FILLED          0x04
+#define USBEH_PERIODIC_LIST_ENABLE      0x04
+#define USBEH_PORT_RESET_STATUS         0x10
+#define USBEH_PORT_RESET_STATUS_CHANGE  (USBEH_PORT_RESET_STATUS << 16)
+#define USBEH_LOW_SPEED_DEVICE          0x200
+#define USBEH_HIGH_SPEED_DEVICE         0x400
+
+#endif
\ No newline at end of file