These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
USBDEV/USBCDC/cdcuser.c@0:bf7b9fba3924, 2011-03-20 (annotated)
- Committer:
- frank26080115
- Date:
- Sun Mar 20 05:38:56 2011 +0000
- Revision:
- 0:bf7b9fba3924
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
frank26080115 | 0:bf7b9fba3924 | 1 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 2 | * U S B - K e r n e l |
frank26080115 | 0:bf7b9fba3924 | 3 | *---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 4 | * Name: cdcuser.c |
frank26080115 | 0:bf7b9fba3924 | 5 | * Purpose: USB Communication Device Class User module |
frank26080115 | 0:bf7b9fba3924 | 6 | * Version: V1.10 |
frank26080115 | 0:bf7b9fba3924 | 7 | *---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 8 | * This software is supplied "AS IS" without any warranties, express, |
frank26080115 | 0:bf7b9fba3924 | 9 | * implied or statutory, including but not limited to the implied |
frank26080115 | 0:bf7b9fba3924 | 10 | * warranties of fitness for purpose, satisfactory quality and |
frank26080115 | 0:bf7b9fba3924 | 11 | * noninfringement. Keil extends you a royalty-free right to reproduce |
frank26080115 | 0:bf7b9fba3924 | 12 | * and distribute executable files created using this software for use |
frank26080115 | 0:bf7b9fba3924 | 13 | * on NXP Semiconductors LPC microcontroller devices only. Nothing else |
frank26080115 | 0:bf7b9fba3924 | 14 | * gives you the right to use this software. |
frank26080115 | 0:bf7b9fba3924 | 15 | * |
frank26080115 | 0:bf7b9fba3924 | 16 | * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. |
frank26080115 | 0:bf7b9fba3924 | 17 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 18 | |
frank26080115 | 0:bf7b9fba3924 | 19 | #include "lpc_types.h" |
frank26080115 | 0:bf7b9fba3924 | 20 | |
frank26080115 | 0:bf7b9fba3924 | 21 | #include "usb.h" |
frank26080115 | 0:bf7b9fba3924 | 22 | #include "usbhw.h" |
frank26080115 | 0:bf7b9fba3924 | 23 | #include "usbcfg.h" |
frank26080115 | 0:bf7b9fba3924 | 24 | #include "usbcore.h" |
frank26080115 | 0:bf7b9fba3924 | 25 | #include "cdc.h" |
frank26080115 | 0:bf7b9fba3924 | 26 | #include "cdcuser.h" |
frank26080115 | 0:bf7b9fba3924 | 27 | #include "serial.h" |
frank26080115 | 0:bf7b9fba3924 | 28 | |
frank26080115 | 0:bf7b9fba3924 | 29 | |
frank26080115 | 0:bf7b9fba3924 | 30 | unsigned char BulkBufIn [USB_CDC_BUFSIZE]; // Buffer to store USB IN packet |
frank26080115 | 0:bf7b9fba3924 | 31 | unsigned char BulkBufOut [USB_CDC_BUFSIZE]; // Buffer to store USB OUT packet |
frank26080115 | 0:bf7b9fba3924 | 32 | unsigned char NotificationBuf [10]; |
frank26080115 | 0:bf7b9fba3924 | 33 | |
frank26080115 | 0:bf7b9fba3924 | 34 | CDC_LINE_CODING CDC_LineCoding = {9600, 0, 0, 8}; |
frank26080115 | 0:bf7b9fba3924 | 35 | unsigned short CDC_SerialState = 0x0000; |
frank26080115 | 0:bf7b9fba3924 | 36 | unsigned short CDC_DepInEmpty = 1; // Data IN EP is empty |
frank26080115 | 0:bf7b9fba3924 | 37 | |
frank26080115 | 0:bf7b9fba3924 | 38 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 39 | We need a buffer for incomming data on USB port because USB receives |
frank26080115 | 0:bf7b9fba3924 | 40 | much faster than UART transmits |
frank26080115 | 0:bf7b9fba3924 | 41 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 42 | /* Buffer masks */ |
frank26080115 | 0:bf7b9fba3924 | 43 | #define CDC_BUF_SIZE (64) // Output buffer in bytes (power 2) |
frank26080115 | 0:bf7b9fba3924 | 44 | // large enough for file transfer |
frank26080115 | 0:bf7b9fba3924 | 45 | #define CDC_BUF_MASK (CDC_BUF_SIZE-1ul) |
frank26080115 | 0:bf7b9fba3924 | 46 | |
frank26080115 | 0:bf7b9fba3924 | 47 | /* Buffer read / write macros */ |
frank26080115 | 0:bf7b9fba3924 | 48 | #define CDC_BUF_RESET(cdcBuf) (cdcBuf.rdIdx = cdcBuf.wrIdx = 0) |
frank26080115 | 0:bf7b9fba3924 | 49 | #define CDC_BUF_WR(cdcBuf, dataIn) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.wrIdx++] = (dataIn)) |
frank26080115 | 0:bf7b9fba3924 | 50 | #define CDC_BUF_RD(cdcBuf) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.rdIdx++]) |
frank26080115 | 0:bf7b9fba3924 | 51 | #define CDC_BUF_EMPTY(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx) |
frank26080115 | 0:bf7b9fba3924 | 52 | #define CDC_BUF_FULL(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx+1) |
frank26080115 | 0:bf7b9fba3924 | 53 | #define CDC_BUF_COUNT(cdcBuf) (CDC_BUF_MASK & (cdcBuf.wrIdx - cdcBuf.rdIdx)) |
frank26080115 | 0:bf7b9fba3924 | 54 | |
frank26080115 | 0:bf7b9fba3924 | 55 | |
frank26080115 | 0:bf7b9fba3924 | 56 | // CDC output buffer |
frank26080115 | 0:bf7b9fba3924 | 57 | typedef struct __CDC_BUF_T { |
frank26080115 | 0:bf7b9fba3924 | 58 | unsigned char data[CDC_BUF_SIZE]; |
frank26080115 | 0:bf7b9fba3924 | 59 | unsigned int wrIdx; |
frank26080115 | 0:bf7b9fba3924 | 60 | unsigned int rdIdx; |
frank26080115 | 0:bf7b9fba3924 | 61 | } CDC_BUF_T; |
frank26080115 | 0:bf7b9fba3924 | 62 | |
frank26080115 | 0:bf7b9fba3924 | 63 | CDC_BUF_T CDC_OutBuf; // buffer for all CDC Out data |
frank26080115 | 0:bf7b9fba3924 | 64 | |
frank26080115 | 0:bf7b9fba3924 | 65 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 66 | read data from CDC_OutBuf |
frank26080115 | 0:bf7b9fba3924 | 67 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 68 | int CDC_RdOutBuf (char *buffer, const int *length) { |
frank26080115 | 0:bf7b9fba3924 | 69 | int bytesToRead, bytesRead; |
frank26080115 | 0:bf7b9fba3924 | 70 | |
frank26080115 | 0:bf7b9fba3924 | 71 | /* Read *length bytes, block if *bytes are not avaialable */ |
frank26080115 | 0:bf7b9fba3924 | 72 | bytesToRead = *length; |
frank26080115 | 0:bf7b9fba3924 | 73 | bytesToRead = (bytesToRead < (*length)) ? bytesToRead : (*length); |
frank26080115 | 0:bf7b9fba3924 | 74 | bytesRead = bytesToRead; |
frank26080115 | 0:bf7b9fba3924 | 75 | |
frank26080115 | 0:bf7b9fba3924 | 76 | |
frank26080115 | 0:bf7b9fba3924 | 77 | // ... add code to check for underrun |
frank26080115 | 0:bf7b9fba3924 | 78 | |
frank26080115 | 0:bf7b9fba3924 | 79 | while (bytesToRead--) { |
frank26080115 | 0:bf7b9fba3924 | 80 | *buffer++ = CDC_BUF_RD(CDC_OutBuf); |
frank26080115 | 0:bf7b9fba3924 | 81 | } |
frank26080115 | 0:bf7b9fba3924 | 82 | return (bytesRead); |
frank26080115 | 0:bf7b9fba3924 | 83 | } |
frank26080115 | 0:bf7b9fba3924 | 84 | |
frank26080115 | 0:bf7b9fba3924 | 85 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 86 | write data to CDC_OutBuf |
frank26080115 | 0:bf7b9fba3924 | 87 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 88 | int CDC_WrOutBuf (const char *buffer, int *length) { |
frank26080115 | 0:bf7b9fba3924 | 89 | int bytesToWrite, bytesWritten; |
frank26080115 | 0:bf7b9fba3924 | 90 | |
frank26080115 | 0:bf7b9fba3924 | 91 | // Write *length bytes |
frank26080115 | 0:bf7b9fba3924 | 92 | bytesToWrite = *length; |
frank26080115 | 0:bf7b9fba3924 | 93 | bytesWritten = bytesToWrite; |
frank26080115 | 0:bf7b9fba3924 | 94 | |
frank26080115 | 0:bf7b9fba3924 | 95 | |
frank26080115 | 0:bf7b9fba3924 | 96 | // ... add code to check for overwrite |
frank26080115 | 0:bf7b9fba3924 | 97 | |
frank26080115 | 0:bf7b9fba3924 | 98 | while (bytesToWrite) { |
frank26080115 | 0:bf7b9fba3924 | 99 | CDC_BUF_WR(CDC_OutBuf, *buffer++); // Copy Data to buffer |
frank26080115 | 0:bf7b9fba3924 | 100 | bytesToWrite--; |
frank26080115 | 0:bf7b9fba3924 | 101 | } |
frank26080115 | 0:bf7b9fba3924 | 102 | |
frank26080115 | 0:bf7b9fba3924 | 103 | return (bytesWritten); |
frank26080115 | 0:bf7b9fba3924 | 104 | } |
frank26080115 | 0:bf7b9fba3924 | 105 | |
frank26080115 | 0:bf7b9fba3924 | 106 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 107 | check if character(s) are available at CDC_OutBuf |
frank26080115 | 0:bf7b9fba3924 | 108 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 109 | int CDC_OutBufAvailChar (int *availChar) { |
frank26080115 | 0:bf7b9fba3924 | 110 | |
frank26080115 | 0:bf7b9fba3924 | 111 | *availChar = CDC_BUF_COUNT(CDC_OutBuf); |
frank26080115 | 0:bf7b9fba3924 | 112 | |
frank26080115 | 0:bf7b9fba3924 | 113 | return (0); |
frank26080115 | 0:bf7b9fba3924 | 114 | } |
frank26080115 | 0:bf7b9fba3924 | 115 | /* end Buffer handling */ |
frank26080115 | 0:bf7b9fba3924 | 116 | |
frank26080115 | 0:bf7b9fba3924 | 117 | |
frank26080115 | 0:bf7b9fba3924 | 118 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 119 | CDC Initialisation |
frank26080115 | 0:bf7b9fba3924 | 120 | Initializes the data structures and serial port |
frank26080115 | 0:bf7b9fba3924 | 121 | Parameters: None |
frank26080115 | 0:bf7b9fba3924 | 122 | Return Value: None |
frank26080115 | 0:bf7b9fba3924 | 123 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 124 | void CDC_Init (char portNum ) { |
frank26080115 | 0:bf7b9fba3924 | 125 | |
frank26080115 | 0:bf7b9fba3924 | 126 | if ( portNum == 0 ) |
frank26080115 | 0:bf7b9fba3924 | 127 | { |
frank26080115 | 0:bf7b9fba3924 | 128 | ser_OpenPort (0); |
frank26080115 | 0:bf7b9fba3924 | 129 | ser_InitPort0 (CDC_LineCoding.dwDTERate, |
frank26080115 | 0:bf7b9fba3924 | 130 | CDC_LineCoding.bDataBits, |
frank26080115 | 0:bf7b9fba3924 | 131 | CDC_LineCoding.bParityType, |
frank26080115 | 0:bf7b9fba3924 | 132 | CDC_LineCoding.bCharFormat); |
frank26080115 | 0:bf7b9fba3924 | 133 | } |
frank26080115 | 0:bf7b9fba3924 | 134 | else |
frank26080115 | 0:bf7b9fba3924 | 135 | { |
frank26080115 | 0:bf7b9fba3924 | 136 | ser_OpenPort (1); |
frank26080115 | 0:bf7b9fba3924 | 137 | ser_InitPort1 (CDC_LineCoding.dwDTERate, |
frank26080115 | 0:bf7b9fba3924 | 138 | CDC_LineCoding.bDataBits, |
frank26080115 | 0:bf7b9fba3924 | 139 | CDC_LineCoding.bParityType, |
frank26080115 | 0:bf7b9fba3924 | 140 | CDC_LineCoding.bCharFormat); |
frank26080115 | 0:bf7b9fba3924 | 141 | } |
frank26080115 | 0:bf7b9fba3924 | 142 | CDC_DepInEmpty = 1; |
frank26080115 | 0:bf7b9fba3924 | 143 | CDC_SerialState = CDC_GetSerialState(); |
frank26080115 | 0:bf7b9fba3924 | 144 | |
frank26080115 | 0:bf7b9fba3924 | 145 | CDC_BUF_RESET(CDC_OutBuf); |
frank26080115 | 0:bf7b9fba3924 | 146 | } |
frank26080115 | 0:bf7b9fba3924 | 147 | |
frank26080115 | 0:bf7b9fba3924 | 148 | |
frank26080115 | 0:bf7b9fba3924 | 149 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 150 | CDC SendEncapsulatedCommand Request Callback |
frank26080115 | 0:bf7b9fba3924 | 151 | Called automatically on CDC SEND_ENCAPSULATED_COMMAND Request |
frank26080115 | 0:bf7b9fba3924 | 152 | Parameters: None (global SetupPacket and EP0Buf) |
frank26080115 | 0:bf7b9fba3924 | 153 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 154 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 155 | uint32_t CDC_SendEncapsulatedCommand (void) { |
frank26080115 | 0:bf7b9fba3924 | 156 | |
frank26080115 | 0:bf7b9fba3924 | 157 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 158 | } |
frank26080115 | 0:bf7b9fba3924 | 159 | |
frank26080115 | 0:bf7b9fba3924 | 160 | |
frank26080115 | 0:bf7b9fba3924 | 161 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 162 | CDC GetEncapsulatedResponse Request Callback |
frank26080115 | 0:bf7b9fba3924 | 163 | Called automatically on CDC Get_ENCAPSULATED_RESPONSE Request |
frank26080115 | 0:bf7b9fba3924 | 164 | Parameters: None (global SetupPacket and EP0Buf) |
frank26080115 | 0:bf7b9fba3924 | 165 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 166 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 167 | uint32_t CDC_GetEncapsulatedResponse (void) { |
frank26080115 | 0:bf7b9fba3924 | 168 | |
frank26080115 | 0:bf7b9fba3924 | 169 | /* ... add code to handle request */ |
frank26080115 | 0:bf7b9fba3924 | 170 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 171 | } |
frank26080115 | 0:bf7b9fba3924 | 172 | |
frank26080115 | 0:bf7b9fba3924 | 173 | |
frank26080115 | 0:bf7b9fba3924 | 174 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 175 | CDC SetCommFeature Request Callback |
frank26080115 | 0:bf7b9fba3924 | 176 | Called automatically on CDC Set_COMM_FATURE Request |
frank26080115 | 0:bf7b9fba3924 | 177 | Parameters: FeatureSelector |
frank26080115 | 0:bf7b9fba3924 | 178 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 179 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 180 | uint32_t CDC_SetCommFeature (unsigned short wFeatureSelector) { |
frank26080115 | 0:bf7b9fba3924 | 181 | |
frank26080115 | 0:bf7b9fba3924 | 182 | /* ... add code to handle request */ |
frank26080115 | 0:bf7b9fba3924 | 183 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 184 | } |
frank26080115 | 0:bf7b9fba3924 | 185 | |
frank26080115 | 0:bf7b9fba3924 | 186 | |
frank26080115 | 0:bf7b9fba3924 | 187 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 188 | CDC GetCommFeature Request Callback |
frank26080115 | 0:bf7b9fba3924 | 189 | Called automatically on CDC Get_COMM_FATURE Request |
frank26080115 | 0:bf7b9fba3924 | 190 | Parameters: FeatureSelector |
frank26080115 | 0:bf7b9fba3924 | 191 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 192 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 193 | uint32_t CDC_GetCommFeature (unsigned short wFeatureSelector) { |
frank26080115 | 0:bf7b9fba3924 | 194 | |
frank26080115 | 0:bf7b9fba3924 | 195 | /* ... add code to handle request */ |
frank26080115 | 0:bf7b9fba3924 | 196 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 197 | } |
frank26080115 | 0:bf7b9fba3924 | 198 | |
frank26080115 | 0:bf7b9fba3924 | 199 | |
frank26080115 | 0:bf7b9fba3924 | 200 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 201 | CDC ClearCommFeature Request Callback |
frank26080115 | 0:bf7b9fba3924 | 202 | Called automatically on CDC CLEAR_COMM_FATURE Request |
frank26080115 | 0:bf7b9fba3924 | 203 | Parameters: FeatureSelector |
frank26080115 | 0:bf7b9fba3924 | 204 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 205 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 206 | uint32_t CDC_ClearCommFeature (unsigned short wFeatureSelector) { |
frank26080115 | 0:bf7b9fba3924 | 207 | |
frank26080115 | 0:bf7b9fba3924 | 208 | /* ... add code to handle request */ |
frank26080115 | 0:bf7b9fba3924 | 209 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 210 | } |
frank26080115 | 0:bf7b9fba3924 | 211 | |
frank26080115 | 0:bf7b9fba3924 | 212 | |
frank26080115 | 0:bf7b9fba3924 | 213 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 214 | CDC SetLineCoding Request Callback |
frank26080115 | 0:bf7b9fba3924 | 215 | Called automatically on CDC SET_LINE_CODING Request |
frank26080115 | 0:bf7b9fba3924 | 216 | Parameters: none (global SetupPacket and EP0Buf) |
frank26080115 | 0:bf7b9fba3924 | 217 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 218 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 219 | uint32_t CDC_SetLineCoding (void) { |
frank26080115 | 0:bf7b9fba3924 | 220 | |
frank26080115 | 0:bf7b9fba3924 | 221 | CDC_LineCoding.dwDTERate = (EP0Buf[0] << 0) |
frank26080115 | 0:bf7b9fba3924 | 222 | | (EP0Buf[1] << 8) |
frank26080115 | 0:bf7b9fba3924 | 223 | | (EP0Buf[2] << 16) |
frank26080115 | 0:bf7b9fba3924 | 224 | | (EP0Buf[3] << 24); |
frank26080115 | 0:bf7b9fba3924 | 225 | CDC_LineCoding.bCharFormat = EP0Buf[4]; |
frank26080115 | 0:bf7b9fba3924 | 226 | CDC_LineCoding.bParityType = EP0Buf[5]; |
frank26080115 | 0:bf7b9fba3924 | 227 | CDC_LineCoding.bDataBits = EP0Buf[6]; |
frank26080115 | 0:bf7b9fba3924 | 228 | |
frank26080115 | 0:bf7b9fba3924 | 229 | #if PORT_NUM |
frank26080115 | 0:bf7b9fba3924 | 230 | ser_ClosePort(1); |
frank26080115 | 0:bf7b9fba3924 | 231 | ser_OpenPort (1); |
frank26080115 | 0:bf7b9fba3924 | 232 | ser_InitPort1 (CDC_LineCoding.dwDTERate, |
frank26080115 | 0:bf7b9fba3924 | 233 | CDC_LineCoding.bDataBits, |
frank26080115 | 0:bf7b9fba3924 | 234 | CDC_LineCoding.bParityType, |
frank26080115 | 0:bf7b9fba3924 | 235 | CDC_LineCoding.bCharFormat); |
frank26080115 | 0:bf7b9fba3924 | 236 | #else |
frank26080115 | 0:bf7b9fba3924 | 237 | ser_ClosePort(0); |
frank26080115 | 0:bf7b9fba3924 | 238 | ser_OpenPort (0); |
frank26080115 | 0:bf7b9fba3924 | 239 | ser_InitPort0 (CDC_LineCoding.dwDTERate, |
frank26080115 | 0:bf7b9fba3924 | 240 | CDC_LineCoding.bDataBits, |
frank26080115 | 0:bf7b9fba3924 | 241 | CDC_LineCoding.bParityType, |
frank26080115 | 0:bf7b9fba3924 | 242 | CDC_LineCoding.bCharFormat); |
frank26080115 | 0:bf7b9fba3924 | 243 | #endif |
frank26080115 | 0:bf7b9fba3924 | 244 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 245 | } |
frank26080115 | 0:bf7b9fba3924 | 246 | |
frank26080115 | 0:bf7b9fba3924 | 247 | |
frank26080115 | 0:bf7b9fba3924 | 248 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 249 | CDC GetLineCoding Request Callback |
frank26080115 | 0:bf7b9fba3924 | 250 | Called automatically on CDC GET_LINE_CODING Request |
frank26080115 | 0:bf7b9fba3924 | 251 | Parameters: None (global SetupPacket and EP0Buf) |
frank26080115 | 0:bf7b9fba3924 | 252 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 253 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 254 | uint32_t CDC_GetLineCoding (void) { |
frank26080115 | 0:bf7b9fba3924 | 255 | |
frank26080115 | 0:bf7b9fba3924 | 256 | EP0Buf[0] = (CDC_LineCoding.dwDTERate >> 0) & 0xFF; |
frank26080115 | 0:bf7b9fba3924 | 257 | EP0Buf[1] = (CDC_LineCoding.dwDTERate >> 8) & 0xFF; |
frank26080115 | 0:bf7b9fba3924 | 258 | EP0Buf[2] = (CDC_LineCoding.dwDTERate >> 16) & 0xFF; |
frank26080115 | 0:bf7b9fba3924 | 259 | EP0Buf[3] = (CDC_LineCoding.dwDTERate >> 24) & 0xFF; |
frank26080115 | 0:bf7b9fba3924 | 260 | EP0Buf[4] = CDC_LineCoding.bCharFormat; |
frank26080115 | 0:bf7b9fba3924 | 261 | EP0Buf[5] = CDC_LineCoding.bParityType; |
frank26080115 | 0:bf7b9fba3924 | 262 | EP0Buf[6] = CDC_LineCoding.bDataBits; |
frank26080115 | 0:bf7b9fba3924 | 263 | |
frank26080115 | 0:bf7b9fba3924 | 264 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 265 | } |
frank26080115 | 0:bf7b9fba3924 | 266 | |
frank26080115 | 0:bf7b9fba3924 | 267 | |
frank26080115 | 0:bf7b9fba3924 | 268 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 269 | CDC SetControlLineState Request Callback |
frank26080115 | 0:bf7b9fba3924 | 270 | Called automatically on CDC SET_CONTROL_LINE_STATE Request |
frank26080115 | 0:bf7b9fba3924 | 271 | Parameters: ControlSignalBitmap |
frank26080115 | 0:bf7b9fba3924 | 272 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 273 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 274 | uint32_t CDC_SetControlLineState (unsigned short wControlSignalBitmap) { |
frank26080115 | 0:bf7b9fba3924 | 275 | |
frank26080115 | 0:bf7b9fba3924 | 276 | /* ... add code to handle request */ |
frank26080115 | 0:bf7b9fba3924 | 277 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 278 | } |
frank26080115 | 0:bf7b9fba3924 | 279 | |
frank26080115 | 0:bf7b9fba3924 | 280 | |
frank26080115 | 0:bf7b9fba3924 | 281 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 282 | CDC SendBreak Request Callback |
frank26080115 | 0:bf7b9fba3924 | 283 | Called automatically on CDC Set_COMM_FATURE Request |
frank26080115 | 0:bf7b9fba3924 | 284 | Parameters: 0xFFFF start of Break |
frank26080115 | 0:bf7b9fba3924 | 285 | 0x0000 stop of Break |
frank26080115 | 0:bf7b9fba3924 | 286 | 0x#### Duration of Break |
frank26080115 | 0:bf7b9fba3924 | 287 | Return Value: TRUE - Success, FALSE - Error |
frank26080115 | 0:bf7b9fba3924 | 288 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 289 | uint32_t CDC_SendBreak (unsigned short wDurationOfBreak) { |
frank26080115 | 0:bf7b9fba3924 | 290 | |
frank26080115 | 0:bf7b9fba3924 | 291 | /* ... add code to handle request */ |
frank26080115 | 0:bf7b9fba3924 | 292 | return (TRUE); |
frank26080115 | 0:bf7b9fba3924 | 293 | } |
frank26080115 | 0:bf7b9fba3924 | 294 | |
frank26080115 | 0:bf7b9fba3924 | 295 | |
frank26080115 | 0:bf7b9fba3924 | 296 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 297 | CDC_BulkIn call on DataIn Request |
frank26080115 | 0:bf7b9fba3924 | 298 | Parameters: none |
frank26080115 | 0:bf7b9fba3924 | 299 | Return Value: none |
frank26080115 | 0:bf7b9fba3924 | 300 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 301 | void CDC_BulkIn(void) { |
frank26080115 | 0:bf7b9fba3924 | 302 | int numBytesRead, numBytesAvail; |
frank26080115 | 0:bf7b9fba3924 | 303 | |
frank26080115 | 0:bf7b9fba3924 | 304 | ser_AvailChar (&numBytesAvail); |
frank26080115 | 0:bf7b9fba3924 | 305 | |
frank26080115 | 0:bf7b9fba3924 | 306 | // ... add code to check for overwrite |
frank26080115 | 0:bf7b9fba3924 | 307 | |
frank26080115 | 0:bf7b9fba3924 | 308 | numBytesRead = ser_Read ((char *)&BulkBufIn[0], &numBytesAvail); |
frank26080115 | 0:bf7b9fba3924 | 309 | |
frank26080115 | 0:bf7b9fba3924 | 310 | // send over USB |
frank26080115 | 0:bf7b9fba3924 | 311 | if (numBytesRead > 0) { |
frank26080115 | 0:bf7b9fba3924 | 312 | USB_WriteEP (CDC_DEP_IN, &BulkBufIn[0], numBytesRead); |
frank26080115 | 0:bf7b9fba3924 | 313 | } |
frank26080115 | 0:bf7b9fba3924 | 314 | else { |
frank26080115 | 0:bf7b9fba3924 | 315 | CDC_DepInEmpty = 1; |
frank26080115 | 0:bf7b9fba3924 | 316 | } |
frank26080115 | 0:bf7b9fba3924 | 317 | } |
frank26080115 | 0:bf7b9fba3924 | 318 | |
frank26080115 | 0:bf7b9fba3924 | 319 | |
frank26080115 | 0:bf7b9fba3924 | 320 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 321 | CDC_BulkOut call on DataOut Request |
frank26080115 | 0:bf7b9fba3924 | 322 | Parameters: none |
frank26080115 | 0:bf7b9fba3924 | 323 | Return Value: none |
frank26080115 | 0:bf7b9fba3924 | 324 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 325 | void CDC_BulkOut(void) { |
frank26080115 | 0:bf7b9fba3924 | 326 | int numBytesRead; |
frank26080115 | 0:bf7b9fba3924 | 327 | |
frank26080115 | 0:bf7b9fba3924 | 328 | // get data from USB into intermediate buffer |
frank26080115 | 0:bf7b9fba3924 | 329 | numBytesRead = USB_ReadEP(CDC_DEP_OUT, &BulkBufOut[0]); |
frank26080115 | 0:bf7b9fba3924 | 330 | |
frank26080115 | 0:bf7b9fba3924 | 331 | // ... add code to check for overwrite |
frank26080115 | 0:bf7b9fba3924 | 332 | |
frank26080115 | 0:bf7b9fba3924 | 333 | // store data in a buffer to transmit it over serial interface |
frank26080115 | 0:bf7b9fba3924 | 334 | CDC_WrOutBuf ((char *)&BulkBufOut[0], &numBytesRead); |
frank26080115 | 0:bf7b9fba3924 | 335 | |
frank26080115 | 0:bf7b9fba3924 | 336 | } |
frank26080115 | 0:bf7b9fba3924 | 337 | |
frank26080115 | 0:bf7b9fba3924 | 338 | |
frank26080115 | 0:bf7b9fba3924 | 339 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 340 | Get the SERIAL_STATE as defined in usbcdc11.pdf, 6.3.5, Table 69. |
frank26080115 | 0:bf7b9fba3924 | 341 | Parameters: none |
frank26080115 | 0:bf7b9fba3924 | 342 | Return Value: SerialState as defined in usbcdc11.pdf |
frank26080115 | 0:bf7b9fba3924 | 343 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 344 | unsigned short CDC_GetSerialState (void) { |
frank26080115 | 0:bf7b9fba3924 | 345 | unsigned short temp; |
frank26080115 | 0:bf7b9fba3924 | 346 | |
frank26080115 | 0:bf7b9fba3924 | 347 | CDC_SerialState = 0; |
frank26080115 | 0:bf7b9fba3924 | 348 | ser_LineState (&temp); |
frank26080115 | 0:bf7b9fba3924 | 349 | |
frank26080115 | 0:bf7b9fba3924 | 350 | if (temp & 0x8000) CDC_SerialState |= CDC_SERIAL_STATE_RX_CARRIER; |
frank26080115 | 0:bf7b9fba3924 | 351 | if (temp & 0x2000) CDC_SerialState |= CDC_SERIAL_STATE_TX_CARRIER; |
frank26080115 | 0:bf7b9fba3924 | 352 | if (temp & 0x0010) CDC_SerialState |= CDC_SERIAL_STATE_BREAK; |
frank26080115 | 0:bf7b9fba3924 | 353 | if (temp & 0x4000) CDC_SerialState |= CDC_SERIAL_STATE_RING; |
frank26080115 | 0:bf7b9fba3924 | 354 | if (temp & 0x0008) CDC_SerialState |= CDC_SERIAL_STATE_FRAMING; |
frank26080115 | 0:bf7b9fba3924 | 355 | if (temp & 0x0004) CDC_SerialState |= CDC_SERIAL_STATE_PARITY; |
frank26080115 | 0:bf7b9fba3924 | 356 | if (temp & 0x0002) CDC_SerialState |= CDC_SERIAL_STATE_OVERRUN; |
frank26080115 | 0:bf7b9fba3924 | 357 | |
frank26080115 | 0:bf7b9fba3924 | 358 | return (CDC_SerialState); |
frank26080115 | 0:bf7b9fba3924 | 359 | } |
frank26080115 | 0:bf7b9fba3924 | 360 | |
frank26080115 | 0:bf7b9fba3924 | 361 | |
frank26080115 | 0:bf7b9fba3924 | 362 | /*---------------------------------------------------------------------------- |
frank26080115 | 0:bf7b9fba3924 | 363 | Send the SERIAL_STATE notification as defined in usbcdc11.pdf, 6.3.5. |
frank26080115 | 0:bf7b9fba3924 | 364 | *---------------------------------------------------------------------------*/ |
frank26080115 | 0:bf7b9fba3924 | 365 | void CDC_NotificationIn (void) { |
frank26080115 | 0:bf7b9fba3924 | 366 | |
frank26080115 | 0:bf7b9fba3924 | 367 | NotificationBuf[0] = 0xA1; // bmRequestType |
frank26080115 | 0:bf7b9fba3924 | 368 | NotificationBuf[1] = CDC_NOTIFICATION_SERIAL_STATE; // bNotification (SERIAL_STATE) |
frank26080115 | 0:bf7b9fba3924 | 369 | NotificationBuf[2] = 0x00; // wValue |
frank26080115 | 0:bf7b9fba3924 | 370 | NotificationBuf[3] = 0x00; |
frank26080115 | 0:bf7b9fba3924 | 371 | NotificationBuf[4] = 0x00; // wIndex (Interface #, LSB first) |
frank26080115 | 0:bf7b9fba3924 | 372 | NotificationBuf[5] = 0x00; |
frank26080115 | 0:bf7b9fba3924 | 373 | NotificationBuf[6] = 0x02; // wLength (Data length = 2 bytes, LSB first) |
frank26080115 | 0:bf7b9fba3924 | 374 | NotificationBuf[7] = 0x00; |
frank26080115 | 0:bf7b9fba3924 | 375 | NotificationBuf[8] = (CDC_SerialState >> 0) & 0xFF; // UART State Bitmap (16bits, LSB first) |
frank26080115 | 0:bf7b9fba3924 | 376 | NotificationBuf[9] = (CDC_SerialState >> 8) & 0xFF; |
frank26080115 | 0:bf7b9fba3924 | 377 | |
frank26080115 | 0:bf7b9fba3924 | 378 | USB_WriteEP (CDC_CEP_IN, &NotificationBuf[0], 10); // send notification |
frank26080115 | 0:bf7b9fba3924 | 379 | } |