firmware/cdc.h
author root@rika
Thu, 23 Apr 2009 20:55:41 +0200
changeset 33 7a0c4b0354ba
parent 2 2f55e5dd591d
permissions -rw-r--r--
updated documentation
slime@2
     1
/*********************************************************************
slime@2
     2
 *
slime@2
     3
 *             Microchip USB C18 Firmware -  CDC Version 1.0
slime@2
     4
 *
slime@2
     5
 *********************************************************************
slime@2
     6
 * FileName:        cdc.h
slime@2
     7
 * Dependencies:    See INCLUDES section below
slime@2
     8
 * Processor:       PIC18
slime@2
     9
 * Compiler:        C18 2.30.01+
slime@2
    10
 * Company:         Microchip Technology, Inc.
slime@2
    11
 *
slime@2
    12
 * Software License Agreement
slime@2
    13
 *
slime@2
    14
 * The software supplied herewith by Microchip Technology Incorporated
slime@2
    15
 * (the “Company”) for its PICmicro® Microcontroller is intended and
slime@2
    16
 * supplied to you, the Company’s customer, for use solely and
slime@2
    17
 * exclusively on Microchip PICmicro Microcontroller products. The
slime@2
    18
 * software is owned by the Company and/or its supplier, and is
slime@2
    19
 * protected under applicable copyright laws. All rights are reserved.
slime@2
    20
 * Any use in violation of the foregoing restrictions may subject the
slime@2
    21
 * user to criminal sanctions under applicable laws, as well as to
slime@2
    22
 * civil liability for the breach of the terms and conditions of this
slime@2
    23
 * license.
slime@2
    24
 *
slime@2
    25
 * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES,
slime@2
    26
 * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED
slime@2
    27
 * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
slime@2
    28
 * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT,
slime@2
    29
 * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR
slime@2
    30
 * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
slime@2
    31
 *
slime@2
    32
 * Author               Date        Comment
slime@2
    33
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
slime@2
    34
 * Rawin Rojvanit       7/21/04     Original.
slime@2
    35
 ********************************************************************/
slime@2
    36
#ifndef CDC_H
slime@2
    37
#define CDC_H
slime@2
    38
slime@2
    39
/** I N C L U D E S **********************************************************/
slime@2
    40
#include "typedefs.h"
slime@2
    41
slime@2
    42
/** D E F I N I T I O N S ****************************************************/
slime@2
    43
slime@2
    44
/* Class-Specific Requests */
slime@2
    45
#define SEND_ENCAPSULATED_COMMAND   0x00
slime@2
    46
#define GET_ENCAPSULATED_RESPONSE   0x01
slime@2
    47
#define SET_COMM_FEATURE            0x02
slime@2
    48
#define GET_COMM_FEATURE            0x03
slime@2
    49
#define CLEAR_COMM_FEATURE          0x04
slime@2
    50
#define SET_LINE_CODING             0x20
slime@2
    51
#define GET_LINE_CODING             0x21
slime@2
    52
#define SET_CONTROL_LINE_STATE      0x22
slime@2
    53
#define SEND_BREAK                  0x23
slime@2
    54
slime@2
    55
/* Notifications *
slime@2
    56
 * Note: Notifications are polled over
slime@2
    57
 * Communication Interface (Interrupt Endpoint)
slime@2
    58
 */
slime@2
    59
#define NETWORK_CONNECTION          0x00
slime@2
    60
#define RESPONSE_AVAILABLE          0x01
slime@2
    61
#define SERIAL_STATE                0x20
slime@2
    62
slime@2
    63
slime@2
    64
/* Device Class Code */
slime@2
    65
#define CDC_DEVICE                  0x02
slime@2
    66
slime@2
    67
/* Communication Interface Class Code */
slime@2
    68
#define COMM_INTF                   0x02
slime@2
    69
slime@2
    70
/* Communication Interface Class SubClass Codes */
slime@2
    71
#define ABSTRACT_CONTROL_MODEL      0x02
slime@2
    72
slime@2
    73
/* Communication Interface Class Control Protocol Codes */
slime@2
    74
#define V25TER                      0x01    // Common AT commands ("Hayes(TM)")
slime@2
    75
slime@2
    76
slime@2
    77
/* Data Interface Class Codes */
slime@2
    78
#define DATA_INTF                   0x0A
slime@2
    79
slime@2
    80
/* Data Interface Class Protocol Codes */
slime@2
    81
#define NO_PROTOCOL                 0x00    // No class specific protocol required
slime@2
    82
slime@2
    83
slime@2
    84
/* Communication Feature Selector Codes */
slime@2
    85
