Skip to content

Add Seeed Studio Wio Tracker L2 Pro - #676

Merged
KenVanHoeylandt merged 5 commits into
TactilityProject:mainfrom
AdaSzi:seeed-wio-tracker-l2-pro
Oct 7, 2026
Merged

KenVanHoeylandt merged 5 commits into
TactilityProject:mainfrom
AdaSzi:seeed-wio-tracker-l2-pro

Conversation

@AdaSzi

@AdaSzi AdaSzi commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

Adds the Seeed Studio Wio Tracker L2 Pro: ESP32-S3 (16 MB flash, 8 MB PSRAM), 3.2" 320x240 IPS display with an NV3031B controller on QSPI, GT911 touch, SD card, L76K GPS, SX1262 LoRa, ES8311 speaker codec, ES7243E microphone ADC and an ADS1115 for the battery voltage. A PCA9555 IO expander switches the power and reset lines of most parts. Product page: https://wiki.seeedstudio.com/meshtastic_wio_tracker_l2_intro/

The device folder is dts-only. New driver modules:

  • nv3031b-module: NV3031B display over QSPI (esp_lcd panel plus Tactility display driver). The reset pin can be on an IO expander.
  • lp5814-module: TI LP5814 LED driver used as the display backlight.
  • ads1115-module: TI ADS1115 ADC, used with battery-sense for the battery voltage.
  • es7243e-module: ES7243E microphone ADC, a wrapper around the esp_codec_dev implementation (same approach as es7210-module).

One change to an existing driver: gt911-module now handles reset and interrupt pins on an IO expander. Before, such pins were passed to esp_lcd_touch as native GPIO numbers (on this board that would have toggled GPIO8 and GPIO3). For expander pins the driver now does the reset itself and holds INT low, so the GT911 comes up at 0x5D. That matters here because the ES7243E already uses 0x14. Boards with native pins behave exactly as before.

Licensing

  • nv3031b-module/source/nv3031b_init_cmds.h contains the init sequence from LovyanGFX (FreeBSD / BSD-2-Clause). It has its own SPDX header and license file in the module.
  • esp_lcd_nv3031b.c is adapted from Espressif's esp_lcd_sh8601 (Apache-2.0), which uses the same QSPI command format.
  • Both have an entry in THIRD-PARTY-NOTICES.md. Everything else is Apache-2.0. The LP5814 and ADS1115 drivers are written from the TI datasheets. No code from the Meshtastic firmware was copied, it was only used as a reference for the expander pins and the power-up order.

Testing

  • Builds with ESP-IDF 6.1, no warnings from the new code.
  • Tested on the device: display, touch, backlight brightness, SD card, WiFi, GPS detection (L76K on UART1), speaker and microphone (audio recorder app), battery voltage and charge level, both buttons, SX1262 detection at boot.
  • The WAKE button works as enter (long press: back) and BOOT as next (long press: previous) through button-control.

Known gaps

  • LoRa: only the detection at boot is tested, not sending or receiving.
  • Grove port: not tested (no sensor at hand). SDA is GPIO13 and SCL is GPIO14 following the Grove pin order.
  • The red user LED stays off and the USB-C controller at 0x22 (an AW35615 according to the Meshtastic firmware) is not used.
  • The speaker amplifier is always on. Playing and recording at the same time only works at the same sample rate because both codecs share one I2S port.

Summary by CodeRabbit

  • New Features

    • Added support for the Seeed Studio Wio Tracker L2 Pro, including its display, connectivity, storage, audio, and radio hardware.
    • Added drivers for ADS1115 analog input, ES7243E audio input, LP5814 backlighting, and NV3031B displays.
  • Bug Fixes

    • Improved touchscreen reset handling with GPIO expanders and corrected active-low output behavior for expander-managed pins.
  • Documentation

    • Added device and driver documentation, license texts, and third-party notices.

AdaSzi added 3 commits October 5, 2026 23:04
Reset and interrupt pins on an IO expander were passed to esp_lcd_touch
as native GPIO numbers. The driver now resets the controller itself for
such pins, holding INT low so it comes up at address 0x5D. Native pins
behave as before.
New driver modules:
- nv3031b-module: NV3031B display over QSPI. The esp_lcd panel is
  adapted from Espressif's esp_lcd_sh8601 (Apache-2.0), the init
  sequence is from LovyanGFX (BSD-2-Clause).
- lp5814-module: TI LP5814 LED driver as display backlight.

The device folder is dts-only.

Working, tested on hardware: display (320x240 landscape), touch,
backlight brightness, SD card (SDMMC 1-bit), WiFi, GPS detection
(L76K on UART1).

Not implemented yet: battery voltage (ADS1115), buttons (BOOT, WAKE),
audio (ES8311 speaker, ES7243E microphone), LoRa (SX1262), user LED,
Grove port, USB-C controller (AW35615).
New driver modules:
- ads1115-module: TI ADS1115 ADC, written from the datasheet. The device uses it with battery-sense for the battery voltage.
- es7243e-module: ES7243E microphone ADC, wraps the esp_codec_dev implementation.

