From: Keith Packard Date: Fri, 13 May 2011 05:33:25 +0000 (-0700) Subject: ao-bringup-avr: Create common 'ao-bringup' interfaces X-Git-Tag: 0.9.3~32 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=96450bfb69784922c287a72ed0e2e3a72c089715 ao-bringup-avr: Create common 'ao-bringup' interfaces Initializes the clock, configures STDIO to talk to the UART Signed-off-by: Keith Packard --- diff --git a/ao-bringup-avr/Makefile b/ao-bringup-avr/Makefile index a110b50a..53da4394 100644 --- a/ao-bringup-avr/Makefile +++ b/ao-bringup-avr/Makefile @@ -8,6 +8,8 @@ CC=avr-gcc OBJCOPY=avr-objcopy CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues +OBJS = ao-blink.o ao-switch.o ao-uart.o ao-bringup.o + all: ao-blink.hex ao-switch.hex ao-uart.hex ao-blink.hex: ao-blink @@ -31,12 +33,14 @@ ao-uart.hex: ao-uart avr-size ao-uart $(OBJCOPY) -R .eeprom -O ihex ao-uart $@ -ao-uart: ao-uart.o - $(CC) $(CFLAGS) -o $@ ao-uart.o +ao-uart: ao-uart.o ao-bringup.o + $(CC) $(CFLAGS) -o $@ ao-uart.o ao-bringup.o ao-uart.s: ao-uart.c $(CC) $(CFLAGS) -S -o $@ ao-uart.c +$(OBJS): ao-bringup.h + load-blink: ao-blink.hex $(LOADCMD) $(LOADARG)ao-blink.hex diff --git a/ao-bringup-avr/ao-bringup.c b/ao-bringup-avr/ao-bringup.c new file mode 100644 index 00000000..547c0494 --- /dev/null +++ b/ao-bringup-avr/ao-bringup.c @@ -0,0 +1,119 @@ +/* + * Copyright © 2011 Keith Packard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#include "ao-bringup.h" + +static void +clock_init(void) +{ + /* disable RC clock */ + CLKSEL0 &= ~(1 << RCE); + + /* Disable PLL */ + PLLCSR &= ~(1 << PLLE); + + /* Enable external clock */ + CLKSEL0 |= (1 << EXTE); + + /* wait for external clock to be ready */ + while ((CLKSTA & (1 << EXTON)) == 0) + ; + + /* select external clock */ + CLKSEL0 |= (1 << CLKS); + + /* Disable the clock prescaler */ + cli(); + CLKPR = (1 << CLKPCE); + CLKPR = 0; + sei(); + + /* Set up the PLL to use the crystal */ + + /* Use primary system clock as PLL source */ + PLLFRQ = ((0 << PINMUX) | /* Use primary clock */ + (0 << PLLUSB) | /* No divide by 2 for USB */ + (0 << PLLTM0) | /* Disable high speed timer */ + (0x4 << PDIV0)); /* 48MHz PLL clock */ + + /* Set the frequency of the crystal */ +#if TEENSY + PLLCSR |= (1 << PINDIV); /* For 16MHz crystal on Teensy board */ +#else + PLLCSR &= ~(1 << PINDIV); /* For 8MHz crystal on TeleScience board */ +#endif + + /* Enable the PLL */ + PLLCSR |= (1 << PLLE); + while (!(PLLCSR & (1 << PLOCK))) + ; +} + +void +uart_send(char c) +{ + LEDPORT ^= (1 << LEDOUT); + loop_until_bit_is_set(UCSR1A, UDRE1); + UDR1 = c; +} + +int +uart_put(char c, FILE *stream) +{ + if (c == '\n') + uart_send('\r'); + uart_send(c); + return 0; +} + +int +uart_get(FILE *stream) +{ + loop_until_bit_is_set(UCSR1A, RXC1); + return (int) UDR1 & 0xff; +} + +void +uart_init(uint16_t baud) +{ + PRR1 &= ~(1 << PRUSART1); + UBRR1L = baud; + UBRR1H = baud >> 8; + UCSR1A = 0; + UCSR1B = ((1 << RXEN1) | /* Enable receiver */ + (1 << TXEN1)); /* Enable transmitter */ + UCSR1C = ((0 << UMSEL10) | /* Asynchronous mode */ + (0 << UPM10) | /* No parity */ + (0 << USBS1) | /* 1 stop bit */ + (3 << UCSZ10) | /* 8 bit characters */ + (0 << UCPOL1)); /* MBZ for async mode */ +} + +static FILE mystdout = FDEV_SETUP_STREAM(uart_put, NULL, _FDEV_SETUP_WRITE); + +static FILE mystdin = FDEV_SETUP_STREAM(NULL, uart_get, _FDEV_SETUP_READ); + +void ao_bringup_init(void) +{ + clock_init(); + uart_init(F_CPU / (16UL * 9600UL) - 1); + + stdout = &mystdout; + stdin = &mystdin; + + LEDDDR |= (1 << LEDDDRPIN); +} diff --git a/ao-bringup-avr/ao-bringup.h b/ao-bringup-avr/ao-bringup.h new file mode 100644 index 00000000..543634a5 --- /dev/null +++ b/ao-bringup-avr/ao-bringup.h @@ -0,0 +1,39 @@ +/* + * Copyright © 2011 Keith Packard + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +#ifndef _AO_BRINGUP_ +#define _AO_BRINGUP_ + +#include +#include +#include +#define TEENSY 1 +#if TEENSY +#define F_CPU 16000000UL // 16 MHz +#else +#define F_CPU 8000000UL // 8 MHz +#endif +#include + +#define LEDOUT PORTB7 +#define LEDPORT PORTB +#define LEDDDR DDRB +#define LEDDDRPIN DD7 + +void ao_bringup_init(void); + +#endif diff --git a/ao-bringup-avr/ao-uart.c b/ao-bringup-avr/ao-uart.c index 3c290c1a..611ded9a 100644 --- a/ao-bringup-avr/ao-uart.c +++ b/ao-bringup-avr/ao-uart.c @@ -15,121 +15,13 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -#include -#include -#define TEENSY 1 -#if TEENSY -#define F_CPU 16000000UL // 16 MHz -#else -#define F_CPU 8000000UL // 8 MHz -#endif -#include - -#define LEDOUT PORTB7 -#define LEDPORT PORTB -#define LEDDDR DDRB -#define LEDDDRPIN DD7 - -static void -timer1_init(void) -{ - TCCR1A = ((0 << WGM11) | /* CTC mode, OCR1A */ - (0 << WGM10)); /* CTC mode, OCR1A */ - TCCR1B = ((0 << ICNC1) | /* no input capture noise canceler */ - (0 << ICES1) | /* input capture on falling edge (don't care) */ - (0 << WGM13) | /* CTC mode, OCR1A */ - (1 << WGM12) | /* CTC mode, OCR1A */ - (3 << CS10)); /* clk/64 from prescaler */ - -#if TEENSY - OCR1A = 2500; /* 16MHz clock */ -#else - OCR1A = 1250; /* 8MHz clock */ -#endif - - TIMSK1 = (1 << OCIE1A); /* Interrupt on compare match */ -} - -static void -clock_init(void) -{ - /* disable RC clock */ - CLKSEL0 &= ~(1 << RCE); - - /* Disable PLL */ - PLLCSR &= ~(1 << PLLE); - - /* Enable external clock */ - CLKSEL0 |= (1 << EXTE); - - /* wait for external clock to be ready */ - while ((CLKSTA & (1 << EXTON)) == 0) - ; - - /* select external clock */ - CLKSEL0 |= (1 << CLKS); - - /* Disable the clock prescaler */ - cli(); - CLKPR = (1 << CLKPCE); - CLKPR = 0; - sei(); - - /* Set up the PLL to use the crystal */ - - /* Use primary system clock as PLL source */ - PLLFRQ = ((0 << PINMUX) | /* Use primary clock */ - (0 << PLLUSB) | /* No divide by 2 for USB */ - (0 << PLLTM0) | /* Disable high speed timer */ - (0x4 << PDIV0)); /* 48MHz PLL clock */ - - /* Set the frequency of the crystal */ -#if TEENSY - PLLCSR |= (1 << PINDIV); /* For 16MHz crystal on Teensy board */ -#else - PLLCSR &= ~(1 << PINDIV); /* For 8MHz crystal on TeleScience board */ -#endif - - /* Enable the PLL */ - PLLCSR |= (1 << PLLE); - while (!(PLLCSR & (1 << PLOCK))) - ; -} - -void -uart_send(char data) -{ - while (!(UCSR1A & (1 << UDRE1))) - ; - UDR1 = data; -} - -void -uart_init(uint16_t baud) -{ - PRR1 &= ~(1 << PRUSART1); - UBRR1L = baud; - UBRR1H = baud >> 8; - UCSR1A = 0; - UCSR1B = ((1 << RXEN1) | /* Enable receiver */ - (1 << TXEN1)); /* Enable transmitter */ - UCSR1C = ((0 << UMSEL10) | /* Asynchronous mode */ - (0 << UPM10) | /* No parity */ - (0 << USBS1) | /* 1 stop bit */ - (3 << UCSZ10) | /* 8 bit characters */ - (0 << UCPOL1)); /* MBZ for async mode */ -} +#include "ao-bringup.h" int main(void) { - clock_init(); - timer1_init(); - uart_init(832); - - LEDDDR |= (1 << LEDDDRPIN); + ao_bringup_init(); for (;;) { - LEDPORT ^= (1 << LEDOUT); - uart_send('H'); + printf("Hello, world\n"); } }