[ion] Handle USBEnumeration event like USBPlug.

Change-Id: I70c1dc92fdba8e56508a1dce65ad30a771326a30
This commit is contained in:
Léa Saviot
2018-04-04 14:44:30 +02:00
parent 29df2e0acd
commit 562e419fc3
3 changed files with 16 additions and 3 deletions

View File

@@ -5,7 +5,10 @@ namespace Ion {
namespace USB {
bool isPlugged();
bool isEnumerated(); // Speed-enumerated, to be accurate
void removeSoftDisconnect();
void DFU();
}

View File

@@ -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;
}

View File

@@ -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);
}