1. 13 Jan, 2023 6 commits
  2. 12 Jan, 2023 7 commits
  3. 20 Dec, 2022 3 commits
    • Damien George's avatar
      extmod/network_cyw43: Fix handling of networks with open security. · 699477d1
      Damien George authored
      Prior to this commit, the default security=-1 would be passed directly
      through to the cyw43 driver to auto-detect the security type, but that
      driver did not correctly handle the case of open security.
      
      The cyw43 driver has now been changed to no longer support auto-detection,
      rather it is up to the caller to always select the security type.  The
      defaults are now implemented in the Python bindings and are:
      - if no key is given then it selects open security
      - if a key is given then it selects WPA2_MIXED_PSK
      
      Calling `wlan.connect(<ssid>)` will now connect to an open network, on
      both rp2 and stm32 ports.  The form `wlan.connect(<ssid>, <key>)` will
      connect to a WPA2 network.
      
      Fixes issue #9016.
      Signed-off-by: default avatarDamien George <damien@micropython.org>
      699477d1
    • Damien George's avatar
      lib/cyw43-driver: Update driver to latest version. · b151422c
      Damien George authored
      Changes since the previous version:
      - remove mDNS
      - implement lwIP IGMP MAC filter callback
      - implement IPv6 support
      - allow building with IGMP disabled
      - fix handshake meggase WAIT_G1 event value
      - increase EAPOL timeout from 2500ms to 500ms
      - add function to get RSSI
      - fix handling of open security networks
      - remove support for automatically setting auth type
      Signed-off-by: default avatarDamien George <damien@micropython.org>
      b151422c
    • Felix Dörre's avatar
      rp2: Fix lightsleep to work with interrupts and cyw43 driver. · 439298be
      Felix Dörre authored
      This commit prevents the device from "hanging" when using lightsleep while
      the WiFi chip is active.
      
      Whenever the WiFi chip wants to interrupt the microcontroller to notify it
      for a new package, it sets the CYW43_PIN_WL_HOST_WAKE pin to high,
      triggering an IRQ.  However, as polling the chip cannot happen in an
      interrupt handler, it subsequently notifies the pendsv-service to do a poll
      as soon as the interrupt handler ended.  In order to prevent a new
      interrupt from happening immediately afterwards, even before the poll has
      run, the IRQ handler disables interrupts from the pin.
      
      The first problem occurs, when a WiFi package arrives while the main loop
      is in cyw43-code.  In order to prevent concurrent access of the hardware,
      the network code blocks pendsv from running again while entering lwIP code.
      
      The same holds for direct cyw43 code (like changing the cyw43-gpios, i.e.
      the LED on the Pico W).  While the pendsv is disabled, interrupts can still
      occur to schedule a poll (and disable further interrupts), but it will not
      run.  This can happen while the microcontroller is anywhere in rp2040 code.
      
      In order to preserve power while waiting for cyw43 responses,
      cyw43_configport.h defines CYW43_DO_IOCTL_WAIT and
      CYW43_SDPCM_SEND_COMMON_WAIT to __WFI().  While this might work in most
      cases, there are 2 edge cases where it fails:
      - When an interrupt has already been received by the cyw43 stack, for
        example due to an incoming ethernet packet.
      - When the interrupt from the cyw43 response comes before the
        microcontroller entered the __WFI() instruction.
      
      When that happens, wfi will just block forever as no further interrupts are
      received.  The only way to safely use wfi to wake up from an interrupt is
      inside a critical section, as this delays interrupts until the wfi is
      entered, possibly resuming immediately until interrupts are reenabled and
      the interrupt handler is run.  Additionally this critical section needs to
      check whether the interrupt has already been disabled and pendsv was
      triggered, as in such a case, wfi can never be woken up, and needs to be
      skipped, because there is already a package from the network chip waiting.
      Note that this turns cyw43_yield into a nop (and thereby the cyw43-loops
      into busy waits) from the second time onwards, as after the first call, a
      pendsv request will definitely be pending.  More logic could be added, to
      explicitly enable the interrupt in this case.
      
      Regarding lightsleep, this code has a similar problem.  When an interrupt
      occurs during lightsleep, the IRQ and pendsv handler and thereby poll are
      run immediately, with the clocks still disabled, causing the SPI transfers
      to fail.  If we don't want to add complex logic inside the IRQ handler we
      need to protect the whole lightsleep procedure form interrupts with a
      critical section, exiting out early if an interrupt is pending for whatever
      reason.  Only then we can start to shut down clocks and only enable
      interrupts when the system is ready again.  Other interrupt handlers might
      also be happy, that they are only run when the system is fully operational.
      
      Tested on a Pico W, calling machine.lightsleep() within an endless loop and
      pinging from the outside.
      439298be
  4. 19 Dec, 2022 3 commits
  5. 16 Dec, 2022 2 commits
  6. 15 Dec, 2022 9 commits
  7. 14 Dec, 2022 10 commits