mirror of
https://gitee.com/Vancouver2017/luban-lite-t3e-pro.git
synced 2025-12-15 10:58:54 +00:00
V1.0.6
This commit is contained in:
@@ -22,7 +22,7 @@ typedef struct aic_ehci_config {
|
||||
}aic_ehci_config_t;
|
||||
|
||||
aic_ehci_config_t config[] = {
|
||||
#ifdef AIC_USING_USB0_HOST
|
||||
#if defined(AIC_USING_USB0_HOST) || defined(AIC_USING_USB0_OTG)
|
||||
{
|
||||
USB_HOST0_BASE,
|
||||
CLK_USBH0,
|
||||
@@ -103,6 +103,25 @@ void usb_hc_low_level_init(struct usbh_bus *bus)
|
||||
aicos_irq_enable(config[i].irq_num);
|
||||
}
|
||||
|
||||
void usb_hc_low_level_deinit(struct usbh_bus *bus)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
for (i=0; i<sizeof(config)/sizeof(aic_ehci_config_t); i++) {
|
||||
if (bus->hcd.reg_base == config[i].base_addr)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == sizeof(config)/sizeof(aic_ehci_config_t))
|
||||
return;
|
||||
|
||||
aicos_irq_disable(config[i].irq_num);
|
||||
hal_reset_assert(config[i].phy_rst_id);
|
||||
hal_reset_assert(config[i].rst_id);
|
||||
hal_clk_disable(config[i].phy_clk_id);
|
||||
hal_clk_disable(config[i].clk_id);
|
||||
}
|
||||
|
||||
uint8_t usbh_get_port_speed(struct usbh_bus *bus, const uint8_t port)
|
||||
{
|
||||
/* Defined by individual manufacturers */
|
||||
|
||||
@@ -47,7 +47,7 @@ static int usb_ehci_buf_alloc(struct ehci_qtd_hw *qtd, uint32_t len)
|
||||
qtd->align_buffer_len = len;
|
||||
|
||||
if (qtd->align_buffer_len > CONFIG_USB_EHCI_FRAME_LIST_SIZE) {
|
||||
USB_LOG_INFO("Need alloc %d buf for cacheline algined\n",
|
||||
USB_LOG_DBG("Need alloc %d buf for cacheline algined\n",
|
||||
(unsigned int)qtd->align_buffer_len);
|
||||
qtd->align_buffer = aicos_malloc_align(0, qtd->align_buffer_len,
|
||||
CONFIG_USB_ALIGN_SIZE);
|
||||
@@ -789,7 +789,6 @@ static void ehci_urb_waitup(struct usbh_bus *bus, struct usbh_urb *urb)
|
||||
qh->remove_in_iaad = 0;
|
||||
|
||||
if (urb->timeout) {
|
||||
urb->timeout = 0;
|
||||
usb_osal_sem_give(qh->waitsem);
|
||||
} else {
|
||||
ehci_qh_free(bus, qh);
|
||||
@@ -849,7 +848,7 @@ static void ehci_check_qh(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct
|
||||
|
||||
token = qtd->hw.token;
|
||||
|
||||
if (token & QTD_TOKEN_STATUS_ERRORS) {
|
||||
if (token & (QTD_TOKEN_STATUS_HALTED || QTD_TOKEN_STATUS_BABBLE)) {
|
||||
break;
|
||||
} else if (token & QTD_TOKEN_STATUS_ACTIVE) {
|
||||
return;
|
||||
@@ -860,23 +859,30 @@ static void ehci_check_qh(struct usbh_bus *bus, struct ehci_qh_hw *qhead, struct
|
||||
|
||||
urb = qh->urb;
|
||||
|
||||
if ((token & QTD_TOKEN_STATUS_ERRORS) == 0) {
|
||||
if (token & QTD_TOKEN_STATUS_HALTED) {
|
||||
USB_LOG_ERR("QTD_TOKEN_STATUS_HALTED, token(0x%08x)\n", (unsigned int)token);
|
||||
urb->errorcode = -USB_ERR_STALL;
|
||||
urb->data_toggle = 0;
|
||||
} else if (token & QTD_TOKEN_STATUS_BABBLE) {
|
||||
USB_LOG_ERR("QTD_TOKEN_STATUS_BABBLE, token(0x%08x)\n", (unsigned int)token);
|
||||
urb->errorcode = -USB_ERR_BABBLE;
|
||||
urb->data_toggle = 0;
|
||||
} else {
|
||||
/* Data Buffer Error and XactErr should not interrupt transmit */
|
||||
if (token & QTD_TOKEN_STATUS_DBERR) {
|
||||
/* Report Data Buffer Error: non-fatal but useful */
|
||||
USB_LOG_DBG("QTD_TOKEN_STATUS_DBERR, token(0x%08x)\n", (unsigned int)token);
|
||||
} else if (token & QTD_TOKEN_STATUS_XACTERR) {
|
||||
/* Ignore the XactErr if token is not in STALL */
|
||||
USB_LOG_DBG("QTD_TOKEN_STATUS_XACTERR, token(0x%08x)\n", (unsigned int)token);
|
||||
}
|
||||
|
||||
if (qh->hw.overlay.token & QTD_TOKEN_TOGGLE) {
|
||||
urb->data_toggle = true;
|
||||
} else {
|
||||
urb->data_toggle = false;
|
||||
}
|
||||
urb->errorcode = 0;
|
||||
} else {
|
||||
if (token & QTD_TOKEN_STATUS_BABBLE) {
|
||||
urb->errorcode = -USB_ERR_BABBLE;
|
||||
urb->data_toggle = 0;
|
||||
} else if (token & QTD_TOKEN_STATUS_HALTED) {
|
||||
urb->errorcode = -USB_ERR_STALL;
|
||||
urb->data_toggle = 0;
|
||||
} else if (token & (QTD_TOKEN_STATUS_DBERR | QTD_TOKEN_STATUS_XACTERR)) {
|
||||
urb->errorcode = -USB_ERR_IO;
|
||||
}
|
||||
}
|
||||
|
||||
ehci_qh_scan_qtds(bus, qhead, qh);
|
||||
@@ -943,6 +949,10 @@ __WEAK void usb_hc_low_level2_init(struct usbh_bus *bus)
|
||||
{
|
||||
}
|
||||
|
||||
__WEAK void usb_hc_low_level_deinit(struct usbh_bus *bus)
|
||||
{
|
||||
}
|
||||
|
||||
int usb_hc_init(struct usbh_bus *bus)
|
||||
{
|
||||
uint32_t interval;
|
||||
@@ -1101,7 +1111,7 @@ int usb_hc_deinit(struct usbh_bus *bus)
|
||||
usb_osal_msleep(1);
|
||||
timeout++;
|
||||
if (timeout > 100) {
|
||||
return -USB_ERR_TIMEOUT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1124,6 +1134,8 @@ int usb_hc_deinit(struct usbh_bus *bus)
|
||||
usb_osal_sem_delete(qh->waitsem);
|
||||
}
|
||||
|
||||
usb_hc_low_level_deinit(bus);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1386,6 +1398,10 @@ int usbh_submit_urb(struct usbh_urb *urb)
|
||||
}
|
||||
return ret;
|
||||
errout_timeout:
|
||||
USB_LOG_ERR("urb submit timeout, ep:%d ep_type:%d dev_addr:0x%x\n\n",
|
||||
urb->ep->bEndpointAddress,
|
||||
USB_GET_ENDPOINT_TYPE(urb->ep->bmAttributes),
|
||||
urb->hport->dev_addr);
|
||||
urb->timeout = 0;
|
||||
usbh_kill_urb(urb);
|
||||
return ret;
|
||||
|
||||
Reference in New Issue
Block a user