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