bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData) { #if defined(CONTROL_ONLY_DEVICE) Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); Endpoint_EnableEndpoint(); UECFG1X = 0; UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else uint8_t UECFG0XTemp[ENDPOINT_TOTAL_ENDPOINTS]; uint8_t UECFG1XTemp[ENDPOINT_TOTAL_ENDPOINTS]; for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { Endpoint_SelectEndpoint(EPNum); UECFG0XTemp[EPNum] = UECFG0X; UECFG1XTemp[EPNum] = UECFG1X; } UECFG0XTemp[Number] = UECFG0XData; UECFG1XTemp[Number] = UECFG1XData; for (uint8_t EPNum = 1; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { Endpoint_SelectEndpoint(EPNum); UEIENX = 0; UEINTX = 0; UECFG1X = 0; Endpoint_DisableEndpoint(); } for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { if (!(UECFG1XTemp[EPNum] & (1 << ALLOC))) continue; Endpoint_SelectEndpoint(EPNum); Endpoint_EnableEndpoint(); UECFG0X = UECFG0XTemp[EPNum]; UECFG1X = UECFG1XTemp[EPNum]; if (!(Endpoint_IsConfigured())) return false; } Endpoint_SelectEndpoint(Number); return true; #endif }
bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData) { #if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG) Endpoint_SelectEndpoint(Number); Endpoint_EnableEndpoint(); // UECFG1X = 0; // UECFG0X = UECFG0XData; // UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { // uint8_t UECFG0XTemp; // uint8_t UECFG1XTemp; // uint8_t UEIENXTemp; Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { // UECFG0XTemp = UECFG0XData; // UECFG1XTemp = UECFG1XData; // UEIENXTemp = 0; } else { // UECFG0XTemp = UECFG0X; // UECFG1XTemp = UECFG1X; // UEIENXTemp = UEIENX; } // if (!(UECFG1XTemp & (1 << ALLOC))) // continue; Endpoint_DisableEndpoint(); // UECFG1X &= ~(1 << ALLOC); Endpoint_EnableEndpoint(); // UECFG0X = UECFG0XTemp; // UECFG1X = UECFG1XTemp; // UEIENX = UEIENXTemp; if (!(Endpoint_IsConfigured())) return false; } Endpoint_SelectEndpoint(Number); return true; #endif }
bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint32_t UECFG0Data) { USB_Endpoint_FIFOPos[Number] = &AVR32_USBB_SLAVE[Number * ENDPOINT_HSB_ADDRESS_SPACE_SIZE]; #if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG) Endpoint_SelectEndpoint(Number); Endpoint_EnableEndpoint(); (&AVR32_USBB.uecfg0)[Number] = 0; (&AVR32_USBB.uecfg0)[Number] = UECFG0Data; return Endpoint_IsConfigured(); #else for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { uint32_t UECFG0Temp; Endpoint_SelectEndpoint(EPNum); if (EPNum == Number) { UECFG0Temp = UECFG0Data; } else { UECFG0Temp = (&AVR32_USBB.uecfg0)[EPNum]; } if (!(UECFG0Temp & AVR32_USBB_ALLOC_MASK)) continue; Endpoint_DisableEndpoint(); (&AVR32_USBB.uecfg0)[EPNum] &= ~AVR32_USBB_ALLOC_MASK; Endpoint_EnableEndpoint(); (&AVR32_USBB.uecfg0)[EPNum] = UECFG0Temp; if (!(Endpoint_IsConfigured())) return false; } Endpoint_SelectEndpoint(Number); return true; #endif }
bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint8_t UECFG0XData, const uint8_t UECFG1XData) { Endpoint_SelectEndpoint(Number); Endpoint_EnableEndpoint(); UECFG1X = 0; UECFG0X = UECFG0XData; UECFG1X = UECFG1XData; return Endpoint_IsConfigured(); }
bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, const uint32_t UECFG0Data) { Endpoint_SelectEndpoint(Number); Endpoint_EnableEndpoint(); (&AVR32_USBB.uecfg0)[Number] = 0; (&AVR32_USBB.uecfg0)[Number] = UECFG0Data; USB_EndpointFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000]; return Endpoint_IsConfigured(); }
bool Endpoint_ConfigureEndpoint(const uint8_t Number, const uint8_t Type, const uint8_t Direction, const uint16_t Size, const uint8_t Banks) { Endpoint_SelectEndpoint(Number); Endpoint_EnableEndpoint(); UECFG1X = 0; UECFG0X = ((Type << EPTYPE0) | Direction); UECFG1X = ((1 << ALLOC) | Banks | Endpoint_BytesToEPSizeMask(Size)); return Endpoint_IsConfigured(); }
static bool USB_BulkWorker() { uint8_t cmdBuf[XUM_CMDBUF_SIZE], statusBuf[XUM_STATUSBUF_SIZE]; int8_t status; /* * If we are not connected to the host or a command has not yet * been sent, no more processing is required. */ if (USB_DeviceState != DEVICE_STATE_Configured) return false; Endpoint_SelectEndpoint(XUM_BULK_OUT_ENDPOINT); if (!Endpoint_IsReadWriteAllowed()) return false; #ifdef DEBUG // Dump the status of both endpoints before getting the command Endpoint_SelectEndpoint(XUM_BULK_IN_ENDPOINT); DEBUGF(DBG_INFO, "bsti %x %x %x %x %x %x %x %x\n", Endpoint_GetCurrentEndpoint(), Endpoint_BytesInEndpoint(), Endpoint_IsEnabled(), Endpoint_IsReadWriteAllowed(), Endpoint_IsConfigured(), Endpoint_IsINReady(), Endpoint_IsOUTReceived(), Endpoint_IsStalled()); Endpoint_SelectEndpoint(XUM_BULK_OUT_ENDPOINT); DEBUGF(DBG_INFO, "bsto %x %x %x %x %x %x %x %x\n", Endpoint_GetCurrentEndpoint(), Endpoint_BytesInEndpoint(), Endpoint_IsEnabled(), Endpoint_IsReadWriteAllowed(), Endpoint_IsConfigured(), Endpoint_IsINReady(), Endpoint_IsOUTReceived(), Endpoint_IsStalled()); #endif // Read in the command from the host now that one is ready. if (!USB_ReadBlock(cmdBuf, sizeof(cmdBuf))) { board_set_status(STATUS_ERROR); return false; } // Allow commands to leave the extended status untouched memset(statusBuf, 0, sizeof(statusBuf)); /* * Decode and process the command. * usbHandleBulk() stores its extended result in the output buffer, * up to XUM_STATUSBUF_SIZE. * * Return values: * >0: completed ok, send the return value and extended status * 0: completed ok, don't send any status * -1: error, no status */ status = usbHandleBulk(cmdBuf, statusBuf); if (status > 0) { statusBuf[0] = status; USB_WriteBlock(statusBuf, sizeof(statusBuf)); } else if (status < 0) { DEBUGF(DBG_ERROR, "usbblk err\n"); board_set_status(STATUS_ERROR); Endpoint_StallTransaction(); return false; } return true; }
void OnyxWalker_Task(void) { unsigned short now = MY_GetTicks(); if (now < lastTicks) { ++numWraps; LCD_DrawUint(numWraps, WIDTH-7, 3); } if (now - lastVolts > 15000) { lastVolts = now; ++voltBlink; if ((power_cvolts > 1320 && !power_failure) || (voltBlink & 1)) { LCD_DrawFrac(power_cvolts, 2, 0, 3); LCD_DrawChar(' ', 6, 3); LCD_DrawChar('V', 7, 3); PORTC &= ~(1 << 6); } else { LCD_DrawChar(' ', 0, 3); for (unsigned char i = 1; i != 8; ++i) { LCD_DrawChar('-', i, 3); } if (!(voltBlink & 15) && power_cvolts > 0) { PORTC |= (1 << 6); } else { PORTC &= ~(1 << 6); } } } lastTicks = now; LCD_Flush(); if (lastTicks - last_cvolts > 10000) { power_tick(); last_cvolts = lastTicks; } if (USB_DeviceState != DEVICE_STATE_Configured) { return; } /* see if host has requested data */ Endpoint_SelectEndpoint(DATA_RX_EPNUM); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); epic = Endpoint_IsConfigured(); epiir = epic && Endpoint_IsINReady(); epirwa = epiir && Endpoint_IsReadWriteAllowed(); if (epirwa && (in_packet_ptr || (now - last_flush > FLUSH_TICK_INTERVAL))) { last_flush = now; if (in_packet_ptr == 0) { in_packet_ptr = 1; // repeat the last received serial } // send packet in for (unsigned char ch = 0; ch < in_packet_ptr; ++ch) { Endpoint_Write_8(in_packet[ch]); } Endpoint_ClearIN(); in_packet_ptr = 0; } /* see if there's data from the host */ Endpoint_SelectEndpoint(DATA_TX_EPNUM); Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT); MY_SetLed(LED_act, false); if (Endpoint_IsConfigured() && Endpoint_IsOUTReceived() && Endpoint_IsReadWriteAllowed()) { uint8_t n = Endpoint_BytesInEndpoint(); if (n > sizeof(out_packet)) { MY_Failure("OUT too big", n, sizeof(out_packet)); } out_packet_ptr = 0; MY_SetLed(LED_act, true); while (n > 0) { epic = Endpoint_Read_8(); out_packet[out_packet_ptr++] = epic; --n; } Endpoint_ClearOUT(); dispatch_out(); } }