#define ABSTRACT_STATE              0x01
slime@2
    86
#define COUNTRY_SETTING             0x02
slime@2
    87
slime@2
    88
/* Functional Descriptors */
slime@2
    89
/* Type Values for the bDscType Field */
slime@2
    90
#define CS_INTERFACE                0x24
slime@2
    91
#define CS_ENDPOINT                 0x25
slime@2
    92
slime@2
    93
/* bDscSubType in Functional Descriptors */
slime@2
    94
#define DSC_FN_HEADER               0x00
slime@2
    95
#define DSC_FN_CALL_MGT             0x01
slime@2
    96
#define DSC_FN_ACM                  0x02    // ACM - Abstract Control Management
slime@2
    97
#define DSC_FN_DLM                  0x03    // DLM - Direct Line Managment
slime@2
    98
#define DSC_FN_TELEPHONE_RINGER     0x04
slime@2
    99
#define DSC_FN_RPT_CAPABILITIES     0x05
slime@2
   100
#define DSC_FN_UNION                0x06
slime@2
   101
#define DSC_FN_COUNTRY_SELECTION    0x07
slime@2
   102
#define DSC_FN_TEL_OP_MODES         0x08
slime@2
   103
#define DSC_FN_USB_TERMINAL         0x09
slime@2
   104
/* more.... see Table 25 in USB CDC Specification 1.1 */
slime@2
   105
slime@2
   106
/* CDC Bulk IN transfer states */
slime@2
   107
#define CDC_TX_READY                0
slime@2
   108
#define CDC_TX_BUSY                 1
slime@2
   109
#define CDC_TX_BUSY_ZLP             2       // ZLP: Zero Length Packet
slime@2
   110
#define CDC_TX_COMPLETING           3
slime@2
   111
slime@2
   112
/******************************************************************************
slime@2
   113
 * Macro:           BOOL mUSBUSARTIsTxTrfReady(void)
slime@2
   114
 *
slime@2
   115
 * PreCondition:    None
slime@2
   116
 *
slime@2
   117
 * Input:           None
slime@2
   118
 *
slime@2
   119
 * Output:          None
slime@2
   120
 *
slime@2
   121
 * Side Effects:    None
slime@2
   122
 *
slime@2
   123
 * Overview:        This macro is used to check if the CDC class is ready
slime@2
   124
 *                  to send more data.
slime@2
   125
 *                  Typical Usage: if(mUSBUSARTIsTxTrfReady())
slime@2
   126
 *
slime@2
   127
 * Note:            None
slime@2
   128
 *****************************************************************************/
slime@2
   129
#define mUSBUSARTIsTxTrfReady()     (cdc_trf_state == CDC_TX_READY)
slime@2
   130
slime@2
   131
/******************************************************************************
slime@2
   132
 * Macro:           (bit) mCDCUsartRxIsBusy(void)
slime@2
   133
 *
slime@2
   134
 * PreCondition:    None
slime@2
   135
 *
slime@2
   136
 * Input:           None
slime@2
   137
 *
slime@2
   138
 * Output:          None
slime@2
   139
 *
slime@2
   140
 * Side Effects:    None
slime@2
   141
 *
slime@2
   142
 * Overview:        This macro is used to check if CDC bulk OUT endpoint is
slime@2
   143
 *                  busy (owned by SIE) or not.
slime@2
   144
 *                  Typical Usage: if(mCDCUsartRxIsBusy())
slime@2
   145
 *
slime@2
   146
 * Note:            None
slime@2
   147
 *****************************************************************************/
slime@2
   148
#define mCDCUsartRxIsBusy()         CDC_BULK_BD_OUT.Stat.UOWN
slime@2
   149
slime@2
   150
/******************************************************************************
slime@2
   151
 * Macro:           (bit) mCDCUsartTxIsBusy(void)
slime@2
   152
 *
slime@2
   153
 * PreCondition:    None
slime@2
   154
 *
slime@2
   155
 * Input:           None
slime@2
   156
 *
slime@2
   157
 * Output:          None
slime@2
   158
 *
slime@2
   159
 * Side Effects:    None
slime@2
   160
 *
slime@2
   161
 * Overview:        This macro is used to check if CDC bulk IN endpoint is
slime@2
   162
 *                  busy (owned by SIE) or not.
slime@2
   163
 *                  Typical Usage: if(mCDCUsartTxIsBusy())
slime@2
   164
 *
slime@2
   165
 * Note:            None
slime@2
   166
 *****************************************************************************/
slime@2
   167
#define mCDCUsartTxIsBusy()         CDC_BULK_BD_IN.Stat.UOWN
slime@2
   168
slime@2
   169
