Commit Graph
27309 Commits
Author SHA1 Message Date
J. Nick Koston c2f7fa4009 cleanup 2026-03-10 13:54:10 -10:00
J. Nick Koston bbca87a375 Merge branch 'rp2040-crash-handler' into integration 2026-03-10 13:47:15 -10:00
J. Nick Koston ee12cba23c Use SDK defines SRAM_END and XIP_BASE instead of magic numbers 2026-03-10 13:47:09 -10:00
J. Nick Koston f92f957af0 Narrow broad except to OSError and CalledProcessError 2026-03-10 13:44:43 -10:00
J. Nick Koston e20e8b9761 Merge branch 'rp2040-crash-handler' into integration 2026-03-10 13:40:01 -10:00
J. Nick Koston 7113e41550 Address review feedback: RP2350 compat, noreturn, addr2line hint
- Add #if defined(PICO_RP2350) for SRAM end (520KB vs 264KB) so
  stack scanning works on both RP2040 and RP2350
- Widen flash range check to 4MB for RP2350
- Add __attribute__((noreturn)) to hard_fault_handler_c
- Mark exc_return parameter as unused via /*exc_return*/
- Build addr2line hint line with all addresses (PC, LR, and BT*)
  so users can copy-paste a single command for full decode
2026-03-10 13:38:42 -10:00
J. Nick Koston c017bfc35b Add comment explaining ESP_LOGE over ESP_LOGCONFIG 2026-03-10 13:34:37 -10:00
J. Nick Koston 045bef53fe Merge branch 'rp2040-crash-handler' into integration 2026-03-10 13:32:07 -10:00
J. Nick Koston 3359f541b1 Widen flash range to 2MB for stack scan 2026-03-10 13:31:48 -10:00
J. Nick Koston 20d884a2de Replace #define with static constexpr for clang-tidy 2026-03-10 13:31:24 -10:00
J. Nick Koston fcbbfd8dd9 Merge branch 'rp2040-crash-handler' into integration 2026-03-10 13:29:55 -10:00
J. Nick Koston 192080f6d3 Add references for HardFault handler asm pattern 2026-03-10 13:29:24 -10:00
J. Nick Koston a3aff62e4c Use combined namespace esphome::rp2040 2026-03-10 13:28:58 -10:00
J. Nick Koston 5f56f266b5 [rp2040] Add HardFault crash handler with backtrace
Add a crash handler for RP2040 that captures register state and stack
backtrace when a HardFault occurs, stores it in watchdog scratch
registers (which survive reboot), and logs it on the next boot.

