1. 07 Aug, 2024 2 commits
    • Damien George's avatar
      py/emitnative: Fix case of clobbered REG_TEMP0 when loading const obj. · afba3e05
      Damien George authored
      The `emit_load_reg_with_object()` helper function will clobber `REG_TEMP0`.
      This is currently OK on architectures where `REG_RET` and `REG_TEMP0` are
      the same (all architectures except RV32), because all callers of
      `emit_load_reg_with_object()` use either `REG_RET` or `REG_TEMP0` as the
      destination register.  But on RV32 these registers are different and so
      when `REG_RET` is the destination, `REG_TEMP0` is clobbered, leading to
      incorrectly generated machine code.
      
      This commit fixes the issue simply by using `REG_TEMP0` as the destination
      register for all uses of `emit_load_reg_with_object()`, and adds a comment
      to make sure the caller of this function is careful.
      Signed-off-by: default avatarDamien George <damien@micropython.org>
      afba3e05
    • Phil Howard's avatar
      rp2/machine_i2s: Deinit all active I2S instances on soft reset. · d2e33fe3
      Phil Howard authored
      Add `machine_i2s_deinit_all` to teardown any active I2S instances on soft
      reset.  Prior to this fix, code using I2S required a try/finally in order
      to avoid a hard fault on soft reset.
      
      Fixes issue #14339.
      Signed-off-by: default avatarPhil Howard <phil@gadgetoid.com>
      d2e33fe3
  2. 02 Aug, 2024 8 commits
  3. 01 Aug, 2024 3 commits
  4. 31 Jul, 2024 3 commits
  5. 26 Jul, 2024 6 commits
  6. 25 Jul, 2024 10 commits
  7. 24 Jul, 2024 1 commit
    • Felix Dörre's avatar
      rp2/lwip_inc: Enable IPv6 per default on rp2 port. · 7fe8f030
      Felix Dörre authored
      Having IPv6 support is important, especially for IoT-Devices which might be
      many, requiring individual IP-addresses. In particular direct access via
      link-local addresses and having deterministic SLAAC-addresses can be quite
      convenient. Also in IPv6-only networks or for connecting to IPv6-only
      services, this is very useful.
      
      For the Pico W, there is enough flash and RAM that enabling IPv6 by default
      is the right choice.
      
      Should IPv6 support in a network exist (i.e. there are Router
      Advertisements), but not provide connectivity, connecting by domain name
      should not be a problem as DNS will default to return the IPv4-address (if
      that exists), unless reconfigured at runtime to prefer IPv6.
      
      In any case a user can disable obtaining SLAAC-addresses with:
      
          <nic>.ipconfig(autoconf6=False)
      Signed-off-by: default avatarFelix Dörre <felix@dogcraft.de>
      7fe8f030
  8. 23 Jul, 2024 7 commits
    • Angus Gratton's avatar
      rp2: Stop machine.idle() blocking indefinitely. · ba985334
      Angus Gratton authored
      Updates rp2 port to always resume from idle within 1ms max.
      
      When rp2 port went tickless the behaviour of machine.idle() changed as
      there is no longer a tick interrupt to wake it up every millisecond. On a
      quiet system it would now block indefinitely. No other port does this.
      
      See parent commit for justification of why this change is useful.
      
      Also adds a test case that fails without this change.
      
      This work was funded through GitHub Sponsors.
      Signed-off-by: default avatarAngus Gratton <angus@redyak.com.au>
      ba985334
    • Angus Gratton's avatar
      docs: Specify that machine.idle() returns at least every 1ms. · 81daba31
      Angus Gratton authored
      A lot of existing code (i.e. micropython-lib lps22h, lcd160cr sensor
      drivers, lora sync_modem driver, usb-device-hid) calls machine.idle()
      inside a tight loop that is polling some condition. This reduces the power
      usage compared to constantly looping, but can be faster than calling a
      sleep function. However on a tickless port there's not always an interrupt
      before the condition they are polling for, so it's difficult to restructure
      this code if machine.idle() doesn't have any upper limit on execution time.
      
      This commit specifies an upper limit of 1ms before machine.idle() resumes
      execution. This is already the case for all ports except rp2.
      
      This work was funded through GitHub Sponsors.
      Signed-off-by: default avatarAngus Gratton <angus@redyak.com.au>
      81daba31
    • Phil Howard's avatar
      rp2/rp2_pio: Disable correct IRQ for PIO1. · e1ecc232
      Phil Howard authored
      Fix a typo that was disabling PIO0_IRQ_1 instead of PIO1_IRQ_0.
      Signed-off-by: default avatarPhil Howard <phil@gadgetoid.com>
      e1ecc232
    • Angus Gratton's avatar
      rp2: Fix wakeup from WFE on core1. · 9db16cfe
      Angus Gratton authored
      If core1 executes `mp_wfe_or_timeout()` then it needs to receive an
      interrupt or a SEV to resume execution, but the soft timer interrupt only
      fires on core 0.  This fix adds a SEV to the soft timer interrupt handler.
      
      This issue was masked by the issue fixed in the previous commit, as WFE
      previously wasn't suspending properly.
      
      Verified via the existing thread_sleep2 test.
      
      This work was funded through GitHub Sponsors.
      Signed-off-by: default avatarAngus Gratton <angus@redyak.com.au>
      9db16cfe
    • Angus Gratton's avatar
      rp2: Fix power consumption when sleeping with a timeout. · eced9d86
      Angus Gratton authored
      Fixes a regression introduced in 3af006ef
      where WFE never blocked in `mp_wfe_or_timeout()` function and would
      busy-wait instead.  This increases power consumption measurably.
      
      Root cause is that `mp_wfe_or_timeout()` calls soft timer functions that
      (after the regression) call `recursive_mutex_enter()` and
      `recursive_mutex_exit()`.  The exit calls
      `lock_internal_spin_unlock_with_notify()` and the default pico-sdk
      implementation of this macro issues a SEV which negates the WFE that
      follows it, meaning the CPU never suspends.
      
      See https://forums.raspberrypi.com/viewtopic.php?p=2233908 for more
      details.
      
      The fix in this comment adds a custom "nowait" variant mutex that doesn't
      do WFE/SEV, and uses this one for PendSV.  This will use more power when
      there's contention for the PendSV mutex as the other core will spin, but
      this shouldn't happen very often.
      
      This work was funded through GitHub Sponsors.
      Signed-off-by: default avatarAngus Gratton <angus@redyak.com.au>
      eced9d86
    • Alessandro Gatti's avatar
      unix/main: Fix GCC builds for RISC-V 64 bits. · 44527ada
      Alessandro Gatti authored
      This contains a workaround to silence a possibly incorrect warning when
      building the Unix port with GCC targeting RISC-V 64 bits.
      
      Fixes issue #12838.
      Signed-off-by: default avatarAlessandro Gatti <a.gatti@frob.it>
      44527ada
    • robert-hh's avatar
      esp32/machine_timer: Limit timer numbers for ESP32C3. · 594c4229
      robert-hh authored
      The ESP32C3 has only two timers in one group.  In the code this is
      reflected as two groups with one timer.
      Signed-off-by: default avatarrobert-hh <robert@hammelrath.com>
      594c4229