Files
mcp_screen/lib/board_config.py
T

219 lines
7.1 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 _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()