1 /*----------------------------------------------------------------------------
\r
2 * U S B - K e r n e l
\r
3 *----------------------------------------------------------------------------
\r
5 * Purpose: USB Communication Device Class User module
\r
7 *----------------------------------------------------------------------------
\r
8 * This software is supplied "AS IS" without any warranties, express,
\r
9 * implied or statutory, including but not limited to the implied
\r
10 * warranties of fitness for purpose, satisfactory quality and
\r
11 * noninfringement. Keil extends you a royalty-free right to reproduce
\r
12 * and distribute executable files created using this software for use
\r
13 * on NXP Semiconductors LPC microcontroller devices only. Nothing else
\r
14 * gives you the right to use this software.
\r
16 * Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
\r
17 *---------------------------------------------------------------------------*/
\r
19 #include "lpc_types.h"
\r
24 #include "usbcore.h"
\r
26 #include "cdcuser.h"
\r
29 #pragma data_alignment=4
\r
31 #elif defined ( __GNUC__ )
\r
32 #define __align(x) __attribute__((aligned(x)))
\r
35 unsigned char __align(4) BulkBufOut [USB_CDC_BUFSIZE]; // Buffer to store USB OUT packet
\r
41 /*----------------------------------------------------------------------------
\r
42 We need a buffer for incomming data on USB port because USB receives
\r
43 much faster than UART transmits
\r
44 *---------------------------------------------------------------------------*/
\r
46 #define CDC_BUF_SIZE (64) // Output buffer in bytes (power 2)
\r
47 // large enough for file transfer
\r
48 #define CDC_BUF_MASK (CDC_BUF_SIZE-1ul)
\r
50 /* Buffer read / write macros */
\r
51 #define CDC_BUF_RESET(cdcBuf) (cdcBuf.rdIdx = cdcBuf.wrIdx = 0)
\r
52 #define CDC_BUF_WR(cdcBuf, dataIn) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.wrIdx++] = (dataIn))
\r
53 #define CDC_BUF_RD(cdcBuf) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.rdIdx++])
\r
54 #define CDC_BUF_EMPTY(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx)
\r
55 #define CDC_BUF_FULL(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx+1)
\r
56 #define CDC_BUF_COUNT(cdcBuf) (CDC_BUF_MASK & (cdcBuf.wrIdx - cdcBuf.rdIdx))
\r
59 // CDC output buffer
\r
60 typedef struct __CDC_BUF_T {
\r
61 unsigned char data[CDC_BUF_SIZE];
\r
66 CDC_BUF_T CDC_OutBuf; // buffer for all CDC Out data
\r
68 /*----------------------------------------------------------------------------
\r
69 read data from CDC_OutBuf
\r
70 *---------------------------------------------------------------------------*/
\r
71 int CDC_RdOutBuf (char *buffer, const int *length) {
\r
72 int bytesToRead, bytesRead;
\r
74 /* Read *length bytes, block if *bytes are not avaialable */
\r
75 bytesToRead = *length;
\r
76 bytesToRead = (bytesToRead < (*length)) ? bytesToRead : (*length);
\r
77 bytesRead = bytesToRead;
\r
79 // ... add code to check for underrun
\r
81 while (bytesToRead--) {
\r
82 *buffer++ = CDC_BUF_RD(CDC_OutBuf);
\r
87 /*----------------------------------------------------------------------------
\r
88 write data to CDC_OutBuf
\r
89 *---------------------------------------------------------------------------*/
\r
90 int CDC_WrOutBuf (const char *buffer, int length) {
\r
93 // ... add code to check for overwrite
\r
95 for( bytesWritten = 0; bytesWritten < length; bytesWritten++ ) {
\r
96 CDC_BUF_WR(CDC_OutBuf, *buffer++); // Copy Data to buffer
\r
99 return (bytesWritten);
\r
102 /*----------------------------------------------------------------------------
\r
103 check if character(s) are available at CDC_OutBuf
\r
104 *---------------------------------------------------------------------------*/
\r
105 int CDC_OutBufAvailChar (int *availChar) {
\r
107 *availChar = CDC_BUF_COUNT(CDC_OutBuf);
\r
111 /* end Buffer handling */
\r
115 /*----------------------------------------------------------------------------
\r
116 CDC SendEncapsulatedCommand Request Callback
\r
117 Called automatically on CDC SEND_ENCAPSULATED_COMMAND Request
\r
118 Parameters: None (global SetupPacket and EP0Buf)
\r
119 Return Value: TRUE - Success, FALSE - Error
\r
120 *---------------------------------------------------------------------------*/
\r
121 uint32_t CDC_SendEncapsulatedCommand (void) {
\r
127 /*----------------------------------------------------------------------------
\r
128 CDC GetEncapsulatedResponse Request Callback
\r
129 Called automatically on CDC Get_ENCAPSULATED_RESPONSE Request
\r
130 Parameters: None (global SetupPacket and EP0Buf)
\r
131 Return Value: TRUE - Success, FALSE - Error
\r
132 *---------------------------------------------------------------------------*/
\r
133 uint32_t CDC_GetEncapsulatedResponse (void) {
\r
135 /* ... add code to handle request */
\r
140 /*----------------------------------------------------------------------------
\r
141 CDC SetCommFeature Request Callback
\r
142 Called automatically on CDC Set_COMM_FATURE Request
\r
143 Parameters: FeatureSelector
\r
144 Return Value: TRUE - Success, FALSE - Error
\r
145 *---------------------------------------------------------------------------*/
\r
146 uint32_t CDC_SetCommFeature (unsigned short wFeatureSelector) {
\r
148 /* ... add code to handle request */
\r
149 ( void ) wFeatureSelector;
\r
154 /*----------------------------------------------------------------------------
\r
155 CDC GetCommFeature Request Callback
\r
156 Called automatically on CDC Get_COMM_FATURE Request
\r
157 Parameters: FeatureSelector
\r
158 Return Value: TRUE - Success, FALSE - Error
\r
159 *---------------------------------------------------------------------------*/
\r
160 uint32_t CDC_GetCommFeature (unsigned short wFeatureSelector) {
\r
162 /* ... add code to handle request */
\r
163 ( void ) wFeatureSelector;
\r
168 /*----------------------------------------------------------------------------
\r
169 CDC ClearCommFeature Request Callback
\r
170 Called automatically on CDC CLEAR_COMM_FATURE Request
\r
171 Parameters: FeatureSelector
\r
172 Return Value: TRUE - Success, FALSE - Error
\r
173 *---------------------------------------------------------------------------*/
\r
174 uint32_t CDC_ClearCommFeature (unsigned short wFeatureSelector) {
\r
176 /* ... add code to handle request */
\r
177 ( void ) wFeatureSelector;
\r
182 /*----------------------------------------------------------------------------
\r
183 CDC SetLineCoding Request Callback
\r
184 Called automatically on CDC SET_LINE_CODING Request
\r
185 Parameters: none (global SetupPacket and EP0Buf)
\r
186 Return Value: TRUE - Success, FALSE - Error
\r
187 *---------------------------------------------------------------------------*/
\r
188 uint32_t CDC_SetLineCoding (void) {
\r
193 /*----------------------------------------------------------------------------
\r
194 CDC GetLineCoding Request Callback
\r
195 Called automatically on CDC GET_LINE_CODING Request
\r
196 Parameters: None (global SetupPacket and EP0Buf)
\r
197 Return Value: TRUE - Success, FALSE - Error
\r
198 *---------------------------------------------------------------------------*/
\r
199 uint32_t CDC_GetLineCoding (void) {
\r
204 /*----------------------------------------------------------------------------
\r
205 CDC SetControlLineState Request Callback
\r
206 Called automatically on CDC SET_CONTROL_LINE_STATE Request
\r
207 Parameters: ControlSignalBitmap
\r
208 Return Value: TRUE - Success, FALSE - Error
\r
209 *---------------------------------------------------------------------------*/
\r
210 uint32_t CDC_SetControlLineState (unsigned short wControlSignalBitmap) {
\r
212 /* ... add code to handle request */
\r
213 ( void ) wControlSignalBitmap;
\r
218 /*----------------------------------------------------------------------------
\r
219 CDC SendBreak Request Callback
\r
220 Called automatically on CDC Set_COMM_FATURE Request
\r
221 Parameters: 0xFFFF start of Break
\r
222 0x0000 stop of Break
\r
223 0x#### Duration of Break
\r
224 Return Value: TRUE - Success, FALSE - Error
\r
225 *---------------------------------------------------------------------------*/
\r
226 uint32_t CDC_SendBreak (unsigned short wDurationOfBreak) {
\r
228 /* ... add code to handle request */
\r
229 ( void ) wDurationOfBreak;
\r
234 /*----------------------------------------------------------------------------
\r
235 CDC_BulkIn call on DataIn Request
\r
238 *---------------------------------------------------------------------------*/
\r
239 void CDC_BulkIn(void) {
\r
243 /*----------------------------------------------------------------------------
\r
244 CDC_BulkOut call on DataOut Request
\r
247 *---------------------------------------------------------------------------*/
\r
248 void CDC_BulkOut(void) {
\r
251 // get data from USB into intermediate buffer
\r
252 numBytesRead = USB_ReadEP(CDC_DEP_OUT, &BulkBufOut[0]);
\r
254 // ... add code to check for overwrite
\r
256 // store data in a buffer to transmit it over serial interface
\r
257 CDC_WrOutBuf ((char *)&BulkBufOut[0], numBytesRead);
\r
258 vCDCNewDataNotify();
\r
261 void CDC_BulkOutNak(void){
\r
263 USB_ReadReqEP(CDC_DEP_OUT, &BulkBufOut[0], 64);
\r