196 lines
6.6 KiB
Python
196 lines
6.6 KiB
Python
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 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:
|
|
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:
|
|
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:
|
|
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()
|