uint8_t ecm_send(uint8_t * senddata, uint16_t sendlen, uint8_t led) { U8 byte_in_packet = 0; //Send Data Usb_select_endpoint(TX_EP); if(usb_endpoint_wait_for_write_enabled()!=0) { USB_ETH_HOOK_TX_ERROR("Timeout: write enabled"); return 0; } #ifdef USB_ETH_HOOK_TX_START USB_ETH_HOOK_TX_START(); #endif //Send packet while(sendlen) { Usb_write_byte(*senddata); senddata++; sendlen--; byte_in_packet++; //If endpoint is full, send data in //And then wait for data to transfer if (!Is_usb_write_enabled()) { Usb_ack_in_ready(); if(usb_endpoint_wait_for_write_enabled()!=0) { USB_ETH_HOOK_TX_ERROR("Timeout: write enabled"); return 0; } byte_in_packet=0; } } //Send last data in - also handles sending a ZLP if needed Usb_ack_in_ready(); #ifdef USB_ETH_HOOK_TX_END USB_ETH_HOOK_TX_END(); #endif //Wait for ready if(usb_endpoint_wait_for_IN_ready()!=0) { USB_ETH_HOOK_TX_ERROR("Timeout: IN ready"); return 0; } return 1; }
/** \brief Sends a single ethernet frame over USB using appropriate low-level protocol (EEM or RNDIS) \param senddata Data to send \param sendlen Length of data to send \param led Should the LED be light up for this frame? */ uint8_t usb_eth_send(uint8_t * senddata, uint16_t sendlen, uint8_t led) { uint8_t ret = 0; if(!usb_eth_is_active) { USB_ETH_HOOK_TX_ERROR("Inactive"); goto bail; } //Check device is set up if (Is_device_enumerated() == 0) { USB_ETH_HOOK_TX_ERROR("Device not enumerated"); goto bail; } switch(usb_configuration_nb) { case USB_CONFIG_RNDIS_DEBUG: case USB_CONFIG_RNDIS: ret = rndis_send(senddata, sendlen, led); break; case USB_CONFIG_EEM: ret = eem_send(senddata, sendlen, led); break; case USB_CONFIG_ECM: case USB_CONFIG_ECM_DEBUG: ret = ecm_send(senddata, sendlen, led); break; } bail: if(!ret) // Hit the watchdog if we have a successful send. watchdog_periodic(); return ret; }