added testcases

git-svn-id: https://mspsim.svn.sourceforge.net/svnroot/mspsim/mspsim@7 23d1a52b-0c3c-0410-b72d-8f29ab48fe35
This commit is contained in:
joxe 2007-10-25 10:58:19 +00:00
parent 7d9e331ac2
commit 246da552f5
5 changed files with 808 additions and 11 deletions

View File

@ -1,13 +1,11 @@
###############################################################
# $Revision: 1.11 $ $Date: 2007/10/21 19:47:53 $
# Makefile for mspsim
#
# Needed stuff in the PATH:
# java, javac (JDK 1.2 or newer)
# java, javac (JDK 1.5 or newer)
#
# Under MS-DOS/Windows 95/NT
# A GNU compatible Make (for example Cygnus GNU-Win 32,
# http://www.cygnus.com/misc/gnu-win32/)
# Note: might need to be called with "make --win32" under Windows!!!
# Under MS-DOS/Windows
# A GNU compatible Make (for example Cygwin's)
###############################################################
###############################################################
@ -37,7 +35,7 @@ ifndef WINDIR
# Add "'" around filenames when removing them because UNIX expands "$"
APO='#' (last apostrophe to avoid incorrect font-lock)
else
# These setting are for MS-DOS/Windows 95/Windows NT
# These setting are for Windows
SEPARATOR=;
APO=
endif
@ -54,7 +52,7 @@ CCARGS=-deprecation -classpath .
# SERVER OBJECTS
###############################################################
IHEXFILE = blinker2.ihex
FIRMWAREFILE = blinker2.ihex
CPUTEST := tests/cputest.ihex
CPUTESTMAP := $(CPUTEST:.ihex=.map)
@ -81,13 +79,13 @@ help:
.PHONY: run
run: compile
java se.sics.util.IHexReader $(IHEXFILE) $(MAPFILE)
java se.sics.util.IHexReader $(FIRMWAREFILE) $(MAPFILE)
runesb: compile
java se.sics.mspsim.platform.esb.ESBNode $(IHEXFILE) $(MAPFILE)
java se.sics.mspsim.platform.esb.ESBNode $(FIRMWAREFILE) $(MAPFILE)
runsky: compile
java se.sics.mspsim.platform.sky.SkyNode $(IHEXFILE) $(MAPFILE)
java se.sics.mspsim.platform.sky.SkyNode $(FIRMWAREFILE) $(MAPFILE)
.PHONY: cputest test
test: cputest

50
tests/Makefile Normal file
View File

