32 #define __INCLUDE_FROM_USB_DRIVER
33 #include "../../../USBMode.h"
35 #if defined(USB_CAN_BE_DEVICE)
36 #include "../../../Device.h"
37 #include "../../../Endpoint.h"
39 #if defined(USB_DEVICE_ROM_DRIVER)
44 #define ROMDRIVER_CDC_DATA_BUFFER_SIZE 640
45 #define CDC_EP_SIZE (CALLBACK_UsbdCdc_Register_DataOutEndpointSize())
46 #if (USB_FORCED_FULLSPEED)
47 #define CDC_MAX_BULK_EP_SIZE 64
49 #define CDC_MAX_BULK_EP_SIZE 512
54 uint8_t data[ROMDRIVER_CDC_DATA_BUFFER_SIZE];
58 } CDC_CIRCLE_BUFFER_T;
61 CDC_LINE_CODING* UsbdCdcLineCoding;
66 volatile uint32_t UsbdCdc_EPIN_buffer_count = 0;
69 volatile uint32_t UsbdCdc_EPOUT_buffer_index = 0;
70 volatile uint32_t UsbdCdc_EPOUT_buffer_count = 0;
72 CDC_CIRCLE_BUFFER_T UsbdCdc_OUT_buffer, UsbdCdc_IN_buffer;
77 void UsbdCdc_OUT_Buffer_Reset(
void)
79 UsbdCdc_OUT_buffer.rd_index = 0;
80 UsbdCdc_OUT_buffer.wr_index = 0;
81 UsbdCdc_OUT_buffer.count = 0;
84 void UsbdCdc_IN_Buffer_Reset(
void)
86 UsbdCdc_IN_buffer.rd_index = 0;
87 UsbdCdc_IN_buffer.wr_index = 0;
88 UsbdCdc_IN_buffer.count = 0;
91 PRAGMA_WEAK(EVENT_UsbdCdc_SetLineCode,EVENT_UsbdCdc_SetLineCode_Stub)
92 void EVENT_UsbdCdc_SetLineCode(CDC_LINE_CODING* line_coding)
ATTR_WEAK ATTR_ALIAS(EVENT_UsbdCdc_SetLineCode_Stub);
97 memcpy(UsbdCdcLineCoding, line_coding,
sizeof(CDC_LINE_CODING));
98 EVENT_UsbdCdc_SetLineCode(line_coding);
116 cdc_param.
SetLineCode = CALLBACK_UsbdCdc_SetLineCode;
120 USBD_API->core->RegisterEpHandler (UsbHandle, ep_indx, UsbdCdc_Bulk_IN_Hdlr,
NULL);
124 USBD_API->core->RegisterEpHandler (UsbHandle, ep_indx, UsbdCdc_Bulk_OUT_Hdlr,
NULL);
126 UsbdCdc_OUT_Buffer_Reset();
127 UsbdCdc_IN_Buffer_Reset();
128 USBD_API->cdc->init(UsbHandle, &cdc_param, &UsbdCdcHdlr);
139 if(UsbdCdc_IN_buffer.count <= ROMDRIVER_CDC_DATA_BUFFER_SIZE)
141 UsbdCdc_IN_buffer.data[UsbdCdc_IN_buffer.wr_index] = buffer[buffer_index++];
142 UsbdCdc_IN_buffer.wr_index++;
143 UsbdCdc_IN_buffer.wr_index &= (ROMDRIVER_CDC_DATA_BUFFER_SIZE -1);
144 UsbdCdc_IN_buffer.count++;
154 if(UsbdCdc_OUT_buffer.count > len)
159 avail_len = UsbdCdc_OUT_buffer.count;
161 for(i=0; i<avail_len;i++)
163 buffer[i] = UsbdCdc_OUT_buffer.data[UsbdCdc_OUT_buffer.rd_index];
164 UsbdCdc_OUT_buffer.rd_index++;
165 UsbdCdc_OUT_buffer.rd_index &= (ROMDRIVER_CDC_DATA_BUFFER_SIZE - 1);
166 UsbdCdc_OUT_buffer.count--;
177 avail_count = ROMDRIVER_CDC_DATA_BUFFER_SIZE - UsbdCdc_OUT_buffer.count;
178 if(avail_count > UsbdCdc_EPOUT_buffer_count)
180 avail_count = UsbdCdc_EPOUT_buffer_count;
182 for(i=0; i<avail_count; i++)
184 uint8_t t = UsbdCdc_EPOUT_buffer[UsbdCdc_EPOUT_buffer_index];
185 UsbdCdc_OUT_buffer.data[UsbdCdc_OUT_buffer.wr_index] = t;
186 UsbdCdc_EPOUT_buffer_index++;
188 UsbdCdc_OUT_buffer.count++;
189 UsbdCdc_OUT_buffer.wr_index++;
190 UsbdCdc_OUT_buffer.wr_index &= (ROMDRIVER_CDC_DATA_BUFFER_SIZE - 1);
192 UsbdCdc_EPOUT_buffer_count--;
196 if(UsbdCdc_EPIN_buffer_count == 0){
197 if(UsbdCdc_IN_buffer.count > CDC_EP_SIZE)
199 avail_count = CDC_EP_SIZE;
202 avail_count = UsbdCdc_IN_buffer.count;
205 for(i=0; i<avail_count; i++)
207 UsbdCdc_EPIN_buffer[i] = UsbdCdc_IN_buffer.data[UsbdCdc_IN_buffer.rd_index];
208 UsbdCdc_IN_buffer.rd_index++;
209 UsbdCdc_IN_buffer.rd_index &= (ROMDRIVER_CDC_DATA_BUFFER_SIZE - 1);
210 UsbdCdc_IN_buffer.count --;
213 UsbdCdc_EPIN_buffer_count = avail_count;
222 UsbdCdc_EPOUT_buffer_count =
USBD_API->hw->ReadEP(UsbHandle, EpAdd, UsbdCdc_EPOUT_buffer);
226 if(UsbdCdc_EPOUT_buffer_count == 0)
229 UsbdCdc_EPOUT_buffer_index = 0;
231 USBD_API->hw->ReadReqEP(UsbHandle, EpAdd, UsbdCdc_EPOUT_buffer, CDC_EP_SIZE);
243 USBD_API->hw->WriteEP(UsbHandle, EpAdd, UsbdCdc_EPIN_buffer,UsbdCdc_EPIN_buffer_count);
245 UsbdCdc_EPIN_buffer_count = 0;
250 void UsbdCdc_EVENT_Stub(
void* param)
254 void EVENT_UsbdCdc_SetLineCode_Stub(CDC_LINE_CODING* line_coding)