cmake_minimum_required(VERSION 3.12) # Set build type to reduce firmware size if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE MinSizeRel) endif() # Set main target and component locations set(MICROPY_TARGET firmware) get_filename_component(MICROPY_DIR "../.." ABSOLUTE) if (PICO_SDK_PATH_OVERRIDE) set(PICO_SDK_PATH ${PICO_SDK_PATH_OVERRIDE}) else() set(PICO_SDK_PATH ../../lib/pico-sdk) endif() # Use the local tinyusb instead of the one in pico-sdk set(PICO_TINYUSB_PATH ${MICROPY_DIR}/lib/tinyusb) # Set the location of this port's directory. set(MICROPY_PORT_DIR ${CMAKE_SOURCE_DIR}) # Set the board if it's not already set. if(NOT MICROPY_BOARD) set(MICROPY_BOARD PICO) endif() # Set the PICO_BOARD if it's not already set. if(NOT PICO_BOARD) string(TOLOWER ${MICROPY_BOARD} PICO_BOARD) endif() # Set the board directory and check that it exists. if(NOT MICROPY_BOARD_DIR) set(MICROPY_BOARD_DIR ${MICROPY_PORT_DIR}/boards/${MICROPY_BOARD}) endif() if(NOT EXISTS ${MICROPY_BOARD_DIR}/mpconfigboard.cmake) message(FATAL_ERROR "Invalid MICROPY_BOARD specified: ${MICROPY_BOARD}") endif() # Include board config include(${MICROPY_BOARD_DIR}/mpconfigboard.cmake) # Include component cmake fragments include(${MICROPY_DIR}/py/py.cmake) include(${MICROPY_DIR}/extmod/extmod.cmake) include(${PICO_SDK_PATH}/pico_sdk_init.cmake) # Define the top-level project project(${MICROPY_TARGET}) pico_sdk_init() include(${MICROPY_DIR}/py/usermod.cmake) add_executable(${MICROPY_TARGET}) set(MICROPY_QSTRDEFS_PORT ${PROJECT_SOURCE_DIR}/qstrdefsport.h ) set(MICROPY_SOURCE_LIB ${MICROPY_DIR}/lib/littlefs/lfs1.c ${MICROPY_DIR}/lib/littlefs/lfs1_util.c ${MICROPY_DIR}/lib/littlefs/lfs2.c ${MICROPY_DIR}/lib/littlefs/lfs2_util.c ${MICROPY_DIR}/lib/mp-readline/readline.c ${MICROPY_DIR}/lib/oofatfs/ff.c ${MICROPY_DIR}/lib/oofatfs/ffunicode.c ${MICROPY_DIR}/lib/timeutils/timeutils.c ${MICROPY_DIR}/lib/utils/gchelper_m0.s ${MICROPY_DIR}/lib/utils/gchelper_native.c ${MICROPY_DIR}/lib/utils/mpirq.c ${MICROPY_DIR}/lib/utils/pyexec.c ${MICROPY_DIR}/lib/utils/stdout_helpers.c ${MICROPY_DIR}/lib/utils/sys_stdio_mphal.c ) set(MICROPY_SOURCE_DRIVERS ${MICROPY_DIR}/drivers/bus/softspi.c ) set(MICROPY_SOURCE_PORT fatfs_port.c machine_adc.c machine_i2c.c machine_pin.c machine_pwm.c machine_spi.c machine_timer.c machine_uart.c machine_wdt.c main.c modmachine.c modrp2.c moduos.c modutime.c mphalport.c mpthreadport.c rp2_flash.c rp2_pio.c tusb_port.c uart.c ) include(${MICROPY_DIR}/lib/lv_bindings/mkrules.cmake) set(MICROPY_SOURCE_QSTR ${MICROPY_SOURCE_PY} ${MICROPY_SOURCE_EXTMOD} ${MICROPY_SOURCE_USERMOD} ${MICROPY_DIR}/lib/utils/mpirq.c ${MICROPY_DIR}/lib/utils/sys_stdio_mphal.c ${PROJECT_SOURCE_DIR}/machine_adc.c ${PROJECT_SOURCE_DIR}/machine_i2c.c ${PROJECT_SOURCE_DIR}/machine_pin.c ${PROJECT_SOURCE_DIR}/machine_pwm.c ${PROJECT_SOURCE_DIR}/machine_spi.c ${PROJECT_SOURCE_DIR}/machine_timer.c ${PROJECT_SOURCE_DIR}/machine_uart.c ${PROJECT_SOURCE_DIR}/machine_wdt.c ${PROJECT_SOURCE_DIR}/modmachine.c ${PROJECT_SOURCE_DIR}/modrp2.c ${PROJECT_SOURCE_DIR}/moduos.c ${PROJECT_SOURCE_DIR}/modutime.c ${PROJECT_SOURCE_DIR}/rp2_flash.c ${PROJECT_SOURCE_DIR}/rp2_pio.c ${LV_SRC} ) set(PICO_SDK_COMPONENTS hardware_adc hardware_base hardware_clocks hardware_dma hardware_flash hardware_gpio hardware_i2c hardware_irq hardware_pio hardware_pwm hardware_regs hardware_rtc hardware_spi hardware_structs hardware_sync hardware_timer hardware_uart hardware_watchdog pico_base_headers pico_binary_info pico_bootrom pico_multicore pico_platform pico_stdio pico_stdlib pico_sync pico_time pico_unique_id tinyusb_device ) # Define mpy-cross flags and frozen manifest set(MICROPY_CROSS_FLAGS -march=armv7m) set(MICROPY_FROZEN_MANIFEST ${PROJECT_SOURCE_DIR}/manifest.py) set(LV_BINDINGS_DIR ${MICROPY_DIR}/lib/lv_bindings) set(LV_DIR ${LV_BINDINGS_DIR}/lvgl) # set(MICROPY_SOURCE_LVGL_GEN # ${LV_BINDINGS_DIR}/gen/lv_mpy.c # ) include_directories( ${LV_BINDINGS_DIR} ) set(MICROPY_SOURCE_LVGL_EXTRA ${LV_DIR}/src/extra/lv_extra.c ${LV_DIR}/src/extra/themes/basic/lv_theme_basic.c ${LV_DIR}/src/extra/themes/default/lv_theme_default.c ${LV_DIR}/src/extra/layouts/flex/lv_flex.c ${LV_DIR}/src/extra/layouts/grid/lv_grid.c ${LV_DIR}/src/extra/widgets/colorwheel/lv_colorwheel.c ${LV_DIR}/src/extra/widgets/msgbox/lv_msgbox.c ${LV_DIR}/src/extra/widgets/calendar/lv_calendar_header_arrow.c ${LV_DIR}/src/extra/widgets/calendar/lv_calendar_header_dropdown.c ${LV_DIR}/src/extra/widgets/calendar/lv_calendar.c ${LV_DIR}/src/extra/widgets/win/lv_win.c ${LV_DIR}/src/extra/widgets/imgbtn/lv_imgbtn.c ${LV_DIR}/src/extra/widgets/spinbox/lv_spinbox.c ${LV_DIR}/src/extra/widgets/list/lv_list.c ${LV_DIR}/src/extra/widgets/spinner/lv_spinner.c ${LV_DIR}/src/extra/widgets/chart/lv_chart.c ${LV_DIR}/src/extra/widgets/keyboard/lv_keyboard.c ${LV_DIR}/src/extra/widgets/animimg/lv_animimg.c ${LV_DIR}/src/extra/widgets/tileview/lv_tileview.c ${LV_DIR}/src/extra/widgets/tabview/lv_tabview.c ${LV_DIR}/src/extra/widgets/meter/lv_meter.c ${LV_DIR}/src/extra/widgets/led/lv_led.c ${LV_DIR}/src/extra/widgets/span/lv_span.c ) set(MICROPY_SOURCE_LVGL_CORE ${LV_DIR}/src/core/lv_disp.c ${LV_DIR}/src/core/lv_group.c ${LV_DIR}/src/core/lv_indev.c ${LV_DIR}/src/core/lv_indev_scroll.c ${LV_DIR}/src/core/lv_obj.c ${LV_DIR}/src/core/lv_obj_class.c ${LV_DIR}/src/core/lv_obj_draw.c ${LV_DIR}/src/core/lv_obj_pos.c ${LV_DIR}/src/core/lv_obj_scroll.c ${LV_DIR}/src/core/lv_obj_style.c ${LV_DIR}/src/core/lv_obj_tree.c ${LV_DIR}/src/core/lv_event.c ${LV_DIR}/src/core/lv_refr.c ${LV_DIR}/src/core/lv_theme.c ) set(MICROPY_SOURCE_LVGL_DRAW ${LV_DIR}/src/draw/lv_draw_arc.c ${LV_DIR}/src/draw/lv_draw_blend.c ${LV_DIR}/src/draw/lv_draw_img.c ${LV_DIR}/src/draw/lv_draw_label.c ${LV_DIR}/src/draw/lv_draw_line.c ${LV_DIR}/src/draw/lv_draw_mask.c ${LV_DIR}/src/draw/lv_draw_rect.c ${LV_DIR}/src/draw/lv_draw_triangle.c ${LV_DIR}/src/draw/lv_img_buf.c ${LV_DIR}/src/draw/lv_img_cache.c ${LV_DIR}/src/draw/lv_img_decoder.c ) set(MICROPY_SOURCE_LVGL_FONT ${LV_DIR}/src/font/lv_font.c ${LV_DIR}/src/font/lv_font_fmt_txt.c ${LV_DIR}/src/font/lv_font_loader.c ${LV_DIR}/src/font/lv_font_dejavu_16_persian_hebrew.c ${LV_DIR}/src/font/lv_font_montserrat_8.c ${LV_DIR}/src/font/lv_font_montserrat_10.c ${LV_DIR}/src/font/lv_font_montserrat_12.c ${LV_DIR}/src/font/lv_font_montserrat_12_subpx.c ${LV_DIR}/src/font/lv_font_montserrat_14.c ${LV_DIR}/src/font/lv_font_montserrat_16.c ${LV_DIR}/src/font/lv_font_montserrat_18.c ${LV_DIR}/src/font/lv_font_montserrat_20.c ${LV_DIR}/src/font/lv_font_montserrat_22.c ${LV_DIR}/src/font/lv_font_montserrat_24.c ${LV_DIR}/src/font/lv_font_montserrat_26.c ${LV_DIR}/src/font/lv_font_montserrat_28.c ${LV_DIR}/src/font/lv_font_montserrat_28_compressed.c ${LV_DIR}/src/font/lv_font_montserrat_30.c ${LV_DIR}/src/font/lv_font_montserrat_32.c ${LV_DIR}/src/font/lv_font_montserrat_34.c ${LV_DIR}/src/font/lv_font_montserrat_36.c ${LV_DIR}/src/font/lv_font_montserrat_38.c ${LV_DIR}/src/font/lv_font_montserrat_40.c ${LV_DIR}/src/font/lv_font_montserrat_42.c ${LV_DIR}/src/font/lv_font_montserrat_44.c ${LV_DIR}/src/font/lv_font_montserrat_46.c ${LV_DIR}/src/font/lv_font_montserrat_48.c ${LV_DIR}/src/font/lv_font_simsun_16_cjk.c ${LV_DIR}/src/font/lv_font_unscii_8.c ${LV_DIR}/src/font/lv_font_unscii_16.c ) set(MICROPY_SOURCE_LVGL_HAL ${LV_DIR}/src/hal/lv_hal_disp.c ${LV_DIR}/src/hal/lv_hal_indev.c ${LV_DIR}/src/hal/lv_hal_tick.c ) set(MICROPY_SOURCE_LVGL_MISC ${LV_DIR}/src/misc/lv_anim.c ${LV_DIR}/src/misc/lv_area.c ${LV_DIR}/src/misc/lv_async.c ${LV_DIR}/src/misc/lv_bidi.c ${LV_DIR}/src/misc/lv_color.c ${LV_DIR}/src/misc/lv_fs.c ${LV_DIR}/src/misc/lv_gc.c ${LV_DIR}/src/misc/lv_ll.c ${LV_DIR}/src/misc/lv_log.c ${LV_DIR}/src/misc/lv_math.c ${LV_DIR}/src/misc/lv_mem.c ${LV_DIR}/src/misc/lv_printf.c ${LV_DIR}/src/misc/lv_style.c ${LV_DIR}/src/misc/lv_timer.c ${LV_DIR}/src/misc/lv_tlsf.c ${LV_DIR}/src/misc/lv_txt.c ${LV_DIR}/src/misc/lv_txt_ap.c ${LV_DIR}/src/misc/lv_utils.c ) set(MICROPY_SOURCE_LVGL_WIDGETS ${LV_DIR}/src/widgets/lv_arc.c ${LV_DIR}/src/widgets/lv_bar.c ${LV_DIR}/src/widgets/lv_btn.c ${LV_DIR}/src/widgets/lv_btnmatrix.c ${LV_DIR}/src/widgets/lv_canvas.c ${LV_DIR}/src/widgets/lv_checkbox.c ${LV_DIR}/src/widgets/lv_dropdown.c ${LV_DIR}/src/widgets/lv_img.c ${LV_DIR}/src/widgets/lv_label.c ${LV_DIR}/src/widgets/lv_line.c ${LV_DIR}/src/widgets/lv_roller.c ${LV_DIR}/src/widgets/lv_slider.c ${LV_DIR}/src/widgets/lv_switch.c ${LV_DIR}/src/widgets/lv_table.c ${LV_DIR}/src/widgets/lv_textarea.c ) set(MICROPY_SOURCE_LVGL ${MICROPY_SOURCE_LVGL_EXTRA} ${MICROPY_SOURCE_LVGL_CORE} ${MICROPY_SOURCE_LVGL_DRAW} ${MICROPY_SOURCE_LVGL_FONT} # # ${MICROPY_SOURCE_LVGL_GPU} ${MICROPY_SOURCE_LVGL_HAL} ${MICROPY_SOURCE_LVGL_MISC} ${MICROPY_SOURCE_LVGL_WIDGETS} ${MICROPY_SOURCE_LVGL_GEN} ) target_sources(${MICROPY_TARGET} PRIVATE ${MICROPY_SOURCE_PY} ${MICROPY_SOURCE_EXTMOD} ${MICROPY_SOURCE_LIB} ${MICROPY_SOURCE_DRIVERS} ${MICROPY_SOURCE_PORT} ${LV_SRC} ${MICROPY_SOURCE_LVGL} ) target_link_libraries(${MICROPY_TARGET} usermod) target_include_directories(${MICROPY_TARGET} PRIVATE ${MICROPY_INC_CORE} ${MICROPY_INC_USERMOD} ${MICROPY_BOARD_DIR} "${PROJECT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" ${LV_INCLUDE} ) target_compile_options(${MICROPY_TARGET} PRIVATE -Wall -Werror ) target_compile_definitions(${MICROPY_TARGET} PRIVATE FFCONF_H=\"${MICROPY_OOFATFS_DIR}/ffconf.h\" LFS1_NO_MALLOC LFS1_NO_DEBUG LFS1_NO_WARN LFS1_NO_ERROR LFS1_NO_ASSERT LFS2_NO_MALLOC LFS2_NO_DEBUG LFS2_NO_WARN LFS2_NO_ERROR LFS2_NO_ASSERT PICO_FLOAT_PROPAGATE_NANS=1 PICO_STACK_SIZE=0x2000 PICO_CORE1_STACK_SIZE=0 PICO_PROGRAM_NAME="MicroPython" PICO_NO_PROGRAM_VERSION_STRING=1 # do it ourselves in main.c MICROPY_BUILD_TYPE="${CMAKE_C_COMPILER_ID} ${CMAKE_C_COMPILER_VERSION} ${CMAKE_BUILD_TYPE}" PICO_NO_BI_STDIO_UART=1 # we call it UART REPL PICO_RP2040_USB_DEVICE_ENUMERATION_FIX=1 ) target_link_libraries(${MICROPY_TARGET} ${PICO_SDK_COMPONENTS} ) # todo this is a bit brittle, but we want to move a few source files into RAM (which requires # a linker script modification) until we explicitly add macro calls around the function # defs to move them into RAM. if (PICO_ON_DEVICE AND NOT PICO_NO_FLASH AND NOT PICO_COPY_TO_RAM) pico_set_linker_script(${MICROPY_TARGET} ${CMAKE_CURRENT_LIST_DIR}/memmap_mp.ld) endif() pico_add_extra_outputs(${MICROPY_TARGET}) add_custom_command(TARGET ${MICROPY_TARGET} POST_BUILD COMMAND arm-none-eabi-size --format=berkeley ${PROJECT_BINARY_DIR}/${MICROPY_TARGET}.elf VERBATIM ) # Collect all the include directories and compile definitions for the pico-sdk components. foreach(comp ${PICO_SDK_COMPONENTS}) micropy_gather_target_properties(${comp}) micropy_gather_target_properties(${comp}_headers) endforeach() # Include the main MicroPython cmake rules. include(${MICROPY_DIR}/py/mkrules.cmake) all_lv_bindings() # include(${MICROPY_DIR}/lib/lv_bindings/lvgl/CMakeLists.txt) # file(GLOB_RECURSE SOURCES ${MICROPY_DIR}/lib/lv_bindings/lvgl/src/*.c) # include_directories( # ${MICROPY_INC_CORE} # ${MICROPY_PORT_DIR} # ${MICROPY_DIR} # ${MICROPY_INC_USERMOD} # ${MICROPY_BOARD_DIR} # "${PROJECT_SOURCE_DIR}" # "${CMAKE_BINARY_DIR}" # ${LV_INCLUDE} # ) # add_library(lvgl STATIC ${SOURCES})