projects
/
pub
/
USBasp.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (from parent 1:
b763c3f
)
Add software FIFOs to the UC3B pipe control interfaces, to match the endpoint control...
author
Dean Camera
<dean@fourwalledcubicle.com>
Sat, 5 Mar 2011 12:13:35 +0000
(12:13 +0000)
committer
Dean Camera
<dean@fourwalledcubicle.com>
Sat, 5 Mar 2011 12:13:35 +0000
(12:13 +0000)
LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
patch
|
blob
|
blame
|
history
LUFA/Drivers/USB/Core/DeviceStandardReq.c
patch
|
blob
|
blame
|
history
LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c
patch
|
blob
|
blame
|
history
LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h
patch
|
blob
|
blame
|
history
LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c
patch
|
blob
|
blame
|
history
LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.h
patch
|
blob
|
blame
|
history
diff --git
a/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
b/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
index
30979af
..
6933a89
100644
(file)
--- a/
LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
+++ b/
LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h
@@
-349,8
+349,8
@@
*
* \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
*/
*
* \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
*/
- static inline void Endpoint_Reset
FIFO
(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_Reset
FIFO
(const uint8_t EndpointNumber)
+ static inline void Endpoint_Reset
Endpoint
(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_Reset
Endpoint
(const uint8_t EndpointNumber)
{
UERST = (1 << EndpointNumber);
UERST = 0;
{
UERST = (1 << EndpointNumber);
UERST = 0;
diff --git
a/LUFA/Drivers/USB/Core/DeviceStandardReq.c
b/LUFA/Drivers/USB/Core/DeviceStandardReq.c
index
e43543d
..
4ee2fce
100644
(file)
--- a/
LUFA/Drivers/USB/Core/DeviceStandardReq.c
+++ b/
LUFA/Drivers/USB/Core/DeviceStandardReq.c
@@
-50,9
+50,9
@@
void USB_Device_ProcessControlRequest(void)
{
USB_ControlRequest.bmRequestType = Endpoint_Read_Byte();
USB_ControlRequest.bRequest = Endpoint_Read_Byte();
{
USB_ControlRequest.bmRequestType = Endpoint_Read_Byte();
USB_ControlRequest.bRequest = Endpoint_Read_Byte();
- USB_ControlRequest.wValue =
le16_to_cpu(Endpoint_Read_Word_LE()
);
- USB_ControlRequest.wIndex =
le16_to_cpu(Endpoint_Read_Word_LE()
);
- USB_ControlRequest.wLength =
le16_to_cpu(Endpoint_Read_Word_LE()
);
+ USB_ControlRequest.wValue =
Endpoint_Read_Word_LE(
);
+ USB_ControlRequest.wIndex =
Endpoint_Read_Word_LE(
);
+ USB_ControlRequest.wLength =
Endpoint_Read_Word_LE(
);
EVENT_USB_Device_ControlRequest();
EVENT_USB_Device_ControlRequest();
@@
-339,7
+339,7
@@
static void USB_Device_ClearSetFeature(void)
else
{
Endpoint_ClearStall();
else
{
Endpoint_ClearStall();
- Endpoint_Reset
FIFO
(EndpointIndex);
+ Endpoint_Reset
Endpoint
(EndpointIndex);
Endpoint_ResetDataToggle();
}
}
Endpoint_ResetDataToggle();
}
}
diff --git
a/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c
b/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c
index
ee9d35f
..
1775e98
100644
(file)
--- a/
LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c
+++ b/
LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c
@@
-50,7
+50,7
@@
bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
\r
(&AVR32_USBB.uecfg0)[Number] = 0;
\r
(&AVR32_USBB.uecfg0)[Number] = UECFG0Data;
\r
\r
(&AVR32_USBB.uecfg0)[Number] = 0;
\r
(&AVR32_USBB.uecfg0)[Number] = UECFG0Data;
\r
- USB_EndpointFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000];
\r
+ USB_EndpointFIFOPos[Number]
= &AVR32_USBB_SLAVE[Number * 0x10000];
\r
\r
return Endpoint_IsConfigured();
\r
}
\r
\r
return Endpoint_IsConfigured();
\r
}
\r
@@
-62,7
+62,7
@@
void Endpoint_ClearEndpoints(void)
Endpoint_SelectEndpoint(EPNum);
\r
(&AVR32_USBB.uecfg0)[EPNum] = 0;
\r
(&AVR32_USBB.uecon0clr)[EPNum] = 0xFFFFFFFF;
\r
Endpoint_SelectEndpoint(EPNum);
\r
(&AVR32_USBB.uecfg0)[EPNum] = 0;
\r
(&AVR32_USBB.uecon0clr)[EPNum] = 0xFFFFFFFF;
\r
- USB_EndpointFIFOPos[EPNum] = &AVR32_USBB_SLAVE[EPNum * 0x10000];
\r
+ USB_EndpointFIFOPos[EPNum]
= &AVR32_USBB_SLAVE[EPNum * 0x10000];
\r
Endpoint_DisableEndpoint();
\r
}
\r
}
\r
Endpoint_DisableEndpoint();
\r
}
\r
}
\r
diff --git
a/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h
b/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h
index
4860d26
..
b74b5da
100644
(file)
--- a/
LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h
+++ b/
LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h
@@
-332,8
+332,8
@@
*
\r
* \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
\r
*/
\r
*
\r
* \param[in] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
\r
*/
\r
- static inline void Endpoint_Reset
FIFO
(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
\r
- static inline void Endpoint_Reset
FIFO
(const uint8_t EndpointNumber)
\r
+ static inline void Endpoint_Reset
Endpoint
(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
\r
+ static inline void Endpoint_Reset
Endpoint
(const uint8_t EndpointNumber)
\r
{
\r
AVR32_USBB.uerst |= (AVR32_USBB_EPRST0_MASK << EndpointNumber);
\r
AVR32_USBB.uerst &= ~(AVR32_USBB_EPRST0_MASK << EndpointNumber);
\r
{
\r
AVR32_USBB.uerst |= (AVR32_USBB_EPRST0_MASK << EndpointNumber);
\r
AVR32_USBB.uerst &= ~(AVR32_USBB_EPRST0_MASK << EndpointNumber);
\r
@@
-397,8
+397,6
@@
(&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].killbks = true;
\r
while ((&AVR32_USBB.UECON0)[USB_SelectedEndpoint].killbk);
\r
}
\r
(&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].killbks = true;
\r
while ((&AVR32_USBB.UECON0)[USB_SelectedEndpoint].killbk);
\r
}
\r
-
\r
- USB_EndpointFIFOPos[USB_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_SelectedEndpoint * 0x10000];
\r
}
\r
\r
/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
\r
}
\r
\r
/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
\r
@@
-647,7
+645,7
@@
uint16_t Byte1 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint16_t Byte0 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
uint16_t Byte1 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint16_t Byte0 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
- return ((Byte
1 << 8) | Byte0
);
\r
+ return ((Byte
0 << 8) | Byte1
);
\r
}
\r
\r
/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
\r
}
\r
\r
/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
\r
@@
-663,7
+661,7
@@
uint16_t Byte0 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint16_t Byte1 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
uint16_t Byte0 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint16_t Byte1 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
- return ((Byte
1 << 8) | Byte0
);
\r
+ return ((Byte
0 << 8) | Byte1
);
\r
}
\r
\r
/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
\r
}
\r
\r
/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
\r
@@
-676,8
+674,8
@@
static inline void Endpoint_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_Word_LE(const uint16_t Word)
\r
{
\r
static inline void Endpoint_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_Word_LE(const uint16_t Word)
\r
{
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word & 0xFF);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word >> 8);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word >> 8);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word & 0xFF);
\r
}
\r
\r
/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
\r
}
\r
\r
/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
\r
@@
-690,8
+688,8
@@
static inline void Endpoint_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_Word_BE(const uint16_t Word)
\r
{
\r
static inline void Endpoint_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_Word_BE(const uint16_t Word)
\r
{
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word >> 8);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word & 0xFF);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word & 0xFF);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (Word >> 8);
\r
}
\r
\r
/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
\r
}
\r
\r
/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
\r
@@
-722,7
+720,7
@@
uint32_t Byte1 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint32_t Byte0 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
uint32_t Byte1 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint32_t Byte0 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
- return ((Byte
3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0
);
\r
+ return ((Byte
0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3
);
\r
}
\r
\r
/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
\r
}
\r
\r
/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
\r
@@
-740,7
+738,7
@@
uint32_t Byte2 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint32_t Byte3 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
uint32_t Byte2 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
uint32_t Byte3 = *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++);
\r
\r
- return ((Byte
3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0
);
\r
+ return ((Byte
0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3
);
\r
}
\r
\r
/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
\r
}
\r
\r
/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
\r
@@
-753,10
+751,10
@@
static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_DWord_LE(const uint32_t DWord)
\r
{
\r
static inline void Endpoint_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_DWord_LE(const uint32_t DWord)
\r
{
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord & 0xFF);
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 8);
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 16);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 24);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 24);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 16);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 8);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord & 0xFF);
\r
}
\r
\r
/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
\r
}
\r
\r
/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
\r
@@
-769,10
+767,10
@@
static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_DWord_BE(const uint32_t DWord)
\r
{
\r
static inline void Endpoint_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Endpoint_Write_DWord_BE(const uint32_t DWord)
\r
{
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 24);
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 16);
\r
- *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 8);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord & 0xFF);
\r
*(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord & 0xFF);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 8);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 16);
\r
+ *(((volatile uint8_t** volatile)USB_EndpointFIFOPos)[USB_SelectedEndpoint]++) = (DWord >> 24);
\r
}
\r
\r
/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
\r
}
\r
\r
/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
\r
diff --git
a/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c
b/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c
index
eb41143
..
51f4d5e
100644
(file)
--- a/
LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c
+++ b/
LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c
@@
-36,7
+36,9
@@
#include "../Pipe.h"
\r
\r
uint8_t USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
\r
#include "../Pipe.h"
\r
\r
uint8_t USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
\r
+
\r
volatile uint8_t USB_SelectedPipe = PIPE_CONTROLPIPE;
\r
volatile uint8_t USB_SelectedPipe = PIPE_CONTROLPIPE;
\r
+volatile void* USB_PipeFIFOPos[PIPE_TOTAL_PIPES];
\r
\r
bool Pipe_ConfigurePipe(const uint8_t Number,
\r
const uint8_t Type,
\r
\r
bool Pipe_ConfigurePipe(const uint8_t Number,
\r
const uint8_t Type,
\r
@@
-50,10
+52,11
@@
bool Pipe_ConfigurePipe(const uint8_t Number,
\r
(&AVR32_USBB.upcfg0)[Number] = 0;
\r
(&AVR32_USBB.upcfg0)[Number] = (AVR32_USBB_ALLOC_MASK |
\r
\r
(&AVR32_USBB.upcfg0)[Number] = 0;
\r
(&AVR32_USBB.upcfg0)[Number] = (AVR32_USBB_ALLOC_MASK |
\r
- ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) |
\r
- ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
\r
- ((uint32_t)Banks << AVR32_USBB_PBK_OFFSET) |
\r
- ((EndpointNumber & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET));
\r
+ ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) |
\r
+ ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
\r
+ ((uint32_t)Banks << AVR32_USBB_PBK_OFFSET) |
\r
+ ((EndpointNumber & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET));
\r
+ USB_PipeFIFOPos[PNum] = &AVR32_USBB_SLAVE[PNum * 0x10000];
\r
\r
Pipe_SetInfiniteINRequests();
\r
\r
\r
Pipe_SetInfiniteINRequests();
\r
\r
@@
-67,6
+70,7
@@
void Pipe_ClearPipes(void)
Pipe_SelectPipe(PNum);
\r
(&AVR32_USBB.upcfg0)[PNum] = 0;
\r
(&AVR32_USBB.upcon0clr)[PNum] = 0xFFFFFFFF;
\r
Pipe_SelectPipe(PNum);
\r
(&AVR32_USBB.upcfg0)[PNum] = 0;
\r
(&AVR32_USBB.upcon0clr)[PNum] = 0xFFFFFFFF;
\r
+ USB_PipeFIFOPos[PNum] = &AVR32_USBB_SLAVE[EPNum * 0x10000];
\r
Pipe_DisablePipe();
\r
}
\r
}
\r
Pipe_DisablePipe();
\r
}
\r
}
\r
diff --git
a/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.h
b/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.h
index
033dd01
..
183975a
100644
(file)
--- a/
LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.h
+++ b/
LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.h
@@
-246,6
+246,7
@@
{
\r
AVR32_USBB.uprst |= (AVR32_USBB_PRST0_MASK << PipeNumber);
\r
AVR32_USBB.uprst &= ~(AVR32_USBB_PRST0_MASK << PipeNumber);
\r
{
\r
AVR32_USBB.uprst |= (AVR32_USBB_PRST0_MASK << PipeNumber);
\r
AVR32_USBB.uprst &= ~(AVR32_USBB_PRST0_MASK << PipeNumber);
\r
+ USB_PipeFIFOPos[Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[Pipe_SelectedPipe * 0x10000];
\r
}
\r
\r
/** Enables the currently selected pipe so that data can be sent and received through it to and from
\r
}
\r
\r
/** Enables the currently selected pipe so that data can be sent and received through it to and from
\r
@@
-518,6
+519,7
@@
static inline void Pipe_ClearSETUP(void)
\r
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txstpic = true;
\r
static inline void Pipe_ClearSETUP(void)
\r
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txstpic = true;
\r
+ USB_PipeFIFOPos[Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[Pipe_SelectedPipe * 0x10000];
\r
}
\r
\r
/** Acknowledges the reception of a setup IN request from the attached device on the currently selected
\r
}
\r
\r
/** Acknowledges the reception of a setup IN request from the attached device on the currently selected
\r
@@
-530,6
+532,7
@@
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxinic = true;
\r
(&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
\r
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxinic = true;
\r
(&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
\r
+ USB_PipeFIFOPos[Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[Pipe_SelectedPipe * 0x10000];
\r
}
\r
\r
/** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
\r
}
\r
\r
/** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
\r
@@
-542,6
+545,7
@@
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txoutic = true;
\r
(&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
\r
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txoutic = true;
\r
(&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
\r
+ USB_PipeFIFOPos[Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[Pipe_SelectedPipe * 0x10000];
\r
}
\r
\r
/** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
\r
}
\r
\r
/** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
\r
@@
-593,6
+597,7
@@
static inline void Pipe_ClearStall(void)
\r
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxstalldic = true;
\r
static inline void Pipe_ClearStall(void)
\r
{
\r
(&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxstalldic = true;
\r
+ USB_PipeFIFOPos[Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[Pipe_SelectedPipe * 0x10000];
\r
}
\r
\r
/** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
\r
}
\r
\r
/** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
\r
@@
-604,7
+609,7
@@
static inline uint8_t Pipe_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint8_t Pipe_Read_Byte(void)
\r
{
\r
static inline uint8_t Pipe_Read_Byte(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint8_t Pipe_Read_Byte(void)
\r
{
\r
- return *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
+ return *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
}
\r
\r
/** Writes one byte from the currently selected pipe's bank, for IN direction pipes.
\r
}
\r
\r
/** Writes one byte from the currently selected pipe's bank, for IN direction pipes.
\r
@@
-616,7
+621,7
@@
static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_Byte(const uint8_t Byte)
\r
{
\r
static inline void Pipe_Write_Byte(const uint8_t Byte) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_Byte(const uint8_t Byte)
\r
{
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA
) = Byte;
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
) = Byte;
\r
}
\r
\r
/** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
\r
}
\r
\r
/** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
\r
@@
-628,7
+633,7
@@
{
\r
uint8_t Dummy;
\r
\r
{
\r
uint8_t Dummy;
\r
\r
- Dummy = *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
+ Dummy = *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
}
\r
\r
/** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
\r
}
\r
\r
/** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
\r
@@
-641,16
+646,10
@@
static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint16_t Pipe_Read_Word_LE(void)
\r
{
\r
static inline uint16_t Pipe_Read_Word_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint16_t Pipe_Read_Word_LE(void)
\r
{
\r
- union
\r
- {
\r
- uint16_t Word;
\r
- uint8_t Bytes[2];
\r
- } Data;
\r
-
\r
- Data.Bytes[0] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[1] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
+ uint16_t Byte1 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint16_t Byte0 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
\r
\r
- return
Data.Word
;
\r
+ return
((Byte0 << 8) | Byte1)
;
\r
}
\r
\r
/** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
\r
}
\r
\r
/** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
\r
@@
-663,16
+662,10
@@
static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint16_t Pipe_Read_Word_BE(void)
\r
{
\r
static inline uint16_t Pipe_Read_Word_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint16_t Pipe_Read_Word_BE(void)
\r
{
\r
- union
\r
- {
\r
- uint16_t Word;
\r
- uint8_t Bytes[2];
\r
- } Data;
\r
-
\r
- Data.Bytes[1] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[0] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
+ uint16_t Byte0 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint16_t Byte1 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
\r
\r
- return
Data.Word
;
\r
+ return
((Byte0 << 8) | Byte1)
;
\r
}
\r
\r
/** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
\r
}
\r
\r
/** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
\r
@@
-685,8
+678,8
@@
static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_Word_LE(const uint16_t Word)
\r
{
\r
static inline void Pipe_Write_Word_LE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_Word_LE(const uint16_t Word)
\r
{
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (Word & 0xFF
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (Word >> 8
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (Word >> 8
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (Word & 0xFF
);
\r
}
\r
\r
/** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
\r
}
\r
\r
/** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
\r
@@
-699,8
+692,8
@@
static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_Word_BE(const uint16_t Word)
\r
{
\r
static inline void Pipe_Write_Word_BE(const uint16_t Word) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_Word_BE(const uint16_t Word)
\r
{
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (Word >> 8
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (Word & 0xFF
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (Word & 0xFF
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (Word >> 8
);
\r
}
\r
\r
/** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
\r
}
\r
\r
/** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
\r
@@
-712,8
+705,8
@@
{
\r
uint8_t Dummy;
\r
\r
{
\r
uint8_t Dummy;
\r
\r
- Dummy = *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
- Dummy = *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
+ Dummy = *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
+ Dummy = *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
}
\r
\r
/** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
\r
}
\r
\r
/** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
\r
@@
-726,18
+719,12
@@
static inline uint32_t Pipe_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint32_t Pipe_Read_DWord_LE(void)
\r
{
\r
static inline uint32_t Pipe_Read_DWord_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint32_t Pipe_Read_DWord_LE(void)
\r
{
\r
- union
\r
- {
\r
- uint32_t DWord;
\r
- uint8_t Bytes[4];
\r
- } Data;
\r
-
\r
- Data.Bytes[0] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[1] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[2] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[3] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
+ uint32_t Byte3 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint32_t Byte2 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint32_t Byte1 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint32_t Byte0 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
\r
\r
- return
Data.DWord
;
\r
+ return
((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3)
;
\r
}
\r
\r
/** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
\r
}
\r
\r
/** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
\r
@@
-750,18
+737,12
@@
static inline uint32_t Pipe_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint32_t Pipe_Read_DWord_BE(void)
\r
{
\r
static inline uint32_t Pipe_Read_DWord_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
\r
static inline uint32_t Pipe_Read_DWord_BE(void)
\r
{
\r
- union
\r
- {
\r
- uint32_t DWord;
\r
- uint8_t Bytes[4];
\r
- } Data;
\r
-
\r
- Data.Bytes[3] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[2] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[1] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
- Data.Bytes[0] = *((uint8_t*)AVR32_USBB_EP_DATA);
\r
+ uint32_t Byte0 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint32_t Byte1 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint32_t Byte2 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
+ uint32_t Byte3 = *(((volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++);
\r
\r
\r
- return
Data.DWord
;
\r
+ return
((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3)
;
\r
}
\r
\r
/** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
\r
}
\r
\r
/** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
\r
@@
-774,10
+755,10
@@
static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_DWord_LE(const uint32_t DWord)
\r
{
\r
static inline void Pipe_Write_DWord_LE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_DWord_LE(const uint32_t DWord)
\r
{
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord & 0xFF
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord >> 8
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord >> 16
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord >> 24
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord >> 24
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord >> 16
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord >> 8
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord & 0xFF
);
\r
}
\r
\r
/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
\r
}
\r
\r
/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
\r
@@
-790,10
+771,10
@@
static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_DWord_BE(const uint32_t DWord)
\r
{
\r
static inline void Pipe_Write_DWord_BE(const uint32_t DWord) ATTR_ALWAYS_INLINE;
\r
static inline void Pipe_Write_DWord_BE(const uint32_t DWord)
\r
{
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord >> 24
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord >> 16
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord >> 8
);
\r
- *((
uint8_t*)AVR32_USBB_EP_DATA) = (DWord & 0xFF
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord & 0xFF
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord >> 8
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord >> 16
);
\r
+ *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++) = (DWord >> 24
);
\r
}
\r
\r
/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
\r
}
\r
\r
/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
\r
@@
-805,10
+786,10
@@
{
\r
uint8_t Dummy;
\r
\r
{
\r
uint8_t Dummy;
\r
\r
- Dummy = *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
- Dummy = *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
- Dummy = *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
- Dummy = *((
uint8_t*)AVR32_USBB_EP_DATA
);
\r
+ Dummy = *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
+ Dummy = *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
+ Dummy = *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
+ Dummy = *((
(volatile uint8_t** volatile)USB_PipeFIFOPos)[USB_SelectedPipe]++
);
\r
}
\r
\r
/* External Variables: */
\r
}
\r
\r
/* External Variables: */
\r