Device additions: ES8311 speaker and ES7243E microphone on I2S, battery voltage, SX1262 LoRa radio, Grove port, WAKE and BOOT buttons as navigation keys.

Tested on hardware: speaker and microphone (audio recorder app), battery voltage and charge level, both buttons, SX1262 probe. Not tested: LoRa transmit and receive, Grove port.
@coderabbitai

coderabbitai Bot commented Oct 5, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 0908e8f1-d5c9-46ac-9960-8eb10286e6df
📥 Commits

Reviewing files that changed from the base of the PR and between b07623f and a3a18dd.

📒 Files selected for processing (14)
  • Devices/seeed-wio-tracker-l2-pro/seeed,wio-tracker-l2-pro.dts
  • Documentation/ideas.md
  • Drivers/ads1115-module/source/ads1115.cpp
  • Drivers/es7243e-module/source/es7243e.cpp
  • Drivers/gt911-module/bindings/goodix,gt911.yaml
  • Drivers/gt911-module/source/gt911.cpp
  • Drivers/lp5814-module/bindings/ti,lp5814.yaml
  • Drivers/lp5814-module/include/drivers/lp5814.h
  • Drivers/lp5814-module/source/lp5814.cpp
  • Drivers/nv3031b-module/bindings/newvision,nv3031b.yaml
  • Drivers/nv3031b-module/include/drivers/nv3031b.h
  • Drivers/nv3031b-module/source/nv3031b.cpp
  • Drivers/tca95xx-16bit-module/README.md
  • Drivers/tca95xx-16bit-module/source/tca95xx.cpp
🚧 Files skipped from review as they are similar to previous changes (5)
  • Drivers/nv3031b-module/bindings/newvision,nv3031b.yaml
  • Drivers/nv3031b-module/include/drivers/nv3031b.h
  • Drivers/lp5814-module/include/drivers/lp5814.h
  • Drivers/lp5814-module/bindings/ti,lp5814.yaml
  • Drivers/gt911-module/bindings/goodix,gt911.yaml

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 3 remain after this review.


📝 Walkthrough

Walkthrough

Adds device-tree and module configuration for the Seeed Studio Wio Tracker L2 Pro. Adds ADS1115, ES7243E, LP5814, and NV3031B driver modules. Updates GT911 startup to handle reset and interrupt pins on GPIO expanders. Changes TCA95xx GPIO handling to invert active-low output levels and accept active-low output flags. Adds license files and third-party notices for the new modules and adapted display code.

Priority: ➖ Normal

Merge Risk: 🟡 Moderate · up to a3a18

Short audio-read deadlines can be exceeded, and display orientation queries can be stale after a runtime change. Resolve or explicitly accept these limitations before merging.

Security Architecture Review

Security architecture risk: 🔵 Low · up to a3a18

The changes are primarily confined to hardware support. Failed initialization can leave reset or interrupt pins configured without an owner, but no expanded remote access or credential authority is demonstrated. Remaining uncertainty concerns hardware recovery and integrations outside the reviewed code.

Retained concerns

  • Low · reliability · inferred: The new reset paths release GPIO ownership even when reset deassertion or interrupt-direction restoration fails. GT911 also skips restoring INT to input when reset acquisition fails. Because descriptor release only clears ownership, failed initialization can leave a pin actively driven or reset asserted without an owning device. This weakens hardware rollback and failure containment; the electrical consequences and any attacker-triggerable failure are not established.
Security review details

Security Blast Radius

  • inferred — The demonstrated scope is configured hardware on a device and consumers of the shared TCA95xx implementation, including the existing FT5x06 reset consumer. Controller-specific locks and register addresses bound register mutations to the selected expander. No cross-tenant, credential, or cloud-authority expansion is established by these paths.

Trust Boundaries and Controls

  • inferred — Repository construction paths instantiate the new drivers from generated device-tree configuration. The NV3031B panel constructor is externally linked, but the identified repository caller is its owning driver. The inspected entrypoints therefore do not establish a new attacker-controlled service route; external firmware integrations remain outside this conclusion.

Resilience and Maintainability Implications

  • observed — Normal GT911 expander reset completion restores INT to input before release. That containment step is absent from the reset-acquisition failure branch, and release itself does not restore hardware state. A successful normal path therefore does not establish safe terminal states for partial failure.

