@peekay123, thanks.
Guys, I have been trying this same porting exercise using @peekay123 code as starting point. I fixed some of the pin issues based on @wesner0019 comments. Everything compiles, however the hardware issues Iâm experiencing now are:
(1) Not a clean flash. Logs show âspark/flash/status/â = âfailedâ. The app does still flash and executeâŚat least to some degree. But the consistent âfailedâ status is concerning.
(2) The Usb.Init() and/or Usb.Task() causes the hardware to go into âCloud not connectedâ mode after about 30sec. Something is broken here and I canât root cause it. Code below for the the USB functions in USB.cpp
Any ideas?
BTW: Iâm using Sparkfun P1 Photon Redboard: https://learn.sparkfun.com/tutorials/photon-redboard-hookup-guide?_ga=1.106473027.1103565691.1449801131
/* Initialize data structures */
void USB::init() {
//devConfigIndex = 0;
bmHubPre = 0;
}
void USB::Task(void) //USB state machine
{
uint8_t rcode;
uint8_t tmpdata;
static unsigned long delay = 0;
//USB_DEVICE_DESCRIPTOR buf;
bool lowspeed = false;
MAX3421E::Task();
tmpdata = getVbusState();
/* modify USB task state if Vbus changed */
switch(tmpdata) {
case SE1: //illegal state
usb_task_state = USB_DETACHED_SUBSTATE_ILLEGAL;
lowspeed = false;
break;
case SE0: //disconnected
if((usb_task_state & USB_STATE_MASK) != USB_STATE_DETACHED)
usb_task_state = USB_DETACHED_SUBSTATE_INITIALIZE;
lowspeed = false;
break;
case LSHOST:
lowspeed = true;
//intentional fallthrough
case FSHOST: //attached
if((usb_task_state & USB_STATE_MASK) == USB_STATE_DETACHED) {
delay = millis() + USB_SETTLE_DELAY;
usb_task_state = USB_ATTACHED_SUBSTATE_SETTLE;
}
break;
}// switch( tmpdata
for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
if(devConfig[i])
rcode = devConfig[i]->Poll();
switch(usb_task_state) {
case USB_DETACHED_SUBSTATE_INITIALIZE:
init();
for(uint8_t i = 0; i < USB_NUMDEVICES; i++)
if(devConfig[i])
rcode = devConfig[i]->Release();
usb_task_state = USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE;
break;
case USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE: //just sit here
break;
case USB_DETACHED_SUBSTATE_ILLEGAL: //just sit here
break;
case USB_ATTACHED_SUBSTATE_SETTLE: //settle time for just attached device
if((long)(millis() - delay) >= 0L)
usb_task_state = USB_ATTACHED_SUBSTATE_RESET_DEVICE;
else break; // don't fall through
case USB_ATTACHED_SUBSTATE_RESET_DEVICE:
regWr(rHCTL, bmBUSRST); //issue bus reset
usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE;
break;
case USB_ATTACHED_SUBSTATE_WAIT_RESET_COMPLETE:
if((regRd(rHCTL) & bmBUSRST) == 0) {
tmpdata = regRd(rMODE) | bmSOFKAENAB; //start SOF generation
regWr(rMODE, tmpdata);
usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_SOF;
//delay = millis() + 20; //20ms wait after reset per USB spec
}
break;
case USB_ATTACHED_SUBSTATE_WAIT_SOF: //todo: change check order
if(regRd(rHIRQ) & bmFRAMEIRQ) {
//when first SOF received _and_ 20ms has passed we can continue
/*
if (delay < millis()) //20ms passed
usb_task_state = USB_STATE_CONFIGURING;
*/
usb_task_state = USB_ATTACHED_SUBSTATE_WAIT_RESET;
delay = millis() + 20;
}
break;
case USB_ATTACHED_SUBSTATE_WAIT_RESET:
if((long)(millis() - delay) >= 0L) usb_task_state = USB_STATE_CONFIGURING;
else break; // don't fall through
case USB_STATE_CONFIGURING:
//Serial.print("\r\nConf.LS: ");
//Serial.println(lowspeed, HEX);
rcode = Configuring(0, 0, lowspeed);
if(rcode) {
if(rcode != USB_DEV_CONFIG_ERROR_DEVICE_INIT_INCOMPLETE) {
usb_error = rcode;
usb_task_state = USB_STATE_ERROR;
}
} else
usb_task_state = USB_STATE_RUNNING;
break;
case USB_STATE_RUNNING:
break;
case USB_STATE_ERROR:
//MAX3421E::Init();
break;
} // switch( usb_task_state )
}
Youâve got some loops and fn-calls with âunknownâ run time, maybe sprinkling in some Particle.process()
calls might help the cloud drops.
@henn0124, try this for testing. Iâve basically stripped out all unneeded other files like for the xbox.
Seems to be working fine using the keyboard example.
@wesner0019 Thanks. I actually figured it out already, but wish I had your code to reduce the headache. The PLATFORM_IDâs were not declared properly in my code. Hope others find your example useful.
@henn0124, @henn0124, it sounds like I should post the code to github so folks like you can do pull requests! Any thoughts?
@peekay123 I was able to use majority of your dropbox code, but suppose github might be a little more convenient for most. I didnât look through @wesner0019 github repo, but it might be the same result as yours.
@henn0124, if I can get a tested working set of files, Iâd gladly make a github repo for it!
@peekay123, this code was ported for the core and photon, can it be easily ported for the electron by adding PLATFORM_ID ==10 in the areas that have the below generic definitions? Or would be more involved?
#if (PLATFORM_ID == 0) || (PLATFORM_ID == 6) // Core or Photon
#endif
Thanks
@wesner0019, yes but since there are extra GPIO pins on the Electron, there is on file I believe that would need to take that into consideration. Otherwise, as is, only the Photon pins are mapped, which the Electron matches.
@peekay123, thanks, so if I donât need the extra Electron pins I should be good then?
@wesner0019, I believe so.