X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/4bc81323e51ac138e733c14eeb6f283ae706e904..35e9ec0c03a150e3fe6a3350549573e4c02be67b:/avr/main.c diff --git a/avr/main.c b/avr/main.c index 5c4cd0c..fb4e35c 100644 --- a/avr/main.c +++ b/avr/main.c @@ -5,36 +5,67 @@ #include "common.h" #include -//#include -//#include #include -//#include -//#include -//#include - -#include - #include #include - #include "config.h" #include "debug.h" #include "z80-if.h" +#include "i2c.h" #include "con-utils.h" #include "serial.h" #include "timer.h" #include "cli.h" #include "env.h" -/*--------------------------------------------------------------------------*/ +#define udelay(n) _delay_us(n) static uint8_t mcusr; +/*--------------------------------------------------------------------------*/ +#if DEBUG + +__attribute__ ((naked)) __attribute__ ((section (".init3"))) +void preset_ram (void) +{ + for (uint8_t *p = RAMSTART; p <= (uint8_t *) RAMEND; p++) + *p = 0xdd; + +} + +static const FLASH char * const FLASH rreasons[] = { + FSTR("Power on"), + FSTR("External"), + FSTR("Brown out"), + FSTR("Watchdog"), + FSTR("JTAG"), + }; + +static +void print_reset_reason(void) +{ + uint8_t r = mcusr & 0x1f; + const FLASH char * const FLASH *p = rreasons; + + printf_P(PSTR("### Reset reason(s): %s"), r ? "" : "none"); + for ( ; r; p++, r >>= 1) { + if (r & 1) { + my_puts_P(*p); + if (r & ~1) + printf_P(PSTR(", ")); + } + } + printf_P(PSTR(".\n")); +} + +#endif + static void setup_avr(void) { /* save and clear reset reason(s) */ + /* TODO: move to init section? */ mcusr = MCUSR; MCUSR = 0; @@ -66,37 +97,13 @@ void setup_avr(void) TIMSK1 = _BV(OCIE1A); // Enable TC1.oca interrupt } -static const FLASH char * const FLASH rreasons[] = { - FSTR("Power on"), - FSTR("External"), - FSTR("Brown out"), - FSTR("Watchdog"), - FSTR("JTAG"), - }; - static -void print_reset_reason(void) +int reset_reason_is_power_on(void) { - uint8_t r = mcusr & 0x1f; - const FLASH char * const FLASH *p = rreasons; - - printf_P(PSTR("Reset reason(s): ")); - for ( ; r; p++, r >>= 1) { - if (r & 1) { - my_puts_P(*p); - if (r & ~1) - printf_P(PSTR(", ")); - } - } - printf_P(PSTR(".\n")); + return (mcusr & _BV(PORF)) != 0; } - -/*******************************************************************************/ -/*******************************************************************************/ - -#define udelay(n) _delay_us(n) - +/*--------------------------------------------------------------------------*/ /* Stored value of bootdelay, used by autoboot_command() */ static int stored_bootdelay; @@ -157,8 +164,7 @@ const char *bootdelay_process(void) char *s; int bootdelay; - s = getenv("bootdelay"); - bootdelay = s ? atoi(s) : CONFIG_BOOTDELAY; + bootdelay = (int) getenv_ulong("bootdelay", 10, CONFIG_BOOTDELAY); debug("### main_loop entered: bootdelay=%d\n\n", bootdelay); @@ -193,19 +199,31 @@ void main_loop(void) int main(void) { + setup_avr(); z80_setup_bus(); + + if (reset_reason_is_power_on()) + _delay_ms(CONFIG_POWRON_DELAY); serial_setup(); sei(); - debug("\n=========================< (RE)START DEBUG >=========================\n"); #if DEBUG + debug("\n=========================< (RE)START DEBUG >=========================\n"); print_reset_reason(); #endif env_init(); +#if DEBUG + unsigned long i_speed = getenv_ulong("i2c_clock", 10, CONFIG_SYS_I2C_CLOCK); + debug("### Setting I2C clock Frequency to %lu Hz.\n", i_speed); + i2c_init(i_speed); +#else + i2c_init(CONFIG_SYS_I2C_CLOCK); +#endif + printf_P(PSTR("\n(ATMEGA1281+HD64180)_stamp Tester\n")); main_loop();