30 volatile unsigned char BulkBufIn [USB_CDC_BUFSIZE];
31 volatile unsigned char BulkBufOut [USB_CDC_BUFSIZE];
32 volatile unsigned char NotificationBuf [10];
34 CDC_LINE_CODING CDC_LineCoding = {4*223400, 0, 0, 8};
35 volatile unsigned short CDC_SerialState = 0x0000;
36 unsigned short CDC_DepInEmpty = 1;
43 #define CDC_BUF_SIZE (64) // Output buffer in bytes (power 2)
45 #define CDC_BUF_MASK (CDC_BUF_SIZE-1ul)
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))
58 unsigned char data[CDC_BUF_SIZE];
68 int CDC_RdOutBuf (
char *buffer,
const int *length) {
69 int bytesToRead, bytesRead;
72 bytesToRead = *length;
73 bytesToRead = (bytesToRead < (*length)) ? bytesToRead : (*length);
74 bytesRead = bytesToRead;
79 while (bytesToRead--) {
80 *buffer++ = CDC_BUF_RD(CDC_OutBuf);
88 int CDC_WrOutBuf (
const char *buffer,
int *length) {
89 int bytesToWrite, bytesWritten;
92 bytesToWrite = *length;
93 bytesWritten = bytesToWrite;
98 while (bytesToWrite) {
99 CDC_BUF_WR(CDC_OutBuf, *buffer++);
103 return (bytesWritten);
109 int CDC_OutBufAvailChar (
int *availChar) {
111 *availChar = CDC_BUF_COUNT(CDC_OutBuf);
124 void CDC_Init (
void) {
135 CDC_BUF_RESET(CDC_OutBuf);
145 uint32_t CDC_SendEncapsulatedCommand (
void) {
157 uint32_t CDC_GetEncapsulatedResponse (
void) {
170 uint32_t CDC_SetCommFeature (
unsigned short wFeatureSelector) {
183 uint32_t CDC_GetCommFeature (
unsigned short wFeatureSelector) {
196 uint32_t CDC_ClearCommFeature (
unsigned short wFeatureSelector) {
209 uint32_t CDC_SetLineCoding (
void) {
211 CDC_LineCoding.dwDTERate = (EP0Buf[0] << 0)
215 CDC_LineCoding.bCharFormat = EP0Buf[4];
216 CDC_LineCoding.bParityType = EP0Buf[5];
217 CDC_LineCoding.bDataBits = EP0Buf[6];
221 ser_InitPort (CDC_LineCoding.dwDTERate,
222 CDC_LineCoding.bDataBits,
223 CDC_LineCoding.bParityType,
224 CDC_LineCoding.bCharFormat);
235 uint32_t CDC_GetLineCoding (
void) {
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;
255 uint32_t CDC_SetControlLineState (
unsigned short wControlSignalBitmap) {
270 uint32_t CDC_SendBreak (
unsigned short wDurationOfBreak) {
282 void CDC_BulkIn(
void) {
283 int numBytesRead, numBytesAvail;
285 ser_AvailChar (&numBytesAvail);
289 numBytesRead = ser_Read ((
char *)&BulkBufIn[0], &numBytesAvail);
292 if (numBytesRead > 0) {
293 USB_WriteEP (CDC_DEP_IN, &BulkBufIn[0], numBytesRead);
306 void CDC_BulkOut(
void) {
310 numBytesRead = USB_ReadEP(CDC_DEP_OUT, &BulkBufOut[0]);
315 CDC_WrOutBuf ((
char *)&BulkBufOut[0], &numBytesRead);
325 unsigned short CDC_GetSerialState (
void) {
329 ser_LineState (&temp);
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;
339 return (CDC_SerialState);
346 void CDC_NotificationIn (
void) {
348 NotificationBuf[0] = 0xA1;
349 NotificationBuf[1] = CDC_NOTIFICATION_SERIAL_STATE;
350 NotificationBuf[2] = 0x00;
351 NotificationBuf[3] = 0x00;
352 NotificationBuf[4] = 0x00;
353 NotificationBuf[5] = 0x00;
354 NotificationBuf[6] = 0x02;
355 NotificationBuf[7] = 0x00;
356 NotificationBuf[8] = (CDC_SerialState >> 0) & 0xFF;
357 NotificationBuf[9] = (CDC_SerialState >> 8) & 0xFF;
359 USB_WriteEP (CDC_CEP_IN, &NotificationBuf[0], 10);