/*---------------------------------------------------------------------------- | |
* U S B - K e r n e l | |
*---------------------------------------------------------------------------- | |
* Name: cdcuser.c | |
* Purpose: USB Communication Device Class User module | |
* Version: V1.10 | |
*---------------------------------------------------------------------------- | |
* This software is supplied "AS IS" without any warranties, express, | |
* implied or statutory, including but not limited to the implied | |
* warranties of fitness for purpose, satisfactory quality and | |
* noninfringement. Keil extends you a royalty-free right to reproduce | |
* and distribute executable files created using this software for use | |
* on NXP Semiconductors LPC microcontroller devices only. Nothing else | |
* gives you the right to use this software. | |
* | |
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved. | |
*---------------------------------------------------------------------------*/ | |
#include "lpc_types.h" | |
#include "usb.h" | |
#include "usbhw.h" | |
#include "usbcfg.h" | |
#include "usbcore.h" | |
#include "cdc.h" | |
#include "cdcuser.h" | |
#ifdef __ICCARM__ | |
#pragma data_alignment=4 | |
#define __align(x) | |
#elif defined ( __GNUC__ ) | |
#define __align(x) __attribute__((aligned(x))) | |
#endif | |
unsigned char __align(4) BulkBufOut [USB_CDC_BUFSIZE]; // Buffer to store USB OUT packet | |
#ifdef __ICCARM__ | |
#undef __align(x) | |
#endif | |
/*---------------------------------------------------------------------------- | |
We need a buffer for incomming data on USB port because USB receives | |
much faster than UART transmits | |
*---------------------------------------------------------------------------*/ | |
/* Buffer masks */ | |
#define CDC_BUF_SIZE (64) // Output buffer in bytes (power 2) | |
// large enough for file transfer | |
#define CDC_BUF_MASK (CDC_BUF_SIZE-1ul) | |
/* Buffer read / write macros */ | |
#define CDC_BUF_RESET(cdcBuf) (cdcBuf.rdIdx = cdcBuf.wrIdx = 0) | |
#define CDC_BUF_WR(cdcBuf, dataIn) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.wrIdx++] = (dataIn)) | |
#define CDC_BUF_RD(cdcBuf) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.rdIdx++]) | |
#define CDC_BUF_EMPTY(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx) | |
#define CDC_BUF_FULL(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx+1) | |
#define CDC_BUF_COUNT(cdcBuf) (CDC_BUF_MASK & (cdcBuf.wrIdx - cdcBuf.rdIdx)) | |
// CDC output buffer | |
typedef struct __CDC_BUF_T { | |
unsigned char data[CDC_BUF_SIZE]; | |
unsigned int wrIdx; | |
unsigned int rdIdx; | |
} CDC_BUF_T; | |
CDC_BUF_T CDC_OutBuf; // buffer for all CDC Out data | |
/*---------------------------------------------------------------------------- | |
read data from CDC_OutBuf | |
*---------------------------------------------------------------------------*/ | |
int CDC_RdOutBuf (char *buffer, const int *length) { | |
int bytesToRead, bytesRead; | |
/* Read *length bytes, block if *bytes are not avaialable */ | |
bytesToRead = *length; | |
bytesToRead = (bytesToRead < (*length)) ? bytesToRead : (*length); | |
bytesRead = bytesToRead; | |
// ... add code to check for underrun | |
while (bytesToRead--) { | |
*buffer++ = CDC_BUF_RD(CDC_OutBuf); | |
} | |
return (bytesRead); | |
} | |
/*---------------------------------------------------------------------------- | |
write data to CDC_OutBuf | |
*---------------------------------------------------------------------------*/ | |
int CDC_WrOutBuf (const char *buffer, int length) { | |
int bytesWritten; | |
// ... add code to check for overwrite | |
for( bytesWritten = 0; bytesWritten < length; bytesWritten++ ) { | |
CDC_BUF_WR(CDC_OutBuf, *buffer++); // Copy Data to buffer | |
} | |
return (bytesWritten); | |
} | |
/*---------------------------------------------------------------------------- | |
check if character(s) are available at CDC_OutBuf | |
*---------------------------------------------------------------------------*/ | |
int CDC_OutBufAvailChar (int *availChar) { | |
*availChar = CDC_BUF_COUNT(CDC_OutBuf); | |
return (0); | |
} | |
/* end Buffer handling */ | |
/*---------------------------------------------------------------------------- | |
CDC SendEncapsulatedCommand Request Callback | |
Called automatically on CDC SEND_ENCAPSULATED_COMMAND Request | |
Parameters: None (global SetupPacket and EP0Buf) | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_SendEncapsulatedCommand (void) { | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC GetEncapsulatedResponse Request Callback | |
Called automatically on CDC Get_ENCAPSULATED_RESPONSE Request | |
Parameters: None (global SetupPacket and EP0Buf) | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_GetEncapsulatedResponse (void) { | |
/* ... add code to handle request */ | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC SetCommFeature Request Callback | |
Called automatically on CDC Set_COMM_FATURE Request | |
Parameters: FeatureSelector | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_SetCommFeature (unsigned short wFeatureSelector) { | |
/* ... add code to handle request */ | |
( void ) wFeatureSelector; | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC GetCommFeature Request Callback | |
Called automatically on CDC Get_COMM_FATURE Request | |
Parameters: FeatureSelector | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_GetCommFeature (unsigned short wFeatureSelector) { | |
/* ... add code to handle request */ | |
( void ) wFeatureSelector; | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC ClearCommFeature Request Callback | |
Called automatically on CDC CLEAR_COMM_FATURE Request | |
Parameters: FeatureSelector | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_ClearCommFeature (unsigned short wFeatureSelector) { | |
/* ... add code to handle request */ | |
( void ) wFeatureSelector; | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC SetLineCoding Request Callback | |
Called automatically on CDC SET_LINE_CODING Request | |
Parameters: none (global SetupPacket and EP0Buf) | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_SetLineCoding (void) { | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC GetLineCoding Request Callback | |
Called automatically on CDC GET_LINE_CODING Request | |
Parameters: None (global SetupPacket and EP0Buf) | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_GetLineCoding (void) { | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC SetControlLineState Request Callback | |
Called automatically on CDC SET_CONTROL_LINE_STATE Request | |
Parameters: ControlSignalBitmap | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_SetControlLineState (unsigned short wControlSignalBitmap) { | |
/* ... add code to handle request */ | |
( void ) wControlSignalBitmap; | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC SendBreak Request Callback | |
Called automatically on CDC Set_COMM_FATURE Request | |
Parameters: 0xFFFF start of Break | |
0x0000 stop of Break | |
0x#### Duration of Break | |
Return Value: TRUE - Success, FALSE - Error | |
*---------------------------------------------------------------------------*/ | |
uint32_t CDC_SendBreak (unsigned short wDurationOfBreak) { | |
/* ... add code to handle request */ | |
( void ) wDurationOfBreak; | |
return (TRUE); | |
} | |
/*---------------------------------------------------------------------------- | |
CDC_BulkIn call on DataIn Request | |
Parameters: none | |
Return Value: none | |
*---------------------------------------------------------------------------*/ | |
void CDC_BulkIn(void) { | |
} | |
/*---------------------------------------------------------------------------- | |
CDC_BulkOut call on DataOut Request | |
Parameters: none | |
Return Value: none | |
*---------------------------------------------------------------------------*/ | |
void CDC_BulkOut(void) { | |
int numBytesRead; | |
// get data from USB into intermediate buffer | |
numBytesRead = USB_ReadEP(CDC_DEP_OUT, &BulkBufOut[0]); | |
// ... add code to check for overwrite | |
// store data in a buffer to transmit it over serial interface | |
CDC_WrOutBuf ((char *)&BulkBufOut[0], numBytesRead); | |
vCDCNewDataNotify(); | |
} | |
void CDC_BulkOutNak(void){ | |
USB_ReadReqEP(CDC_DEP_OUT, &BulkBufOut[0], 64); | |
} |