Skip to content

Commit 72c579e

Browse files
committed
Fixes to SOF_Timer wakeup.
- Initialize code with SOF_Timer asleep. - Enable SOF_Timer prior to start of frame generation.
1 parent 2ccb001 commit 72c579e

File tree

2 files changed

+14
-18
lines changed

2 files changed

+14
-18
lines changed

libraries/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,13 @@ e-mail : [email protected]
240240

241241
// NOTE: On the max3421e the irq enable and irq bits are in the same position.
242242

243-
// IRQs used if CPU polls
244-
#define ENIBITSPOLLED (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE)
245-
// IRQs used if CPU is interrupted
246-
#define ENIBITSISR (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE /* | bmRCVDAVIRQ | bmSNDBAVIRQ | bmHXFRDNIRQ */ )
247-
248243
#if !USB_HOST_SHIELD_USE_ISR
249-
#define IRQ_CHECK_MASK (ENIBITSPOLLED & ICLRALLBITS)
250-
#define IRQ_IS_EDGE 0
244+
// IRQs used if CPU polls
245+
#define IRQ_CHECK_MASK (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE)
246+
#define IRQ_IS_EDGE 0
251247
#else
252-
#define IRQ_CHECK_MASK (ENIBITSISR & ICLRALLBITS)
248+
// IRQs used if CPU is interrupted
249+
#define IRQ_CHECK_MASK (bmCONDETIE | bmBUSEVENTIE | bmFRAMEIE /* | bmRCVDAVIRQ | bmSNDBAVIRQ | bmHXFRDNIRQ */ )
253250
#endif
254251

255252
#if IRQ_IS_EDGE
@@ -303,7 +300,7 @@ public UHS_USB_HOST_BASE
303300
private:
304301
MAX3421E_HOST &host;
305302
volatile uint16_t countdown = 0;
306-
volatile bool asleep = false;
303+
volatile bool asleep = true;
307304

308305
public:
309306
SOF_Timer(MAX3421E_HOST &h) : host(h) {

libraries/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ void UHS_NI MAX3421E_HOST::busprobe(void) {
208208
regWr(rMODE, MODE_LS_HOST); // start low-speed host
209209
vbusState = LSHOST;
210210
}
211+
sof_timer.wake();
211212
tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation
212213
regWr(rHIRQ, bmFRAMEIRQ); // see data sheet.
213214
regWr(rMODE, tmpdata);
@@ -221,6 +222,7 @@ void UHS_NI MAX3421E_HOST::busprobe(void) {
221222
regWr(rMODE, MODE_FS_HOST); // start full-speed host
222223
vbusState = FSHOST;
223224
}
225+
sof_timer.wake();
224226
tmpdata = regRd(rMODE) | bmSOFKAENAB; // start SOF generation
225227
regWr(rHIRQ, bmFRAMEIRQ); // see data sheet.
226228
regWr(rMODE, tmpdata);
@@ -306,7 +308,7 @@ int16_t UHS_NI MAX3421E_HOST::Init(int16_t mseconds) {
306308
uint32_t spd = UHS_MAX3421E_SPD;
307309
again:
308310
MAX3421E_SPI_Settings = SPISettings(spd, MSBFIRST, SPI_MODE0);
309-
/* MAX3421E - full-duplex SPIclass, interrupt kind, vbus off */
311+
/* MAX3421E - full-duplex SPI, interrupt kind, vbus off */
310312
regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE | GPX_VBDET));
311313
if(reset() == 0) {
312314
MAX_HOST_DEBUG("Fail SPI speed %lu\r\n", spd);
@@ -340,6 +342,7 @@ int16_t UHS_NI MAX3421E_HOST::Init(int16_t mseconds) {
340342
#endif
341343
/* MAX3421E - full-duplex SPI, interrupt kind, vbus off */
342344
if(reset() == 0) { //OSCOKIRQ hasn't asserted in time
345+
MAX_HOST_DEBUG("OSCOKIRQ hasn't asserted in time");
343346
return ( -1);
344347
}
345348
regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE | GPX_VBDET));
@@ -353,9 +356,9 @@ int16_t UHS_NI MAX3421E_HOST::Init(int16_t mseconds) {
353356

354357
regWr(rMODE, bmDPPULLDN | bmDMPULLDN | bmHOST); // set pull-downs, Host
355358

356-
// Enable interrupts on the MAX3421e
357-
regWr(rHIEN, IRQ_CHECK_MASK);
358-
// Enable interrupt pin on the MAX3421e, set pulse width for edge
359+
// Enable interrupts on condition detections and bus events
360+
regWr(rHIEN, bmCONDETIE | bmBUSEVENTIE);
361+
// Enable interrupt pin, set pulse width for edge
359362
regWr(rCPUCTL, (bmIE | bmPULSEWIDTH));
360363

361364
/* check if device is connected */
@@ -870,7 +873,6 @@ void UHS_NI MAX3421E_HOST::ISRTask(void)
870873
{
871874
DDSB();
872875

873-
counted = false;
874876
if(!UHS_PIN_READ(irq_pin)) {
875877
uint8_t HIRQALL = regRd(rHIRQ); //determine interrupt source
876878
uint8_t HIRQ = HIRQALL & IRQ_CHECK_MASK;
@@ -911,6 +913,7 @@ void UHS_NI MAX3421E_HOST::ISRTask(void)
911913
}
912914
#endif
913915

916+
counted = false;
914917
if(HIRQ & bmFRAMEIRQ) {
915918
HIRQ_sendback |= bmFRAMEIRQ;
916919
counted = sof_timer.decrement();
@@ -919,10 +922,6 @@ void UHS_NI MAX3421E_HOST::ISRTask(void)
919922
// usb_task_state = UHS_USB_HOST_STATE_WAIT_BUS_READY;
920923
//}
921924
sofevent = false;
922-
} else {
923-
// Any event other than a FRAMEIRQ should start
924-
// the timer so state transitions can happen
925-
sof_timer.wake();
926925
}
927926

928927
//MAX_HOST_DEBUG("\r\n%s%s%s\r\n",

0 commit comments

Comments
 (0)