diff --git a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c index 73b49f7a7..e733ee7ab 100644 --- a/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c +++ b/Ubiquitous/XiZi_AIoT/services/drivers/usb/components/port/dwc3/dwc3.c @@ -97,7 +97,9 @@ void dwc3_core_exit(struct dwc3 *dwc){ int dwc3_alloc_scratch_buffers(struct dwc3 *dwc){ - uint32_t length; + uint32_t len; + uintptr_t phy_addr, vir_addr; + int ret; if (!dwc->has_hibernation) return 0; @@ -105,15 +107,52 @@ int dwc3_alloc_scratch_buffers(struct dwc3 *dwc){ if (!dwc->nr_scratch) return 0; + len = dwc->nr_scratch * DWC3_SCRATCHBUF_SIZE; + ret = naive_mmap(&vir_addr, &phy_addr, len, true); + if(ret != 0){ + USB_LOG_ERR("could not allocate DWC3 scratch buffers!\n"); + ret = -ENOMEM; + } - return 0; + dwc->scratchbuf = (void *)vir_addr; + dwc->scratch_addr = phy_addr; + + return ret; } int dwc3_setup_scratch_buffers(struct dwc3 *dwc){ - return 0; + uint32_t param; + int ret; + + if (!dwc->has_hibernation) + return 0; + + if (!dwc->nr_scratch) + return 0; + + param = lower_32_bits(dwc->scratch_addr); + + ret = dwc3_send_gadget_generic_command(dwc, + DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO, param); + + if(ret != 0) + goto err_cmd; + + param = upper_32_bits(dwc->scratch_addr); + + ret = dwc3_send_gadget_generic_command(dwc, + DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI, param); + + if(ret != 0) + goto err_cmd; + + return ret; + +err_cmd: + return ret; }