These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!

Committer:
frank26080115
Date:
Sun Mar 20 05:38:56 2011 +0000
Revision:
0:bf7b9fba3924

        

Who changed what in which revision?

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