static void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n, udd_ep_id_t ep)
{
	uint8_t port;
	UNUSED(n);

	switch (ep) {
#define UDI_CDC_DATA_EP_IN_TO_PORT(index, unused) \
	case UDI_CDC_DATA_EP_IN_##index: \
		port = index; \
		break;
	MREPEAT(UDI_CDC_PORT_NB, UDI_CDC_DATA_EP_IN_TO_PORT, ~)
#undef UDI_CDC_DATA_EP_IN_TO_PORT
	default:
		port = 0;
		break;
	}

	if (UDD_EP_TRANSFER_OK != status) {
		// Abort transfer
		return;
	}
	udi_cdc_tx_buf_nb[port][(udi_cdc_tx_buf_sel[port]==0)?1:0] = 0;
	udi_cdc_tx_both_buf_to_send[port] = false;
	udi_cdc_tx_trans_ongoing[port] = false;

	if (n != 0) {
		UDI_CDC_TX_EMPTY_NOTIFY(port);
	}
	udi_cdc_tx_send(port);
}
Beispiel #2
0
void udi_cdc_data_sent(udd_ep_status_t status, iram_size_t n)
{
	if (UDD_EP_TRANSFER_OK != status) {
		// Abort transfer
		return;
	}
	udi_cdc_tx_buf_nb[(udi_cdc_tx_buf_sel==0)?1:0] = 0;
	udi_cdc_tx_both_buf_to_send = false;
	udi_cdc_tx_trans_ongoing = false;
	udi_cdc_tx_send();
}
Beispiel #3
0
static void udi_cdc_data_sent_common(uint8_t port, udd_ep_status_t status, iram_size_t n)
{
	if (UDD_EP_TRANSFER_OK != status) {
		// Abort transfer
		return;
	}
	udi_cdc_tx_buf_nb[PORT][(udi_cdc_tx_buf_sel[PORT]==0)?1:0] = 0;
	udi_cdc_tx_both_buf_to_send[PORT] = false;
	udi_cdc_tx_trans_ongoing[PORT] = false;
	udi_cdc_tx_send(PORT);
}
void udi_cdc_data_sof_notify(void)
{
	static uint8_t port_notify = 0;

	// A call of udi_cdc_data_sof_notify() is done for each port
	udi_cdc_tx_send(port_notify);
#if UDI_CDC_PORT_NB != 1 // To optimize code
	port_notify++;
	if (port_notify >= UDI_CDC_PORT_NB) {
		port_notify = 0;
	}
#endif
}
Beispiel #5
0
bool udi_cdc_data_enable(void)
{
	// Initialize TX management
	udi_cdc_tx_trans_ongoing = false;
	udi_cdc_tx_both_buf_to_send = false;
	udi_cdc_tx_buf_sel = 0;
	udi_cdc_tx_buf_nb[0] = 0;
	udi_cdc_tx_buf_nb[1] = 0;
	udi_cdc_tx_sof_num = 0;
	udi_cdc_tx_send();

	// Initialize RX management
	udi_cdc_rx_trans_ongoing = false;
	udi_cdc_rx_buf_sel = 0;
	udi_cdc_rx_buf_nb[0] = 0;
	udi_cdc_rx_pos = 0;
	udi_cdc_running = udi_cdc_rx_start();
	return udi_cdc_running;
}
Beispiel #6
0
static bool udi_cdc_data_enable_common(uint8_t port)
{
	// Initialize TX management
	udi_cdc_tx_trans_ongoing[PORT] = false;
	udi_cdc_tx_both_buf_to_send[PORT] = false;
	udi_cdc_tx_buf_sel[PORT] = 0;
	udi_cdc_tx_buf_nb[PORT][0] = 0;
	udi_cdc_tx_buf_nb[PORT][1] = 0;
	udi_cdc_tx_sof_num[PORT] = 0;
	udi_cdc_tx_send(PORT);

	// Initialize RX management
	udi_cdc_rx_trans_ongoing[PORT] = false;
	udi_cdc_rx_buf_sel[PORT] = 0;
	udi_cdc_rx_buf_nb[PORT][0] = 0;
	udi_cdc_rx_pos[PORT] = 0;
	udi_cdc_running[PORT] = udi_cdc_rx_start(PORT);
	return udi_cdc_running[PORT];
}
Beispiel #7
0
bool udi_cdc_data_enable(void)
{
	uint8_t port;

#if UDI_CDC_PORT_NB == 1 // To optimize code
	port = 0;
	udi_cdc_nb_data_enabled = 0;
#else
	if (udi_cdc_nb_data_enabled > UDI_CDC_PORT_NB) {
		udi_cdc_nb_data_enabled = 0;
	}
	port = udi_cdc_nb_data_enabled;
#endif

	// Initialize TX management
	udi_cdc_tx_trans_ongoing[port] = false;
	udi_cdc_tx_both_buf_to_send[port] = false;
	udi_cdc_tx_buf_sel[port] = 0;
	udi_cdc_tx_buf_nb[port][0] = 0;
	udi_cdc_tx_buf_nb[port][1] = 0;
	udi_cdc_tx_sof_num[port] = 0;
	udi_cdc_tx_send(port);

	// Initialize RX management
	udi_cdc_rx_trans_ongoing[port] = false;
	udi_cdc_rx_buf_sel[port] = 0;
	udi_cdc_rx_buf_nb[port][0] = 0;
	udi_cdc_rx_buf_nb[port][1] = 0;
	udi_cdc_rx_pos[port] = 0;
	if (!udi_cdc_rx_start(port)) {
		return false;
	}
	udi_cdc_nb_data_enabled++;
	if (udi_cdc_nb_data_enabled == UDI_CDC_PORT_NB) {
		udi_cdc_data_running = true;
	}
	return true;
}
Beispiel #8
0
void udi_cdc_data_sof_notify(void)
{
	udi_cdc_tx_send();
}
Beispiel #9
0
void udi_cdc_data_sof_notify_3(void)
{
	udi_cdc_tx_send(2);
}
Beispiel #10
0
void udi_cdc_data_sof_notify_2(void)
{
	udi_cdc_tx_send(1);
}