#pragma GCC push_options #pragma GCC optimize ("O1") void InitEndpoints(void) { trace("InitEndpoints\n"); USB_CNTR = 1; // disable reset and int CMD.Configuration = 0; // nothing before CONFIGURED CMD.TransferLen = 0; // nothing to transfer CMD.PacketLen = 0; // nothing to transfer CMD.TransferPtr = 0; USB_CNTR = 0; // all int off suspended = false; configurationSet = false; transmitting = false; receiving = false; // EP0 = Control, IN and OUT EpTable[0].TxOffset = Ep0TxOffset; EpTable[0].TxCount = 0; EpTable[0].RxOffset = Ep0RxOffset; EpTable[0].RxCount = EpCtrlLenId; // EP1 = Bulk IN (only IN) EpTable[1].TxOffset = Ep1TxAOffset; EpTable[1].TxCount = 0; EpTable[1].RxOffset = Ep1TxBOffset; // here 2nd tx buffer EpTable[1].RxCount = EpBulkLenId; // EP2 = Bulk OUT (only OUT) EpTable[2].TxOffset = Ep2RxAOffset; EpTable[2].TxCount = EpBulkLenId; EpTable[2].RxOffset = Ep2RxBOffset; EpTable[2].RxCount = EpBulkLenId; // EP3 = Int, IN and OUT EpTable[3].TxOffset = Ep3TxOffset; EpTable[3].TxCount = EpIntLenId; EpTable[3].RxOffset = Ep3RxOffset; EpTable[3].RxCount = EpIntLenId; USB_BTABLE = EpTableOffset; USB_EP0R = (3 << 12) | // STAT_RX = 3, rx enabled (2 << 4) | // STAT_TX = 2, send nak (1 << 9) | // EP_TYPE = 1, control logEpCtrl; USB_EP1R = (0 << 12) | // STAT_RX = 0, rx disabled (2 << 4) | // STAT_TX = 2, send nak (0 << 9) | // EP_TYPE = 0, bulk logEpBulkIn; USB_EP2R = (3 << 12) | // STAT_RX = 3, rx enabled (0 << 4) | // STAT_TX = 0, tx disabled (0 << 9) | // EP_TYPE = 0, bulk logEpBulkOut; USB_EP3R = (3 << 12) | // STAT_RX = 3, rx enabled (2 << 4) | // STAT_TX = 2, send nak (3 << 9) | // EP_TYPE = 0, bulk logEpInt; USB_ISTR = 0; // remove pending interrupts USB_CNTR = CTRM | // Int after ACK packages in or out RESETM | // Int after reset SUSPM | WKUPM | ESOFM | SOFM; // Int every 1ms frame USB_SetAddress(0); } #pragma GCC pop_options