#ifndef CLASS_EEM #define CLASS_EEM #include #include "../usb_callback_event.h" #include #include #define USB_EEM_FIFO_SIZE (8192) typedef enum { EEM_ECHO = 0, // Echo EEM_ECHO_RESPONSE, // Echo response EEM_SUSPEND_HINT, // Suspend hint EEM_RESPONSE_HINT, // Response hint EEM_RESPONSE_COMPLETE_HINT, // Response complete hint EEM_TICKLE, // Tickle } USB_EemCmd; typedef enum { EEM_IDLE = 0, // IDLE state, a new transfer may be initiated EEM_TRANSFER_IN_PROGRESS // transfer is in progress, new transfers have to wait } USB_EemFsmState; typedef enum { EEM_EVT_NONE = 0, // no event EEM_EVT_NETBOUND_PCKT_RECEIVED, // a USB packet has been received for a netbound Ethernet frame // EEM_EVT_HOSTBOUND_FRAME_IN_QUEUE, // a new hostbound frame is in the queue EEM_EVT_HOSTBOUND_TRANSFER_DONE, // the previous hostbound transfer has completed } USB_EemEvent; /** * Ethernet frame prepended with EEM header */ typedef struct { uint16_t header; ///< EEM header (CRC present?, Frame Length) uint8_t payload[]; ///< Actual payload } USB_EemFrame; typedef struct { EthInterface * intf; // interface for packet interception and injection uint8_t data_ep; // bulk data in and out endpoint pair osMessageQueueId_t eventQueue; // event queue // BFifo hostbFifo; // Hostbound FIFO BFifo netbFifo; // Network bound FIFO USB_EemFsmState netbState; // state of host bound operations uint16_t netbFrameSize; // size of network bound packet uint16_t netbSizeLeft; // number of bytes expected from the host sending into current network bound packet bool netbAutoArm; // signal, that the netbound endpoint should be autoarmed or not USB_EemFsmState hostbState; // state of network bound operations osMessageQueueId_t hostbFrameQ; // queue for hostbound message pointers USB_EemFrame * hostbFrame; // hostbound frame uint16_t hostbFrameLength; // hostbound frame length uint16_t hostbFrameIndex; // read index in hostbound frame bool echoRespQueued; // indicates if an EchoResponse was queued bool initialized; // EEM is initialized osThreadId_t th; // EEM thread } 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); /** * Set Ethernet interface. * @param pointer to Ethernet interface */ void usb_eem_set_intf(EthInterface * intf); #endif /* CLASS_EEM */