#include "cdc.h" #include #include "../usb_device_types.h" #include "../usb.h" // state static USB_CdcState cdcs; static uint8_t cdc_buffer[USB_CDC_BUFSIZE]; void usb_cdc_init(const USB_CdcAssignments *as) { // clear the structure memset(&cdcs, 0, sizeof(USB_CdcState)); // fill-in default values USB_Cdc_LineCodingStruct *lc = &cdcs.line_coding; lc->dwDTERate = USB_CDC_DEFAULT_BITRATE; lc->bCharFormat = USB_CDC_DEFAULT_CHAR_FORMAT; lc->bParityType = USB_CDC_DEFAULT_PARITY_TYPE; lc->bDataBits = USB_CDC_DEFAULT_DATA_BITS; // fill-in assigments cdcs.ep_assignments = *as; // assign buffer pointer USB_CdcBuffer * buf = &cdcs.buffer; buf->p = cdc_buffer; buf->size = USB_CDC_BUFSIZE; } int usb_cdc_process_and_return(USB_CallbackEvent *cbevt) { int ret = -1; switch (cbevt->type) { case USB_CBEVT_UNKNOWN_REQ: { switch (cbevt->setup_request->bRequest) { case USB_CDC_SET_LINE_CODING: // set line coding memcpy(&cdcs.line_coding, cbevt->data, sizeof(USB_Cdc_LineCodingStruct)); MSG("%u\n", cdcs.line_coding.dwDTERate); ret = 0; break; case USB_CDC_SET_CONTROL_LINE_STATE: // set control line state memcpy(&cdcs.control_line_state, cbevt->data, sizeof(USB_Cdc_ControlLineStateStruct)); MSG("%u\n", cdcs.control_line_state.D); ret = 0; break; default: break; } // send a ZLP reply if (ret != -1) { cbevt->reply_data = NULL; cbevt->reply_size = 0; cbevt->reply_valid = true; } break; } case USB_CBEVT_OUT: { if (cbevt->ep == cdcs.ep_assignments.data_ep) { //MSG("%c\n", cbevt->data[0]); ret = 0; usbcore_write(cdcs.ep_assignments.data_ep, cbevt->data, cbevt->size); // echo } break; } case USB_CBEVT_IN: { if (cbevt->ep == cdcs.ep_assignments.control_ep) { // if notification feeding is requested //usbcore_write(cdcs.ep_assignments.control_ep, NULL, 0); // send ZLP ret = 0; } else if (cbevt->ep == cdcs.ep_assignments.data_ep) { // if data are requested //usbcore_write(cdcs.ep_assignments.data_ep, NULL, 0); // send ZLP ret = 0; // TODO!! } } default: break; } return ret; } void usb_cdc_write(const uint8_t * data, uint32_t size) { }