mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2025-12-24 22:13:52 +01:00
initial commit for TelosB support
This commit is contained in:
parent
eeb8c60e7e
commit
1ada39d7fd
33
telosb/Makefile
Normal file
33
telosb/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
SRC = $(wildcard *.c)
|
||||
BINDIR = bin/
|
||||
OBJ = $(SRC:%.c=$(BINDIR)%.o)## defines
|
||||
export ARCH = telosb_base.a
|
||||
|
||||
DEP = $(SRC:%.c=$(BINDIR)%.d)
|
||||
|
||||
INCLUDES += -I${RIOTBASE}/core/include/
|
||||
INCLUDES += -I$(RIOTBASE)/cpu/msp430-common/include/ -I$(RIOTBASE)/cpu/msp430x16x/include/
|
||||
INCLUDES += -I$(RIOTBASE)/drivers/cc2420/include/ -I$(RIOTBASE)/sys/include
|
||||
INCLUDES += -I$(RIOTBASE)/sys/net/
|
||||
|
||||
all: $(BINDIR)$(ARCH)
|
||||
|
||||
$(BINDIR)$(ARCH): $(OBJ)
|
||||
$(AR) rcs $(BINDIR)$(ARCH) $(OBJ)
|
||||
|
||||
# pull in dependency info for *existing* .o files
|
||||
-include $(OBJ:.o=.d)
|
||||
|
||||
# compile and generate dependency info
|
||||
$(BINDIR)%.o: %.c
|
||||
mkdir -p $(BINDIR)
|
||||
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -c $*.c -o $(BINDIR)$*.o
|
||||
$(CC) $(CFLAGS) $(INCLUDES) $(BOARDINCLUDE) $(PROJECTINCLUDE) $(CPUINCLUDE) -MM $*.c > $(BINDIR)$*.d
|
||||
@printf "$(BINDIR)"|cat - $(BINDIR)$*.d > /tmp/riot_out && mv /tmp/riot_out $(BINDIR)$*.d
|
||||
|
||||
# remove compilation products
|
||||
clean:
|
||||
rm -f $(BINDIR)$(ARCH) $(OBJ) $(DEP)
|
||||
@if [ -d $(BINDIR) ] ; \
|
||||
then rmdir $(BINDIR) ; \
|
||||
fi
|
||||
2
telosb/Makefile.dep
Normal file
2
telosb/Makefile.dep
Normal file
@ -0,0 +1,2 @@
|
||||
USEMODULE += msp430_common
|
||||
|
||||
25
telosb/Makefile.include
Normal file
25
telosb/Makefile.include
Normal file
@ -0,0 +1,25 @@
|
||||
include $(RIOTBOARD)/$(BOARD)/Makefile.dep
|
||||
## the cpu to build for
|
||||
export CPU = msp430x16x
|
||||
export MCU = msp430f1611
|
||||
|
||||
# toolchain config
|
||||
export PREFIX = @msp430-
|
||||
export CC = @$(PREFIX)gcc
|
||||
export AR = @$(PREFIX)ar
|
||||
export CFLAGS += -std=gnu99 -Wstrict-prototypes -gdwarf-2 -Os -Wall -mmcu=$(MCU)
|
||||
export ASFLAGS += -mmcu=$(MCU) --defsym $(MCU)=1 --gdwarf-2
|
||||
export AS = $(PREFIX)as
|
||||
export LINK = $(PREFIX)gcc
|
||||
export SIZE = $(PREFIX)size
|
||||
export OBJCOPY = $(PREFIX)objcopy
|
||||
export LINKFLAGS = -mmcu=$(MCU) -lgcc $(RIOTBASE)/bin/startup.o
|
||||
export TERMPROG = $(RIOTBASE)/dist/tools/pyterm/pyterm.py
|
||||
export FLASHER = goodfet.bsl
|
||||
ifeq ($(strip $(PORT)),)
|
||||
export PORT = /dev/ttyUSB0
|
||||
endif
|
||||
export HEXFILE = bin/$(PROJECT).hex
|
||||
export FFLAGS = --telosb -c $(PORT) -r -e -I -p $(HEXFILE)
|
||||
|
||||
export INCLUDES += -I $(RIOTCPU)/msp430-common/include/
|
||||
127
telosb/board.c
Normal file
127
telosb/board.c
Normal file
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* board.c - Board initiazilation for the TelosB
|
||||
* Copyright (C) 2013 Oliver Hahm <oliver.hahm@inria.fr>
|
||||
*
|
||||
* This file subject to the terms and conditions of the GLGPLv2 License. See the file LICENSE in the
|
||||
* top level directory for more details.
|
||||
*/
|
||||
|
||||
#include "cpu.h"
|
||||
#include "board.h"
|
||||
|
||||
void uart_init(void);
|
||||
|
||||
static void telosb_ports_init(void)
|
||||
{
|
||||
/* Port 1: GDO, Flash, BSL TX */
|
||||
P1SEL = 0x02; /* Port1 Select: 00000010 = 0x02 */
|
||||
P1OUT = 0x00; /* Port1 Output: 00000000 = 0x00 */
|
||||
P1DIR = 0x87; /* Port1 Direction: 10000111 = 0x87 */
|
||||
|
||||
/* Port 2: GPIO, BSL RX, 1wire */
|
||||
P2SEL = 0x04; /* Port2 Select: 00000100 = 0x04 */
|
||||
P2OUT = 0x00; /* Port2 Output: 00000000 = 0x00 */
|
||||
P2DIR = 0xFF; /* Port2 Direction: 11111111 = 0xFF */
|
||||
|
||||
/* Port 3: UART and SPI */
|
||||
P3SEL = 0xCE; /* Port3 Select: 11001110 = 0xCE */
|
||||
P3OUT = 0x00; /* Port3 Output: 00000000 = 0x00 */
|
||||
P3DIR = 0x4E; /* Port3 Direction: 01001110 = 0x4E */
|
||||
|
||||
/* Port 4: CS */
|
||||
P4SEL = 0x02; /* Port4 Select: 00000010 = 0x02 */
|
||||
P4OUT = 0x04; /* Port4 Output: 00000100 = 0x04 */
|
||||
P4DIR = 0x64; /* Port4 Direction: 01100100 = 0x64 */
|
||||
|
||||
/* Port 5: SPI, LED */
|
||||
P5SEL = 0x00; /* Port5 Select: 00000000 = 0x00 */
|
||||
P5OUT = 0x70; /* Port5 Output: 01110000 = 0x70 */
|
||||
P5DIR = 0x70; /* Port5 Direction: 01110000 = 0x70 */
|
||||
|
||||
|
||||
P6SEL = 0xFF; /* Port6 Select: 11111111 = 0xFF */
|
||||
P6OUT = 0x00; /* Port6 Output: 00000000 = 0x00 */
|
||||
P6DIR = 0xFF; /* Port6 Direction: 11111000 = 0xFF */
|
||||
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* taken from Contiki code */
|
||||
void msp430_init_dco(void)
|
||||
{
|
||||
/* This code taken from the FU Berlin sources and reformatted. */
|
||||
#define DELTA (F_CPU / (F_RC_OSCILLATOR / 8))
|
||||
|
||||
unsigned int compare, oldcapture = 0;
|
||||
unsigned int i;
|
||||
|
||||
/* 10100100 = XT2 is off, ACLK divided by 4, RSELx=4 */
|
||||
BCSCTL1 = XT2OFF | DIVA_2 | RSEL2;
|
||||
|
||||
/* Init undivided DCO with internal resistor for MCLK and SMCLK
|
||||
* DCO = 32762Hz -> FLL = 2,4576 MHz */
|
||||
BCSCTL2 = 0x00;
|
||||
|
||||
BCSCTL1 |= DIVA1 + DIVA0; /* ACLK = LFXT1CLK/8 */
|
||||
|
||||
for (i = 0xFFFF; i > 0; i--) { /* Delay for XTAL to settle */
|
||||
asm("nop");
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
|
||||
|
||||
//=========================== public ==========================================
|
||||
|
||||
void board_init(void)
|
||||
{
|
||||
msp430_cpu_init();
|
||||
/* disable watchdog timer */
|
||||
WDTCTL = WDTPW + WDTHOLD;
|
||||
|
||||
telosb_ports_init();
|
||||
|
||||
msp430_init_dco();
|
||||
|
||||
/* initialize bsp modules */
|
||||
uart_init();
|
||||
|
||||
/* enable interrupts */
|
||||
__bis_SR_register(GIE);
|
||||
}
|
||||
13
telosb/include/board-conf.h
Normal file
13
telosb/include/board-conf.h
Normal file
@ -0,0 +1,13 @@
|
||||
/**
|
||||
* board-conf.h.
|
||||
*
|
||||
* This source code is licensed under the GNU Lesser General Public License,
|
||||
* Version 2. See the file LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef BOARD_CONF_H
|
||||
#define BOARD_CONF_H
|
||||
|
||||
#define INFOMEM (0x1000)
|
||||
|
||||
#endif /* BOARD-CONF_H */
|
||||
58
telosb/include/board.h
Normal file
58
telosb/include/board.h
Normal file
@ -0,0 +1,58 @@
|
||||
/**
|
||||
* board.h - TelosB Board.
|
||||
* Copyright (C) 2013 INRIA
|
||||
*
|
||||
* This source code is licensed under the GNU Lesser General Public License,
|
||||
* Version 2. See the file LICENSE for more details.
|
||||
*/
|
||||
|
||||
#ifndef _TELOSB_BOARD_H
|
||||
#define _TELOSB_BOARD_H
|
||||
|
||||
/**
|
||||
* @defgroup TelosB
|
||||
* @ingroup TelosB
|
||||
*
|
||||
<h2>Compontents</h2>
|
||||
\li MSP430
|
||||
\li CC2420
|
||||
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief TelosB Board
|
||||
*
|
||||
* @author Oliver Hahm <oliver.hahm@inria.fr>
|
||||
*
|
||||
*/
|
||||
|
||||
//MSB430 core
|
||||
#define MSP430_INITIAL_CPU_SPEED 800000uL
|
||||
#define MSP430_HAS_DCOR 0
|
||||
#define MSP430_HAS_EXTERNAL_CRYSTAL 1
|
||||
|
||||
/* LEDs ports MSB430 */
|
||||
#define LEDS_PxDIR P5DIR
|
||||
#define LEDS_PxOUT P5OUT
|
||||
#define LEDS_CONF_RED 0x10
|
||||
#define LEDS_CONF_GREEN 0x20
|
||||
#define LEDS_CONF_BLUE 0x40
|
||||
|
||||
#define LED_RED_ON LEDS_PxOUT &=~LEDS_CONF_RED
|
||||
#define LED_RED_OFF LEDS_PxOUT |= LEDS_CONF_RED
|
||||
#define LED_RED_TOGGLE LEDS_PxOUT ^= LEDS_CONF_RED
|
||||
|
||||
#define LED_GREEN_ON LEDS_PxOUT &=~LEDS_CONF_GREEN
|
||||
#define LED_GREEN_OFF LEDS_PxOUT |= LEDS_CONF_GREEN
|
||||
#define LED_GREEN_TOGGLE LEDS_PxOUT ^= LEDS_CONF_GREEN
|
||||
|
||||
#define LED_BLUE_ON LEDS_PxOUT &=~LEDS_CONF_BLUE
|
||||
#define LED_BLUE_OFF LEDS_PxOUT |= LEDS_CONF_BLUE
|
||||
#define LED_BLUE_TOGGLE LEDS_PxOUT ^= LEDS_CONF_BLUE
|
||||
|
||||
#include <msp430x16x.h>
|
||||
|
||||
/** @} */
|
||||
#endif // _TELOSB_BOARD_H
|
||||
45
telosb/uart.c
Normal file
45
telosb/uart.c
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* uart.c - Implementation for the TelosB UART
|
||||
* Copyright (C) 2013 Oliver Hahm <oliver.hahm@inria.fr>
|
||||
*
|
||||
* This file subject to the terms and conditions of the GLGPLv2 License. See the file LICENSE in the
|
||||
* top level directory for more details.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include "cpu.h"
|
||||
#include "board.h"
|
||||
#include "kernel.h"
|
||||
|
||||
#define UART1_TX U1TXBUF
|
||||
#define UART1_WAIT_TXDONE() while ( (U1TCTL & TXEPT) == 0 ) { _NOP(); }
|
||||
|
||||
#define BAUDRATE (115200ul)
|
||||
|
||||
void uart_init(void)
|
||||
{
|
||||
UCTL1 = SWRST; /* hold UART1 module in reset */
|
||||
UCTL1 |= CHAR; /* 8-bit character */
|
||||
|
||||
/* 115200 baud, clocked from 4.8MHz SMCLK */
|
||||
UTCTL1 |= SSEL1; /* UCLK = SCLK */
|
||||
UBR01 = F_CPU / BAUDRATE;
|
||||
UBR11 = (F_CPU / BAUDRATE) >> 8;
|
||||
UMCTL1 = 0x4A; /* modulation */
|
||||
|
||||
ME2 |= UTXE1 + URXE1; /* enable UART1 TX/RX */
|
||||
UCTL1 &= ~SWRST; /* clear UART1 reset bit */
|
||||
}
|
||||
|
||||
int putchar(int c)
|
||||
{
|
||||
UART1_TX = c;
|
||||
UART1_WAIT_TXDONE();
|
||||
return c;
|
||||
}
|
||||
|
||||
uint8_t uart_readByte(void)
|
||||
{
|
||||
return U1RXBUF;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user