Пример #1
0
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;
}
Пример #2
0
/**
 \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;
}