#circuitpython-dev
1 messages · Page 92 of 1
Hi Dan
Here are the logs. Please tell me if I can support you more on this topic.
mpremote with debug output of raw ascii
I patched mpremote so it allows us to see all characters on the serial line.
mpremote tries to bring the device in a specific state (raw mode, soft reset, raw paste mode). I added debug output whenever such a mode is entered.
This mpremote may be helpful to debug https://github.com/adafruit/circuitpython/issues/8038 and https://github.com/adafruit/circuitpython/...
Raw paste mode is very fragile. I have a project that uses basically the same low-level transport mechanisms as mpremote and depending on the device you really need to transfer data using very small chunks.
Raw paste mode is very fragile. I have a project that uses basically the same low-level transport mechanisms as mpremote and depending on the device you really need to transfer data using very small chunks.
Hi bablokb, I agree with you that raw paste mode is fragile and I would nobody recommend to use it. This issue here is about newer cicuitpython versions crashing and not recovering - this certainly has to be fixed.
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; Adafruit Macropad RP2040 with rp2040
Code/REPL
import time
from adafruit_macropad import MacroPad
macropad = MacroPad()
last_position = 0
while True:
try:
key_event = macropad.keys.events.get()
if key_event:
if key_event.pressed:
print(key_event)
if key_event.key_number == 0:
macropad.keyboard...
So I tried, after many experiments, I
I am trying to integrate a c module into the atmel-samd port but am getting no rule to make target SRC_C. Could someone point me in the right direction?
Please push your code somewhere and a copy of the error
Finally got this all sorted. It is ready for review.
Thanks for your persistence!
This looks good to me. I am just curious. Why doesn't
circuitpython_flags.append(f"-DCIRCUITPY_BOARD_ID={board}")
work here, since we know the board has no spaces? Does the context in which this is used require a double-quoted argument?
Similarly elsewhere below, where there are filenames in quotes, etc.
The filenames are used in #include lines and need the quotes. This needs them to be a c-string:
https://github.com/adafruit/circuitpython/blob/f6f52ade4c44b70a18830b1e9275b600874d84f9/shared-bindings/board/__init__.h#L15
I changed it to wrapped in single quotes because the response file will escape the backspace formerly used to escape the double quote.
The current download for "Inky Frame 7.3" (Pico W Aboard) by Pimoroni" is for the older version with the Pico W. They have since released a new version with the Pico 2 W instead. Can you release a version for the Inky Frame 7.3 with Pico 2 W. To my knowledge it was just a replacement of the pico w with a pico 2 w, the rest of the hardware was the same.
Please test #10719. It was digging into how to enable it and it was simple enough to just do it.
Just tried it, and it worked fine! Thanks!
[adafruit/circuitpython] New comment on pull request #10719: Enable OV3660 camera support on XIAO S3
Tested on a recent ESP32-S3 board with an OV3660 camera. Camera now works! Thanks Scott!
No, not correct. They changed the display technology and now use a Spectra6. So at least the init-sequences have to be changed. I do have suitable init-sequences, since I use the same display made for a Pi with a Pico-to-Pi adapter, see https://github.com/bablokb/circuitpython-inky. But without a physical board to test I would not create a new board here. Maybe you can give it a try, most of it should be copy&paste anyhow.
No, not correct. They changed the display technology and now use a Spectra6. So at least the init-sequences have to be changed. I do have suitable init-sequences, since I use the same display made for a Pi with a Pico-to-Pi adapter, see https://github.com/bablokb/circuitpython-inky. But without a physical board to test I would not create a new board here. Maybe you can give it a try, most of it should be copy&paste anyhow.
Sorry didn't notice they changed it again, my version does not have...
CircuitPython version and board name
Adafruit CircuitPython 10.1.0-beta.1-2-gf6f52ade4c-dirty on 2025-11-20; Seeed Xiao ESP32-S3 Sense with ESP32S3
Code/REPL
import microcontroller
microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)
mmicrocontroller.reset()
Behavior
The board goes right back to the CircuitPython REPL (with CIRCUITPY mounted).
Also, I can't get into the bootloader using the RESET switch (tried with various delays, wai...
Removed EYESPI for TFT displays from the features list. Noted by Hem in discord: #help-with-projects message
Does it make any difference to use microcontroller.on_next_reset(microcontroller.RunMode.UF2)?
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; Pimoroni Badger 2040 with rp2040
Code/REPL
# something I tried...
# INACTIVITY TIMEOUT (Only on battery)
if time.monotonic() - last_activity > INACTIVITY_TIMEOUT:
_, is_charging = get_battery_status()
if is_charging:
print("On USB power - staying awake")
last_activity = time.monotonic()
else:
print(f"DEBUG: Inactivity timeout. Saving sta...
With the Badger2040, you don't need a pin-alarm, everything is handled in hardware. To turn power off, drive board.EN_3V3 low. To wake up, press any button at least two seconds. Note that all of this only works when running from battery, while connected to USB, the board does not shut down.
It looks like there is no board.EN_3V3 :
>>> import board
>>> dir(board)
['__class__', '__name__', 'DISPLAY', 'ENABLE_DIO', 'GP0', 'GP1', 'I2C', 'INKY_BUSY', 'INKY_CS', 'INKY_DC', 'INKY_RST', 'INT', 'MISO', 'MOSI', 'REF_1V2', 'RX', 'SCK', 'SCL', 'SDA', 'SPI', 'SW_A', 'SW_B', 'SW_C', 'SW_DOWN', 'SW_UP', 'TX', 'UART', 'USER_LED', 'USER_SW', 'VBAT_SENSE', 'VBUS_DETECT', 'VREF_POWER', '__dict__', 'board_id']
>>>
What else can I try?
I think it works with board.ENABLE_DIO.value = False.
I now need to verify what current is being drawn.
The micropython firmware only needs a short button press to wake the badger. Why is it different? It's the same hardware...
Thanks for the tip!
When CircuitPython starts up, it waits for various things, like wait for you to possibly go into safe mode.
Is there a way to disable this, even if I eventually get stuck and have to re-flash the firmware to get out of it? Is there a way to make it boot faster?
It's possible to build a custom version that does not have the safe-mode wait, or to add a different way to go into safe mode (say, holding down a button). What kind of delay are you seeing, and what are you seeing on the RGB status LED?
I was concerned about the 2 seconds delay of holding the button to wake up the badger. That's 2 seconds more then what happens when running similar code under micropython to wake it up.
As @dhalbert has said, you can reduce this to one second.
You cannot compare a generic firmware like CircuitPython with a specifically patched version of MicroPython that Pimoroni uses. Their firmware is very limited (to Pimoroni devices) and they implement all kinds of special hacks. In this case, they drive the enable-dio pin high very early so you don't have to press the button that long.
From @mikeysklar in https://forums.adafruit.com/viewtopic.php?p=1073088#p1073088, an example on CircuitPython 10.0.3 on 2025-10-17; Adafruit Feather ESP32-S3 Reverse TFT with ESP32S3
that reliably causes "Nimble out of memory":
import time
import adafruit_ble
from adafruit_ble.advertising import Advertisement
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.standard.hid import HIDService
from adafruit_ble.services.standard.device_in...
there is something wrong with the SPI docs, the parameter descriptions don't match the parameters listed in the function definition: https://docs.circuitpython.org/en/latest/shared-bindings/adafruit_bus_device/spi_device/index.html#adafruit_bus_device.spi_device.SPIDevice
it looks better in the Python library: https://github.com/adafruit/Adafruit_CircuitPython_BusDevice/blob/main/adafruit_bus_device/spi_device.py. If you feel like opening an issue - thanks, otherwise I will.
CircuitPython version and board name
10.0
Code/REPL
no code
Behavior
no behavior
Description
On the https://docs.circuitpython.org/en/latest/shared-bindings/adafruit_bus_device/spi_device/index.html#adafruit_bus_device.spi_device.SPIDevice page, the description of the class definition is:
`classadafruit_bus_device.spi_device.SPIDevice(spi: busio.SPI, chip_select: digitalio.DigitalInOut | None = None, *, baudrate: int = 100000, polarity: int ...
@tulip sleet ^^ done, hope that helps
tyvm
Ok, I will see if I can figure out how to build my custom firmware integrating pimoroni's patches.
For context, I am building a ebook reader. It needs to start fast when you pick it up to read some more pages. The Micropython gives me that, but I lose the ability to put books on the ereader by just connecting it to a computer with USB.
It turns out it's more then 2 seconds : when I hold down a button, it starts to blink the led (not RGB), for about 2 seconds, and I have to keep holding it f...
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; Hack Club Sprig with rp2040
Code/REPL
spi = board.SPI()
Behavior
>>> spi = board.SPI()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'module' object has no attribute 'SPI'
Description
No response
Additional information
A0 A1 A2 A3
AUDIO_BCLK AUDIO_DIN AUDIO_LR...
clarification, i tried doing it the manual way too, it gave the the error that GP18(the SCK pin) was already in use
>>> spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: GP18 in use
GPI18 is already in use for the FourWire bus used for the display. Are you trying to access the display or connect something else to that SPI bus.
This is being discussed in discord: #help-with-circuitpython message. Will continue there for now.
GP18 is already in use for the
FourWirebus used for the display. Are you trying to access the display or connect something else to that SPI bus?
i'm trying to access the SD card reader which is on the back of the display
@minor wing The espressif port wifi.ap_info code is here: https://github.com/adafruit/circuitpython/blob/1d13e30ac09744168014e2b41698dcc24a5ec965/ports/espressif/common-hal/wifi/Radio.c#L430. raspberrypi port here: https://github.com/adafruit/circuitpython/blob/1d13e30ac09744168014e2b41698dcc24a5ec965/ports/raspberrypi/common-hal/wifi/Radio.c#L378. shared-bindings has the higher-level API shared across ports: https://github.com/adafruit/circuitpython/blob/1d13e30ac09744168014e2b41698dcc24a5ec965/shared-bindings/wifi/Radio.c#L715
I think since espressif was the first and only wifi implementation for years, the CircuitPython API looks like espressif https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s2/api-reference/network/esp_wifi.html#_CPPv424esp_wifi_sta_get_ap_infoP16wifi_ap_record_t. For raspberrypi port, the elements of ap_info like RSSI are likely individual calls into the CYW43 driver, rather than a wholesale copy of an espressif structure.
It turns out it's more then 2 seconds : when I hold down a button, it starts to blink the led (not RGB), for about 2 seconds, and I have to keep holding it for 2-3 more seconds so it loads my code.py. If I release too soon, it doesn't "boot" my code. So, kind of a pain.
I cannot confirm this. The led blinks for exactly one second. I am using the Badger/Badger2040 in one of my projects, see https://github.com/bablokb/circuitpython-clock. I am using the buttons for special actions like "forc...
lgtm, the changes also add a general cleanup of the board definition, as well as adding board.SPI()
CircuitPython version and board name
Adafruit CircuitPython 10.1.0-beta.1 on 2025-11-06; Adafruit Pybadge with samd51j19
Same behavior on PyGamer as well.
Code/REPL
N/A
Behavior
After installing 10.1.0-beta.1 the TFT display remains dark when the device boots up. Reverting back to 10.0.3 makes the display go back to lighting up as normal.
Description
No response
Additional information
I tested PyPortal Titano (also SAMD) and it ...
I traced this back to the changes from: https://github.com/adafruit/circuitpython/pull/10699
I made a guess that the removal of reset_all_pins(); in supervisor/port.c could be related so I checked before and after that commit and found that before the backlight does turn on, and after it does not.
I'm not actually sure if reset_all_pins() is truly related, or if I just got somewhat lucky. I haven't tried isolating the changes from this PR.
I think it's related. But we can add a backlight pin initialization to init in board.c.
Where (what folder) are the wifi module code files for the Raspberry Pico contained in the circuitpython repo?
/circuitpython/ports/raspberrypi/lib/cyw43-driver ?
ports/raspberrypi/common-hal/{wifi,socketpool}. ssl in in shared-modules
the cyw43 library that actually talks to the radio module is what you are pointing to
TY! 🙂
Hello,
I noticed M5Stack Tab5 got beta support: https://circuitpython.org/board/m5stack_tab5/
I uploaded the binary (adafruit-circuitpython-m5stack_tab5-en_US-10.1.0-beta.1.bin) to my board but I don't get anything in the serial console.
Is there anything else I need to do for this model?
Regards
That board isn't really beta supported. P4 is all alpha I'd say. I didn't make much progress on it (but did try.)
The USB device port is connected to the usb-to-serial/jtag converter so we can't get the normal CIRCUITPY functionality. We could blow a fuse to swap it with the full speed USB but I doubt we want to do that. In theory we can get the usb-to-serial converter working but I didn't have time to debug it. I also didn't get the display going after realizing that.
@tulip sleet I'm around. Do you need anything from me?
I am cooking part of the time 🙂 . I could give you a progress report, but don't have any pressing questions.
I got through email and reviews and decided not to start anything else. Have a good holiday and weekend!
you too! yum!
I have another issue : I save the status of my ebook progress just before going to sleep with board.ENABLE_DIO.value = False. However, I often find the save did not happen correctly, even if I issued a "os.sync()" before the enable_dio = false.
Is there something I am missing? Or doing wrong? Or forgot to do?
Thanks again!
You must be aware of the fact that the filesystem is not writable from CircuitPython. You have various options:
- use nvram to save state. This works fine if you don't need to save much and is the least invasive
- remount
/read-writable fromboot.py. You should implement that in a way to prevent the remount (e.g. pressing button 'B' during boot), because once it is mounted rw, you cannot write from the host anymore. - add a second partition during build that is writable from CP
Then, there is definitely stuff I don't understand.
I am using f.write(data) to save stuff, and it works most of the time. I do have a toggle in my boot.py that disables usb mass storage when I press a key while booting. But most of the time, it boots on battery anyway, so, storage is writable. Or is it?
The thing that I don't get is why is it sometimes working? This feels like it should always work, or never work.
Here is my save and load state, it it helps :
def state_save(state):
...
Please post your boot.py.
@slender iron Someone pointed me to your comment
No luck getting the M5Stack Tab5 going with this yet. The USB C is connected to GPIO24/25 which is connected to the serial/jtag peripheral...
If this is still an issue then I have a good solution 🙂
For my product Tanmatsu we have made the same choice to connect the USB-C port to the USB-serial/jtag peripheral, simply because it makes a lot of sense when flashing in a factory and for easy recovery by users. But: while researching we found that we did not have to hook up the second USB1.1 PHY too, it is possible to swap the USB PHYs during runtime without having to mess with efuses.
This function in the firmware for our device implements a simple way to switch USB mode between the debug & user peripheral on the fly as often as you want: https://github.com/Nicolai-Electronics/tanmatsu-launcher/blob/main/main/usb_device.c#L193
Our firmware has MIT license so feel free to reuse this function in CircuitPython provided that our attribution gets acknowledged (2025 Nicolai Electronics).
Hopefully this allows you to add support for more boards that are wired in this way 🙂
When running the code snippet found here: https://docs.circuitpython.org/en/latest/shared-bindings/watchdog/index.html on my Raspberry Pico 2W, I get the following error: Traceback (most recent call last):
File "<stdin>", line 4, in <module>
NotImplementedError:
Think I "might have" found the problem. These are the existing files are in ~/circuitpython/ports/raspberrypi/common-hal/watchdog/, they have "no module functions" in the comments. Not sure why documentation says they are functional modules...
Ok, so I have determined that I can build working firmware images at this point, now I just need to start making the appropriate changes to the code to get features working properly, so I will be asking questions regarding how to properly make those changes, please forgive me for seemingly "dumb" questions at this point - I'm just trying to figure this out so I can help to contribute...
I'm going to work on Raspberry Pico 2W and Adafruit KB2040, since I have those devices to test/verify with. I have at least 3 things I have found (non-implemented features) for the Pico2W, I'll attempt to do those first.
I have now forked https://github.com/adafruit/circuitpython/ main, and created a new branch locally for developing the Pico 2W cyw43-rssi-current_ap fix, should I do all of the build steps listed at https://learn.adafruit.com/building-circuitpython/build-circuitpython to prepare my local branch for building?
Here it is :
import board
import digitalio
import storage
import time
button_a = digitalio.DigitalInOut(board.SW_A)
button_a.direction = digitalio.Direction.INPUT
button_a.pull = digitalio.Pull.DOWN
time.sleep(0.1)
button_pressed = button_a.value
button_a.deinit()
if button_pressed:
storage.disable_usb_drive()
print("USB mass storage DISABLED - button A was held during boot")
else:
print("USB mass storage ENABLED - button A was not pressed")
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; Seeed Xiao ESP32-C6 4MB Flash 512KB SRAM with ESP32-C6FH4
Code/REPL
import wifi, time
WLAN_SSID = "XXX"
WLAN_PASSWORD = "YYY"
_WAIT_CONNECTED_SECONDS = 15
_radio = wifi.radio
while True:
_radio.hostname = "TestHostName"
_radio.enabled = True
_radio.start_station()
print("Connecting... ")
_radio.connect(WLAN_SSID, WLAN_PASSWORD, timeout=_WAIT_CONNECTED_SECO...
You should use storage.remount("/",False) to make the filesystem writable from CircuitPython. storage.disable_usb_drive() changes if the device is presented to the host.
@minor wing Things are pretty quiet here for the US holiday weekend. More people will probably be back around to see your messages by Monday.
@slender iron I've been wondering why it might be that the ESP32P4 EV board works when other P4 devices don't, and discovered that until recently the EV board used a dedicated CP2102 UART<>USB bridge, which is dropped in the most recent revision in favour of the "native" UART/JTAG device.
So annoyingly someone is bound to eventually buy a more recent version of the board and discover it "doesn't work" as it will act the same as the Tab5, Tanmatsu etc. until we figure out switching/bringing up device mode per @wind anvil 's code snippet above. More annoyingly, I guess that might mean you can't ever have a single unified P4-EV board target...
Support for this was added recently, though I think it's only currently turned on for the Fruit Jam. It was added initially here: https://github.com/adafruit/circuitpython/pull/10122
It's documented briefly here: https://docs.circuitpython.org/en/latest/docs/workflows.html#cpsaves-drive
You can try adding something like this: https://github.com/adafruit/circuitpython/blob/11727bda1bbca0e14973d8f7e34fc7cbdd09badc/ports/raspberrypi/boards/adafruit_fruit_jam/mpconfigboard.h#L50 to the `mpconfi...
I'm glad to hear that the feature is being implemented on some boards.
As far as I can tell, my Adafruit Feather RP2040 board with CircuitPython does not have an "mpconfigboard" file at all right now, and I would be way, way out of my league to even attempt adding one (if that's even possible).
So the original post remains my dream - to have dual partitions implemented on all boards where it makes sense to do so.
The mpconfigboard.h file is part of the code used to build the board: https://learn.adafruit.com/building-circuitpython. You would need to learn to do a custom build.
Currently we don't have a way to control the existence of this extra partition dynamically.
CircuitPython version and board name
Tried with latest version (CircuitPython 10.0.3)
and also all other major versions
Code/REPL
No code, just installation failing
Behavior
When dragging the combined hex in the MICROBIT drive, the board just resets like nothing happened
When dragging the combined hex in the MAINTENANCE drive, there is a fail.txt with this content:
error: The starting address for the interface update is wrong.
type: user
Here is ...
Images automagically compressed by Calibre's image-actions ✨
Compression reduced images by 15.9%, saving 1.1 MB.
| Filename | Before | After | Improvement |
|---|---|---|---|
| assets/images/boards/original/waveshare_esp32_s3_touch_lcd_2_8.jpg | 279.4 KB | 89.4 KB | 68.0% |
| assets/images/boards/large/waveshare_esp32_s3_touch_lcd_2_8.jpg | 179.5 KB | 57.5 KB | 67.9% |
| assets/images... |
Hello from 2025. Issue is still here. This is related to circuitpy.
Something went wrong right after device discovered:
[3641919.149882] sd 8:0:0:1: Attached scsi generic sg6 type 0
[3641919.152140] sd 8:0:0:0: [sdf] 2049 512-byte logical blocks: (1.05 MB/1.00 MiB)
[3641919.231050] usb 1-1.2: reset full-speed USB device number 93 using xhci_hcd
[3641919.309439] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device
[3641919.309827] usb 1-1.2: Quirk or no altset; falling back to MIDI 1.0
[3641919.3192...
I've made the change and forced the storage.remount to false in boot.py, and it did not fix the issue.
Since I am sometimes able to resume the ebook where it left off correctly, I think this suggests some kind of buffer/purge to "disk" problem/delay. If the issue was a read-only filesystem, it would just never work.
Any other ideas I should try?
My suggestions:
- try a 9.2.8 version and see if you have the same problem
- remove the initial blinking with
CIRCUITPY_SKIP_SAFE_MODE_WAIT = 1 - add a short blink very early in your
code.py/main.pyso you know when the system is up - retest
- write to nvram instead of a file (read the docs of module
nvm). Then you don't need theboot.pystuff anymore. As far as I can see, you only write a filename and a page, that should fit and since you already have the binary conversion...
@FFAMax I have not seen another report of this. Since when you take away the hub, it works, something about the hub is provoking the problem. Could you open a new issue and say specifically which make and model of hub it is, the version of Linux, and details on the host computer.
Do you have any non-RP2 CircuitPython boards? Do they exhibit the same problem? Have you tried other host ports and other ports on the hub?
<@&356864093652516868> We'll have our weekly meeting in about 65 minutes from now in this text channel and in the circuitpython voice channel. Please take the time to add your notes in advance to the document: [link to doc] -- I look forward to everyone's updates!
Google Docs
CircuitPython (Bi-)Weekly Meeting for December 1, 2025 Here is the notes document for next Monday’s CircuitPython Weekly Meeting. It is at the normal time of 11am Pacific / 2pm US Eastern here on Discord. Add your hug reports and status updates to the document before the meeting. If you are una...
Thanks for the tip! I'll definitely take a look
I do see my mic level
https://www.instructables.com/Raspberry-Pi-Pico-W-Binary-Clock-Weather-Monitor/
https://github.com/Guitarman9119/Raspberry-Pi-Pico-/tree/refs/heads/main/Weather Binary Clock
https://youtu.be/hAAY1Tiw1yg
Instructables
Raspberry Pi Pico W - Binary Clock / Weather Monitor: In this project, we’ll build a Binary Clock and Weather Monitor using the Raspberry Pi Pico W. It displays the time in binary using LEDs and also pulls the current weather data from the internet — all powered by a tiny microcontroller!
We’ll build t…
GitHub
Tutorials / Projects and Devlog - Course Related to the Raspberry Pi Pico - Guitarman9119/Raspberry-Pi-Pico-
Get JLCPCB 6-layer PCBs for just $2! Register to get $60 Coupons: https://jlcpcb.com/?from=Nerd
In this video we revisit an old project " The nerdiest clock ever" and improve on it by changing the format of the time being displaying in Binary and the added OLED will allow us to display the weather information.
Website:
https://nerdcave.xyz/...
On boards with sufficient non-volatile memory (like RP2040) it would be great to have two "disk partitions" in CIRCUITPY. One partition would be "readonly" from the microprocessor, but Read/Write from the attached computer. This partition would be used for "boot.py", "code.py" and whatever else the computer needs to control. The second partition would be Read/Write from the microprocessor, but "readonly" from the attached computer. This would allow the microprocessor to create non-volatil...
What host OS are you using? You might be able to eject from there and switch without a restart.
@tulip sleet - please feel free to reach-out if I can test any of the C base airlift stuff
When I get it to a usable state I'll let you and other folks know -- thanks!
So a lot of times you see a pop up when you're about to access something outside control of the primary OS with a confirmation requirement
Thanks all!
Thanks for hosting Liz! Have a great week everyone.
👋
Here is the notes document for next Monday’s CircuitPython Weekly meeting. It is at the normal time of 11am Pacific / 2pm Eastern here on Discord. Everyone is encouraged to attend! Please add your hug reports and status updates even if you’ll be attending the meeting - it’s super helpful! If you are unable to attend but would still like to include updates, feel free to include them in the notes and we’ll read them off during the meeting. Hope to see you there! <@&356864093652516868>
https://docs.google.com/document/d/1_O2owjB7PZ_xTvg7pxIdX81GBGeHt_-u9CGx5fn2IP4/edit?tab=t.0
Google Docs
CircuitPython Weekly Meeting for MONTH DAY, YEAR Here is the notes document for next Monday’s CircuitPython Weekly Meeting. It is at the normal time of 11am Pacific / 2pm US Eastern here on Discord. Add your hug reports and status updates to the document before the meeting. If you are unable to ...
@tulip sleet do you think it is important to support board.I2C() for zephyr? Or could we do board.I2C for most things? () needs a function call where the version without it is the object directly.
the function could just return the singleton so we don't have to change the API
ya, I think that's the best way to do it
I've gotta generate that function I think though
New bitmaptools function to replace all pixels of a given color with a different color.
Most directly I want to use this inside of an "AccentableLabel" class that I am working on that allows certain passages of text within the label to use a different foreground/background color scheme from the rest of the text.
Having this replace_color() function makes that easy and quick because it can blit from the glyph bitmap and then replace the 1s with a different color from the palette af...
Nice addition!
Suggestions:
- Arg name change simplification.
- Validate arg.
- Reuse an existing error message.
- Remove superfluous default args.
This change reuses an existing message, to save space. I'm not sure if you think it's clear enough.
mp_raise_ValueError_varg(MP_ERROR_TEXT("%q out of range"), MP_QSTR_color);
enum {ARG_bitmap, ARG_old_color, ARG_new_color};
Required args don't need a default value. Also change arg name.
The superfluous default args are also present elsewhere in this file, in older code, and could be removed.
{MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
{MP_QSTR_old_color, MP_ARG_REQUIRED | MP_ARG_INT},
{MP_QSTR_new_color, MP_ARG_REQUIRED | MP_ARG_INT},
Validate that the arguments is actually a bitmap.
displayio_bitmap_t *destination = MP_OBJ_TO_PTR(mp_arg_validate_type(args[ARG_bitmap].u_obj, &displayio_bitmap_type_type, MP_QSTR_bitmap))'
//| bitmap: displayio.Bitmap, old_color: int, new_color: int
//| ) -> None:
//| """Replace any pixels of ``old_color`` with ``new_color`` in the ``bitmap``
//|
//| :param displayio.Bitmap bitmap: bitmap that will be change
Thank you! I've made those changes in the latest commit.
I went ahead and removed {.u_obj = MP_OBJ_NULL} from other instances where it was used with required args in this file as well.
@lone axle I suggested removing the default value, and now there are compile errors like:
../../shared-bindings/bitmaptools/__init__.c:188:9: error: missing initializer for field ‘defval’ of ‘mp_arg_t’ {aka ‘const struct _mp_arg_t’} [-Werror=missing-field-initializers]
188 | {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
this is confusing to me because this code is in I2C.c, for example:
static const mp_arg_t allowed_args[] = {
{ MP_QSTR_scl, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_sda, MP_ARG_REQUIRED | MP_ARG_OBJ },
{ MP_QSTR_frequency, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 100000} },
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 255} },
};
The error seems specific to the unix port. I see the same locally attempting to build unix port. However I was able to build esspressif and run it on a MagTag.
I am putting them back for now though.
I just found some that are like this:
static const mp_arg_t allowed_args[] = {
{MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ, {}},
{MP_QSTR_x, MP_ARG_REQUIRED | MP_ARG_INT, {}},
{MP_QSTR_y, MP_ARG_REQUIRED | MP_ARG_INT, {}},
{MP_QSTR_radius, MP_ARG_REQUIRED | MP_ARG_INT, {}},
{MP_QSTR_value, MP_ARG_REQUIRED | MP_ARG_INT, {}},
};
with empty {} as the default value. Maybe that is better than removing it altogether?
it has to do with -Wno-missing-field-initializers, maybe, though I don't see that added for non-unix ports. Still looking.
what version of gcc are you using for the Unix build locally? I think it would just be gcc --version
gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
me too
@lone axle there is no explicit setting or unsetting of missing-field-initializers that would affect this that I can find.
simple test program:
typedef struct {
int a;
int b;
int c;
} s_t;
s_t f(void) {
s_t s = { 1,2 };
return s;
}
gcc -Wall -Wmissing-field-initializers -c init.c
arm-none-eabi-gcc -Wall -Wmissing-field-initializers -c init.c
both produce the error, so it doesn't seem to be the compilers. It may be different versions of the C standard being chosen. At some point C started automatically zero-initializing unspecified fields.
I will spend a little time on this to understand it.
@lone axle this is because of -Wextra, present only on the Unix port compiles, which turns on some extra warnings. Why we have that I don't know, and will investigate further.
The ports/unix build is failing with the missing initializers, e.g.:
../../shared-bindings/bitmaptools/__init__.c:188:9: error: missing initializer for field ‘defval’ of ‘mp_arg_t’ {aka ‘const struct _mp_arg_t’} [-Werror=missing-field-initializers]
188 | {MP_QSTR_dest_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ},
This is because ports/unix compiles with -Wextra, which enables -Wmissing-field-initializers. The other ports do not do -Wextra, though there is mention of ...
(Adding -Wextra to a port build triggers other error'd warnings as well. For instance, on raspberrypi I saw some warnings about the status LED preprocessor macro definition:
311 | #if CIRCUITPY_STATUS_LED
| ^~~~~~~~~~~~~~~~~~~~
../../supervisor/shared/status_leds.c:311:9: warning: this use of "defined" may not be portable [-Wexpansion-to-defined]
)
I added -Wno-missing-field-initializers to the unix port Makefile in the latest commit and confirmed that it does allow it to build successfully locally.
[adafruit/circuitpython] Issue opened: #10733 Regression: program on CP10 runs 3x longer than on CP9
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-12-03; Raspberry Pi Pico W with rp2040
Code/REPL
see below
Behavior
Runtime of programs is three times longer on CP10 than on CP9
Description
When switching my data collection program to CP10 I noticed it runs much slower:
CP9:
[2025-12-02 09:37:40] start: _create_view
[2025-12-02 09:37:49] end: _create_view
[2025-12-02 09:37:55] 0.161 (collect data)
[2025-12-02...
they implement all kinds of special hacks. In this case, they drive the enable-dio pin high very early so you don't have to press the button that long.
Specifically I spent some time with some wiggly IO pins an an oscilloscope instrumenting the MicroPython startup time and upstreamed some improvements - https://github.com/micropython/micropython/pull/9017 - to get the cold boot to first Python time down as far as reasonably possible.
This wasn't fast enough, though, so we also use an earl...
Oh, thanks!
I will definitely look at those!
Hi, can you please help to add this board?
The product is still under development and will be launched soon.
Let me know if there are any issues with it.
Thank you!
Hi, the build is overflowing on one or more languages.
You are freezing a lot of libraries. You could drop some of these:
adafruit_bus_deviceis already included as a C implementation. The frozen version will not be used.adafruit_sdcardis not needed ifsdcardiois enabled.simpleiois not really needed. If you want arange()operation, seeadafruit_simplemath.- You are including non-
displayiodisplay support withadafruit_framebufandadafruit_ssd1306. Is it ...
@lone axle I'll make the release for esp32spi unless you did already
You can go ahead. I haven't
This is a very large program, I think uploading does not make sense. I tried to create a simpler test program, but I was not yet successful. It probably needs at least a SD-card breakout for the mount. Without it, 10.0.3 is still slower, but not a lot.
Does your program write to the SD card as part of the data collection? If you remove that, does the slowness go away? Or if you log to CIRCUITPY (you'll have to remount)?
I'm just trying to figure out what is going on that slows things down. Is it a lot of inherent USB activity from the host, or is it maybe USB activity that is provoked by writing to the SD card in the program?
I am mounting the SD in the beginning during hardware setup. I usually only write once (a single csv-line of collected sensor data). This is the part labeled "save_data". USB-activity is only while printing logs to the console. The lines above are only an excerpt. CIRCUITPY is never mounted during execution, I usually mount-update-umount during deployment. I never access the second device (/dev/sdb for me) from the host side and journalctl tells me it is not polling.
I have an option to log ...
@baldengineer Would you mind testing your board(s) again with 10.0.3? In https://forums.adafruit.com/viewtopic.php?t=221471, a user reports there is no REPL control via serial. Thanks.
You cannot instantiate zephyr_i2c.I2C() because they are fixed by the board's device tree. All busses with status = "okay" are added to board with all of their labels as names. So, I2C() may be the same as I2C1() and ARDUINO_I2C().
Part of #9903.
@tulip sleet It'll be a day or two before I can test.
thanks in any case
@slender iron I've been tentatively considering improving the implementation coverage for hashlib.sha1 (e.g. already implemented for esp32s3 but not nrf52840) as part of a TOTP token project. It would also be kinda nice to have hashlib.sha256. To get this working on nrf52480 (no existing mbedTLS), I'm thinking it might make sense to use the relevant implementations from a lightweight embedded crypto library (perhaps BearSSL). If I went that far, I wonder if it would make sense to consider doing it in a way that would help with the crypto primitives you need for CircuitMatter (sha1, sha225, ecdsa NIST256p, ecdsa ECDH, AESCCM, etc.). Do you have any plans for how you want to add the crypto stuff for running CircuitMatter on non-unix ports?
Look at what Zephyr uses
The nordic port will be moving more towards zephyr
though esp will switch later
so is your plan basically to move everything to Zephyr? I've been thinking about a relatively near-term thing. Like, I've got a project working now on a CLUE board with a pure python sha1 implementation, but it takes about 2 seconds to do a sha1.
I expect nordic to be one of the first ports to move
I've got another thing that does hmac-sha1 on esp32s3 (c for sha1, python for hmac), and that's so fast already that it's not worth my trouble to mess with
since I'm doing support for the newer chips with zephyr
hmm... okay, so my takeaway from that is that adding a BearSSL dependency would be somewhat at odds with what you have in mind, so probably not a great option then.
ok. thanks. I'll see what I can find in the zephyr source.
seems like maybe they use PSA Crypto which is backed by mbedTLS and potentially soc-specific hardware accelerator stuff
there's also some mention of TinyCrypt and kconfig/cmake-configurable crypto backends, but I think that may be older and the new thing is to try to do stuff with the PSA api
Some more insights:
- I seem to have problems with math. CP10 runs 4x longer, not 3x
- To slow down the program, it is sufficient that I mount the SD. I don't have to write anything.
- The USB-connection to the host is necessary. If I run disconnected, powered from a battery and log to the SD instead of the console, I don't see the slow down
- CP10 is still 20-30% slower in this case, but not 400%
This was tested with the current state of the main-branch with no additional tweaks.
Well,
I implemented the pimoroni patches and I switched from storage to nvram for my save progress function, and it works great now, it boots very fast! I now have a very usable tiny ebook reader!
I now think the save issues I was having were my fault, but regardless, it's simpler with the nvram implementation.
I put everything here for those interested : https://github.com/stanelie/badger2040-ebook-reader/tree/main/circuitpython_version
Thanks everyone! Your help was invaluable!
Hi all,
We made an expander board for the Pico 2W, The Pico 2W is soldered on the board, and it has some peripherals permanently connected to the board so it made sense to make a custom board file for it.
It is part of a bigger project to learn the Industrial Design students at the Technical University of Delft to program, more info here: https://id-studiolab.github.io/Connected-Interaction-Kit/test/components/
I built the board, copied the UF2 file, tested the functionality, and all se...
Hi all,
I already did a PR for the general CircuitPython, but also started adding the files for the circuitpython.org download section to support the Studiolab PicoExpander
Here is the PR for the general CP repo: https://github.com/adafruit/circuitpython/pull/10737
Thanks for sharing your code. I will see if this could be somehow integrated into CP in a way that it has a chance to be merged.
I'm removing the board definition files to simplify the PR. I'm thinking that there isn't much interest in adding this capability so I should probably delete this so it's not cluttering up the PR list.
I'll give it another week or so and if there still isn't any interest I'll go ahead and close it.
Hey All, just looking for a reply to my earlier post: https://discordapp.com/channels/327254708534116352/327298996332658690/1444198746488307742 Thanks!
I spent some time today trying to get the display going with no luck. My WIP code.py is here: https://gist.github.com/tannewt/164947bdb0675a79f517a13b6d92a061
#10736 fixes the USB so that CIRCUITPY appears now.
yes, follow the guide for building
TY, and I will do that!
From what I can tell looking at circuitpython/lib/, the current mbedtls submodule reference appears to be a commit from Mbedtls 2.28.3rc0, authored on March 24, 2023. The current Mbedtls release is 4.0.0.
Context:
- Zephyr uses the Zephyr Project's fork of Mbedtls. Zephyr 4.3 uses [commit c5b06d8](https://github.com/zephyrproject-rtos/zephyr/blob/...
I uploaded a bunch of artificial tests to https://github.com/bablokb/circuitpython-examples/tree/master/perf. These tests are random choices from tests/basics and tests/perf_bench. To test, you need a SD-breakout and you have to update the pins in main.py.
For products released after Oct 14, 2025, the LCD/Touchscreen drive IC have been replaced with ST7123. Current configuration may not work on this version. We`ll improve the driver support in ESPHome as soon as possible.
I also ran the artificial tests on an Itsy-Bitsy-M4-Express. Th results are very similar to the Pico-W. Again using 9.2.9 vs. 10.1.0-beta.1.
Hi, this looks fine overall. I've made some naming change suggestions.
add your manufacturer name here, like "Studiolab Pico Expander" or however you capitalize and space it ("Studio Lab", "studiolab", etc.)
In the pin list below, group pin aliases together, with blank lines in between, so it's easy to see which pins have which multiple names. You did this with some pins toward the end of the list. Put the preferred name first: that is the name that will be listed by dir(board). E.g.:
(I don't know which name you want to be the primary name: your choice.)
[blank line]
{ MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO4) },
{ MP_ROM_QSTR(MP_QSTR_GP4), MP_ROM_PTR(&pin_GPIO4) },
{ MP_RO...
There is also a question of what version ESP-IDF is using (they probably have a fork).
It would make sense just to use Zephyr's version of Mbedtls when we switch a port to zephyr. I would think we are already using Zephyr's version in the zephyr-cp, but I didn't look. Given the long-term goal of moving to Zephyr, if it's a big job to update Mbedtls, I'm not sure it's worth the effort. Are there additions or changes in the crypto APIs?
The PSA Crypto API that Zephyr uses is an abstraction layer that's available as part of mbedtls alongside the traditional lower level mbedtls API. The current Mbedtls submodule includes PSA Crypto, but I'm not sure to what extent, if any, that version of the API differs from the one in Mbedtls 3.6.5 that Zephyr 4.3 uses.
PSA is a bit more of a batteries-included thing with higher level APIs and maybe fewer sharp edges. Using PSA is a bit more complicated (need to call psa_crypto_init() at...
One possible benefit of updating the submodule now is that it might make it easier to begin using the PSA Crypto API to implement compatible modules for the hashlib, ecdsa, and cryptography.hazmat.primitives.ciphers.aead stuff needed by CircuitMatter. But, if it's the case that the only boards with CircuitMatter compatible radios will be running Zephyr anyway, maybe that's not useful.
@tulip sleet how's the esp32spi native work going?
SPI communication is working (can retrieve version, etc.). I just converted over the scanning code. Getting that to compile now.
it's still the case this code is going to about 10kB or so, and will not fit on SAMD51x19 without us trimming something else out. I am thinking we should write a Python wifi/socketpool/ssl wrapper to substitute for adafruit_esp32spi for such boards
fits fine of course on PyPortal with SAMD51J20
phone call...
what has the SAMD51x19 and a coprocessor?
metro m4 airlift lite + anyone who uses an AirLift co-processor board like a FeatherWing etc.
we don't HAVE to write this library, but if we do, then it's a largely uniform experience across all the boards, and we drop adafruit_esp32spi in the long run
only diff from regular native import wifi is that you have to specify the pins if needed
so I have an extra airlift_init() routine for that.
(on hold on the phone at the moment)
we can see where we're at once the native is done
I think the external airlift board is going to be diminishing returns
the size is essentially the same if I were to do native adafruit_esp32spi, so that seemed like kind of a waste of time, since it doesn't add an value really (speed is not an issue), and would only fit on pyportal and similar
we already discussed that
right
I'd also like to talk to you about BLE HID seeming to conflict with workflow issues and also maybe bablokb's notes about slower 10.x.x performance when using SD cards
could do video now; phone call done
I'm around all day except lunchtime
now ok?
yup
For products released after Oct 14, 2025, the LCD/Touchscreen drive IC have been replaced with
ST7123. Which version are you using to run the tests? I have the old one (the first one).
I have the old one as well. Any idea if the ones at Amazon in the US now have the newer one?
I need to get a sniffing setup going for DSI displays. That'll make it easier to match known good code.
The current Mbedtls submodule includes PSA Crypto, but I'm not sure to what extent, if any, that version of the API differs from the one in Mbedtls 3.6.5 that Zephyr 4.3 uses.
I think this is the crux of whether you want to update. If they differ significantly then you may want to update. Even then, you can likely #ifdef the behavior between the two versions instead.
Does the Zephyr port have what you need for your project yet? If so, you can use it instead of the Nordic port.
I'd be interested in merging this. I wouldn't conditionalize on USB_DEVICE and USB_HOST though. Instead, call native USB instance 0 and PIO USB instance 1. Then you can change CIRCUITPY_USB_DEVICE_INSTANCE and CIRCUITPY_USB_HOST_INSTANCE accordingly.
Does the Zephyr port have what you need for your project yet?
From looking in ports/zephyr-cp/boards/nordic, it looks like only nrf5340dk, nrf54l15dk, and nrf7002dk are supported. I'm using ports/nordic/clue_nrf52840_express.
After taking a run at implementing hashlib.sha1 and hashlib.sha256 on the PSA Crypto API, I think using PSA for hashlib is not so good because of the overhead it would impose for boards that don't need TLS. Problem is PSA requires that you initialize a bunch of stuff...
Thanks! Since my repository is based against MicroPython rebasing this is beyond my github skill level so I'm going to close this and start working up a new version based on your suggestion.
CircuitPython version and board name
cp 10.0.3
waveshare esp32-s3 touch lcd-2
Code/REPL
# code.py -- ESP32-S3 Reverse TFT Feather
# Minimal BLE HID keyboard: D0, D1, D2 send A, B, C
import time
import board
import digitalio
import adafruit_ble
from adafruit_ble.advertising.standard import ProvideServicesAdvertisement
from adafruit_ble.services.standard.hid import HIDService
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycod...
The point of this is to:
- Make it possible to use a CLUE board as a TOTP token that supports the SHA1 and SHA256 hash algorithm options for fast updating (pure python hashes take 2+ seconds)
- Add optional SHA256 support to hashlib that can be used by other things that need it (e.g. CircuitMatter)
List of specific changes:
- Implement 'sha256' option for hashlib.new()
- Gate SHA256 stuff behind
#ifdef CIRCUITPY_HASHLIB_SHA256 - Enable hashlib with 'sha1' and 'sha256' for ports...
I ended getting the display working with the code.py working... when the IDF has debug prints. So there is some timing issue in the init sequence. I'll play around with it more on Monday. Something similar could explain why I couldn't get the waveshare bar display going.
Looks good. I did not test on a P4 board.
Thanks! Looks good to me, but did not test.
It's too bad there's so much duplicated code and documentation. If the documentation is largely the same for busio.I2C, I wonder if it should cross-reference that instead of copying it. The shared-binding code of busio.I2C vs zephyr_i2c.I2C also seems to be pretty much identical, or are there subtle differences? I don't see how to get around that except maybe if one macro-ified the the shared-binding source so it could be instantiated sev...
Should these have parens?
//| aliases for a single device. For example, ``board.I2C1()`` and ``board.ARDUINO_I2C()``
Thanks! Looks good to me, but did not test.
It's too bad there's so much duplicated code and documentation. If the documentation is largely the same for busio.I2C, I wonder if it should cross-reference that instead of copying it. The shared-binding code of busio.I2C vs zephyr_i2c.I2C also seems to be pretty much identical, or are there subtle differences? I don't see how to get around that except maybe if one macro-ified the the shared-binding source so it could be instantiated sev...
One possible change in doc.
This might be related to #10733
I was able to implement hashlib SHA1 and SHA256 for CLUE using the old submodule version and the old mbedtls API. It doesn't use PSA, but it works fine for my needs. PR is at:
This issue can be closed as far as I'm concerned.
CircuitPython version and board name
Board: ESP32-S2-DevKitC-1-N8R2
CircuitPython Version: 10.0.3
Code/REPL
Code to Reproduce:
pythonimport board
import busio
import sdcardio
import storage
spi = busio.SPI(board.IO36, MOSI=board.IO35, MISO=board.IO37)
cs = board.IO34
sd = sdcardio.SDCard(spi, cs, baudrate=250000)
print("SDCard initialized successfully") # This works
vfs = storage.VfsFat(sd) # Fails here with OSError: [Errno 19] No such device
storage.m...
I'm an Adafruit customer and CircuitPython user. I'm happy to help test any solutions for this issue. Thank you so much!
Did you update the TinyUF2 bootloader on this board?
Erase the board so you'll get a fresh filesystem.
Thanks for the reply. I did not install TinyUf2 bootloader at all. I thought that was purely to install circuit python using a uf2. I'm happy to do that and erase the file system next time I'm in front of the board / pc. ( I for the most part have been using micropython, but here circuit python appeared to have better support for MP3s and sound overall)
It's fine just to use the .bin, but erase the flash beforehand if you did not already do that. The size of CIRCUITPY is what is expected. There are two firmware partitions - one is for potential OTA update.
I am not sure this has to do with that, though. How are you wiring the SD card breakout? Are you supplying it with 5V or 3.3V to VCC? The breakout does level conversion and expects and delivers 5V logic levels, which the Espressif board will not be happy with.
Still failing on
Adafruit CircuitPython 10.0.3 on 2025-10-17; Adafruit Feather RP2040 USB Host with rp2040
Hi!
Sorry, I forgot to mention earlier. This board will be used with a guidebook that our team is developing. We planning to freeze in all the required libraries so users don’t have to manually add anything into the lib folder. That’s why you see many libraries included here hahah. There are two more libraries I plan to add OPT4048 (which I already added) and PAJ7620.
- I removed the
adafruit_bus_deviceas per your comment - we use the
simpleioIibrary because we use it for buzz...
CIRCUITPY_ULAB = 0 will remove ulab which is quite large, though also useful. You could turn off some display-bus and epaper support, etc. as well.
<@&356864093652516868> We'll be meeting in just over an hour. I'm excited to chat with you all! Notes doc is here: https://docs.google.com/document/d/1_O2owjB7PZ_xTvg7pxIdX81GBGeHt_-u9CGx5fn2IP4/edit?tab=t.0
Google Docs
CircuitPython Weekly Meeting for December 8, 2025 Welcome to the CircuitPython Weekly meeting notes! Feel free to add your Hug Reports and Status Updates before the meeting, alphabetically by your username. During the meeting, we go through them in order. If you can’t make the meeting and would ...
Scott, did you happen to see my hashlib PR?
one thing I wasn't sure about was turning it on for boards other than CLUE. I happen to be using that one at the moment, but it seems potentially relevant for other stuff.
I would say turn it on for everything that enables hashlib and see if it fits.
oh wow, yikes
yes, hashlib shouldn't change shape across ports
so what about enabling the sha256 option?
Like, there was an existing CIRCUITPY_HASHLIB option which I just turned on for CLUE. But, then I also added a CIRCUITPY_HASHLIB_256 and turned that on too.
I don't have the context to discuss this yet. Let's discuss it on the PR
sounds good
Open question: Should this be turned on for other boards/ports? Dan suggested on discord that it might be useful to try turning on the SHA256 option for stuff that already enables hashlib to see if it fits.
It's too bad there's so much duplicated code and documentation. If the documentation is largely the same for
busio.I2C, I wonder if it should cross-reference that instead of copying it. Theshared-bindingcode ofbusio.I2Cvszephyr_i2c.I2Calso seems to be pretty much identical, or are there subtle differences?
I think this is a bit of a trade off with having a shared central doc file versus having it in shared bindings. Having it next to the shared-bindings means that it needs ...
Open question: Should this be turned on for other boards/ports? Dan suggested on discord that it might be useful to try turning on the SHA256 option for stuff that already enables hashlib to see if it fits.
Go ahead and try it. Just set CIRCUITPY_HASHLIB_SHA256 = $(CIRCUITPY_HASHLIB) in circuitpy_mpconfig.mk, I think, and re-run the PR. If it doesn't fit we'll see failures. That's how we check in general.
It's fine to merge this now. We can think about how to share documentation (maybe there's a Sphinx feature?? or maybe used #include and how to share C code. C code is harder because the function names are different even if everything else is the same.
Just pushed a commit to have the SHA256 option take its default from CIRCUITPY_HASHLIB.
Also tried local builds for a couple more nordic boards (nordic port defaults to hashlib off), and they fit fine:
- clue_nrf52840_express FLASH_FIRMWARE %age Used: 76.93%
- feather_nrf52840_express FLASH_FIRMWARE %age Used: 75.87%
- feather_bluefruit_sense FLASH_FIRMWARE %age Used: 75.49%
Micropython is becoming the number one language for learning and developing code on Microcontrollers - why is this, and what are the main differences? Let's ...
+1 for a settings.toml option to turn off the boot delay. That would save battery for sensors that do a lot of deep sleep.
boot delays are skipped when waking from deep sleep. However if you do the sleep externally it could help.
Thanks everyone 😁
Thanks for hosting Scott. Have a great week everyone 👋
Thanks Scott!
Here is the notes document for next Monday’s CircuitPython Weekly Meeting. It is at the normal time of 11am Pacific / 2pm US Eastern here on Discord. Add your hug reports and status updates to the document before the meeting. If you are unable to attend but would still like to contribute, feel free to add your notes and we’ll read them off during the meeting. Hope to see you there! <@&356864093652516868> https://docs.google.com/document/d/1HoEfxmPuua_fsRhUIkSPLZ6aGZnY1cEgfWfj-oe2_js/edit?usp=sharing
Google Docs
CircuitPython Weekly Meeting for December 15th, 2025 Welcome to the CircuitPython Weekly meeting notes! Feel free to add your Hug Reports and Status Updates before the meeting, alphabetically by your username. During the meeting, we go through them in order. If you can’t make the meeting and wo...
checks passed. I guess SHA256 fits fine then.
Need this still? Looks like it fit everywhere.
One small thing. Looks great otherwise!
I agree maybe just take this out and take out the guards
That's the bit that lets me actually use it on the board I'm implementing this for as the nordic port doesn't turn hashlib on by default. Are you suggesting maybe do a CIRCUITPY_HASHLIB = 1 at the port level for nordic?
Ah, maybe @dhalbert is saying to remove CIRCUITPY_HASHLIB_SHA256 which you also don't need. So, leave CIRCUITPY_HASHLIB here but remove the new _SHA256 define.
Then I would suggest enabling SHA256 on all boards with hashlib and turning on hashlib for Nordic. It would be useful on WiFi boards.
There might be some merit to turning on hashlib for more nordic boards though. For instance, I've got a feather_nrf52840_express sitting around that I might use for making a smaller portable totp token. I don't know what the implications might be to turn it on at the port level as there are lots of nordic boards.
woah... these comments seem to be arriving out of order. Anyhow, what if I make a commit that:
- Turns on CIRCUITPY_HASHLIB = 1 at the nordic port level
- Removes CIRCUITPY_HASHLIB = 1 and CIRCUITPY_HASHLIB_SHA56 = 1 from the CLUE board
Would that be suitable?
Looking at ports/nordic/mpconfigport.mk, I see a comment suggesting that space is tight on nrf52833. What if I just enable hashlib in the ifeq ($(MCU_CHIP),nrf52840) section for the nrf52840 boards?
I just pushed a couple commits to enable hashlib at the port level for nrf52840 boards (not nrf52833 though) and remove the redundant hashlib enable for CLUE.
Ah, maybe @dhalbert is saying to remove CIRCUITPY_HASHLIB_SHA256 which you also don't need. So, leave CIRCUITPY_HASHLIB here but remove the new _SHA256 define.
This is one of the things I was saying. If hashlib is enabled, don't do finegrain choices on the algorithms right now. I think if there's room for SHA1, there'd be room for SHA256.
so, should I remove the ifdef guard for CIRCUITPY_HASHLIB_SHA256?
yes, I think you can just get rid of it, if it fits on the Espressif and Pico W.
There is some minor formatting thing to fix in the doc:
<img width="691" height="230" alt="image" src="https://github.com/user-attachments/assets/575f192b-cb04-462f-b306-e8aedf0e68e4" />
The algorithm is unsupported should not be on the next line like that.
Also maybe now list the algorithms available. That would be a good addition.
Thanks for the pointer. I wasn't sleeping after doing sleep out:
https://github.com/esphome/esphome/blob/3eaa9f164b90a79bc5f7763f10b18c0630cdb6ba/esphome/components/mipi_dsi/mipi_dsi.cpp#L132-L133
Glad to have been able to help.
@tulip sleet Currently working on your requested documentation change. Is there a guide somewhere that describes the normal procedure for building docs locally. Scanned through the Building CircuitPython guide but didn't find any obvious mention of it.
you can make html in the repo root
remove the three spaces before "algorithm":
//| def new(name: str, data: bytes = b"") -> hashlib.Hash:
//| """Returns a Hash object setup for the named algorithm. Raises ValueError when the named
//| algorithm is unsupported.
@dhalbert I've got changes queued up to make the docs look like this:
<img width="685" height="181" alt="proposed-doc-changes" src="https://github.com/user-attachments/assets/18d02d07-2219-4e27-bbe2-7c9e03498162" />
If that looks acceptable, I'll commit and push them.
@tulip sleet here is a small PR waiting for you: https://github.com/adafruit/circuitpython/pull/10719
now Build CI / docs check is failing, but it looks unrelated, probably?
From the build log:
...
zephyr_i2c/__init__.pyi:127: error: Incompatible default for argument "in_end" (default has type "None", argument has type "int") [assignment]
zephyr_i2c/__init__.pyi:127: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True
zephyr_i2c/__init__.pyi:127: note: Use https://github.com/hauntsaninja/no_implicit_optional to automat...
mpconfigport.h can't set a default to override circuitpy_mpconfig.h
So, when using the high speed device we need to set two defines.
Also, fix warning from IDF about selecting UTMI with high speed.
Dan, you've mentioned turning hashlib on for boards that have wifi. From ripgrepping for CIRCUITPY_HASHLIB and CIRCUITPY_WEB_WORKFLOW, cross checked with circuitpython.org included modules lists, it seems the only ports which currently enable hashlib for at least some boards are:
- ports/espressif
- ports/nordic (after this PR)
- ports/raspberrypi
So, that would seem to leave out:
- M4 based PyPortal boards
- M4/M7 AirLift boards
- Various non-rp2/ESP32/nordic Feather boards (potenti...
@samblenny This is fine for now. I mean boards with native wifi. The current ones with hashlib depend on mbedtls. So what you did was add the SHA256 calls. It's consistent.
I am adding wifi/socketpool/ssl for boards that could support AirLift. I don't think I will need hashlib for those boards, because the cryptography is done in the co-processor. Right now PyPortal doesn't need or have hashlib, for instance.
@tannewt https://github.com/adafruit/circuitpython/pull/10740#issuecomme...
OK thanks - btw - I am using 3.3 V for the power.
I erased the flash using TinyUf2 and reinstalled cp using the open installer. Seems like everything went fine.
Tried again...same behaviour I'm afraid.
Pics are never perfect..but I have the sd card lined up w/the pins:
<img width="846" height="466" alt="Image" src="https://github.com/user-attachments/assets/dc32de5d-341c-481b-9fc7-50531f7d96d2" />
and tought to get a great angle but I am plugging in in the right area :) : (34,35,36,37)
<im...
Hi @dhalbert,
Thanks for your feedback, I have changed the order of the pins. Should all be good now :)
Let me know if anythings else should be changed.
Hi Dan,
I kept getting an error in the actions, i have updated my branch with origin/main, but I still end up getting this error:
`touch circuitpython-stubs/board/init.py
touch circuitpython-stubs/board_definitions/init.py
zephyr_i2c/init.pyi:125: error: Incompatible default for argument "out_end" (default has type "None", argument has type "int") [assignment]
zephyr_i2c/init.pyi:125: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to...
The doc build error you are seeing was due to another PR -- we'll fix that! It's unrelated to your PR at all.
Looks great! Thanks for doing my somewhat pedantic request about the pin order.
We'll ignore the docs build error for now.
Next step is to add the board to circuitpython.org: https://learn.adafruit.com/how-to-add-a-new-board-to-the-circuitpython-org-website
Hi Dan, amazing to see it merged :D
I already prepped everything in the repo and made a PR:
https://github.com/adafruit/circuitpython-org/pull/1713
@makermelissa This board is now merged into CircuitPython.
I went to test the latest version of Display Text and start updating guides that use the old more specific Label classes and realized that some projects are for devices with it frozen in so they don't have access to the newest version unless the user puts the library in root.
I will plan on waiting until the next release that includes the frozen lib updates before making those changes to the learn projects that way the normal library procedure will continue to work as expected.
I think I am seeing the same issue with a Adafruit gamepad plugged into a Fruit Jam. The device.read(0x81, buf) call in the demo code takes about .07 seconds to complete, which is too slow for a game running at 20 frames a second (.05 sec per frame). I am wondering if Sam Blenny's code in the Adafruit Playground for "Fruit Jam Gamepad Tester"/"Fruit Jam Two Gamepad Demo" is a work-around or has the same issue.
@tannewt #10740 (comment) looks like some kind of type annotation nit in
zephyr_i2c.
Fixed in #10746
Looks good! I've fixed the docs issue in a separate PR.
@tulip sleet when you are around, can we talk about supporting two different SPI types interenally?
i can talk now
Hi, I've got Circuit Python running an ESP32 WROOM and ESP32 Dev board. If I hook the board's USB port to my Framework 13 laptop port directly it boots and I can open a Putty session on the com port where it shows up and get the REPL. If I plug a hub into the framework port, and then plug the ESP32 into a Hub port, the disk still shows up but attempts to open the serial port hang. This is very repeatable. If I use the Arduino IDE to create a serial port on the USB connector it works both plug...
This works in conjunction with https://github.com/adafruit/web-firmware-installer-js/pull/16, but doesn't depend on it. I added more ESP32 chips that the installer will appear with. I also converted the code to use the bootloaders.json file so that it will be easier to maintain in the future.
CircuitPython version and board name
Board: espressif_esp32s3_devkitc_1_n8r8
Frequency: 240000000
(sysname='ESP32S3', nodename='ESP32S3', release='10.0.3', version='10.0.3 on 2025-10-17', machine='ESP32-S3-DevKitC-1-N8R8 with ESP32S3')
Code/REPL
"""
Minimal test case to reproduce BLE UART write error 261 on ESP32-S3
This script attempts to connect to a BLE UART device and write data.
"""
import time
from adafruit_ble import BLERadio
from adafruit_ble.advert...
The fixed implementation versions of I2C, UART and SPI will live in modules separate from
busiobut act the same way.busiois reserved for dynamic pin construction.
Dan and I just decided not to do this because it complicates other C modules that rely on the standard busio common_hal such as FourWire and SDCard. board will still hold fixed versions but they'll be busio.* objects.
Thanks for attaching. Unfortunately, we don't currently have a document storage system because this is a static website.
using board.DISPLAY.brightness = 0 on a T-Dongle S3 provides full brightness, whilst board.DISPLAY.brightness = 1 provides a dark diaplay
It doesn't appear in the release assets of https://github.com/adafruit/tinyuf2/releases/tag/0.35.0. Perhaps the name is incorrect. It is set on this line: https://github.com/adafruit/circuitpython-org/blob/main/_board/waveshare_esp32_s3_tiny.md?plain=1#L10
Addresses #1674. This updates the ESP32-S2-DevKitC-1-N4R2 in Board and Image names, but the board ID and filename were left alone until this is updated in CircuitPython. I ended up checking all of the DevKits and found a couple others that needed updating.
There are two different boards here:
https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-devkitc-1/index.html
https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-devkitm-1/index.html
So I don't think they are misnamed, but we don't have both
How did this work out? I'm super confused if I should use ampy or thonny or other tools.
@baldengineer Would you mind testing your board(s) again with 10.0.3? In forums.adafruit.com/viewtopic.php?t=221471, a user reports there is no REPL control via serial. Thanks.
Tested with 10.0.3 and I have access to the REPL in serial (and can see it on the OLED.)
I erased Flash before updating from 9.x.x.
<img width="1230" height="411" alt="image" src="https://github.com/user-attachments/assets/3b9a49e3-d819-414f-8d51-0300d2da...
@tkroo I seemed to have missed this post until now. 11ty sounds like and great choice and the code you wrote sounds like a perfect starting point.
I think having some kind of tooltip appear when you hover over the links would work well.
It worked out like I said in the last comment, that it sort of worked with
the battery attached and the firmware stated. I have since abandoned that
board in favor of a usb-c feather.
In terms of software, both worked fine, but thonny is the better way to
go.
It has a feature that you can save in UTF8, which I found to be helpful as
sometimes my files seemed to get corrupted from my rapid development and
rewrites.
On Tue, Dec 9, 2025, 7:54 PM Markos H @.***> wrote:
*...
There are 3 different boards here and these are the reasons for the corrections:
For ESP32-S2-DevKitC-1-N4R2, I did a google search and could not find a DevKitC version.
For ESP32-C6-DevKitM-1-N4, the board ID is correct and I was just correcting the name to match.
For ESP8684-DevKitC-2-N4, it should have been formatted slightly different as ESP8684-DevKitC-02C-N4.
For what it's worth, I'm still against a rewrite of circuitpython.org. I'm still not convinced that we can't fix the hard edges with jekyll in much less time than a rewrite would take. I think a rewrite should be a last resort.
I do understand liquid is somewhat annoying to use, but at the same time, it's currently working in production for our use cases.
If we need to handle board renames, and permalinks, we can opt-in to various plugins as the jekyll ecosystem is fairly massive and we are...
For ESP8684-DevKitC-2-N4, it should have been formatted slightly different as ESP8684-DevKitC-02C-N4.
I agree on the above.
For the ESP32-S2 boards, wow, this is confusing. The CircuitPython builds for ESP32-S2 DevKitC boards cover the boards below. They are virtually identical except for the memory differences.
a. 4MB flash; no PSRAM
b. 4MB flash; 2MB PSRAM
c. 8MB flash; 2MB PSRAM
Here is a list of ESP32-S2-DevKitC-1 boards:
https://docs.espressif.com/projects/esp-dev-kits/en/...
FYI - I just ran into the same issue using an esp32s2_tft board -- Works fine under 10.0.3 but the display stays blank with 10.1.0-beta1
Is there an existing plan or checklist for what should be added to core to enable porting CircuitMatter to boards instead of just Raspberry Pi? I'm thinking of:
- Which boards have the right kind of radio -> what vendor SDKs (ESP-IDF and ???) would be relevant to those boards -> how do those SDKs handle hardware TRNG access -> because PSA Crypto needs a hardware entropy source as part of initialization
- What should the module namespacing look like for providing things that CircuitMatter currently gets from importing ecdsa, cryptography.hazmat.primitives.ciphers.aead, ecdsa.curves, ecdsa.ellipticcurve, etc. Would it make sense to just dump all the relevant stuff in a new psa_crypto module or something? (I am assuming that matching the CPython API of the aforementioned modules would involve adding way too much irrelevant code beyond what CircuitMatter needs)
There is a branch where I was just trying to get it working in CircuitPython: https://github.com/adafruit/CircuitMatter/tree/circuitpython. I think this branch is not up to date: I have some uncommitted changes. I have multiple clones locally and am not sure which is the most up to date.
This was a "just get it working" effort, which made up some substitutes for various third-party modules and included just enough code to get things working. I got a light bulb to blink. There were issues about doing secure-enough key generation. Because of a security flaw in some encryption scheme (I can reconstruct the details but don't have it at the front of my head), it is necessary to run some aspect of key generation like 100k times to make it sufficiently safe. On a CircuitPython board this could take hours. One solution is don't bother to be so secure, and the other is to run the key generation on a faster computer and copy it over.
When I put the CircuitPython part of this work on hold, we were still thinking about how to move forward with zephyr, etc., and what crypto stuff should really be in C, complicated by what kind of hw support there is on which chips for crypto.
it was not urgent and there were other things to do. There were also complications about which of the major Matter-supporting platforms allowed uncertified devices access.
there were not that many Matter devices available. We thought our focus might be more on building Matter-compatible devices rather than controlling Matter-compatible devices
but we didn't know. And the market momentum of Matter was not clear (and still isn't, though IKEA's new product line is a good push).
hmm... I'm kinda interested in it as a potential extension of the LoRa sensor monitoring stuff I've been doing
It is a big somewhat messy thing, not as bad a BLE, but still large.
Like, I cobbled together a system that works fine with my own homebrewed MAC layer and LoRa or ESP-NOW for transport, plus some IRC and web. But, that's all kinda weird and outside the phone ecosystem
Wondering if CircuitMatter with Apple Home app integration or whatever might make for convenient sensor monitoring and control panel stuff
plus automated light controls, etc.
is MQTT a good base for your stuff. Monitoring vs device control (light bulbs, etc.) are kind of two different directions
I think you could do what you want without all the Matter infrastructure.
we have done some Home Assistant stuff
The unifying angle for me is having little notification and status gizmos (that look respectable) scattered around living and work spaces. I'm not worried about data collection. Thinking more about little mini-dashboard/status-light/control panel gizmos
and Adafruit IO and Wippersnapper are all about monitoring
Yeah... I'm inclined more toward locally hosted stuff
Wippersnapper will also do output stuff, not just monitoring
(allergic to subscription plans, etc)
We were targeting wifi for CircuitMatter first
once we have that, we could look at thread
wippersnapper has some offline capability. Might be worth discussing your requirements in #help-with-wippersnapper-and-adafruitio
I don't know of matter over lora. Matter is built on top of ipv6 generally
a local MQTT server might serve well, with some kidn of lora gateway
I think the main project for local control is home assistant
Context for why I mention the stuff above is mainly to motivate the idea that I'm potentially interested in investing a bit of dev time to move the CircuitMatter stuff forward -- at least far enough to see if it would meet my needs. I don't think AIO or Wippersnapper would be a good fit for me.
At the moment I'm more specifically interested in the angle of integrating collected sensor data (which I already have) with home automation stuff (ambient status displays & light controls). I've evaluated Home Assistant, and I don't much like it. Wondering if CircuitMatter would be better.
I can try more testing if you want, but does it make sense for the issue to be present on both the ATMEL and ESP32S2 with TFT?
It only worked with 10.1.0-beta1 on the esp32s2_tft until I pour cycled -- then the TFT remained blank. No issues with 10.0.3
All that is to say, if you had some wishlist issues for stuff you'd like done to support porting CircuitMatter, maybe I could implement some of them
If it's too soon, that's fine too.
I would say Matter and Home Assistant exist at different levels in the functionality stack. Matter has multiple transports and specifies how controllers and devices define themselves and talk to each. I don't know a lot but I see it as similar to BLE service/characteristic/etc. definitions
BLE kinda mixes up the transport level and architeture level.
The angle that intrigues me is that it's got some integration with Apple's ecosystem
Like, if I could tie my sensor system into apple's notification system on my mac and phone, that would be potentially interesting.
same for being able to control lights at my workstation
particularly if I could do it all in a way that didn't have any network dependencies outside my home LAN
I'd be willing to invest some dev time to see if those sorts of things are possible (unless you already know they're obviously not)
There is no reference-y impl of Matter in Python (there is kind of one for JavaScript, if I remember right). Scott was kinda doing that (but he can speak for himself if this is a mischaracterization), tackling both the device/service definition and the basics to get communication working. I then took that and tried to replace the big cryptography libraries with something that would fit in CircuitPython. That's as far as it got.
It is a lot of code, and the next step might be to see how to get the crypto stuff to be more efficient. But right now it is a thin vertical existence proof.
we have no planning docs or anything olike that
for your practical purposes, I'd say look at stuff that's more mature and that has the Apple Notificiation stuff you want (we have some BLE support for that, and maybe there is also stuff in Home Assistant or something you can hang off a local MQTT server)
okay, so looking at if from a slightly different angle... are you relatively sure that a CircuitMatter implementation of some sort is a thing that you want? (sure enough to justify some potentially failed experiments in attempting to get it to work?)
I'm less concerned about having a thing that works now than I am with having a project that would be cool to write about
it's a goal, medium-long term. If Matter died on the vine then it wouldn't be.
okay. that helps
what about plans for the appropriate sort of namespacing for better core crypto support on CircuitPython boards? Like, Matter aside, do you know where you'd like ecdsa stuff to live? Would it be better not to mess with such things until the Zephyr ports are further along?
Basically, I'm wondering if this is the wrong time to pursue this stuff as an active project. Perhaps I should just put it on the list of stuff to keep an eye on for later
I pushed my latest changes; I don't remember exactly what was going on then.
we haven't decided about ecdsa, etc. I was just trying to prune the code enough to get it to fit and just (barely) work.
I think it's premature, yes, and right now we don't have time to do much direction-setting on this. It would be a few months at least, I think.
@tiny peak if you want to experiment with circuitmatter then start on desktop cpython
don't require a bunch of pre-work to get into it
look at the blink.py and cpblink.py examples in main and the circuitpython branch in the repo
@slender iron do you know of a single C call I can make that will do the equivalent of str(some_object), where some_object has a print routine? It looks like I could use an mp_print_t and a vstr, mp_printf() into the vstr mp_print_t and then convert it to a str, but I thought there might be a single call. I can't find one, which seems a bit weird.
I can't think of one off the top of my head either
thanks - I was stymied 🤷
I think mp_printf trick is the way to go
tannewt & danh, thanks for the context on CircuitMatter. Sounds like the thing for me to do is wait and maybe poke at the CPython stuff.
In terms of software, both worked fine, but thonny is the better way to go.
Ah, here's the rub. I need a non-GUI tool so I'll stick with ampy CLI.
For products released after Oct 14, 2025, the LCD/Touchscreen drive IC have been replaced with
ST7123. Which version are you using to run the tests? I have the old one (the first one).
Do you know if the serial number or the outside box can tell the difference? I ordered another but it looks like 250901 is in the serial number. The outside box does mention gt911. I'll likely return it if so.
Did this ever get implemented? I'm using CircuitPython for a control system on an RP Pico platform and I want to use WiFi for reporting data, but not at the expense of holding up the mission critical code from running.
Did you check the label on the back? The screen type is indicated there. In my case, I have a 5" IPS-LCD ILI9881C.
CircuitPython version and board name
Adafruit CircuitPython 10.0.1 on 2025-10-09; Adafruit Feather ESP32S3 4MB Flash 2MB PSRAM with ESP32S3
Code/REPL
mpconfigboard.mk:
CIRCUITPY_BLE_FILE_SERVICE = 0
CIRCUITPY_SERIAL_BLE = 0
Behavior
Circuitpython won't build when disabling BLE_FILE_SERVICE and SERIAL_BLE.
PacketBuffer.c seems to be missing a compilation guard when the build flags are set. It seems like the prototype is removed from the header fil...
@jaunty juniper interesting thing I discovered about NINA-FW while working on AirLift wifi. A few years ago a bunch of low-level socket operations were added, here: https://github.com/arduino/nina-fw/pull/81. It's hard to find any public code that uses this, except maybe for https://github.com/gershnik/BetterWiFiNINA, which didn't know about before a few minutes ago.
Your additions to adfruit_esp32spi didn't assume these (rightly so), and I don't know whether there are any bugs.
We don't use this setup so it'll be up to someone else to fix. Happy to merge any fixes though.
The back of the box has GT911 too. I'm trying to determine it without opening the box so I can return it.
Why do you want to return it?
may try your Python code, converted to C first, or may try the socket ops
the NINA BSD sockets API looks nice, and it has select/poll which could help with async on Airlift
The keypad module doesn't exist on Circuit Playground Express. According to the module support matrix, it is available on the Bluefruit version, and I'm 🤞 hoping that means it would be easy to enable on the CPX.
Also:
- Add enabling modules based on other available modules. (Such as displayio when busio is available.)
- Implement ticks for display refreshes.
- Be more rigorous finding flash and RAM regions. Add tests.
@slender iron may be obvious, but some schemes for doing namespaces in C: https://stackoverflow.com/questions/389827/namespaces-in-c
Oh, I just realized there are more differences, including the upgrade to a Cortex M4 chip. Maybe it’s not as easy as I assumed.
I can make the change if you want to review and merge. What are the steps? I haven't contributed to this codebase before.
Now that we have stdin injection for USB keyboards for e.g. Fruit Jam, is there a world in which we expand that functionality more generically? I'm playing with the Tanmatsu (https://docs.tanmatsu.cloud) right now with an early working CP build, and I've played with the Lilygo T-Deck in the past. Both have built-in keyboards via I2C daughterboards (in the Tanmatsu's case, @indigo wedge's beautiful keeb), and at the moment the most you can do for either is simulate a REPL by grabbing keypresses and running exec etc. on the input on a carriage return.
I think the M5 cardputer also has the stdin key injection. It looks like it's using a matrix instead of I2C board, but I think something similar could be possible to implement for the I2C keyboards. https://github.com/adafruit/circuitpython/blob/main/ports/espressif/module/cardputer_keyboard.c Most of it happens in here. There have been some changes and refactoring to it over time, if you search PRs for cardputer, or check git history you could see the evolution of functionality for that device which could be good place to start from for adding similar support to other devices.
Thanks, great minds - I just started poking around at how the cardputer does it!
What is the device on the other end?
Could you try these known-working examples on two boards?
https://github.com/adafruit/Adafruit_CircuitPython_BLE/blob/main/examples/ble_uart_echo_client.py
https://github.com/adafruit/Adafruit_CircuitPython_BLE/blob/main/examples/ble_uart_echo_test.py
If you have an nRF board try that on one and the other side.
Why do you want to return it? Does it not work with the test firmware?
I already have one with the old screen. I want one with the new screen to test.
So the principal issue I'm running in to is the contention this creates between the I2C bus exposed in REPL and the need for any code that monitors and injects into stdin (a la cardputer and keypad) to also access the I2C bus to do so. I can't find a graceful way to arbitrate between the two (a la try/lock when it's two accesses in contention fully in REPL).
I was about to create a duplicate... and my title would have been: "CardPuter Crash on cardputer_keyboard.KEYBOARD.deinit()"
My piece of code to trigger that is this:
import cardputer_keyboard
#cardputer_keyboard.detach_serial() # <= optional, does not help
cardputer_keyboard.KEYBOARD.deinit() # This crash with CP 10.0.3 and CP 10.1.0-beta.1
Why deinit the keyboard? Because I try to use the CardPuter firmware for the CardPuter ADV.
So the tentative is to free board.KB_A_1 and `boa...
depending on what you plan doing, but you can use m5stamp circuitpython build, it is even somewhat more convenient, because the pin numbers are on the back sticker. the display init code is fairly easy
Hi! I'm trying to get CircuitPython to work as an app, started from a launcher firmware on my ESP32-P4 board. The whole launcher part works and can start CircuitPython as an app without problems 🙂
But... there is one tiny issue: my other firmware expects that the FAT partition uses the wearleveling API provided by ESP-IDF. CircuitPython appears to not use said API and thus overwrites the FAT with wearleveling with its own filesystem on boot. I've solved that for now by patching internal_flash.c to use the inactive OTA slot as the FAT partition.
Instead of this workaround I would like for CircuitPython to be able to mount the FAT with wear leveling. Before I even look into implementing such a thing, what is the stance of the devs here on such a thing and are there things I should know?
The wear-leveling code is not included in the CircuitPython build. The FAT implementation, shared across all ports, is in lib/oofatfs. The lowest-level ESP-IDF actual flash r/w calls are in ports/espressif/supervisor/internal_flash.c. Note that "internal" here is a misnomer, due to how ESP-IDF is structured. Dependin on how the ESP-IDF wear-leveling is structured, that may or may not be the place to add it.
In general, we have essentially no reports of people wearing out flash that might require wear-leveling. But for people who want to do a lot of flash writes, they often end up using an SD card.
MicroPython has switched to using LittleFS in many cases, but it's not available via USB MSC.
What is your higher-level goal here?
Integration with the rest of the ecosystem, CircuitPython is one of the apps a user can run, but for example a NES emulator app could use the same FAT partition to store its roms. Apps on the platform can be of two types: main type is just separate firmware that gets started through some bootloader modifications we made which allow starting firmwares from a special flash partition (based on sprites work for the pocketsprite (can be found here if you're curious: https://github.com/badgeteam/esp32-component-appfs). The second type is ELF applets which get started on top of the launcher firmware and can thus hook into the existing library code the launcher itself uses.
We will eventually want to start CircuitPython with an argument string stored in the LP RAM, this will allow a user to select a Python script from the launcher to start it, as an alternative form of apps for the device. When started without a script filename we want to drop to REPL on the on-device screen and keyboard so that people can play with Python on-the-go.
Best case would be if we can integrate all of this in upstream CircuitPython, which is why we will try to keep as much of the required changes as possible within the confines of the board folder
Another fun challenge is the internal I2C bus, we plan on adding our existing C drivers for the peripherals on said bus to the board folder with Python bindings on top to allow for proper semaphore locking on bus access and such, so that we can have regular interrupt handler tasks in FreeRTOS running.
(And a slightly modified ball demo running as python script)
CircuitPython does a tricky thing, which is that the MBR is not actually written to flash -- it's always the same, so we simulate it. See supervisor/shared/flash.c. This might or might not be one of the problems.
flash_read_blocks()
this might be part of the issue you are seeing, but I'm not sure.
As the inactive-ota-partitinon approach seems to work well enough to allow for at least temporary filesystem retention between system updates a potential solution could also be to just mount the other filesystem in a subfolder, like with SD cards
in the longer run, we are working on a zephyr port to achieve some commonality for a lot of lower level things, like maybe flash management
and definitely BLE and network stacks
i agree that just keeping our filesystem separate is the easiest solution for now
Ah yes, I was about to mention that bit too: as the P4 doesn't have a radio built-in we have to use esp-hosted-mcu and a separate ESP32-C6 via SDIO for network.
since it's your board, you can configure the flash partitions however you want
That esp-hosted stuff has been giving me headaches for a while now, I'm at the point I'm separating out all the low-level SDIO stuff and doing version checks before continuing just to avoid crashing on every single tiny thing
Fair enough 🙂
Then I guess I will go with the mount-in-subfolder approach
I do wonder how difficult it would be to integrate by just mounting with the standard ESP-IDF functions. They do map to the POSIX file calls so without having looked into the custom filesystem stuff of CircuitPython I assume that should just work? 😄
assuming we make a P4 board it may or may not use the ESP-IDF firmware for a C6 co-processor. We also have a variant of NINA-FW which we've used in the past. In the past we talked to the co-processor with the adafruit_esp32spi library. At this very moment I am working on a native-C wifi/socketpool/ssl implementation that uses the NINA-FW protocol underneath. But we are also considering the ESP-IDF co-processor firmware.
The filesystem mounting code is done at the FAT block level. See the sdcardio and sdioio impls, and also adafruit_sdcard. You provide readblocks and writeblocks. The FAT stuff is done with the existing FAT code.
it is not done at the POSIX system call level
though internally there are "protocols" for doing that between different kinds of filesystems (that's how LittleFS vs FAT is supported, for instance).
Oh, that complicates stuff by a lot actually... I assumed it would be the same as MicroPython in just using POSIX calls.. oh well, new challenge 🙂
We don't have LittleFS built in to CircuitPython, but since it comes from MicroPython, there is latent support, though we have removed a bunch of sources.
that is how MicroPython does it too for block filesystems
at the Python level
I am not that familiar with how to support other than FAT, as I haven't had to do it yet.
We're not using LittleFS, but FAT with the Espressif WL library below it
I'm curious, what does the ESP-IDF fat wear leveling API do ? Is it a standard FAT variant ? Does it do stuff on top of a standard FAT partition ? Is such a partition mountable on a PC ?
yeah, does it remap the block addresses?
Ah, seems we can just use wl_read and wl_write API calls to allow the standard FAT library to use the flash as if it doesn't have WL
It stores pending writes in a RAM buffer or a (for the FS itself) empty flash sector (depending on configuration) to lower the amount of erases needed
Just so I'm clear, this is on an esp32c6 or some other daughter board?
P4 would use a C6 as a WiFi co-processor. Could be on the same board or could be separate.
Ah I see, this is for a new board design then?
I thought you meant you were working on a generic new firmware we could use on the C6 on any of these various P4+C6 combo boards
(Tab5, Tanmatsu, Waveshare various, EV)
NINA-FW for the C6 is already done, and is used on the C6 on the Fruit Jam board.
Ahhh, I wonder if we can reuse it
ESP-IDF supplies several co-processor firmware options, in which they do remote API calls to the C6 from the network stack on the P4 (or other Espressif chip).
They don't use NINA-FW: that takes a different approach with the network stack on the co-processor. NINA-FW origin is much older: from Arduino WiFi shields
https://developer.espressif.com/blog/2025/09/esp-wifi-remote/ is some info from Espressif about co-processor support
they have multiple ways
I already have one with the old screen. I want one with the new screen to test.
Maybe this could help: https://github.com/esphome/esphome/pull/12074
Yes indeed, but in this instance we have CP up and running happily on a P4 too
We have not tried the non-NINA-FW C6 options from ESP-IDF, but we will at some point. If your board has a C6, you could load the latest NINA-FW and use adafruit_esp32spi now, and when I finish the wifi/socketpool/ssl impl, that will be available with NINA-FW as well.
are you on the same project with Renze or different?
Update: I got an ESP32-S3-DevKitC-1-N8R8 and that works well - after some massaging - I needed to use an external power for the sd card...and a few 100 uF caps - I have notes here https://github.com/jouellnyc/esp32_MAX98357A
TL;DR
- I did the same setup with an Adafruit Metro ESP32-S3
- That worked flawlessly using it's internal sd and did not need any 100 uF capacitors.
- I leaned on Claude Ai extensively as the sd card + amplifier took lots of troubleshooting to get right.
At least I h...
My nRF board doesn't want to work with the new thonny at all, it keeps resetting, it barely works in thonny 3.2.6
on the other side is ESP32 TTGO LoRa running MeshCore Firmware. I can't even communicate with USB-HOST, I also found out that there is no bluetooth support at all on PICO W
]0;🐍192.168.1.103 | BLE:Reconnecting | REPL | 10.0.3\
Adafruit CircuitPython 10.0.3 on 2025-10-17; ESP32-S3-DevKitC-1-N8R8 with ESP32S3
%Run -c $EDITOR_CONTENT
disconnected, scanning
connected
echo
Tra...
@jouellnyc Glad you got it working. I'd suggest finding a different SD card breakout that doesn't have level shifters, which might be degrading the signals. If they are designed correctly that should not be a problem. So a better quality one might work better too.
We have a no-level-shift breakout: https://www.adafruit.com/product/4682
This fix makes it possible to disable BLE file services and remove the flashing blue light start-up sequence. That speeds up the overall start up procedure significantly for users who don't use these services.
It works well in combination with "CIRCUITPY_SKIP_SAFE_MODE_WAIT = 0" to remove both the flashing yellow and flashing blue start up sequences.
mpconfigboard.mk:
CIRCUITPY_BLE_FILE_SERVICE = 0
CIRCUITPY_SERIAL_BLE = 0
Fixed issues:
-Conditional compilation of prototype in hea...
Thanks!
I added this as I though it could be a helpful feature for others who don't use the BLE file services and wants to speed up the board startup sequence by removing the flashing blue and flashing yellow led delay.
It works great together with CIRCUITPY_SKIP_SAFE_MODE_WAIT = 0.
I tested it with flags enabled and disabled.
Pull request:
https://github.com/adafruit/circuitpython/pull/10753
Hope I did it right, I tried to follow the guide and all the instructions.
This fix makes it possible to disable BLE file services and remove the flashing blue light start-up sequence. That speeds up the overall start up procedure significantly for users who don't use these services.
It works well in combination with "CIRCUITPY_SKIP_SAFE_MODE_WAIT = 0" to remove both the flashing yellow and flashing blue start up sequences.
mpconfigboard.mk:
CIRCUITPY_BLE_FILE_SERVICE = 0
CIRCUITPY_SERIAL_BLE = 0
Fixed issues:
-Conditional compilation of prototype in hea...
@urban silo We'd merge a PR to add the ability to read and write via wear leveling as long as it is behind a flag so boards can opt in.
We already have a way to set which python file to run next too.
<@&356864093652516868> the weekly meeting will occur here on discord about 30 minutes from now at 2pm Eastern / 11am Pacific. Add you hug reports and notes to the doc here if you wish to participate https://docs.google.com/document/d/1HoEfxmPuua_fsRhUIkSPLZ6aGZnY1cEgfWfj-oe2_js/edit?usp=sharing. We look forward to seeing folks there.
This is video 66 on embedded solutions. In this video, we learn to improve our LVGL widgets. We start with one of our simple test programs and enhance its widgets with images and styles. The result is a colorful display that is also functional. Our Test Rig is an ESP32-S3-N16R8 USB Board wired to an integrated ILI9341 display and xpt2046 touchs...
This fix makes it possible to disable BLE file and serial services, to remove the flashing blue light start-up sequence. That speeds up the overall start up procedure significantly for users who don't use these services.
It works well in combination with "CIRCUITPY_SKIP_SAFE_MODE_WAIT = 0" to remove both the flashing yellow and flashing blue start up sequences.
I tested the fix with the build flags both enabled and disabled.
mpconfigboard.mk:
CIRCUITPY_BLE_FILE_SERVICE = 0
CIRCUITPY...
Thanks!
I added this fix as I though it could be a helpful feature for others who don't use the BLE file services and wants to speed up the board startup sequence by removing the flashing blue and flashing yellow led delay.
It works together with CIRCUITPY_SKIP_SAFE_MODE_WAIT = 0 which already works well.
I tested it with flags enabled and disabled.
I created pull request towards the main branch that I just closed, as I realized that 10.0.x seems to be the target now. Here is the new pull...
I don't hear Dan either
Thanks for the meeting!
Thanks everyone, have a great week!
Here is the notes document for next Monday’s CircuitPython Weekly Meeting. It is at the normal time of 11am Pacific / 2pm US Eastern here on Discord. Add your hug reports and status updates to the document before the meeting. If you are unable to attend but would still like to contribute, feel free to add your notes and we’ll read them off during the meeting. Hope to see you there! <@&356864093652516868> https://docs.google.com/document/d/1c7VlX4wGl_jU02L7U-7uzNU-X_5s_TJavYiEm-u4RIw/edit?usp=sharing
Google Docs
CircuitPython Weekly Meeting for December 22, 2025 Welcome to the CircuitPython Weekly meeting notes! Feel free to add your Hug Reports and Status Updates before the meeting, alphabetically by your username. During the meeting, we go through them in order. If you can’t make the meeting and woul...
Tested and working. I believe this was fixed by https://github.com/adafruit/web-firmware-installer-js/pull/11 and https://github.com/adafruit/circuitpython-org/pull/1563.
This is already done. It is part of tools/check-boards.py here: https://github.com/adafruit/circuitpython-org/blob/main/tools/check-boards.py#L17-L29.
In order to make this more granular, we would need to add the data to the boards files. Something like processor. To make it so we don't have to go through over 600 boards, one possibility is we could default it to the family, but override it if there is a more specific processor.
CircuitPython version and board name
ESP32-C3: 10.0.3, 10.1.0-beta.1
Code/REPL
NA: initial installation
Behavior
Symptoms: only serial port found, no disk
[554608.088718] usb 1-5.2: new full-speed USB device number 109 using xhci_hcd
[554608.166223] usb 1-5.2: New USB device found, idVendor=303a, idProduct=1001, bcdDevice= 1.01
[554608.166228] usb 1-5.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[554608.166229] usb 1-5.2: Produc...
@dhalbert here are connected 2 devices to demonstrate both cases. Second - ESP-C3 not recognized as a drive at all (separate issue).
lsusb -vt
/: Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/14p, 480M
ID 1d6b:0002 Linux Foundation 2.0 root hub
|__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/3p, 480M
ID 0bc2:ab44 Seagate RSS LLC Backup Plus Hub
|__ Port 003: Dev 006, If 0, Class=Hub, Driver=hub/3p, 480M
ID 0bc2:ab44 Seagate RSS LLC Back...
The C3 does not have native usb, so this is the expected behavior. See https://docs.circuitpython.org/en/latest/ports/espressif/README.html
This is the main firmware Espressif is focussing on for the ESP32-P4+ESP32-XX as radio combination: https://github.com/espressif/esp-hosted-mcu.
I'd highly recommend circuitpython adds support for that firmware via sdio as it provides much higher data throughput than SPI connection
Same project, Tanmatsu 🙂
Cool! In that case I will add it to my to-do list 🙂
Ah, nice they finally added P4 support, cool!
Keyboard support for ADV can be written in python land, removing this code should free the GPIO from the matrix scanning so that I2C can be used.
This could be a first step to do a cardputer ADV board, a bit downgraded but with display working by default.
Does this disable the keyboard support on the original version?
I bet claude code would do a decent job if we pointed it to the circuitpython source too.
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; Waveshare ESP32-S3-GEEK with ESP32S3
Board ID:waveshare_esp32_s3_geek
Code/REPL
import os
import board
import sdcardio
import storage
sd = sdcardio.SDCard(board.SD_SPI(), board.SD_CS)
vfs = storage.VfsFat(sd)
storage.mount(vfs, "/sd")
print(os.listdir("/sd"))
Behavior
code.py output:
Traceback (most recent call last):
File "code.py", line 8, in
OSError: [Errno 19]...
The code looks OK. What size is the SD card, and is it formatted as FAT? Does the card work on other CircuitPython boards?
The mount() is failing, so sdcardio is finding a card, but there is some issue with the filesystem.
@danh a user has submitted a very helpful PR for the adafruit_rfm9x library. I have tested it and it works fine. I don't think it will add many bytes (if any) to the code -- Is it OK to goahead and merge it? I would then like to implement the chamge for the rfm69 library and the rfm combined libraries if that sounds ok. It should help eliminate some packet loss.
@tulip sleet hmm tried to tag you above, but I must have done something wrong 👆
That sounds fine, but you might not have privs to make a new release?
I used to, but lately, I have just done the merge and let Tim do the release when he gets to it.
go ahead and merge and I'll make a release. Is there an API difference, or is it basically a "bug" fix?
then you don't have to wait to test the new release
No API change -- just an improvement
I think it "does no harm" so I am comfortable with it. -- Go right ahead!
I implment it for rfm69 and rfm in the next day or so.
we really appreciate your work on the RFM libraries!
Thank you! I doubt any users aother than the author will ever know, but it is a good idea.
The code looks OK. What size is the SD card, and is it formatted as FAT? Does the card work on other CircuitPython boards?
The
mount()is failing, sosdcardiois finding a card, but there is some issue with the filesystem.
I tried with 3 Micro SD Cards: 128GB and 64GB exFAT, and a small 8GB card in FAT32 and exFAT.
I don't have a micro SD card small enough for the old FAT format, is that the only supported file system?
I didn't try on other boards, but I have one board that might...
Thanks -- It's nice to keep involved.
32GB is the largest possible. But the 8GB should work with FAT32. I am not sure if exFAT support is enabled.
@anibarro have you tried the Arduino or Micropython demos available at https://www.waveshare.com/wiki/ESP32-S3-GEEK? Could be useful to try to see if the problem is with CircuitPython or not.
Good idea, I'm going to try MicroPython now.
I tried the same code with CircuitPython on this Sunton ESP32-2432S028 board and got the same "OSError: [Errno 19] No such device" error
I cannot make MicroPython work with any of the generic ESP32-S3... there seem to be a custom firmware for MicroPython on this board, but I cannot find it anywhere. On the WIKI they pointed to "...\ESP32-S3-GEEK-Demo\Firmware\MicroPython-bin" inside a demo zip, but there is not such thing u_U
I'll try again tomorrow
@slender iron I've been working on refactoring and switching my "native" USB host PR to using the CIRCUITPY_USB_HOST/DEVICE_INSTANCE parameters rather than inferring the instance from the CIRCUITPY_USB_HOST/DEVICE (enabled) parameters as you had suggested. It's been slow going as I've forgotten how everything held together but I think I'm back to the point where I have to dig into tiny_usb to figure out why the CIRCUITPY startup is sometimes hanging after the Serial console setup message. Before I did that though I wanted to run an issue by you. Since the CIRCUITPY...INSTANCE parameters are defined as macros in header files and ports/raspberrypi/mpconfigport.h defines a value for CIRCUITPY_USB_HOST_INSTANCE, I had to perform an #undef in the board/mpconfigboard.h file before setting the custom value for the board I'm testing. I don't think I've seen this before so I wanted to see if I've made a wrong turn somewhere along the way. I assumed that you hadn't intended for me to convert the header macro parameters to .mk file parameters so they could be more easily redefined by the board files?
I ran into a similar issue recently too
where the port can't set a default value that boards can override
I think we may need to reorder the header includes...
I'd say just change the port value for now
If we're just looking at a short term solution is the #undef an option?
Would setting the USB_HOST_INSTANCE as a port default mess up all the boards that have attached USB A ports wired to pins?
re-reading your response.... when you say just change the port value, did you mean go ahead and change the value using the undef or did you mean change the default value for the port being set in ports/raspberrypi/mpconfigport.h. (I'm thinking you probably meant the undef is fine for now...)
I could finally install MicroPython. With the latest version available of MicroPython (v1.27) and the files on the board's wiki, I get the same error:
Traceback (most recent call last):
File "boot.py", line 23, in <module>
OSError: [Errno 19] ENODEV
The code on boot.py is:
import machine
import sdcard
import uos
# Assign chip select (CS) pin (and start it high)
cs = machine.Pin(34, machine.Pin.OUT)
# Intialize SPI peripheral (start with 1 MHz)
spi = machine.SoftSPI(
...
Try the 8GB card, and make sure it's formatted as FAT32.
When I get those kinds of errors, it's usually the SD card that's at fault.
What did you have in mind for how Claude code could help with this?
Fixes #902 with this little enhancement
Knowing now the 32GB limit, I'm trying with the 8GB card with no luck...
I guess you are both right and I need another card.
I'll buy a 16GB and a 32GB, try again in FAT32 and report 🙏🏻
The SD-cards were the problem! I found an old 16GB SD from Raspberry and it worked with the first example on CircuitPython 😄
Thanks a lot for your help!
The same behavior at SAME54 Xplained Pro board with 10.0.1 and older. Last working Version is 9.2.8.
As IDE I use Thonny and a simple enter of x crashes.
I tried to investigate and compiled V10.0.1 as debugging version. Compiling was done with cflags CFLAGS += -fno-inline -fno-ipa-sra -DNDEBUG and it worked fine.
Further investigation shows only cflag -fno-inline is necessary to work.
Now enter x gives an NameError.
Perhaps this will help the developer to narrow down the error ...
undef is fine. that can actually be committed
I bet claude could add the additional chip metadata to the cp-org files when pointed to the CP board source.
@tulip sleet my zephyr spi PR is waiting for your review.
Ah, sorry! I reviewed a lot of it before you requested a review and then I forgot to go back.
Thank you! @tulip sleet
@tulip sleet Thanks for the merges!
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; Raspberry Pi Pico 2 with rp2350a
Raspberry Pi Pico 2 - https://www.waveshare.com/wiki/RP2350-USB-A
Code/REPL
import usb_host
import board
usb_host.Port(board.GP12, board.GP13)
# SPDX-License-Identifier: Unlicense
import usb.core
from relic_usb_host_descriptor_parser import DeviceDescriptor
for i, device in enumerate(usb.core.find(find_all=True)):
device_descriptor...
Ah, gotcha. I'll need to look into how to have it update multiple files. I've only had it generate snippets of code before.
Can you try a test using a slightly modified version of Adafruit's Host descriptor library and this code snippet?
You'll need to rename any copies of adafruit_usb_host_descriptors.mpy you have in the /lib folder or the root folder of your device and then copy the adafruit_usb_host_descriptors.py from here (use the "download raw file" icon near the top of the code) to the ...
I have done that
and i get
2dc8:3106
Traceback (most recent call last):
File "<stdin>", line 49, in <module>
usb.core.USBError:
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 51, in <module>
NameError: name 'print_exception' isn't defined
line 49 being
print(device.manufacturer, device.product)
this is the same with just the dongle no controller connected or dongle with controller connected
My bad, you need to add from traceback import print_exception near the top of the code snippet.... Sorry :/
happens :)
2dc8:3106
usb.core.USBError:
usb.core.USBError:
not much more to be honest....
weird, the two errors sort of make sense but the snippet should have printed either the found interface or the "was not a gamepad" message (github isn't displaying the indention right but when I copy the code it seems okay)
Maybe I'm hiding too much info, can you try again with this snippet, this one let's it crash on the get_configuration call:
import usb.core
import adafruit_usb_host_descriptors
from traceback import print_exception
for device in usb.core.find(find_all=True):
# print device info
try:
print(f"{device.idVendor:04x}:{device.idProduct:04x}")
except usb.core.USBError as e:
print_exception(e, e, None)
try:
print(device.manufacturer, device.product)
except usb.core.USBError ...
2dc8:3106
usb.core.USBError:
Traceback (most recent call last):
File "<stdin>", line 53, in <module>
File "/lib/adafruit_usb_host_descriptors.py", line 98, in get_configuration_descriptor
File "/lib/adafruit_usb_host_descriptors.py", line 75, in get_descriptor
usb.core.USBError:
this part fails
config_descriptor = adafruit_usb_host_descriptors.get_configuration_descriptor(
device, 0
)
Okay, that's a core call:
device.ctrl_transfer(
_REQ_RCPT_DEVICE | _REQ_TYPE_STANDARD | _DIR_IN,
_REQ_GET_DESCRIPTOR,
wValue,
wIndex,
buf,
)
I don't have any hardware that reproduces the issue but that points to a place to start looking....
Looking into this, it may be possible. We can get a list of releases from https://api.github.com/repos/adafruit/circuitpython/releases. My concern is that the GitHub API limit may be too limiting, but it appears to be 60 per hour per IP Address for unauthenticated (i.e. no token) access, which shouldn't affect most users. If need be, in the future, we could implement OAuth over Javascript, but it complicates the code and likely isn't necessary.
Anyway, once we have the release info, we shoul...
We could enumerate the releases for any particular board by looking at https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin and the board dir, with an S3 API. Or we could add some Javscript there to enumerate them. The file lister right now is already some server-side JavaScript. So I think we could avoid going to GitHub.
Sounds good. I just made the changes you requested.
- Enable full builds
- Two additional NXP boards
Ok, I do like that solution better.
After thinking about this more, I think it is not worth it. The latest stable and development versions are available. Other versions may require different TinyUF2 versions, as has happened recently for 4MB Espressif boards, and we'd have to keep track of which bootloader works for which UF2.
A previous version can be downloaded and installed with the WebSerial tool or esptool. We could point
I could imagine an alternate entry to OPEN INSTALLER that asks for files to be uploaded by the user....
@dhalbert do you know if we have those files stored in a repo or is it something I should just upload directly to S3 (I have access)?
Sounds good, I didn't see your last reply before my last comment. This was a bit of a complicated request. I think linking to the WebSerial Installer seems like a fairly straightforward solution.
If anyone gets a moment I could use a review on: https://github.com/circuitpython/CircuitPython_Library_Screenshot_Maker/pull/33 it's in cp org and can't have the nomal librarians group request review. It updates the screenshot utility to include SVG and HTML project files in the screenshot.
Ok, the problem is definitely in the installer. The problem is because it is getting the URLs from here: https://adafruit-circuit-python.s3.amazonaws.com/esp32_boards.json and ignoring the updated parameter.
The main issue is fixed here: https://github.com/adafruit/web-firmware-installer-js/pull/17
Once that is merged and released, the cloudflare cached file will also need to be invalidated so that it updates here (otherwise it takes a week).
I updated this to use the esptool-js a day after this issue was opened: https://github.com/adafruit/web-firmware-installer-js/pull/11, so it should be fixed since the old code is no longer used.
[adafruit/circuitpython-org] New comment on issue #470: Highlight OSHWA-certified open source boards
Do we have a list of boards that are certified? This may be another good candidate for claude code to mass update the board files.
I like the idea of an exceptions list. For reference, it looks like the correct links for stage and ugame are:
Fixes #1691. I created another data file so that any additional frozen modules with odd links can be easily added.
Thanks!
Re the autogen_board_info.toml files: if we wanted to turn on/off a module for a whole class of boards, would we need to re-do the builds locally for all those boards and recommit? Maybe using cascading toml to provide defaults would make sense in the long run so this extra step doesn't need to be done, like the cascading that mpconfig/mpconfigport/mpconfigboard provide.
Ok, new version of the installer was released, jsdelivr cache was invalidated, and it tested good on the live site.
Thanks for persevering through this. The multitude of extremely similar board anmes is kind of overwhelming.
Re the
autogen_board_info.tomlfiles: if we wanted to turn on/off a module for a whole class of boards, would we need to re-do the builds locally for all those boards and recommit? Maybe using cascading toml to provide defaults would make sense in the long run so this extra step doesn't need to be done, like the cascading that mpconfig/mpconfigport/mpconfigboard provide.
Ya, it is kind of annoying but I added a make all (and make clean-all) to do it in one pass. This info is used i...
[adafruit/circuitpython-org] New comment on issue #470: Highlight OSHWA-certified open source boards
This is the list with an API too: https://certification.oshwa.org/list.html I agree claude would be good at matching them up. Probably non-adafruit ones too.
Claude code in the CLI on your computer is what you want. It can search for files and propose edits.
Oh, that makes sense. Then I just submit a PR after that.
Question on where to file audio issues... In the course of doing a Morse code with sinewave synth thing on Fruit Jam, I've found some fairly annoying audio artifacts. Acoustically, they all happen together with the same reproducer code, but I think there are likely two different things going on:
- Strong clicks on synthio note attack and release: these sound like they have a good chance of relating to the synthio vca envelope or perhaps waveform interpolation calculations
- Aliasing and harmonics that get drastically worse as you decrease the sample rate from 48000 or 44100 down to 22050 or 11025. This sounds to me like there may be a need to adjust the TLV320DAC built in filters to match the sample rate (ensure nothing above nyquist frequency gets sent out the DAC). But, it's also plausible this might relate to synthio waveform interpolation code.
So, should I file a circuitpython issue for the synthio thing and an Adafruit_CircuitPython_TLV320 issue for the sample rate thing? Something else?
I'm also not sure if the attack/release clicks are a general synthio thing or if they are specific to the TLV320. I don't have any other DAC breakouts to compare it to.
are you shutting down the software mixer between waveform events? The mixer should keep running during that time. Not sure about the aliasing
what kind of waveform are you generating?
Reproducer code is here: https://github.com/samblenny/synthio-click-reproducer/blob/main/code.py
Not currently using an audiomixer. Tried that according to todbot's tricks page but it didn't seem to make any audible difference.
I'm doing a variation on todbot's numpy sinewave thing, so the starting phase in particular ought to be pretty good, I'd think.
if you scroll back slightly in the #help-with-circuitpython channel, I posted a couple wav files demonstrating how the clicks sound and how I think the note attacks and releases ought to sound (lowpass filtered with sox).
are you familiar with the terminology of "key clicks" in ham radio CW (Morse)?
there is no ramp-up or down with your sine wave waveform, so it's going to generate energy away from the tone frequency
I've seen that mentioned, but I'm not super up on the details. The thing that bugs me about this is that setting a vca envelope on the synthesizer doesn't seem to reduce the clicking
if you look at the spectrum of your first sample in, say, Audacity, you can see this:
If I set 30 ms attack an release times, I would expect that to substantially reduce the clicking, but that does not seem to be the case.
could you post the .wav from that?
it's bad form in ham radio to have "hard" keying, with abrupt off/on transitions. It makes for a lot of noise outside of the narrow bandwidth of the CW (Morse) waveform
I think the one in the help channel ought to be downloadable? It's pretty similar to what's in the reproducer. I've been working on getting set up with a waveform recorder that I'm reasonably confident won't be applying any filtering, but I'm not there yet. (earlier recording made with macos voice recorder... unsure if it did any processing)
Does this disable the keyboard support on the original version?
Yes it does break the keyboard for the normal Cardputer (v1.0 and v1.1) => definitively not a good solution and it should NOT be approuved.
And so far I had no success using TCA8418 (at least I can talk to it in I2C, but I could get any key input out of it... need to investigate).
I think the best option would be to create a separate Cardputer ADV board and improve over time. This is what we did for the original `C...
Hi!
Thanks again for the suggestion. We’ve disabled several unused modules and adjusted the firmware flash allocation (similar to Pico W / Pico 2 W). The firmware now takes up about 81% of the allocated space.
-
From your experience, are there any issues we should expect when our firmware takes up most of the allocated flash space?
-
We have also added one more newly created frozen library (PAJ7620). Would it be OK if we include this library in the CircuitPython community bundle? ...
Hi, a question and a suggestion.
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
Can you still do https with this turned off? I'm surprised.
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
Try making this -Os instead of -O2. I don't think you'll notice that big a performance difference, and you may be able to add back several modules.
On boards with smaller flash we always use -Os.
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
Ahh.. thanks for pointing this out. I just tried running HTTPS-related code, and as expected it doesn’t work. Ill delete this line CIRCUITPY_SSL_MBEDTLS = 0
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
okay I already change the optimization flag to -0s
I got this when building the uf2:
FLASH_FIRMWARE: 1157344 B 1532 KB 73.77%
I guess I will change the optimization flag to spare more space
Greetings :)
We are preparing for an upcoming release of a new Pico 2 W development board; EDU PICO 2
For now, we use 3D generated images for the board images. These will be updated later with final photos. The product link is also not available yet and will be enabled upon release.
This is prepared early to allow internal testing and to ensure a smooth launch.
Please let us know if any changes are needed. Thanks!
Hi, btw the firmware for this board is located at circuitpython/ports/raspberrypi/boards/cytron_edu_pico_v2_2w, as referenced in this PR: still open btw
Apologies for the difference in naming. We plan to keep with the board id inside this PR; cytron_edu_v2_pico_2w
After some initial tests, I can confirm that the MCLK and DOSR fixes the 16-bit example significantly. The 8-bit example sounds better, but still exhibits the distortion. So, I think the bug related to unsigned 8-bit conversion/scaling isn't affected by these changes.
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
Now that you've changed the optimization, can you turn CIRCUITPY_ULAB and CIRCUITPY_ZLIB back on? These may be useful for your users. You can try this in the PR and just see whether the build fails or not on large translations.
Here's a demonstration using the following code: https://soundcloud.com/re-li-c/11025-khz-bit-test
import audiobusio
import audiocore
import audiomixer
import board
import digitalio
import pwmio
import time
import adafruit_tlv320
rst = digitalio.DigitalInOut(board.PERIPH_RESET)
rst.direction = digitalio.Direction.OUTPUT
rst.value = False
time.sleep(0.1)
rst.value = True
time.sleep(0.05)
i2c = board.I2C()
dac = adafruit_tlv320.TLV320DAC3100(i2c)
mclk_out = pwmio.PWMOut(board.I2S...
do you have copies of test16.wav and test8.wav somewhere?
<@&356864093652516868> Weekly discord meeting is in a little more than 2.5 hours, at 2pm US ET / 11 am US PT. You are welcome to add notes even if you will not be present. https://docs.google.com/document/d/1c7VlX4wGl_jU02L7U-7uzNU-X_5s_TJavYiEm-u4RIw/edit?usp=sharing
I made my own test8.wav (8-bit unsigned 8kHz) and test16.wav (16-bit signed 8kHz) and tried your code. Got similar results with the 8-bit one sounding severely distorted and the 16-bit one sounding reasonably good. Also, it looks like your volume settings are hot enough that a sine wave normalized to -1 dB clips (caused by dac.dac_volume=0).
Unmodified Example Code (clipping)
This is what my loudest 8-bit wave looked like:
<img width="1071" height="658" alt="Image" src="https://github.c...
For the 8-bit stuff, the broadband noise with hamonic spikes extending well past the Nyquist frequency looks very similar to what I was seeing when the PLL settings were wrong (clock frequency mismatch between what was being sent by the RP2350 and what was coming out of the TLV320's internal PLL).
If the problem was strictly a math thing with the 8-bit conversion, I would expect the noise to be limited to below 4 kHz. Since the noise goes clear up to 12+ kHz, it looks a lot like a clock jitt...
Now that I've actually figured out the order the samples play in, what I'm hearing for the 8-bit mclk=True sample sounds really good with very little distortion (considering). Note that I did leave the dac_volume set to -20 dB rather than turning it up to 0 (so there's no clipping).
8-bit mclk=False (broadband clock jitter noise and harmonics)
<img width="1043" height="612" alt="Image" src="https://github.com/user-attachments/assets/44318801-4f29-4fac-a91e-13253f89bc12" />
8-bit mcl...
Also, some of the noise you mentioned hearing might be due to your sample code not turning off the speaker output. It will probably sound better if you do
dac.speaker_output = False
before turning on the headphone output.
For my particular setup, I was using line-level output into an audio interface, which is why I had it fairly hot. I did this to reduce the amount of ground-level noise I was getting. You're welcome to adjust those settings.
As for the test audio, I was using StreetChicken.wav (you can find that here) converted using the ffmpeg scripts listed in the original post.
Here's a modified version...
GitHub
List of Data Science Cheatsheets to rule the world - FavioVazquez/ds-cheatsheets
Gumroad
Brand-new Armv8-A AArch64 Assembly Cheatsheet! Resolution for 2880 x 1800 screens (MacBook) at 150 PPI (6000 x 3750).Free download (you can set price to $0, then download) since it's the first version and I'll probably be tuning it a little more, fix any missed errors, and send it to print before releasing a print version.Enjoy <3
Most people don't know how to use AI the right way.
Here's how you can use AI the right way:
ChatGPT Best Practices:
✅ Use the GRWC prompting framework
✅ Use Custom instructions about how you want your outputs
GPTs:
✅ VideoGPT by Veed: Helps you create AI videos
✅ Consensus: AI-powered research assistance
Prompting framew...
An interactive, accessible and beautiful GPIO Pinout guide for the Raspberry Pi single-board computer.
The original cardputer board definition didn't support the keyboard in the core either, it was added later
Thanks everyone, happy holidays!!!!
Thanks for hosting Dan. Havea great week and happy holidays / new year everyone!
meeting video posting may be delayed for an hour or two
I'd like to take a walk before it gets dark
Exactly my point, cardputer support improved slowly, first keyboard was in python only, then it was added in core (making it usable for REPL).
To me it is the portable equivalent to FruitJam, a CircuitPython computer.
I am almost sure I would not be efficient at trying to add TCA8418 in the firmware.
An LLM will likely be a huge help if you want to point it to the TCA python driver and have it write C for you.
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; Adafruit Feather ESP32-S3 TFT with ESP32S3
Board ID:adafruit_feather_esp32s3_tft
Code/REPL
print("Hello World!")
Behavior
- Set up web workflow in settings.toml
- Connect to board in the browser and enter the File Editor
- Click edit next to code.py
- Click save
- Loading Status is 500 (Internal Server Error)
Description
This should return a status of 200
...
This works as intended with CircuitPython 9.2.9, so this is broken as of version 10.
That's the theory behind getting a Tanmatsu board def going (including keyboard), proper mobile REPL
Here is the notes document for the next CircuitPython Weekly Meeting, on Monday, January 5, 2026. We're skipping a week due to the holidays. It is at the normal time of 11am Pacific / 2pm US Eastern here on Discord. Add your hug reports and status updates to the document before the meeting. If you are unable to attend but would still like to contribute, feel free to add your notes and we’ll read them off during the meeting. Hope to see you there! <@&356864093652516868>
https://docs.google.com/document/d/1XDA3jYN0RWPMOXHo9Wtmsd1KYxSTTbVQ3n7NBdcDr60/edit?usp=sharing
Anyone want to help with pacman on the Adafruit Fruit Jam? I have a port from the Wio version running (with issues I could use help on) https://github.com/TheKitty/pac-fruitjam
GitHub
A Pac-man clone written in CircuitPython for the Adafruit Fruit Jam - TheKitty/pac-fruitjam
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
Hi, I just realize our board is SPI-wired for the sd card reader. So I refreeze the adafruit_sdcard and disable the SDIO.
I already build the uf2 file and got this: FLASH_FIRMWARE: 1251536 B 1532 KB 79.78%
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
Hi, I just realize our board is SPI-wired for the sd card reader. So I refreeze the adafruit_sdcard and disable the SDIO.
sdcardio is for SPI. sdioio is for SDIO. So don't do this; re-enabled sdcardio and remove the frozen library. sdcardio is better than the frozen library.
[adafruit/circuitpython] New review comment on pull request #10734: Add new board: Cytron EDU PICO 2
Ahh...Thanks for the clarification!.. I’ve updated the PR accordingly: re-enabled sdcardio, removed the frozen SD library. Appreciate the guidance.
This looks good to me after the latest round of changes. If you're ready we can merge!
Yes! we are ready to proceed with merge
Before we do, I just wanted to follow up briefly on one earlier question to make sure we’re aligned:
We’ve added one newly created frozen library (PAJ7620). Would it be OK to include this library in the CircuitPython community bundle? I ask because there is already an existing library for this sensor, but due to some disagreements with the maintainer, we decided to develop and maintain our own version.
thanks!
It is fine to add
We’ve added one newly created frozen library (PAJ7620). Would it be OK to include this library in the CircuitPython community bundle? I ask because there is already an existing library for this sensor, but due to some disagreements with the maintainer, we decided to develop and maintain our own version.
This is ok, but I looked at https://github.com/deshipu/circuitpython-paj7620/pull/1, and I think you could still work with the library author. His requests are minor,...
Ohh okay, noted on that. Thank you!
@slender iron Hi Scott! I've built the Zephyr CP for a FRDM-MCXN947 board. I did not find any instructions on how to flash it, so I used the NXP linkserver binary on Windows. It worked; but is there a better way (esp. for use on Linux)?
I took a look at this code and submitted a PR to your repo that speeds up the main game loop. Some of the ghosts behavior still needs some work, they seem to get stuck in corners sometimes. I can try to look into that as well but will probably be after xmas.
I do make BOARD=foo flash and it'll use west to do the flash
which for that will use linkserver by default. The per-board zephyr instructions are pretty good
did anybody created a community bundled library?
at a quick look i did not find anything..
currently my target hardware would be ESP32S3
@potent hound why are you interested in switching?
Well I kinda picked micropython over circuitpython on a coin flip. But now I have a much more robust filesystem setup and reading through the cp docs, I really like how you have all the compatible modules all packed up per-board.
I'd definitely want to get the circuitpy drive working well with it
And you have a Jumperless now so I can ask you how I should structure things in a non-stupid way.
Fair, but when you get it, try it out with Viper IDE, it's pretty sick. And you can probe at the same time
we don't have any examples of CP coexisting with a bunch of other code
we assume that it's usually CP VM driven
though we do have a "background task" system to interleave stuff with VM execution
Does CP have something like pyexec_event_repl_process_char( c );? I just have a service running in my scheduler that dumps chars from the repl endpoint into that.
We may inherit it from MP but I don't know of any uses
I think it can be made to work just fine, a lot of it is just my naming conventions for jumperless-specific calls are dumb because I was just trying to get it to work at all and also barely know how to write python
much of the pwm ish stuff I'd just want to use our standard APIs
I don't know how the other jumperless stuff is structured
Ha yeah, I didn't have the machine module working when I did that but the regular calls like that work now too (see above)
add support for virtual USB-Network interface
- RNDIS
- Ethernet Control Model (ECM)
- Network Control Model (NCM)
sometimes also calledUSB CDC NCM
usage
- the CP device shows as Network card to a host (computer / phone / tablet)
- CP device has build in DHCP server - so host-device gets ip address
now we could experiment with network-based things, without the need of a real LAN or Wifi network...
link collection
- [original adafruit forum topic](https://forums.adafruit.com/...
btw if anyone wants to take a look at the code we're talking about
https://github.com/Architeuthis-Flux/JumperlOS
relevant files are MpRemoteService.cpp (the more recent one where I'm actually using MP's built-in raw repl), Python_Proper.cpp (kind of an abomination where I wrote the repl with syntax highlighting and history myself), and then lib/micropython/ for the port stuff and modules/modjumperless.c
does it only do repl? Or can you have it run python files stored in flash?
Oh yeah it can do that. Weirdly, Viper IDE just sends python code the the repl to get the filesystem contents and create / delete files.
right. that's common with micropython. thonny does it that way too
CP is a bit different because we'll auto-reload code when written over the usb mass storage connection
(have you tried CP on a board?)
Only a couple times, I guess step 1 is to actually try it, ha
make sure you know what you are getting into
🙂
it might make more sense to make a library to control jumperless remotely
then you could do it over ble or web workflows too
i would like to experiment with this thing..
but have the feeling that for my available spare time it is to difficult to get all the different needed things together for me..
currently i have no idea of how i could at least start to include / experiment with this in the circuitpython code-tree...
@tannewt pointed at some possible directions in the forum topic:
- integrate the example
- get this to work as socketpool thing (i think [somehow with this](https://github.com/adafruit/circuitpyt...
and if that works really well, then integrate it into all in one
I'm playing with the controller objects (and adding a keyboard option) and will take a look at refactoring the audio to use the fruitjam library. I've submitted a PR to adafruit_circuitpython_usb_host_descriptors which will allow that library to support gamepads and joysticks. I don't have any usb gamepads to test with and my only Joystick is an old Microsoft force feedback but I'll submit a PR with the updates I come up with and you can have a look 😁
Have you evaluated whether a Raspberry Pi Zero or a Beagle Board with Blinka might be a better fit your USB to DMX bridge idea? IIRC, the PocketBeagle 2 in particular is designed to work well in USB gadget mode, but I think the Pi Zero can do it too. I don't know if Blinka works on the PocketBeagle.
My impression of what you're describing for adding USB virtual network interface support to CircuitPython is that, while it would be really cool, it would probably be a fairly heavy lift. With a ...
Oh lol, I wish I had seen your port first. I worked on this and got it running last night. https://github.com/relic-se/pac-wio/tree/fruit-jam
Make sure to take a look at the usb_host_gamepad library. It's already working pretty well https://github.com/relic-se/CircuitPython_USB_Host_Gamepad
Thanks @fleet hollow @wraith crow for taking a look - I think it'd be great to have PacMan on Fruit Jam too
Any concerns about trademark? I could see revising this into a clone of sorts
It can be called something else. I don't think it uses any code from the original
If I had an SNES to test it would probably be useful but I'm testing with a joystick that the library comes back with as "not recognized". Since PacMan doesn't really use many features of the controller, I think the generic class I added has a chance of working with most analog USB joysticks.
If you could share your findings for that device, I'd be happy to update the library to support it.
I'm not real familiar with your library so I don't know exactly what you need. I also don't know a lot about the Microsoft joystick I'm using. It was getting a 13 byte buffer back from the usb reads and I fed a bunch of them into an AI and it told me how to code up a get_direction method that was compatible with the one Anne had in place for the SNES controller class. I also pulled the first three button states off of the 9th byte. The joystick has a directional hat, throttle and z-axis as well as at least 5 other buttons that I ignored and would probably have to be researched if you really wanted to support it.
Check @bablokb's pin names suggestion above. Close to merging!
[adafruit/circuitpython] Pull request opened: #10764 Update monotonic function docstring for clarity
Clarify the return value of the monotonic function to specify it returns fractional seconds.
looking at cpython's time.monotonic() documentation, one sees in the first line "Return the value (in fractional seconds) of a monotonic clock" -
I would have expected a similar introduction when reading that for circuitpython at https://docs.circuitpython.org/en/latest/shared-bindings/time/
I see there is a fall back that says "For more information, refer to the original CPython documentati...
Thanks! I changed the wording a bit, to remove the emphasis on seconds (because time almost always deals in seconds, and to clarify in the next paragraph. How's that?
Could you share the model of the controller, the output of the USB descriptor test on it (from the library example), and your example code if possible. You can add it as an issue here (https://github.com/relic-se/CircuitPython_USB_Host_Gamepad/issues). I'll do the rest of the work of integrating it. I'd love for that library to support as many devices as possible, but I only have so many at my disposal and many of them operate just slightly differently. Thank you!!
okay as a follow up i have tested now with a different board Waveshare RP2040-Zero and a usb a breakout
I get more successful results
using the code from
https://learn.adafruit.com/adafruit-feather-rp2040-with-usb-type-a-host/usb-host-read-data
with
import board
import usb_host
usb_host.Port(board.GP2, board.GP1)
added
i get this in repl with controller [xinput]
pid 0x2009
vid 0x57e
man Nintendo Co., Ltd.
product Pro Controller
serial E417D8019DF8
config[0]:
value ...
Update: Resolved with additional fixes required ✅
Short version: It's true I got the HiLetgo SD card working with the level shifter using capacitors and 5V external power, but then encountered additional timing and caching issues that required further fixes.
NOTE: I am not an sdcard expert by any stretch. I leaned on claude.ai here. That said it appears to have identified and corrected the problem I had. No claims are made past that :)
The Full Story
- **Initial problem (this...
@anibarro I'd be curious if the sd card that did not work would work using some steps from my issue:
That particular USB device (I have one) can cycle through a few USB descriptors, depending on how you talk to it. It seems to be designed with heuristic detection for which host OS USB stack it's connected to and tries to adapt to that. It can act like different devices are being unplugged and plugged in (Switch Pro, XInput, etc) over the course of several seconds.
I've had good results by using a retry loop where I just sleep for maybe 300 ms or whatever after a USBError exception then call...
that is a good point!
it is really less work to do! (just use ola as basis..)
would be a good fit for this particular project idea.
my first main idea was to use CP as i like it a lot and it is easier to stay at on framework..
(i try to do all hobby project ideas in CP these days ;-) )
and i thought - there is already all this network things in there - could be a very easy thing to add...
main difference of uC and soc boards fo...
2 different:
- Pro Max (super cheapy - Aliexpress) - 16 GB
- Samsung 64 GB EVO Select
I have a script that turns a Pi-0 into gadget mode and creates a network card: https://github.com/bablokb/raspi2go/raw/refs/heads/master/files/usr/local/sbin/raspi2go.sh. This is an old script and things tend to change within the kernel, so I am not sure it still works. The repo also has an install script that creates a suitable systemd-service to run the gadget-mode script at boot.
Regarding cold boot: you can bring down boot-times considerably with only a few tweaks. You can give this a re...
Just want to update, we do make our own version for the sensor library and yes we have different import name
Hi there!
I am currently working on a circuit python project with the cardputer adv! While the screen may work, the keyboard does not. I learned that the keyboard type is the TCA8418RTWR. I was wondering if someone could help add support to it, or make python code to give it support.
Thank you!
#10757 is related, but does not solve your problem.
Issue
I’m using CircuitPython on nRF52840 with RFM9x (LoRa) and an SD card sharing the same SPI bus.
My device behaves like a Class C gateway:
- LoRa is in continuous receive mode (
receive(timeout=0.1)) - Incoming sensor data is queued and logged to an SD card
SD writes frequently fail with:
OSError: [Errno 5] Input/output error
This happens even when:
- Logs are queued in RAM
- SD writes are retried later
spi.try_lock()/spi.unlock()are used
It appears that ...
@dhalbert can you please have a look at my particular issue? Thank you in anticipation.
@muhammadawais92 Please start a new issue. The original issue was fixed long ago. If you can try a second SPI bus (which is available) that will be a good diagnostic.
Just want to update, we do make our own version for the sensor library and yes we have different
importname
OK, that's fine!
Here's a better view - I think - of the issue regarding mounting the HiLetgo sd reader after soft reboot:
- First Run after Hard Reset/Reboot - All Good
>> import test_sd_debug
--- SD Config: Detected adafruit_feather_huzzah32 ---
==================================================
SD Card Cache Bug Test (with safety)
==================================================
Board: adafruit_feather_huzzah32
Config loaded from sd_config.py
[STEP 1] Mounting SD card...
✓ SPI initialized
✓ ...
Thank you @dhalbert i will try it. If the issue presists i will start a new issue.
I do apologize for any confusion. If it's OK perhaps this issue is just for the soft reboot issue - as above.
I cannot reproduce the directory caching issue with the Huzzah, so perhaps we can remove that from this post.
But - at least - I think I have a handle on what's going on :).
Issue
I’m using CircuitPython on nRF52840 with RFM9x (LoRa) and an SD card sharing the same SPI bus, stacked all boards one another.
My device behaves like a Class C gateway:
- LoRa is in continuous receive mode (
receive(timeout=0.1)) - Incoming sensor data is queued and logged to an SD card
- I tried to use separate SPI buses, but it gives the error "SPI in USE."
SD writes frequently fail with:
OSError: [Errno 5] Input/output error
This happens even when:
- Logs ar...
In short there is a TCA8418 (python) library for CP: https://docs.circuitpython.org/projects/tca8418/en/latest/
So if you free the pins (with current firmware they blocked by the keyboard scanning code for the v1 cardputer) to reuse them for I2C... then it should be possible to communicate with the TCA8418 and use it in keyboard scanning mode (see this learn guide for an Adafruit product based on TCA8418: https://learn.adafruit.com/adafruit-tca8418-keypad-matrix-and-gpio-expander-breakout).
...
Not a CircuitPython issue, but a new macOS (Tahoe 26) release is showing compatibility problems with FAT12 that will effect CircuitPython users.
GUI behavior appears regressed: Finder and Disk Utility show zero-byte capacity, incorrect free space, or fail during copy operations on very small FAT volumes.
Pattern matches FAT12 edge cases: Issues disproportionately affect small volumes (often a few MB) typical of CircuitPython and Audio FX boards.
Works on other OSes: The same devices/filesy...
It appears that the LoRa radio accesses SPI so frequently that the SD card never gets a clean window.
This is a wrong assumption. The LoRa radio does not access the SPI-bus. It is the MCU (or to be more specific: your program running on the MCU) that is in charge of the SPI-bus. The program pulls the CS-line of the respective device low when it wants to talk to that device. So while you are busy with the SD-card, the LoRa radio is not into play.
One thing you should know when sharing SPI:...
@bablokb I tried your suggestion for setting CS with pullups, but it still fails. It enters the loop and opens the file, but on "f.write ()", it throws the error.
with open("/sd/waste_controller_logs.csv", "a") as f:
while log_queue:
f.write(log_queue.pop() + "\n")
Error;
[SD ERROR] [Errno 5] Input/output error
I have attached the LoRa RX side of my setup for your review. TX is only nrf42840 with RFM9x, which is working fine. The RX setup is work...
@dhalbert can you provide some suggestions on this? Thank you.
@bablokb I am not sure about the power issues and how to track them because i dont have access to any stuff to confirm it. I just have this hardware stuff with me, its a part of my semester project.
You are powering a lot of stuff from the 3V3-pin of your MCU: LoRa-chip, OLED, Adalogger. Check the datasheet of your NRF on how much peak it provides. And as far as I know, the Adalogger does not have a bypass cap for the SD-slot. So I would still guess it is a power issue. But this is hard to diagnose from far away.
The nRF52840 has three possible SPI buses. You can create another busio.SPI() on different pins, so the Adalogger and the RFM use different buses.
I also think there is a small possibility there is some radio interference to the data lines going to the Adalogger. There is some transmitting going on in the LoRa protocol.
This is a very old issue, but I'm wondering if having the main as a mpy would reduce the time to from power-on to starting the script. It currently takes 8 second to go from power-on to running a tiny main.py which just turns on the LED (on a Adafruit ESP32 Feather V2). This is too long for my purpose. The alternative appears to port my app to compiled Ardunio C++?
True, and a second device on the bus adds capacitance and the signals might deteriorate.
@muhammadawais92 : you could try to lower the bus-speed as well. Ruling out bus-issues by using a second bus is a good first approach.
BTW: I am using the Adafruit LoRa-RFM95x-Bonnet (which also has an OLED-display) together with a Pico-2W and a SD-card socket. The SD-card and the LoRa are on the same bus. So the setup is very similar, even the software boils down to basically the same logic. One differ...
@sharifrazzaque We have some open issues and PR's about this kind of thing, and I am planning to add some options to settings.toml to allow turning off or varying some of these delays.
@sharifrazzaque Removing the wifi credentials from settings.toml is the one single thing that gains you the most time during boot. There are other things to do as well, but this is a really low hanging fruit.
I did not see this problem in early beta releases of macOS 26, and am sorry to hear it is occuring. #8449 and #8918 documented other FAT filesystem issues in previous versions of macOS.
If people see this, please document it well and submit to the macOS Feedback Assistant. If you do so, publish the Feedback number here so other people can refer to that in their own reports.
Thanks @bablokb! This cut my boot time from 8 to 4.5 seconds.
@bablokb I also believe it to be some interference on the port due to added capacitance/radio interference. I am still figuring out the way around, btw, I am using the following NRF. Thanks for your valuable advice.
I have almost got it to work, for a little while at least. For some reason it stopped working and refused to take input, what you have to do is use the m5stamp circutpython system instead so that it can run those pins.
The regulator of that NRF should be ok, it provides 600mA peak and you are far below. But load transients could still be a problem.
You will have to experiment a bit and try to change various things. Please replace adafruit_sdcard with sdcardio. Try to get the second spi-bus working. Change the bus-speed. Maybe change the stacking. Put the radio into sleep-mode before flushing data to the sd-card (not a good idea for productive use, but for testing).
Hi!
I would like to request to change the board id for the board from this PR[ (https://github.com/adafruit/circuitpython/pull/10734#event-21766441190 ). Our team has decided to use the same board ID as the one currently used in the circuitpython-org
Please let me know if there are any concerns with this naming update. Thanks!
I have gotten it to work! After hours of debugging.
here is the code
import time
import board
import busio
import digitalio
import microcontroller
import displayio
import terminalio
from adafruit_display_text import label
# --- 1. DISPLAY SETUP ---
displayio.release_displays()
# Force Backlight On
try:
bl = digitalio.DigitalInOut(microcontroller.pin.GPIO38)
bl.direction = digitalio.Direction.OUTPUT
bl.value = True
except: pass
# SPI Init
spi = busio.SPI(clock=micro...
Thank you all for your help!
I hope this can be used to improve circuit python for everyone! And I am sure this will contribute to the m5 community!
Eventually it would be interesting to try a different SD card breakout, especially one without level shifters like https://www.adafruit.com/product/4682.
<@&356864093652516868> reminder that there is NO meeting today. Meetings will resume next Monday.
Indeed. I have some without level shifters coming in the mail. Will be interesting to see.
@dhalbert - the message This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. is confusing me - did I do something wrong? should I resubmit it
Just a heads up:
-
All of my devices are 'hanging' on mounting the Samsung 64 GB EVO card and reporting it as 32 GB. Odd.
(Maybe is got worse and the device can't handle...) -
But I am now completely past the soft reboot issue with the Huzzah.
Added some warmup time to the mounting procedure and them seemed to help. Frankly not sure if it was that or just the samsung. I remember a few of them using the Samsung ok, but don't recall which... I really did not think I'd be going down...
Looking for some CP debugging feedback.
I have mostly esp32s2/3 chips, JLINK looks like a good choice, but I doesn't seem to support these chips - this article seems to indicate that it does - https://learn.adafruit.com/adafruit-metro-esp32-s2/debugging-with-openocd .
Was looking at the ESP-Prog-2 ($15) from Espressif - any feedback about this choice would be welcome.
Thanks crew.
I don't expect the 64GB card to work. 32GB has been the max. 64GB are SDXC; 32GB are the largest SDHC cards.
@anibarro I'd be curious if the sd cards that did not work for, would work using some steps from my issue:
Hi, thanks for the link! I'll try when I'm back from holidays.
The SD that didn't give the error, was failing when reading an BMP file and reducing the frequency didn't help, so maybe it needs some time to finish the mounting tasks as you mentioned... Let's see!
CircuitPython version and board name
Adafruit CircuitPython 10.0.1 on 2025-10-09; Adafruit Feather nRF52840 Express with nRF52840
Code/REPL
def eval_test(foo):
global loops
bar=1
eval("print('Hello')")
eval('print(f"loops is {loops}")')
# passing a dict for the locals parameter works:
eval('print(f"foo is {foo} bar is {bar}")',
{}, {"foo":foo, "bar": bar})
# Fails with: NameError: name 'bar' isn't defined
#eval('p...
I believe this is a micropython limitation rather than specifically a CircuitPython issue.
% micropython
MicroPython v1.26.1 on 2025-09-11; darwin [Clang 17.0.0] version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>>
paste mode; Ctrl-C to cancel, Ctrl-D to finish
=== def eval_test(foo):
=== global loops
=== bar=1
=== print("foo",foo)
=== eval('print(f"loops is {loops}")')
=== eval('print(f"foo is {foo}")')
===
=== loops=1
=== eval_test(9)
===
foo 9
loops is 1
Trace...
Found this: https://docs.micropython.org/en/latest/genrst/core_language.html#code-running-in-eval-function-doesn-t-have-access-to-local-variables
and an issue someone filed: https://github.com/micropython/micropython/issues/15883
They left the issue open, but it doesn't sound like something that they will want to fix.
To Follow up here....I continued to pursue the original line of trouble shooting. I got the original ESP32-S2-DevKitC working as well as the S3.
Update: Unable to Reproduce Original Issue
After extensive recent testing, I can no longer reproduce the timeout/disappearing files issue originally reported.
The TL;DR is I can use the ESP32-S3-DevKitC as we all as the original ESP32-S2-DevKitC now with this Hiletgo reader and Circuit python. I don't believe it was the 64 gb card the whole...
Thank you for continuing to persevere and try to track down the problem. Not sure if we'll ever figure out what the issue was, but this is a valuable piece of troubleshooting to leave behind.
I'm also on MacOS Tahoe 26.1. I just compared an EP32-S3 TFT on both mac and windows and the FAT volumes (1MB) matched.
@makermelissa Based on two different user reports the issue seemed to be more with graphical utilities.
- finder
- disk utility
The OS seemed to be handling dd command and other CLI utilities better.
Do you see anything strange with Tahoe Finder / Disk Utility GUI?
I didn't.
<img width="265" height="690" alt="Image" src="https://github.com/user-attachments/assets/e4dd2e0a-b3dc-4e31-8b21-f3515b1056c2" />
<img width="994" height="618" alt="Image" src="https://github.com/user-attachments/assets/7a706852-3a93-45f6-bc85-19d591417159" />
<img width="994" height="618" alt="Image" src="https://github.com/user-attachments/assets/fd1611c7-d347-4c72-be8e-e39933d286d7" />
Also
<img width="377" height="802" alt="Image" src="https://github.com/user-attachments/assets/1029df05-6ee2-49bc-84a0-d74a51cb49cc" />
<img width="1114" height="730" alt="Image" src="https://github.com/user-attachments/assets/a5b33088-c93b-4086-8812-4c8d79904246" />
I just tried it specifically with a MatrixPortal M4 and no problems there as well.
Sure. This was one of those things that was time-consuming but really fun along the way! Thank you very much for your support... I'm hoping this is helpful perhaps to someone.
Regarding the RP2350-USB-A specifically, my understanding is that the USB-A port is not properly pulled-down to act as a host.
Various people reported weird issues with only some devices being detected, and hot-plugging just not working. I found the cause last month. Maybe desoldering R13, like I describe in the article, will help @i-am-me0-0.
However, D+ and D- are not pulled-down anyway, which causes other...
Excellent. Upgrading to Tahoe now.
i see i forgot to mention this, but i had found your guide @qsantos and have removed R13 already which did help partly.
however i have ONLY somewhat gotten keyboards working in https://github.com/i-am-me0-0/RP2350-USB-to-USB-converter
but when i tried anything with controllers (i tried more than one) i kept getting errors (mostly usb.core.usberror) and crashes which led to me creating this github issue
@samblenny the code u recommended does not run since it imports feather specific pins, i...
the code u recommended does not run since it imports feather specific pins...
A bunch of those pins are for the Fruit Jam's HSTX DVI display. For example, in the older fruit-jam-gamepad-tester one, look where it does fb = Framebuffer(320, 240, clk_dp=CKP, clk_dn=CKN,.... If you want to use a different board, you can remove the fb = ... stuff along with all the pins it imports from board. It would probably be easiest to just rely on print() to keep track of gamepad status changes an...
Worth trying with boards with smaller filesystems like a Trinket M0, ec.
Upgraded my Macbook Air M2 to Tahoe 26.2 this afternoon. I had been on Sequoia until today.
I tried four different boards. All of which I could upload boot loader, install CircuitPython and modify code on them.
The BOOT drives report weird values relative to the actual flash. The CIRCUITPY values look within reasonable range.
| Board | Boot Drive Size | CircuitPython Size |
|---|---|---|
| Matrix Portal M4 | 8124 KB | ... |
Images automagically compressed by Calibre's image-actions ✨
Compression reduced images by 19.4%, saving 1.1 MB.
| Filename | Before | After | Improvement |
|---|---|---|---|
| assets/images/boards/original/cytron_edu_v2_pico_2w.jpg | 668.9 KB | 272.1 KB | 59.3% |
| assets/images/boards/large/cytron_edu_v2_pico_2w.jpg | 325.2 KB | 130.6 KB | 59.8% |
| assets/images/boards/original/stu... |
And..perhaps finally...I got the 3.3v only sd card reader in the mail today.. (Sorry not an Adafruit one, but a Waveshare). That worked fine with all the major boards (S3/Rp2350/Huzzah) on 3.3v w/o caps. Life is good with this Reader and Circuit Python.
just want to chime in, tinyuf2 (boot drive) is FAT16
The boot drives are fake and don't reflect the size of flash. They are just at least as big as flash.
Same problem here !
I do this:
advertise()
while True:
# Wait for an iOS connection
while not ble.connected:
print("not connected")
time.sleep(1)
# There can be more than one connection; for a keyboard you usually want one.
for connection in ble.connections:
if connection.connected:
print("Connected. paired =", connection.paired, connection)
# Force iOS to actually pair/bond
if not connection.paired:
...
Since we can't reproduce the issues that had come through the forums we can probably close this one.
@i-am-me0-0 I have not tried controllers, but I found another issue with the RP2350-USB-A, which affects me when disconnecting the keyboard: https://qsantos.fr/2026/01/01/the-rp2350-usb-a-cannot-see-devices-disconnect/ . It might cause other issues for other devices, although I have not observed it.
I use ESP_LOG debugging usually. You probably don't need a JLink. The internal USB to serial/jtag is more likely what you want. You'll need to disable CP's use of USB to use it though.
I think it'd be easiest to add this to the Zephyr port since it has CDC NCM support. It also has a bunch of networking integrated that we'll want to integrate for ethernet and wifi support too.
#CircuitPython2026 kick off post: https://blog.adafruit.com/2026/01/02/circuitpython2026-kickoff/
@slender iron still working? have time for a discussion about AirLift heap storage outside VM?
yup!
is there any place where we can see what status the port has?
and as i found somewhere - new boards are done first.. so could take some time for the older ones i can imagine..
is there any place where we can see what status the port has?
There are several places to follow progress at different levels of detail:
- GitHub: You can follow this repository to get notifications for issues and PRs for everything, including Zephyr work. You can also navigate to the issues page and use its search feature to search for "zephyr". From issues, you can also click on the milestones button (next to New Issue) to see what work is planned for which release. You can also check re...
Ran into this because the current default brightness is "off" due to the inversion so you don't see the REPL on startup.
For what it's worth, I can reproduce this 100% of the time with an FX Mini board. Every time I plug it in Finder tells me it has a 17KB capacity. If I use dd to flash it then it allows me to access the full 16MB of the device. I load files on it, they work fine, then as soon as I plug it back in it's back to 17KB again.
@thekevinbrown What size does dd report for the drive? This might be a Finder-only problem.
Exactly which versions of macOS and CircuitPython are you using?
I plugged in an Audio FX Mini 16MB. It looks good from Finder. My setup.
| Item | Value |
|---|---|
| Host OS | macOS Tahoe 26.2 |
| Device | AudioFX Mini (16MB) |
| Adafruit ID | ADA# 2341 |
<img width="266" height="239" alt="Image" src="https://github.com/user...
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2026-01-05; ESP32S3-TOUCH-LCD-2
Code/REPL
cam = espcamera.Camera(
data_pins=[board.CAM_D0, board.CAM_D1, board.CAM_D2, board.CAM_D3,
board.CAM_D4, board.CAM_D5, board.CAM_D6, board.CAM_D7],
external_clock_pin=board.CAM_XCLK,
pixel_clock_pin=board.CAM_PCLK,
vsync_pin=board.CAM_VSYNC,
href_pin=board.CAM_HREF,
pixel_format=espcamera.PixelFormat.RGB565,
...
CircuitPython version and board name
Adafruit CircuitPython 10.0.3 on 2025-10-17; FeatherS3 with ESP32S3
Code/REPL
import rtc
import time
from adafruit_featherwing import tft_featherwing_35
r = rtc.RTC()
r.datetime = time.struct_time((2019, 5, 29, 15, 14, 15, 0, -1, -1))
print("set RTC")
print("pre-init")
fw = tft_featherwing_35.TFTFeatherWing35V2()
print("post-init")
Behavior
Auto-reload is off.
Running in safe mode! Not running saved code....
If you don't do fw = tft_featherwing_35.TFTFeatherWing35V2() does it still go into safe mode?
- Fixes #10770.
framebuffer_count was mistakenly declared as a bool instead of an mp_int_t.
@smolbun could you test this after the builds are finished? Thanks.
I don't think I have it narrowed down as well as I thought. On a freshly flashed device my sample code does not put the device into safe mode, but the behavior returns once I try running my actual library.
I'm going to close this for now until I can come up with a minimal reproduction that works from scratch on a fresh flash. My apologies for the noise.
Yep, working now thanks @dhalbert!
@smolbun reports this fixes the issue: https://github.com/adafruit/circuitpython/issues/10770#issuecomment-3708892411.
I cherry-picked fixes from #10706 to get the macos builds working again.
Just FYI, we are not ignoring this. To summarize, you see the slowdown if the SD card is mounted in code.py and it appears on the host computer as a drive. Is that right?
Is the host computer Linux? Have you tried Windows? I'm trying to figure out if it's something about the low-level USB polling that the host does for the second drive.
Just FYI, we are not ignoring this. To summarize, you see the slowdown if the SD card is mounted in code.py and it appears on the host computer as a drive. Is that right?
Yes. But as noted above, 20-30% slowdown is still visible even without a host computer.
Is the host computer Linux? Have you tried Windows? I'm trying to figure out if it's something about the low-level USB polling that the host does for the second drive.
I only have Linux. The system log claims that it stops polling...
@bablokb I tried the different solutions. Even putting the radio to sleep did not solve the issue. As long as I remove the RFM9x and use adalogger with nrf52840 (just check everything is working fine), the read/write to sd card works normally. Tried sdcardio, changed the bus speed, but nothing worked.
SD write failed, will retry: [Errno 5] Input/output error: /waste_controller_logs.csv
@slender iron I was wrong about necessity of heap usage when talking to NINA-FW. It's possible to do partial SPI reads and writes and build and parse the messages without doing dynamic allocation. I am reworking the code to do that. So there are no VM vs no-VM heap considerations.
<@&356864093652516868> The first community meeting of the year is in just under 20. Here is the notes doc: https://docs.google.com/document/d/1XDA3jYN0RWPMOXHo9Wtmsd1KYxSTTbVQ3n7NBdcDr60/edit?tab=t.0
Google Docs
CircuitPython Weekly Meeting for January 5, 2026 Welcome to the CircuitPython Weekly meeting notes! Feel free to add your Hug Reports and Status Updates before the meeting, alphabetically by your username. During the meeting, we go through them in order. If you can’t make the meeting and would s...
4☺️
3.8
Just finished posting the links to that in socialz
The next newsletter will be in inboxes on January 12th
^^ they've been on show and tell a lot too. the class looks fun. i'd like to take it 🙂
The problem is that at various times an app can't necessarily update all locations so they may have to be out of sync
Happy New Year everyone
👋
Thanks for hosting Scott. Happy new year everyone 
Here is the notes document for next Monday’s CircuitPython Weekly Meeting. It is at the normal time of 11am Pacific / 2pm US Eastern here on Discord. Add your hug reports and status updates to the document before the meeting. If you are unable to attend but would still like to contribute, feel free to add your notes and we’ll read them off during the meeting. Hope to see you there! <@&356864093652516868> https://docs.google.com/document/d/1Kc6iC6-aOjE3SaAg9BfiK8xVNjm9YW0BBSvjk1jHqU8/edit?usp=sharing
Google Docs
CircuitPython Weekly Meeting for January 12th, 2026 Welcome to the CircuitPython Weekly meeting notes! Feel free to add your Hug Reports and Status Updates before the meeting, alphabetically by your username. During the meeting, we go through them in order. If you can’t make the meeting and woul...
is there any place where we can see what status the port has?
There isn't a great single spot. You can check: https://github.com/adafruit/circuitpython/issues?q=is%3Aissue state%3Aopen label%3Azephyr like Sam says. (Though I'm not great at always adding an issue. My branches are here too: https://github.com/tannewt/circuitpython/branches
or are there any easy tasks to support the porting?
I'd love for folks to try it and let me know what they are missing.
and as i found somewher...
@muhammadawais92 Could you try CircuitPython 9.2.9 and see if it makes any difference? The libraries for 9.x and 10.x are currently identical, so you don't need to reinstall the libraries from the 9.x bundle.
I check my m5fire and the circuitpython port files and I found out that my m5fire is really the earliest version that uses a PSRAM of 4MB rather than 8MB... I'm hoping if you can rebuilt a 4MB PSRAM Binary Version......
@muhammadawais92: thinking about possible issues after your extended tests, I would rule out SPI as the source of the problem. Radio interference seems unlikely, since LoRa is at 433MHz and the SPI bus speed is far below of that. Capacitance is also unlikely since you have a short bus due to stacking and as you said you already tried to change the SPI-speed.
So I still recommend that you swap the SD-card. The fact it works fine in one configuration does not imply it will work in a different ...
@muhammadawais92 Could you try CircuitPython 9.2.9 and see if it makes any difference? The libraries for 9.x and 10.x are currently identical, so you don't need to reinstall the libraries from the 9.x bundle.
My current setup that is working uses 9.2.9. I will switch to 10.0.3 and test if this makes a difference. I will post results on Wednesday.
Change for the LILYGO T-Dongle-S3 pen drive board https://lilygo.cc/en-us/products/t-dongle-s3
- This change should enable
board.STEMMA_I2Cand theAPA102status lights. - I intend to test this against the build artifacts that I hope are created from this pull request
This PR was tested
- Download the build artifact
- Flashed to my LILYGO T-Dongle S3
- Verified the status lights per https://learn.adafruit.com/welcome-to-circuitpython/troubleshooting
- Ran the following program to verify
board.STEMMA_I2C()now functions
import time
import adafruit_vl6180x
import board
import busio
# print(dir(board))
# T-Dongle display
display = board.DISPLAY
# disables the repl on the display for our own use
# display.root_group = N...
@dhalbert
@muhammadawais92 Could you try CircuitPython 9.2.9 and see if it makes any difference? The libraries for 9.x and 10.x are currently identical, so you don't need to reinstall the libraries from the 9.x bundle.
I will try this out.
@muhammadawais92 Could you try CircuitPython 9.2.9 and see if it makes any difference? The libraries for 9.x and 10.x are currently identical, so you don't need to reinstall the libraries from the 9.x bundle.
My current setup that is working uses 9.2.9. I will switch to 10.0.3 and test if this makes a difference. I will post results on Wednesday.
Thank you so much. I will wait for that, and meanwhile, will try out your suggestions.
Hi, I have some issues building CircuitPython from source. Is this the right place for that?
yes
I followed the manual on https://learn.adafruit.com/building-circuitpython/build-circuitpython
Which more or less boils down to the following steps:
git clone https://github.com/adafruit/circuitpython.git
cd circuitpython/
make fetch-all-submodules
make -C mpy-cross
cd ports/raspberrypi/
make BOARD=raspberry_pi_pico
But then I get a lot of errors like this one:
In file included from ../../py/mpconfig.h:103,
from <stdin>:29:
./mpconfigport.h:9:10: fatal error: hardware/platform_defs.h: No such file or directory
9 | #include "hardware/platform_defs.h"
And indeed, in ports/raspberrypi/mpconfigport.h is #include "hardware/platform_defs.h"
And in the entire CircuitPython tree is no file by that name.
What am I doing wrong? Did I forget to include something?
did make fetch-all-submodules finish without errors?
you can try running it again
or you can do make fetch-port-submodules in the port's directory
I had already done this, but I've ran both again, and both finish without errors. Is the problem with a submodule?
usually when there are files missing, it's because some submodule failed to be cloned
are you doing this with the main branch?
you could try if you get the same error on a stable branch
I've had a few of those, but I could fix them by removing the git repo and the lib directory, and re-running fetch-all-submodules.
I will try again with the latest release version.
the main branch sometimes gets the exact versions mixed up when there is fresh development with them
I've removed the entire circuitpython tree and started fresh again. And this time it build without errors.
Thanks for your help!
Oh, I had to manually install huffman in order to compile mpy_cross. It was not included in the requirements-dev.txt.
@supple plank what os are you using?
Debian Linux.
Anyone know exactly where the CircuitPython code is for HSTX/DVI?
for a starting point, look for stuff called picodvi. There's more to it than that, but picodvi will give you some threads to pull on.
if you're using linux and have installed ripgrep (sudo apt install ripgrep), and if you've got an active circuitpython repo with the submodules already fetched, you can do:
$ rg picodvi
from a bash prompt and it will give you tons of stuff about what's spread around where in different files.
some of those locations include:
shared-module/displayio/__init__.hports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.hports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.cports/raspberrypi/bindings/picodvi/Framebuffer.cports/raspberrypi/boards/adafruit_fruit_jam/board.c
if you look here:
https://github.com/adafruit/circuitpython/tree/main/ports/raspberrypi
you'll see a submodule reference from the raspberry pi port to the raspberrypi/pico-sdk repo.
If you're logged into GitHub, you can do a text search in the pico-sdk repo (search bar at the top of the github window) for "hstx" to find lots of stuff about code related to hstx:
https://github.com/search?q=repo%3Araspberrypi%2Fpico-sdk hstx&type=code (this link may not work unless you're logged in)
You can also use ripgrep so search the circuitpython repo for "hstx":
$ rg hstx
ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2350.c
36:// This is from: https://github.com/raspberrypi/pico-examples-rp2350/blob/a1/hstx/dvi_out_hstx_encoder/dvi_out_hstx_encoder.c
40:#include "hardware/structs/hstx_ctrl.h"
41:#include "hardware/structs/hstx_fifo.h"
369: uint32_t dma_write_addr = (uint32_t)&hstx_fifo_hw->fifo;
432: hstx_ctrl_hw->expand_tmds =
441: hstx_ctrl_hw->expand_tmds =
450: hstx_ctrl_hw->expand_tmds =
459: hstx_ctrl_hw->expand_tmds =
469: hstx_ctrl_hw->expand_tmds =
493: hstx_ctrl_hw->expand_shift =
501: hstx_ctrl_hw->csr = 0;
502: hstx_ctrl_hw->csr =
532: hstx_ctrl_hw->bit[pins[i]] = lane_data_sel_bits | invert;
@tiny peak Thanks. That should help. Unfortunately I'm currently working in Windows, and I won't have a good Linux system for another couple months, but I'm using MSYS2 and maybe it has ripgrep in its repos. If it doesn't, I'm pretty good with standard grep, and it does have that.
I've seen the HSTX stuff in pico-examples, but it's some form of 8-bit, 640x480 RGB. I've been having a hard time finding HSTX-DVI code for 16-bit 320x240, but I know that's what FruitJamOS is using, so the code for that has to be in there somewhere.
Anyhow, this should help.
many IDEs have some kind of multi-file project search feature. Dunno what MSYS2 is, but I think VS Code has something very much like ripgrep built in, maybe?
Try reading the discussion comments and code diffs mentioned here:
- https://github.com/adafruit/circuitpython/pull/10534 ("fix picodvi refresh rates (use 60Hz)")
- https://github.com/adafruit/circuitpython/issues/10242 ("Metro RP2350 DVI output defaults to 72Hz refresh (capture cards like 60Hz)")
I tested with 10.x and my setup still works, i.e. I have no problems writing the received packets to an SD-card.
MSYS2 is essentially a Linux-like environment for Windows. It has a bash shell, common Linux build tools, GCC and so on. It makes coding in Windows bearable. My typical "IDE" is Vim with a Make based build setup, combined with common Linux command line tools like grep and such. So when Linux isn't an option, I use MSYS2 to give me the programming environment I want to work in.
Anyhow, thanks for the additional references!
Corrected the manufacturer name from 'Studiolab' to 'StudioLab' and added an upgrade section with a link.
In order to support your Fire revisioneI I should create a new M5Stack Fire board in CircuitPython with 4MB of PSRAM. Looking at M5Stack all Fire boards after 04/2020 have 8MB, so your is 5+ years old.
Is not a big deal to create a new CircuitPython Fire board with only a different size of PSRAM but my question to @jepler is if it makes sense to create a new CircuitPython board definition for a board that is no longer in production.
Updated libraries contain some fixes that shook out during display text development, RFM fixes, and recent fix for LIS3DH shake functionality
It is a continuous source of overhead on every build to add a board, and we also have to add it to circuitpython.org. We don't mind adding boards, but if the number of users would be vanishingly small, I personally would prefer not to. I can make a one-off build for you if you would like.
Framebuffer_RP2350.c is what you want
hi everyone, I have been playing with CircuitPython and TinyML for quite some time now. Today I managed to convert a tiny ML model (CNN) to plain C (onnx2c) code and incorporate it directly as a module in CircuitPython. It's not a generic approach, I mean a model will have to be compiled in with circuitpython source code. Will share my findings soon. Its a tiny CNN that takes 30x30x1 images and outputs 10 probabilities (basically handwritten digit recognition). Will post my code to github soon. I think it opens up a way for people to train their own models in pytorch and tensorflow and bring them to circuitpython
Neat! I'm sure we'd make a blog post with a link to your writeup.
Great! How big is the model?
@devout jolt @fleet hollow what should the minimum i2s output buffer time be? aka how big can it be before being unresponsive
(I'm working on zephyr i2s)
in my experience for real-time synths, usually at 22kHz sample rate, a 4kB buffer on audiomixer is about the largest I go before latency becomes frustrating while playing. If doing a music streamer or other less real-time task, particularly if doing Net I/O, I'm sure a larger buffer would be beneficial
is that stereo 16bit?
yes
50 msec I think
(at least it feels like ~50 msec, which is actually too big of a lag for most music gear, but I grade on a curve for CirPy 🙂
kk, I should be able to do better than that
what are the reasons for that buffer? usb writes?
I am using a zephyr thread to fill the buffer 🙂
should probably add a lock
Yep, originally because we noticed any USB activity was causing horrendous audio glitches. (the default buffer is very small, like 256 or something). We also found that other supervisor-pausing tasks like display updates could glitch the audio too. So a 2kb to 4kb buffer became pretty standard. Still didn't help with full-screen redraws of big screen or a blocking network read but it helped
I'd be curious how the zephyr port fairs. USB and network will be separate threads
screen redraws will be in the CP thread which is different from the audio buffer filling
For applications where audio latency isn't as important (ie: games), I sometimes use 8192. Adds a lot of latency, but improves stability.
I'm calculating ~10ms. Here's my math, but my understanding of the way things are divvied up might be off:
1024 bytes / 2 bytes per sample (16-bit) = 512 samples
512 samples / 2 channels = 256 samples per channel
256 samples per channel / 22050 samples per second per channel = 0.0116 seconds = 11.6ms
I'd have to double check, but I think the buffer is split between the channels. Would be interesting to do a latency test with a GPIO pin and probe.