Hardening Proposals

  • proposed — Define safe terminal pin states for failed reset sequences and an explicit recovery policy when restoring those states fails. Retaining or quarantining ownership until recovery would avoid treating an actively driven pin as freely available.
  • proposed — For firmware integrations permitting concurrent display draws, place completion-token draining inside the same critical section as submission and completion waiting. Concurrent drawing was not established for the inspected LVGL consumer, so this is defensive design guidance rather than a verified attack path.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 15.71% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 70 functions across 25 files. (6 skipped:… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title names the Seeed Studio Wio Tracker L2 Pro, which is the main focus of the changes. It is concise, though it does not mention the supporting drivers and device integration.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

Docstring coverage is 15.71% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 70 functions across 25 files. (6 skipped: 6 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4


ℹ️ Review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 2935f7dd-f59e-42c4-ba83-f1ad00320082
📥 Commits

Reviewing files that changed from the base of the PR and between 04ada9d and 18f94a8.

📒 Files selected for processing (51)
  • Devices/seeed-wio-tracker-l2-pro/LICENSE-Apache-2.0.md
  • Devices/seeed-wio-tracker-l2-pro/device.properties
  • Devices/seeed-wio-tracker-l2-pro/module.yaml
  • Devices/seeed-wio-tracker-l2-pro/seeed,wio-tracker-l2-pro.dts
  • Drivers/ads1115-module/CMakeLists.txt
  • Drivers/ads1115-module/LICENSE-Apache-2.0.md
  • Drivers/ads1115-module/README.md
  • Drivers/ads1115-module/bindings/ti,ads1115.yaml
  • Drivers/ads1115-module/include/ads1115_module.h
  • Drivers/ads1115-module/include/bindings/ads1115.h
  • Drivers/ads1115-module/include/drivers/ads1115.h
  • Drivers/ads1115-module/module.yaml
  • Drivers/ads1115-module/source/ads1115.cpp
  • Drivers/ads1115-module/source/module.cpp
  • Drivers/es7243e-module/CMakeLists.txt
  • Drivers/es7243e-module/LICENSE-Apache-2.0.md
  • Drivers/es7243e-module/README.md
  • Drivers/es7243e-module/bindings/everest,es7243e.yaml
  • Drivers/es7243e-module/include/bindings/es7243e.h
  • Drivers/es7243e-module/include/drivers/es7243e.h
  • Drivers/es7243e-module/include/es7243e_module.h
  • Drivers/es7243e-module/module.yaml
  • Drivers/es7243e-module/source/es7243e.cpp
  • Drivers/es7243e-module/source/module.cpp
  • Drivers/gt911-module/bindings/goodix,gt911.yaml
  • Drivers/gt911-module/source/gt911.cpp
  • Drivers/lp5814-module/CMakeLists.txt
  • Drivers/lp5814-module/LICENSE-Apache-2.0.md
  • Drivers/lp5814-module/README.md
  • Drivers/lp5814-module/bindings/ti,lp5814.yaml
  • Drivers/lp5814-module/include/bindings/lp5814.h
  • Drivers/lp5814-module/include/drivers/lp5814.h
  • Drivers/lp5814-module/include/lp5814_module.h
  • Drivers/lp5814-module/module.yaml
  • Drivers/lp5814-module/source/lp5814.cpp
  • Drivers/lp5814-module/source/module.cpp
  • Drivers/nv3031b-module/CMakeLists.txt
  • Drivers/nv3031b-module/LICENSE-Apache-2.0.md
  • Drivers/nv3031b-module/LICENSE-BSD-2-Clause.md
  • Drivers/nv3031b-module/README.md
  • Drivers/nv3031b-module/bindings/newvision,nv3031b.yaml
  • Drivers/nv3031b-module/include/bindings/nv3031b.h
  • Drivers/nv3031b-module/include/drivers/nv3031b.h
  • Drivers/nv3031b-module/include/esp_lcd_nv3031b.h
  • Drivers/nv3031b-module/include/nv3031b_module.h
  • Drivers/nv3031b-module/module.yaml
  • Drivers/nv3031b-module/source/esp_lcd_nv3031b.c
  • Drivers/nv3031b-module/source/module.cpp
  • Drivers/nv3031b-module/source/nv3031b.cpp
  • Drivers/nv3031b-module/source/nv3031b_init_cmds.h
  • THIRD-PARTY-NOTICES.md

Included review availability: This review used your included allowance. Your plan provides up to 4 included reviews per hour; 3 remain after this review.

Comment thread Drivers/es7243e-module/source/es7243e.cpp
Comment thread Drivers/gt911-module/source/gt911.cpp Outdated
Comment thread Drivers/gt911-module/source/gt911.cpp
Comment thread Drivers/nv3031b-module/source/nv3031b.cpp
Comment thread Drivers/gt911-module/source/gt911.cpp Outdated
Comment thread Drivers/lp5814-module/include/drivers/lp5814.h
Comment thread Drivers/lp5814-module/source/lp5814.cpp Outdated
Comment thread Drivers/nv3031b-module/source/nv3031b.cpp Outdated
AdaSzi added 2 commits October 5, 2026 23:54
A native reset pin combined with an expander interrupt pin now keeps its configured polarity and the reset is pulsed reset-pulses times like on the native path.
…otes

- TCA95xx: active-low outputs are inverted in software. The GT911 and NV3031B drivers use that for their reset pins instead of driving physical levels and the device sets GPIO_FLAG_ACTIVE_LOW on the touch reset pin. ideas.md notes the same limitation in xl9555 and tca9534.
- LP5814: document the units of the current settings.
- New drivers use constexpr for TAG.
- Device: drive expander pin 4 high like the vendor firmware. Without it the audio codecs do not answer after a cold boot.
@KenVanHoeylandt

Copy link
Copy Markdown
Contributor

Thank you!

@KenVanHoeylandt
KenVanHoeylandt merged commit da2150a into TactilityProject:main Oct 7, 2026
68 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants