ao-bringup-avr: Create common 'ao-bringup' interfaces
authorKeith Packard <keithp@keithp.com>
Fri, 13 May 2011 05:33:25 +0000 (22:33 -0700)
committerKeith Packard <keithp@keithp.com>
Fri, 13 May 2011 05:33:25 +0000 (22:33 -0700)
Initializes the clock, configures STDIO to talk to the UART

Signed-off-by: Keith Packard <keithp@keithp.com>
ao-bringup-avr/Makefile
ao-bringup-avr/ao-bringup.c [new file with mode: 0644]
ao-bringup-avr/ao-bringup.h [new file with mode: 0644]
ao-bringup-avr/ao-uart.c

index a110b50acd15dfc9d3d93b2119e0710e5355f379..53da439491966675bc9a2f934c8f41b365951d8b 100644 (file)
@@ -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 (file)
index 0000000..547c049
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * 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 (file)
index 0000000..543634a
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * 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 <stdio.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#define TEENSY 1
+#if TEENSY
+#define F_CPU 16000000UL       // 16 MHz
+#else
+#define F_CPU  8000000UL       // 8 MHz
+#endif
+#include <util/delay.h>
+
+#define LEDOUT         PORTB7
+#define LEDPORT                PORTB
+#define LEDDDR         DDRB
+#define LEDDDRPIN      DD7
+
+void   ao_bringup_init(void);
+
+#endif
index 3c290c1a0a1afd511a9c575ce8af72da72903605..611ded9aa6326b11a205d4c8fe6f2e8080e0fbce 100644 (file)
  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  */
 
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#define TEENSY 1
-#if TEENSY
-#define F_CPU 16000000UL       // 16 MHz
-#else
-#define F_CPU  8000000UL       // 8 MHz
-#endif
-#include <util/delay.h>
-
-#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");
        }
 }