1. 15 Feb, 2024 10 commits
  2. 05 Jan, 2024 4 commits
  3. 27 Dec, 2023 1 commit
  4. 22 Dec, 2023 6 commits
    • Daniël van de Giessen's avatar
      extmod/nimble: Do not set GAP device name after sync. · d014c828
      Daniël van de Giessen authored
      Instead, configure the default once at compile-time. This means the GAP
      name will no longer be set to default after re-initializing Bluetooth.
      Signed-off-by: default avatarDaniël van de Giessen <daniel@dvdgiessen.nl>
      d014c828
    • Damien George's avatar
      0b2676db
    • Nicko van Someren's avatar
      rp2/rp2_dma: Introduce a new rp2.DMA class for control over DMA xfers. · cfc212b1
      Nicko van Someren authored
      This commit implements fairly complete support for the DMA controller in
      the rp2 series of microcontrollers.  It provides a class for accessing the
      DMA channels through a high-level, Pythonic interface, and functions for
      setting and manipulating the DMA channel configurations.
      
      Creating an instance of the rp2.DMA class claims one of the processor's DMA
      channels.  A sensible, per-channel default value for the ctrl register can
      be fetched from the DMA.pack_ctrl() function, and the components of this
      register can be set via keyword arguments to pack_ctrl().
      
      The read, write, count and ctrl attributes of the DMA class provide
      read/write access to the respective registers of the DMA controller.  The
      config() method allows any or all of these values to be set simultaneously
      and adds a trigger keyword argument to allow the setup to immediately be
      triggered.  The read and write attributes (or keywords in config()) accept
      either actual addresses or any object that supports the buffer interface.
      The active() method provides read/write control of the channel's activity,
      allowing the user to start and stop the channel and test if it is running.
      
      Standard MicroPython interrupt handlers are supported through the irq()
      method and the channel can be released either by deleting it and allowing
      it to be garbage-collected or with the explicit close() method.
      
      Direct, unfettered access to the DMA controllers registers is provided
      through a proxy memoryview() object returned by the DMA.registers attribute
      that maps directly onto the memory-mapped registers.  This is necessary for
      more fine-grained control and is helpful for allowing chaining of DMA
      channels.
      
      As a simple example, using DMA to do a fast memory copy just needs:
      
          src = bytearray(32*1024)
          dest = bytearray(32*1024)
          dma = rp2.DMA()
          dma.config(read=src, write=dest, count=len(src) // 4,
              ctrl=dma.pack_ctrl(), trigger=True)
      
          # Wait for completion
          while dma.active():
              pass
      
      This API aims to strike a balance between simplicity and comprehensiveness.
      Signed-off-by: default avatarNicko van Someren <nicko@nicko.org>
      Signed-off-by: default avatarDamien George <damien@micropython.org>
      cfc212b1
    • Sebastian Romero's avatar
      nrf/main: Add /flash and /flash/lib to sys.path. · e4d3ab33
      Sebastian Romero authored
      This allows to follow good practice and have libraries live in the lib
      folder which means they will be found by the runtime without adding this
      path manually at runtime.
      Signed-off-by: default avatarSebastian Romero <s.romero@arduino.cc>
      e4d3ab33
    • Peter Züger's avatar
      py/mkrules.mk: Fix dependency file generation for compiler wrappers. · d69e69ad
      Peter Züger authored
      When compiling with distcc, it does not understand the -MD flag on its own.
      This fixes the interaction by explicitly adding the -MF option.
      
      The error in distcc is described here under "Problems with gcc -MD":
      https://www.distcc.org/faq.htmlSigned-off-by: default avatarPeter Züger <zueger.peter@icloud.com>
      d69e69ad
    • Peter Züger's avatar
      extmod/vfs_lfs: Fix lfs cache_size calculation. · ce42c9ee
      Peter Züger authored
      The calculation of the lfs2 cache_size was incorrect, the maximum allowed
      size is block_size.
      
      The cache size must be: "a multiple of the read and program sizes, and a
      factor of the block size".
      Signed-off-by: default avatarPeter Züger <zueger.peter@icloud.com>
      ce42c9ee
  5. 21 Dec, 2023 7 commits
    • Maarten van der Schrieck's avatar
      ports: Fix sys.stdout.buffer.write() return value. · 3bca93b2
      Maarten van der Schrieck authored
      MicroPython code may rely on the return value of sys.stdout.buffer.write()
      to reflect the number of bytes actually written. While in most scenarios a
      write() operation is successful, there are cases where it fails, leading to
      data loss. This problem arises because, currently, write() merely returns
      the number of bytes it was supposed to write, without indication of
      failure.
      
      One scenario where write() might fail, is where USB is used and the
      receiving end doesn't read quickly enough to empty the receive buffer. In
      that case, write() on the MicroPython side can timeout, resulting in the
      loss of data without any indication, a behavior observed notably in
      communication between a Pi Pico as a client and a Linux host using the ACM
      driver.
      
      A complex issue arises with mp_hal_stdout_tx_strn() when it involves
      multiple outputs, such as USB, dupterm and hardware UART. The challenge is
      in handling cases where writing to one output is successful, but another
      fails, either fully or partially. This patch implements the following
      solution:
      
      mp_hal_stdout_tx_strn() attempts to write len bytes to all of the possible
      destinations for that data, and returns the minimum successful write
      length.
      
      The implementation of this is complicated by several factors:
      - multiple outputs may be enabled or disabled at compiled time
      - multiple outputs may be enabled or disabled at runtime
      - mp_os_dupterm_tx_strn() is one such output, optionally containing
        multiple additional outputs
      - each of these outputs may or may not be able to report success
      - each of these outputs may or may not be able to report partial writes
      
      As a result, there's no single strategy that fits all ports, necessitating
      unique logic for each instance of mp_hal_stdout_tx_strn().
      
      Note that addressing sys.stdout.write() is more complex due to its data
      modification process ("cooked" output), and it remains unchanged in this
      patch. Developers who are concerned about accurate return values from
      write operations should use sys.stdout.buffer.write().
      
      This patch might disrupt some existing code, but it's also expected to
      resolve issues, considering that the peculiar return value behavior of
      sys.stdout.buffer.write() is not well-documented and likely not widely
      known. Therefore, it's improbable that much existing code relies on the
      previous behavior.
      Signed-off-by: default avatarMaarten van der Schrieck <maarten@thingsconnected.nl>
      3bca93b2
    • Maarten van der Schrieck's avatar
      extmod/os_dupterm: Let mp_os_dupterm_tx_strn() return num bytes written. · 91ee8ac8
      Maarten van der Schrieck authored
      In case of multiple outputs, the minimum successful write length is
      returned.  In line with this, in case any output has a write error, zero is
      returned.
      
      In case of no outputs, -1 is returned.
      
      The return value can be used to assess whether writes were attempted, and
      if so, whether they succeeded.
      Signed-off-by: default avatarMaarten van der Schrieck <maarten@thingsconnected.nl>
      91ee8ac8
    • Jim Mussared's avatar
      tools/manifestfile.py: Add support for external libraries. · 5d28bb4a
      Jim Mussared authored
      This adds a `add_library(name, path)` method for use in manifest.py that
      allows registering an external path (e.g. to another repo) by name.
      
      This name can then be passed to `require("package", library="name")` to
      reference packages in that repo/library rather than micropython-lib.
      
      Within the external library, `require()` continues to work as normal
      (referencing micropython-lib) by default, but they can also specify the
      library name to require another package from that repo/library.
      Signed-off-by: default avatarJim Mussared <jim.mussared@gmail.com>
      5d28bb4a
    • IhorNehrutsa's avatar
      5552896c
    • IhorNehrutsa's avatar
      extmod/modhashlib: Support MD5 with mbedtls 3.x. · b31eef60
      IhorNehrutsa authored
      This change was missd in e7ae3ad9.
      Signed-off-by: default avatarIhorNehrutsa <Ihor.Nehrutsa@gmail.com>
      b31eef60
    • Jim Mussared's avatar
      74fd7b3d
    • Jim Mussared's avatar
      extmod/modselect: Handle growing the pollfds allocation correctly. · 8b24aa36
      Jim Mussared authored
      The poll_obj_t instances have their pollfd field point into this
      allocation.  So if re-allocating results in a move, we need to update the
      existing poll_obj_t's.
      
      Update the test to cover this case.
      
      Fixes issue #12887.
      
      This work was funded through GitHub Sponsors.
      Signed-off-by: default avatarJim Mussared <jim.mussared@gmail.com>
      8b24aa36
  6. 20 Dec, 2023 5 commits
  7. 19 Dec, 2023 2 commits
    • Damien George's avatar
      esp32: Add MICROPY_GC_INITIAL_HEAP_SIZE option and tune it. · f6d63087
      Damien George authored
      This gets back the old heap-size behaviour on ESP32, before auto-split-heap
      was introduced: after the heap is grown one time the size is 111936 bytes,
      with about 40k left for the IDF.  That's enough to start WiFi and do a
      HTTPS request.
      Signed-off-by: default avatarDamien George <damien@micropython.org>
      f6d63087
    • Damien George's avatar
      py/gc: Improve calculation of new heap size in split-heap-auto mode. · 97b13132
      Damien George authored
      There are two main changes here to improve the calculation of the size of
      the next heap area when automatically expanding the heap:
      - Compute the existing total size by counting the total number of GC
        blocks, and then using that to compute the corresponding number of bytes.
      - Round the bytes value up to the nearest multiple of BYTES_PER_BLOCK.
      
      This makes the calculation slightly simpler and more accurate, and makes
      sure that, in the case of growing from one area to two areas, the number
      of bytes allocated from the system for the second area is the same as the
      first.  For example on esp32 with an initial area size of 65536 bytes, the
      subsequent allocation is also 65536 bytes.  Previously it was a number that
      was not even a multiple of 2.
      Signed-off-by: default avatarDamien George <damien@micropython.org>
      97b13132
  8. 18 Dec, 2023 5 commits