void udd_ep_abort(udd_ep_id_t ep)
{
	bool b_dir_in = ep & USB_EP_DIR_IN;
	irqflags_t flags;

	ep &= USB_EP_ADDR_MASK;
	if (USB_DEVICE_MAX_EP < ep)
		return;

	// Disable interrupts
	flags = cpu_irq_save();
	udd_disable_endpoint_interrupt(ep);
	cpu_irq_restore(flags);
	// Clear pending statuses
	if (b_dir_in) {
		// Kill banks
		if (Is_udd_transmit_ready(ep)) {
			udd_kill_data_in_fifo(ep,
					udd_get_endpoint_bank_max_nbr(ep)>1);
		}
		udd_ack_in_sent(ep);
		// Reset number of buffered banks
		udd_ep_job[ep - 1].bank = 0;
	} else {
		// Clear all pending banks statuses
		while(Is_udd_any_bank_received(ep)) {
			udd_ep_ack_out_received(ep);
		}
	}
	// Reset FIFO and data toggle
	udd_reset_endpoint(ep);
	// Abort job
	udd_ep_abort_job(ep);
}
void udd_ep_free(udd_ep_id_t ep)
{
	uint8_t ep_index = ep & USB_EP_ADDR_MASK;
	if (USB_DEVICE_MAX_EP < ep_index) {
		return;
	}
	udd_disable_endpoint(ep_index);
	udd_ep_abort_job(ep);
}
示例#3
0
void udd_ep_free(udd_ep_id_t ep)
{
	uint8_t ep_index = ep & USB_EP_ADDR_MASK;
	if (USB_DEVICE_MAX_EP < ep_index) {
		return;
	}
	udd_disable_endpoint(ep_index);
	udd_unallocate_memory(ep_index);
	udd_ep_abort_job(ep);
	udd_ep_job[ep_index - 1].stall_requested = false;
}
示例#4
0
void udd_ep_abort(udd_ep_id_t ep)
{
	uint8_t index = ep & USB_EP_ADDR_MASK;

	// Stop DMA transfer
	udd_disable_endpoint_dma_interrupt(index);
	udd_endpoint_dma_set_control(index, 0);
	// Kill banks
	udd_disable_endpoint_interrupt(index);
	while (udd_nb_busy_bank(index)) {
		udd_kill_last_in_bank(index);
		while(Is_udd_killing_last_in_bank(index));
	}
	udd_ep_abort_job(ep);
}
示例#5
0
bool udd_ep_set_halt(udd_ep_id_t ep)
{
	uint8_t index = ep & USB_EP_ADDR_MASK;

	if (USB_DEVICE_MAX_EP < index)
		return false;
	if (Is_udd_bank_interrupt_enabled(index)) {
		// Wait end of transfer (= no busy bank) before stall endpoint
		udd_ep_job[index - 1].stall_requested = true;
	} else {
		// Stall endpoint
		udd_enable_stall_handshake(index);
		udd_reset_data_toggle(index);
	}
	udd_ep_abort_job(ep);
	return true;
}
示例#6
0
void udd_ep_abort(udd_ep_id_t ep)
{
	// Stop DMA transfer
	udd_endpoint_dma_set_control((ep & USB_EP_ADDR_MASK), 0);
	udd_ep_abort_job(ep);
}
示例#7
0
void udd_ep_free(udd_ep_id_t ep)
{
	udd_disable_endpoint(ep & USB_EP_ADDR_MASK);
	udd_unallocate_memory(ep & USB_EP_ADDR_MASK);
	udd_ep_abort_job(ep);
}