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

Dependencies:   mbed

usbeh/usbeh.h

Committer:
AjK
Date:
2010-10-11
Revision:
0:0a841b89d614

File content as of revision 0:0a841b89d614:

/****************************************************************************
 *    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