This enables the _stage library and adds stage and ugame modules to the
frozen modules, so that all Stage games should work.
I had to do several hacks:
* Since displayio.release_displays doesn't release the pins, I couldn't
re-initialize the display inside the ugame module. Instead I changed
the default display initialization for the board to match what Stage
expects.
* I wanted to make the MENU key works as K_Z, but when I try to use it
with the keypad module, I get "pin in use" error. So for now only the
A and B buttons are used.
this is only tested to come up to the REPL & mount CIRCUITPY. Pin
assignments should be right but were not double-checked. The screen
is unsupported so far.
This board depends on the I/O pull ups for the I2C bus (verified by
schematic) so this adds a compile time option that enables pull ups
for ANY i2c bus on a board.
The old way mapped each byte of nvm onto a distinct nvs key, but this
allowed storage of only a very small number of bytes out of the
theoretical capacity.
Reworked like this, about half of the nvs capacity can be used for
nvm, so you're guaranteed the ability to store 9kB this way.
This keeps the mutex info in the same spot in memory. "Statically
allocating it" with CircuitPython meant that the buffer moved when
the I2C object is moved to keep it alive for a display.
Fixes#4962
I noticed that the loop over 65535 possible denominators took a long time,
causing up to 100ms wait for a sound sample to start playing!
This algorithm, adapted from an algorithm shown in Python's fractions.py,
is guaranteed to find the best denominator in a small number of steps
(I think log2-many steps but I'm not sure). In practice, it means the time
between samples playing is just 10ms, and some of that is recreating the
sine wave sample in Python each time.
It often finds the same solution as the old code, but sometimes it finds
one a bit better since it compares the ratios using float point instead
of integer arithmetic.