Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork8.2k
WIP: rp2: Make GPIO wakeup from lightsleep consistent.#16442
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Draft
projectgus wants to merge1 commit intomicropython:masterChoose a base branch fromprojectgus:bugfix/rp2_lightsleep_indefinite_wake
base:master
Could not load branches
Branch not found:{{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline, and old review comments may become outdated.
Draft
WIP: rp2: Make GPIO wakeup from lightsleep consistent.#16442
projectgus wants to merge1 commit intomicropython:masterfromprojectgus:bugfix/rp2_lightsleep_indefinite_wake
Uh oh!
There was an error while loading.Please reload this page.
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
Before this commit:- A Pin with an irq() trigger is a wakeup source only when machine.lightsleep(n) is used with a timeout, and only if an IRQ handler is set.After this commit:- A Pin with an irq() trigger is a wakeup source from both indefinite machine.lightsleep() and machine.lightsleep(n) with a timeout.- A Pin with an irq() trigger is a wakeup source even if no handler function is set.Issues at present:- Waking RP2040 repeatedly from machine.lightsleep() with no timeout and USB causes the USB connection to misbehave and eventually the CPU hangs.- This implementation doesn't match the machine.Pin docs re: irq(wake=) argument. However, I think only cc3200 port has actually implemented this argument as documented.This work was funded through GitHub Sponsors.Signed-off-by: Angus Gratton <angus@redyak.com.au>
Code size report:
|
Just ran afoul of this while testing#16454 so I'm dropping a cross reference in for posterity. |
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading.Please reload this page.
Summary
Make the
Pin.irq()
wakeup behaviour more consistent on rp2.Closes#7035 and partial fix for#16180Goal is that any pin which has
Pin.irq()
and atrigger
set will wake rp2 port from anymachine.lightsleep()
call.Details
Currently:
machine.lightsleep(n)
is used with a timeout, and only if an IRQ handler is set.After this PR:
A Pin with an irq() trigger is a wakeup source from both indefinite
machine.lightsleep()
andmachine.lightsleep(n)
with a timeout.A Pin with an irq() trigger is a wakeup source even if no handler function is set.
TODOs
machine.lightsleep()
with no timeout and USB causes the USB connection to misbehave and eventually the CPU hangs. This is the same thing fixed for lightsleep with a timeout inrp2: Selectively leave the USB clocks enabled in light sleep. #15111 andrp2: Fix USB PLL glitch during wake from light sleep. #15301 . However, with no timeout argument the RP2 goes to the lower power "DORMANT" mode so keeping USB clock running isn't an option. Callingtud_disconnect()/tud_connect()
ortud_deinit()/tud_init()
before and after going to dormant mode doesn't seem to be enough to fix this. One heavy-handed workaround would be to not select DORMANT if USB is enabled, just call WFI instead. However, then the wakeup conditions are a lot different which may be confusing if developing and testing via USB and then deploying...This work was funded through GitHub Sponsors.
Testing
Trade-offs and Alternatives
machine.lightsleep()
has had very limited utility until now (i.e. no possible wake source?) so maybe we should refactor to only use DORMANT mode for deep sleep where we don't have to worry about recovering the USB peripheral. Keeping clocks running does increase consumption, though.