mirror of
https://github.com/qmk/qmk_firmware.git
synced 2025-06-07 00:42:50 +00:00
Add checks to the endpoint and pipe configure functions and fail if the requested endpoint or pipe number is above the maximum for that device.
This commit is contained in:
parent
9ab445518a
commit
c41bbf9fcc
@ -202,7 +202,12 @@
|
|||||||
const uint16_t Size,
|
const uint16_t Size,
|
||||||
const uint8_t Banks)
|
const uint8_t Banks)
|
||||||
{
|
{
|
||||||
return Endpoint_ConfigureEndpoint_Prv((Address & ENDPOINT_EPNUM_MASK),
|
uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
|
||||||
|
|
||||||
|
if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return Endpoint_ConfigureEndpoint_Prv(Number,
|
||||||
((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)),
|
((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)),
|
||||||
((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Endpoint_BytesToEPSizeMask(Size)));
|
((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Endpoint_BytesToEPSizeMask(Size)));
|
||||||
}
|
}
|
||||||
|
@ -66,6 +66,9 @@ bool Pipe_ConfigurePipe(const uint8_t Address,
|
|||||||
uint8_t Number = (Address & PIPE_EPNUM_MASK);
|
uint8_t Number = (Address & PIPE_EPNUM_MASK);
|
||||||
uint8_t Token = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;
|
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)
|
if (Type == EP_TYPE_CONTROL)
|
||||||
Token = PIPE_TOKEN_SETUP;
|
Token = PIPE_TOKEN_SETUP;
|
||||||
|
|
||||||
|
@ -208,7 +208,12 @@
|
|||||||
const uint16_t Size,
|
const uint16_t Size,
|
||||||
const uint8_t Banks)
|
const uint8_t Banks)
|
||||||
{
|
{
|
||||||
return Endpoint_ConfigureEndpoint_Prv((Address & ENDPOINT_EPNUM_MASK),
|
uint8_t Number = (Address & ENDPOINT_EPNUM_MASK);
|
||||||
|
|
||||||
|
if (Number >= ENDPOINT_TOTAL_ENDPOINTS)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return Endpoint_ConfigureEndpoint_Prv(Number,
|
||||||
(AVR32_USBB_ALLOC_MASK |
|
(AVR32_USBB_ALLOC_MASK |
|
||||||
((uint32_t)Type << AVR32_USBB_EPTYPE_OFFSET) |
|
((uint32_t)Type << AVR32_USBB_EPTYPE_OFFSET) |
|
||||||
((Address & ENDPOINT_DIR_IN) ? AVR32_USBB_UECFG0_EPDIR_MASK : 0) |
|
((Address & ENDPOINT_DIR_IN) ? AVR32_USBB_UECFG0_EPDIR_MASK : 0) |
|
||||||
|
@ -69,6 +69,9 @@ bool Pipe_ConfigurePipe(const uint8_t Address,
|
|||||||
uint8_t Number = (Address & PIPE_EPNUM_MASK);
|
uint8_t Number = (Address & PIPE_EPNUM_MASK);
|
||||||
uint8_t Token = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;
|
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)
|
if (Type == EP_TYPE_CONTROL)
|
||||||
Token = PIPE_TOKEN_SETUP;
|
Token = PIPE_TOKEN_SETUP;
|
||||||
|
|
||||||
|
@ -246,8 +246,12 @@
|
|||||||
{
|
{
|
||||||
uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size));
|
uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size));
|
||||||
|
|
||||||
|
if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS)
|
||||||
|
return false;
|
||||||
|
|
||||||
// TODO - Fix once limitations are lifted
|
// TODO - Fix once limitations are lifted
|
||||||
if ((Banks > 1) || (Size > 64))
|
EPConfigMask &= ~USB_EP_PINGPONG_bm;
|
||||||
|
if (Size > 64)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
switch (Type)
|
switch (Type)
|
||||||
|
@ -76,7 +76,7 @@ void USB_Init(
|
|||||||
USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
|
USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
|
||||||
NVM.CMD = 0;
|
NVM.CMD = 0;
|
||||||
|
|
||||||
/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for 8-bit AVR-GCC */
|
/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toochain */
|
||||||
USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0));
|
USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0));
|
||||||
USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp));
|
USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user