forked from len0rd/rockbox
Rework FS#12310 fix (r30906) for better readability. No functional change.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30953 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
bd234e7e6f
commit
6229d623b0
1 changed files with 16 additions and 8 deletions
|
|
@ -48,10 +48,18 @@ struct ep_type
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
static struct ep_type endpoints[USB_NUM_ENDPOINTS];
|
static struct ep_type endpoints[USB_NUM_ENDPOINTS];
|
||||||
static union
|
|
||||||
|
/* USB control requests may be up to 64 bytes in size.
|
||||||
|
Even though we never use anything more than the 8 header bytes,
|
||||||
|
we are required to accept request packets of up to 64 bytes size.
|
||||||
|
Provide buffer space for these additional payload bytes so that
|
||||||
|
e.g. write descriptor requests (which are rejected by us, but the
|
||||||
|
payload is transferred anyway) do not cause memory corruption.
|
||||||
|
Fixes FS#12310. -- Michael Sparmann (theseven) */
|
||||||
|
static struct
|
||||||
{
|
{
|
||||||
unsigned char data[64];
|
struct usb_ctrlrequest header; /* 8 bytes */
|
||||||
struct usb_ctrlrequest req;
|
unsigned char payload[64 - sizeof(struct usb_ctrlrequest)];
|
||||||
} ctrlreq USB_DEVBSS_ATTR;
|
} ctrlreq USB_DEVBSS_ATTR;
|
||||||
|
|
||||||
int usb_drv_port_speed(void)
|
int usb_drv_port_speed(void)
|
||||||
|
|
@ -74,7 +82,7 @@ static void reset_endpoints(int reinit)
|
||||||
DOEPCTL0 = 0x8000; /* EP0 OUT ACTIVE */
|
DOEPCTL0 = 0x8000; /* EP0 OUT ACTIVE */
|
||||||
DOEPTSIZ0 = 0x20080040; /* EP0 OUT Transfer Size:
|
DOEPTSIZ0 = 0x20080040; /* EP0 OUT Transfer Size:
|
||||||
64 Bytes, 1 Packet, 1 Setup Packet */
|
64 Bytes, 1 Packet, 1 Setup Packet */
|
||||||
DOEPDMA0 = &ctrlreq.data;
|
DOEPDMA0 = &ctrlreq;
|
||||||
DOEPCTL0 |= 0x84000000; /* EP0 OUT ENABLE CLEARNAK */
|
DOEPCTL0 |= 0x84000000; /* EP0 OUT ENABLE CLEARNAK */
|
||||||
if (reinit)
|
if (reinit)
|
||||||
{
|
{
|
||||||
|
|
@ -247,14 +255,14 @@ void INT_USB_FUNC(void)
|
||||||
invalidate_dcache();
|
invalidate_dcache();
|
||||||
if (i == 0)
|
if (i == 0)
|
||||||
{
|
{
|
||||||
if (ctrlreq.req.bRequest == 5)
|
if (ctrlreq.header.bRequest == 5)
|
||||||
{
|
{
|
||||||
/* Already set the new address here,
|
/* Already set the new address here,
|
||||||
before passing the packet to the core.
|
before passing the packet to the core.
|
||||||
See below (usb_drv_set_address) for details. */
|
See below (usb_drv_set_address) for details. */
|
||||||
DCFG = (DCFG & ~0x7F0) | (ctrlreq.req.wValue << 4);
|
DCFG = (DCFG & ~0x7F0) | (ctrlreq.header.wValue << 4);
|
||||||
}
|
}
|
||||||
usb_core_control_request(&ctrlreq.req);
|
usb_core_control_request(&ctrlreq.header);
|
||||||
}
|
}
|
||||||
else panicf("USB: SETUP done on OUT EP%d!?", i);
|
else panicf("USB: SETUP done on OUT EP%d!?", i);
|
||||||
}
|
}
|
||||||
|
|
@ -262,7 +270,7 @@ void INT_USB_FUNC(void)
|
||||||
if (!i)
|
if (!i)
|
||||||
{
|
{
|
||||||
DOEPTSIZ0 = 0x20080040;
|
DOEPTSIZ0 = 0x20080040;
|
||||||
DOEPDMA0 = &ctrlreq.data;
|
DOEPDMA0 = &ctrlreq;
|
||||||
DOEPCTL0 |= 0x84000000;
|
DOEPCTL0 |= 0x84000000;
|
||||||
}
|
}
|
||||||
DOEPINT(i) = epints;
|
DOEPINT(i) = epints;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue