From ca8596e4a819c94a0ae122baf5dd14f453cb8c8e Mon Sep 17 00:00:00 2001 From: Jack Humbert Date: Sat, 1 Apr 2023 18:03:54 -0400 Subject: [PATCH] compiling basic AVR --- .gitignore | 2 +- .vscode/cmake-kits.json | 9 ++ CMakeLists.txt | 21 +++ keyboards/mntre/CMakeLists.txt | 11 ++ platforms/CMakeLists.txt | 3 + platforms/avr/CMakeLists.txt | 11 ++ platforms/avr/toolchain.cmake | 201 ++++++++++++++++++++++++++ platforms/toolchain.cmake | 54 +++++++ quantum/CMakeLists.txt | 35 +++++ tmk_core/protocol/CMakeLists.txt | 13 ++ tmk_core/protocol/lufa/CMakeLists.txt | 85 +++++++++++ 11 files changed, 444 insertions(+), 1 deletion(-) create mode 100644 .vscode/cmake-kits.json create mode 100644 CMakeLists.txt create mode 100644 keyboards/mntre/CMakeLists.txt create mode 100644 platforms/CMakeLists.txt create mode 100644 platforms/avr/CMakeLists.txt create mode 100644 platforms/avr/toolchain.cmake create mode 100644 platforms/toolchain.cmake create mode 100644 quantum/CMakeLists.txt create mode 100644 tmk_core/protocol/CMakeLists.txt create mode 100644 tmk_core/protocol/lufa/CMakeLists.txt diff --git a/.gitignore b/.gitignore index e36b9ae1307..4909f67406b 100644 --- a/.gitignore +++ b/.gitignore @@ -52,7 +52,7 @@ quantum/version.h .history/ build/ cmake-build-debug -CMakeLists.txt +# CMakeLists.txt *.pdf # Let these ones be user specific, since we have so many different configurations diff --git a/.vscode/cmake-kits.json b/.vscode/cmake-kits.json new file mode 100644 index 00000000000..ca0bc0126c8 --- /dev/null +++ b/.vscode/cmake-kits.json @@ -0,0 +1,9 @@ +[ + { + "name": "AVR GCC", + "compilers": { + "CC": "C:\\QMK_MSYS\\mingw64\\bin\\avr-gcc.exe", + "CXX": "C:\\QMK_MSYS\\mingw64\\bin\\avr-g++.exe" + } + } +] \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000000..4c68bfda323 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.3) + +# if(NOT DEFINED QMK_ROOT) + +project(qmk_firmware) + +include(ExternalProject) +ExternalProject_Add(mntre + SOURCE_DIR ${CMAKE_SOURCE_DIR}/keyboards/mntre + TMP_DIR ${CMAKE_SOURCE_DIR}/build + CMAKE_GENERATOR "MinGW Makefiles" + CMAKE_ARGS + -DCMAKE_TOOLCHAIN_FILE=${CMAKE_CURRENT_SOURCE_DIR}/platforms/avr/toolchain.cmake + -DQMK_ROOT=${CMAKE_CURRENT_SOURCE_DIR} +) + +# else() + +# add_subdirectory() + +# endif() \ No newline at end of file diff --git a/keyboards/mntre/CMakeLists.txt b/keyboards/mntre/CMakeLists.txt new file mode 100644 index 00000000000..087a0cfac33 --- /dev/null +++ b/keyboards/mntre/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.3) + +project(mntre C CXX ASM) + +add_qmk_executable(mntre + mntre.c +) +# set(QMK_INFO_JSON ${CMAKE_CURRENT_SOURCE_DIR}/info.json PARENT_SCOPE) +# add_compile_definitions(QMK_KEYMAP_CONFIG_H="${CMAKE_CURRENT_SOURCE_DIR}/config.h") + +# avr_target_link_libraries(mntre qmk) \ No newline at end of file diff --git a/platforms/CMakeLists.txt b/platforms/CMakeLists.txt new file mode 100644 index 00000000000..3f57a6698ef --- /dev/null +++ b/platforms/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library(platforms suspend.c synchronization_util.c timer.c) +target_include_directories(platforms PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(platforms PUBLIC quantum) \ No newline at end of file diff --git a/platforms/avr/CMakeLists.txt b/platforms/avr/CMakeLists.txt new file mode 100644 index 00000000000..dd8f58dadbf --- /dev/null +++ b/platforms/avr/CMakeLists.txt @@ -0,0 +1,11 @@ +add_library(platforms_avr + hardware_id.c + platform.c + suspend.c + timer.c + printf.c + xprintf.S + bootloaders/bootloadhid.c +) +target_include_directories(platforms_avr PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(platforms_avr PUBLIC platforms quantum) \ No newline at end of file diff --git a/platforms/avr/toolchain.cmake b/platforms/avr/toolchain.cmake new file mode 100644 index 00000000000..89561903204 --- /dev/null +++ b/platforms/avr/toolchain.cmake @@ -0,0 +1,201 @@ +# +# AVR GCC Toolchain file +# +# @author Natesh Narain +# @since Feb 06 2016 + +set(TRIPLE "avr") + +# find the toolchain root directory + +if(UNIX) + + set(OS_SUFFIX "") + find_path(TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + + PATHS + /usr/bin/ + /usr/local/bin + /bin/ + + $ENV{AVR_ROOT} + ) + +elseif(WIN32) + + set(OS_SUFFIX ".exe") + find_path(TOOLCHAIN_ROOT + NAMES + ${TRIPLE}-gcc${OS_SUFFIX} + + PATHS + "C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/bin/" + $ENV{AVR_ROOT} + ) + +else(UNIX) + message(FATAL_ERROR "toolchain not supported on this OS") +endif(UNIX) + +if(NOT TOOLCHAIN_ROOT) + message(FATAL_ERROR "Toolchain root could not be found!!!") +endif(NOT TOOLCHAIN_ROOT) + +# setup the AVR compiler variables + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_PROCESSOR avr) +set(CMAKE_CROSS_COMPILING 1) + +set(CMAKE_MAKE_PROGRAM "${TOOLCHAIN_ROOT}/make.exe" CACHE PATH "make" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-gcc${OS_SUFFIX}" CACHE PATH "gcc" FORCE) +set(CMAKE_CXX_COMPILER "${TOOLCHAIN_ROOT}/${TRIPLE}-g++${OS_SUFFIX}" CACHE PATH "g++" FORCE) +set(CMAKE_AR "${TOOLCHAIN_ROOT}/${TRIPLE}-ar${OS_SUFFIX}" CACHE PATH "ar" FORCE) +set(CMAKE_AS "${TOOLCHAIN_ROOT}/${TRIPLE}-as${OS_SUFFIX}" CACHE PATH "as" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_ROOT}/${TRIPLE}-ld${OS_SUFFIX}" CACHE PATH "linker" FORCE) +set(CMAKE_NM "${TOOLCHAIN_ROOT}/${TRIPLE}-nm${OS_SUFFIX}" CACHE PATH "nm" FORCE) +set(CMAKE_OBJCOPY "${TOOLCHAIN_ROOT}/${TRIPLE}-objcopy${OS_SUFFIX}" CACHE PATH "objcopy" FORCE) +set(CMAKE_OBJDUMP "${TOOLCHAIN_ROOT}/${TRIPLE}-objdump${OS_SUFFIX}" CACHE PATH "objdump" FORCE) +set(CMAKE_STRIP "${TOOLCHAIN_ROOT}/${TRIPLE}-strip${OS_SUFFIX}" CACHE PATH "strip" FORCE) +set(CMAKE_RANLIB "${TOOLCHAIN_ROOT}/${TRIPLE}-ranlib${OS_SUFFIX}" CACHE PATH "ranlib" FORCE) +set(AVR_SIZE "${TOOLCHAIN_ROOT}/${TRIPLE}-size${OS_SUFFIX}" CACHE PATH "size" FORCE) + +# set(CMAKE_EXE_LINKER_FLAGS "-L /usr/lib/gcc/avr/4.8.2") + +# avr uploader config +find_program(AVR_UPLOAD + NAME + avrdude + + PATHS + /usr/bin/ + $ENV{AVR_ROOT} +) + +# setup the avr exectable macro + +# set(AVR_LINKER_LIBS "-lc -lm -lgcc -Wl,-lprintf_flt -Wl,-u,vfprintf") + +macro(add_qmk_executable target_name) + + add_compile_options( + $<$:-std=gnu11> + $<$:-std=gnu++14> + # -flto + -Os + -Wall + -Wstrict-prototypes + -fcommon + # -g + --param=min-pagesize=0 + -funsigned-char + -funsigned-bitfields + -ffunction-sections + -fdata-sections + -fpack-struct + -fshort-enums + -mcall-prologues + -fno-builtin-printf + $<$:-fno-inline-small-functions> + $<$:-fno-strict-aliasing> + $<$:-fno-exceptions> + ) + + add_compile_definitions( + F_CPU=16000000 + F_USB=16000000UL + __AVR_ATmega32U4__ + # LTO_ENABLE + ) + + add_link_options(-Wl,--gc-sections,-Map=${map_file}) + + include(${QMK_ROOT}/platforms/toolchain.cmake) + add_qmk_executable_common(${target_name}) + + add_subdirectory(${QMK_ROOT}/platforms/avr platforms/avr) + add_subdirectory(${QMK_ROOT}/tmk_core/protocol/lufa tmk_core/protocol/lufa) + + include_directories("C:/Users/Jack/Downloads/avr-gcc-12.1.0-x64-windows/avr/include") + + set(elf_file ${target_name}-${QMK_MCU}.elf) + set(map_file ${target_name}-${QMK_MCU}.map) + set(hex_file ${target_name}-${QMK_MCU}.hex) + set(lst_file ${target_name}-${QMK_MCU}.lst) + + # create elf file + add_executable(${elf_file} + ${ARGN} + ) + + target_link_libraries(${elf_file} + PUBLIC + quantum + tmk_core_protocol + tmk_core_protocol_lufa + platforms + platforms_avr + ) + + # set_target_properties( + # ${elf_file} + + # PROPERTIES + # COMPILE_FLAGS "-mmcu=${QMK_MCU} -g -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics" + # LINK_FLAGS "-mmcu=${QMK_MCU} -Wl,-Map,${map_file}" + # ) + + # generate the lst file + add_custom_command( + OUTPUT ${lst_file} + + COMMAND + ${CMAKE_OBJDUMP} -h -S ${elf_file} > ${lst_file} + + DEPENDS ${elf_file} + ) + + # create hex file + add_custom_command( + OUTPUT ${hex_file} + + COMMAND + ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file} + + DEPENDS ${elf_file} + ) + + add_custom_command( + OUTPUT "print-size-${elf_file}" + + COMMAND + ${AVR_SIZE} ${elf_file} + + DEPENDS ${elf_file} + ) + + add_custom_command( + OUTPUT "print-size-${hex_file}" + + COMMAND + ${AVR_SIZE} ${hex_file} + + DEPENDS ${hex_file} + ) + + # build the intel hex file for the device + add_custom_target( + ${target_name} + ALL + DEPENDS ${hex_file} ${lst_file} "print-size-${elf_file}" "print-size-${hex_file}" + ) + + set_target_properties( + ${target_name} + + PROPERTIES + OUTPUT_NAME ${elf_file} + ) +endmacro(add_qmk_executable) \ No newline at end of file diff --git a/platforms/toolchain.cmake b/platforms/toolchain.cmake new file mode 100644 index 00000000000..26e8758f1b3 --- /dev/null +++ b/platforms/toolchain.cmake @@ -0,0 +1,54 @@ +macro(add_qmk_executable_common target_name) + + file(READ ${CMAKE_SOURCE_DIR}/info.json JSON_STRING) + + string(JSON KEYBOARD_NAME GET ${JSON_STRING} keyboard_name) + string(JSON MANUFACTURER GET ${JSON_STRING} manufacturer) + string(JSON QMK_MCU GET ${JSON_STRING} processor) + string(JSON VENDOR_ID GET ${JSON_STRING} usb vid) + string(JSON PRODUCT_ID GET ${JSON_STRING} usb pid) + string(JSON DEVICE_VER GET ${JSON_STRING} usb device_version) + + string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" + VERSION_MATCH ${DEVICE_VER}) + set(VERSION_MAJOR ${CMAKE_MATCH_1}) + set(VERSION_MINOR ${CMAKE_MATCH_2}) + set(VERSION_PATCH ${CMAKE_MATCH_3}) + math(EXPR VERSION_C_EVAL "${VERSION_MAJOR} * 10000 + ${VERSION_MINOR} * 100 + ${VERSION_PATCH}" OUTPUT_FORMAT HEXADECIMAL) + + # include_directories(${QMK_ROOT}/quantum) + # include_directories(${QMK_ROOT}/quantum/logging) + # include_directories(${QMK_ROOT}/quantum/keymap_extras) + # include_directories(${QMK_ROOT}/quantum/process_keycode) + # include_directories(${QMK_ROOT}/quantum/sequencer) + # include_directories(${QMK_ROOT}/quantum/bootmagic) + # include_directories(${QMK_ROOT}/platforms) + include_directories(${CMAKE_SOURCE_DIR}) + + add_compile_options( + -include ${CMAKE_SOURCE_DIR}/config.h + -mmcu=${QMK_MCU} + ) + + add_link_options( + -mmcu=${QMK_MCU} + ) + + add_compile_definitions( + QMK_KEYBOARD_H="${target_name}.h" + KEYMAP_C="${CMAKE_SOURCE_DIR}/keymaps/default/keymap.c" + MATRIX_ROWS=6 + MATRIX_COLS=15 + VENDOR_ID=${VENDOR_ID} + PRODUCT_ID=${PRODUCT_ID} + DEVICE_VER=${VERSION_C_EVAL} + MANUFACTURER="${MANUFACTURER}" + PRODUCT="${KEYBOARD_NAME}" + ) + + # add_library(qmk) + + add_subdirectory(${QMK_ROOT}/quantum quantum) + add_subdirectory(${QMK_ROOT}/platforms platforms) + add_subdirectory(${QMK_ROOT}/tmk_core/protocol tmk_core/protocol) +endmacro(add_qmk_executable_common) \ No newline at end of file diff --git a/quantum/CMakeLists.txt b/quantum/CMakeLists.txt new file mode 100644 index 00000000000..e43fbc79d93 --- /dev/null +++ b/quantum/CMakeLists.txt @@ -0,0 +1,35 @@ +add_library(quantum + main.c + keymap_introspection.c + quantum.c + bitwise.c + led.c + action.c + action_layer.c + action_tapping.c + action_util.c + eeconfig.c + keyboard.c + keymap_common.c + keycode_config.c + sync_timer.c + logging/debug.c + logging/sendchar.c + matrix_common.c + matrix.c + debounce/sym_defer_g.c + bootmagic/magic.c +) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/logging) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/keymap_extras) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/process_keycode) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/sequencer) +target_include_directories(quantum PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bootmagic) +target_link_libraries(quantum PUBLIC platforms) +target_link_libraries(quantum PUBLIC platforms_avr) +target_link_libraries(quantum PUBLIC tmk_core_protocol) + +# if no printf +# target_sources(quantum PRIVATE ${QMK_ROOT}/lib/printf/src/printf/printf.c) +# target_include_directories(quantum PUBLIC ${QMK_ROOT}/lib/printf/src/) \ No newline at end of file diff --git a/tmk_core/protocol/CMakeLists.txt b/tmk_core/protocol/CMakeLists.txt new file mode 100644 index 00000000000..96384d148e0 --- /dev/null +++ b/tmk_core/protocol/CMakeLists.txt @@ -0,0 +1,13 @@ +add_library(tmk_core_protocol + host.c + report.c + usb_device_state.c + usb_util.c +) +add_compile_definitions( + # MOUSE_ENABLED + # EXTRAKEY_ENABLE + # NKRO_ENABLE +) +target_include_directories(tmk_core_protocol PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(tmk_core_protocol PUBLIC quantum) \ No newline at end of file diff --git a/tmk_core/protocol/lufa/CMakeLists.txt b/tmk_core/protocol/lufa/CMakeLists.txt new file mode 100644 index 00000000000..180d5df6194 --- /dev/null +++ b/tmk_core/protocol/lufa/CMakeLists.txt @@ -0,0 +1,85 @@ +# set(LUFA_PATH ${QMK_ROOT}/lib/lufa) +set(LUFA_PATH ${QMK_ROOT}/lib/lufa) +set(ARCH AVR8) +set(USE_STATIC_OPTIONS "(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)") + +add_compile_definitions( + PROTOCOL_LUFA + ARCH=ARCH_${ARCH} + BOARD=BOARD_NONE + + USB_DEVICE_ONLY + USE_FLASH_DESCRIPTORS + USE_STATIC_OPTIONS=${USE_STATIC_OPTIONS} + FIXED_CONTROL_ENDPOINT_SIZE=8 + FIXED_NUM_CONFIGURATIONS=1 +) + +add_library(tmk_core_protocol_lufa + lufa.c + ../usb_descriptor.c + usb_util.c +) + +target_include_directories(tmk_core_protocol_lufa PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(tmk_core_protocol_lufa PUBLIC ${LUFA_PATH}) + +target_link_libraries(tmk_core_protocol_lufa PUBLIC quantum) + +set(LUFA_ROOT_PATH ${QMK_ROOT}/lib/lufa/LUFA) + +target_sources(tmk_core_protocol_lufa +PUBLIC + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/Events.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/USBTask.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Class/Common/HIDParser.c + + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Host_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Pipe_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/PipeStream_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/HostStandardReq.c + + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Device_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c + # ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBController_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/USBInterrupt_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/ConfigDescriptors.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/Events.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/USBTask.c + ${LUFA_ROOT_PATH}/Drivers/USB/Class/Common/HIDParser.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Host_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Pipe_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/PipeStream_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/HostStandardReq.c + + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Device_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/Endpoint_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/${ARCH}/EndpointStream_${ARCH}.c + ${LUFA_ROOT_PATH}/Drivers/USB/Core/DeviceStandardReq.c + +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/AudioClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/CCIDClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/CDCClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/HIDClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/MassStorageClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/MIDIClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/PrinterClassDevice.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Device/RNDISClassDevice.c + +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/AudioClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/CDCClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/HIDClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/MassStorageClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/MIDIClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/PrinterClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/RNDISClassHost.c +# ${LUFA_ROOT_PATH}/Drivers/USB/Class/Host/StillImageClassHost.c +) \ No newline at end of file