2025-06-15 21:31:45 +08:00

310 lines
10 KiB
CMake

cmake_minimum_required(VERSION 3.13)
# Valid builds are PICO, PICOUSB, VGA, VGAUSB, HDMI(rp2350 only), HDMIUSB(rp2350 only), WEB
set(PICOCALC true)
# For dynamic loading from SD card:
# SDBOOT requires the bootloader to be in the first 256KB of flash
# PicoMite will need to be shifted by this amount, and all references to
# positions in flash updated to accomodate. THIS OPTION IS NOT READY YET.
# details: https://github.com/adwuard/Picocalc_SD_Boot
set(SDBOOT true)
# Compile for PICO 1 Board
set(COMPILE PICO)
# Compile for PICO 2 Board
#set(COMPILE PICORP2350)
#set(COMPILE WEBRP2350)
if (COMPILE STREQUAL "HDMI" OR COMPILE STREQUAL "WEBRP2350" OR COMPILE STREQUAL "HDMIUSB" OR COMPILE STREQUAL "VGARP2350" OR COMPILE STREQUAL "VGAUSBRP2350" OR COMPILE STREQUAL "PICORP2350" OR COMPILE STREQUAL "PICOUSBRP2350" )
set(PICO_PLATFORM rp2350)
if (COMPILE STREQUAL "WEBRP2350")
set(PICO_BOARD pico2_w)
else()
set(PICO_BOARD pimoroni_pga2350)
endif()
else()
set(PICO_PLATFORM rp2040)
if (COMPILE STREQUAL "WEB")
set(PICO_BOARD pico_w)
else()
set(PICO_BOARD pico)
endif()
endif()
include(pico_sdk_import.cmake)
project(PicoMite C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
#set(PICO_NO_COPRO_DIS 1)
pico_sdk_init()
add_executable(PicoMite
PicoMite.c
Memory.c
regex.c
MMBasic.c
Operators.c
Custom.c
Functions.c
Commands.c
FileIO.c
ff.c
ffsystem.c
ffunicode.c
mmc_stm32.c
Draw.c
Editor.c
XModem.c
MM_Misc.c
External.c
MATHS.c
Onewire.c
I2C.c
SPI.c
Serial.c
SPI-LCD.c
BmpDecoder.c
GPS.c
Audio.c
CFunction.c
picojpeg.c
lfs.c
lfs_util.c
hxcmod.c
VS1053.c
aes.c
)
if (COMPILE STREQUAL "WEB" OR COMPILE STREQUAL "WEBRP2350" )
target_sources(PicoMite PRIVATE
SSD1963.c
Touch.c
GUI.c
cJSON.c
mqtt.c
MMMqtt.c
MMTCPclient.c
MMtelnet.c
MMntp.c
MMtcpserver.c
tftp.c
MMtftp.c
MMudp.c
)
set_source_files_properties(cJSON.c PROPERTIES COMPILE_FLAGS -Os)
target_include_directories(PicoMite PRIVATE
${CMAKE_CURRENT_LIST_DIR}
${CMAKE_CURRENT_LIST_DIR}/.. # for our common lwipopts
)
Pico_enable_stdio_usb(PicoMite 1)
endif()
if ((COMPILE STREQUAL "PICO") OR (COMPILE STREQUAL "PICOUSB") OR (COMPILE STREQUAL "PICORP2350") OR (COMPILE STREQUAL "PICOUSBRP2350") OR (COMPILE STREQUAL "WEBRP2350"))
target_sources(PicoMite PRIVATE
SSD1963.c
Touch.c
GUI.c)
endif()
if (COMPILE STREQUAL "VGAUSB" OR COMPILE STREQUAL "PICOUSBRP2350" OR COMPILE STREQUAL "VGAUSBRP2350" OR COMPILE STREQUAL "PICOUSB" OR COMPILE STREQUAL "HDMIUSB")
target_sources(PicoMite PRIVATE
USBKeyboard.c
)
else()
target_sources(PicoMite PRIVATE
Keyboard.c
mouse.c
)
endif()
if(COMPILE STREQUAL "VGARP2350" OR COMPILE STREQUAL "WEBRP2350" OR COMPILE STREQUAL "PICORP2350" OR COMPILE STREQUAL "HDMI" OR COMPILE STREQUAL "HDMIUSB" OR COMPILE STREQUAL "VGAUSBRP2350" OR COMPILE STREQUAL "PICOUSBRP2350")
target_sources(PicoMite PRIVATE
upng.c
)
endif()
if(PICOCALC STREQUAL "true")
target_sources(PicoMite PRIVATE
picocalc/i2ckbd.c
)
endif()
set_source_files_properties(mmc_stm32.c PROPERTIES COMPILE_FLAGS -O2)
set_source_files_properties(ff.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(GUI.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(BmpDecoder.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(GPS.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(I2C.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(lfs.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(picojpeg.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(regex.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(hxcmod.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(MATHS.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(Editor.c PROPERTIES COMPILE_FLAGS -Os)
set_source_files_properties(aes.c PROPERTIES COMPILE_FLAGS -Os)
pico_generate_pio_header(PicoMite ${CMAKE_CURRENT_LIST_DIR}/PicoMiteI2S.pio)
if (COMPILE STREQUAL "VGAUSB" OR COMPILE STREQUAL "VGA" OR COMPILE STREQUAL "PICO" OR COMPILE STREQUAL "PICOUSB" OR COMPILE STREQUAL "WEB")
pico_define_boot_stage2(slower_boot2 ${PICO_DEFAULT_BOOT_STAGE2_FILE})
target_compile_definitions(slower_boot2 PRIVATE PICO_FLASH_SPI_CLKDIV=4)
pico_set_boot_stage2(PicoMite slower_boot2)
endif()
if (COMPILE STREQUAL "VGAUSB" OR COMPILE STREQUAL "VGA" OR COMPILE STREQUAL "VGAUSBRP2350" OR COMPILE STREQUAL "VGARP2350")
pico_generate_pio_header(PicoMite ${CMAKE_CURRENT_LIST_DIR}/PicoMiteVGA.pio)
endif()
if (COMPILE STREQUAL "VGAUSB" OR COMPILE STREQUAL "PICOUSB" OR COMPILE STREQUAL "HDMIUSB" OR COMPILE STREQUAL "PICOUSBRP2350" OR COMPILE STREQUAL "VGAUSBRP2350")
Pico_enable_stdio_usb(PicoMite 0)
target_include_directories(PicoMite PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/usb_host_files
)
else()
Pico_enable_stdio_usb(PicoMite 1)
endif()
pico_enable_stdio_uart(PicoMite 0)
pico_add_extra_outputs(PicoMite)
pico_set_printf_implementation(PicoMite compiler)
if(COMPILE STREQUAL "VGARP2350" OR COMPILE STREQUAL "WEBRP2350" OR COMPILE STREQUAL "PICORP2350" OR COMPILE STREQUAL "HDMI" OR COMPILE STREQUAL "HDMIUSB" OR COMPILE STREQUAL "VGAUSBRP2350" OR COMPILE STREQUAL "PICOUSBRP2350")
pico_set_float_implementation(PicoMite pico_dcp)
endif()
target_compile_options(PicoMite PRIVATE -DNDEBUG
-DPICO_STDIO_USB_ENABLE_RESET_VIA_VENDOR_INTERFACE=0
-DPICO_ADC_CLKDIV_ROUND_NEAREST
-DPICO_XOSC_STARTUP_DELAY_MULTIPLIER=64
-DPICO_CLOCK_AJDUST_PERI_CLOCK_WITH_SYS_CLOCK
-DPICO_XOSC_STARTUP_DELAY_MULTIPLIER=64
-DPICO_FLASH_SIZE_BYTES=16777216
-DPICO_CORE1_STACK_SIZE=0x00
-DPICO_MALLOC_PANIC
-O2
-Wall)
# all RP2350 variants
if (COMPILE STREQUAL "HDMI" OR COMPILE STREQUAL "WEBRP2350" OR COMPILE STREQUAL "HDMIUSB" OR COMPILE STREQUAL "PICORP2350" OR COMPILE STREQUAL "PICOUSBRP2350" OR COMPILE STREQUAL "VGARP2350" OR COMPILE STREQUAL "VGAUSBRP2350")
target_compile_options(PicoMite PRIVATE -Drp2350
-DPICO_FLASH_SPI_CLKDIV=4
-DPICO_PIO_USE_GPIO_BASE
)
endif()
# all PicoMite variants - enable the gui
if (COMPILE STREQUAL "PICO" OR COMPILE STREQUAL "PICOUSB" OR COMPILE STREQUAL "PICORP2350" OR COMPILE STREQUAL "PICOUSBRP2350")
target_compile_options(PicoMite PRIVATE -DPICOMITE
-DPICO_HEAP_SIZE=0x1000
-DGUICONTROLS
-DPICO_CORE0_STACK_SIZE=0x1000
)
endif()
# all VGA variants
if (COMPILE STREQUAL "VGA" OR COMPILE STREQUAL "VGAUSB" OR COMPILE STREQUAL "VGARP2350" OR COMPILE STREQUAL "VGAUSBRP2350")
target_compile_options(PicoMite PRIVATE -DPICOMITEVGA
-DPICO_HEAP_SIZE=0x2000
-DPICO_CORE0_STACK_SIZE=0x2000
)
endif()
# HDMI variants
if (COMPILE STREQUAL "HDMI" OR COMPILE STREQUAL "HDMIUSB")
target_compile_options(PicoMite PRIVATE -DPICOMITEVGA
-DHDMI
-DPICO_HEAP_SIZE=0x2000
-DPICO_CORE0_STACK_SIZE=0x2000
)
endif()
#Web variants need more heap
if(COMPILE STREQUAL "WEB" OR COMPILE STREQUAL "WEBRP2350")
target_compile_options(PicoMite PRIVATE -DPICOMITEWEB
-DPICO_HEAP_SIZE=0x4000
-DGUICONTROLS
-DCYW43_HOST_NAME="WebMite"
-DPICO_CYW43_ARCH_POLL
-DPICO_CORE0_STACK_SIZE=0x4000
)
endif()
#USB variants
if (COMPILE STREQUAL "PICOUSB" OR COMPILE STREQUAL "PICOUSBRP2350" OR COMPILE STREQUAL "VGAUSB" OR COMPILE STREQUAL "VGAUSBRP2350" OR COMPILE STREQUAL "HDMIUSB")
target_compile_options(PicoMite PRIVATE -DUSBKEYBOARD
)
endif()
#special case WEB RP2350 gets the GUI controls
if(COMPILE STREQUAL "WEBRP2350")
target_compile_options(PicoMite PRIVATE -DGUICONTROLS
)
endif()
#set the PICOCALC flag
if(PICOCALC STREQUAL "true")
target_compile_options(PicoMite PRIVATE -DPICOCALC
)
endif()
target_link_libraries(PicoMite
pico_stdlib
hardware_flash
hardware_irq
hardware_adc
hardware_pwm
hardware_i2c
hardware_spi
hardware_dma
hardware_exception
hardware_pio
)
if(COMPILE STREQUAL "VGAUSB" OR COMPILE STREQUAL "PICOUSB" OR COMPILE STREQUAL "HDMIUSB" OR COMPILE STREQUAL "PICOUSBRP2350" OR COMPILE STREQUAL "VGAUSBRP2350")
target_link_libraries(PicoMite
tinyusb_host
tinyusb_board
pico_multicore
)
endif()
if(COMPILE STREQUAL "VGA" OR COMPILE STREQUAL "PICO" OR COMPILE STREQUAL "HDMI" OR COMPILE STREQUAL "VGARP2350" OR COMPILE STREQUAL "PICORP2350")
target_link_libraries(PicoMite
pico_multicore
)
endif()
if(COMPILE STREQUAL "VGARP2350" OR COMPILE STREQUAL "WEBRP2350" OR COMPILE STREQUAL "PICORP2350" OR COMPILE STREQUAL "HDMI" OR COMPILE STREQUAL "HDMIUSB" OR COMPILE STREQUAL "VGAUSBRP2350" OR COMPILE STREQUAL "PICOUSBRP2350")
target_link_libraries(PicoMite
pico_rand
)
endif()
if(COMPILE STREQUAL "WEB" OR COMPILE STREQUAL "WEBRP2350" )
target_link_libraries(PicoMite
pico_cyw43_arch_lwip_poll
)
endif()
if(SDBOOT STREQUAL "true" AND (COMPILE STREQUAL "PICORP2350" OR COMPILE STREQUAL "WEBRP2350"))
pico_set_linker_script(PicoMite ${CMAKE_SOURCE_DIR}/memmap_default_rp2350.ld)
endif()
if(SDBOOT STREQUAL "true" AND (COMPILE STREQUAL "PICO"))
pico_set_linker_script(PicoMite ${CMAKE_SOURCE_DIR}/memmap_default_rp2040.ld)
endif()
set(UF2_SOURCE ${CMAKE_CURRENT_BINARY_DIR}/PicoMite.uf2)
set(UF2_DEST ${CMAKE_BINARY_DIR}/PicoMite.uf2)
add_custom_command(
OUTPUT ${UF2_DEST}
DEPENDS ${UF2_SOURCE}
COMMAND ${CMAKE_COMMAND} -E copy ${UF2_SOURCE} ${UF2_DEST}
COMMENT "Copying PicoMite.uf2 to top-level build dir"
)
add_custom_target(PREPARE_PicoMite
COMMENT "Create Linker Script for 'PicoMite'"
COMMAND ${Python3_EXECUTABLE}
${CMAKE_SOURCE_DIR}/applink.py PREPARE
${CMAKE_BINARY_DIR}
PicoMite)
add_custom_target(BUILT_PicoMite
COMMENT "Record Build Details for 'PicoMite'"
DEPENDS ${UF2_DEST}
COMMAND ${Python3_EXECUTABLE}
${CMAKE_SOURCE_DIR}/applink.py BUILT
${CMAKE_BINARY_DIR}
PicoMite)