| /* Name: bootloaderconfig.h |
| * Project: USBaspLoader |
| * Author: Christian Starkjohann |
| * Creation Date: 2007-12-08 |
| * Tabsize: 4 |
| * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH |
| * License: GNU GPL v2 (see License.txt) |
| * This Revision: $Id: bootloaderconfig.h 729 2009-03-20 09:03:58Z cs $ |
| */ |
| |
| #ifndef __bootloaderconfig_h_included__ |
| #define __bootloaderconfig_h_included__ |
| |
| /* |
| General Description: |
| This file (together with some settings in Makefile) configures the boot loader |
| according to the hardware. |
| |
| This file contains (besides the hardware configuration normally found in |
| usbconfig.h) two functions or macros: bootLoaderInit() and |
| bootLoaderCondition(). Whether you implement them as macros or as static |
| inline functions is up to you, decide based on code size and convenience. |
| |
| bootLoaderInit() is called as one of the first actions after reset. It should |
| be a minimum initialization of the hardware so that the boot loader condition |
| can be read. This will usually consist of activating a pull-up resistor for an |
| external jumper which selects boot loader mode. |
| |
| bootLoaderCondition() is called immediately after initialization and in each |
| main loop iteration. If it returns TRUE, the boot loader will be active. If it |
| returns FALSE, the boot loader jumps to address 0 (the loaded application) |
| immediately. |
| |
| For compatibility with Thomas Fischl's avrusbboot, we also support the macro |
| names BOOTLOADER_INIT and BOOTLOADER_CONDITION for this functionality. If |
| these macros are defined, the boot loader usees them. |
| */ |
| |
| /* ---------------------------- Hardware Config ---------------------------- */ |
| |
| #define USB_CFG_IOPORTNAME D |
| /* This is the port where the USB bus is connected. When you configure it to |
| * "B", the registers PORTB, PINB and DDRB will be used. |
| */ |
| #define USB_CFG_DMINUS_BIT 5 |
| /* 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 2 |
| /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. |
| * This may be any bit in the port. Please note that D+ must also be connected |
| * to interrupt pin INT0! |
| */ |
| #define USB_CFG_CLOCK_KHZ (F_CPU/1000) |
| /* Clock rate of the AVR in MHz. Legal values are 12000, 16000 or 16500. |
| * The 16.5 MHz version of the code requires no crystal, it tolerates +/- 1% |
| * deviation from the nominal frequency. All other rates require a precision |
| * of 2000 ppm and thus a crystal! |
| * Default if not specified: 12 MHz |
| */ |
| |
| /* ----------------------- Optional Hardware Config ------------------------ */ |
| |
| /* #define USB_CFG_PULLUP_IOPORTNAME D */ |
| /* If you connect the 1.5k pullup resistor from D- to a port pin instead of |
| * V+, you can connect and disconnect the device from firmware by calling |
| * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h). |
| * This constant defines the port on which the pullup resistor is connected. |
| */ |
| /* #define USB_CFG_PULLUP_BIT 4 */ |
| /* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined |
| * above) where the 1.5k pullup resistor is connected. See description |
| * above for details. |
| */ |
| |
| /* ------------------------------------------------------------------------- */ |
| /* ---------------------- feature / code size options ---------------------- */ |
| /* ------------------------------------------------------------------------- */ |
| |
| #define HAVE_EEPROM_PAGED_ACCESS 0 |
| /* If HAVE_EEPROM_PAGED_ACCESS is defined to 1, page mode access to EEPROM is |
| * compiled in. Whether page mode or byte mode access is used by AVRDUDE |
| * depends on the target device. Page mode is only used if the device supports |
| * it, e.g. for the ATMega88, 168 etc. You can save quite a bit of memory by |
| * disabling page mode EEPROM access. Costs ~ 138 bytes. |
| */ |
| #define HAVE_EEPROM_BYTE_ACCESS 1 |
| /* If HAVE_EEPROM_BYTE_ACCESS is defined to 1, byte mode access to EEPROM is |
| * compiled in. Byte mode is only used if the device (as identified by its |
| * signature) does not support page mode for EEPROM. It is required for |
| * accessing the EEPROM on the ATMega8. Costs ~54 bytes. |
| */ |
| #define BOOTLOADER_CAN_EXIT 0 |
| /* If this macro is defined to 1, the boot loader will exit shortly after the |
| * programmer closes the connection to the device. Costs ~36 bytes. |
| */ |
| #define HAVE_CHIP_ERASE 0 |
| /* If this macro is defined to 1, the boot loader implements the Chip Erase |
| * ISP command. Otherwise pages are erased on demand before they are written. |
| */ |
| //#define SIGNATURE_BYTES 0x1e, 0x93, 0x07, 0 /* ATMega8 */ |
| /* This macro defines the signature bytes returned by the emulated USBasp to |
| * the programmer software. They should match the actual device at least in |
| * memory size and features. If you don't define this, values for ATMega8, |
| * ATMega88, ATMega168 and ATMega328 are guessed correctly. |
| */ |
| |
| /* The following block guesses feature options so that the resulting code |
| * should fit into 2k bytes boot block with the given device and clock rate. |
| * Activate by passing "-DUSE_AUTOCONFIG=1" to the compiler. |
| * This requires gcc 3.4.6 for small enough code size! |
| */ |
| #if USE_AUTOCONFIG |
| # undef HAVE_EEPROM_PAGED_ACCESS |
| # define HAVE_EEPROM_PAGED_ACCESS (USB_CFG_CLOCK_KHZ >= 16000) |
| # undef HAVE_EEPROM_BYTE_ACCESS |
| # define HAVE_EEPROM_BYTE_ACCESS 1 |
| # undef BOOTLOADER_CAN_EXIT |
| # define BOOTLOADER_CAN_EXIT 1 |
| # undef SIGNATURE_BYTES |
| #endif /* USE_AUTOCONFIG */ |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| /* Example configuration: Port D bit 3 is connected to a jumper which ties |
| * this pin to GND if the boot loader is requested. Initialization allows |
| * several clock cycles for the input voltage to stabilize before |
| * bootLoaderCondition() samples the value. |
| * We use a function for bootLoaderInit() for convenience and a macro for |
| * bootLoaderCondition() for efficiency. |
| */ |
| |
| #ifndef __ASSEMBLER__ /* assembler cannot parse function definitions */ |
| |
| #define JUMPER_BIT 0 /* jumper is connected to this bit in port D, active low */ |
| |
| #ifndef MCUCSR /* compatibility between ATMega8 and ATMega88 */ |
| # define MCUCSR MCUSR |
| #endif |
| |
| static inline void bootLoaderInit(void) |
| { |
| PORTD |= (1 << JUMPER_BIT); /* activate pull-up */ |
| // if(!(MCUCSR & (1 << EXTRF))) /* If this was not an external reset, ignore */ |
| // leaveBootloader(); |
| // MCUCSR = 0; /* clear all reset flags for next time */ |
| } |
| |
| static inline void bootLoaderExit(void) |
| { |
| PORTD = 0; |
| } |
| |
| #define bootLoaderCondition() ((PIND & (1 << JUMPER_BIT)) == 0) |
| |
| #endif /* __ASSEMBLER__ */ |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| #endif /* __bootloader_h_included__ */ |