From ea164dd769fdfe45b1f3b2e3ea5cbad5a9045b55 Mon Sep 17 00:00:00 2001 From: ergo720 Date: Thu, 31 May 2018 12:59:10 +0200 Subject: [PATCH] Fix SOF timer bug --- src/devices/USBController/OHCI.cpp | 16 +++++++++++----- src/devices/USBController/OHCI.h | 6 +++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/devices/USBController/OHCI.cpp b/src/devices/USBController/OHCI.cpp index 53b458b16..869ce9a9a 100644 --- a/src/devices/USBController/OHCI.cpp +++ b/src/devices/USBController/OHCI.cpp @@ -139,7 +139,7 @@ void OHCI::OHCI_FrameBoundaryWorker() } // Do SOF stuff here - OHCI_SOF(); + OHCI_SOF(false); // Writeback HCCA if (OHCI_WriteHCCA(m_Registers.HcHCCA, &hcca)) { @@ -243,7 +243,7 @@ void OHCI::OHCI_BusStart() DbgPrintf("Ohci: Operational mode event\n"); // SOF event - OHCI_SOF(); + OHCI_SOF(true); } void OHCI::OHCI_BusStop() @@ -255,10 +255,16 @@ void OHCI::OHCI_BusStop() m_pEOFtimer = nullptr; } -void OHCI::OHCI_SOF() +void OHCI::OHCI_SOF(bool bCreate) { - m_SOFtime = GetTime_NS(m_pEOFtimer); // set current SOF time - Timer_Start(m_pEOFtimer, m_SOFtime + m_UsbFrameTime); // make timer expire at SOF + 1 virtual ms from now + // set current SOF time + m_SOFtime = GetTime_NS(m_pEOFtimer); + + // make timer expire at SOF + 1 virtual ms from now + if (bCreate) { + Timer_Start(m_pEOFtimer, m_UsbFrameTime); + } + OHCI_SetInterrupt(OHCI_INTR_SF); } diff --git a/src/devices/USBController/OHCI.h b/src/devices/USBController/OHCI.h index 4374a08a4..1838d4894 100644 --- a/src/devices/USBController/OHCI.h +++ b/src/devices/USBController/OHCI.h @@ -236,7 +236,7 @@ class OHCI // stop sending SOF tokens across the usb bus void OHCI_BusStop(); // generate a SOF event, and start a timer for EOF - void OHCI_SOF(); + void OHCI_SOF(bool bCreate); // change interrupt status void OHCI_UpdateInterrupt(); // fire an interrupt @@ -259,9 +259,9 @@ class OHCI // if not set ConnectStatusChange flag; if flag is enabled return 1 int OHCI_PortSetIfConnected(int i, uint32_t Value); // read the HCCA structure in memory - bool OHCI_ReadHCCA(uint32_t Paddr, OHCI_HCCA* Hcca); + bool OHCI_ReadHCCA(xbaddr Paddr, OHCI_HCCA* Hcca); // write the HCCA structure in memory - bool OHCI_WriteHCCA(uint32_t Paddr, OHCI_HCCA* Hcca); + bool OHCI_WriteHCCA(xbaddr Paddr, OHCI_HCCA* Hcca); // register a port with the HC void USB_RegisterPort(USBPort* Port, int Index, int SpeedMask);