mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-20 01:08:15 +01:00
[ion] Handle USBEnumeration event like USBPlug.
Change-Id: I70c1dc92fdba8e56508a1dce65ad30a771326a30
This commit is contained in:
@@ -5,7 +5,10 @@ namespace Ion {
|
||||
namespace USB {
|
||||
|
||||
bool isPlugged();
|
||||
bool isEnumerated(); // Speed-enumerated, to be accurate
|
||||
|
||||
void removeSoftDisconnect();
|
||||
|
||||
void DFU();
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
#include <ion.h>
|
||||
#include "regs/otg.h"
|
||||
#include <assert.h>
|
||||
|
||||
namespace Ion {
|
||||
@@ -20,6 +19,7 @@ static bool sleepWithTimeout(int duration, int * timeout) {
|
||||
Event sLastEvent = Events::None;
|
||||
Keyboard::State sLastKeyboardState;
|
||||
bool sLastUSBPlugged = false;
|
||||
bool sLastUSBEnumerated = false;
|
||||
bool sEventIsRepeating = 0;
|
||||
constexpr int delayBeforeRepeat = 200;
|
||||
constexpr int delayBetweenRepeat = 50;
|
||||
@@ -41,9 +41,12 @@ Event getEvent(int * timeout) {
|
||||
sLastUSBPlugged = usbPlugged;
|
||||
return Events::USBPlug;
|
||||
}
|
||||
|
||||
// Second, check if the USB device has been connected to an USB host
|
||||
if (OTG.GINTSTS()->getENUMDNE()) {
|
||||
// The device is being enumerated, the speed enumeration is finished.
|
||||
bool usbEnumerated = USB::isEnumerated();
|
||||
bool previousUsbEnumerated = sLastUSBEnumerated;
|
||||
sLastUSBEnumerated = usbEnumerated;
|
||||
if (usbEnumerated && !previousUsbEnumerated) {
|
||||
return Events::USBEnumeration;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,13 @@ bool isPlugged() {
|
||||
return Device::VbusPin.group().IDR()->get(Device::VbusPin.pin());
|
||||
}
|
||||
|
||||
bool isEnumerated() {
|
||||
/* Note: This implementation is not perfect. One would assume isEnumerated to
|
||||
* return true for as long as the device is enumerated. But the GINTSTS
|
||||
* register will be cleared in the poll() routine. */
|
||||
return OTG.GINTSTS()->getENUMDNE();
|
||||
}
|
||||
|
||||
void removeSoftDisconnect() {
|
||||
OTG.DCTL()->setSDIS(false);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user