Add dwc3 host probe

This commit is contained in:
songyanguang 2024-09-11 19:11:45 +08:00
parent d2e410b69b
commit 6d834be991
6 changed files with 120 additions and 11 deletions

View File

@ -33,6 +33,7 @@ Modification: usb core uses naive_mmap to assign virtual and physical addresses
#include "usbh_core.h"
#include "usbh_hub.h"
#include "usb_hc_xhci.h"
#include "rk3568_usb.h"
#include "usyscall.h"
#include "usbh_rndis.h"
@ -1020,10 +1021,14 @@ int usb_hc_init(uint32_t id)
struct usbh_bus* usb = usbh_get_bus_of_index(id);
if (USB_HC_XHCI == usb->usb_hc_type) {
ret = xhci_usb_hc_init(usb->id);
ret = dwc3_generic_host_probe(id);
if (ret) {
return ret;
}
ret = xhci_usb_hc_init(id);
}
else {
USB_LOG_WRN("invalid usb controller type %d \r\n", usb->usb_hc_type);
USB_LOG_WRN("usb_hc_init invalid usb controller type %d \r\n", usb->usb_hc_type);
return -EINVAL;
}

View File

@ -1,14 +1,67 @@
/*************************************************
File name: rk3568_usb.c
Description: the dwc3 host probe function adapted to xiuos.
Others: take RK3568 codes uboot\drivers\usb\dwc3\dwc3-generic.c
*************************************************/
#include "rk3568_usb.h"
#include "usb_hc_xhci.h"
struct dwc3 dwc3_rk3568[CONFIG_USBHOST_XHCI_NUM];
int dwc3_generic_host_probe(uint32_t id){
return 0;
static uint32_t usb_get_maximum_speed(uint32_t id)
{
return USB_SPEED_SUPER;
}
static enum usb_dr_mode usb_get_dr_mode(uint32_t id)
{
return USB_DR_MODE_HOST;
}
int dwc3_generic_probe(uint32_t id){
return 0;
int dwc3_generic_host_probe(uint32_t id)
{
struct dwc3 *dwc3;
USB_ASSERT(id < CONFIG_USBHOST_XHCI_NUM);
dwc3 = &(dwc3_rk3568[id]);
memset(dwc3, 0, sizeof(*dwc3));
dwc3->id = id;
return dwc3_generic_probe(dwc3);
}
int dwc3_generic_probe(struct dwc3 *dwc3)
{
int rc;
uintptr_t base;
uintptr_t base_vir;
int len;
dwc3->maximum_speed = usb_get_maximum_speed(dwc3->id);
dwc3->dr_mode = usb_get_dr_mode(dwc3->id);
dwc3_of_parse(dwc3);
base = usb_hc_get_register_base(dwc3->id);
base_vir = usb_hc_get_register_vir_base(dwc3->id);
dwc3->regs = (void *)base + DWC3_GLOBALS_REGS_START;
dwc3->regs_vir = (void *)base_vir + DWC3_GLOBALS_REGS_START;
len = DWC3_OTG_REGS_END - DWC3_GLOBALS_REGS_START + 1;
if(!mmap((uintptr_t)dwc3->regs_vir, (uintptr_t)dwc3->regs, len, true)){
USB_LOG_ERR("%s mmap fail\r\n", __func__);
return -ENOMEM;
}
rc = dwc3_init(dwc3);
if (rc) {
return rc;
}
return 0;
}

View File

@ -4,6 +4,6 @@
#include "dwc3.h"
int dwc3_generic_host_probe(uint32_t id);
int dwc3_generic_probe(uint32_t id);
int dwc3_generic_probe(struct dwc3 *dwc3);
#endif

View File

@ -2,8 +2,52 @@
#include "usb_config.h"
void dwc3_of_parse(struct dwc3 *dwc){
void dwc3_of_parse(struct dwc3 *dwc)
{
uint8_t lpm_nyet_threshold;
uint8_t tx_de_emphasis;
uint8_t hird_threshold;
/* default to highest possible threshold */
lpm_nyet_threshold = 0xff;
/* default to -3.5dB de-emphasis */
tx_de_emphasis = 1;
/*
* default to assert utmi_sleep_n and use maximum allowed HIRD
* threshold value of 0b1100
*/
hird_threshold = 12;
dwc->hsphy_mode = usb_get_phy_mode(dwc->id);
/* xiuos: The parameters are updated according to the dts of RK3568 */
dwc->has_lpm_erratum = 0;
lpm_nyet_threshold = lpm_nyet_threshold;
dwc->is_utmi_l1_suspend = 0;
hird_threshold = hird_threshold;
dwc->disable_scramble_quirk = 0;
dwc->u2exit_lfps_quirk = 0;
dwc->u2ss_inp3_quirk = 0;
dwc->req_p1p2p3_quirk = 0;
dwc->del_p1p2p3_quirk = 0;
dwc->del_phy_power_chg_quirk = 0;
dwc->lfps_filter_quirk = 0;
dwc->rx_detect_poll_quirk = 0;
dwc->dis_u3_susphy_quirk = 0;
dwc->dis_u2_susphy_quirk = 0;
dwc->dis_enblslpm_quirk = 1;
dwc->dis_u2_freeclk_exists_quirk = 1;
dwc->tx_de_emphasis_quirk = 0;
tx_de_emphasis = tx_de_emphasis;
dwc->lpm_nyet_threshold = lpm_nyet_threshold;
dwc->tx_de_emphasis = tx_de_emphasis;
dwc->hird_threshold = hird_threshold
| (dwc->is_utmi_l1_suspend << 4);
}

View File

@ -627,9 +627,12 @@ struct dwc3 {
uintptr_t scratch_addr;
struct dwc3_request ep0_usb_req;
/* device lock */
/* The id is USB3_0 or USB3_1 */
uint32_t id;
/* device lock */
usb_osal_mutex_t lock;
struct dwc3_event_buffer **ev_buffs;
struct dwc3_ep *eps[DWC3_ENDPOINTS_NUM];

View File

@ -12,10 +12,14 @@ session = $(KERNEL_ROOT)/services/app/session.o
libipc = $(KERNEL_ROOT)/services/app/libipc.o
libsem = $(KERNEL_ROOT)/services/app/libsemaphore.o
usb_components = $(KERNEL_ROOT)/services/drivers/usb/components/rndis_host.o \
usb_components = \
$(KERNEL_ROOT)/services/drivers/usb/components/dwc3.o \
$(KERNEL_ROOT)/services/drivers/usb/components/rk3568_usb.o \
$(KERNEL_ROOT)/services/drivers/usb/components/rndis_host.o \
$(KERNEL_ROOT)/services/drivers/usb/components/usb_hc_xhci.o \
$(KERNEL_ROOT)/services/drivers/usb/components/usb_mem.o \
$(KERNEL_ROOT)/services/drivers/usb/components/usb_osal.o \
$(KERNEL_ROOT)/services/drivers/usb/components/usb_phy.o \
$(KERNEL_ROOT)/services/drivers/usb/components/usbh_core.o \
$(KERNEL_ROOT)/services/drivers/usb/components/usbh_hub.o \
$(KERNEL_ROOT)/services/drivers/usb/components/usbh_rndis.o \