diff --git a/CMakeLists.txt b/CMakeLists.txt index 412bf5d..048f292 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,17 +5,47 @@ set(AVR_MCU "attiny3216") set(CMAKE_TOOLCHAIN_FILE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/avr-gcc-toolchain.cmake") -project(avr-avc-lan VERSION 1 LANGUAGES C ASM) +project(avr-avc-lan VERSION 1 LANGUAGES C CXX ASM) -include(FetchContent) -# attiny_atpack_SOURCE_DIR is downloaded/extracted location -FetchContent_Declare( - attiny_atpack - URL http://packs.download.atmel.com/Atmel.ATtiny_DFP.2.0.368.atpack - URL_HASH SHA512=ee16a8ebecb57bd998a9cd4373368e3d45982cbbc3825e18d1dcac58215db6b9d907ad1ba2020cba9187fed7ba8c6f255a4fa1214e40c7a17ab2d18474f4d079 - DOWNLOAD_NAME Atmel.ATtiny_DFP.2.0.368.atpack.zip +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.3") + message(FATAL_ERROR "Insufficient AVR-GCC version; Support for ATtiny3216 was added in GCC v8") + endif() +endif() + +# Handle libc versioning +try_compile(LIBC_VERSION_TEST + SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libc-version-test.cpp" + COMPILE_DEFINITIONS -mmcu=${AVR_MCU} ) -FetchContent_MakeAvailable(attiny_atpack) + +if(NOT LIBC_VERSION_TEST) + include(FetchContent) + # attiny_atpack_SOURCE_DIR is downloaded/extracted location + FetchContent_Declare( + attiny_atpack + URL http://packs.download.atmel.com/Atmel.ATtiny_DFP.2.0.368.atpack + URL_HASH SHA512=ee16a8ebecb57bd998a9cd4373368e3d45982cbbc3825e18d1dcac58215db6b9d907ad1ba2020cba9187fed7ba8c6f255a4fa1214e40c7a17ab2d18474f4d079 + DOWNLOAD_NAME Atmel.ATtiny_DFP.2.0.368.atpack.zip + ) + FetchContent_MakeAvailable(attiny_atpack) + try_compile(LIBC_VERSION_TEST + SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libc-version-test.cpp" + COMPILE_DEFINITIONS + -B "${attiny_atpack_SOURCE_DIR}/gcc/dev/${AVR_MCU}" + -isystem "${attiny_atpack_SOURCE_DIR}/include" + -mmcu=${AVR_MCU} + ) + if(NOT LIBC_VERSION_TEST) + message(FATAL_ERROR "Insufficient AVR-LIBC/Microchip pack for chosen MCU '${AVR_MCU}'") + else() + include_directories(SYSTEM PUBLIC "${attiny_atpack_SOURCE_DIR}/include") + add_compile_options( + -B "${attiny_atpack_SOURCE_DIR}/gcc/dev/${AVR_MCU}" + ) + endif() +endif() + set(CMAKE_C_STANDARD 17) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) @@ -38,7 +68,6 @@ add_avr_executable(sniffer src/avclandrv.c src/GlobalDef.c) -target_include_directories(sniffer SYSTEM PUBLIC "${attiny_atpack_SOURCE_DIR}/include") target_link_options(sniffer PUBLIC -B "${attiny_atpack_SOURCE_DIR}/gcc/dev/${AVR_MCU}" ) @@ -46,7 +75,6 @@ target_compile_definitions(sniffer PRIVATE F_CPU=16000000L ) target_compile_options(sniffer PRIVATE - -B "${attiny_atpack_SOURCE_DIR}/gcc/dev/${AVR_MCU}" --param=min-pagesize=0 -ffunction-sections -fdata-sections diff --git a/cmake/libc-version-test.cpp b/cmake/libc-version-test.cpp new file mode 100644 index 0000000..518c66f --- /dev/null +++ b/cmake/libc-version-test.cpp @@ -0,0 +1,17 @@ +#if __has_include() +#include +#if ((COMPONENT_VERSION_MAJOR == 1) && (COMPONENT_VERSION_MINOR == 2) && \ + (BUILD_NUMBER < 118)) +#error \ + "Microchip pack component version greater than 1.2.118 required to support ATtiny3216" +#endif +#else +#include +#if !(__AVR_LIBC_VERSION__ > 20100UL) +#error "AVR LibC version greater than 2.1 does support ATtiny3216" +#endif +#endif + +#include + +int main() { return 0; } \ No newline at end of file diff --git a/src/avclandrv.c b/src/avclandrv.c index 1493f8c..79196a8 100644 --- a/src/avclandrv.c +++ b/src/avclandrv.c @@ -47,6 +47,11 @@ __asm__ __volatile__( \ "cbi %[vporta_out], 6;" ::[vporta_out] "I"(_SFR_IO_ADDR(VPORTA_OUT))); +// Name difference between avr-libc and Microchip pack +#if defined(EVSYS_ASYNCCH00_bm) +#define EVSYS_ASYNCCH0_0_bm EVSYS_ASYNCCH00_bm +#endif + uint8_t CD_ID_1; uint8_t CD_ID_2;