import sys import machine from machine import Pin, I2C, SPI # Global configuration variables BOARD_TYPE = None # 'HOSYOND', 'WAVESHARE_RLCD', or 'RP2' DISPLAY_TYPE = None # 'ILI9341', 'RLCD', or 'ST7796' DISPLAY_WIDTH = 320 DISPLAY_HEIGHT = 240 # Bus and display references spi_bus = None i2c_bus = None display_instance = None touch = None # Component support flags has_sensor = False has_rtc = False # WS2812 NeoPixel pin led_pin = None # Audio pins, clocks, and codecs config audio_mclk_pin = None audio_mclk_freq = 6144000 audio_i2c_sda = None audio_i2c_scl = None audio_i2s_sck = None audio_i2s_ws = None audio_i2s_tx_sd = None audio_i2s_rx_sd = None audio_amp_pin = None audio_amp_active_level = 0 # 0 = Active Low, 1 = Active High audio_mic_codec = "ES8311" # "ES7210" or "ES8311" def _i2c_recovery(sda_pin, scl_pin): import time scl = Pin(scl_pin, Pin.OUT) sda = Pin(sda_pin, Pin.OUT) scl.value(1) sda.value(1) time.sleep_ms(1) for _ in range(9): scl.value(0) time.sleep_ms(1) scl.value(1) time.sleep_ms(1) scl.value(0) sda.value(0) time.sleep_ms(1) scl.value(1) time.sleep_ms(1) sda.value(1) time.sleep_ms(1) def detect_board(): global BOARD_TYPE, DISPLAY_TYPE, DISPLAY_WIDTH, DISPLAY_HEIGHT global spi_bus, i2c_bus, display_instance, touch global has_sensor, has_rtc, led_pin global audio_mclk_pin, audio_mclk_freq, audio_i2c_sda, audio_i2c_scl global audio_i2s_sck, audio_i2s_ws, audio_i2s_tx_sd, audio_i2s_rx_sd global audio_amp_pin, audio_amp_active_level, audio_mic_codec # 1. Check if running on RP2 platform (e.g. Raspberry Pi Pico / RP2350) if sys.platform == 'rp2': print("Auto-detected: Raspberry Pi RP2 platform") BOARD_TYPE = 'RP2' DISPLAY_TYPE = 'ST7796' DISPLAY_WIDTH = 480 DISPLAY_HEIGHT = 320 led_pin = 25 # Setup SPI spi_bus = SPI(1, baudrate=32000000, polarity=0, phase=0, sck=Pin(10), mosi=Pin(11)) # Setup Display: ST7796 import st7796 display_instance = st7796.ST7796(spi_bus, cs=Pin(7), dc=Pin(4), rst=Pin(9), bl=Pin(6)) # Setup Touch: FT6336U on I2C(1) try: _i2c_recovery(2, 3) touch_i2c = I2C(1, sda=Pin(2), scl=Pin(3), freq=400000) from ft6336u import FT6336U touch = FT6336U(touch_i2c, rst_pin=28, int_pin=25) except Exception as e: print("Failed to initialize touch on RP2:", e) return # 2. We are on ESP32 platform. # Use SoftI2C for dynamic detection scan to avoid hardware I2C pin conflicts from machine import SoftI2C # Try scanning SDA=16, SCL=15 (Hosyond pins) try: _i2c_recovery(16, 15) test_i2c = SoftI2C(sda=Pin(16), scl=Pin(15)) devices = test_i2c.scan() if 0x38 in devices: print("Auto-detected: Hosyond ESP32-S3 Touchscreen board") BOARD_TYPE = 'HOSYOND' DISPLAY_TYPE = 'ILI9341' DISPLAY_WIDTH = 320 DISPLAY_HEIGHT = 240 has_sensor = False has_rtc = False led_pin = 48 # Now initialize SoftI2C i2c_bus = SoftI2C(sda=Pin(16), scl=Pin(15)) # Setup SPI spi_bus = SPI(1, baudrate=40000000, polarity=0, phase=0, sck=Pin(12), mosi=Pin(11), miso=Pin(13)) # Setup Display: ILI9341 import ili9341 display_instance = ili9341.ILI9341(spi_bus, cs=Pin(10), dc=Pin(46), bl=Pin(45), rst=None) # Setup Touch: FT6336U try: from ft6336u import FT6336U touch = FT6336U(i2c_bus, rst_pin=18, int_pin=17, width=320, height=240, swap_xy=True, invert_x=False, invert_y=True) except Exception as te: print("Failed to initialize touchscreen:", te) # Audio pins & clocks configuration audio_mclk_pin = 4 audio_mclk_freq = 6144000 audio_i2c_sda = 16 audio_i2c_scl = 15 audio_i2s_sck = 5 audio_i2s_ws = 7 audio_i2s_tx_sd = 8 audio_i2s_rx_sd = 6 audio_amp_pin = 1 audio_amp_active_level = 0 # Active Low (0 = enabled) audio_mic_codec = "ES8311" return except Exception as e: print("SoftI2C scan on Hosyond pins failed:", e) # 3. Try scanning SDA=13, SCL=14 (Waveshare RLCD pins) try: _i2c_recovery(13, 14) test_i2c = SoftI2C(sda=Pin(13), scl=Pin(14)) devices = test_i2c.scan() if 0x70 in devices or 0x51 in devices: print("Auto-detected: Waveshare ESP32-S3-RLCD-4.2 board") BOARD_TYPE = 'WAVESHARE_RLCD' DISPLAY_TYPE = 'RLCD' DISPLAY_WIDTH = 400 DISPLAY_HEIGHT = 300 has_sensor = True has_rtc = True led_pin = 38 # Setup SPI spi_bus = SPI(1, baudrate=20000000, polarity=0, phase=0, sck=Pin(11), mosi=Pin(12)) # Setup Display: RLCD import rlcd display_instance = rlcd.RLCD(spi_bus, cs=Pin(40), dc=Pin(5), rst=Pin(41)) # Now initialize SoftI2C (after SPI/Display setup to avoid MISO pin conflict on Pin 13) i2c_bus = SoftI2C(sda=Pin(13), scl=Pin(14)) # Audio pins & clocks configuration audio_mclk_pin = 16 audio_mclk_freq = 12288000 audio_i2c_sda = 13 audio_i2c_scl = 14 audio_i2s_sck = 9 audio_i2s_ws = 45 audio_i2s_tx_sd = 8 audio_i2s_rx_sd = 10 audio_amp_pin = 46 audio_amp_active_level = 1 # Active High (1 = enabled) audio_mic_codec = "ES7210" return except Exception as e: print("SoftI2C scan on Waveshare RLCD pins failed:", e) # 4. Fallback default if auto-detection failed completely print("Auto-detection failed. Falling back to Hosyond ESP32-S3 defaults...") BOARD_TYPE = 'HOSYOND' DISPLAY_TYPE = 'ILI9341' DISPLAY_WIDTH = 320 DISPLAY_HEIGHT = 240 led_pin = 48 try: from machine import SoftI2C i2c_bus = SoftI2C(sda=Pin(16), scl=Pin(15)) spi_bus = SPI(1, baudrate=40000000, polarity=0, phase=0, sck=Pin(12), mosi=Pin(11), miso=Pin(13)) import ili9341 display_instance = ili9341.ILI9341(spi_bus, cs=Pin(10), dc=Pin(46), bl=Pin(45), rst=None) from ft6336u import FT6336U touch = FT6336U(i2c_bus, rst_pin=18, int_pin=17, width=320, height=240, swap_xy=True, invert_x=False, invert_y=True) except Exception as e: print("Fallback hardware setup failed:", e) audio_mclk_pin = 4 audio_mclk_freq = 6144000 audio_i2c_sda = 16 audio_i2c_scl = 15 audio_i2s_sck = 5 audio_i2s_ws = 7 audio_i2s_tx_sd = 8 audio_i2s_rx_sd = 6 audio_amp_pin = 1 audio_amp_active_level = 0 audio_mic_codec = "ES8311" # Run dynamic detection immediately on module load detect_board()