/******************************************************************************
slime@2
   170
 * Macro:           byte mCDCGetRxLength(void)
slime@2
   171
 *
slime@2
   172
 * PreCondition:    None
slime@2
   173
 *
slime@2
   174
 * Input:           None
slime@2
   175
 *
slime@2
   176
 * Output:          mCDCGetRxLength returns cdc_rx_len
slime@2
   177
 *
slime@2
   178
 * Side Effects:    None
slime@2
   179
 *
slime@2
   180
 * Overview:        mCDCGetRxLength is used to retrieve the number of bytes
slime@2
   181
 *                  copied to user's buffer by the most recent call to
slime@2
   182
 *                  getsUSBUSART function.
slime@2
   183
 *
slime@2
   184
 * Note:            None
slime@2
   185
 *****************************************************************************/
slime@2
   186
#define mCDCGetRxLength()           cdc_rx_len
slime@2
   187
slime@2
   188
/******************************************************************************
slime@2
   189
 * Macro:           void mUSBUSARTTxRam(byte *pData, byte len)
slime@2
   190
 *
slime@2
   191
 * PreCondition:    cdc_trf_state must be in the CDC_TX_READY state.
slime@2
   192
 *                  
slime@2
   193
 *                  Value of 'len' must be equal to or smaller than 255 bytes.
slime@2
   194
 *
slime@2
   195
 * Input:           pDdata  : Pointer to the starting location of data bytes
slime@2
   196
 *                  len     : Number of bytes to be transferred
slime@2
   197
 *
slime@2
   198
 * Output:          None
slime@2
   199
 *
slime@2
   200
 * Side Effects:    None
slime@2
   201
 *
slime@2
   202
 * Overview:        Use this macro to transfer data located in data memory.
slime@2
   203
 *                  Use this macro when:
slime@2
   204
 *                  1. Data stream is not null-terminated
slime@2
   205
 *                  2. Transfer length is known
slime@2
   206
 *
slime@2
   207
 *                  Remember: cdc_trf_state must == CDC_TX_READY
slime@2
   208
 *                  Unlike putsUSBUSART, there is not code double checking
slime@2
   209
 *                  the transfer state. Unexpected behavior will occur if
slime@2
   210
 *                  this function is called when cdc_trf_state != CDC_TX_READY
slime@2
   211
 *
slime@2
   212
 * Note:            This macro only handles the setup of the transfer. The
slime@2
   213
 *                  actual transfer is handled by CDCTxService().
slime@2
   214
 *****************************************************************************/
slime@2
   215
#define mUSBUSARTTxRam(pData,len)   \
slime@2
   216
{                                   \
slime@2
   217
    pCDCSrc.bRam = pData;           \
slime@2
   218
    cdc_tx_len = len;               \
slime@2
   219
    cdc_mem_type = _RAM;            \
slime@2
   220
    cdc_trf_state = CDC_TX_BUSY;    \
slime@2
   221
}
slime@2
   222
slime@2
   223
/******************************************************************************
slime@2
   224
 * Macro:           void mUSBUSARTTxRom(rom byte *pData, byte len)
slime@2
   225
 *
slime@2
   226
 * PreCondition:    cdc_trf_state must be in the CDC_TX_READY state.
slime@2
   227
 *                  
slime@2
   228
 *                  Value of 'len' must be equal to or smaller than 255 bytes.
slime@2
   229
 *
slime@2
   230
 * Input:           pDdata  : Pointer to the starting location of data bytes
slime@2
   231
 *                  len     : Number of bytes to be transferred
slime@2
   232
 *
slime@2
   233
 * Output:          None
slime@2
   234
 *
slime@2
   235
 * Side Effects:    None
slime@2
   236
 *
slime@2
   237
 * Overview:        Use this macro to transfer data located in program memory.
slime@2
   238
 *                  Use this macro when:
slime@2
   239
 *                  1. Data stream is not null-terminated
slime@2
   240
 *                  2. Transfer length is known
slime@2
   241
 *
slime@2
   242
 *                  Remember: cdc_trf_state must == CDC_TX_READY
slime@2
   243
 *                  Unlike putrsUSBUSART, there is not code double checking
slime@2
   244
 *                  the transfer state. Unexpected behavior will occur if
slime@2
   245
 *                  this function is called when cdc_trf_state != CDC_TX_READY
slime@2
   246
 *
slime@2
   247
 * Note:            This macro only handles the setup of the transfer. The
slime@2
   248
 *                  actual transfer is handled by CDCTxService().
slime@2
   249
 *****************************************************************************/
slime@2
   250
