Add stk500 platform and changes suggested by Daniel Willmann

This commit is contained in:
David Kopf 2011-08-03 11:18:55 -04:00
parent e953b66f78
commit e2ad2acde4
16 changed files with 945 additions and 45 deletions

View file

@ -44,7 +44,7 @@
* The RAM needed for each entry depends on script enabling and buffer sizes; see struct httpd_state below. * The RAM needed for each entry depends on script enabling and buffer sizes; see struct httpd_state below.
* Typical range is 100 - 200 bytes per connection * Typical range is 100 - 200 bytes per connection
*/ */
#if CONTIKI_TARGET_SKY #if CONTIKI_TARGET_SKY || CONTIKI_TARGET_STK500
#define WEBSERVER_CONF_CONNS 2 #define WEBSERVER_CONF_CONNS 2
#define WEBSERVER_CONF_NAMESIZE 16 #define WEBSERVER_CONF_NAMESIZE 16
#define WEBSERVER_CONF_BUFSIZE 40 #define WEBSERVER_CONF_BUFSIZE 40

View file

@ -38,6 +38,7 @@
#include "dev/rs232.h" #include "dev/rs232.h"
#include "elfloader-arch.h" #include "elfloader-arch.h"
#include "lib/mmem.h" #include "lib/mmem.h"
#include <string.h> //memset
#define R_AVR_NONE 0 #define R_AVR_NONE 0
#define R_AVR_32 1 #define R_AVR_32 1
@ -116,7 +117,7 @@ BOOTLOADER_SECTION void
elfloader_arch_write_rom(int fd, unsigned short textoff, unsigned int size, char *mem) elfloader_arch_write_rom(int fd, unsigned short textoff, unsigned int size, char *mem)
{ {
unsigned char buf[SPM_PAGESIZE]; unsigned char buf[SPM_PAGESIZE];
unsigned short* flashptr = mem; unsigned short* flashptr = (unsigned short *) mem;
// Sanity-check size of loadable module // Sanity-check size of loadable module
@ -127,7 +128,7 @@ elfloader_arch_write_rom(int fd, unsigned short textoff, unsigned int size, char
// Seek to patched module and burn it to flash (in chunks of // Seek to patched module and burn it to flash (in chunks of
// size SPM_PAGESIZE, i.e. 256 bytes on the ATmega128) // size SPM_PAGESIZE, i.e. 256 bytes on the ATmega128)
cfs_seek(fd, textoff, CFS_SEEK_SET); cfs_seek(fd, textoff, CFS_SEEK_SET);
for (flashptr=mem; flashptr < mem + size; flashptr += SPM_PAGESIZE) { for (flashptr=(unsigned short *)mem; flashptr < (unsigned short *) mem + size; flashptr += SPM_PAGESIZE) {
memset (buf, 0, SPM_PAGESIZE); memset (buf, 0, SPM_PAGESIZE);
cfs_read(fd, buf, SPM_PAGESIZE); cfs_read(fd, buf, SPM_PAGESIZE);

View file

@ -177,8 +177,8 @@ endif
# $(STRIP) --strip-unneeded -g -x $@ # $(STRIP) --strip-unneeded -g -x $@
%.co: %.c %.co: %.c
cp ${CONTIKI}/tools/empty-symbols.c symbols.c cp $(CONTIKI)/tools/empty-symbols.c symbols.c
cp ${CONTIKI}/tools/empty-symbols.h symbols.h cp $(CONTIKI)/tools/empty-symbols.h symbols.h
$(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@ $(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@
%-stripped.o: %.o %-stripped.o: %.o
@ -191,8 +191,15 @@ endif
$(OBJCOPY) -O srec $< $@ $(OBJCOPY) -O srec $< $@
### Upload image ### Upload image
#Let avrdude use defaults if port or programmer not defined
ifdef AVRDUDE_PORT
AVRDUDE_PORT:=-P $(AVRDUDE_PORT)
endif
ifdef AVRDUDE_PROGRAMMER
AVRDUDE_PROGRAMMER:=-c $(AVRDUDE_PROGRAMMER)
endif
%.u: %.hex %.u: %.hex
avrdude ${AVRDUDE_OPTIONS} -P ${AVRDUDE_PORT} -c ${AVRDUDE_PROGRAMMER} -p ${MCU} -U flash:w:$< avrdude $(AVRDUDE_OPTIONS) $(AVRDUDE_PORT) $(AVRDUDE_PROGRAMMER) -p $(MCU) -U flash:w:$<
symbols.c: symbols.c:
cp ${CONTIKI}/tools/empty-symbols.c symbols.c cp ${CONTIKI}/tools/empty-symbols.c symbols.c

View file

@ -6,13 +6,25 @@
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
#include "dev/usb/usb_drv.h" #include "dev/usb/usb_drv.h"
//Not all AVR toolchains alias MCUSR to the older MSUSCR name
//#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega8515__) || defined (__AVR_ATmega16__)
#if !defined (MCUSR) && defined (MCUCSR)
#warning *** MCUSR not defined, using MCUCSR instead ***
#define MCUSR MCUCSR
#endif
volatile uint32_t Boot_Key ATTR_NO_INIT; volatile uint32_t Boot_Key ATTR_NO_INIT;
bool bool
bootloader_is_present(void) { bootloader_is_present(void) {
#if defined(RAMPZ)
return pgm_read_word_far(BOOTLOADER_START_ADDRESS)!=0xFFFF; return pgm_read_word_far(BOOTLOADER_START_ADDRESS)!=0xFFFF;
#else
/* Probably can just return false when < 64K flash */
// return pgm_read_word_near(BOOTLOADER_START_ADDRESS)!=0xFFFF;
return false;
#endif
} }
void void
Jump_To_Bootloader(void) Jump_To_Bootloader(void)
{ {

View file

@ -148,6 +148,102 @@
TIMSK0 = _BV (OCIE0A); TIMSK0 = _BV (OCIE0A);
#endif /* AVR_CONF_USE32KCRYSTAL */ #endif /* AVR_CONF_USE32KCRYSTAL */
#elif defined (__AVR_ATmega644__) || defined (__AVR_ATmega328P__)
#define OCRSetup() \
/* Set counter to zero */ \
TCNT0 = 0; \
\
/* \
* Set comparison register: \
* Crystal freq. is 8000000,\
* pre-scale factor is 256, i.e. we have 125 "ticks" / sec: \
* 8000000 = 256 * 250 * 125 \
*/ \
OCR0A = 250; \
\
/* \
* Set timer control register: \
* - prescale: 256 (CS02) \
* - counter reset via comparison register (WGM01) \
*/ \
TCCR0A = _BV(WGM01); \
TCCR0B = _BV(CS02); \
\
/* Clear interrupt flag register */ \
TIFR0 = 0x00; \
\
/* \
* Raise interrupt when value in OCR0 is reached. Note that the \
* counter value in TCNT0 is cleared automatically. \
*/ \
TIMSK0 = _BV (OCIE0A);
#define AVR_OUTPUT_COMPARE_INT TIMER0_COMPA_vect
#elif defined (__AVR_ATmega8515__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__)
#define AVR_OUTPUT_COMPARE_INT TIMER0_COMP_vect
#define OCRSetup() \
/* Set counter to zero */ \
TCNT0 = 0; \
\
/* \
* Set comparison register: \
* Crystal freq. is 8000000,\
* pre-scale factor is 256, i.e. we have 125 "ticks" / sec: \
* 8000000 = 256 * 250 * 125 \
*/ \
OCR0 = 250; \
\
/* \
* Set timer control register: \
* - prescale: 256 (CS02) \
* - counter reset via comparison register (WGM01) \
*/ \
TCCR0 = _BV(CS02) | _BV(WGM01); \
\
/* Clear interrupt flag register */ \
TIFR = 0x00; \
\
/* \
* Raise interrupt when value in OCR0 is reached. Note that the \
* counter value in TCNT0 is cleared automatically. \
*/ \
TIMSK = _BV (OCIE0);
#elif defined (__AVR_ATmega8__)
#define AVR_OUTPUT_COMPARE_INT TIMER2_COMP_vect
#define OCRSetup() \
/* Set counter to zero */ \
TCNT2 = 0; \
\
/* \
* Set comparison register: \
* Crystal freq. is 8000000,\
* pre-scale factor is 256, i.e. we have 125 "ticks" / sec: \
* 8000000 = 256 * 250 * 125 \
*/ \
OCR2 = 250; \
\
/* \
* Set timer control register: \
* - prescale: 256 (CS21 CS22) \
* - counter reset via comparison register (WGM21) \
*/ \
TCCR2 = _BV(CS22) | _BV(CS21) | _BV(WGM21); \
\
/* Clear interrupt flag register */ \
TIFR = 0x00; \
\
/* \
* Raise interrupt when value in OCR2 is reached. Note that the \
* counter value in TCNT2 is cleared automatically. \
*/ \
TIMSK = _BV (OCIE2);
#else #else
#error "Setup CPU in clock-avr.h" #error "Setup CPU in clock-avr.h"
#endif #endif

View file

@ -42,6 +42,14 @@
#include "dev/slip.h" #include "dev/slip.h"
#include "dev/rs232.h" #include "dev/rs232.h"
/*ATmega32 and smaller have UBRRH/UCSRC at the same I/O address.
*USART_UCSRC_SEL (bit7) selects writing to UBRHH(0) or UCSRC(1).
*It is OR'd in below so if not defined we can just set it to zero.
*/
#ifndef USART_UCSRC_SEL
#define USART_UCSRC_SEL 0x00
#endif
#ifdef RS232_CONF_PRINTF_BUFFER_LENGTH #ifdef RS232_CONF_PRINTF_BUFFER_LENGTH
#define RS232_PRINTF_BUFFER_LENGTH RS232_CONF_PRINTF_BUFFER_LENGTH #define RS232_PRINTF_BUFFER_LENGTH RS232_CONF_PRINTF_BUFFER_LENGTH
#else #else
@ -52,17 +60,17 @@
#define ADD_CARRAGE_RETURNS_TO_SERIAL_OUTPUT 1 #define ADD_CARRAGE_RETURNS_TO_SERIAL_OUTPUT 1
#endif #endif
#if defined (__AVR_ATmega128__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega128RFA1__)
typedef struct { typedef struct {
volatile uint8_t * UDR; volatile uint8_t * udr;
volatile uint8_t * UBRRH; volatile uint8_t * ubrrh;
volatile uint8_t * UBRRL; volatile uint8_t * ubrrl;
volatile uint8_t * UCSRB; volatile uint8_t * ucsrb;
volatile uint8_t * UCSRC; volatile uint8_t * ucsrc;
volatile uint8_t txwait; volatile uint8_t txwait;
int (* input_handler)(unsigned char); int (* input_handler)(unsigned char);
} rs232_t; } rs232_t;
#if defined (__AVR_ATmega128__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega128RFA1__)
static rs232_t rs232_ports[2] = { static rs232_t rs232_ports[2] = {
{ // UART0 { // UART0
&UDR0, &UDR0,
@ -84,6 +92,49 @@ static rs232_t rs232_ports[2] = {
NULL NULL
} }
}; };
#elif defined (__AVR_AT90USB1287__)
/* Has only UART1, map it to port 0 */
static rs232_t rs232_ports[1] = {
{ // UART1
&UDR1,
&UBRR1H,
&UBRR1L,
&UCSR1B,
&UCSR1C,
0,
NULL
}
};
#elif defined (__AVR_ATmega8__) || defined (__AVR_ATmega8515__) \
|| defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__)
static rs232_t rs232_ports[1] = {
{ // UART0
&UDR,
&UBRRH,
&UBRRL,
&UCSRB,
&UCSRC,
0,
NULL
}
};
#elif defined (__AVR_ATmega644__) || defined (__AVR_ATmega328P__)
static rs232_t rs232_ports[1] = {
{ // UART0
&UDR0,
&UBRR0H,
&UBRR0L,
&UCSR0B,
&UCSR0C,
0,
NULL
}
};
#else
#error Please define the UART registers for your MCU!
#endif
#if defined (__AVR_ATmega128__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega1281__) || defined(__AVR_ATmega128RFA1__)
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
ISR(USART0_TX_vect) ISR(USART0_TX_vect)
{ {
@ -95,7 +146,7 @@ ISR(USART0_RX_vect)
{ {
unsigned char c; unsigned char c;
c = *(rs232_ports[RS232_PORT_0].UDR); c = *(rs232_ports[RS232_PORT_0].udr);
if(rs232_ports[RS232_PORT_0].input_handler != NULL) { if(rs232_ports[RS232_PORT_0].input_handler != NULL) {
rs232_ports[RS232_PORT_0].input_handler(c); rs232_ports[RS232_PORT_0].input_handler(c);
@ -112,25 +163,68 @@ ISR(USART1_RX_vect)
{ {
unsigned char c; unsigned char c;
c = *(rs232_ports[RS232_PORT_1].UDR); c = *(rs232_ports[RS232_PORT_1].udr);
if(rs232_ports[RS232_PORT_1].input_handler != NULL) { if(rs232_ports[RS232_PORT_1].input_handler != NULL) {
rs232_ports[RS232_PORT_1].input_handler(c); rs232_ports[RS232_PORT_1].input_handler(c);
} }
} }
#elif defined (__AVR_AT90USB1287__) #elif defined (__AVR_ATmega644__)
/* Has only UART1, map it to port 0 */ /*---------------------------------------------------------------------------*/
typedef struct { ISR(USART0_TX_vect)
volatile uint8_t * UDR; {
volatile uint8_t * UBRRH; rs232_ports[RS232_PORT_0].txwait = 0;
volatile uint8_t * UBRRL; }
volatile uint8_t * UCSRB; /*---------------------------------------------------------------------------*/
volatile uint8_t * UCSRC; ISR(USART0_RX_vect)
volatile uint8_t txwait; {
int (* input_handler)(unsigned char); unsigned char c;
} rs232_t;
c = *(rs232_ports[RS232_PORT_0].udr);
if(rs232_ports[RS232_PORT_0].input_handler != NULL) {
rs232_ports[RS232_PORT_0].input_handler(c);
}
}
#elif defined (__AVR_ATmega8__) || defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__)
/*---------------------------------------------------------------------------*/
ISR(USART_TXC_vect)
{
rs232_ports[RS232_PORT_0].txwait = 0;
}
/*---------------------------------------------------------------------------*/
ISR(USART_RXC_vect)
{
unsigned char c;
c = *(rs232_ports[RS232_PORT_0].udr);
if(rs232_ports[RS232_PORT_0].input_handler != NULL) {
rs232_ports[RS232_PORT_0].input_handler(c);
}
}
#elif defined (__AVR_ATmega8515__) || defined (__AVR_ATmega328P__)
/*---------------------------------------------------------------------------*/
ISR(USART_TX_vect)
{
rs232_ports[RS232_PORT_0].txwait = 0;
}
/*---------------------------------------------------------------------------*/
ISR(USART_RX_vect)
{
unsigned char c;
c = *(rs232_ports[RS232_PORT_0].udr);
if(rs232_ports[RS232_PORT_0].input_handler != NULL) {
rs232_ports[RS232_PORT_0].input_handler(c);
}
}
#elif defined (__AVR_AT90USB1287__)
static rs232_t rs232_ports[1] = { static rs232_t rs232_ports[1] = {
{ // UART1 { // UART1
&UDR1, &UDR1,
@ -153,7 +247,7 @@ ISR(USART1_RX_vect)
{ {
unsigned char c; unsigned char c;
c = *(rs232_ports[RS232_PORT_0].UDR); c = *(rs232_ports[RS232_PORT_0].udr);
if(rs232_ports[RS232_PORT_0].input_handler != NULL) { if(rs232_ports[RS232_PORT_0].input_handler != NULL) {
rs232_ports[RS232_PORT_0].input_handler(c); rs232_ports[RS232_PORT_0].input_handler(c);
@ -167,14 +261,14 @@ ISR(USART1_RX_vect)
void void
rs232_init (uint8_t port, uint8_t bd, uint8_t ffmt) rs232_init (uint8_t port, uint8_t bd, uint8_t ffmt)
{ {
*(rs232_ports[port].UBRRH) = (uint8_t)(bd>>8); *(rs232_ports[port].ubrrh) = (uint8_t)(bd>>8);
*(rs232_ports[port].UBRRL) = (uint8_t)bd; *(rs232_ports[port].ubrrl) = (uint8_t)bd;
/* /*
* - Enable receiver and transmitter, * - Enable receiver and transmitter,
* - Enable interrupts for receiver and transmitter * - Enable interrupts for receiver and transmitter
*/ */
*(rs232_ports[port].UCSRB) = USART_INTERRUPT_RX_COMPLETE | USART_INTERRUPT_TX_COMPLETE | \ *(rs232_ports[port].ucsrb) = USART_INTERRUPT_RX_COMPLETE | USART_INTERRUPT_TX_COMPLETE | \
USART_RECEIVER_ENABLE | USART_TRANSMITTER_ENABLE; USART_RECEIVER_ENABLE | USART_TRANSMITTER_ENABLE;
/* /*
@ -184,7 +278,7 @@ rs232_init (uint8_t port, uint8_t bd, uint8_t ffmt)
* - charater size (9 bits are currently not supported) * - charater size (9 bits are currently not supported)
* - clock polarity * - clock polarity
*/ */
*(rs232_ports[port].UCSRC) = ffmt; *(rs232_ports[port].ucsrc) = USART_UCSRC_SEL | ffmt;
rs232_ports[port].txwait = 0; rs232_ports[port].txwait = 0;
@ -230,7 +324,7 @@ void
rs232_send(uint8_t port, unsigned char c) rs232_send(uint8_t port, unsigned char c)
{ {
rs232_ports[port].txwait = 1; rs232_ports[port].txwait = 1;
*(rs232_ports[port].UDR) = c; *(rs232_ports[port].udr) = c;
while(rs232_ports[port].txwait); while(rs232_ports[port].txwait);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/

View file

@ -50,11 +50,21 @@
#include "dev/rs232_at90usb1287.h" #include "dev/rs232_at90usb1287.h"
#elif defined (__AVR_ATmega128RFA1__) #elif defined (__AVR_ATmega128RFA1__)
#include "dev/rs232_atmega128rfa1.h" #include "dev/rs232_atmega128rfa1.h"
#elif defined (__AVR_ATmega644__) || defined (__AVR_ATmega328P__)
#include "dev/rs232_atmega644.h"
#elif defined (__AVR_ATmega8__) || defined (__AVR_ATmega8515__) \
|| defined (__AVR_ATmega16__) || defined (__AVR_ATmega32__)
#include "dev/rs232_atmega32.h"
#else #else
#error "Please implement a rs232 header for your MCU (or set the MCU type \ #error "Please implement a rs232 header for your MCU (or set the MCU type \
in contiki-conf.h)." in contiki-conf.h)."
#endif #endif
/******************************************************************************/
/*** Baud rates */
/******************************************************************************/
#define BAUD_RATE(x) (F_CPU/16/x-1)
/** /**
* \brief Initialize the RS232 module * \brief Initialize the RS232 module
* *

View file

@ -0,0 +1,147 @@
/*
* Copyright (c) 2006, Technical University of Munich
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
* @(#)$$
*/
/**
* \file
* AVR specific definitions for the rs232 port.
*
* \author
* Simon Barner <barner@in.tum.de>
* Daniel Willmann <daniel@totalueberwachung.de>
*/
#ifndef __RS232_ATMEGA32__
#define __RS232_ATMEGA32__
/******************************************************************************/
/*** Includes */
/******************************************************************************/
#include <avr/io.h>
/******************************************************************************/
/*** RS232 ports */
/******************************************************************************/
#define RS232_PORT_0 0
/******************************************************************************/
/*** Baud rates */
/******************************************************************************/
#if F_CPU == 16000000
/* Single speed operation (U2X = 0)*/
#define USART_BAUD_2400 416
#define USART_BAUD_4800 207
#define USART_BAUD_9600 103
#define USART_BAUD_14400 68
#define USART_BAUD_19200 51
#define USART_BAUD_28800 34
#define USART_BAUD_38400 25
#define USART_BAUD_57600 16
#define USART_BAUD_76800 12
#define USART_BAUD_115200 8
#define USART_BAUD_230400 3
#define USART_BAUD_250000 3
#define USART_BAUD_500000 1
#define USART_BAUD_1000000 0
#elif F_CPU == 8000000
/* Single speed operation (U2X = 0)*/
#define USART_BAUD_2400 207
#define USART_BAUD_4800 103
#define USART_BAUD_9600 51
#define USART_BAUD_14400 34
#define USART_BAUD_19200 25
#define USART_BAUD_28800 16
#define USART_BAUD_38400 12
#define USART_BAUD_57600 8
#define USART_BAUD_76800 6
#define USART_BAUD_115200 3
#define USART_BAUD_230400 1
#define USART_BAUD_250000 1
#define USART_BAUD_500000 0
#else
#error "Please define the baud rates for your CPU clock: ATmega32 handbook p. \
163-166 or set the rate in contiki-conf.h"
#endif
/******************************************************************************/
/*** Interrupt settings */
/******************************************************************************/
#define USART_INTERRUPT_RX_COMPLETE _BV (RXCIE)
#define USART_INTERRUPT_TX_COMPLETE _BV (TXCIE)
#define USART_INTERRUPT_DATA_REG_EMPTY _BV (UDRIE)
/******************************************************************************/
/*** Receiver / transmitter */
/******************************************************************************/
#define USART_RECEIVER_ENABLE _BV (RXEN)
#define USART_TRANSMITTER_ENABLE _BV (TXEN)
/******************************************************************************/
/*** Register select */
/******************************************************************************/
#define USART_UCSRC_SEL _BV (URSEL)
/******************************************************************************/
/*** Mode select */
/******************************************************************************/
#define USART_MODE_ASYNC 0x00
#define USART_MODE_SYNC _BV (UMSEL)
/******************************************************************************/
/*** Parity */
/******************************************************************************/
#define USART_PARITY_NONE 0x00
#define USART_PARITY_EVEN _BV (UPM1)
#define USART_PARITY_ODD _BV (UPM1) | _BV (UPM0)
/******************************************************************************/
/*** Stop bits */
/******************************************************************************/
#define USART_STOP_BITS_1 0x00
#define USART_STOP_BITS_2 _BV (USBS)
/******************************************************************************/
/*** Character size */
/******************************************************************************/
#define USART_DATA_BITS_5 0x00
#define USART_DATA_BITS_6 _BV (UCSZ0)
#define USART_DATA_BITS_7 _BV (UCSZ1)
#define USART_DATA_BITS_8 _BV (UCSZ1) | _BV (UCSZ0)
// #define USART_DATA_BITS_9 (needs also UCSZ2 bit in UCSRnB)
/******************************************************************************/
/*** Clock polarity */
/******************************************************************************/
#define USART_RISING_XCKN_EDGE 0x00
#define USART_FALLING_XCKN_EDGE _BV (UCPOL)
#endif /* #ifndef __RS232_ATMEGA32__ */

View file

@ -0,0 +1,141 @@
/*
* Copyright (c) 2006, Technical University of Munich
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
* @(#)$$
*/
/**
* \file
* AVR specific definitions for the rs232 port.
*
* \author
* Simon Barner <barner@in.tum.de
*/
#ifndef __RS232_ATMEGA644__
#define __RS232_ATMEGA644__
/******************************************************************************/
/*** Includes */
/******************************************************************************/
#include <avr/io.h>
/******************************************************************************/
/*** RS232 ports */
/******************************************************************************/
#define RS232_PORT_0 0
/******************************************************************************/
/*** Baud rates */
/******************************************************************************/
#if F_CPU == 16000000
/* Single speed operation (U2X = 0)*/
#define USART_BAUD_2400 416
#define USART_BAUD_4800 207
#define USART_BAUD_9600 103
#define USART_BAUD_14400 68
#define USART_BAUD_19200 51
#define USART_BAUD_28800 34
#define USART_BAUD_38400 25
#define USART_BAUD_57600 16
#define USART_BAUD_76800 12
#define USART_BAUD_115200 8
#define USART_BAUD_230400 3
#define USART_BAUD_250000 3
#define USART_BAUD_500000 1
#define USART_BAUD_1000000 0
#elif F_CPU == 8000000
/* Single speed operation (U2X = 0)*/
#define USART_BAUD_2400 207
#define USART_BAUD_4800 103
#define USART_BAUD_9600 51
#define USART_BAUD_14400 34
#define USART_BAUD_19200 25
#define USART_BAUD_28800 16
#define USART_BAUD_38400 12
#define USART_BAUD_57600 8
#define USART_BAUD_76800 6
#define USART_BAUD_115200 3
#define USART_BAUD_230400 1
#define USART_BAUD_250000 1
#define USART_BAUD_500000 0
#else
#error "Please define the baud rates for your CPU clock: ATmega644 handbook p. \
187-190 or set the rate in contiki-conf.h"
#endif
/******************************************************************************/
/*** Interrupt settings */
/******************************************************************************/
#define USART_INTERRUPT_RX_COMPLETE _BV (RXCIE0)
#define USART_INTERRUPT_TX_COMPLETE _BV (TXCIE0)
#define USART_INTERRUPT_DATA_REG_EMPTY _BV (UDRIE0)
/******************************************************************************/
/*** Receiver / transmitter */
/******************************************************************************/
#define USART_RECEIVER_ENABLE _BV (RXEN0)
#define USART_TRANSMITTER_ENABLE _BV (TXEN0)
/******************************************************************************/
/*** Mode select */
/******************************************************************************/
#define USART_MODE_ASYNC 0x00
#define USART_MODE_SYNC _BV (UMSEL00)
/******************************************************************************/
/*** Parity */
/******************************************************************************/
#define USART_PARITY_NONE 0x00
#define USART_PARITY_EVEN _BV (UPM01)
#define USART_PARITY_ODD _BV (UPM01) | _BV (UPM00)
/******************************************************************************/
/*** Stop bits */
/******************************************************************************/
#define USART_STOP_BITS_1 0x00
#define USART_STOP_BITS_2 _BV (USBS)
/******************************************************************************/
/*** Character size */
/******************************************************************************/
#define USART_DATA_BITS_5 0x00
#define USART_DATA_BITS_6 _BV (UCSZ00)
#define USART_DATA_BITS_7 _BV (UCSZ01)
#define USART_DATA_BITS_8 _BV (UCSZ01) | _BV (UCSZ00)
// #define USART_DATA_BITS_9 (needs also UCSZ2 bit in UCSRnB)
/******************************************************************************/
/*** Clock polarity */
/******************************************************************************/
#define USART_RISING_XCKN_EDGE 0x00
#define USART_FALLING_XCKN_EDGE _BV (UCPOL0)
#endif /* #ifndef __RS232_ATMEGA644__ */

View file

@ -70,6 +70,13 @@
#define ETIFR TIFR3 #define ETIFR TIFR3
#define TICIE3 ICIE3 #define TICIE3 ICIE3
#endif #endif
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega644__)
#define TIMSK TIMSK1
#define TICIE1 ICIE1
#define TIFR TIFR1
#endif
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
#ifdef TCNT3 #ifdef TCNT3
ISR (TIMER3_COMPA_vect) { ISR (TIMER3_COMPA_vect) {
@ -84,8 +91,13 @@ ISR (TIMER3_COMPA_vect) {
ENERGEST_OFF(ENERGEST_TYPE_IRQ); ENERGEST_OFF(ENERGEST_TYPE_IRQ);
} }
#else #elif RTIMER_ARCH_PRESCALER
#error "No Timer3 in rtimer-arch.c" #warning "No Timer3 in rtimer-arch.c - using Timer1 instead"
ISR (TIMER1_COMPA_vect) {
TIMSK &= ~((1<<TICIE1)|(1<<OCIE1A)|(1<<OCIE1B)|(1<<TOIE1));
rtimer_run_next();
}
#endif #endif
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -113,14 +125,40 @@ rtimer_arch_init(void)
/* Reset counter */ /* Reset counter */
TCNT3 = 0; TCNT3 = 0;
/* Start clock, maximum prescaler */ /* Start clock, maximum prescaler (1024)*/
TCCR3B |= 5; TCCR3B |= 5;
#else #elif RTIMER_ARCH_PRESCALER
#error "No Timer3 in rtimer-arch.c" /* Leave timer1 alone if PRESCALER set to zero */
/* Obviously you can not then use rtimers */
TIMSK &= ~((1<<TICIE1)|(1<<OCIE1A)|(1<<OCIE1B)|(1<<TOIE1));
TIFR |= (1 << ICF1) | (1 << OCF1A) | (1 << OCF1B) | (1 << TOV1);
/* Default timer behaviour */
TCCR1A = 0;
TCCR1B = 0;
/* Reset counter */
TCNT1 = 0;
/* Start clock */
#if RTIMER_ARCH_PRESCALER==1024
TCCR1B |= 5;
#elif RTIMER_ARCH_PRESCALER==256
TCCR1B |= 4;
#elif RTIMER_ARCH_PRESCALER==64
TCCR1B |= 3;
#elif RTIMER_ARCH_PRESCALER==8
TCCR1B |= 2;
#elif RTIMER_ARCH_PRESCALER==1
TCCR1B |= 1;
#else
#error PRESCALER factor not supported.
#endif #endif
#endif /* TCNT3 */
/* Restore interrupt state */ /* Restore interrupt state */
SREG = sreg; SREG = sreg;
} }
@ -142,8 +180,11 @@ rtimer_arch_schedule(rtimer_clock_t t)
/* Enable interrupt on OCR3A match */ /* Enable interrupt on OCR3A match */
ETIMSK |= (1 << OCIE3A); ETIMSK |= (1 << OCIE3A);
#else #elif RTIMER_ARCH_PRESCALER
#error "No Timer3 in rtimer-arch.c" /* Set compare register */
OCR1A = t;
TIFR |= (1 << ICF1) | (1 << OCF1A) | (1 << OCF1B) | (1 << TOV1);
TIMSK |= (1 << OCIE1A);
#endif #endif

View file

@ -36,15 +36,21 @@
#include <avr/interrupt.h> #include <avr/interrupt.h>
/* Will affect radio on/off timing for cx-mac */ /* Nominal ARCH_SECOND is F_CPU/prescaler, e.g. 8000000/1024 = 7812 */
#define RTIMER_ARCH_SECOND (8192) #ifndef RTIMER_ARCH_PRESCALER
#define RTIMER_ARCH_PRESCALER 1024UL
#endif
#define RTIMER_ARCH_SECOND (F_CPU/RTIMER_ARCH_PRESCALER)
/* Use TCNT1 if TCNT3 not available.
* Setting RTIMER_ARCH_PRESCALER to 0 will leave timer1 alone.
* Obviously this will disable rtimers.
*/
/* Handle that not all AVRs have TCNT3 - this should be configuratble
in contiki-conf later! */
#ifdef TCNT3 #ifdef TCNT3
#define rtimer_arch_now() (TCNT3) #define rtimer_arch_now() (TCNT3)
#elif RTIMER_ARCH_PRESCALER
#define rtimer_arch_now() (TCNT1)
#else #else
#define rtimer_arch_now() (0) #define rtimer_arch_now() (0)
#endif #endif

View file

@ -64,6 +64,13 @@
#include <avr/wdt.h> #include <avr/wdt.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
//Not all AVR toolchains alias MCUSR to the older MSUSCR name
//#if defined (__AVR_ATmega8__) || defined (__AVR_ATmega8515__) || defined (__AVR_ATmega16__)
#if !defined (MCUSR) && defined (MCUCSR)
#warning *** MCUSR not defined, using MCUCSR instead ***
#define MCUSR MCUCSR
#endif
#if WATCHDOG_CONF_BALANCE && WATCHDOG_CONF_TIMEOUT >= 0 #if WATCHDOG_CONF_BALANCE && WATCHDOG_CONF_TIMEOUT >= 0
static int stopped = 0; static int stopped = 0;
#endif #endif
@ -129,4 +136,4 @@ watchdog_reboot(void)
ISR(WDT_vect) ISR(WDT_vect)
{ {
} }
#endif #endif

7
platform/stk500/Makefile Normal file
View file

@ -0,0 +1,7 @@
all: contiki-stk500-main.out
upload: contiki-stk500-main.u
CONTIKI=../..
TARGET=stk500
include $(CONTIKI)/Makefile.include

View file

@ -0,0 +1,19 @@
CONTIKI_TARGET_DIRS = . dev apps loader
CONTIKI_TARGET_MAIN = contiki-stk500-main.o
CONTIKI_SOURCEFILES += rs232.c contiki-stk500-main.c
CONTIKI_NO_NET=1
CONTIKIAVR=$(CONTIKI)/cpu/avr
CONTIKIBOARD=.
//MCU=atmega8
MCU=atmega8515
//MCU=atmega644
//MCU=atmega328p
//MCU=atmega16
//MCU=atmega32
CONTIKI_PLAT_DEFS = -DF_CPU=8000000UL -DAUTO_CRC_PADDING=2
include $(CONTIKIAVR)/Makefile.avr

View file

@ -0,0 +1,75 @@
#ifndef __CONTIKI_CONF_H__
#define __CONTIKI_CONF_H__
#include<stdint.h>
#define CCIF
#define CLIF
typedef unsigned short clock_time_t;
#define CLOCK_CONF_SECOND 125
/* Maximum tick interval is 0xffff/125 = 524 seconds */
#define RIME_CONF_BROADCAST_ANNOUNCEMENT_MAX_TIME CLOCK_CONF_SECOND * 524UL /* Default uses 600UL */
#define COLLECT_CONF_BROADCAST_ANNOUNCEMENT_MAX_TIME CLOCK_CONF_SECOND * 524UL /* Default uses 600UL */
#define SLIP_PORT 0
#if UIP_CONF_IPV6
#define RIMEADDR_CONF_SIZE 8
#define UIP_CONF_ICMP6 1
#define UIP_CONF_UDP 1
#define UIP_CONF_TCP 1
#define UIP_CONF_IPV6_RPL 0
/* See uip-ds6.h */
#define UIP_CONF_DS6_NBR_NBU 20
#define UIP_CONF_DS6_DEFRT_NBU 2
#define UIP_CONF_DS6_PREFIX_NBU 3
#define UIP_CONF_DS6_ROUTE_NBU 20
#define UIP_CONF_DS6_ADDR_NBU 3
#define UIP_CONF_DS6_MADDR_NBU 0
#define UIP_CONF_DS6_AADDR_NBU 0
#define NETSTACK_CONF_NETWORK sicslowpan_driver
#define NETSTACK_CONF_MAC nullmac_driver
#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06
#define NETSTACK_CONF_RDC sicslowmac_driver
#define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RADIO rf230_driver
#define CHANNEL_802_15_4 26
/* AUTOACK receive mode gives better rssi measurements, even if ACK is never requested */
#define RF230_CONF_AUTOACK 1
/* Request 802.15.4 ACK on all packets sent (else autoretry). This is primarily for testing. */
#define SICSLOWPAN_CONF_ACK_ALL 0
/* Number of auto retry attempts 0-15 (0 implies don't use extended TX_ARET_ON mode with CCA) */
#define RF230_CONF_AUTORETRIES 2
#define SICSLOWPAN_CONF_FRAG 1
/* Most browsers reissue GETs after 3 seconds which stops fragment reassembly so a longer MAXAGE does no good */
#define SICSLOWPAN_CONF_MAXAGE 3
/* How long to wait before terminating an idle TCP connection. Smaller to allow faster sleep. Default is 120 seconds */
#define UIP_CONF_WAIT_TIMEOUT 5
#else
/* ip4 should build but is largely untested */
#define RIMEADDR_CONF_SIZE 2
#define NETSTACK_CONF_NETWORK rime_driver
#endif /* UIP_CONF_IPV6 */
void clock_delay(unsigned int us2);
void clock_wait(int ms10);
void clock_set_seconds(unsigned long s);
unsigned long clock_seconds(void);
typedef unsigned short uip_stats_t;
typedef uint8_t u8_t;
typedef int8_t s8_t;
typedef uint16_t u16_t;
typedef int16_t s16_t;
typedef uint32_t u32_t;
typedef int32_t s32_t;
#endif /* __CONTIKI_CONF_H__ */

View file

@ -0,0 +1,237 @@
/* Copyright (c) 2008, Daniel Willmann <daniel@totalueberwachung.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* 3. The name of the author may not be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This file is part of the Contiki OS
*
* $Id$
*
*/
#include "contiki.h"
#include "dev/rs232.h"
#include <avr/io.h>
#include <stdio.h>
#include <dev/watchdog.h>
#include <avr/pgmspace.h>
#define PRINTA(FORMAT,args...) printf_P(PSTR(FORMAT),##args)
#define DEBUG 0
#if DEBUG
#define PRINTD PRINTA
#else
#define PRINTD(...)
#endif
/* Test rtimers, also stack monitor and time stamps */
#define TESTRTIMER 1
#if TESTRTIMER
#define STAMPS 30
#define STACKMONITOR 128
uint8_t rtimerflag=1;
uint16_t rtime;
struct rtimer rt;
void rtimercycle(void) {rtimerflag=1;}
#endif /* TESTRTIMER */
#if defined (__AVR_ATmega8__)
FUSES =
{
.low = 0xe0,
.high = 0xd9,
};
#elif defined (__AVR_ATmega16__)
FUSES =
{
.low = 0xe0,
.high = 0x99,
};
#elif defined (__AVR_ATmega644__)
FUSES =
{
.low = 0xe0,
.high = 0x99,
.extended = 0xff,
};
//MCU=atmega8515
//MCU=atmega328p
//MCU=atmega32
#endif
PROCESS(led_process, "LED process");
PROCESS_THREAD(led_process, ev, data)
{
static struct etimer etimer;
PROCESS_BEGIN();
while (1) {
PRINTD("LED1\r\n");
PORTB |= (1<<PB1);
PORTD |= (1<<PD3);
etimer_set(&etimer, CLOCK_SECOND*0.5);
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
PORTB &= ~(1<<PB1);
PORTD &= ~(1<<PD3);
etimer_set(&etimer, CLOCK_SECOND*0.5);
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
}
PROCESS_END();
}
PROCESS(led2_process, "LED process");
PROCESS_THREAD(led2_process, ev, data)
{
static struct etimer etimer;
PROCESS_BEGIN();
while (1) {
PRINTD("LED2\r\n");
PORTB |= (1<<PB0);
PORTD |= (1<<PD2);
etimer_set(&etimer, CLOCK_SECOND*0.3);
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
PORTB &= ~(1<<PB0);
PORTD &= ~(1<<PD2);
etimer_set(&etimer, CLOCK_SECOND*0.3);
PROCESS_WAIT_UNTIL(etimer_expired(&etimer));
}
PROCESS_END();
}
void led_init()
{
DDRB |= (1<<PB1)|(1<<PB0);
PORTB &= ~((1<<PB1)|(1<<PB0));
DDRD |= (1<<PD2)|(1<<PD3);
PORTD &= ~((1<<PD2)|(1<<PD3));
}
/* These can also be explicitly started below */
PROCINIT(&etimer_process, &led_process, &led2_process);
void
initialize(void)
{
watchdog_init();
watchdog_start();
#if STACKMONITOR
/* Simple stack pointer highwater monitor. Checks for magic numbers in the main
* loop. In conjuction with TESTRTIMER, never-used stack will be printed
* every STACKMONITOR seconds.
*/
{
extern uint16_t __bss_end;
uint16_t p=(uint16_t)&__bss_end;
do {
*(uint16_t *)p = 0x4242;
p+=4;
} while (p<SP-4); //don't overwrite our own stack
}
#endif
/* rtimers needed for radio cycling */
rtimer_init();
rs232_init(RS232_PORT_0, BAUD_RATE(38400), USART_DATA_BITS_8 | USART_PARITY_NONE | USART_STOP_BITS_1);
rs232_redirect_stdout(RS232_PORT_0);
clock_init();
sei();
/* Initialize drivers and event kernel */
process_init();
led_init();
#if 0
procinit_init();
#else
process_start(&etimer_process, NULL);
process_start(&led_process, NULL);
process_start(&led2_process, NULL);
#endif
PRINTA(CONTIKI_VERSION_STRING " started\r\n");
/* Comment this out if autostart_processes not defined at link */
/* Note AUTOSTART_PROCESSES(...) is only effective in the .co module */
autostart_start(autostart_processes);
}
int
main(void)
{
initialize();
while(1) {
process_run();
#if TESTRTIMER
/* Timeout can be increased up to 8 seconds maximum.
* A one second cycle is convenient for triggering the various debug printouts.
* The triggers are staggered to avoid printing everything at once.
*/
if (rtimerflag) {
rtimer_set(&rt, RTIMER_NOW()+ RTIMER_ARCH_SECOND*1UL, 1,(void *) rtimercycle, NULL);
rtimerflag=0;
#if STAMPS
if ((rtime%STAMPS)==0) {
PRINTA("%us ",rtime);
}
#endif
rtime+=1;
#if STACKMONITOR
if ((rtime%STACKMONITOR)==3) {
extern uint16_t __bss_end;
uint16_t p=(uint16_t)&__bss_end;
do {
if (*(uint16_t *)p != 0x4242) {
PRINTA("Never-used stack > %d bytes\n",p-(uint16_t)&__bss_end);
break;
}
p+=4;
} while (p<RAMEND-4);
}
#endif
}
#endif /* TESTRTIMER */
}
return 0;
}