diff --git a/CMakeLists.txt b/CMakeLists.txt index 7e14ec5..b8564ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,9 @@ target_sources( class/cdc.c class/cdc.h + class/eem.c + class/eem.h + CMakeLists.txt desc/usb_desc.c diff --git a/class/eem.c b/class/eem.c new file mode 100644 index 0000000..0658aa1 --- /dev/null +++ b/class/eem.c @@ -0,0 +1,39 @@ +#include "eem.h" + +#include + +#include "../usb.h" + +static USB_EemState eems = {0}; + +void usb_eem_init(uint8_t data_ep) { + // clear the state + memset(&eems, 0, sizeof(USB_EemState)); + + // store data endpoint number + eems.data_ep = data_ep; + + // EEM is operational + eems.initialized = true; +} + +int usb_eem_process_and_return(USB_CallbackEvent *cbevt) { + switch (cbevt->type) { + case USB_CBEVT_UNKNOWN_REQ: + break; + + case USB_CBEVT_OUT: + break; + + case USB_CBEVT_IN: + if (cbevt->ep == eems.data_ep) { // verify endpoint number + usbcore_write(eems.data_ep, NULL, 0); // send ZLP + } + break; + + default: + break; + } + + return 0; +} diff --git a/class/eem.h b/class/eem.h new file mode 100644 index 0000000..1a9daf5 --- /dev/null +++ b/class/eem.h @@ -0,0 +1,26 @@ +#ifndef CLASS_EEM +#define CLASS_EEM + +#include + +#include "../usb_callback_event.h" + +typedef struct { + uint8_t data_ep; // bulk data in and out endpoint pair + bool initialized; // EEM is initialized +} USB_EemState; + +/** + * Initialize USB EEM module. + * @param data_ep data endpoint number +*/ +void usb_eem_init(uint8_t data_ep); + +/** + * Callback function for data reception and transmission. + * @param cbevt pointer to callback event structure + * @return function returns how to proceed with packet processing +*/ +int usb_eem_process_and_return(USB_CallbackEvent * cbevt); + +#endif /* CLASS_EEM */