Merge remote-tracking branch 'origin/main' into main

This commit is contained in:
Adolfo Reyna
2026-07-04 15:39:52 -04:00
396 changed files with 114753 additions and 2051 deletions
+4
View File
@@ -11,6 +11,8 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
persist-credentials: false
- name: "Build" - name: "Build"
uses: ./.github/actions/build-simulator uses: ./.github/actions/build-simulator
with: with:
@@ -21,6 +23,8 @@ jobs:
runs-on: macos-latest runs-on: macos-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
persist-credentials: false
- name: "Build" - name: "Build"
uses: ./.github/actions/build-simulator uses: ./.github/actions/build-simulator
with: with:
+4 -1
View File
@@ -23,6 +23,8 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
persist-credentials: false
- name: "Build SDK" - name: "Build SDK"
uses: ./.github/actions/build-sdk uses: ./.github/actions/build-sdk
with: with:
@@ -66,7 +68,6 @@ jobs:
{ id: m5stack-cores3, arch: esp32s3 }, { id: m5stack-cores3, arch: esp32s3 },
{ id: m5stack-papers3, arch: esp32s3 }, { id: m5stack-papers3, arch: esp32s3 },
{ id: m5stack-stackchan, arch: esp32s3 }, { id: m5stack-stackchan, arch: esp32s3 },
{ id: m5stack-stickc-plus, arch: esp32 },
{ id: m5stack-stickc-plus2, arch: esp32 }, { id: m5stack-stickc-plus2, arch: esp32 },
{ id: m5stack-sticks3, arch: esp32s3 }, { id: m5stack-sticks3, arch: esp32s3 },
{ id: m5stack-tab5, arch: esp32p4 }, { id: m5stack-tab5, arch: esp32p4 },
@@ -82,6 +83,8 @@ jobs:
needs: [ BuildSdk ] needs: [ BuildSdk ]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
persist-credentials: false
- name: "Build Firmware" - name: "Build Firmware"
uses: ./.github/actions/build-firmware uses: ./.github/actions/build-firmware
with: with:
+2 -1
View File
@@ -31,8 +31,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: "Checkout repo" - name: "Checkout repo"
uses: actions/checkout@v4 - uses: actions/checkout@v4
with: with:
persist-credentials: false
submodules: recursive submodules: recursive
- name: "Install Python Dependencies" - name: "Install Python Dependencies"
shell: bash shell: bash
+21 -26
View File
@@ -2,11 +2,9 @@ import subprocess
from datetime import datetime, UTC from datetime import datetime, UTC
import os import os
import sys import sys
import configparser
from dataclasses import dataclass, asdict from dataclasses import dataclass, asdict
import json import json
import shutil import shutil
from configparser import RawConfigParser
VERBOSE = False VERBOSE = False
DEVICES_FOLDER = "Devices" DEVICES_FOLDER = "Devices"
@@ -68,32 +66,29 @@ def exit_with_error(message):
sys.exit(1) sys.exit(1)
def read_properties_file(path): def read_properties_file(path):
config = configparser.RawConfigParser() properties = {}
# Don't convert keys to lowercase with open(path, "r") as file:
config.optionxform = str for line in file:
config.read(path) stripped = line.strip()
return config if not stripped or stripped.startswith("#"):
continue
key, sep, value = line.partition("=")
if not sep:
continue
properties[key.strip()] = value.strip()
return properties
def get_property_or_none(properties: RawConfigParser, group: str, key: str): def get_property_or_none(properties: dict, group: str, key: str):
if group not in properties.sections(): return properties.get(f"{group}.{key}")
return None
if key not in properties[group].keys():
return None
return properties[group][key]
def get_boolean_property_or_false(properties: RawConfigParser, group: str, key: str): def get_boolean_property_or_false(properties: dict, group: str, key: str):
if group not in properties.sections(): return properties.get(f"{group}.{key}") == "true"
return False
if key not in properties[group].keys():
return False
return properties[group][key] == "true"
def get_property_or_exit(properties: RawConfigParser, group: str, key: str): def get_property_or_exit(properties: dict, group: str, key: str):
if group not in properties.sections(): full_key = f"{group}.{key}"
exit_with_error(f"Device properties does not contain group: {group}") if full_key not in properties:
if key not in properties[group].keys(): exit_with_error(f"Device properties does not contain key: {full_key}")
exit_with_error(f"Device properties does not contain key: {key}") return properties[full_key]
return properties[group][key]
def read_device_properties(device_id): def read_device_properties(device_id):
mapping_file_path = os.path.join(DEVICES_FOLDER, device_id, "device.properties") mapping_file_path = os.path.join(DEVICES_FOLDER, device_id, "device.properties")
@@ -129,7 +124,7 @@ def to_manifest_chip_name(name):
return "" return ""
def process_device(in_path: str, out_path: str, device_directory: str, device_id: str, device_properties: RawConfigParser, version: str): def process_device(in_path: str, out_path: str, device_directory: str, device_id: str, device_properties: dict, version: str):
in_device_path = os.path.join(in_path, device_directory) in_device_path = os.path.join(in_path, device_directory)
in_device_binaries_path = os.path.join(in_device_path, "Binaries") in_device_binaries_path = os.path.join(in_device_path, "Binaries")
if not os.path.isdir(in_device_binaries_path): if not os.path.isdir(in_device_binaries_path):
+135
View File
@@ -0,0 +1,135 @@
#!/usr/bin/env python3
"""Download all artifacts from a GitHub Actions workflow run."""
import argparse
import os
import subprocess
import sys
import zipfile
from pathlib import Path
import requests
API_URL = "https://api.github.com"
def get_token(cli_token: str | None) -> str:
if cli_token:
return cli_token
env_token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN")
if env_token:
return env_token
try:
result = subprocess.run(
["gh", "auth", "token"], capture_output=True, text=True, check=True
)
return result.stdout.strip()
except (FileNotFoundError, subprocess.CalledProcessError):
sys.exit(
"No token found. Pass --token, set GITHUB_TOKEN/GH_TOKEN, or run `gh auth login`."
)
def get_repo(cli_repo: str | None) -> str:
if cli_repo:
return cli_repo
try:
result = subprocess.run(
["git", "remote", "get-url", "origin"],
capture_output=True,
text=True,
check=True,
)
url = result.stdout.strip()
except (FileNotFoundError, subprocess.CalledProcessError):
sys.exit("Could not detect repo from git remote. Pass --repo owner/name.")
# Handle both SSH and HTTPS remote URLs.
if url.startswith("git@"):
path = url.split(":", 1)[1]
else:
path = url.split("github.com/", 1)[-1]
return path.removesuffix(".git")
def download_artifacts(repo: str, run_id: str, token: str, out_dir: Path):
headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/vnd.github+json",
"X-GitHub-Api-Version": "2022-11-28",
}
out_dir.mkdir(parents=True, exist_ok=True)
url = f"{API_URL}/repos/{repo}/actions/runs/{run_id}/artifacts"
artifacts = []
while url:
resp = requests.get(url, headers=headers, params={"per_page": 100})
resp.raise_for_status()
data = resp.json()
artifacts.extend(data["artifacts"])
url = resp.links.get("next", {}).get("url")
if not artifacts:
print(f"No artifacts found for run {run_id}.")
return
for artifact in artifacts:
name = artifact["name"]
if name == "all-artifacts":
print(f"Skipping {name}")
continue
if artifact.get("expired"):
print(f"Skipping expired artifact: {name}")
continue
print(f"Downloading {name} ({artifact['size_in_bytes']} bytes)...")
download_url = artifact["archive_download_url"]
resp = requests.get(download_url, headers=headers, stream=True)
resp.raise_for_status()
zip_path = out_dir / f"{name}.zip"
with open(zip_path, "wb") as f:
for chunk in resp.iter_content(chunk_size=8192):
f.write(chunk)
if name.endswith(".bin"):
with zipfile.ZipFile(zip_path) as zf:
zf.extractall(out_dir)
zip_path.unlink()
print(f" Extracted to {out_dir}")
else:
print(f" Saved to {zip_path}")
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("run_id", help="GitHub Actions run ID")
parser.add_argument(
"--repo",
help="owner/repo (default: detected from git remote 'origin')",
)
parser.add_argument(
"--token",
help="GitHub token (default: $GITHUB_TOKEN, $GH_TOKEN, or `gh auth token`)",
)
parser.add_argument(
"--out",
default="artifacts",
help="Output directory (default: ./artifacts)",
)
args = parser.parse_args()
repo = get_repo(args.repo)
token = get_token(args.token)
out_dir = Path(args.out)
print(f"Repo: {repo}")
print(f"Run ID: {args.run_id}")
print(f"Output: {out_dir.resolve()}")
download_artifacts(repo, args.run_id, token, out_dir)
if __name__ == "__main__":
main()
+126
View File
@@ -0,0 +1,126 @@
#!/usr/bin/env python3
"""Summarize commits between the last 2 pushed git tags into commits.md and pull-requests.md."""
import argparse
import re
import subprocess
import sys
from pathlib import Path
PR_REF_RE = re.compile(r"#(\d+)")
def get_repo(cli_repo: str | None) -> str:
if cli_repo:
return cli_repo
try:
result = subprocess.run(
["git", "remote", "get-url", "origin"],
capture_output=True,
text=True,
check=True,
)
url = result.stdout.strip()
except (FileNotFoundError, subprocess.CalledProcessError):
sys.exit("Could not detect repo from git remote. Pass --repo owner/name.")
if url.startswith("git@"):
path = url.split(":", 1)[1]
else:
path = url.split("github.com/", 1)[-1]
return path.removesuffix(".git")
def get_last_two_tags() -> tuple[str, str]:
result = subprocess.run(
["git", "tag", "--sort=-creatordate"],
capture_output=True,
text=True,
check=True,
)
tags = [t for t in result.stdout.splitlines() if t]
if len(tags) < 2:
sys.exit(f"Need at least 2 tags, found {len(tags)}.")
return tags[1], tags[0] # previous, latest
def get_commits(prev_tag: str, latest_tag: str) -> list[tuple[str, str]]:
result = subprocess.run(
[
"git",
"log",
"--pretty=format:%H\x1f%s",
f"{prev_tag}..{latest_tag}",
],
capture_output=True,
text=True,
check=True,
)
commits = []
for line in result.stdout.splitlines():
if not line:
continue
sha, subject = line.split("\x1f", 1)
commits.append((sha, subject))
return commits
def write_commits_md(path: Path, repo: str, prev_tag: str, latest_tag: str, commits: list[tuple[str, str]]):
lines = [f"# Commits: {prev_tag}..{latest_tag}", ""]
for sha, subject in commits:
link = f"https://github.com/{repo}/commit/{sha}"
lines.append(f"- [{subject}]({link})")
path.write_text("\n".join(lines) + "\n")
def write_pull_requests_md(path: Path, repo: str, commits: list[tuple[str, str]]):
pr_numbers = []
seen = set()
for _, subject in commits:
for match in PR_REF_RE.finditer(subject):
number = match.group(1)
if number not in seen:
seen.add(number)
pr_numbers.append(number)
lines = ["# Pull Requests", ""]
for number in pr_numbers:
lines.append(f"- https://github.com/{repo}/pull/{number}")
path.write_text("\n".join(lines) + "\n")
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"--repo",
help="owner/repo (default: detected from git remote 'origin')",
)
parser.add_argument(
"--out",
default=".",
help="Output directory for commits.md and pull-requests.md (default: current directory)",
)
args = parser.parse_args()
repo = get_repo(args.repo)
prev_tag, latest_tag = get_last_two_tags()
commits = get_commits(prev_tag, latest_tag)
out_dir = Path(args.out)
out_dir.mkdir(parents=True, exist_ok=True)
commits_path = out_dir / "release-commits.md"
prs_path = out_dir / "release-pull-requests.md"
write_commits_md(commits_path, repo, prev_tag, latest_tag, commits)
write_pull_requests_md(prs_path, repo, commits)
print(f"Repo: {repo}")
print(f"Tags: {prev_tag}..{latest_tag}")
print(f"Commits: {len(commits)}")
print(f"Wrote {commits_path}")
print(f"Wrote {prs_path}")
if __name__ == "__main__":
main()
+2 -5
View File
@@ -28,7 +28,6 @@ function(READ_PROPERTIES_TO_MAP PROPERTY_FILE RESULT_VAR)
endif () endif ()
file(STRINGS ${PROPERTY_FILE_ABS} lines) file(STRINGS ${PROPERTY_FILE_ABS} lines)
set(current_section "")
set(map_content "") set(map_content "")
foreach(line IN LISTS lines) foreach(line IN LISTS lines)
@@ -37,9 +36,7 @@ function(READ_PROPERTIES_TO_MAP PROPERTY_FILE RESULT_VAR)
continue() continue()
endif () endif ()
if (line MATCHES "^\\[.*\\]$") if (line MATCHES "^([^=]+)=(.*)$")
set(current_section "${line}")
elseif (line MATCHES "^([^=]+)=(.*)$")
set(key "${CMAKE_MATCH_1}") set(key "${CMAKE_MATCH_1}")
set(value "${CMAKE_MATCH_2}") set(value "${CMAKE_MATCH_2}")
string(STRIP "${key}" key) string(STRIP "${key}" key)
@@ -49,7 +46,7 @@ function(READ_PROPERTIES_TO_MAP PROPERTY_FILE RESULT_VAR)
set(value "${CMAKE_MATCH_1}") set(value "${CMAKE_MATCH_1}")
endif () endif ()
list(APPEND map_content "${current_section}${key}" "${value}") list(APPEND map_content "${key}" "${value}")
endif () endif ()
endforeach() endforeach()
+84
View File
@@ -0,0 +1,84 @@
#!/usr/bin/env python3
"""Generate a release summary markdown by combining gh-release-summary.py output with Claude."""
import argparse
import subprocess
import sys
from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
SECTIONS = [
"New Devices",
"New Features",
"New Apps",
"Improvements & Fixes",
"Other Changes",
"TactilitySDK",
"Known Issues",
]
def run_gh_release_summary(out_dir: Path, repo: str | None):
cmd = [sys.executable, str(SCRIPT_DIR / "gh-release-summary.py"), "--out", str(out_dir)]
if repo:
cmd += ["--repo", repo]
subprocess.run(cmd, check=True)
def build_prompt() -> str:
section_list = "\n".join(f"- {s}" for s in SECTIONS)
return (
"You are given a list of commits (with GitHub commit links) and a list of pull "
"request links from a software release. Write a release summary in Markdown, "
"organizing changes into these sections (omit a section if it has no relevant "
"changes):\n\n"
f"{section_list}\n\n"
"Use concise bullet points. Base every bullet strictly on the given commits and "
"pull requests, referencing the pull request link where applicable. Output only "
"the Markdown, no commentary before or after it."
"If a pull request or commit has multiple changes add them as separate entries."
"Ignore irrelevant changes: documentation, minor fixes, non-descript fixes, scripts, github workflows."
"For 'New Devices': only mention the device name, don't like pull request."
"For 'Improvements & Fixes': Avoid non-descript entries, write specifics."
"For 'TactilitySDK': Avoid generic changes, be specific. Mention API changes."
)
def run_claude(commits_md: str, prs_md: str) -> str:
prompt = build_prompt()
stdin_content = f"## Commits\n\n{commits_md}\n\n## Pull Requests\n\n{prs_md}"
result = subprocess.run(
["claude", "-p", prompt],
input=stdin_content,
capture_output=True,
text=True,
check=True,
)
return result.stdout
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--repo", help="owner/repo (default: detected from git remote 'origin')")
parser.add_argument("--out", default=".", help="Output directory (default: current directory)")
args = parser.parse_args()
out_dir = Path(args.out)
out_dir.mkdir(parents=True, exist_ok=True)
run_gh_release_summary(out_dir, args.repo)
commits_md = (out_dir / "release-commits.md").read_text()
prs_md = (out_dir / "release-pull-requests.md").read_text()
print("Generating release summary via claude...")
summary = run_claude(commits_md, prs_md)
summary_path = out_dir / "release-summary.md"
summary_path.write_text(summary)
print(f"Wrote {summary_path}")
if __name__ == "__main__":
main()
+16 -1
View File
@@ -9,7 +9,8 @@ CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y
CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y
CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH=y CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH=y
# EmbedTLS # EmbedTLS
CONFIG_MBEDTLS_SSL_PROTO_TLS1_3=y # Use TLS 1.2 because 1.3 conflicts with MbedTLS dynamic buffer
CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
# LVGL # LVGL
CONFIG_LV_USE_USER_DATA=y CONFIG_LV_USE_USER_DATA=y
CONFIG_LV_USE_FS_STDIO=y CONFIG_LV_USE_FS_STDIO=y
@@ -40,3 +41,17 @@ CONFIG_WL_SECTOR_MODE_SAFE=y
CONFIG_WL_SECTOR_MODE=1 CONFIG_WL_SECTOR_MODE=1
# Allow new i2c_master API (used by Tab5Keyboard for LP_I2C_NUM_0) to coexist with legacy i2c driver # Allow new i2c_master API (used by Tab5Keyboard for LP_I2C_NUM_0) to coexist with legacy i2c driver
CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y CONFIG_I2C_SKIP_LEGACY_CONFLICT_CHECK=y
# Wi-Fi memory optimizations
CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=3
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=5
CONFIG_ESP_WIFI_STATIC_TX_BUFFER=y
CONFIG_ESP_WIFI_TX_BUFFER_TYPE=0
CONFIG_ESP_WIFI_STATIC_TX_BUFFER_NUM=5
CONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=5
CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5
CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP_WIFI_TX_BA_WIN=5
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP_WIFI_RX_BA_WIN=5
+3
View File
@@ -74,8 +74,11 @@ else ()
message("Building for sim target") message("Building for sim target")
add_compile_definitions(CONFIG_TT_DEVICE_ID="simulator") add_compile_definitions(CONFIG_TT_DEVICE_ID="simulator")
add_compile_definitions(CONFIG_TT_DEVICE_NAME="Simulator") add_compile_definitions(CONFIG_TT_DEVICE_NAME="Simulator")
add_compile_definitions(CONFIG_TT_DEVICE_VENDOR="")
add_compile_definitions(CONFIG_TT_DEVICE_NAME_SIMPLE="Simulator")
add_compile_definitions(CONFIG_TT_LAUNCHER_APP_ID="Launcher") add_compile_definitions(CONFIG_TT_LAUNCHER_APP_ID="Launcher")
add_compile_definitions(CONFIG_TT_AUTO_START_APP_ID="") add_compile_definitions(CONFIG_TT_AUTO_START_APP_ID="")
add_compile_definitions(CONFIG_TT_USER_DATA_LOCATION_INTERNAL)
endif () endif ()
project(Tactility) project(Tactility)
@@ -1 +0,0 @@
enableOnBoot=false
@@ -1 +0,0 @@
enableOnBoot=false
@@ -1 +0,0 @@
enableOnBoot=false
-5
View File
@@ -1,5 +0,0 @@
language=en-US
timeFormat24h=true
dateFormat=DD/MM/YYYY
region=EU
timezone=Europe/Amsterdam
@@ -485,7 +485,7 @@
<button class="btn btn-secondary btn-sm" onclick="goUp()" id="upBtn">Up</button> <button class="btn btn-secondary btn-sm" onclick="goUp()" id="upBtn">Up</button>
</div> </div>
<div class="toolbar-sep"></div> <div class="toolbar-sep"></div>
<input type="text" id="pathInput" value="/data" onkeydown="if(event.key==='Enter')refreshFiles()"> <input type="text" id="pathInput" value="" onkeydown="if(event.key==='Enter')refreshFiles()">
<button class="btn btn-primary btn-sm" onclick="refreshFiles()">Go</button> <button class="btn btn-primary btn-sm" onclick="refreshFiles()">Go</button>
<div class="toolbar-sep"></div> <div class="toolbar-sep"></div>
<div class="toolbar-group"> <div class="toolbar-group">
@@ -739,7 +739,6 @@ function renderDashboard(data) {
<div class="card"> <div class="card">
<h2>Quick Actions</h2> <h2>Quick Actions</h2>
<div class="actions"> <div class="actions">
<button class="btn btn-primary" onclick="syncAssets(this)">Sync Assets</button>
${data.features_enabled?.screenshot ? '<button class="btn btn-secondary" onclick="captureScreenshot(this)">Screenshot</button>' : ''} ${data.features_enabled?.screenshot ? '<button class="btn btn-secondary" onclick="captureScreenshot(this)">Screenshot</button>' : ''}
<button class="btn btn-danger" onclick="rebootDevice(this)">Reboot</button> <button class="btn btn-danger" onclick="rebootDevice(this)">Reboot</button>
</div> </div>
-63
View File
@@ -1,63 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tactility Dashboard</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 20px auto;
padding: 20px;
background-color: #f5f5f5;
}
h1 {
color: #333;
text-align: center;
}
.placeholder {
background: white;
padding: 40px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
text-align: center;
margin: 20px 0;
}
.placeholder h2 {
color: #666;
}
.placeholder p {
color: #666;
line-height: 1.6;
}
a {
color: #007bff;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<h1>Tactility Default Dashboard</h1>
<div class="placeholder">
<h2>Version 0 - Default Placeholder</h2>
<p>This is the default dashboard bundled with firmware.</p>
<p>To customize this interface:</p>
<ol style="text-align: left; display: inline-block;">
<li>Create your custom dashboard HTML/CSS/JS files</li>
<li>Add them to <code>/sdcard/tactility/webserver/</code></li>
<li>Create <code>version.json</code> with <code>{"version": 1}</code> or higher</li>
<li>Reboot or click "Sync Assets" on the <a href="/">Core Interface</a></li>
</ol>
<p><strong>Your custom assets will automatically replace this page!</strong></p>
</div>
<div class="placeholder">
<p><a href="/">← Back to Core Interface</a></p>
</div>
</body>
</html>
-3
View File
@@ -1,3 +0,0 @@
{
"version": 0
}
@@ -13,6 +13,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+18 -21
View File
@@ -1,25 +1,22 @@
[general] general.vendor=BigTreeTech
vendor=BigTreeTech general.name=Panda Touch,K Touch
name=Panda Touch,K Touch
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true hardware.usbHostEnabled=true
usbHostEnabled=true
[display] storage.userDataLocation=Internal
size=5"
shape=rectangle
dpi=187
[lvgl] display.size=5"
colorDepth=16 display.shape=rectangle
fontSize=18 display.dpi=187
lvgl.colorDepth=16
lvgl.fontSize=18
+12 -15
View File
@@ -1,19 +1,16 @@
[general] general.vendor=CYD
vendor=CYD general.name=2432S024C
name=2432S024C
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.4"
shape=rectangle
dpi=167
[lvgl] display.size=2.4"
colorDepth=16 display.shape=rectangle
display.dpi=167
lvgl.colorDepth=16
+12 -15
View File
@@ -1,19 +1,16 @@
[general] general.vendor=CYD
vendor=CYD general.name=2432S024R
name=2432S024R
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.4"
shape=rectangle
dpi=167
[lvgl] display.size=2.4"
colorDepth=16 display.shape=rectangle
display.dpi=167
lvgl.colorDepth=16
+13 -17
View File
@@ -1,22 +1,18 @@
[general] general.vendor=CYD
vendor=CYD general.name=2432S028R
name=2432S028R
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=143
[cdn] display.size=2.8"
warningMessage=There are 3 hardware variants of this board. This build works on the original variant only ("v1"). display.shape=rectangle
display.dpi=143
[lvgl] cdn.warningMessage=There are 3 hardware variants of this board. This build works on the original variant only ("v1").
colorDepth=16
lvgl.colorDepth=16
+13 -17
View File
@@ -1,22 +1,18 @@
[general] general.vendor=CYD
vendor=CYD general.name=2432S028R v3
name=2432S028R v3
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=143
[cdn] display.size=2.8"
warningMessage=There are 3 hardware variants of this board. This build only supports board version 3. display.shape=rectangle
display.dpi=143
[lvgl] cdn.warningMessage=There are 3 hardware variants of this board. This build only supports board version 3.
colorDepth=16
lvgl.colorDepth=16
+12 -15
View File
@@ -1,19 +1,16 @@
[general] general.vendor=CYD
vendor=CYD general.name=2432S032C
name=2432S032C
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=3.2"
shape=rectangle
dpi=125
[lvgl] display.size=3.2"
colorDepth=16 display.shape=rectangle
display.dpi=125
lvgl.colorDepth=16
+16 -19
View File
@@ -1,19 +1,16 @@
[general] general.vendor=CYD
vendor=CYD general.name=3248S035C
name=3248S035C
apps.launcherAppId=Launcher
[apps]
launcherAppId=Launcher hardware.target=ESP32
hardware.flashSize=4MB
[hardware] hardware.spiRam=false
target=ESP32
flashSize=4MB storage.userDataLocation=SD
spiRam=false
display.size=3.5"
[display] display.shape=rectangle
size=3.5" display.dpi=165
shape=rectangle
dpi=165 lvgl.colorDepth=16
[lvgl]
colorDepth=16
@@ -12,9 +12,25 @@
#include <esp_lcd_panel_ops.h> #include <esp_lcd_panel_ops.h>
#include <esp_lcd_panel_io_additions.h> #include <esp_lcd_panel_io_additions.h>
#include <esp_lcd_st7701.h> #include <esp_lcd_st7701.h>
#include <esp_rom_gpio.h>
#include <soc/spi_periph.h>
#include <driver/spi_master.h>
static const auto LOGGER = tt::Logger("St7701Display"); static const auto LOGGER = tt::Logger("St7701Display");
// GPIO47/48 are physically shared between this bit-banged 3-wire command bus
// and the SD card's real SPI2 bus (no alternate pins exist on this PCB).
// esp_lcd_new_panel_io_3wire_spi() reconfigures them as plain GPIO via
// gpio_config(), severing their SPI2 matrix routing. Reconnect them here once
// the vendor init sequence is done, so SD card reads/writes keep working.
// Safe only because nothing else calls into the ST7701 IO handle after boot.
static void reclaimSpiPinsForSdCard() {
esp_rom_gpio_connect_out_signal(GPIO_NUM_47, spi_periph_signal[SPI2_HOST].spid_out, false, false);
esp_rom_gpio_connect_out_signal(GPIO_NUM_48, spi_periph_signal[SPI2_HOST].spiclk_out, false, false);
gpio_set_direction(GPIO_NUM_47, GPIO_MODE_OUTPUT);
gpio_set_direction(GPIO_NUM_48, GPIO_MODE_OUTPUT);
}
static const st7701_lcd_init_cmd_t st7701_lcd_init_cmds[] = { static const st7701_lcd_init_cmd_t st7701_lcd_init_cmds[] = {
// {cmd, { data }, data_size, delay_ms} // {cmd, { data }, data_size, delay_ms}
{0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x10}, 5, 0}, {0xFF, (uint8_t[]) {0x77, 0x01, 0x00, 0x00, 0x10}, 5, 0},
@@ -181,6 +197,8 @@ bool St7701Display::createPanelHandle(esp_lcd_panel_io_handle_t ioHandle, esp_lc
return false; return false;
} }
reclaimSpiPinsForSdCard();
return true; return true;
} }
+1 -1
View File
@@ -12,7 +12,7 @@ static error_t stop() {
return ERROR_NONE; return ERROR_NONE;
} }
struct Module cyd_4848s040c_module = { Module cyd_4848s040c_module = {
.name = "cyd-4848s040c", .name = "cyd-4848s040c",
.start = start, .start = start,
.stop = stop, .stop = stop,
+1 -14
View File
@@ -13,6 +13,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -27,18 +28,4 @@
pin-sda = <&gpio0 19 GPIO_FLAG_NONE>; pin-sda = <&gpio0 19 GPIO_FLAG_NONE>;
pin-scl = <&gpio0 45 GPIO_FLAG_NONE>; pin-scl = <&gpio0 45 GPIO_FLAG_NONE>;
}; };
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
cs-gpios = <&gpio0 42 GPIO_FLAG_NONE>;
pin-mosi = <&gpio0 47 GPIO_FLAG_NONE>;
pin-miso = <&gpio0 41 GPIO_FLAG_NONE>;
pin-sclk = <&gpio0 48 GPIO_FLAG_NONE>;
sdcard@0 {
compatible = "espressif,esp32-sdspi";
frequency-khz = <20000>;
};
};
}; };
+15 -18
View File
@@ -1,22 +1,19 @@
[general] general.vendor=CYD
vendor=CYD general.name=4848S040C
name=4848S040C
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=4"
shape=rectangle
dpi=170
[lvgl] display.size=4"
colorDepth=16 display.shape=rectangle
display.dpi=170
lvgl.colorDepth=16
+1
View File
@@ -14,6 +14,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+21 -25
View File
@@ -1,30 +1,26 @@
[general] general.vendor=CYD
vendor=CYD general.name=8048S043C
name=8048S043C general.incubating=false
incubating=false
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=4.3"
shape=rectangle
dpi=217
[cdn] display.size=4.3"
infoMessage= display.shape=rectangle
warningMessage= display.dpi=217
[lvgl] cdn.infoMessage=
theme=DefaultDark cdn.warningMessage=
colorDepth=16
fontSize=18 lvgl.theme=DefaultDark
lvgl.colorDepth=16
lvgl.fontSize=18
+12 -15
View File
@@ -1,19 +1,16 @@
[general] general.vendor=CYD
vendor=CYD general.name=E32R28T
name=E32R28T
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=143
[lvgl] display.size=2.8"
colorDepth=16 display.shape=rectangle
display.dpi=143
lvgl.colorDepth=16
+12 -15
View File
@@ -1,19 +1,16 @@
[general] general.vendor=CYD
vendor=CYD general.name=E32R32P
name=E32R32P
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=125
[lvgl] display.size=2.8"
colorDepth=16 display.shape=rectangle
display.dpi=125
lvgl.colorDepth=16
@@ -1,24 +1,21 @@
[general] general.vendor=Elecrow
vendor=Elecrow general.name=CrowPanel Advance 2.8"
name=CrowPanel Advance 2.8"
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=143
[lvgl] display.size=2.8"
colorDepth=16 display.shape=rectangle
display.dpi=143
lvgl.colorDepth=16
@@ -15,6 +15,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -1,24 +1,21 @@
[general] general.vendor=Elecrow
vendor=Elecrow general.name=CrowPanel Advance 3.5"
name=CrowPanel Advance 3.5"
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=3.5"
shape=rectangle
dpi=165
[lvgl] display.size=3.5"
colorDepth=16 display.shape=rectangle
display.dpi=165
lvgl.colorDepth=16
@@ -15,6 +15,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -1,25 +1,22 @@
[general] general.vendor=Elecrow
vendor=Elecrow general.name=CrowPanel Advance 5.0"
name=CrowPanel Advance 5.0"
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=5"
shape=rectangle
dpi=187
[lvgl] display.size=5"
colorDepth=16 display.shape=rectangle
fontSize=18 display.dpi=187
lvgl.colorDepth=16
lvgl.fontSize=18
@@ -14,6 +14,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -1,19 +1,16 @@
[general] general.vendor=Elecrow
vendor=Elecrow general.name=CrowPanel Basic 2.8"
name=CrowPanel Basic 2.8"
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=143
[lvgl] display.size=2.8"
colorDepth=16 display.shape=rectangle
display.dpi=143
lvgl.colorDepth=16
@@ -1,19 +1,16 @@
[general] general.vendor=Elecrow
vendor=Elecrow general.name=CrowPanel Basic 3.5"
name=CrowPanel Basic 3.5"
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=3.5"
shape=rectangle
dpi=165
[lvgl] display.size=3.5"
colorDepth=16 display.shape=rectangle
display.dpi=165
lvgl.colorDepth=16
@@ -1,25 +1,22 @@
[general] general.vendor=Elecrow
vendor=Elecrow general.name=CrowPanel Basic 5.0"
name=CrowPanel Basic 5.0"
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=5.0"
shape=rectangle
dpi=187
[lvgl] display.size=5.0"
colorDepth=16 display.shape=rectangle
fontSize=18 display.dpi=187
lvgl.colorDepth=16
lvgl.fontSize=18
@@ -14,6 +14,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+7 -9
View File
@@ -1,12 +1,10 @@
[general] general.vendor=Generic
vendor=Generic general.name=ESP32
name=ESP32
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=8MB
flashSize=4MB hardware.spiRam=false
spiRam=false
storage.userDataLocation=Internal
+7 -9
View File
@@ -1,12 +1,10 @@
[general] general.vendor=Generic
vendor=Generic general.name=ESP32-C6
name=ESP32-C6
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32C6
target=ESP32C6 hardware.flashSize=8MB
flashSize=4MB hardware.spiRam=false
spiRam=false
storage.userDataLocation=Internal
+7 -9
View File
@@ -1,12 +1,10 @@
[general] general.vendor=Generic
vendor=Generic general.name=ESP32-P4
name=ESP32-P4
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32P4
target=ESP32P4 hardware.flashSize=8MB
flashSize=4MB hardware.spiRam=false
spiRam=false
storage.userDataLocation=Internal
+7 -9
View File
@@ -1,12 +1,10 @@
[general] general.vendor=Generic
vendor=Generic general.name=ESP32-S3
name=ESP32-S3
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=8MB
flashSize=4MB hardware.spiRam=false
spiRam=false
storage.userDataLocation=Internal
@@ -1,33 +1,29 @@
[general] general.vendor=Guition
vendor=Guition general.name=JC1060P470C-I-W-Y
name=JC1060P470C-I-W-Y
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32P4
target=ESP32P4 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=200M
spiRamSpeed=200M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=7"
shape=rectangle
dpi=187
[lvgl] display.size=7"
colorDepth=16 display.shape=rectangle
display.dpi=187
[sdkconfig] lvgl.colorDepth=16
CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16
CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 sdkconfig.CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16
CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y sdkconfig.CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30
CONFIG_ESP_HOSTED_ENABLED=y sdkconfig.CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y
CONFIG_ESP_HOSTED_P4_DEV_BOARD_FUNC_BOARD=y sdkconfig.CONFIG_ESP_HOSTED_ENABLED=y
CONFIG_ESP_HOSTED_SDIO_HOST_INTERFACE=y sdkconfig.CONFIG_ESP_HOSTED_P4_DEV_BOARD_FUNC_BOARD=y
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y sdkconfig.CONFIG_ESP_HOSTED_SDIO_HOST_INTERFACE=y
CONFIG_ESP_HOSTED_USE_MEMPOOL=n sdkconfig.CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
sdkconfig.CONFIG_ESP_HOSTED_USE_MEMPOOL=n
@@ -21,6 +21,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+12 -15
View File
@@ -1,19 +1,16 @@
[general] general.vendor=Guition
vendor=Guition general.name=JC2432W328C
name=JC2432W328C
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=4MB
flashSize=4MB hardware.spiRam=false
spiRam=false
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=143
[lvgl] display.size=2.8"
colorDepth=16 display.shape=rectangle
display.dpi=143
lvgl.colorDepth=16
+17 -20
View File
@@ -1,24 +1,21 @@
[general] general.vendor=Guition
vendor=Guition general.name=JC3248W535C
name=JC3248W535C
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=3.5"
shape=rectangle
dpi=165
[lvgl] display.size=3.5"
colorDepth=16 display.shape=rectangle
display.dpi=165
lvgl.colorDepth=16
@@ -16,6 +16,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+17 -20
View File
@@ -1,24 +1,21 @@
[general] general.vendor=Guition
vendor=Guition general.name=JC8048W550C
name=JC8048W550C
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=5"
shape=rectangle
dpi=187
[lvgl] display.size=5"
colorDepth=16 display.shape=rectangle
fontSize=18 display.dpi=187
lvgl.colorDepth=16
lvgl.fontSize=18
@@ -15,6 +15,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -1,30 +1,26 @@
[general] general.vendor=Heltec
vendor=Heltec general.name=WiFi LoRa 32 v3
name=WiFi LoRa 32 v3 general.incubating=true
incubating=true
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher apps.autoStartAppId=ApWebServer
autoStartAppId=ApWebServer
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=8MB
flashSize=8MB hardware.spiRam=false
spiRam=false hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=Internal
size=0.96"
shape=rectangle
dpi=149
[cdn] display.size=0.96"
infoMessage=Due to the small size of the screen, the icons don't render properly. display.shape=rectangle
display.dpi=149
[lvgl] cdn.infoMessage=Due to the small size of the screen, the icons don't render properly.
theme=Mono
colorDepth=16 lvgl.theme=Mono
uiScale=70 lvgl.colorDepth=16
uiDensity=compact lvgl.uiScale=70
lvgl.uiDensity=compact
@@ -11,6 +11,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -38,7 +38,7 @@ std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay() {
.backlightDutyFunction = driver::pwmbacklight::setBacklightDuty, .backlightDutyFunction = driver::pwmbacklight::setBacklightDuty,
.resetPin = GPIO_NUM_NC, .resetPin = GPIO_NUM_NC,
.lvglSwapBytes = false, .lvglSwapBytes = false,
.buffSpiram = true .buffSpiram = false // Enabling leads to crashes when refreshing App Hub list
}; };
auto spi_configuration = std::make_shared<St7789Display::SpiConfiguration>(St7789Display::SpiConfiguration { auto spi_configuration = std::make_shared<St7789Display::SpiConfiguration>(St7789Display::SpiConfiguration {
@@ -9,7 +9,7 @@ constexpr auto LCD_PIN_CS = GPIO_NUM_12;
constexpr auto LCD_PIN_DC = GPIO_NUM_11; // RS constexpr auto LCD_PIN_DC = GPIO_NUM_11; // RS
constexpr auto LCD_HORIZONTAL_RESOLUTION = 320; constexpr auto LCD_HORIZONTAL_RESOLUTION = 320;
constexpr auto LCD_VERTICAL_RESOLUTION = 240; constexpr auto LCD_VERTICAL_RESOLUTION = 240;
constexpr auto LCD_BUFFER_HEIGHT = (LCD_VERTICAL_RESOLUTION / 3); constexpr auto LCD_BUFFER_HEIGHT = (LCD_VERTICAL_RESOLUTION / 10);
constexpr auto LCD_BUFFER_SIZE = (LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT); constexpr auto LCD_BUFFER_SIZE = (LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT);
constexpr auto LCD_SPI_TRANSFER_SIZE_LIMIT = LCD_BUFFER_SIZE * LV_COLOR_DEPTH / 8; constexpr auto LCD_SPI_TRANSFER_SIZE_LIMIT = LCD_BUFFER_SIZE * LV_COLOR_DEPTH / 8;
+18 -22
View File
@@ -1,27 +1,23 @@
[general] general.vendor=LilyGO
vendor=LilyGO general.name=T-Deck,T-Deck Plus
name=T-Deck,T-Deck Plus
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=143
[cdn] display.size=2.8"
infoMessage=To put the device into bootloader mode: <br/>1. Press the trackball and then the reset button at the same time,<br/>2. Let go of the reset button, then the trackball.<br/><br/>When this website reports that flashing is finished, you likely have to press the reset button. display.shape=rectangle
display.dpi=143
[lvgl] cdn.infoMessage=To put the device into bootloader mode: <br/>1. Press the trackball and then the reset button at the same time,<br/>2. Let go of the reset button, then the trackball.<br/><br/>When this website reports that flashing is finished, you likely have to press the reset button.
colorDepth=16
lvgl.colorDepth=16
+1
View File
@@ -18,6 +18,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+18 -21
View File
@@ -1,25 +1,22 @@
[general] general.vendor=LilyGO
vendor=LilyGO general.name=T-Display S3
name=T-Display S3
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher apps.autoStartAppId=ApWebServer
autoStartAppId=ApWebServer
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=Internal
size=1.9"
shape=rectangle
dpi=191
[lvgl] display.size=1.9"
colorDepth=16 display.shape=rectangle
display.dpi=191
lvgl.colorDepth=16
@@ -10,6 +10,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -12,7 +12,7 @@ constexpr auto LCD_PIN_RESET = GPIO_NUM_23;
constexpr auto LCD_PIN_BACKLIGHT = GPIO_NUM_4; constexpr auto LCD_PIN_BACKLIGHT = GPIO_NUM_4;
constexpr auto LCD_HORIZONTAL_RESOLUTION = 135; constexpr auto LCD_HORIZONTAL_RESOLUTION = 135;
constexpr auto LCD_VERTICAL_RESOLUTION = 240; constexpr auto LCD_VERTICAL_RESOLUTION = 240;
constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 3; constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 6;
constexpr auto LCD_BUFFER_SIZE = LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT; constexpr auto LCD_BUFFER_SIZE = LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT;
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay(); std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay();
+16 -19
View File
@@ -1,23 +1,20 @@
[general] general.vendor=LilyGO
vendor=LilyGO general.name=T-Display
name=T-Display general.incubating=true
incubating=true
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher apps.autoStartAppId=ApWebServer
autoStartAppId=ApWebServer
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=false
spiRam=false hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M
[display] storage.userDataLocation=Internal
size=1.14"
shape=rectangle
dpi=242
[lvgl] display.size=1.14"
colorDepth=16 display.shape=rectangle
uiDensity=compact display.dpi=242
lvgl.colorDepth=16
lvgl.uiDensity=compact
+19 -22
View File
@@ -1,26 +1,23 @@
[general] general.vendor=LilyGO
vendor=LilyGO general.name=T-Dongle S3
name=T-Dongle S3 general.incubating=true
incubating=true
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher apps.autoStartAppId=ApWebServer
autoStartAppId=ApWebServer
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=false
spiRam=false hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=0.96"
shape=rectangle
dpi=186
[lvgl] display.size=0.96"
colorDepth=16 display.shape=rectangle
uiDensity=compact display.dpi=186
fontSize=10
lvgl.colorDepth=16
lvgl.uiDensity=compact
lvgl.fontSize=10
@@ -15,6 +15,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+17 -20
View File
@@ -1,24 +1,21 @@
[general] general.vendor=LilyGO
vendor=LilyGO general.name=T-HMI
name=T-HMI
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=2.8"
shape=rectangle
dpi=125
[lvgl] display.size=2.8"
colorDepth=16 display.shape=rectangle
display.dpi=125
lvgl.colorDepth=16
+1
View File
@@ -15,6 +15,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+19 -22
View File
@@ -1,26 +1,23 @@
[general] general.vendor=LilyGO
vendor=LilyGO general.name=T-Lora Pager
name=T-Lora Pager
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.flashMode=DIO
flashMode=DIO hardware.spiRam=true
spiRam=true hardware.spiRamMode=AUTO
spiRamMode=AUTO hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=40M
esptoolFlashFreq=40M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=2.33"
shape=rectangle
dpi=227
[lvgl] display.size=2.33"
colorDepth=16 display.shape=rectangle
dpi=150 display.dpi=227
lvgl.colorDepth=16
lvgl.dpi=150
@@ -17,6 +17,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+16 -19
View File
@@ -1,24 +1,21 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=Cardputer Adv
name=Cardputer Adv
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=8MB
flashSize=8MB hardware.spiRam=false
spiRam=false hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=1.14"
shape=rectangle display.size=1.14"
display.shape=rectangle
# TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced) # TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced)
dpi=139 display.dpi=139
[lvgl] lvgl.colorDepth=16
colorDepth=16 lvgl.uiDensity=compact
uiDensity=compact
@@ -19,6 +19,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+16 -19
View File
@@ -1,24 +1,21 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=Cardputer,Cardputer v1.1
name=Cardputer,Cardputer v1.1
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=8MB
flashSize=8MB hardware.spiRam=false
spiRam=false hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=1.14"
shape=rectangle display.size=1.14"
display.shape=rectangle
# TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced) # TODO: dps is actually 242, but this breaks UI (button selection becomes invisible and switch visibility is reduced)
dpi=139 display.dpi=139
[lvgl] lvgl.colorDepth=16
colorDepth=16 lvgl.uiDensity=compact
uiDensity=compact
@@ -18,6 +18,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+16 -20
View File
@@ -1,25 +1,21 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=Core2
name=Core2
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=QUAD
spiRamMode=QUAD hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M
[display] storage.userDataLocation=SD
size=2"
shape=rectangle
dpi=200
[cdn] display.size=2"
warningMessage=This board implementation concerns the original Core2 hardware and **not** the v1.1 variant display.shape=rectangle
display.dpi=200
[lvgl] cdn.warningMessage=This board implementation concerns the original Core2 hardware and **not** the v1.1 variant
colorDepth=16
lvgl.colorDepth=16
+17 -20
View File
@@ -1,24 +1,21 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=CoreS3
name=CoreS3
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=QUAD
spiRamMode=QUAD hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=2"
shape=rectangle
dpi=200
[lvgl] display.size=2"
colorDepth=16 display.shape=rectangle
display.dpi=200
lvgl.colorDepth=16
@@ -20,6 +20,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+20 -26
View File
@@ -1,32 +1,26 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=PaperS3
name=PaperS3 general.incubating=true
incubating=true
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=esp32s3
target=esp32s3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OPI
spiRamMode=OPI hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M hardware.tinyUsb=true
tinyUsb=true hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=4.7"
shape=rectangle
dpi=235
[lvgl] display.size=4.7"
colorDepth=8 display.shape=rectangle
fontSize=24 display.dpi=235
theme=Mono
[sdkconfig]
CONFIG_EPD_DISPLAY_TYPE_ED047TC2=y
lvgl.colorDepth=8
lvgl.fontSize=24
lvgl.theme=Mono
sdkconfig.CONFIG_EPD_DISPLAY_TYPE_ED047TC2=y
@@ -15,6 +15,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+17 -20
View File
@@ -1,24 +1,21 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=StackChan
name=StackChan
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=QUAD
spiRamMode=QUAD hardware.spiRamSpeed=120M
spiRamSpeed=120M hardware.tinyUsb=true
tinyUsb=true hardware.esptoolFlashFreq=120M
esptoolFlashFreq=120M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=2"
shape=rectangle
dpi=200
[lvgl] display.size=2"
colorDepth=16 display.shape=rectangle
display.dpi=200
lvgl.colorDepth=16
@@ -22,6 +22,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
@@ -1,7 +0,0 @@
file(GLOB_RECURSE SOURCE_FILES Source/*.c*)
idf_component_register(
SRCS ${SOURCE_FILES}
INCLUDE_DIRS "Source"
REQUIRES Tactility esp_lvgl_port esp_lcd AXP192 ST7789 ButtonControl
)
@@ -1,29 +0,0 @@
#include "devices/Display.h"
#include "devices/Power.h"
#include <Tactility/hal/Configuration.h>
#include <ButtonControl.h>
using namespace tt::hal;
static bool initBoot() {
// CH552 applies 4 V to GPIO 0, which reduces Wi-Fi sensitivity
// Setting output to high adds a bias of 3.3 V and suppresses over-voltage:
gpio::configure(0, gpio::Mode::Output, false, false);
gpio::setLevel(0, true);
return initAxp();
}
static DeviceVector createDevices() {
return {
getAxp192(),
ButtonControl::createTwoButtonControl(37, 39),
createDisplay()
};
}
extern const Configuration hardwareConfiguration = {
.initBoot = initBoot,
.createDevices = createDevices
};
@@ -1,67 +0,0 @@
#include "Display.h"
#include "Power.h"
#include <Tactility/Logger.h>
#include <St7789Display.h>
#include <bitset>
static const auto LOGGER = tt::Logger("StickCPlus");
static void setBacklightOn(bool on) {
const auto axp = getAxp192();
const auto* driver = axp->getAxp192();
uint8_t state;
if (axp192_read(driver, AXP192_DCDC13_LDO23_CONTROL, &state) != AXP192_OK) {
LOGGER.info("Failed to read LCD brightness state");
return;
}
std::bitset<8> new_state = state;
if (new_state[2] != on) {
new_state[2] = on;
const auto new_state_long = new_state.to_ulong();
axp192_write(driver, AXP192_DCDC13_LDO23_CONTROL, static_cast<uint8_t>(new_state_long)); // Display on/off
}
}
static void setBrightness(uint8_t brightness) {
const auto axp = getAxp192();
if (brightness)
{
brightness = (((brightness >> 1) + 8) / 13) + 5;
setBacklightOn(true);
axp192_write(axp->getAxp192(), AXP192_LDO23_VOLTAGE, brightness << 4); // Display brightness
}
else
{
setBacklightOn(false);
}
}
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay() {
St7789Display::Configuration panel_configuration = {
.horizontalResolution = LCD_HORIZONTAL_RESOLUTION,
.verticalResolution = LCD_VERTICAL_RESOLUTION,
.gapX = 52,
.gapY = 40,
.swapXY = false,
.mirrorX = false,
.mirrorY = false,
.invertColor = true,
.bufferSize = LCD_BUFFER_SIZE,
.touch = nullptr,
.backlightDutyFunction = setBrightness,
.resetPin = LCD_PIN_RESET,
.lvglSwapBytes = false
};
auto spi_configuration = std::make_shared<St7789Display::SpiConfiguration>(St7789Display::SpiConfiguration {
.spiHostDevice = LCD_SPI_HOST,
.csPin = LCD_PIN_CS,
.dcPin = LCD_PIN_DC,
.pixelClockFrequency = 40'000'000,
.transactionQueueDepth = 10
});
return std::make_shared<St7789Display>(panel_configuration, spi_configuration);
}
@@ -1,18 +0,0 @@
#pragma once
#include <Tactility/hal/display/DisplayDevice.h>
#include <memory>
#include <driver/gpio.h>
#include <driver/spi_common.h>
constexpr auto LCD_SPI_HOST = SPI2_HOST;
constexpr auto LCD_PIN_CS = GPIO_NUM_5;
constexpr auto LCD_PIN_DC = GPIO_NUM_23;
constexpr auto LCD_PIN_RESET = GPIO_NUM_18;
constexpr auto LCD_HORIZONTAL_RESOLUTION = 135;
constexpr auto LCD_VERTICAL_RESOLUTION = 240;
constexpr auto LCD_BUFFER_HEIGHT = LCD_VERTICAL_RESOLUTION / 3;
constexpr auto LCD_BUFFER_SIZE = LCD_HORIZONTAL_RESOLUTION * LCD_BUFFER_HEIGHT;
constexpr auto LCD_SPI_TRANSFER_SIZE_LIMIT = LCD_BUFFER_SIZE * LV_COLOR_DEPTH / 8;
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay();
@@ -1,39 +0,0 @@
#include <Axp192.h>
#include <tactility/device.h>
static std::shared_ptr<Axp192> axp192 = nullptr;
std::shared_ptr<Axp192> createAxp192() {
assert(axp192 == nullptr);
auto configuration = std::make_unique<Axp192::Configuration>(device_find_by_name("i2c_internal"));
axp192 = std::make_shared<Axp192>(std::move(configuration));
return axp192;
}
std::shared_ptr<Axp192> getAxp192() {
assert(axp192 != nullptr);
return axp192;
}
bool initAxp() {
const auto axp = createAxp192();
return axp->init([](auto* driver) {
// Reference: https://github.com/pr3y/Bruce/blob/main/lib/utility/AXP192.cpp
axp192_ioctl(driver, AXP192_LDO23_VOLTAGE, 3300); // LCD backlight
axp192_ioctl(driver, AXP192_ADC_ENABLE_1, 0xff); // Set all ADC enabled
axp192_ioctl(driver, AXP192_CHARGE_CONTROL_1, 0xc0); // Battery charging at 4.2 V and 100 mA
axp192_ioctl(driver, AXP192_ADC_ENABLE_1, 0xff); // Enable battery, AC in, Vbus, APS ADC
uint8_t buffer;
axp192_read(driver, AXP192_DCDC13_LDO23_CONTROL, &buffer);
axp192_ioctl(driver, AXP192_DCDC13_LDO23_CONTROL, buffer | 0x4D); // Enable Ext, LDO2, LDO3, DCDC1
axp192_ioctl(driver, AXP192_PEK, 0x0C); // 128 ms power on, 4 s power off
axp192_ioctl(driver, AXP192_GPIO0_LDOIO0_VOLTAGE, 0xF0); // 3.3 V RTC voltage
axp192_ioctl(driver, AXP192_GPIO0_CONTROL, 0x02); // Set GPIO0 to LDO
axp192_ioctl(driver, AXP192_VBUS_IPSOUT_CHANNEL, 0x80); // Disable Vbus hold limit
axp192_ioctl(driver, AXP192_BATTERY_CHARGE_HIGH_TEMP, 0xFC); // Set temperature protection
axp192_ioctl(driver, AXP192_BATTERY_CHARGE_CONTROL, 0xA2); // Enable RTC BAT charge
axp192_ioctl(driver, AXP192_SHUTDOWN_BATTERY_CHGLED_CONTROL, 0x46); // Enable bat detection
return true;
});
}
@@ -1,9 +0,0 @@
#pragma once
#include <Axp192.h>
bool initAxp();
// Must call initAxp() first before this returns a non-nullptr response
std::shared_ptr<Axp192> getAxp192();
@@ -1,23 +0,0 @@
#include <tactility/module.h>
extern "C" {
static error_t start() {
// Empty for now
return ERROR_NONE;
}
static error_t stop() {
// Empty for now
return ERROR_NONE;
}
struct Module m5stack_stickc_plus_module = {
.name = "m5stack-stickc-plus",
.start = start,
.stop = stop,
.symbols = nullptr,
.internal = nullptr
};
}
@@ -1,23 +0,0 @@
[general]
vendor=M5Stack
name=StickC Plus
incubating=true
[apps]
launcherAppId=Launcher
autoStartAppId=ApWebServer
[hardware]
target=ESP32
flashSize=4MB
spiRam=false
esptoolFlashFreq=80M
[display]
size=1.14"
shape=rectangle
dpi=242
[lvgl]
colorDepth=16
uiDensity=compact
@@ -1,5 +0,0 @@
dependencies:
- Platforms/platform-esp32
- Drivers/mpu6886-module
- Drivers/bm8563-module
dts: m5stack,stickc-plus.dts
@@ -1,66 +0,0 @@
/dts-v1/;
#include <tactility/bindings/root.h>
#include <tactility/bindings/esp32_gpio.h>
#include <tactility/bindings/esp32_i2c.h>
#include <tactility/bindings/esp32_spi.h>
#include <tactility/bindings/esp32_uart.h>
#include <bindings/mpu6886.h>
#include <bindings/bm8563.h>
#include <tactility/bindings/display_placeholder.h>
/ {
compatible = "root";
model = "M5Stack StickC Plus";
gpio0 {
compatible = "espressif,esp32-gpio";
gpio-count = <40>;
};
i2c_internal {
compatible = "espressif,esp32-i2c";
port = <I2C_NUM_0>;
clock-frequency = <400000>;
pin-sda = <&gpio0 21 GPIO_FLAG_NONE>;
pin-scl = <&gpio0 22 GPIO_FLAG_NONE>;
mpu6886 {
compatible = "invensense,mpu6886";
reg = <0x68>;
};
bm8563 {
compatible = "belling,bm8563";
reg = <0x51>;
};
};
i2c_grove {
compatible = "espressif,esp32-i2c";
port = <I2C_NUM_1>;
clock-frequency = <400000>;
pin-sda = <&gpio0 32 GPIO_FLAG_NONE>;
pin-scl = <&gpio0 33 GPIO_FLAG_NONE>;
};
spi0 {
compatible = "espressif,esp32-spi";
host = <SPI2_HOST>;
cs-gpios = <&gpio0 5 GPIO_FLAG_NONE>;
pin-mosi = <&gpio0 15 GPIO_FLAG_NONE>;
pin-sclk = <&gpio0 13 GPIO_FLAG_NONE>;
display {
compatible = "display-placeholder";
};
};
uart_grove: uart1 {
compatible = "espressif,esp32-uart";
status = "disabled";
port = <UART_NUM_1>;
pin-tx = <&gpio0 33 GPIO_FLAG_NONE>;
pin-rx = <&gpio0 32 GPIO_FLAG_NONE>;
};
};
+18 -21
View File
@@ -1,25 +1,22 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=StickC Plus2
name=StickC Plus2 general.incubating=true
incubating=true
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher apps.autoStartAppId=ApWebServer
autoStartAppId=ApWebServer
[hardware] hardware.target=ESP32
target=ESP32 hardware.flashSize=8MB
flashSize=8MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=QUAD
spiRamMode=QUAD hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M
[display] storage.userDataLocation=Internal
size=1.14"
shape=rectangle
dpi=242
[lvgl] display.size=1.14"
colorDepth=16 display.shape=rectangle
uiDensity=compact display.dpi=242
lvgl.colorDepth=16
lvgl.uiDensity=compact
+18 -21
View File
@@ -1,25 +1,22 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=StickS3
name=StickS3
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=8MB
flashSize=8MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M hardware.tinyUsb=true
tinyUsb=true hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=1.14"
shape=rectangle
dpi=242
[lvgl] display.size=1.14"
colorDepth=16 display.shape=rectangle
uiDensity=compact display.dpi=242
lvgl.colorDepth=16
lvgl.uiDensity=compact
@@ -17,6 +17,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+39 -43
View File
@@ -1,51 +1,47 @@
[general] general.vendor=M5Stack
vendor=M5Stack general.name=Tab5
name=Tab5
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32P4
target=ESP32P4 hardware.flashSize=16MB
flashSize=16MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=HEX
spiRamMode=HEX hardware.spiRamSpeed=200M
spiRamSpeed=200M hardware.esptoolFlashFreq=80M
esptoolFlashFreq=80M hardware.bluetooth=true
bluetooth=true hardware.usbHostEnabled=true
usbHostEnabled=true hardware.tinyUsb=true
tinyUsb=true
[display] storage.userDataLocation=SD
size=5"
shape=rectangle
dpi=294
[lvgl] display.size=5"
colorDepth=16 display.shape=rectangle
fontSize=28 display.dpi=294
dpi=250
[sdkconfig] lvgl.colorDepth=16
CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 lvgl.fontSize=28
CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 lvgl.dpi=250
CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y sdkconfig.CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16
CONFIG_ESP_HOSTED_ENABLED=y sdkconfig.CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30
CONFIG_ESP_HOSTED_SDIO_HOST_INTERFACE=y sdkconfig.CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y
CONFIG_ESP_HOSTED_SDIO_SLOT_1=y sdkconfig.CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CMD_SLOT_1=13 sdkconfig.CONFIG_ESP_HOSTED_ENABLED=y
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CLK_SLOT_1=12 sdkconfig.CONFIG_ESP_HOSTED_SDIO_HOST_INTERFACE=y
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D0_SLOT_1=11 sdkconfig.CONFIG_ESP_HOSTED_SDIO_SLOT_1=y
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D1_4BIT_BUS_SLOT_1=10 sdkconfig.CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CMD_SLOT_1=13
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D2_4BIT_BUS_SLOT_1=9 sdkconfig.CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_CLK_SLOT_1=12
CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D3_4BIT_BUS_SLOT_1=8 sdkconfig.CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D0_SLOT_1=11
CONFIG_ESP_HOSTED_SDIO_GPIO_RESET_SLAVE=15 sdkconfig.CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D1_4BIT_BUS_SLOT_1=10
sdkconfig.CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D2_4BIT_BUS_SLOT_1=9
sdkconfig.CONFIG_ESP_HOSTED_PRIV_SDIO_PIN_D3_4BIT_BUS_SLOT_1=8
sdkconfig.CONFIG_ESP_HOSTED_SDIO_GPIO_RESET_SLAVE=15
# Fixes recent changes to esp_hosted # Fixes recent changes to esp_hosted
CONFIG_ESP_HOSTED_USE_MEMPOOL=n sdkconfig.CONFIG_ESP_HOSTED_USE_MEMPOOL=n
# Performance: larger L2 cache reduces PSRAM stalls for draw/DPI buffers # Performance: larger L2 cache reduces PSRAM stalls for draw/DPI buffers
CONFIG_CACHE_L2_CACHE_256KB=y sdkconfig.CONFIG_CACHE_L2_CACHE_256KB=y
# Performance: use P4's PPA (pixel processing accelerator for rotation) # Performance: use P4's PPA (pixel processing accelerator for rotation)
CONFIG_LVGL_PORT_ENABLE_PPA=y sdkconfig.CONFIG_LVGL_PORT_ENABLE_PPA=y
CONFIG_LV_DRAW_BUF_ALIGN=64 sdkconfig.CONFIG_LV_DRAW_BUF_ALIGN=64
CONFIG_LV_DEF_REFR_PERIOD=15 sdkconfig.CONFIG_LV_DEF_REFR_PERIOD=15
+1
View File
@@ -20,6 +20,7 @@
ble0 { ble0 {
compatible = "espressif,esp32-ble"; compatible = "espressif,esp32-ble";
status = "disabled";
}; };
gpio0 { gpio0 {
+8 -10
View File
@@ -1,13 +1,11 @@
[general] general.vendor=Simulator
vendor=Simulator general.name=Tab5Simulator
name=Tab5Simulator
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=POSIX
target=POSIX
[lvgl] storage.userDataLocation=Internal
colorDepth=16
fontSize=14 lvgl.colorDepth=16
lvgl.fontSize=14
+16 -20
View File
@@ -1,25 +1,21 @@
[general] general.vendor=unPhone
vendor=unPhone general.name=unPhone
name=unPhone
[apps] apps.launcherAppId=Launcher
launcherAppId=Launcher
[hardware] hardware.target=ESP32S3
target=ESP32S3 hardware.flashSize=8MB
flashSize=8MB hardware.spiRam=true
spiRam=true hardware.spiRamMode=OCT
spiRamMode=OCT hardware.spiRamSpeed=80M
spiRamSpeed=80M hardware.bluetooth=true
bluetooth=true
[display] storage.userDataLocation=SD
size=3.5"
shape=rectangle
dpi=165
[cdn] display.size=3.5"
warningMessage=Put the device into bootloader mode by pressing the center nav button and reset for 2-3 seconds, then release reset, then release the nav button.<br/>After flashing is finished, press the reset button to reboot. display.shape=rectangle
display.dpi=165
[lvgl] cdn.warningMessage=Put the device into bootloader mode by pressing the center nav button and reset for 2-3 seconds, then release reset, then release the nav button.<br/>After flashing is finished, press the reset button to reboot.
colorDepth=24
lvgl.colorDepth=24

Some files were not shown because too many files have changed in this diff Show More