@@ -58,16 +58,13 @@ void setup() {
5858 writeSerial (" Starting setup..." );
5959 full_config_init ();
6060 initio ();
61- #ifdef TARGET_NRF
62- // SoftDevice must start before display/SPI; advertising starts after boot screen.
63- ble_nrf_stack_init ();
64- #endif
6561 initDisplay ();
6662 writeSerial (" Display initialized" );
6763#ifdef TARGET_ESP32
6864 // Full BLE after display: ESP32 queues commands for loop() until setup returns.
6965 ble_init ();
7066#elif defined(TARGET_NRF)
67+ ble_nrf_stack_init ();
7168 ble_nrf_advertising_start ();
7269#endif
7370 #ifdef TARGET_ESP32
@@ -304,6 +301,34 @@ void enterDeepSleep() {
304301}
305302#endif
306303
304+ // Panel rail is cut after this — drive control lines LOW; BUSY stays an input.
305+ static void configureDisplayPinsLowPower () {
306+ const DisplayConfig& d = globalConfig.displays [0 ];
307+ const uint8_t pins[] = {
308+ d.cs_pin , d.clk_pin , d.data_pin , d.dc_pin , d.reset_pin ,
309+ };
310+ for (uint8_t pin : pins) {
311+ if (pin == 0xFF ) continue ;
312+ pinMode (pin, OUTPUT );
313+ digitalWrite (pin, LOW );
314+ }
315+ if (d.busy_pin != 0xFF ) {
316+ pinMode (d.busy_pin , INPUT );
317+ }
318+
319+ if (!(globalConfig.system_config .device_flags & DEVICE_FLAG_BATTERY_LATCH )) {
320+ const uint8_t auxPins[] = {
321+ globalConfig.system_config .pwr_pin_2 ,
322+ globalConfig.system_config .pwr_pin_3 ,
323+ };
324+ for (uint8_t pin : auxPins) {
325+ if (pin == 0xFF || pin == 0 ) continue ;
326+ pinMode (pin, OUTPUT );
327+ digitalWrite (pin, LOW );
328+ }
329+ }
330+ }
331+
307332void pwrmgm (bool onoff){
308333 if (globalConfig.display_count == 0 ){
309334 writeSerial (" No display configured" );
@@ -340,50 +365,53 @@ void pwrmgm(bool onoff){
340365#else
341366 const bool seeed_driver_spi = false ;
342367#endif
343- if (!seeed_driver_spi) {
344- if (onoff){
345- pinMode (globalConfig.displays [0 ].reset_pin , OUTPUT );
346- pinMode (globalConfig.displays [0 ].cs_pin , OUTPUT );
347- if (globalConfig.displays [0 ].dc_pin != 0xFF ) {
348- pinMode (globalConfig.displays [0 ].dc_pin , OUTPUT );
349- }
350- pinMode (globalConfig.displays [0 ].clk_pin , OUTPUT );
351- pinMode (globalConfig.displays [0 ].data_pin , OUTPUT );
352- delay (200 );
368+ const DisplayConfig& disp = globalConfig.displays [0 ];
369+ if (onoff) {
370+ if (globalConfig.system_config .pwr_pin != 0xFF ) {
371+ digitalWrite (globalConfig.system_config .pwr_pin , HIGH );
372+ delay (800 );
373+ } else {
374+ writeSerial (" Power pin not set" );
353375 }
354- else {
355- SPI .end ();
356- Wire.end ();
357- invalidateOpenDisplayWire ();
358- pinMode (globalConfig.displays [0 ].reset_pin , INPUT );
359- pinMode (globalConfig.displays [0 ].cs_pin , INPUT );
360- if (globalConfig.displays [0 ].dc_pin != 0xFF ) {
361- pinMode (globalConfig.displays [0 ].dc_pin , INPUT );
376+ if (!seeed_driver_spi) {
377+ if (disp.reset_pin != 0xFF ) {
378+ pinMode (disp.reset_pin , OUTPUT );
379+ digitalWrite (disp.reset_pin , HIGH );
380+ }
381+ if (disp.cs_pin != 0xFF ) {
382+ pinMode (disp.cs_pin , OUTPUT );
383+ digitalWrite (disp.cs_pin , HIGH );
384+ }
385+ if (disp.dc_pin != 0xFF ) {
386+ pinMode (disp.dc_pin , OUTPUT );
387+ digitalWrite (disp.dc_pin , LOW );
388+ }
389+ if (disp.clk_pin != 0xFF ) {
390+ pinMode (disp.clk_pin , OUTPUT );
391+ digitalWrite (disp.clk_pin , LOW );
362392 }
363- pinMode (globalConfig.displays [0 ].clk_pin , INPUT );
364- pinMode (globalConfig.displays [0 ].data_pin , INPUT );
393+ if (disp.data_pin != 0xFF ) {
394+ pinMode (disp.data_pin , OUTPUT );
395+ digitalWrite (disp.data_pin , LOW );
396+ }
397+ if (disp.busy_pin != 0xFF ) {
398+ pinMode (disp.busy_pin , INPUT );
399+ }
400+ delay (100 );
401+ } else {
402+ delay (200 );
365403 }
366404 } else {
367- if (onoff) {
368- delay (200 );
369- } else {
405+ if (!seeed_driver_spi) {
370406 SPI .end ();
371- Wire.end ();
372- invalidateOpenDisplayWire ();
407+ }
408+ Wire.end ();
409+ invalidateOpenDisplayWire ();
410+ configureDisplayPinsLowPower ();
411+ if (globalConfig.system_config .pwr_pin != 0xFF ) {
412+ digitalWrite (globalConfig.system_config .pwr_pin , LOW );
373413 }
374414 }
375- if (globalConfig.system_config .pwr_pin != 0xFF ){
376- if (onoff){
377- digitalWrite (globalConfig.system_config .pwr_pin , HIGH );
378- delay (200 );
379- }
380- else {
381- digitalWrite (globalConfig.system_config .pwr_pin , LOW );
382- }
383- }
384- else {
385- writeSerial (" Power pin not set" );
386- }
387415}
388416
389417void writeSerial (String message, bool newLine){
@@ -398,15 +426,11 @@ void writeSerial(String message, bool newLine){
398426
399427void xiaoinit (){
400428 powerDownExternalFlash (20 ,24 ,21 ,25 ,22 ,23 );
401- pinMode (31 , INPUT );
402- pinMode (14 , INPUT );
429+ // pinMode(31, INPUT);
430+ // pinMode(14, INPUT);
403431 pinMode (13 , OUTPUT ); // that actually does something
404432 digitalWrite (13 , LOW );
405- pinMode (17 , INPUT );
406- // buttons
407- pinMode (15 , INPUT );
408- pinMode (3 , INPUT );
409- pinMode (28 , INPUT );
433+ // pinMode(17, INPUT);
410434}
411435
412436void ws_pp_init (){
@@ -517,12 +541,18 @@ bool powerDownExternalFlash(uint8_t mosiPin, uint8_t misoPin, uint8_t sckPin, ui
517541 jedecIdAfterStr.toUpperCase ();
518542 writeSerial (" JEDEC ID after: " + jedecIdAfterStr + " (byte[0]=0x" + String (jedecIdAfter[0 ], HEX ) + " , byte[1]=0x" + String (jedecIdAfter[1 ], HEX ) + " , byte[2]=0x" + String (jedecIdAfter[2 ], HEX ) + " )" );
519543 }
520- digitalWrite (csPin, HIGH );
521- pinMode (wpPin, INPUT );
522- pinMode (holdPin, INPUT );
523- pinMode (mosiPin, INPUT );
524- pinMode (misoPin, INPUT );
525- pinMode (sckPin, INPUT );
544+ // CS/WP/HOLD are active-low: keep HIGH so the chip stays deselected and in deep sleep.
545+ // CLK/MOSI/MISO LOW — defined idle levels, no floating buffers on the MCU side.
546+ const uint8_t qspiLow[] = { mosiPin, misoPin, sckPin };
547+ for (uint8_t pin : qspiLow) {
548+ pinMode (pin, OUTPUT );
549+ digitalWrite (pin, LOW );
550+ }
551+ const uint8_t qspiHigh[] = { csPin, wpPin, holdPin };
552+ for (uint8_t pin : qspiHigh) {
553+ pinMode (pin, OUTPUT );
554+ digitalWrite (pin, HIGH );
555+ }
526556 #else
527557 writeSerial (" External flash power-down not implemented for ESP32" );
528558 return false ;
0 commit comments