- Override weak isr_hardfault with Cortex-M0+ compatible handler
- Save PC, LR, SP to watchdog scratch registers
- Scan stack for return addresses to provide deeper backtrace
- Log crash data immediately after logger initialization
- Add addr2line auto-decoding in CLI serial log viewer
2026-03-10 13:26:27 -10:00
J. Nick Koston 829448a5c6 Merge remote-tracking branch 'upstream/dev' into integration 2026-03-10 12:33:56 -10:00
Thomas Rupprecht dcbf3c8728 [esp32] gpio type improvements (#14517) 2026-03-10 18:18:35 -04:00
J. Nick Koston 30c8c68703 [socket] Fix RP2040 TCP race condition between lwip callbacks and main loop (#14679) 2026-03-10 11:22:23 -10:00
9513edc468 [dew_point] Add dew_point sensor component (#14441)
Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
2026-03-10 17:17:13 -04:00
J. Nick KostonandClaude Opus 4.6 6356e3def9 [core] Warn on crystal frequency mismatch during serial upload (#14582)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 20:42:38 +00:00
J. Nick Koston 58e65f9355 Merge remote-tracking branch 'upstream/dev' into integration 2026-03-10 10:39:58 -10:00
Jonathan SwobodaandClaude Opus 4.6 8d988723cd [config] Allow !extend/!remove on components without id in schema (#14682)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 16:38:50 -04:00
J. Nick Koston 043290c204 Merge remote-tracking branch 'upstream/dev' into integration
# Conflicts:
#	esphome/__main__.py
#	esphome/core/log.cpp
#	esphome/core/log.h
#	esphome/util.py
#	tests/component_tests/logger/test_logger.py
#	tests/component_tests/logger/test_logger.yaml
#	tests/unit_tests/test_util.py
2026-03-10 10:34:19 -10:00
Kevin AhrendtandJ. Nick Koston 8ca6ee4349 [speaker_source] Add new media player (#14649)
Co-authored-by: J. Nick Koston <nick@home-assistant.io>
2026-03-10 20:25:26 +00:00
mahumpulaandJonathan Swoboda 780e009bf4 [runtime_image] Add support for 8bit BMPs and fix existing issues (#10733)
Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
2026-03-10 16:23:49 -04:00
Jonathan SwobodaandClaude Opus 4.6 04d80cfb75 [esp32_hosted] Bump esp_wifi_remote and esp_hosted versions (#14680)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 15:17:30 -04:00
J. Nick Koston 9404eadaf8 [rp2040_ble] Add BLE component for RP2040/RP2350 (#14603) 2026-03-10 09:12:28 -10:00
J. Nick Koston 4d2ef09a29 [log] Detect early log calls before logger init and optimize hot path (#14538) 2026-03-10 09:12:10 -10:00
J. Nick Koston 89bb5d9e42 [core] Require explicit synchronous= for register_action (#14606) 2026-03-10 09:11:45 -10:00
J. Nick Koston 9dd3ec258c [scheduler] Replace unique_ptr with raw pointers, add leak detection (#14620) 2026-03-10 09:11:28 -10:00
J. Nick Koston c709010c4c [api] Replace std::vector<uint8_t> with APIBuffer to skip zero-fill (#14593) 2026-03-10 09:11:12 -10:00
J. Nick KostonandClaude Opus 4.6 6e468936ec [api] Inline ProtoVarInt::parse fast path and return consumed in struct (#14638)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 09:10:55 -10:00
J. Nick Koston 2c7ef4f758 [rp2040] Use picotool for BOOTSEL upload and improve upload UX (#14483) 2026-03-10 09:10:33 -10:00
Diorcet Yann 06a127f64b [core] ESP-IDF compilation fixes (#14541) 2026-03-10 11:52:48 -04:00
Anunay KulshresthaandClaude fba21e6dd4 [bl0940] Fix reset_calibration() declaration missing from header (#14676)
Co-authored-by: Claude <noreply@anthropic.com>
2026-03-10 10:44:19 -04:00
J. Nick Koston fccfab8083 [socket] Switch UDP rx queue from lock-free SPSC to count-based with LWIP_LOCK
With the lwip lock infrastructure in place from the TCP race fix,
the lock-free SPSC ring buffer's wasted slot is no longer needed.
Switch to a simple rx_count_ approach that uses all 4 queue slots.

Also add LWIP_LOCK() to all UDP methods that call lwip APIs
(bind, close, sendto, setsockopt, getsockopt, recvfrom, factories).
2026-03-10 01:15:57 -10:00
J. Nick KostonandJ. Nick Koston f54756ae2d [socket] Address review comments: doc comments and (void) flags
- Document port_host byte order convention in lwip_ip_to_sockaddr
- Note intentional method hiding in LWIPRawUDPRecvImpl
- Note recvfrom truncation differs from POSIX MSG_TRUNC
- Add (void) flags in sendto to clarify flags are ignored

Co-Authored-By: J. Nick Koston <nick@koston.org>
2026-03-10 01:12:15 -10:00
J. Nick Koston 49ba08cec9 [socket] Add lwip raw UDP socket implementation
Add native UDP support to the lwip raw TCP socket layer used by
ESP8266 and RP2040, eliminating the need for Arduino WiFiUDP fallback.

Two new classes:
- LWIPRawUDPImpl: send-only UDP (8 bytes overhead)
- LWIPRawUDPRecvImpl: send+recv with fixed-size ring buffer (no heap
  allocation in recv callback)

Factory functions: socket_udp(), socket_udp_recv(), socket_ip_udp(),
socket_ip_udp_recv() with UDPSocket/UDPRecvSocket type aliases.

Additive only — no consumer migration in this PR.
2026-03-10 01:12:15 -10:00
J. Nick Koston 4d1e1645dc Merge branch 'fix-rp2040-tcp-race' into integration 2026-03-10 01:08:22 -10:00
J. Nick Koston 81d12fd14a [socket] Hold lwip lock for entire write() operation
Same pattern as writev — write() calls internal_write_() then
internal_output_(), each acquiring the lock separately. Hold
the lock at the outer scope so inner calls just bump the
recursion counter.
2026-03-10 00:57:36 -10:00
J. Nick Koston cc05bf3ed2 [socket] Add LWIP_LOCK to socket factory functions
tcp_new() is an lwip core API call that must be bracketed with
the lwip lock on RP2040 per pico-sdk docs. Add LWIP_LOCK() to
socket() and socket_listen() factory functions.
2026-03-10 00:55:34 -10:00
J. Nick Koston c182c0c74f [socket] Hold lwip lock for entire readv/writev scatter-gather operation
Avoid repeated lock acquire/release cycles per iovec element.
The recursive mutex re-entry in inner calls is nearly free (counter
bump), while the outer lock prevents the expensive IRQ disable/enable
on each iteration.
2026-03-10 00:53:01 -10:00
J. Nick Koston a88e9b8146 [socket] Fix RP2040 TCP race condition between lwip callbacks and main loop
On RP2040 (Pico W), arduino-pico sets PICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1,
which means lwip callbacks (recv_fn, accept_fn, err_fn) run from a PendSV
interrupt — not the main loop. This allows them to preempt read(), write(),
close(), and accept() at any point, causing race conditions on shared state
like the rx_buf_ pbuf chain.

The most critical race: recv_fn calls pbuf_cat(rx_buf_, pb) while read() is
freeing nodes in the same chain, leading to use-after-free and lwip's
"Creating an infinite loop" assertion panic. This is the root cause of #10681.

Fix: implement RP2040's LwIPLock (previously a no-op) to call
cyw43_arch_lwip_begin/end, which acquires the pico-sdk async_context recursive
mutex. Add LWIP_LOCK() guards to all main-loop lwip API call sites in the
socket layer.

On ESP8266, lwip callbacks run cooperatively from the main loop, so
LwIPLock remains a no-op.

Closes #10681
2026-03-10 00:34:20 -10:00
J. Nick KostonandJ. Nick Koston 7dea3756e9 [socket] Address review comments: doc comments and (void) flags
- Document port_host byte order convention in lwip_ip_to_sockaddr
- Note intentional method hiding in LWIPRawUDPRecvImpl
- Note recvfrom truncation differs from POSIX MSG_TRUNC
- Add (void) flags in sendto to clarify flags are ignored

Co-Authored-By: J. Nick Koston <nick@koston.org>
2026-03-09 23:56:37 -10:00
J. Nick Koston fa0bff3374 [socket] Add lwip raw UDP socket implementation
Add native UDP support to the lwip raw TCP socket layer used by
ESP8266 and RP2040, eliminating the need for Arduino WiFiUDP fallback.

Two new classes:
- LWIPRawUDPImpl: send-only UDP (8 bytes overhead)
- LWIPRawUDPRecvImpl: send+recv with fixed-size ring buffer (no heap
  allocation in recv callback)

Factory functions: socket_udp(), socket_udp_recv(), socket_ip_udp(),
socket_ip_udp_recv() with UDPSocket/UDPRecvSocket type aliases.

Additive only — no consumer migration in this PR.
2026-03-09 23:48:07 -10:00
J. Nick Koston 753dd9e9f9 [ota] Only delay(1) on EWOULDBLOCK in writeall_, feed WDT on success 2026-03-09 21:52:19 -10:00
J. Nick Koston 798822215d [ota] Add socket I/O strategy documentation table to handle_data_ 2026-03-09 21:50:26 -10:00
J. Nick Koston 5aa9c18dfc [ota,socket] Add SO_SNDTIMEO and use delay(0) in readall_
- Add SO_SNDTIMEO to OTA socket to prevent blocking writes from
  stalling the WDT when the TCP send buffer is full
- Add SO_SNDTIMEO as no-op in raw TCP (writes never block)
- Use delay(0) instead of delay(1) in readall_() since SO_RCVTIMEO
  already handles the wait
- Keep delay(1) in writeall_() since raw TCP writes are non-blocking
  and would spin on EWOULDBLOCK without it
2026-03-09 21:49:06 -10:00
J. Nick Koston c43015a467 [ota,socket] Use SO_RCVTIMEO for OTA data transfer instead of polling
Replace the non-blocking poll + delay(1) pattern in OTA data transfer
with SO_RCVTIMEO blocking reads. The socket now wakes immediately when
data arrives instead of sleeping 1ms between polls.

Adds SO_RCVTIMEO support to the raw TCP socket implementation (ESP8266,
RP2040) using the existing socket_delay()/socket_wake() infrastructure.
The timeout is stored as a uint8_t in centiseconds, fitting in existing
struct padding with zero RAM cost.

Tested OTA improvements across platforms:
- ESP32-S3: ~15% faster (6.96-7.76s -> 5.87-6.60s)
- LibreTiny RTL: 24% faster (18.84s -> 14.33s)
- LibreTiny BK72xx: 56% faster (55.52s -> 24.38s)
- ESP8266: ~1% faster (compressed OTA, already efficient)
2026-03-09 21:28:08 -10:00
J. Nick Koston 4b50d14496 [serial_proxy] Reduce loop() overhead by disabling when idle and splitting read path (#14673) 2026-03-10 02:10:03 -05:00
J. Nick Koston 1202f54a75 Merge branch 'serial-proxy-loop-stack-optimization' into integration 2026-03-09 20:49:48 -10:00