@ -0,0 +1,50 @@
### Check if we are running under Windows
ifndef WINDIR
ifdef OS
ifneq (,$(findstring Windows,$(OS)))
WINDIR := Windows
endif
endif
endif
.SUFFIXES:
MCU=msp430x149
### Compiler definitions
CC = msp430-gcc
LD = msp430-ld
AS = msp430-as
AR = msp430-ar
OBJCOPY = msp430-objcopy
STRIP = msp430-strip
BSL = msp430-bsl
CFLAGSNO = -I. -DWITH_ASCII \
-Wall -mmcu=$(MCU) -g
CFLAGS += $(CFLAGSNO) -Os
SOURCES := msp430setup.c
OBJECTS := $(SOURCES:.c=.o)
#all: cputest.ihex
all: cputest.firmware
%.firmware: %.co $(OBJECTS)
$(CC) -mmcu=$(MCU) -Wl,-Map=$(@:.firmware=.map) $(CFLAGS) -o $@ $^
%.ihex: %.firmware
$(OBJCOPY) $^ -O ihex $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.co: %.c
$(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@
%.u: %.ihex
msp430-jtag -eI $^
clean:
rm -f *~ *.lst *.map *.co *.o *.ihex *.firmware

270
tests/cputest.c Normal file
View File

@ -0,0 +1,270 @@
/*
* Copyright (c) 2007, Swedish Institute of Computer Science.
* 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.
*
*
* $Id: cputest.c,v 1.19 2007/10/24 22:17:46 nfi Exp $
*
* -----------------------------------------------------------------
*
* Author : Adam Dunkels, Joakim Eriksson, Niclas Finne
* Created : 2006-03-07
* Updated : $Date: 2007/10/24 22:17:46 $
* $Revision: 1.19 $
*/
#include "msp430setup.h"
#include <stdio.h>
#include <string.h>
/* From Adams test-suite */
#define TEST(...) if(__VA_ARGS__) { \
printf("OK: " #__VA_ARGS__ " passed at %s:%d\n", __FILE__,__LINE__); \
} else { \
printf("FAIL: " #__VA_ARGS__ " failed at %s:%d\n", __FILE__,__LINE__); \
}
#define TEST2(text,...) if(__VA_ARGS__) { \
printf("OK: " #text " passed at %s:%d\n", __FILE__,__LINE__); \
} else { \
printf("FAIL: " #text " failed at %s:%d\n", __FILE__,__LINE__); \
}
#define assertTrue(...) TEST(__VA_ARGS__)
#define assertFalse(...) TEST(!(__VA_ARGS__))
#define assertTrue2(text,...) TEST2(text,__VA_ARGS__)
#define assertFalse2(text,...) TEST2(text,!(__VA_ARGS__))
static int testzero(int hm)
{
return hm > 0;
}
static int caseID = 0;
static void initTest() {
caseID = 0;
}
static void testCase(char *description) {
caseID++;
printf("-------------\n");
printf("TEST %d: %s\n", caseID, description);
}
static void testSimple() {
int a,b,c;
a = 1; b = 2; c = 4;
testCase("Arithmetic Operations");
assertTrue((a << b) == 4);
assertTrue((c >> a) == 2);
assertFalse(0 > 0);
assertFalse(a > b);
assertFalse(testzero(0));
}
static void testIntegers() {
int a,b,c;
int t[3];
testCase("Integer Operations");
a = 1; b = 2; c = -42;
t[0] = 1;
t[1] = 2;
t[2] = 3;
assertTrue(a == 1);
assertTrue((b + c) == -40);
assertTrue(t[0] == 1);
assertTrue(t[1] == 2);
assertTrue(t[t[0]] == 2);
assertTrue((a+b) == 3);
assertTrue((b-a) == 1);
assertTrue((a-b) == -1);
assertTrue((a*b) == 2);
assertTrue(a > 0);
assertTrue(b > a);
assertTrue(b != a);
assertTrue((a ^ b) == 3);
assertTrue((a ^ 4) == 5);
assertTrue((a ^ a) == 0);
assertFalse(a > b);
a = 15;
b = 17;
assertTrue((a & ~b) == 14);
}
static void testFloats() {
int i;
float f;
i = 2;
f = 0.5;
testCase("Float Operations");
assertTrue((i * f) == 1);
i++;
assertTrue((i * f) == 1.5);
}
static void testStrings() {
char buf[10];
testCase("String Operations");
sprintf(buf, "test");
assertTrue2("test => test", strcmp(buf, "test") == 0);
sprintf(buf, "%c", 'a');
assertTrue2("buf == 'a'", strcmp(buf, "a") == 0);
}
/*--------------------------------------------------------------------------*/
static int id(int first, ...)
{
va_list marker;
va_start( marker, first );
first = va_arg( marker, int);
va_end( marker );
return first;
}
static void testFunctions() {
volatile int i;
testCase("Functions");
i = 47;
/* printf("i=%d i+1=%d id(i)=%d\n", i, i + 1, id(0, i)); */
assertTrue(i == 47);
assertTrue(id(0,47) == 47);
assertTrue(id(0,i) == 47);
}
/*--------------------------------------------------------------------------*/
static void testModulo() {
int c,i;
c = 1;
testCase("Modulo");
do {
i = 13;
i = i % 14;
/* printf("(%d,%d,%d)\n",i, (i % 14), i==1); */
/* printf("(%d,%d,%d)\n",i, (i % 14), i==1); */
if (i < 0) printf("%d\n",i);
c = c + 1;
} while (c < 3);
/* if((i % 5) == 0) { */
/* assertTrue(i != 1); */
/* } */
}
/*--------------------------------------------------------------------------*/
/* Bit field tests */
static struct {
char green:4, yellow:4, red:4;
} leds;
static struct {
char green:2, yellow:2, red:2; /* These bit fields should really be
only one bit wide, but that
crashed gcc... */
} invert;
#include <io.h>
#ifndef BV
#define BV(n) (1 << (n))
#endif
void testBis() {
P4DIR |= BV(2) | BV(5) | BV(6);
assertTrue(P4DIR == 100);
}
static void testBitFields() {
static int pelle = 0;
testCase("Bit field Operations");
P4DIR = 0;
testBis();
leds.green = 1;
leds.yellow = 1;
leds.red = 1;
assertTrue(leds.green > 0);
assertTrue(leds.yellow > 0);
assertTrue(leds.red > 0);
leds.green -= 1;
assertTrue(leds.green == 0);
pelle = 0x4711;
invert.green = 1;
invert.yellow = 1;
invert.red = 1;
assertTrue(invert.green > 0);
assertTrue(invert.yellow > 0);
assertTrue(invert.red > 0);
invert.green ^= 1;
assertTrue(invert.green == 0);
}
/*--------------------------------------------------------------------------*/
int
main(void)
{
msp430_setup();
initTest();
/* testSimple(); */
/* testIntegers(); */
/* testFloats(); */
/* testStrings(); */
/* testBitFields(); */
/* testFunctions(); */
testModulo();
printf("EXIT\n");
return 0;
}

380
tests/msp430setup.c Normal file
View File

@ -0,0 +1,380 @@
/*
* Copyright (c) 2007, Swedish Institute of Computer Science.
* 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.
*
* $Id: msp430setup.c,v 1.2 2007/01/22 15:45:04 nfi Exp $
*
* -----------------------------------------------------------------
*
* Author : Adam Dunkels, Joakim Eriksson, Niclas Finne
* Created : 2007-01-22
* Updated : $Date: 2007/01/22 15:45:04 $
* $Revision: 1.2 $
*/
#include "msp430setup.h"
#include <io.h>
#include <signal.h>
#include <stdio.h>
#include <sys/unistd.h>
/*--------------------------------------------------------------------------*/
/* RS232 Interface */
/*--------------------------------------------------------------------------*/
static int (* input_handler)(unsigned char) = NULL;
/*---------------------------------------------------------------------------*/
interrupt(UART1RX_VECTOR)
rs232_rx_usart1(void)
{
/* Check status register for receive errors. - before reading RXBUF since
it clears the error and interrupt flags */
if(!(URCTL1 & RXERR) && input_handler != NULL) {
input_handler(RXBUF1);
} else {
/* Else read out the char to clear the I-flags, etc. */
RXBUF1;
}
}
/*--------------------------------------------------------------------------*/
void
rs232_init(void)
{
/* RS232 */
UCTL1 = CHAR; /* 8-bit character */
UTCTL1 = SSEL1; /* UCLK = MCLK */
rs232_set_speed(RS232_57600);
input_handler = NULL;
ME2 |= (UTXE1 | URXE1); /* Enable USART1 TXD/RXD */
IE2 |= URXIE1; /* Enable USART1 RX interrupt */
}
/*---------------------------------------------------------------------------*/
void
rs232_send(char c)
{
/* Loop until the transmission buffer is available. */
while ((IFG2 & UTXIFG1) == 0);
/* Transmit the data. */
TXBUF1 = c;
}
/*---------------------------------------------------------------------------*/
void
rs232_set_speed(unsigned char speed)
{
if(speed == RS232_19200) {
/* Set RS232 to 19200 */
UBR01 = 0x80; /* 2,457MHz/19200 = 128 -> 0x80 */
UBR11 = 0x00; /* */
UMCTL1 = 0x00; /* no modulation */
} else if(speed == RS232_38400) {
/* Set RS232 to 38400 */
UBR01 = 0x40; /* 2,457MHz/38400 = 64 -> 0x40 */
UBR11 = 0x00; /* */
UMCTL1 = 0x00; /* no modulation */
} else if(speed == RS232_57600) {
UBR01 = 0x2a; /* 2,457MHz/57600 = 42.7 -> 0x2A */
UBR11 = 0x00; /* */
UMCTL1 = 0x5b; /* */
} else if(speed == RS232_115200) {
UBR01 = 0x15; /* 2,457MHz/115200 = 21.4 -> 0x15 */
UBR11 = 0x00; /* */
UMCTL1 = 0x4a; /* */
} else {
rs232_set_speed(RS232_57600);
}
}
/*---------------------------------------------------------------------------*/
void
rs232_set_input(int (*f)(unsigned char))
{
input_handler = f;
}
/*--------------------------------------------------------------------------*/
int
putchar(int c)
{
rs232_send(c);
return c;
}
/*--------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
void
esb_sensors_init(void)
{
P5SEL &= ~(1 << 5);
P5DIR |= (1 << 5);
}
/*---------------------------------------------------------------------------*/
void
esb_sensors_on(void)
{
P5OUT &= ~(1 << 5);
}
/*---------------------------------------------------------------------------*/
void
esb_sensors_off(void)
{
P5OUT |= (1 << 5);
}
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* CPU INIT */
/*--------------------------------------------------------------------------*/
static void
msp430_init_dco(void)
{
/* This code taken from the FU Berlin sources and reformatted. */
#define DELTA 600
unsigned int compare, oldcapture = 0;
unsigned int i;
BCSCTL1 = 0xa4; /* ACLK is devided by 4. RSEL=6 no division for MCLK
and SSMCLK. XT2 is off. */
BCSCTL2 = 0x00; /* Init FLL to desired frequency using the 32762Hz
crystal DCO frquenzy = 2,4576 MHz */
WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
BCSCTL1 |= DIVA1 + DIVA0; /* ACLK = LFXT1CLK/8 */
for(i = 0xffff; i > 0; i--); /* Delay for XTAL to settle */
CCTL2 = CCIS0 + CM0 + CAP; // Define CCR2, CAP, ACLK
TACTL = TASSEL1 + TACLR + MC1; // SMCLK, continous mode
while(1) {
while((CCTL2 & CCIFG) != CCIFG); /* Wait until capture occured! */
CCTL2 &= ~CCIFG; /* Capture occured, clear flag */
compare = CCR2; /* Get current captured SMCLK */
compare = compare - oldcapture; /* SMCLK difference */
oldcapture = CCR2; /* Save current captured SMCLK */
if(DELTA == compare) {
break; /* if equal, leave "while(1)" */
} else if(DELTA < compare) { /* DCO is too fast, slow it down */
DCOCTL--;
if(DCOCTL == 0xFF) { /* Did DCO role under? */
BCSCTL1--;
}
} else { /* -> Select next lower RSEL */
DCOCTL++;
if(DCOCTL == 0x00) { /* Did DCO role over? */
BCSCTL1++;
}
/* -> Select next higher RSEL */
}
}
CCTL2 = 0; /* Stop CCR2 function */
TACTL = 0; /* Stop Timer_A */
BCSCTL1 &= ~(DIVA1 + DIVA0); /* remove /8 divisor from ACLK again */
}
/*---------------------------------------------------------------------------*/
static void
init_ports(void)
{
/* Turn everything off, device drivers are supposed to enable what is
* really needed!
*/
/* All configured for digital I/O */
#ifdef P1SEL
P1SEL = 0;
#endif
#ifdef P2SEL
P2SEL = 0;
#endif
#ifdef P3SEL
P3SEL = 0;
#endif
#ifdef P4SEL
P4SEL = 0;
#endif
#ifdef P5SEL
P5SEL = 0;
#endif
#ifdef P6SEL
P6SEL = 0;
#endif
/* All available inputs */
#ifdef P1DIR
P1DIR = 0;
P1OUT = 0;
#endif
#ifdef P2DIR
P2DIR = 0;
P2OUT = 0;
#endif
#ifdef P3DIR
P3DIR = 0;
P3OUT = 0;
#endif
#ifdef P4DIR
P4DIR = 0;
P4OUT = 0;
#endif
#ifdef P5DIR
P5DIR = 0;
P5OUT = 0;
#endif
#ifdef P6DIR
P6DIR = 0;
P6OUT = 0;
#endif
P1IE = 0;
P2IE = 0;
}
/*---------------------------------------------------------------------------*/
static void init_ports_toberemoved() {
////////// Port 1 ////
P1SEL = 0x00;
P1DIR = 0x81; // Outputs: P10=IRSend, P17=RS232RTS
// Inputs: P11=Light, P12=IRRec, P13=PIR, P14=Vibration,
// P15=Clockalarm, P16=RS232CTS
P1OUT = 0x00;
////////// Port 2 ////
P2SEL = 0x00; // No Sels
P2DIR = 0x7F; // Outpus: P20..P23=Leds+Beeper, P24..P26=Poti
// Inputs: P27=Taster
P2OUT = 0x77;
////////// Port 3 ////
P3SEL = 0xE0; // Sels for P34..P37 to activate UART,
P3DIR = 0x5F; // Inputs: P30..P33=CON4, P35/P37=RXD Transceiver/RS232
// OutPuts: P36/P38=TXD Transceiver/RS232
P3OUT = 0xE0; // Output a Zero on P34(TXD Transceiver) and turn SELECT off when receiving!!!
////////// Port 4 ////
P4SEL = 0x00; // CON5 Stecker
P4DIR = 0xFF;
P4OUT = 0x00;
////////// Port 5 ////
P5SEL = 0x00; // P50/P51= Clock SDA/SCL, P52/P53/P54=EEPROM SDA/SCL/WP
P5DIR = 0xDA; // P56/P57=Transceiver CNTRL0/1
P5OUT = 0x0F;
////////// Port 6 ////
P6SEL = 0x00; // P60=Microphone, P61=PIR digital (same as P13), P62=PIR analog
P6DIR = 0x00; // P63=extern voltage, P64=battery voltage, P65=Receive power
P6OUT = 0x00;
}
/*--------------------------------------------------------------------------*/
void
msp430_setup(void)
{
dint();
init_ports();
msp430_init_dco();
eint();
init_ports_toberemoved();
esb_sensors_init();
esb_sensors_on();
rs232_init();
}
#define asmv(arg) __asm__ __volatile__(arg)
#define STACK_EXTRA 32
static char *cur_break = (char *)(&__bss_end + 1);
/*
* Allocate memory from the heap. Check that we don't collide with the
* stack right now (some other routine might later). A watchdog might
* be used to check if cur_break and the stack pointer meet during
* runtime.
*/
void *
sbrk(int incr)
{
char *stack_pointer;
asmv("mov r1, %0" : "=r" (stack_pointer));
stack_pointer -= STACK_EXTRA;
if(incr > (stack_pointer - cur_break))
return (void *)-1; /* ENOMEM */
void *old_break = cur_break;
cur_break += incr;
/*
* If the stack was never here then [old_break .. cur_break] should
* be filled with zeros.
*/
return old_break;
}
/*
* Mask all interrupts that can be masked.
*/
int
splhigh_(void)
{
/* Clear the GIE (General Interrupt Enable) flag. */
int sr;
asmv("mov r2, %0" : "=r" (sr));
asmv("bic %0, r2" : : "i" (GIE));
return sr & GIE; /* Ignore other sr bits. */
}
/*
* Restore previous interrupt mask.
*/
void
splx_(int sr)
{
/* If GIE was set, restore it. */
asmv("bis %0, r2" : : "r" (sr));
}

99
tests/msp430setup.h Normal file
View File

@ -0,0 +1,99 @@
/*
* Copyright (c) 2007, Swedish Institute of Computer Science.
* 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.
*
* $Id: msp430setup.h,v 1.1 2007/01/22 15:12:27 nfi Exp $
*
* -----------------------------------------------------------------
*
* Author : Adam Dunkels, Joakim Eriksson, Niclas Finne
* Created : 2007-01-22
* Updated : $Date: 2007/01/22 15:12:27 $
* $Revision: 1.1 $
*/
#ifndef __MSP430SETUP_H__
#define __MSP430SETUP_H__
void msp430_setup(void);
#define RS232_19200 1
#define RS232_38400 2
#define RS232_57600 3
#define RS232_115200 4
/**
* \brief Set an input handler for incoming RS232 data
* \param f A pointer to a byte input handler
*
* This function sets the input handler for incoming RS232
* data. The input handler function is called for every
* incoming data byte. The function is called from the
* RS232 interrupt handler, so care must be taken when
* implementing the input handler to avoid race
* conditions.
*
* The return value of the input handler affects the sleep
* mode of the CPU: if the input handler returns non-zero
* (true), the CPU is awakened to let other processing
* take place. If the input handler returns zero, the CPU
* is kept sleeping.
*/
void rs232_set_input(int (* f)(unsigned char));
/**
* \brief Configure the speed of the RS232 hardware
* \param speed The speed
*
* This function configures the speed of the RS232
* hardware. The allowed parameters are RS232_19200,
* RS232_38400, RS232_57600, and RS232_115200.
*/
void rs232_set_speed(unsigned char speed);
/**
* \brief Print a text string on RS232
* \param str A pointer to the string that is to be printed
*
* This function prints a string to RS232. The string must
* be terminated by a null byte. The RS232 module must be
* correctly initalized and configured for this function
* to work.
*/
void rs232_print(char *text);
/**
* \brief Print a character on RS232
* \param c The character to be printed
*
* This function prints a character to RS232. The RS232
* module must be correctly initalized and configured for
* this function to work.
*/
void rs232_send(char c);
#endif /* __MSP430SETUP_H__ */