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