mirror of
https://github.com/hathach/tinyusb.git
synced 2025-01-31 05:52:55 +08:00
Add register settings to handle a HUB
This commit is contained in:
parent
24614de419
commit
9bccc8068b
@ -325,7 +325,7 @@ static bool edpt0_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_
|
|||||||
{
|
{
|
||||||
(void)rhport;
|
(void)rhport;
|
||||||
|
|
||||||
const unsigned req = _hcd.bmRequestType;
|
unsigned const req = _hcd.bmRequestType;
|
||||||
TU_ASSERT(req != REQUEST_TYPE_INVALID);
|
TU_ASSERT(req != REQUEST_TYPE_INVALID);
|
||||||
TU_ASSERT(dev_addr < sizeof(_hcd.ctl_mps));
|
TU_ASSERT(dev_addr < sizeof(_hcd.ctl_mps));
|
||||||
|
|
||||||
@ -453,6 +453,7 @@ static void process_ep0(uint8_t rhport)
|
|||||||
/* STATUS IN */
|
/* STATUS IN */
|
||||||
TU_ASSERT(USB_CSRL0_RXRDY == (csrl & USB_CSRL0_RXRDY),);
|
TU_ASSERT(USB_CSRL0_RXRDY == (csrl & USB_CSRL0_RXRDY),);
|
||||||
TU_ASSERT(0 == USB0->COUNT0,);
|
TU_ASSERT(0 == USB0->COUNT0,);
|
||||||
|
USB0->CSRH0 = USB_CSRH0_FLUSH;
|
||||||
USB0->CSRL0 = 0;
|
USB0->CSRL0 = 0;
|
||||||
_hcd.bmRequestType = REQUEST_TYPE_INVALID;
|
_hcd.bmRequestType = REQUEST_TYPE_INVALID;
|
||||||
hcd_event_xfer_complete(dev_addr, tu_edpt_addr(0, TUSB_DIR_IN),
|
hcd_event_xfer_complete(dev_addr, tu_edpt_addr(0, TUSB_DIR_IN),
|
||||||
@ -694,7 +695,17 @@ bool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet
|
|||||||
_hcd.pipe0.buf = (void*)(uintptr_t)setup_packet;
|
_hcd.pipe0.buf = (void*)(uintptr_t)setup_packet;
|
||||||
_hcd.pipe0.length = 8;
|
_hcd.pipe0.length = 8;
|
||||||
_hcd.pipe0.remaining = 0;
|
_hcd.pipe0.remaining = 0;
|
||||||
_hcd.bmRequestType = REQUEST_TYPE_INVALID;
|
|
||||||
|
hcd_devtree_info_t devtree;
|
||||||
|
hcd_devtree_get_info(dev_addr, &devtree);
|
||||||
|
switch (devtree.speed) {
|
||||||
|
default: return false;
|
||||||
|
case TUSB_SPEED_LOW: USB0->TYPE0 = USB_TYPE0_SPEED_LOW; break;
|
||||||
|
case TUSB_SPEED_FULL: USB0->TYPE0 = USB_TYPE0_SPEED_FULL; break;
|
||||||
|
case TUSB_SPEED_HIGH: USB0->TYPE0 = USB_TYPE0_SPEED_HIGH; break;
|
||||||
|
}
|
||||||
|
USB0->TXHUBADDR0 = devtree.hub_addr;
|
||||||
|
USB0->TXHUBPORT0 = devtree.hub_port;
|
||||||
USB0->TXFUNCADDR0 = dev_addr;
|
USB0->TXFUNCADDR0 = dev_addr;
|
||||||
USB0->CSRL0 = USB_CSRL0_TXRDY | USB_CSRL0_SETUP;
|
USB0->CSRL0 = USB_CSRL0_TXRDY | USB_CSRL0_SETUP;
|
||||||
return true;
|
return true;
|
||||||
@ -702,6 +713,7 @@ bool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet
|
|||||||
|
|
||||||
bool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc)
|
bool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc)
|
||||||
{
|
{
|
||||||
|
(void)rhport;
|
||||||
if (sizeof(_hcd.ctl_mps) <= dev_addr) return false;
|
if (sizeof(_hcd.ctl_mps) <= dev_addr) return false;
|
||||||
unsigned const ep_addr = ep_desc->bEndpointAddress;
|
unsigned const ep_addr = ep_desc->bEndpointAddress;
|
||||||
unsigned const epn = tu_edpt_number(ep_addr);
|
unsigned const epn = tu_edpt_number(ep_addr);
|
||||||
@ -733,7 +745,9 @@ bool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const
|
|||||||
pipe->remaining = 0;
|
pipe->remaining = 0;
|
||||||
|
|
||||||
uint8_t pipe_type = 0;
|
uint8_t pipe_type = 0;
|
||||||
switch (hcd_port_speed_get(rhport)) {
|
hcd_devtree_info_t devtree;
|
||||||
|
hcd_devtree_get_info(dev_addr, &devtree);
|
||||||
|
switch (devtree.speed) {
|
||||||
default: return false;
|
default: return false;
|
||||||
case TUSB_SPEED_LOW: pipe_type |= USB_TXTYPE1_SPEED_LOW; break;
|
case TUSB_SPEED_LOW: pipe_type |= USB_TXTYPE1_SPEED_LOW; break;
|
||||||
case TUSB_SPEED_FULL: pipe_type |= USB_TXTYPE1_SPEED_FULL; break;
|
case TUSB_SPEED_FULL: pipe_type |= USB_TXTYPE1_SPEED_FULL; break;
|
||||||
@ -750,6 +764,8 @@ bool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const
|
|||||||
hw_endpoint_t volatile *regs = edpt_regs(pipenum - 1);
|
hw_endpoint_t volatile *regs = edpt_regs(pipenum - 1);
|
||||||
if (dir_tx) {
|
if (dir_tx) {
|
||||||
fadr->TXFUNCADDR = dev_addr;
|
fadr->TXFUNCADDR = dev_addr;
|
||||||
|
fadr->TXHUBADDR = devtree.hub_addr;
|
||||||
|
fadr->TXHUBPORT = devtree.hub_port;
|
||||||
regs->TXMAXP = mps;
|
regs->TXMAXP = mps;
|
||||||
regs->TXTYPE = pipe_type | epn;
|
regs->TXTYPE = pipe_type | epn;
|
||||||
regs->TXINTERVAL = ep_desc->bInterval;
|
regs->TXINTERVAL = ep_desc->bInterval;
|
||||||
@ -760,6 +776,8 @@ bool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const
|
|||||||
USB0->TXIE |= TU_BIT(pipenum);
|
USB0->TXIE |= TU_BIT(pipenum);
|
||||||
} else {
|
} else {
|
||||||
fadr->RXFUNCADDR = dev_addr;
|
fadr->RXFUNCADDR = dev_addr;
|
||||||
|
fadr->RXHUBADDR = devtree.hub_addr;
|
||||||
|
fadr->RXHUBPORT = devtree.hub_port;
|
||||||
regs->RXMAXP = mps;
|
regs->RXMAXP = mps;
|
||||||
regs->RXTYPE = pipe_type | epn;
|
regs->RXTYPE = pipe_type | epn;
|
||||||
regs->RXINTERVAL = ep_desc->bInterval;
|
regs->RXINTERVAL = ep_desc->bInterval;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user