No difference between AMY vs. BOB, going to revise and dig deeper into SD card states
This commit is contained in:
parent
643042e8a2
commit
76c4b010bf
7 changed files with 1091 additions and 0 deletions
95
notes_Feb_18_2026.txt
Normal file
95
notes_Feb_18_2026.txt
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
A:
|
||||||
|
pio run -e node_a -t upload --upload-port /dev/ttyACM0
|
||||||
|
then:
|
||||||
|
date; screen /dev/ttyACM0 115200
|
||||||
|
|
||||||
|
B:
|
||||||
|
pio run -e node_b -t upload --upload-port /dev/ttyACM1
|
||||||
|
then:
|
||||||
|
date; screen /dev/ttyACM1 115200
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
tbeam:
|
||||||
|
Console 1:
|
||||||
|
cd /usr/local/src/sx1302_hal/packet_forwarder
|
||||||
|
sudo ./lora_pkt_fwd -c global_conf.reticulum_915000000_sf8_bw125.json
|
||||||
|
|
||||||
|
Console 2:
|
||||||
|
cd /usr/local/src/sx1302_hal/util_net_downlink
|
||||||
|
./net_downlink -P 1730 -l uplinks_$(date +%Y%m%d_%H%M%S).csv
|
||||||
|
|
||||||
|
|
||||||
|
Example capture:
|
||||||
|
INFO: Received pkt from mote: 65732042 (fcnt=29540)
|
||||||
|
|
||||||
|
JSON up: {"rxpk":[{"jver":1,"tmst":413765588,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":10.8,"foff":-45,"rssi":-15,"size":29,"data":"IEIgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE1MDQ="}]}
|
||||||
|
INFO: [up] PUSH_ACK received in 31 ms
|
||||||
|
|
||||||
|
INFO: Received pkt from mote: 65732041 (fcnt=29540)
|
||||||
|
|
||||||
|
JSON up: {"rxpk":[{"jver":1,"tmst":414742074,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":10.2,"foff":-297,"rssi":-15,"size":29,"data":"IEEgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE0OTg="}]}
|
||||||
|
INFO: [up] PUSH_ACK received in 31 ms
|
||||||
|
|
||||||
|
INFO: Received pkt from mote: 65732042 (fcnt=29540)
|
||||||
|
|
||||||
|
JSON up: {"rxpk":[{"jver":1,"tmst":415766626,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":11.0,"foff":-53,"rssi":-15,"size":29,"data":"IEIgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE1MDU="}]}
|
||||||
|
INFO: [up] PUSH_ACK received in 31 ms
|
||||||
|
|
||||||
|
INFO: Received pkt from mote: 65732041 (fcnt=29540)
|
||||||
|
|
||||||
|
JSON up: {"rxpk":[{"jver":1,"tmst":416744088,"chan":8,"rfch":0,"freq":915.000000,"mid":16,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","rssis":-16,"lsnr":10.2,"foff":-289,"rssi":-15,"size":29,"data":"IEEgc2VuZHMgZ3JlZXRpbmdzLiBpdGVyPTE0OTk="}]}
|
||||||
|
INFO: [up] PUSH_ACK received in 31 ms
|
||||||
|
INFO: [down] PULL_ACK received in 31 ms
|
||||||
|
|
||||||
|
tbeam /usr/local/src/sx1302_hal/util_net_downlink # tail uplinks_20260218_155659.csv
|
||||||
|
445782393,,8,0,915.000000,16,1,LORA,7,125,4/5,-15.0,-16.0,10.8,29,20422073656e6473206772656574696e67732e20697465723d31353230
|
||||||
|
446764659,,8,0,915.000000,16,1,LORA,7,125,4/5,-15.0,-16.0,10.5,29,20412073656e6473206772656574696e67732e20697465723d31353134
|
||||||
|
|
||||||
|
|
||||||
|
==== With all 5 units ======
|
||||||
|
Amy:
|
||||||
|
set the tab:
|
||||||
|
echo -ne "\033]30;Amy\007"
|
||||||
|
pio run -e amy -t upload --upload-port /dev/ttyACM0
|
||||||
|
|
||||||
|
date; screen /dev/ttyACM0 115200
|
||||||
|
|
||||||
|
Bob:
|
||||||
|
echo -ne "\033]30;Bob\007"
|
||||||
|
pio run -e bob -t upload --upload-port /dev/ttyACM1
|
||||||
|
|
||||||
|
date; screen /dev/ttyACM1 115200
|
||||||
|
|
||||||
|
Cy:
|
||||||
|
source ~/rnsenv/bin/activate
|
||||||
|
echo -ne "\033]30;Cy\007"
|
||||||
|
pio run -e cy -t upload --upload-port /dev/ttyACM2
|
||||||
|
|
||||||
|
date; screen /dev/ttyACM2 115200
|
||||||
|
|
||||||
|
Dan:
|
||||||
|
source ~/rnsenv/bin/activate
|
||||||
|
echo -ne "\033]30;Dan\007"
|
||||||
|
pio run -e cy -t upload --upload-port /dev/ttyACM3
|
||||||
|
|
||||||
|
date; screen /dev/ttyACM3 115200
|
||||||
|
|
||||||
|
Ed:
|
||||||
|
source ~/rnsenv/bin/activate
|
||||||
|
echo -ne "\033]30;Ed\007"
|
||||||
|
pio run -e cy -t upload --upload-port /dev/ttyACM4
|
||||||
|
date; screen /dev/ttyACM4 115200
|
||||||
|
|
||||||
|
|
||||||
|
Logging:
|
||||||
|
|
||||||
|
cd /usr/local/src/sx1302_hal/util_net_downlink
|
||||||
|
./net_downlink -P 1730 -l uplinks_$(date +%Y%m%d_%H%M%S).csv
|
||||||
|
|
||||||
|
ls -lath /usr/local/src/sx1302_hal/util_net_downlink |head -n 3
|
||||||
|
|
||||||
190
tools/constantTFCard/hw_debug/1st_run.log
Normal file
190
tools/constantTFCard/hw_debug/1st_run.log
Normal file
|
|
@ -0,0 +1,190 @@
|
||||||
|
John's interaction with the events below:
|
||||||
|
|
||||||
|
14149 Pressed down
|
||||||
|
[ 17543] let up
|
||||||
|
[ 30325] Pressed down
|
||||||
|
35143 let up
|
||||||
|
39993 killed.
|
||||||
|
|
||||||
|
Compiled and uploaded: Wed Apr 1 15:07:20 PDT 2026
|
||||||
|
|
||||||
|
[ 12793][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 12799][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
sample=3 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL
|
||||||
|
[ 13265][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 13271][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 13277][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 13701][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 13707][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 13713][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 14137][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 14143][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 14149][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
sample=4 state=MOUNT_OK rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@10000000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=5 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=6 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=7 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=8 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=9 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=10 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=11 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=12 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=13 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=14 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=15 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=16 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
[ 17543][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0xsample=17 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
37
|
||||||
|
[ 17549][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 17555][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 17979][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 17985][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 17991][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 18415][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 18421][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 18427][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 18851][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 18857][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 18863][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 19287][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 19293][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 19299][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 19723][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 19729][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 19735][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 20159][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 20165][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 20171][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 20595][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 20601][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 20607][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
sample=18 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL
|
||||||
|
[ 21073][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 21079][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 21085][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 21509][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 21515][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 21521][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 21945][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 21951][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 21957][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 22381][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 22387][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 22393][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 22817][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 22823][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 22829][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 23253][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 23259][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 23265][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 23689][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 23695][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 23701][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 24125][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 24131][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 24137][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 24603][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0xsample=19 state=BEGIN_FAIL rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL
|
||||||
|
37
|
||||||
|
[ 24609][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 24615][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 25039][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 25045][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 25051][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 25475][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 25481][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 25487][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 25911][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 25917][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 25923][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 26347][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 26353][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 26359][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 26783][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 26789][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 26795][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 27219][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 27225][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 27231][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 27655][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 27661][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 27667][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
sample=20 state=BEGIN_FAIL rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL
|
||||||
|
[ 28133][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 28139][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 28145][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 28569][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 28575][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 28581][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 29005][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 29011][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 29017][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 29441][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 29447][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 29453][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 29877][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 29883][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 29889][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 30313][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 30319][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 30325][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
sample=21 state=MOUNT_OK rail=ON vbus=5.19 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=FSPI@4000000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=22 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=23 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=24 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=25 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=26 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=27 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=28 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=29 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=30 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=31 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=32 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=33 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=34 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=35 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=36 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=37 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=38 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=39 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
sample=40 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
[ 35143][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0xsample=41 state=MOUNT_OK rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
37
|
||||||
|
[ 35149][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 35155][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 35579][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 35585][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 35591][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 36015][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 36021][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 36027][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 36451][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 36457][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 36463][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 36887][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 36893][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 36899][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 37323][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 37329][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 37335][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 37759][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 37765][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 37771][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 38195][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 38201][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 38207][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
sample=42 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL
|
||||||
|
[ 38673][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 38679][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 38685][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 39109][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 39115][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 39121][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 39545][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 39551][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 39557][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
[ 39981][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x37
|
||||||
|
[ 39987][E][sd_diskio.cpp:199] sdCommand(): Card Failed! cmd: 0x29
|
||||||
|
[ 39993][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (3) The physical drive cannot work
|
||||||
|
(rnsenv) jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam $ date
|
||||||
|
Wed Apr 1 15:08:35 PDT 2026
|
||||||
|
(rnsenv) jlpoole@jp /usr/local/src/microreticulum/microReticulumTbeam $
|
||||||
44
tools/constantTFCard/hw_debug/amy_vs_bob_identifications.txt
Normal file
44
tools/constantTFCard/hw_debug/amy_vs_bob_identifications.txt
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
April 1, 2026 ~ 15:34
|
||||||
|
|
||||||
|
From AMY (broken SD Card):
|
||||||
|
|
||||||
|
[ 15549][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (13) There is no valid FAT volume
|
||||||
|
|
||||||
|
STARTUP REPLAY
|
||||||
|
uptime_ms=15438
|
||||||
|
BOARD IDENTITY
|
||||||
|
chip_model=ESP32-S3
|
||||||
|
chip_revision=0
|
||||||
|
chip_cores=2
|
||||||
|
sdk_version=v4.4.7-dirty
|
||||||
|
cpu_mhz=240
|
||||||
|
flash_size=8388608
|
||||||
|
flash_speed=80000000
|
||||||
|
flash_mode=QIO
|
||||||
|
efuse_mac=68BF5B43CA48
|
||||||
|
chip_id=5BBF68
|
||||||
|
reset_reason=UNKNOWN
|
||||||
|
arduino_board=Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM)
|
||||||
|
sample=34 state=BEGIN_FAIL rail=ON vbus=5.18 batt=0.00 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=none@0 type=NONE size=0MB root=FAIL
|
||||||
|
[ 15618][E][sd_diskio.cpp:806] sdcard_mount(): f_mount failed: (13) There is no valid FAT volume
|
||||||
|
|
||||||
|
from BOB:
|
||||||
|
|
||||||
|
sample=30 state=MOUNT_OK rail=ON vbus=5.03 batt=3.86 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
|
|
||||||
|
STARTUP REPLAY
|
||||||
|
uptime_ms=13167
|
||||||
|
BOARD IDENTITY
|
||||||
|
chip_model=ESP32-S3
|
||||||
|
chip_revision=0
|
||||||
|
chip_cores=2
|
||||||
|
sdk_version=v4.4.7-dirty
|
||||||
|
cpu_mhz=240
|
||||||
|
flash_size=8388608
|
||||||
|
flash_speed=80000000
|
||||||
|
flash_mode=QIO
|
||||||
|
efuse_mac=DC935A43CA48
|
||||||
|
chip_id=5A93DC
|
||||||
|
reset_reason=UNKNOWN
|
||||||
|
arduino_board=Espressif ESP32-S3-DevKitC-1-N8 (8 MB QD, No PSRAM)
|
||||||
|
sample=31 state=MOUNT_OK rail=ON vbus=5.03 batt=3.86 pins=1/0/1/0 probeH(ff=8 z=0 o=0 FF FF FF FF) probeF(ff=8 z=0 o=0 FF FF FF FF) mount=HSPI@400000 type=SDHC size=14910MB root=OK
|
||||||
31
tools/constantTFCard/hw_debug/platformio.ini
Normal file
31
tools/constantTFCard/hw_debug/platformio.ini
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
; 20260401 Codex
|
||||||
|
; constantTFCard hardware debug monitor
|
||||||
|
|
||||||
|
[platformio]
|
||||||
|
default_envs = amy
|
||||||
|
|
||||||
|
[env]
|
||||||
|
platform = espressif32
|
||||||
|
framework = arduino
|
||||||
|
board = esp32-s3-devkitc-1
|
||||||
|
monitor_speed = 115200
|
||||||
|
lib_deps =
|
||||||
|
lewisxhe/XPowersLib@0.3.3
|
||||||
|
Wire
|
||||||
|
olikraus/U8g2@^2.36.4
|
||||||
|
|
||||||
|
build_flags =
|
||||||
|
-I ../../../shared/boards
|
||||||
|
-I ../../../external/microReticulum_Firmware
|
||||||
|
-D BOARD_MODEL=BOARD_TBEAM_S_V1
|
||||||
|
-D OLED_SDA=17
|
||||||
|
-D OLED_SCL=18
|
||||||
|
-D OLED_ADDR=0x3C
|
||||||
|
-D ARDUINO_USB_MODE=1
|
||||||
|
-D ARDUINO_USB_CDC_ON_BOOT=1
|
||||||
|
|
||||||
|
[env:amy]
|
||||||
|
extends = env
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-D NODE_LABEL=\"AMY\"
|
||||||
443
tools/constantTFCard/hw_debug/src/main.cpp
Normal file
443
tools/constantTFCard/hw_debug/src/main.cpp
Normal file
|
|
@ -0,0 +1,443 @@
|
||||||
|
// 20260401 Codex
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <esp_system.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <SD.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <U8g2lib.h>
|
||||||
|
#include <driver/gpio.h>
|
||||||
|
|
||||||
|
#include "tbeam_supreme_adapter.h"
|
||||||
|
|
||||||
|
#ifndef NODE_LABEL
|
||||||
|
#define NODE_LABEL "NODE"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OLED_SDA
|
||||||
|
#define OLED_SDA 17
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OLED_SCL
|
||||||
|
#define OLED_SCL 18
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const uint32_t kSerialDelayMs = 1500;
|
||||||
|
static const uint32_t kPollIntervalMs = 200;
|
||||||
|
static const uint32_t kStartupQuietMs = 5000;
|
||||||
|
static const uint32_t kStartupReplayWindowMs = 20000;
|
||||||
|
static const uint32_t kStartupReplayPeriodMs = 2000;
|
||||||
|
|
||||||
|
static const uint32_t kFreqs[] = {
|
||||||
|
400000,
|
||||||
|
1000000,
|
||||||
|
4000000,
|
||||||
|
10000000
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PinSnapshot {
|
||||||
|
int cs = -1;
|
||||||
|
int sck = -1;
|
||||||
|
int miso = -1;
|
||||||
|
int mosi = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ProbeSummary {
|
||||||
|
uint8_t ffCount = 0;
|
||||||
|
uint8_t zeroCount = 0;
|
||||||
|
uint8_t otherCount = 0;
|
||||||
|
uint8_t firstBytes[8] = {0};
|
||||||
|
};
|
||||||
|
|
||||||
|
enum class DebugState : uint8_t {
|
||||||
|
PMU_FAIL = 0,
|
||||||
|
RAIL_OFF,
|
||||||
|
BUS_FLOAT,
|
||||||
|
BUS_LOW,
|
||||||
|
BUS_CHATTER,
|
||||||
|
SD_BEGIN_FAIL,
|
||||||
|
CARD_NONE,
|
||||||
|
FS_FAIL,
|
||||||
|
MOUNT_OK
|
||||||
|
};
|
||||||
|
|
||||||
|
struct DebugSnapshot {
|
||||||
|
DebugState state = DebugState::PMU_FAIL;
|
||||||
|
bool pmuOk = false;
|
||||||
|
bool railOn = false;
|
||||||
|
float vbusV = -1.0f;
|
||||||
|
float battV = -1.0f;
|
||||||
|
PinSnapshot pins{};
|
||||||
|
ProbeSummary probeH{};
|
||||||
|
ProbeSummary probeF{};
|
||||||
|
const char* mountBus = "none";
|
||||||
|
uint32_t mountHz = 0;
|
||||||
|
uint8_t cardType = CARD_NONE;
|
||||||
|
uint64_t cardSizeMB = 0;
|
||||||
|
bool rootOk = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
static XPowersLibInterface* g_pmu = nullptr;
|
||||||
|
static U8G2_SH1106_128X64_NONAME_F_HW_I2C g_oled(U8G2_R0, U8X8_PIN_NONE);
|
||||||
|
static SPIClass g_spiH(HSPI);
|
||||||
|
static SPIClass g_spiF(FSPI);
|
||||||
|
static uint32_t g_sampleCount = 0;
|
||||||
|
static uint32_t g_bootMs = 0;
|
||||||
|
static uint32_t g_lastStartupReplayMs = 0;
|
||||||
|
|
||||||
|
static const char* resetReasonToString(esp_reset_reason_t reason) {
|
||||||
|
switch (reason) {
|
||||||
|
case ESP_RST_UNKNOWN: return "UNKNOWN";
|
||||||
|
case ESP_RST_POWERON: return "POWERON";
|
||||||
|
case ESP_RST_EXT: return "EXT";
|
||||||
|
case ESP_RST_SW: return "SW";
|
||||||
|
case ESP_RST_PANIC: return "PANIC";
|
||||||
|
case ESP_RST_INT_WDT: return "INT_WDT";
|
||||||
|
case ESP_RST_TASK_WDT: return "TASK_WDT";
|
||||||
|
case ESP_RST_WDT: return "WDT";
|
||||||
|
case ESP_RST_DEEPSLEEP: return "DEEPSLEEP";
|
||||||
|
case ESP_RST_BROWNOUT: return "BROWNOUT";
|
||||||
|
case ESP_RST_SDIO: return "SDIO";
|
||||||
|
default: return "OTHER";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* flashModeToString(FlashMode_t mode) {
|
||||||
|
switch (mode) {
|
||||||
|
case FM_QIO: return "QIO";
|
||||||
|
case FM_QOUT: return "QOUT";
|
||||||
|
case FM_DIO: return "DIO";
|
||||||
|
case FM_DOUT: return "DOUT";
|
||||||
|
case FM_FAST_READ: return "FAST";
|
||||||
|
case FM_SLOW_READ: return "SLOW";
|
||||||
|
default: return "UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printBoardIdentity() {
|
||||||
|
uint64_t mac = ESP.getEfuseMac();
|
||||||
|
uint32_t chipId = 0;
|
||||||
|
for (int i = 0; i < 17; i += 8) {
|
||||||
|
chipId |= ((mac >> (40 - i)) & 0xFF) << i;
|
||||||
|
}
|
||||||
|
|
||||||
|
Serial.println("BOARD IDENTITY");
|
||||||
|
Serial.printf("chip_model=%s\r\n", ESP.getChipModel());
|
||||||
|
Serial.printf("chip_revision=%u\r\n", (unsigned)ESP.getChipRevision());
|
||||||
|
Serial.printf("chip_cores=%u\r\n", (unsigned)ESP.getChipCores());
|
||||||
|
Serial.printf("sdk_version=%s\r\n", ESP.getSdkVersion());
|
||||||
|
Serial.printf("cpu_mhz=%u\r\n", (unsigned)ESP.getCpuFreqMHz());
|
||||||
|
Serial.printf("flash_size=%u\r\n", (unsigned)ESP.getFlashChipSize());
|
||||||
|
Serial.printf("flash_speed=%u\r\n", (unsigned)ESP.getFlashChipSpeed());
|
||||||
|
Serial.printf("flash_mode=%s\r\n", flashModeToString(ESP.getFlashChipMode()));
|
||||||
|
Serial.printf("efuse_mac=%012llX\r\n", mac);
|
||||||
|
Serial.printf("chip_id=%06lX\r\n", (unsigned long)chipId);
|
||||||
|
Serial.printf("reset_reason=%s\r\n", resetReasonToString(esp_reset_reason()));
|
||||||
|
Serial.printf("arduino_board=%s\r\n", ARDUINO_BOARD);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printStartupBanner() {
|
||||||
|
Serial.println();
|
||||||
|
Serial.println("STARTUP REPLAY");
|
||||||
|
Serial.printf("uptime_ms=%lu\r\n", (unsigned long)(millis() - g_bootMs));
|
||||||
|
printBoardIdentity();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void forceSpiDeselected() {
|
||||||
|
pinMode(tbeam_supreme::sdCs(), OUTPUT);
|
||||||
|
digitalWrite(tbeam_supreme::sdCs(), HIGH);
|
||||||
|
pinMode(tbeam_supreme::imuCs(), OUTPUT);
|
||||||
|
digitalWrite(tbeam_supreme::imuCs(), HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static PinSnapshot readPins() {
|
||||||
|
PinSnapshot s;
|
||||||
|
s.cs = gpio_get_level((gpio_num_t)tbeam_supreme::sdCs());
|
||||||
|
s.sck = gpio_get_level((gpio_num_t)tbeam_supreme::sdSck());
|
||||||
|
s.miso = gpio_get_level((gpio_num_t)tbeam_supreme::sdMiso());
|
||||||
|
s.mosi = gpio_get_level((gpio_num_t)tbeam_supreme::sdMosi());
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void readPmu(DebugSnapshot& snap) {
|
||||||
|
snap.pmuOk = (g_pmu != nullptr);
|
||||||
|
if (!g_pmu) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
snap.railOn = g_pmu->isPowerChannelEnable(XPOWERS_BLDO1);
|
||||||
|
snap.vbusV = g_pmu->getVbusVoltage() / 1000.0f;
|
||||||
|
snap.battV = g_pmu->getBattVoltage() / 1000.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ProbeSummary runIdleProbe(SPIClass& bus) {
|
||||||
|
ProbeSummary out;
|
||||||
|
|
||||||
|
SD.end();
|
||||||
|
bus.end();
|
||||||
|
delay(2);
|
||||||
|
forceSpiDeselected();
|
||||||
|
|
||||||
|
bus.begin(
|
||||||
|
tbeam_supreme::sdSck(),
|
||||||
|
tbeam_supreme::sdMiso(),
|
||||||
|
tbeam_supreme::sdMosi(),
|
||||||
|
tbeam_supreme::sdCs()
|
||||||
|
);
|
||||||
|
|
||||||
|
digitalWrite(tbeam_supreme::sdCs(), HIGH);
|
||||||
|
delay(1);
|
||||||
|
for (int i = 0; i < 8; ++i) {
|
||||||
|
uint8_t b = bus.transfer(0xFF);
|
||||||
|
out.firstBytes[i] = b;
|
||||||
|
if (b == 0xFF) out.ffCount++;
|
||||||
|
else if (b == 0x00) out.zeroCount++;
|
||||||
|
else out.otherCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* cardTypeToString(uint8_t type) {
|
||||||
|
switch (type) {
|
||||||
|
case CARD_MMC: return "MMC";
|
||||||
|
case CARD_SD: return "SDSC";
|
||||||
|
case CARD_SDHC: return "SDHC";
|
||||||
|
default: return "NONE";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool tryMount(SPIClass& bus,
|
||||||
|
const char* busName,
|
||||||
|
uint32_t hz,
|
||||||
|
DebugSnapshot& snap) {
|
||||||
|
SD.end();
|
||||||
|
bus.end();
|
||||||
|
delay(2);
|
||||||
|
forceSpiDeselected();
|
||||||
|
|
||||||
|
bus.begin(
|
||||||
|
tbeam_supreme::sdSck(),
|
||||||
|
tbeam_supreme::sdMiso(),
|
||||||
|
tbeam_supreme::sdMosi(),
|
||||||
|
tbeam_supreme::sdCs()
|
||||||
|
);
|
||||||
|
|
||||||
|
digitalWrite(tbeam_supreme::sdCs(), HIGH);
|
||||||
|
delay(1);
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
bus.transfer(0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SD.begin(tbeam_supreme::sdCs(), bus, hz)) {
|
||||||
|
snap.state = DebugState::SD_BEGIN_FAIL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
snap.cardType = SD.cardType();
|
||||||
|
snap.mountBus = busName;
|
||||||
|
snap.mountHz = hz;
|
||||||
|
if (snap.cardType == CARD_NONE) {
|
||||||
|
SD.end();
|
||||||
|
snap.state = DebugState::CARD_NONE;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
snap.cardSizeMB = SD.cardSize() / (1024ULL * 1024ULL);
|
||||||
|
|
||||||
|
File root = SD.open("/", FILE_READ);
|
||||||
|
snap.rootOk = (bool)root;
|
||||||
|
if (root) {
|
||||||
|
root.close();
|
||||||
|
}
|
||||||
|
SD.end();
|
||||||
|
|
||||||
|
snap.state = snap.rootOk ? DebugState::MOUNT_OK : DebugState::FS_FAIL;
|
||||||
|
return snap.rootOk;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DebugState classifyProbe(const ProbeSummary& probe) {
|
||||||
|
if (probe.ffCount == 8) return DebugState::BUS_FLOAT;
|
||||||
|
if (probe.zeroCount == 8) return DebugState::BUS_LOW;
|
||||||
|
return DebugState::BUS_CHATTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DebugSnapshot captureSnapshot() {
|
||||||
|
DebugSnapshot snap;
|
||||||
|
readPmu(snap);
|
||||||
|
snap.pins = readPins();
|
||||||
|
|
||||||
|
if (!snap.pmuOk) {
|
||||||
|
snap.state = DebugState::PMU_FAIL;
|
||||||
|
return snap;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!snap.railOn) {
|
||||||
|
snap.state = DebugState::RAIL_OFF;
|
||||||
|
return snap;
|
||||||
|
}
|
||||||
|
|
||||||
|
snap.probeH = runIdleProbe(g_spiH);
|
||||||
|
snap.probeF = runIdleProbe(g_spiF);
|
||||||
|
snap.state = classifyProbe(snap.probeH);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < (sizeof(kFreqs) / sizeof(kFreqs[0])); ++i) {
|
||||||
|
if (tryMount(g_spiH, "HSPI", kFreqs[i], snap)) {
|
||||||
|
return snap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < (sizeof(kFreqs) / sizeof(kFreqs[0])); ++i) {
|
||||||
|
if (tryMount(g_spiF, "FSPI", kFreqs[i], snap)) {
|
||||||
|
return snap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return snap;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char* stateToString(DebugState state) {
|
||||||
|
switch (state) {
|
||||||
|
case DebugState::PMU_FAIL: return "PMU_FAIL";
|
||||||
|
case DebugState::RAIL_OFF: return "RAIL_OFF";
|
||||||
|
case DebugState::BUS_FLOAT: return "NO_RESP";
|
||||||
|
case DebugState::BUS_LOW: return "BUS_LOW";
|
||||||
|
case DebugState::BUS_CHATTER: return "BUS_CHAT";
|
||||||
|
case DebugState::SD_BEGIN_FAIL: return "BEGIN_FAIL";
|
||||||
|
case DebugState::CARD_NONE: return "CARD_NONE";
|
||||||
|
case DebugState::FS_FAIL: return "FS_FAIL";
|
||||||
|
case DebugState::MOUNT_OK: return "MOUNT_OK";
|
||||||
|
default: return "UNKNOWN";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void printSnapshot(const DebugSnapshot& snap) {
|
||||||
|
Serial.printf(
|
||||||
|
"sample=%lu state=%s rail=%s vbus=%.2f batt=%.2f pins=%d/%d/%d/%d "
|
||||||
|
"probeH(ff=%u z=%u o=%u %02X %02X %02X %02X) "
|
||||||
|
"probeF(ff=%u z=%u o=%u %02X %02X %02X %02X) "
|
||||||
|
"mount=%s@%lu type=%s size=%lluMB root=%s\r\n",
|
||||||
|
(unsigned long)g_sampleCount,
|
||||||
|
stateToString(snap.state),
|
||||||
|
snap.railOn ? "ON" : "OFF",
|
||||||
|
snap.vbusV,
|
||||||
|
snap.battV,
|
||||||
|
snap.pins.cs,
|
||||||
|
snap.pins.sck,
|
||||||
|
snap.pins.miso,
|
||||||
|
snap.pins.mosi,
|
||||||
|
(unsigned)snap.probeH.ffCount,
|
||||||
|
(unsigned)snap.probeH.zeroCount,
|
||||||
|
(unsigned)snap.probeH.otherCount,
|
||||||
|
snap.probeH.firstBytes[0],
|
||||||
|
snap.probeH.firstBytes[1],
|
||||||
|
snap.probeH.firstBytes[2],
|
||||||
|
snap.probeH.firstBytes[3],
|
||||||
|
(unsigned)snap.probeF.ffCount,
|
||||||
|
(unsigned)snap.probeF.zeroCount,
|
||||||
|
(unsigned)snap.probeF.otherCount,
|
||||||
|
snap.probeF.firstBytes[0],
|
||||||
|
snap.probeF.firstBytes[1],
|
||||||
|
snap.probeF.firstBytes[2],
|
||||||
|
snap.probeF.firstBytes[3],
|
||||||
|
snap.mountBus,
|
||||||
|
(unsigned long)snap.mountHz,
|
||||||
|
cardTypeToString(snap.cardType),
|
||||||
|
snap.cardSizeMB,
|
||||||
|
snap.rootOk ? "OK" : "FAIL"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void showSnapshot(const DebugSnapshot& snap) {
|
||||||
|
char line1[24];
|
||||||
|
char line2[24];
|
||||||
|
char line3[24];
|
||||||
|
char line4[24];
|
||||||
|
char line5[24];
|
||||||
|
|
||||||
|
snprintf(line1, sizeof(line1), "%s TF HWDBG", NODE_LABEL);
|
||||||
|
snprintf(line2, sizeof(line2), "STATE %s", stateToString(snap.state));
|
||||||
|
snprintf(line3, sizeof(line3), "H %u/%u/%u F %u/%u/%u",
|
||||||
|
(unsigned)snap.probeH.ffCount,
|
||||||
|
(unsigned)snap.probeH.zeroCount,
|
||||||
|
(unsigned)snap.probeH.otherCount,
|
||||||
|
(unsigned)snap.probeF.ffCount,
|
||||||
|
(unsigned)snap.probeF.zeroCount,
|
||||||
|
(unsigned)snap.probeF.otherCount);
|
||||||
|
snprintf(line4, sizeof(line4), "%s %luk %s",
|
||||||
|
snap.mountBus,
|
||||||
|
(unsigned long)(snap.mountHz / 1000UL),
|
||||||
|
cardTypeToString(snap.cardType));
|
||||||
|
snprintf(line5, sizeof(line5), "P %d%d%d%d R%s %lu",
|
||||||
|
snap.pins.cs,
|
||||||
|
snap.pins.sck,
|
||||||
|
snap.pins.miso,
|
||||||
|
snap.pins.mosi,
|
||||||
|
snap.railOn ? "1" : "0",
|
||||||
|
(unsigned long)g_sampleCount);
|
||||||
|
|
||||||
|
g_oled.clearBuffer();
|
||||||
|
g_oled.setFont(u8g2_font_5x8_tf);
|
||||||
|
g_oled.drawUTF8(0, 12, line1);
|
||||||
|
g_oled.drawUTF8(0, 24, line2);
|
||||||
|
g_oled.drawUTF8(0, 36, line3);
|
||||||
|
g_oled.drawUTF8(0, 48, line4);
|
||||||
|
g_oled.drawUTF8(0, 60, line5);
|
||||||
|
g_oled.sendBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
g_bootMs = millis();
|
||||||
|
delay(kSerialDelayMs);
|
||||||
|
|
||||||
|
Wire.begin(OLED_SDA, OLED_SCL);
|
||||||
|
g_oled.begin();
|
||||||
|
g_oled.clearDisplay();
|
||||||
|
|
||||||
|
tbeam_supreme::initPmuForPeripherals(g_pmu, &Serial);
|
||||||
|
forceSpiDeselected();
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
Serial.println("constantTFCard hardware debug");
|
||||||
|
Serial.printf("Node: %s\r\n", NODE_LABEL);
|
||||||
|
Serial.printf("Poll interval: %lu ms\r\n", (unsigned long)kPollIntervalMs);
|
||||||
|
Serial.println("States: PMU_FAIL RAIL_OFF NO_RESP BUS_LOW BUS_CHAT BEGIN_FAIL CARD_NONE FS_FAIL MOUNT_OK");
|
||||||
|
Serial.printf("Startup quiet delay: %lu ms\r\n", (unsigned long)kStartupQuietMs);
|
||||||
|
Serial.printf("Startup replay window: %lu ms\r\n", (unsigned long)kStartupReplayWindowMs);
|
||||||
|
|
||||||
|
g_oled.clearBuffer();
|
||||||
|
g_oled.setFont(u8g2_font_5x8_tf);
|
||||||
|
g_oled.drawUTF8(0, 12, "TF HWDBG");
|
||||||
|
g_oled.drawUTF8(0, 24, "startup hold");
|
||||||
|
g_oled.drawUTF8(0, 36, "attach monitor");
|
||||||
|
g_oled.drawUTF8(0, 48, "waiting...");
|
||||||
|
g_oled.sendBuffer();
|
||||||
|
|
||||||
|
delay(kStartupQuietMs);
|
||||||
|
printStartupBanner();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
static uint32_t lastPollMs = 0;
|
||||||
|
|
||||||
|
uint32_t now = millis();
|
||||||
|
if (now - lastPollMs < kPollIntervalMs) {
|
||||||
|
delay(5);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastPollMs = now;
|
||||||
|
g_sampleCount++;
|
||||||
|
|
||||||
|
DebugSnapshot snap = captureSnapshot();
|
||||||
|
|
||||||
|
if (now - g_bootMs <= kStartupReplayWindowMs &&
|
||||||
|
now - g_lastStartupReplayMs >= kStartupReplayPeriodMs) {
|
||||||
|
g_lastStartupReplayMs = now;
|
||||||
|
printStartupBanner();
|
||||||
|
}
|
||||||
|
|
||||||
|
printSnapshot(snap);
|
||||||
|
showSnapshot(snap);
|
||||||
|
}
|
||||||
31
tools/constantTFCard/platformio.ini
Normal file
31
tools/constantTFCard/platformio.ini
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
; 20260401 Codex
|
||||||
|
; constantTFCard
|
||||||
|
|
||||||
|
[platformio]
|
||||||
|
default_envs = amy
|
||||||
|
|
||||||
|
[env]
|
||||||
|
platform = espressif32
|
||||||
|
framework = arduino
|
||||||
|
board = esp32-s3-devkitc-1
|
||||||
|
monitor_speed = 115200
|
||||||
|
lib_deps =
|
||||||
|
lewisxhe/XPowersLib@0.3.3
|
||||||
|
Wire
|
||||||
|
olikraus/U8g2@^2.36.4
|
||||||
|
|
||||||
|
build_flags =
|
||||||
|
-I ../../shared/boards
|
||||||
|
-I ../../external/microReticulum_Firmware
|
||||||
|
-D BOARD_MODEL=BOARD_TBEAM_S_V1
|
||||||
|
-D OLED_SDA=17
|
||||||
|
-D OLED_SCL=18
|
||||||
|
-D OLED_ADDR=0x3C
|
||||||
|
-D ARDUINO_USB_MODE=1
|
||||||
|
-D ARDUINO_USB_CDC_ON_BOOT=1
|
||||||
|
|
||||||
|
[env:amy]
|
||||||
|
extends = env
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-D NODE_LABEL=\"AMY\"
|
||||||
257
tools/constantTFCard/src/main.cpp
Normal file
257
tools/constantTFCard/src/main.cpp
Normal file
|
|
@ -0,0 +1,257 @@
|
||||||
|
// 20260401 Codex
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <esp_system.h>
|
||||||
|
#include <SPI.h>
|
||||||
|
#include <SD.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
#include <U8g2lib.h>
|
||||||
|
|
||||||
|
#include "tbeam_supreme_adapter.h"
|
||||||
|
|
||||||
|
#ifndef NODE_LABEL
|
||||||
|
#define NODE_LABEL "NODE"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OLED_SDA
|
||||||
|
#define OLED_SDA 17
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef OLED_SCL
|
||||||
|
#define OLED_SCL 18
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const uint32_t kSerialDelayMs = 1500;
|
||||||
|
static const uint32_t kPollIntervalMs = 200;
|
||||||
|
static const uint32_t kSdFreqHz = 400000;
|
||||||
|
static const uint32_t kBootSettleMs = 2000;
|
||||||
|
static const uint32_t kSdRailOffMs = 300;
|
||||||
|
static const uint32_t kSdRailOnSettleMs = 1200;
|
||||||
|
static const uint8_t kOutVotesBeforeRailCycle = 10;
|
||||||
|
static const uint32_t kMinRailCycleGapMs = 5000;
|
||||||
|
|
||||||
|
static const uint32_t kDelayedRetryOffsetsMs[] = {
|
||||||
|
1000,
|
||||||
|
3000,
|
||||||
|
7000,
|
||||||
|
15000
|
||||||
|
};
|
||||||
|
|
||||||
|
static XPowersLibInterface* g_pmu = nullptr;
|
||||||
|
static U8G2_SH1106_128X64_NONAME_F_HW_I2C g_oled(U8G2_R0, U8X8_PIN_NONE);
|
||||||
|
static SPIClass g_sdSpi(HSPI);
|
||||||
|
static uint32_t g_bootMs = 0;
|
||||||
|
static size_t g_nextDelayedRetry = 0;
|
||||||
|
static uint32_t g_lastRailCycleMs = 0;
|
||||||
|
static uint8_t g_consecutiveOut = 0;
|
||||||
|
|
||||||
|
static void forceSpiDeselected() {
|
||||||
|
pinMode(tbeam_supreme::sdCs(), OUTPUT);
|
||||||
|
digitalWrite(tbeam_supreme::sdCs(), HIGH);
|
||||||
|
pinMode(tbeam_supreme::imuCs(), OUTPUT);
|
||||||
|
digitalWrite(tbeam_supreme::imuCs(), HIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void oledShowStatus(const char* status, uint32_t sampleCount) {
|
||||||
|
char line1[24];
|
||||||
|
char line2[24];
|
||||||
|
char line3[24];
|
||||||
|
|
||||||
|
snprintf(line1, sizeof(line1), "%s TF CARD", NODE_LABEL);
|
||||||
|
snprintf(line2, sizeof(line2), "%s", status);
|
||||||
|
snprintf(line3, sizeof(line3), "sample %lu", (unsigned long)sampleCount);
|
||||||
|
|
||||||
|
g_oled.clearBuffer();
|
||||||
|
g_oled.setFont(u8g2_font_6x12_tf);
|
||||||
|
g_oled.drawUTF8(0, 14, line1);
|
||||||
|
g_oled.setFont(u8g2_font_logisoso20_tf);
|
||||||
|
g_oled.drawUTF8(0, 42, status);
|
||||||
|
g_oled.setFont(u8g2_font_6x12_tf);
|
||||||
|
g_oled.drawUTF8(0, 62, line3);
|
||||||
|
g_oled.sendBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void oledShowBootPhase(const char* line2, const char* line3) {
|
||||||
|
char line1[24];
|
||||||
|
|
||||||
|
snprintf(line1, sizeof(line1), "%s TF CARD", NODE_LABEL);
|
||||||
|
|
||||||
|
g_oled.clearBuffer();
|
||||||
|
g_oled.setFont(u8g2_font_6x12_tf);
|
||||||
|
g_oled.drawUTF8(0, 14, line1);
|
||||||
|
if (line2) g_oled.drawUTF8(0, 32, line2);
|
||||||
|
if (line3) g_oled.drawUTF8(0, 50, line3);
|
||||||
|
g_oled.sendBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool cardReadable() {
|
||||||
|
SD.end();
|
||||||
|
g_sdSpi.end();
|
||||||
|
delay(2);
|
||||||
|
|
||||||
|
forceSpiDeselected();
|
||||||
|
g_sdSpi.begin(
|
||||||
|
tbeam_supreme::sdSck(),
|
||||||
|
tbeam_supreme::sdMiso(),
|
||||||
|
tbeam_supreme::sdMosi(),
|
||||||
|
tbeam_supreme::sdCs()
|
||||||
|
);
|
||||||
|
|
||||||
|
digitalWrite(tbeam_supreme::sdCs(), HIGH);
|
||||||
|
delay(1);
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
g_sdSpi.transfer(0xFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SD.begin(tbeam_supreme::sdCs(), g_sdSpi, kSdFreqHz)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SD.cardType() == CARD_NONE) {
|
||||||
|
SD.end();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
File root = SD.open("/", FILE_READ);
|
||||||
|
bool ok = (bool)root;
|
||||||
|
if (root) {
|
||||||
|
root.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
SD.end();
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool cycleSdRail() {
|
||||||
|
if (!g_pmu) {
|
||||||
|
Serial.println("rail cycle skipped: no PMU");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
SD.end();
|
||||||
|
g_sdSpi.end();
|
||||||
|
forceSpiDeselected();
|
||||||
|
|
||||||
|
g_pmu->disablePowerOutput(XPOWERS_BLDO1);
|
||||||
|
delay(kSdRailOffMs);
|
||||||
|
g_pmu->setPowerChannelVoltage(XPOWERS_BLDO1, 3300);
|
||||||
|
g_pmu->enablePowerOutput(XPOWERS_BLDO1);
|
||||||
|
delay(kSdRailOnSettleMs);
|
||||||
|
forceSpiDeselected();
|
||||||
|
|
||||||
|
g_lastRailCycleMs = millis();
|
||||||
|
Serial.printf("rail cycle: off=%lu on_settle=%lu\r\n",
|
||||||
|
(unsigned long)kSdRailOffMs,
|
||||||
|
(unsigned long)kSdRailOnSettleMs);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void runDelayedRetry(const char* label) {
|
||||||
|
bool readable = cardReadable();
|
||||||
|
const char* status = readable ? "card IN" : "card OUT";
|
||||||
|
Serial.printf("delayed retry %s -> %s\r\n", label, status);
|
||||||
|
oledShowStatus(status, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handleSerialCommands() {
|
||||||
|
while (Serial.available() > 0) {
|
||||||
|
int ch = Serial.read();
|
||||||
|
if (ch == 'r' || ch == 'R') {
|
||||||
|
Serial.println("manual command: SD rail reset");
|
||||||
|
oledShowBootPhase("manual SD reset", "re-probing");
|
||||||
|
if (cycleSdRail()) {
|
||||||
|
bool readable = cardReadable();
|
||||||
|
Serial.printf("manual SD reset -> %s\r\n", readable ? "card IN" : "card OUT");
|
||||||
|
oledShowStatus(readable ? "card IN" : "card OUT", 0);
|
||||||
|
}
|
||||||
|
} else if (ch == 'b' || ch == 'B') {
|
||||||
|
Serial.println("manual command: full reboot");
|
||||||
|
Serial.println("restarting now...");
|
||||||
|
oledShowBootPhase("manual reboot", "restarting");
|
||||||
|
delay(250);
|
||||||
|
ESP.restart();
|
||||||
|
} else if (ch == '\r' || ch == '\n') {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
Serial.printf("commands: r=sd reset, b=reboot (got '%c')\r\n", (char)ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
Serial.begin(115200);
|
||||||
|
delay(kSerialDelayMs);
|
||||||
|
|
||||||
|
Wire.begin(OLED_SDA, OLED_SCL);
|
||||||
|
g_oled.begin();
|
||||||
|
g_oled.clearDisplay();
|
||||||
|
oledShowBootPhase("BOOT", "init");
|
||||||
|
|
||||||
|
tbeam_supreme::initPmuForPeripherals(g_pmu, &Serial);
|
||||||
|
forceSpiDeselected();
|
||||||
|
g_bootMs = millis();
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
Serial.println("constantTFCard");
|
||||||
|
Serial.printf("Node: %s\r\n", NODE_LABEL);
|
||||||
|
Serial.printf("Polling every %lu ms\r\n", (unsigned long)kPollIntervalMs);
|
||||||
|
Serial.printf("Initial settle delay %lu ms\r\n", (unsigned long)kBootSettleMs);
|
||||||
|
Serial.println("Commands: r=SD rail reset, b=full reboot");
|
||||||
|
|
||||||
|
oledShowBootPhase("BOOT", "settling SD rail");
|
||||||
|
delay(kBootSettleMs);
|
||||||
|
|
||||||
|
runDelayedRetry("after_settle");
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
static uint32_t lastPollMs = 0;
|
||||||
|
static uint32_t sampleCount = 0;
|
||||||
|
|
||||||
|
handleSerialCommands();
|
||||||
|
|
||||||
|
uint32_t now = millis();
|
||||||
|
|
||||||
|
if (g_nextDelayedRetry < (sizeof(kDelayedRetryOffsetsMs) / sizeof(kDelayedRetryOffsetsMs[0])) &&
|
||||||
|
now - g_bootMs >= kDelayedRetryOffsetsMs[g_nextDelayedRetry]) {
|
||||||
|
char label[20];
|
||||||
|
snprintf(label, sizeof(label), "t+%lus", (unsigned long)(kDelayedRetryOffsetsMs[g_nextDelayedRetry] / 1000));
|
||||||
|
runDelayedRetry(label);
|
||||||
|
g_nextDelayedRetry++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (now - lastPollMs < kPollIntervalMs) {
|
||||||
|
delay(5);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastPollMs = now;
|
||||||
|
sampleCount++;
|
||||||
|
|
||||||
|
bool readable = cardReadable();
|
||||||
|
if (readable) {
|
||||||
|
g_consecutiveOut = 0;
|
||||||
|
} else if (g_consecutiveOut < 255) {
|
||||||
|
g_consecutiveOut++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!readable &&
|
||||||
|
g_consecutiveOut >= kOutVotesBeforeRailCycle &&
|
||||||
|
now - g_lastRailCycleMs >= kMinRailCycleGapMs) {
|
||||||
|
Serial.printf("persistent OUT: %u polls, forcing SD rail cycle\r\n",
|
||||||
|
(unsigned)g_consecutiveOut);
|
||||||
|
oledShowBootPhase("OUT -> rail reset", "re-probing SD");
|
||||||
|
|
||||||
|
if (cycleSdRail()) {
|
||||||
|
bool retryReadable = cardReadable();
|
||||||
|
readable = retryReadable;
|
||||||
|
g_consecutiveOut = retryReadable ? 0 : kOutVotesBeforeRailCycle;
|
||||||
|
Serial.printf("after rail cycle -> %s\r\n", retryReadable ? "card IN" : "card OUT");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* status = readable ? "card IN" : "card OUT";
|
||||||
|
|
||||||
|
Serial.println(status);
|
||||||
|
oledShowStatus(status, sampleCount);
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue