Port of Keils USBCDC example, compiles ok. Gets stuck at init

Dependencies:   mbed

Committer:
tecnosys
Date:
Mon Jul 05 10:16:57 2010 +0000
Revision:
0:0b777ff85deb

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }