Browse Source

compiling basic AVR

Jack Humbert 3 years ago
parent
commit
ca8596e4a8

+ 1 - 1
.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

+ 9 - 0
.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"
+        }
+    }
+]

+ 21 - 0
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()

+ 11 - 0
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)

+ 3 - 0
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)

+ 11 - 0
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)

+ 201 - 0
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(
+        $<$<COMPILE_LANGUAGE:C>:-std=gnu11>
+        $<$<COMPILE_LANGUAGE:CXX>:-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
+        $<$<COMPILE_LANGUAGE:C>:-fno-inline-small-functions>
+        $<$<COMPILE_LANGUAGE:C>:-fno-strict-aliasing>
+        $<$<COMPILE_LANGUAGE:CXX>:-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)

+ 54 - 0
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)

+ 35 - 0
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/)

+ 13 - 0
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)

+ 85 - 0
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
+)