Root cause (verified against our exact IDF tree, not the community guess): the "258" in "sdio_write_task: Failed to send data: 258" is NOT a timeout (that is 263). 258 = 0x102 = ESP_ERR_INVALID_ARG. On the ESP32-P4, block- mode CMD53 writes require the SOURCE buffer to be 64-byte (cache-line) aligned; the IDF sdmmc driver rejects a misaligned source with INVALID_ARG BEFORE any bus activity. esp_hosts write loop then declares "Unrecoverable host sdio state" and reboots the whole P4. The audio TX payload is not 64-aligned, so streaming mic audio wedged on the very FIRST frame (which is exactly what we saw: listening -> instant Failed to send -> reboot). This also explains why buffer/queue/clock/retry tuning all did nothing: the write never reached the bus. And why our symptom was instant, not after ~100 writes (the community block-mode-desync theory) — it is the first misaligned buffer, every time. Fix: vendored esp_hosted 2.12.11 as an editable local component (overrides the registry copy) and bounce a misaligned TX payload through one aligned DMA scratch buffer in hosted_sdio_write_block (port_esp_hosted_host_sdio.c). TX is serialized by the bus lock so a single static bounce buffer is safe; freed in hosted_sdio_deinit. Host-only change — no C6 reflash. VERIFIED ON HARDWARE (autonomous self-test): 40s of continuous mic-audio upstream streaming — the traffic that previously wedged on the first frame — ran clean, zero timeouts, zero reboots. A guarded SDIO_TX_SELFTEST harness is kept (compiled out) for future SDIO stress testing. Credit: root cause + patch designed via multi-agent investigation; the precise 258=INVALID_ARG decode (correcting the upstream community timeout assumption) came from checking our actual esp_err.h. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
76 lines
1.7 KiB
Bash
76 lines
1.7 KiB
Bash
#!/bin/bash -e
|
|
|
|
# from git-sh-setup.sh
|
|
require_clean_work_tree () {
|
|
git rev-parse --verify HEAD >/dev/null || exit 1
|
|
git update-index -q --ignore-submodules --refresh
|
|
err=0
|
|
|
|
if ! git diff-files --quiet --ignore-submodules
|
|
then
|
|
echo >&2 "Cannot $0: You have unstaged changes."
|
|
err=1
|
|
fi
|
|
|
|
if ! git diff-index --cached --quiet --ignore-submodules HEAD --
|
|
then
|
|
if [ $err = 0 ]
|
|
then
|
|
echo >&2 "Cannot $0: Your index contains uncommitted changes."
|
|
else
|
|
echo >&2 "Additionally, your index contains uncommitted changes."
|
|
fi
|
|
err=1
|
|
fi
|
|
|
|
if [ $err = 1 ]
|
|
then
|
|
test -n "$2" && echo >&2 "$2"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
require_clean_work_tree
|
|
|
|
if ! which doxygen >/dev/null; then
|
|
echo "Error: doxygen is required"
|
|
exit 1
|
|
fi
|
|
|
|
DOXYGEN_VERSION="$(doxygen --version)"
|
|
|
|
DOC_BRANCH="gh-pages"
|
|
ORIG_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
|
|
ORIG_COMMIT="$(git describe --match=NeVeRmAtCh --always --abbrev=40 --dirty)"
|
|
|
|
TOP="$(pwd)"
|
|
export GIT_DIR="$TOP/.git"
|
|
|
|
TMPDIR="$(mktemp --tmpdir=$TOP -d)"
|
|
HTMLDIR="$TMPDIR/_build/html"
|
|
INDEX_FILE="$GIT_DIR/index.${DOC_BRANCH}"
|
|
|
|
rm -f "$INDEX_FILE"
|
|
|
|
trap "{ cd $TOP; git checkout --force ${ORIG_BRANCH}; rm -f $INDEX_FILE; rm -rf $TMPDIR; }" EXIT
|
|
|
|
cd "$TMPDIR"
|
|
git reset --hard HEAD
|
|
|
|
./autogen.sh
|
|
mkdir _build
|
|
cd _build
|
|
../configure
|
|
make html
|
|
|
|
if ! git checkout "${DOC_BRANCH}"; then
|
|
git checkout --orphan "${DOC_BRANCH}"
|
|
fi
|
|
|
|
touch "$HTMLDIR/.nojekyll"
|
|
|
|
GIT_INDEX_FILE="$INDEX_FILE" GIT_WORK_TREE="$HTMLDIR" \
|
|
git add --no-ignore-removal .
|
|
GIT_INDEX_FILE="$INDEX_FILE" GIT_WORK_TREE="$HTMLDIR" \
|
|
git commit -m "Rebuild html documentation from commit ${ORIG_COMMIT} using Doxygen ${DOXYGEN_VERSION}"
|