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; }
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; }
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 } } } }