Esempio n. 1
0
int board_late_init(void)
{
	u_int8_t env_enetaddr[8];
	char *env_str;
	char *end;
	int i;

	/*
	 * Set MAC address so we do not need to init Ethernet before Linux
	 * boot
	 */
	env_str = getenv("ethaddr");
	if (env_str) {
		struct at91_emac *emac = (struct at91_emac *)ATMEL_BASE_EMAC;
		/* Parse MAC address */
		for (i = 0; i < 6; i++) {
			env_enetaddr[i] = env_str ?
				simple_strtoul(env_str, &end, 16) : 0;
			if (env_str)
				env_str = (*end) ? end+1 : end;
		}

		/* Set hardware address */
		writel(env_enetaddr[0] | env_enetaddr[1] << 8 |
		       env_enetaddr[2] << 16 | env_enetaddr[3] << 24,
		       &emac->sa2l);
		writel((env_enetaddr[4] | env_enetaddr[5] << 8), &emac->sa2h);

		printf("MAC:   %s\n", getenv("ethaddr"));
	} else {
		/* Not set in environment */
		printf("MAC:   not set\n");
	}
#ifdef CONFIG_GURNARD_SPLASH
	lcd_splash(480, 272);
#endif

	return 0;
}
Esempio n. 2
0
int main(void) {
    wdt_enable(WDTO_4S);
    wdt_reset();
    /* configure PPM output port */
    PPM_DDR |= (1<<PPM_BIT);
    PPM_PORT &= ~(1<<PPM_BIT);

    /* configure LED output port */
    LED_DDR |= (1<<LED_BIT);
    LED_PORT |= (1<<LED_BIT);

    /* configure VOL(tage) warning port */
    VOL_DDR &= ~(1<<VOL_BIT);
    VOL_PORT |= (1<<VOL_BIT); // enable pullup

#ifdef ENABLE_SERIAL
    serial_init();
#endif
#ifdef ENABLE_TWI
    twi_init();
#endif
#ifdef USE_NUNCHUK
    nunchuk_init();
    wdt_reset();
#endif

    /* configure switches */
    sw_init();

    /* configure ADC */
    adc_init();

#if defined(USE_TWI_ADC)
    twi_adc_init();
    wdt_reset();
#endif
#if defined(USE_MAG)
    mag_init();
    wdt_reset();
#endif
#if defined(USE_ACC)
    acc_init();
#endif
#if defined(USE_LCD)
    /* initialize LCD twice (due to timing issues?) */
    lcd_init();
    wdt_reset();
    _delay_ms(100);
    wdt_reset();
    lcd_init();
    wdt_reset();
    lcd_splash();
#endif

    /* configure watchfog timer to reset after 60ms */
    wdt_enable(WDTO_60MS);

    /* configure timer */

    /* enable CTC waveform generation (TOP == OCR1A) */
    TCCR1B |= (1<<WGM12);
    /* set compare value for the stop pulse to 300µs */
    OCR1B = STOP_US;
    /* set pulse width to max for now */
    OCR1A = ~0;
    /* set Timer 1 to clk/8, giving us ticks of 1 µs */
    TCCR1B |= (1<<CS11);

    /* Timer 2 generates overflows at 1kHz */
#if defined(TCCR2) /* e.g. ATMega8 */
#define TIMER2_COMP_IRQ TIMER2_COMP_vect
    TCCR2 = (1<<WGM21 | 1<<CS22);
    OCR2 = 0x7D;
    /* enable compare and overflow interrupts */
    TIMSK = (1<<OCIE2 | 1<<OCIE1B | 1<<OCIE1A);
#elif defined(TCCR2A) /* e.g. ATMega{8,16,32}8 */
#define TIMER2_COMP_IRQ TIMER2_COMPA_vect
    TCCR2A = (1<<WGM21);
    TCCR2B = (1<<CS22);
    OCR2A = 0x7D;
    /* enable compare and overflow interrupts */
    TIMSK1 = (1<<OCIE1B | 1<<OCIE1A);
    TIMSK2 = (1<<OCIE2A);
#else
#error "Unable to determine timer 2 configuration registers"
#endif

    /* initialize channel data */
    start_ppm_frame();
    set_ppm(1);
    start_ppm_pulse();

    /* enable interrupts */
    sei();

    serial_write_str("Welcome!\n");
    while (1) {
        /* reset watchdog */
        wdt_reset();

        /* keep sampling adc data */
        adc_query();

        /* query switches */
        sw_query();

        /* prepare Datenschlag data frames */
        ds_prepare();

#ifdef USE_TWI_ADC
        /* query TWI/I²C ADC */
        twi_adc_query();
#endif
#if defined(USE_MAG)
#ifdef MAG_CENTER_CALIBRATION_TRIGGER_INPUT
        if (get_input_scaled( (MAG_CENTER_CALIBRATION_TRIGGER_INPUT), 1, -1) == (MAG_CENTER_CALIBRATION_TRIGGER_VALUE)) {
            mag_set_calibration(millis + 10000L);
        }
#endif
        if (mag_is_calibrating()) {
            mag_calibrate(0);
        } else {
            mag_calibrate(1);
            mag_query();
            mag_dump();
        }
#endif
#if defined(USE_ACC)
        acc_query();
        acc_dump();
#endif

#ifdef USE_NUNCHUK
        nunchuk_query();
#endif

        check_voltage();

        /* switch LED */
        if (!low_voltage || (millis/250 % 2)) {
            LED_PORT |= (1<<LED_BIT);
        } else {
            LED_PORT &= ~(1<<LED_BIT);
        }

#ifdef USE_LCD
        static enum {
            LCD_MODE_STATUS,
#ifdef LCD_MENU
            LCD_MODE_MENU,
#endif
            LCD_MODE_CNT
        } lcd_mode;

        uint8_t lcd_mode_changed = 0;
#ifdef LCD_MODE_SWITCH_INPUT
        static int8_t old_sw_state = 0;
        int8_t sw_state = get_input_scaled(LCD_MODE_SWITCH_INPUT, -1, 1);
        if (old_sw_state != sw_state) {
            lcd_mode += LCD_MODE_CNT;
            lcd_mode += sw_state;
            lcd_mode %= LCD_MODE_CNT;
            old_sw_state = sw_state;
            lcd_mode_changed = 1;
        }
#endif
        switch (lcd_mode) {
        case LCD_MODE_STATUS:
            lcd_status_update(lcd_mode_changed);
            break;
#ifdef LCD_MENU
        case LCD_MODE_MENU:
            lcd_menu_update(lcd_mode_changed);
            break;
#endif
        default:
            break;
        }
#endif
    }
    return 0;
}
Esempio n. 3
0
void main(void) {
	unsigned char ch, x, y, z;
	int i = 0;
	int j = 0;
	unsigned char mode = 0x00;
	unsigned char oldMode = 0x00;

	// init buttons and seven-segment displays
	initIO();
	// init LCD
	initLCD();

	// initialize I/O-ports
	PDR08 = 0x00;
	DDR08 = 0x00;
	PIER08 = 0x24;    // SIN0, SIN1 input enable

	InitUart1();      // initialize UART

	Puts1("\nUART LCD Bridge\n");   // Output welcome string

	// reset buffer at startup
	//lcd_clear();
	lcd_splash();	// loading splashscreen
	lcd_flush();

	while (1) {
		if (SSR1_RDRF != 0) {			// Wait for data received
			ch = RDR1;					// Save receive register
			if ((SSR1 & 0xE0) != 0) {	// Check for errors PE, ORE, FRE
				SCR1_CRE = 1;			// Clear error flags
			}
			else {
				switch(mode) {
				case 0x00: // idle
					if(ch == 0xAA) {		// cmd for setPixel mode
						if(oldMode == 0xBB || oldMode == 0x00) {
							lcd_clear();
							lcd_flush();
						}
						mode = 0xAA;
						i=0;
					}
					if(ch == 0xBB) {		// cmd for framebuffer mode
						mode = 0xBB;
						i=0;
						j=0;
					}
					break;

				case 0xAA: // setPixel mode
					if (i == 0) {			// x coordinate
						x = ch;
						i++;
					} else if (i == 1) {	// y coordinate
						y = ch;
						i++;
					} else if (i == 2) {	// value (1=black,0="white")
						z = ch;
						i = 0;
						lcd_drawPixelDirect(x, y, z);
						oldMode = mode;
						mode = 0x00;
					}
					break;

				case 0xBB: // framebuffer mode
					lcd_buffer[i][j] = ch;	// write current uart buffer content to framebuffer
					if(j==7) {
						i++;
						j=0;
					}
					else
						j++;

					// print received framebuffer
					if(i>=128) {
						lcd_flush();
						oldMode = mode;
						mode = 0x00;
					}
					break;
				}
				Putch1(ch);	// debug output
			}
		}
	}
}