bool Pipe_ConfigurePipe(const uint8_t Number, const uint8_t Type, const uint8_t Token, const uint8_t EndpointNumber, const uint16_t Size, const uint8_t Banks) { Pipe_SelectPipe(Number); Pipe_EnablePipe(); UPCFG1X = 0; UPCFG0X = ((Type << EPTYPE0) | Token | (EndpointNumber << PEPNUM0)); UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); return Pipe_IsConfigured(); }
void Pipe_ConfigurePipe_P(const uint8_t PipeNum, const uint16_t PipeSize, const uint8_t UPCFG0Xdata, const uint8_t UPCFG1Xdata) { Pipe_SelectPipe(PipeNum); Pipe_EnablePipe(); UPCFG0X = UPCFG0Xdata; UPCFG1X = ((UPCFG1X & (1 << ALLOC)) | UPCFG1Xdata | Pipe_BytesToEPSizeMask(PipeSize)); UPCFG2X = 0; Pipe_AllocateMemory(); }
bool Pipe_ConfigurePipe(const uint8_t Address, const uint8_t Type, const uint8_t EndpointAddress, const uint16_t Size, const uint8_t Banks) { uint8_t Number = (Address & PIPE_EPNUM_MASK); uint8_t Token = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT; if (Number >= PIPE_TOTAL_PIPES) return false; if (Type == EP_TYPE_CONTROL) Token = PIPE_TOKEN_SETUP; #if defined(ORDERED_EP_CONFIG) Pipe_SelectPipe(Number); Pipe_EnablePipe(); UPCFG1X = 0; UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0)); UPCFG1X = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size)); Pipe_SetInfiniteINRequests(); return Pipe_IsConfigured(); #else for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) { uint8_t UPCFG0XTemp; uint8_t UPCFG1XTemp; uint8_t UPCFG2XTemp; uint8_t UPIENXTemp; Pipe_SelectPipe(PNum); if (PNum == Number) { UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0)); UPCFG1XTemp = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size)); UPCFG2XTemp = 0; UPIENXTemp = 0; } else { UPCFG0XTemp = UPCFG0X; UPCFG1XTemp = UPCFG1X; UPCFG2XTemp = UPCFG2X; UPIENXTemp = UPIENX; } if (!(UPCFG1XTemp & (1 << ALLOC))) continue; Pipe_DisablePipe(); UPCFG1X &= ~(1 << ALLOC); Pipe_EnablePipe(); UPCFG0X = UPCFG0XTemp; UPCFG1X = UPCFG1XTemp; UPCFG2X = UPCFG2XTemp; UPIENX = UPIENXTemp; Pipe_SetInfiniteINRequests(); if (!(Pipe_IsConfigured())) return false; } Pipe_SelectPipe(Number); return true; #endif }
bool Pipe_ConfigurePipe(const uint8_t Address, const uint8_t Type, const uint8_t EndpointAddress, const uint16_t Size, const uint8_t Banks) { uint8_t Number = (Address & PIPE_EPNUM_MASK); uint8_t Token = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT; if (Number >= PIPE_TOTAL_PIPES) return false; if (Type == EP_TYPE_CONTROL) Token = PIPE_TOKEN_SETUP; USB_Pipe_FIFOPos[Number] = &AVR32_USBB_SLAVE[Number * PIPE_HSB_ADDRESS_SPACE_SIZE]; #if defined(ORDERED_EP_CONFIG) Pipe_SelectPipe(Number); Pipe_EnablePipe(); (&AVR32_USBB.upcfg0)[Number] = 0; (&AVR32_USBB.upcfg0)[Number] = (AVR32_USBB_ALLOC_MASK | ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) | ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) | ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0) | Pipe_BytesToEPSizeMask(Size) | ((uint32_t)Number << AVR32_USBB_PEPNUM_OFFSET)); Pipe_SetInfiniteINRequests(); return Pipe_IsConfigured(); #else for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) { uint32_t UPCFG0Temp; Pipe_SelectPipe(PNum); if (PNum == Number) { UPCFG0Temp = (AVR32_USBB_ALLOC_MASK | ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) | ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) | ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0) | Pipe_BytesToEPSizeMask(Size) | ((EndpointAddress & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET)); } else { UPCFG0Temp = (&AVR32_USBB.upcfg0)[PNum]; } if (!(UPCFG0Temp & AVR32_USBB_ALLOC_MASK)) continue; Pipe_DisablePipe(); (&AVR32_USBB.upcfg0)[PNum] &= ~AVR32_USBB_ALLOC_MASK; Pipe_EnablePipe(); (&AVR32_USBB.upcfg0)[PNum] = UPCFG0Temp; Pipe_SetInfiniteINRequests(); if (!(Pipe_IsConfigured())) return false; } Pipe_SelectPipe(Number); return true; #endif }
bool Pipe_ConfigurePipe(const uint8_t Number, const uint8_t Type, const uint8_t Token, const uint8_t EndpointNumber, const uint16_t Size, const uint8_t Banks) { #if defined(ORDERED_EP_CONFIG) Pipe_SelectPipe(Number); Pipe_EnablePipe(); UPCFG1X = 0; UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); Pipe_SetInfiniteINRequests(); return Pipe_IsConfigured(); #else for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) { uint8_t UPCFG0XTemp; uint8_t UPCFG1XTemp; uint8_t UPCFG2XTemp; uint8_t UPCONXTemp; uint8_t UPINRQXTemp; uint8_t UPIENXTemp; Pipe_SelectPipe(PNum); if (PNum == Number) { UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0)); UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size)); UPCFG2XTemp = 0; UPCONXTemp = ((1 << PEN) | (1 << INMODE)); UPINRQXTemp = 0; UPIENXTemp = 0; } else { UPCFG0XTemp = UPCFG0X; UPCFG1XTemp = UPCFG1X; UPCFG2XTemp = UPCFG2X; UPCONXTemp = UPCONX; UPINRQXTemp = UPINRQX; UPIENXTemp = UPIENX; } Pipe_SetInfiniteINRequests(); if (!(UPCFG1XTemp & (1 << ALLOC))) continue; Pipe_DisablePipe(); UPCFG1X &= (1 << ALLOC); Pipe_EnablePipe(); UPCFG0X = UPCFG0XTemp; UPCFG1X = UPCFG1XTemp; UPCFG2X = UPCFG2XTemp; UPCONX = UPCONXTemp; UPINRQX = UPINRQXTemp; UPIENX = UPIENXTemp; if (!(Pipe_IsConfigured())) return false; } Pipe_SelectPipe(Number); return true; #endif }