#define mUSBUSARTTxRom(pData,len)   \
slime@2
   251
{                                   \
slime@2
   252
    pCDCSrc.bRom = pData;           \
slime@2
   253
    cdc_tx_len = len;               \
slime@2
   254
    cdc_mem_type = _ROM;            \
slime@2
   255
    cdc_trf_state = CDC_TX_BUSY;    \
slime@2
   256
}
slime@2
   257
slime@2
   258
/** S T R U C T U R E S ******************************************************/
slime@2
   259
slime@2
   260
/* Line Coding Structure */
slime@2
   261
#define LINE_CODING_LENGTH          0x07
slime@2
   262
slime@2
   263
typedef union _LINE_CODING
slime@2
   264
{
slime@2
   265
    struct
slime@2
   266
    {
slime@2
   267
        byte _byte[LINE_CODING_LENGTH];
slime@2
   268
    };
slime@2
   269
    struct
slime@2
   270
    {
slime@2
   271
        DWORD   dwDTERate;          // Complex data structure
slime@2
   272
        byte    bCharFormat;
slime@2
   273
        byte    bParityType;
slime@2
   274
        byte    bDataBits;
slime@2
   275
    };
slime@2
   276
} LINE_CODING;
slime@2
   277
slime@2
   278
typedef union _CONTROL_SIGNAL_BITMAP
slime@2
   279
{
slime@2
   280
    byte _byte;
slime@2
   281
    struct
slime@2
   282
    {
slime@2
   283
        unsigned DTE_PRESENT;       // [0] Not Present  [1] Present
slime@2
   284
        unsigned CARRIER_CONTROL;   // [0] Deactivate   [1] Activate
slime@2
   285
    };
slime@2
   286
} CONTROL_SIGNAL_BITMAP;
slime@2
   287
slime@2
   288
slime@2
   289
/* Functional Descriptor Structure - See CDC Specification 1.1 for details */
slime@2
   290
slime@2
   291
/* Header Functional Descriptor */
slime@2
   292
typedef struct _USB_CDC_HEADER_FN_DSC
slime@2
   293
{
slime@2
   294
    byte bFNLength;
slime@2
   295
    byte bDscType;
slime@2
   296
    byte bDscSubType;
slime@2
   297
    word bcdCDC;
slime@2
   298
} USB_CDC_HEADER_FN_DSC;
slime@2
   299
slime@2
   300
/* Abstract Control Management Functional Descriptor */
slime@2
   301
typedef struct _USB_CDC_ACM_FN_DSC
slime@2
   302
{
slime@2
   303
    byte bFNLength;
slime@2
   304
    byte bDscType;
slime@2
   305
    byte bDscSubType;
slime@2
   306
    byte bmCapabilities;
slime@2
   307
} USB_CDC_ACM_FN_DSC;
slime@2
   308
slime@2
   309
/* Union Functional Descriptor */
slime@2
   310
typedef struct _USB_CDC_UNION_FN_DSC
slime@2
   311
{
slime@2
   312
    byte bFNLength;
slime@2
   313
    byte bDscType;
slime@2
   314
    byte bDscSubType;
slime@2
   315
    byte bMasterIntf;
slime@2
   316
    byte bSaveIntf0;
slime@2
   317
} USB_CDC_UNION_FN_DSC;
slime@2
   318
slime@2
   319
/* Call Management Functional Descriptor */
slime@2
   320
typedef struct _USB_CDC_CALL_MGT_FN_DSC
slime@2
   321
{
slime@2
   322
    byte bFNLength;
slime@2
   323
    byte bDscType;
slime@2
   324
    byte bDscSubType;
slime@2
   325
    byte bmCapabilities;
slime@2
   326
    byte bDataInterface;
slime@2
   327
} USB_CDC_CALL_MGT_FN_DSC;
slime@2
   328
slime@2
   329
/** E X T E R N S ************************************************************/
slime@2
   330
extern byte cdc_rx_len;
slime@2
   331
slime@2
   332
extern byte cdc_trf_state;
slime@2
   333
extern POINTER pCDCSrc;
slime@2
   334
extern byte cdc_tx_len;
slime@2
   335
extern byte cdc_mem_type;
slime@2
   336
slime@2
   337
/** P U B L I C  P R O T O T Y P E S *****************************************/
slime@2
   338
void USBCheckCDCRequest(void);
slime@2
   339
void CDCInitEP(void);
slime@2
   340
byte getsUSBUSART(char *buffer, byte len);
slime@2
   341
void putrsUSBUSART(const rom char *data);
slime@2
   342
void putsUSBUSART(char *data);
slime@2
   343
void CDCTxService(void);
slime@2
   344
slime@2
   345
#endif //CDC_H