91 lines
2.7 KiB
C
91 lines
2.7 KiB
C
#include "cdc.h"
|
|
|
|
#include <memory.h>
|
|
|
|
#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) {
|
|
|
|
} |