compiling basic AVR

This commit is contained in:
Jack Humbert 2023-04-01 18:03:54 -04:00
parent c3c401f91d
commit ca8596e4a8
11 changed files with 444 additions and 1 deletions

2
.gitignore vendored
View File

@ -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
.vscode/cmake-kits.json vendored Normal file
View File

@ -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
CMakeLists.txt Normal file
View File

@ -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()

View File

@ -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
platforms/CMakeLists.txt Normal file
View File

@ -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)

View File

@ -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)

View File

@ -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
platforms/toolchain.cmake Normal file
View File

@ -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
quantum/CMakeLists.txt Normal file
View File

@ -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/)

View File

@ -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)

View File

@ -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
)