The esp32 I2C driver sets a global timeout during init. The functionality
for this is currently only correct for original esp32 and esp32-s2, newer
parts have a slightly different argument which is log-base-2 of the
timeout.
Note that `i2c_set_timeout()` is a thin layer around `i2c_ll_set_tout()`
with the latter writing directly to the hardware register. So the timeout
argument passed to `i2c_set_timeout()` needs to be in units calculated by
`i2c_ll_calculate_timeout_us_to_reg_val()`.
Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
When calling from Python into JavaScript and passing along keyword
arguments, the FFI bindings currently only support at most 1 positional
argument. For example:
import js
js.func(1, b=2, c=3)
This commit fixes that by supporting arbitrary number of positional
arguments, in combination with keyword arguments. So now the following
works:
import js
js.func(1, 2, c=3, d=4)
Tests are added for these new, supported cases.
Signed-off-by: Damien George <damien@micropython.org>
These changes correspond to the following TinyUSB commits:
- d997f0071ea5d2d07e340d183fffb97e09526773
change dcd_init() to take rhport struct
- 1f18be93db39dbc57bbf34f982dbe07e209a2ae3
change the tusb_rhport_init_t struct, exclude the rhport to make API more
consistent
- e83e08343afca86b2bacf26822ef9032571e6f56
change dcd_init() return from void to bool
Signed-off-by: Damien George <damien@micropython.org>
This allows out-of-tree tests like:
$ make -C ports/unix/ BUILD=/tmp MICROPY_MPYCROSS=~/bin/mpy-cross test
Signed-off-by: Yanfeng Liu <yfliu2008@qq.com>
With the aim of getting consistency, and removing the need to learn an
additional term, replace uses of uPy/uPython with MPy/MicroPython.
Rule of thumb was to use "MPy" abbreviation where "CPy" is used nearby, but
the full word MicroPython otherwise.
This work was funded through GitHub Sponsors.
Signed-off-by: Angus Gratton <angus@redyak.com.au>
Support both the legacy ESP-IDF I2C driver (driver/i2c.h) and the new
driver/i2c_master.h API for all ESP32-series SoCs. This is controlled by
the new config option MICROPY_HW_ESP_NEW_I2C_DRIVER, which is disabled by
default.
There is a small change to the legacy variant, which shows now as well freq
and timeout_us in the print() method.
Open issues with the new driver:
- No control of the stop=True|False option. stop is always assumed to
be True. An issue is raised at the esp-idf repository for it.
- Separate call to probe the address at fixed 100kHz. The need is caused
by the fact, that NACK on an address is considered as an hard error.
According to espressif's issue tracker this is already changed for
v6.x and will be backported to earlier versions. So we may see it in
a version after V5.5.1 or in a version 5.4.3. There is code in
comments to support zero-length writes.
Original patch for the v2 driver by Vincent1-python <pywei201209@163.com>.
Signed-off-by: robert-hh <robert@hammelrath.com>
This unix minimal variant already has a few other things enabled beyond the
default minimal configuration, and C-stack checking is arguably more
important than those, so enable it. This helps to get some of the stress
tests passing on this variant.
Signed-off-by: Damien George <damien@micropython.org>
Currently testing on the unix port with `--via-mpy` only runs tests in the
`basics`, `float` and `micropython` test directories.
This commit removes that restriction and now runs `--via-mpy` tests using
all possible test directories. This improves test coverage.
Signed-off-by: Damien George <damien@micropython.org>
NameError occurred when trying to access the argument of RTC.wakeup()
callback because the callback argument is not initialized. To fix this
issue, this commit passes EXTI_RTC_WAKEUP to callback argument.
This is equivalent behavior with ExtInt callback.
Signed-off-by: Yuuki NAGAO <wf.yn386@gmail.com>
Prior to this fix, if a JavaScript thenable/Promise that was part of an
asyncio chain was rejected it would be ignored because the Python-side
`ThenableEvent` did not register a handler for the rejection.
That's fixed by this commit, and a corresponding test added.
Signed-off-by: Damien George <damien@micropython.org>
`cur_task` can never be `None` in the webassembly port, so test it for the
top-level task to see if an asyncio Task is active or not.
This fixes a bug where await'ing on a JavaScript awaitable that ends up
raising an error would not be caught on the Python side. The fix here
makes sure it is caught by Python, as tested by the new test.
Signed-off-by: Damien George <damien@micropython.org>
With the parent commit implementing proper identities, this equality check
option is no longer needed.
Signed-off-by: Damien George <damien@micropython.org>
Commit ffa98cb014 improved equality for
`JsProxy` objects so that, eg, `js.Object == js.Object` is true.
As mentioned in #17758, a further optimisation is to make identity work in
that case, eg `js.Object is js.Object` should be true (on the Python side).
This commit implements that, by keeping track of all `JsProxy` Python
objects and reusing them where possible: where the underlying JS ref is
equal, ie they point to the same JS object. That reduces memory churn and
gives better identity behaviour of JS objects proxied over to Python.
As part of this, a bug is fixed where JS objects can be freed while there's
still a `JsProxy` referring to that JS object. A test is added for that
exact scenario, and the test now passes.
Signed-off-by: Damien George <damien@micropython.org>
Doing GC calls in the entry path (when JavaScript calls into MicroPython at
the top/outer level) can lead to freeing of objects which are still in use.
This is because the (JavaScript) objects are referenced in the input
arguments to the C functions and they are not yet converted to full proxy
objects and not yet tracked properly by the live-object tracker.
Signed-off-by: Damien George <damien@micropython.org>
This commit makes it explicit that the port uses the
MICROPY_CONFIG_ROM_LEVEL_CORE_FEATURES feature level, and removes config
options that are the default at this level.
This change is a no-op for the firmware.
Signed-off-by: Damien George <damien@micropython.org>
On most ports, printing an instance of machine.SPI gives something like:
>>> machine.SPI(1)
SPI(1, baudrate=328125, polarity=0, phase=0, bits=8)
This commit makes the nrf port do the same.
The reason for this change is:
- make nrf consistent with other ports
- allow the `tests/extmod/machine_spi_rate.py` to run on the nrf port (this
tests parses the output of str(spi) to get the actual baudrate)
Signed-off-by: Damien George <damien@micropython.org>
And expand the test for `readinto()` to test the difference between trying
to read the requested amount by doing multiple underlying IO calls, and
only doing one call.
Signed-off-by: Damien George <damien@micropython.org>
On the zephyr port, hard IRQ handlers run with a separate stack on a
different thread, so each call to mp_irq_dispatch() and mp_irq_handler()
has to be wrapped with adjustments to the stack-limit checker.
Move these adjustments into the shared mp_irq_dispatch(), introducing
MICROPY_STACK_SIZE_HARD_IRQ which a port can define to non-zero if it
uses a separate stack for hard IRQ handlers. We only need wrap the hard
dispatch case. This should reduce binary size on zephyr without affecting
other ports.
Signed-off-by: Chris Webb <chris@arachsys.com>
machine.Timer() has inconsistent behaviour between ports: some run
callbacks in hard IRQ context whereas others schedule them like soft IRQs.
Most ports now support a hard= argument to the machine.Timer constructor
or initialiser to explicitly choose between these behaviours. However,
esp32 does not support hardware interrupts because they are not delivered
to the main thread, so the interrupt handler would need to acquire the GIL.
Raise a ValueError if hard=True is requested for esp32 machine.Timer.
Signed-off-by: Chris Webb <chris@arachsys.com>
machine.Timer() has inconsistent behaviour between ports: some run
callbacks in hard IRQ context whereas others schedule them like soft IRQs.
As on the rp2 port, add support to the esp8266 port for a hard= argument
to explicitly choose between these, setting the default to False to match
the existing behaviour. Open-code this as we don't link against mpirq.c
so can't use mp_irq_dispatch().
Signed-off-by: Chris Webb <chris@arachsys.com>
machine.Timer() has inconsistent behaviour between ports: some run
callbacks in hard IRQ context whereas others schedule them like soft IRQs.
As on the rp2 port, add support to the zephyr port for a hard= argument
to explicitly choose between these, setting the default to False to match
the existing behaviour.
Adjust the stack-limit check to use the ISR stack while the callback is
dispatched so that hard IRQ callbacks work, as with machine_pin.c and
machine_i2c_target.c IRQ callbacks.
Signed-off-by: Chris Webb <chris@arachsys.com>
machine.Timer() has inconsistent behaviour between ports: some run
callbacks in hard IRQ context whereas others schedule them like soft IRQs.
As on the rp2 port, add support to the stm32 port for a hard= argument
to explicitly choose between these, setting the default to True to match
the existing behaviour.
Signed-off-by: Chris Webb <chris@arachsys.com>
machine.Timer() has inconsistent behaviour between ports: some run
callbacks in hard IRQ context whereas others schedule them like soft IRQs.
As on the rp2 port, add support to the renesas-ra port for a hard= argument
to explicitly choose between these, setting the default to True to match
the existing behaviour.
Signed-off-by: Chris Webb <chris@arachsys.com>
Now that mp_irq_dispatch() is available to dispatch arbitary hard/soft
callbacks, take advantage of this for rp2 machine.Timer. This should
slightly reduce binary size.
Signed-off-by: Chris Webb <chris@arachsys.com>
Changes made here for N6 are:
- set RIF security attributes for ADC12
- clock ADC12 at 50MHz (maximum) so it runs at spec (max 5Msamp/sec)
- increase sampling time for standard channels to 46.5 cycles
- calibrate ADC in `adc.c`
- correctly clear ADC_CFGR1_RES bits in `machine_adc.c`
- set preselection register in `machine_adc.c`
Signed-off-by: Damien George <damien@micropython.org>
Otherwise an error message will pop up at the first instatiation
of the UART object.
Addresses #18122 / #18123.
Signed-off-by: robert-hh <robert@hammelrath.com>
Fixes are:
- Enable VREG before initializing ADC.
- The channel value of internal sensor should convert with
__LL_ADC_CHANNEL_TO_DECIMAL_NB().
Signed-off-by: Yuuki NAGAO <wf.yn386@gmail.com>
Fixes are:
- The internal sensors of STM32G0 are connected channel 12, 13, 14.
- Update adc_refcor before reading vbat and tempsensor because reference
values are at VDDA=3.0V.
- The method of initialize of sampling time is different with other MCUs:
STM32G0 should initialize SamplingTimeCommon1/2 first. When reading
value from ADC, ADC_ChannelConfTypeDef.SamplingTime should be specified
SamplingTimeCommon1 or SamplingTimeCommon2. In this patch,
SamplingTimeCommon2 is used for internal sensors and SamplingTimeCommon1
is used for external ADC channels.
Signed-off-by: Yuuki NAGAO <wf.yn386@gmail.com>
Lines like the following were not handled by `make-stmconst.py`:
#define APBPERIPH_BASE (PERIPH_BASE)
This leads to missing definitions on stm module. For example, `stm.RTC` is
not defined if `RTC_BASE` is defined as
#define RTC_BASE (APBPERIPH_BASE + 0x00002800UL)
because `APBPERIPH_BASE` is not handled as a valid id.
This patch modifies the RegExp so it can handle the above.
Signed-off-by: Yuuki NAGAO <wf.yn386@gmail.com>
Previously, when running `micropython -m <module>` and the module called
sys.exit(), the registered atexit function was not executed. This was due
to sys.exit() raising a SystemExit exception, which bypassed the atexit
handler. This change fixes the issue so that the atexit function is
properly invoked when exiting via sys.exit().
Additionally, following the pattern in execute_from_lexer(),
mp_hal_set_interrupt_char() and mp_handle_pending() handling were added to
ensure that the atexit function is also executed when the user exits via
Ctrl-C.
Signed-off-by: Mike Wang <mikewang000000@gmail.com>