From ca5b4534b621a0100cc5aa2ea9babb6f7bafd037 Mon Sep 17 00:00:00 2001 From: cpldcpu Date: Sun, 16 Mar 2014 08:13:29 +0100 Subject: firmware: Attiny841 first working config --- firmware/configuration/t841_default/Makefile.inc | 26 +++++++++---------- .../configuration/t841_default/bootloaderconfig.h | 29 +++++++++++++-------- firmware/configuration/t85_aggressive/Makefile.inc | 6 ++--- firmware/configuration/t85_default/Makefile.inc | 6 ++--- firmware/main.c | 7 +++++ firmware/osccalASM.S | 30 +++++++++++++++------- 6 files changed, 62 insertions(+), 42 deletions(-) diff --git a/firmware/configuration/t841_default/Makefile.inc b/firmware/configuration/t841_default/Makefile.inc index 8b856a3..d6198e4 100644 --- a/firmware/configuration/t841_default/Makefile.inc +++ b/firmware/configuration/t841_default/Makefile.inc @@ -2,31 +2,29 @@ # Project: Micronucleus # License: GNU GPL v2 (see License.txt) # -# Controller type: ATtiny 85 -# Configuration: Digispark default configuration. +# Controller type: ATtiny 841 +# Configuration: Default configuration - 12 Mhz RC oscillator # Last Change: Mar 16,2014 -F_CPU = 16500000 -DEVICE = attiny85 -FUSEOPT = $(FUSEOPT_t85) -LOCKOPT = -U lock:w:0x2f:m +F_CPU = 12000000 +DEVICE = attiny841 # hexadecimal address for bootloader section to begin. To calculate the best value: # - make clean; make main.hex; ### output will list data: 2124 (or something like that) # - for the size of your device (8kb = 1024 * 8 = 8192) subtract above value 2124... = 6068 # - How many pages in is that? 6068 / 64 (tiny85 page size in bytes) = 94.8125 # - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780 -BOOTLOADER_ADDRESS = 19C0 +BOOTLOADER_ADDRESS = 1800 -FUSEOPT_t85 = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -FUSEOPT_t85_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m +FUSEOPT = -U lfuse:w:0xe2:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m +FUSEOPT_DISABLERESET = # TODO #--------------------------------------------------------------------- -# ATtiny85 +# ATtiny841 #--------------------------------------------------------------------- # Fuse extended byte: -# 0xFE = - - - - - 1 1 0 +# 0xFE = 1 1 1 1 1 1 1 0 # ^ # | # +---- SELFPRGEN (enable self programming flash) @@ -52,11 +50,11 @@ FUSEOPT_t85_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m # +-------------------- RSTDISBL (disable external reset -> disabled!) # # Fuse low byte: -# 0xe1 = 1 1 1 0 0 0 0 1 +# 0xe2 = 1 1 1 0 0 0 1 0 # ^ ^ \+/ \--+--/ -# | | | +------- CKSEL 3..0 (clock selection -> HF PLL) +# | | | +------- CKSEL 3..0 (clock selection -> RC Oscillator) # | | +--------------- SUT 1..0 (BOD enabled, fast rising power) # | +------------------ CKOUT (clock output on CKOUT pin -> disabled) # +-------------------- CKDIV8 (divide clock by 8 -> don't divide) -############################################################################### + diff --git a/firmware/configuration/t841_default/bootloaderconfig.h b/firmware/configuration/t841_default/bootloaderconfig.h index 4ea59dd..80f6522 100644 --- a/firmware/configuration/t841_default/bootloaderconfig.h +++ b/firmware/configuration/t841_default/bootloaderconfig.h @@ -23,11 +23,11 @@ * "B", the registers PORTB, PINB and DDRB will be used. */ -#define USB_CFG_DMINUS_BIT 3 +#define USB_CFG_DMINUS_BIT 0 /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. * This may be any bit in the port. */ -#define USB_CFG_DPLUS_BIT 4 +#define USB_CFG_DPLUS_BIT 1 /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. * This may be any bit in the port, but must be configured as a pin change interrupt. */ @@ -49,23 +49,30 @@ // setup interrupt for Pin Change for D+ -#define USB_INTR_CFG PCMSK +#define USB_INTR_CFG PCMSK1 #define USB_INTR_CFG_SET (1 << USB_CFG_DPLUS_BIT) #define USB_INTR_CFG_CLR 0 #define USB_INTR_ENABLE GIMSK -#define USB_INTR_ENABLE_BIT PCIE +#define USB_INTR_ENABLE_BIT PCIE1 #define USB_INTR_PENDING GIFR -#define USB_INTR_PENDING_BIT PCIF -#define USB_INTR_VECTOR PCINT0_vect - +#define USB_INTR_PENDING_BIT PCIF1 +#define USB_INTR_VECTOR PCINT1_vect + /* ------------------------------------------------------------------------- */ /* Configuration relevant to the CPU the bootloader is running on */ /* ------------------------------------------------------------------------- */ // how many milliseconds should host wait till it sends another erase or write? // needs to be above 4.5 (and a whole integer) as avr freezes for 4.5ms + +// ATtiny841 erases four pages at once #define MICRONUCLEUS_WRITE_SLEEP 5 +#define MICRONUCLEUS_ERASE_SLEEP 1 +// ATtiny841 does not know OSCCAL +#ifndef OSCCAL +#define OSCCAL OSCCAL0 +#endif /* ---------------------- feature / code size options ---------------------- */ /* Configure the behavior of the bootloader here */ @@ -183,8 +190,8 @@ * comes with its own OSCCAL calibration or an external clock source is used. */ -#define OSCCAL_RESTORE 0 -#define OSCCAL_16_5MHz 1 +#define OSCCAL_RESTORE 1 +#define OSCCAL_16_5MHz 0 #define OSCCAL_HAVE_XTAL 0 /* @@ -200,11 +207,11 @@ * */ -#define LED_MODE ACTIVE_HIGH +#define LED_MODE ACTIVE_LOW #define LED_DDR DDRB #define LED_PORT PORTB -#define LED_PIN PB1 +#define LED_PIN PB2 /* * This is the implementation of the LED code. Change the configuration above unless you want to diff --git a/firmware/configuration/t85_aggressive/Makefile.inc b/firmware/configuration/t85_aggressive/Makefile.inc index 016f848..7ac110d 100644 --- a/firmware/configuration/t85_aggressive/Makefile.inc +++ b/firmware/configuration/t85_aggressive/Makefile.inc @@ -9,8 +9,6 @@ F_CPU = 16000000 DEVICE = attiny85 -FUSEOPT = $(FUSEOPT_t85) -LOCKOPT = -U lock:w:0x2f:m # hexadecimal address for bootloader section to begin. To calculate the best value: # - make clean; make main.hex; ### output will list data: 2124 (or something like that) @@ -19,8 +17,8 @@ LOCKOPT = -U lock:w:0x2f:m # - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780 BOOTLOADER_ADDRESS = 1A40 -FUSEOPT_t85 = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -FUSEOPT_t85_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m +FUSEOPT = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m +FUSEOPT_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m #--------------------------------------------------------------------- # ATtiny85 diff --git a/firmware/configuration/t85_default/Makefile.inc b/firmware/configuration/t85_default/Makefile.inc index 8b856a3..d933082 100644 --- a/firmware/configuration/t85_default/Makefile.inc +++ b/firmware/configuration/t85_default/Makefile.inc @@ -9,8 +9,6 @@ F_CPU = 16500000 DEVICE = attiny85 -FUSEOPT = $(FUSEOPT_t85) -LOCKOPT = -U lock:w:0x2f:m # hexadecimal address for bootloader section to begin. To calculate the best value: # - make clean; make main.hex; ### output will list data: 2124 (or something like that) @@ -19,8 +17,8 @@ LOCKOPT = -U lock:w:0x2f:m # - round that down to 94 - our new bootloader address is 94 * 64 = 6016, in hex = 1780 BOOTLOADER_ADDRESS = 19C0 -FUSEOPT_t85 = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m -FUSEOPT_t85_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m +FUSEOPT = -U lfuse:w:0xe1:m -U hfuse:w:0xdd:m -U efuse:w:0xfe:m +FUSEOPT_DISABLERESET = -U lfuse:w:0xe1:m -U efuse:w:0xfe:m -U hfuse:w:0x5d:m #--------------------------------------------------------------------- # ATtiny85 diff --git a/firmware/main.c b/firmware/main.c index 486a26b..13484d3 100644 --- a/firmware/main.c +++ b/firmware/main.c @@ -169,9 +169,16 @@ static uint8_t usbFunctionSetup(uint8_t data[8]) { static void initHardware (void) { // Disable watchdog and set timeout to maximum in case the WDT is fused on +#ifdef WDTCSR + // New ATtinies841/441 use a different unlock sequence and renamed registers + MCUSR=0; + CCP = 0xD8; + WDTCSR = 1<