From 9c4bf0ac4aed4ab315f27bfa5d2f54b0dd931138 Mon Sep 17 00:00:00 2001 From: Joel Challis Date: Thu, 2 Apr 2020 22:23:57 +0100 Subject: [PATCH] Initial support for ATtiny85 (#8632) * Initial support for ATtiny85 * Update mcu selection --- quantum/config_common.h | 3 +++ quantum/mcu_selection.mk | 15 +++++++++++++++ tmk_core/common/avr/bootloader.c | 2 +- tmk_core/common/avr/timer.c | 21 ++++++++++++++------- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/quantum/config_common.h b/quantum/config_common.h index 4cfd74b0f..9861c8678 100644 --- a/quantum/config_common.h +++ b/quantum/config_common.h @@ -63,6 +63,9 @@ # define PINB_ADDRESS 0x3 # define PINC_ADDRESS 0x6 # define PIND_ADDRESS 0x9 +# elif defined(__AVR_ATtiny85__) +# define ADDRESS_BASE 0x10 +# define PINB_ADDRESS 0x6 # else # error "Pins are not defined" # endif diff --git a/quantum/mcu_selection.mk b/quantum/mcu_selection.mk index ef7e8ae75..33de162bb 100644 --- a/quantum/mcu_selection.mk +++ b/quantum/mcu_selection.mk @@ -287,3 +287,18 @@ ifneq (,$(filter $(MCU),atmega328p)) NO_UART ?= yes NO_SUSPEND_POWER_DOWN ?= yes endif + +ifneq (,$(filter $(MCU),attiny85)) + PROTOCOL = VUSB + + # Processor frequency. + # This will define a symbol, F_CPU, in all source code files equal to the + # processor frequency in Hz. You can then use this symbol in your source code to + # calculate timings. Do NOT tack on a 'UL' at the end, this will be done + # automatically to create a 32-bit value in your source code. + F_CPU ?= 16500000 + + # unsupported features for now + NO_UART ?= yes + NO_SUSPEND_POWER_DOWN ?= yes +endif diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c index ca9746f32..32f69ae8b 100644 --- a/tmk_core/common/avr/bootloader.c +++ b/tmk_core/common/avr/bootloader.c @@ -247,7 +247,7 @@ void bootloader_jump(void) { #else // Assume remaining boards are DFU, even if the flag isn't set -# if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though? +# if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATtiny85__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though? UDCON = 1; USBCON = (1 << FRZCLK); // disable USB UCSR1B = 0; diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c index 88fa1dfa6..c2e6c6e08 100644 --- a/tmk_core/common/avr/timer.c +++ b/tmk_core/common/avr/timer.c @@ -45,19 +45,26 @@ void timer_init(void) { # error "Timer prescaler value is not valid" #endif -#ifndef __AVR_ATmega32A__ +#if defined(__AVR_ATmega32A__) + // Timer0 CTC mode + TCCR0 = _BV(WGM01) | prescaler; + + OCR0 = TIMER_RAW_TOP; + TIMSK = _BV(OCIE0); +#elif defined(__AVR_ATtiny85__) + // Timer0 CTC mode + TCCR0A = _BV(WGM01); + TCCR0B = prescaler; + + OCR0A = TIMER_RAW_TOP; + TIMSK = _BV(OCIE0A); +#else // Timer0 CTC mode TCCR0A = _BV(WGM01); TCCR0B = prescaler; OCR0A = TIMER_RAW_TOP; TIMSK0 = _BV(OCIE0A); -#else - // Timer0 CTC mode - TCCR0 = _BV(WGM01) | prescaler; - - OCR0 = TIMER_RAW_TOP; - TIMSK = _BV(OCIE0); #endif }