Updated to match the new netstack api

This commit is contained in:
nifi 2010-03-02 22:40:39 +00:00
parent 01a3912864
commit efe8f200af
12 changed files with 367 additions and 393 deletions

View file

@ -1,16 +1,17 @@
# $Id: Makefile.esb,v 1.14 2010/02/09 07:34:37 nifi Exp $ # $Id: Makefile.esb,v 1.15 2010/03/02 22:40:39 nifi Exp $
SENSORS = sensors.c irq.c button-sensor.c pir-sensor.c vib-sensor.c \ SENSORS = sensors.c irq.c button-sensor.c pir-sensor.c vib-sensor.c \
sound-sensor.c radio-sensor.c ctsrts-sensor.c battery-sensor.c \ sound-sensor.c radio-sensor.c ctsrts-sensor.c battery-sensor.c \
temperature-sensor.c temperature-sensor.c
ESB = ir.c beep.c ds1629.c tr1001-uip.c tr1001-gcr.c gcr.c \ ESB = ir.c beep.c ds1629.c tr1001-gcr.c gcr.c \
esb-sensors.c node-id.c eeprom.c esb-sensors.c node-id.c eeprom.c \
uip-driver.c uip-ipchksum.c
CFS_EEPROM = cfs-eeprom.c CFS_EEPROM = cfs-eeprom.c
CFS_COFFEE = cfs-coffee.c cfs-coffee-arch.c CFS_COFFEE = cfs-coffee.c cfs-coffee-arch.c
CONTIKI_TARGET_DIRS = . dev apps net loader CONTIKI_TARGET_DIRS = . dev apps net loader
ifndef CONTIKI_TARGET_MAIN ifndef CONTIKI_TARGET_MAIN
CONTIKI_TARGET_MAIN = contiki-esb-main.c CONTIKI_TARGET_MAIN = contiki-esb-main.c
endif endif
CONTIKI_TARGET_SOURCEFILES += $(SENSORS) $(ESB) \ CONTIKI_TARGET_SOURCEFILES += $(SENSORS) $(ESB) \
@ -19,33 +20,26 @@ CONTIKI_TARGET_SOURCEFILES += $(SENSORS) $(ESB) \
rs232.c rs232-putchar.c fader.c $(CONTIKI_TARGET_MAIN) rs232.c rs232-putchar.c fader.c $(CONTIKI_TARGET_MAIN)
ifdef WITH_CODEPROP ifdef WITH_CODEPROP
CONTIKI_TARGET_DIRS += ../../apps/codeprop CONTIKI_TARGET_DIRS += ../../apps/codeprop
CONTIKI_TARGET_SOURCEFILES += codeprop-tmp.c CONTIKI_TARGET_SOURCEFILES += codeprop-tmp.c
ifndef NETSTACK WITH_UIP=1
NETSTACK = uip
endif
endif endif
ifeq ($(NETSTACK),uip) ifdef WITH_UIP
CONTIKI_TARGET_SOURCEFILES += contiki-esb-init-net-uip.c uip-ipchksum.c ifndef WITH_SLIP
else WITH_SLIP=1
ifeq ($(NETSTACK),uip-noslip) endif
CONTIKI_TARGET_SOURCEFILES += contiki-esb-init-net-uip-noslip.c uip-ipchksum.c CFLAGS += -DWITH_UIP=1 -DWITH_SLIP=${WITH_SLIP}
else
CONTIKI_TARGET_SOURCEFILES += contiki-esb-default-init-net.c
endif
endif endif
ifeq ($(CFS),coffee) ifeq ($(CFS),coffee)
CONTIKI_TARGET_SOURCEFILES += $(CFS_COFFEE) CONTIKI_TARGET_SOURCEFILES += $(CFS_COFFEE)
else else
CONTIKI_TARGET_SOURCEFILES += $(CFS_EEPROM) CONTIKI_TARGET_SOURCEFILES += $(CFS_EEPROM)
endif endif
include $(CONTIKI)/platform/$(TARGET)/apps/Makefile.apps include $(CONTIKI)/platform/$(TARGET)/apps/Makefile.apps
#PROJECT_OBJECTFILES += $(OBJECTDIR)/contiki-esb-main.o
MCU=msp430x149 MCU=msp430x149
include $(CONTIKI)/cpu/msp430/Makefile.msp430 include $(CONTIKI)/cpu/msp430/Makefile.msp430

View file

@ -1,20 +1,10 @@
#ifndef __CONTIKI_CONF_H__ #ifndef __CONTIKI_CONF_H__
#define __CONTIKI_CONF_H__ #define __CONTIKI_CONF_H__
#define NETSTACK_CONF_RADIO tr1001_driver
/* DCO speed resynchronization for more robust UART, etc. */ /* DCO speed resynchronization for more robust UART, etc. */
#define DCOSYNCH_CONF_ENABLED 1 #define DCOSYNCH_CONF_ENABLED 1
#define DCOSYNCH_CONF_PERIOD 30 #define DCOSYNCH_CONF_PERIOD 30
/* Specifies the default MAC driver */
#define MAC_CONF_DRIVER nullmac_driver
#define PACKETBUF_CONF_ATTRS_INLINE 1
#define QUEUEBUF_CONF_NUM 1
#define QUEUEBUF_CONF_REF_NUM 1
#define ROUTE_CONF_ENTRIES 4
#define SERIAL_LINE_CONF_BUFSIZE 64 #define SERIAL_LINE_CONF_BUFSIZE 64
#define TIMESYNCH_CONF_ENABLED 0 #define TIMESYNCH_CONF_ENABLED 0
@ -53,6 +43,36 @@ void clock_wait(int ms10);
#define LOG_CONF_ENABLED 0 #define LOG_CONF_ENABLED 0
#define PACKETBUF_CONF_ATTRS_INLINE 1
#define NETSTACK_CONF_RADIO tr1001_driver
#if WITH_UIP
/* Network setup for IPv4 */
#define NETSTACK_CONF_NETWORK uip_driver
#define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_FRAMER framer_nullmac
#define QUEUEBUF_CONF_NUM 0
#define QUEUEBUF_CONF_REF_NUM 0
#define ROUTE_CONF_ENTRIES 0
#else /* WITH_UIP */
/* Network setup for non-IPv4 (rime). */
#define NETSTACK_CONF_NETWORK rime_driver
#define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_RDC nullrdc_framer_driver
#define NETSTACK_CONF_FRAMER framer_nullmac
#define QUEUEBUF_CONF_NUM 1
#define QUEUEBUF_CONF_REF_NUM 1
#define ROUTE_CONF_ENTRIES 4
#endif /* WITH_UIP */
/** /**
* The statistics data type. * The statistics data type.
* *
@ -69,8 +89,8 @@ typedef unsigned short uip_stats_t;
#define UIP_CONF_BUFFER_SIZE 110 #define UIP_CONF_BUFFER_SIZE 110
#define UIP_CONF_RECEIVE_WINDOW (UIP_CONF_BUFFER_SIZE - 40) #define UIP_CONF_RECEIVE_WINDOW (UIP_CONF_BUFFER_SIZE - 40)
#define UIP_CONF_MAX_CONNECTIONS 4 #define UIP_CONF_MAX_CONNECTIONS 4
#define UIP_CONF_MAX_LISTENPORTS 8 #define UIP_CONF_MAX_LISTENPORTS 4
#define UIP_CONF_UDP_CONNS 6 #define UIP_CONF_UDP_CONNS 3
#define UIP_CONF_FWCACHE_SIZE 1 #define UIP_CONF_FWCACHE_SIZE 1
#define UIP_CONF_BROADCAST 1 #define UIP_CONF_BROADCAST 1
#define UIP_ARCH_IPCHKSUM 1 #define UIP_ARCH_IPCHKSUM 1
@ -87,6 +107,8 @@ typedef unsigned short uip_stats_t;
#define ELFLOADER_CONF_DATAMEMORY_SIZE 100 #define ELFLOADER_CONF_DATAMEMORY_SIZE 100
#define ELFLOADER_CONF_TEXTMEMORY_SIZE 0x1000 #define ELFLOADER_CONF_TEXTMEMORY_SIZE 0x1000
#define WEBSERVER_CONF_CGI_CONNS 1
/* LEDs ports. */ /* LEDs ports. */
#define LEDS_PxDIR P2DIR #define LEDS_PxDIR P2DIR
#define LEDS_PxOUT P2OUT #define LEDS_PxOUT P2OUT

View file

@ -1,72 +0,0 @@
/*
* Copyright (c) 2005, 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.
*
* This file is part of the Contiki operating system.
*
* @(#)$Id: contiki-esb-default-init-net.c,v 1.14 2010/02/18 23:19:03 adamdunkels Exp $
*/
#include "contiki-conf.h"
#include "dev/tr1001.h"
#include "dev/rs232.h"
#include "dev/serial-line.h"
#include "net/rime.h"
#include "node-id.h"
#include <stdio.h>
#ifndef MAC_DRIVER
#ifdef MAC_CONF_DRIVER
#define MAC_DRIVER MAC_CONF_DRIVER
#else
#define MAC_DRIVER nullmac_driver
#endif /* MAC_CONF_DRIVER */
#endif /* MAC_DRIVER */
extern const struct mac_driver MAC_DRIVER;
void
init_net(void)
{
rimeaddr_t rimeaddr;
int i;
netstack_init();
rimeaddr.u8[0] = node_id & 0xff;
rimeaddr.u8[1] = node_id >> 8;
rimeaddr_set_node_addr(&rimeaddr);
printf("Rime started with address ");
for(i = 0; i < sizeof(rimeaddr.u8) - 1; i++) {
printf("%u.", rimeaddr.u8[i]);
}
printf("%u (%s)\n", rimeaddr.u8[i], MAC_DRIVER.name);
rs232_set_input(serial_line_input_byte);
serial_line_init();
}

View file

@ -1,60 +0,0 @@
/*
* 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.
*
* This file is part of the Contiki operating system.
*
* $Id: contiki-esb-init-net-uip-noslip.c,v 1.2 2007/08/07 11:17:54 nifi Exp $
*/
#include "contiki-esb.h"
static struct uip_fw_netif tr1001if =
{UIP_FW_NETIF(0,0,0,0, 0,0,0,0, tr1001_uip_send)};
#define NODE_ID (node_id & 0xFF)
void
init_net(void)
{
uip_ipaddr_t hostaddr;
uip_init();
uip_fw_init();
process_start(&tcpip_process, NULL);
process_start(&uip_fw_process, NULL);
tr1001_uip_init();
if (NODE_ID > 0) {
/* node id is set, construct an ip address based on the node id */
uip_ipaddr(&hostaddr, 172, 16, 1, NODE_ID);
uip_sethostaddr(&hostaddr);
}
uip_fw_default(&tr1001if);
}

View file

@ -1,72 +0,0 @@
/*
* 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: contiki-esb-init-net-uip.c,v 1.2 2007/08/07 11:17:54 nifi Exp $
*
* -----------------------------------------------------------------
*
* Author : Adam Dunkels, Joakim Eriksson, Niclas Finne
* Created : 2007-04-03
* Updated : $Date: 2007/08/07 11:17:54 $
* $Revision: 1.2 $
*/
#include "contiki-esb.h"
static struct uip_fw_netif tr1001if =
{UIP_FW_NETIF(0,0,0,0, 0,0,0,0, tr1001_uip_send)};
static struct uip_fw_netif slipif =
{UIP_FW_NETIF(172,16,0,0, 255,255,255,0, slip_send)};
#define NODE_ID (node_id & 0xFF)
void
init_net(void)
{
uip_ipaddr_t hostaddr;
uip_init();
uip_fw_init();
rs232_set_input(slip_input_byte);
process_start(&tcpip_process, NULL);
process_start(&slip_process, NULL);
process_start(&uip_fw_process, NULL);
tr1001_uip_init();
if (NODE_ID > 0) {
/* node id is set, construct an ip address based on the node id */
uip_ipaddr(&hostaddr, 172, 16, 1, NODE_ID);
uip_sethostaddr(&hostaddr);
}
uip_fw_register(&slipif);
uip_fw_default(&tr1001if);
}

View file

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: contiki-esb-main.c,v 1.17 2010/02/03 13:59:55 nifi Exp $ * @(#)$Id: contiki-esb-main.c,v 1.18 2010/03/02 22:40:39 nifi Exp $
*/ */
#include <io.h> #include <io.h>
@ -37,10 +37,24 @@
#include <string.h> #include <string.h>
#include "contiki.h" #include "contiki.h"
#include "contiki-esb.h"
#include "dev/watchdog.h" #include "dev/watchdog.h"
#include "sys/autostart.h" #include "sys/autostart.h"
#include "contiki-esb.h" #include "net/uip-driver.h"
#include "net/netstack.h"
#if WITH_UIP
static struct uip_fw_netif tr1001if =
{UIP_FW_NETIF(0,0,0,0, 0,0,0,0, uip_driver_send)};
#if WITH_SLIP
static struct uip_fw_netif slipif =
{UIP_FW_NETIF(172,16,0,0, 255,255,255,0, slip_send)};
#endif /* WITH_SLIP */
#endif /* WITH_UIP */
#ifdef DCOSYNCH_CONF_PERIOD #ifdef DCOSYNCH_CONF_PERIOD
#define DCOSYNCH_PERIOD DCOSYNCH_CONF_PERIOD #define DCOSYNCH_PERIOD DCOSYNCH_CONF_PERIOD
@ -62,6 +76,53 @@ SENSORS(&button_sensor, &sound_sensor, &vib_sensor,
&pir_sensor, &radio_sensor, &battery_sensor, &ctsrts_sensor, &pir_sensor, &radio_sensor, &battery_sensor, &ctsrts_sensor,
&temperature_sensor); &temperature_sensor);
/*---------------------------------------------------------------------------*/
static void
set_rime_addr(void)
{
int i;
rimeaddr_t rimeaddr;
rimeaddr.u8[0] = node_id & 0xff;
rimeaddr.u8[1] = node_id >> 8;
rimeaddr_set_node_addr(&rimeaddr);
printf("Rime started with address ");
for(i = 0; i < sizeof(rimeaddr.u8) - 1; i++) {
printf("%u.", rimeaddr.u8[i]);
}
printf("%u\n", rimeaddr.u8[i]);
}
/*---------------------------------------------------------------------------*/
#if WITH_UIP
static void
init_uip_net(void)
{
uip_ipaddr_t hostaddr;
uip_init();
uip_fw_init();
process_start(&tcpip_process, NULL);
#if WITH_SLIP
process_start(&slip_process, NULL);
rs232_set_input(slip_input_byte);
#endif /* WITH_SLIP */
process_start(&uip_fw_process, NULL);
if (node_id > 0) {
/* node id is set, construct an ip address based on the node id */
uip_ipaddr(&hostaddr, 172, 16, 1, node_id & 0xff);
uip_sethostaddr(&hostaddr);
}
#if WITH_SLIP
uip_fw_register(&slipif);
#endif /* WITH_SLIP */
uip_fw_default(&tr1001if);
}
#endif /* WITH_UIP */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void static void
print_processes(struct process * const processes[]) print_processes(struct process * const processes[])
@ -135,14 +196,7 @@ main(void)
ctimer_init(); ctimer_init();
#if PROFILE_CONF_ON set_rime_addr();
profile_init();
#endif /* PROFILE_CONF_ON */
#if ENERGEST_CONF_ON
energest_init();
ENERGEST_ON(ENERGEST_TYPE_CPU);
#endif /* ENERGEST_CONF_ON */
printf(CONTIKI_VERSION_STRING " started. "); printf(CONTIKI_VERSION_STRING " started. ");
if(node_id > 0) { if(node_id > 0) {
@ -151,13 +205,36 @@ main(void)
printf("Node id is not set.\n"); printf("Node id is not set.\n");
} }
init_net(); netstack_init();
printf("%s %s, channel check rate %u Hz\n",
NETSTACK_MAC.name, NETSTACK_RDC.name,
CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1:
NETSTACK_RDC.channel_check_interval()));
beep_spinup(); beep_spinup();
leds_on(LEDS_RED); leds_on(LEDS_RED);
clock_delay(100); clock_delay(100);
leds_off(LEDS_RED); leds_off(LEDS_RED);
#if !WITH_SLIP
rs232_set_input(serial_line_input_byte);
serial_line_init();
#endif
#if WITH_UIP
init_uip_net();
#endif /* WITH_UIP */
#if PROFILE_CONF_ON
profile_init();
#endif /* PROFILE_CONF_ON */
#if ENERGEST_CONF_ON
energest_init();
ENERGEST_ON(ENERGEST_TYPE_CPU);
#endif /* ENERGEST_CONF_ON */
init_apps(); init_apps();
print_processes(autostart_processes); print_processes(autostart_processes);
autostart_start(autostart_processes); autostart_start(autostart_processes);

View file

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: contiki-esb.h,v 1.5 2009/03/17 20:19:11 adamdunkels Exp $ * @(#)$Id: contiki-esb.h,v 1.6 2010/03/02 22:40:39 nifi Exp $
*/ */
#ifndef __CONTIKI_ESB_H__ #ifndef __CONTIKI_ESB_H__
#define __CONTIKI_ESB_H__ #define __CONTIKI_ESB_H__
@ -46,8 +46,6 @@
#include "dev/serial-line.h" #include "dev/serial-line.h"
#include "dev/slip.h" #include "dev/slip.h"
#include "dev/tr1001.h"
#include "net/tr1001-uip.h"
#include "node-id.h" #include "node-id.h"
@ -71,7 +69,5 @@
void msp430_cpu_init(void); void msp430_cpu_init(void);
void init_lowlevel(void); void init_lowlevel(void);
void init_apps(void); void init_apps(void);
void init_net(void);
#endif /* __CONTIKI_ESB_H__ */ #endif /* __CONTIKI_ESB_H__ */

View file

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: tr1001-gcr.c,v 1.14 2009/11/19 18:04:02 nifi Exp $ * @(#)$Id: tr1001-gcr.c,v 1.15 2010/03/02 22:40:39 nifi Exp $
*/ */
/** /**
* \addtogroup esb * \addtogroup esb
@ -56,6 +56,7 @@
#include "dev/radio-sensor.h" #include "dev/radio-sensor.h"
#include "lib/gcr.h" #include "lib/gcr.h"
#include "lib/crc16.h" #include "lib/crc16.h"
#include "net/netstack.h"
#include "net/rime/rimestats.h" #include "net/rime/rimestats.h"
#include <io.h> #include <io.h>
@ -88,6 +89,11 @@
#define RXBUFSIZE PACKETBUF_SIZE #define RXBUFSIZE PACKETBUF_SIZE
#endif /* TR1001_CONF_BUFFER_SIZE */ #endif /* TR1001_CONF_BUFFER_SIZE */
/*
* Pending data to send when using prepare/transmit functions.
*/
static const void *pending_data;
/* /*
* The buffer which holds incoming data. * The buffer which holds incoming data.
*/ */
@ -140,7 +146,6 @@ static unsigned short tmp_sstrength, sstrength;
static unsigned short tmp_count; static unsigned short tmp_count;
#define DEBUG 0 #define DEBUG 0
#if DEBUG #if DEBUG
#include <stdio.h> #include <stdio.h>
#define LOG(...) printf(__VA_ARGS__) #define LOG(...) printf(__VA_ARGS__)
@ -154,16 +159,23 @@ static unsigned short tmp_count;
PROCESS(tr1001_process, "TR1001 driver"); PROCESS(tr1001_process, "TR1001 driver");
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void (* receiver_callback)(const struct radio_driver *); static int prepare_packet(const void *data, unsigned short len);
static int transmit_packet(unsigned short len);
static void tr1001_set_receiver(void (* recv)(const struct radio_driver *)); static int receiving_packet(void);
static int pending_packet(void);
static int channel_clear(void);
static int tr1001_on(void); static int tr1001_on(void);
static int tr1001_off(void); static int tr1001_off(void);
const struct radio_driver tr1001_driver = { const struct radio_driver tr1001_driver = {
tr1001_init,
prepare_packet,
transmit_packet,
tr1001_send, tr1001_send,
tr1001_read, tr1001_read,
tr1001_set_receiver, channel_clear,
receiving_packet,
pending_packet,
tr1001_on, tr1001_on,
tr1001_off tr1001_off
}; };
@ -312,7 +324,6 @@ sendx_crc16(unsigned char b, uint16_t crcacc)
} }
return crcacc; return crcacc;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
void void
tr1001_set_txpower(unsigned char p) tr1001_set_txpower(unsigned char p)
@ -344,13 +355,7 @@ tr1001_set_txpower(unsigned char p)
P2OUT |= 0x40; /* P26 = 1 (chipselect off) */ P2OUT |= 0x40; /* P26 = 1 (chipselect off) */
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void int
tr1001_set_receiver(void (* recv)(const struct radio_driver *))
{
receiver_callback = recv;
}
/*---------------------------------------------------------------------------*/
void
tr1001_init(void) tr1001_init(void)
{ {
PT_INIT(&rxhandler_pt); PT_INIT(&rxhandler_pt);
@ -377,6 +382,8 @@ tr1001_init(void)
rxclear(); rxclear();
process_start(&tr1001_process, NULL); process_start(&tr1001_process, NULL);
return 1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
interrupt (UART0RX_VECTOR) interrupt (UART0RX_VECTOR)
@ -552,22 +559,44 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
PT_END(&rxhandler_pt); PT_END(&rxhandler_pt);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* static int
* Prepare a transmission. prepare_packet(const void *data, unsigned short len)
* {
* This function does the necessary setup before a packet can be sent pending_data = data;
* out. return 0;
*/ }
static void /*---------------------------------------------------------------------------*/
prepare_transmission(int synchbytes) static int
transmit_packet(unsigned short len)
{
int ret = RADIO_TX_ERR;
if(pending_data != NULL) {
ret = tr1001_send(pending_data, len);
pending_data = NULL;
}
return ret;
}
/*---------------------------------------------------------------------------*/
int
tr1001_send(const void *packet, unsigned short len)
{ {
int i; int i;
uint16_t crc16;
LOG("tr1001_send: sending %d bytes\n", len);
if(onoroff == ON) {
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
}
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* Prepare the transmission. */
/* Delay the transmission for a short random duration. */ /* Delay the transmission for a short random duration. */
clock_delay(random_rand() & 0x3ff); clock_delay(random_rand() & 0x3ff);
/* Check that we don't currently are receiveing a packet, and if so /* Check that we don't currently are receiving a packet, and if so
we wait until the reception has been completed. Reception is done we wait until the reception has been completed. Reception is done
with interrupts so it is OK for us to wait in a while() loop. */ with interrupts so it is OK for us to wait in a while() loop. */
@ -588,8 +617,6 @@ prepare_transmission(int synchbytes)
/* Transmit preamble and synch bytes. */ /* Transmit preamble and synch bytes. */
for(i = 0; i < 20; ++i) { for(i = 0; i < 20; ++i) {
send(0xaa); send(0xaa);
} }
@ -597,29 +624,11 @@ prepare_transmission(int synchbytes)
send(0xaa);*/ send(0xaa);*/
send(0xff); send(0xff);
for(i = 0; i < synchbytes; ++i) { for(i = 0; i < NUM_SYNCHBYTES; ++i) {
send(SYNCH1); send(SYNCH1);
} }
send(SYNCH2); send(SYNCH2);
}
/*---------------------------------------------------------------------------*/
int
tr1001_send(const void *packet, unsigned short len)
{
int i;
uint16_t crc16;
LOG("tr1001_send: sending %d bytes\n", len);
if(onoroff == ON) {
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
}
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* Prepare the transmission. */
prepare_transmission(NUM_SYNCHBYTES);
crc16 = 0xffff; crc16 = 0xffff;
gcr_init(); gcr_init();
@ -702,8 +711,29 @@ tr1001_read(void *buf, unsigned short bufsize)
return 0; return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int
receiving_packet(void)
{
return tr1001_rxstate == RXSTATE_RECEIVING &&
!timer_expired(&rxtimer);
}
/*---------------------------------------------------------------------------*/
static int
pending_packet(void)
{
return tr1001_rxstate == RXSTATE_FULL;
}
/*---------------------------------------------------------------------------*/
static int
channel_clear(void)
{
/* TODO add CCA functionality */
return 0;
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(tr1001_process, ev, data) PROCESS_THREAD(tr1001_process, ev, data)
{ {
int len;
PROCESS_BEGIN(); PROCESS_BEGIN();
/* Reset reception state now that the process is ready to receive data. */ /* Reset reception state now that the process is ready to receive data. */
@ -711,13 +741,11 @@ PROCESS_THREAD(tr1001_process, ev, data)
while(1) { while(1) {
PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL); PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL);
if(receiver_callback != NULL) { packetbuf_clear();
receiver_callback(&tr1001_driver); len = tr1001_read(packetbuf_dataptr(), PACKETBUF_SIZE);
} else { if(len > 0) {
LOG("tr1001 has no receive function\n"); packetbuf_set_datalen(len);
NETSTACK_RDC.input();
/* Perform a dummy read to drop the message. */
tr1001_read((uint8_t *)&data, 0);
} }
} }
@ -756,6 +784,6 @@ tr1001_sstrength(void)
{ {
return sstrength; return sstrength;
} }
/*--------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** @} */ /** @} */
/** @} */ /** @} */

View file

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: tr1001.c,v 1.12 2009/11/19 18:04:02 nifi Exp $ * @(#)$Id: tr1001.c,v 1.13 2010/03/02 22:40:39 nifi Exp $
*/ */
/** /**
* \addtogroup esb * \addtogroup esb
@ -56,6 +56,7 @@
#include "dev/radio-sensor.h" #include "dev/radio-sensor.h"
#include "lib/me.h" #include "lib/me.h"
#include "lib/crc16.h" #include "lib/crc16.h"
#include "net/netstack.h"
#include "net/rime/rimestats.h" #include "net/rime/rimestats.h"
#include <io.h> #include <io.h>
@ -88,6 +89,11 @@
#define RXBUFSIZE PACKETBUF_SIZE #define RXBUFSIZE PACKETBUF_SIZE
#endif /* TR1001_CONF_BUFFER_SIZE */ #endif /* TR1001_CONF_BUFFER_SIZE */
/*
* Pending data to send when using prepare/transmit functions.
*/
static const void *pending_data;
/* /*
* The buffer which holds incoming data. * The buffer which holds incoming data.
*/ */
@ -151,16 +157,23 @@ static unsigned short tmp_count;
PROCESS(tr1001_process, "TR1001 driver"); PROCESS(tr1001_process, "TR1001 driver");
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void (* receiver_callback)(const struct radio_driver *); static int prepare_packet(const void *data, unsigned short len);
static int transmit_packet(unsigned short len);
static void tr1001_set_receiver(void (* recv)(const struct radio_driver *)); static int receiving_packet(void);
static int pending_packet(void);
static int channel_clear(void);
static int tr1001_on(void); static int tr1001_on(void);
static int tr1001_off(void); static int tr1001_off(void);
const struct radio_driver tr1001_driver = { const struct radio_driver tr1001_driver = {
tr1001_init,
prepare_packet,
transmit_packet,
tr1001_send, tr1001_send,
tr1001_read, tr1001_read,
tr1001_set_receiver, channel_clear,
receiving_packet,
pending_packet,
tr1001_on, tr1001_on,
tr1001_off tr1001_off
}; };
@ -333,16 +346,9 @@ tr1001_set_txpower(unsigned char p)
P2OUT |= 0x40; /* P26 = 1 (chipselect off) */ P2OUT |= 0x40; /* P26 = 1 (chipselect off) */
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static void int
tr1001_set_receiver(void (* recv)(const struct radio_driver *))
{
receiver_callback = recv;
}
/*---------------------------------------------------------------------------*/
void
tr1001_init(void) tr1001_init(void)
{ {
PT_INIT(&rxhandler_pt); PT_INIT(&rxhandler_pt);
onoroff = OFF; onoroff = OFF;
@ -367,6 +373,8 @@ tr1001_init(void)
rxclear(); rxclear();
process_start(&tr1001_process, NULL); process_start(&tr1001_process, NULL);
return 1;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
interrupt (UART0RX_VECTOR) interrupt (UART0RX_VECTOR)
@ -548,22 +556,44 @@ PT_THREAD(tr1001_default_rxhandler_pt(unsigned char incoming_byte))
PT_END(&rxhandler_pt); PT_END(&rxhandler_pt);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* static int
* Prepare a transmission. prepare_packet(const void *data, unsigned short len)
* {
* This function does the necessary setup before a packet can be sent pending_data = data;
* out. return 0;
*/ }
static void /*---------------------------------------------------------------------------*/
prepare_transmission(int synchbytes) static int
transmit_packet(unsigned short len)
{
int ret = RADIO_TX_ERR;
if(pending_data != NULL) {
ret = tr1001_send(pending_data, len);
pending_data = NULL;
}
return ret;
}
/*---------------------------------------------------------------------------*/
int
tr1001_send(const void *packet, unsigned short len)
{ {
int i; int i;
uint16_t crc16;
LOG("tr1001_send: sending %d bytes\n", len);
if(onoroff == ON) {
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
}
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* Prepare the transmission. */
/* Delay the transmission for a short random duration. */ /* Delay the transmission for a short random duration. */
clock_delay(random_rand() & 0x3ff); clock_delay(random_rand() & 0x3ff);
/* Check that we don't currently are receiveing a packet, and if so /* Check that we don't currently are receiving a packet, and if so
we wait until the reception has been completed. Reception is done we wait until the reception has been completed. Reception is done
with interrupts so it is OK for us to wait in a while() loop. */ with interrupts so it is OK for us to wait in a while() loop. */
@ -584,8 +614,6 @@ prepare_transmission(int synchbytes)
/* Transmit preamble and synch bytes. */ /* Transmit preamble and synch bytes. */
for(i = 0; i < 20; ++i) { for(i = 0; i < 20; ++i) {
send(0xaa); send(0xaa);
} }
@ -593,29 +621,11 @@ prepare_transmission(int synchbytes)
send(0xaa);*/ send(0xaa);*/
send(0xff); send(0xff);
for(i = 0; i < synchbytes; ++i) { for(i = 0; i < NUM_SYNCHBYTES; ++i) {
send(SYNCH1); send(SYNCH1);
} }
send(SYNCH2); send(SYNCH2);
}
/*---------------------------------------------------------------------------*/
int
tr1001_send(const void *packet, unsigned short len)
{
int i;
uint16_t crc16;
LOG("tr1001_send: sending %d bytes\n", len);
if(onoroff == ON) {
ENERGEST_OFF(ENERGEST_TYPE_LISTEN);
}
ENERGEST_ON(ENERGEST_TYPE_TRANSMIT);
/* Prepare the transmission. */
prepare_transmission(NUM_SYNCHBYTES);
crc16 = 0xffff; crc16 = 0xffff;
/* Send packet header. */ /* Send packet header. */
@ -687,8 +697,29 @@ tr1001_read(void *buf, unsigned short bufsize)
return 0; return 0;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
static int
receiving_packet(void)
{
return tr1001_rxstate == RXSTATE_RECEIVING &&
!timer_expired(&rxtimer);
}
/*---------------------------------------------------------------------------*/
static int
pending_packet(void)
{
return tr1001_rxstate == RXSTATE_FULL;
}
/*---------------------------------------------------------------------------*/
static int
channel_clear(void)
{
/* TODO add CCA functionality */
return 0;
}
/*---------------------------------------------------------------------------*/
PROCESS_THREAD(tr1001_process, ev, data) PROCESS_THREAD(tr1001_process, ev, data)
{ {
int len;
PROCESS_BEGIN(); PROCESS_BEGIN();
/* Reset reception state now that the process is ready to receive data. */ /* Reset reception state now that the process is ready to receive data. */
@ -696,13 +727,11 @@ PROCESS_THREAD(tr1001_process, ev, data)
while(1) { while(1) {
PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL); PROCESS_YIELD_UNTIL(ev == PROCESS_EVENT_POLL);
if(receiver_callback != NULL) { packetbuf_clear();
receiver_callback(&tr1001_driver); len = tr1001_read(packetbuf_dataptr(), PACKETBUF_SIZE);
} else { if(len > 0) {
LOG("tr1001 has no receive function\n"); packetbuf_set_datalen(len);
NETSTACK_RDC.input();
/* Perform a dummy read to drop the message. */
tr1001_read(&data, 0);
} }
} }

View file

@ -28,7 +28,7 @@
* *
* This file is part of the Contiki operating system. * This file is part of the Contiki operating system.
* *
* @(#)$Id: tr1001.h,v 1.8 2008/07/09 20:45:06 nifi Exp $ * @(#)$Id: tr1001.h,v 1.9 2010/03/02 22:40:39 nifi Exp $
*/ */
#ifndef __TR1001_H__ #ifndef __TR1001_H__
#define __TR1001_H__ #define __TR1001_H__
@ -49,7 +49,7 @@ extern const struct radio_driver tr1001_driver;
* Turns on reception of bytes and installs the receive interrupt * Turns on reception of bytes and installs the receive interrupt
* handler. * handler.
*/ */
void tr1001_init(void); int tr1001_init(void);
/** /**
* Set the speed of the TR1001 radio device. * Set the speed of the TR1001 radio device.

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, Swedish Institute of Computer Science * Copyright (c) 2010, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,40 +26,62 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This file is part of the Contiki operating system. * $Id: uip-driver.c,v 1.1 2010/03/02 22:40:39 nifi Exp $
*
* @(#)$Id: tr1001-uip.c,v 1.2 2007/08/07 11:14:39 nifi Exp $
*/ */
#include "contiki-esb.h" /**
#include "net/hc.h" * \file
* A brief description of what this file is
* \author
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
*/
/*---------------------------------------------------------------------------*/ #include "net/netstack.h"
#include "net/uip.h"
#include "net/tcpip.h"
#include "net/hc.h"
#include "net/rime/packetbuf.h"
#include "net/uip-driver.h"
#include <string.h>
/*--------------------------------------------------------------------*/
static void static void
tr1001_uip_callback(const struct radio_driver *driver) init(void)
{ {
uip_len = driver->read(&uip_buf[UIP_LLH_LEN], UIP_BUFSIZE - UIP_LLH_LEN); /*
if(uip_len > 0) { * Set out output function as the function to be called from uIP to
uip_len = hc_inflate(&uip_buf[UIP_LLH_LEN], uip_len); * send a packet.
*/
tcpip_set_outputfunc(uip_driver_send);
}
/*--------------------------------------------------------------------*/
static void
input(void)
{
if(packetbuf_datalen() > 0 &&
packetbuf_datalen() <= UIP_BUFSIZE - UIP_LLH_LEN) {
memcpy(&uip_buf[UIP_LLH_LEN], packetbuf_dataptr(), packetbuf_datalen());
uip_len = hc_inflate(&uip_buf[UIP_LLH_LEN], packetbuf_datalen());
tcpip_input(); tcpip_input();
} }
} }
/*---------------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
void uint8_t
tr1001_uip_init() uip_driver_send(void)
{
tr1001_init();
tr1001_driver.set_receive_function(tr1001_uip_callback);
}
/*---------------------------------------------------------------------------*/
u8_t
tr1001_uip_send(void)
{ {
uip_len = hc_compress(&uip_buf[UIP_LLH_LEN], uip_len); uip_len = hc_compress(&uip_buf[UIP_LLH_LEN], uip_len);
if (tr1001_driver.send(&uip_buf[UIP_LLH_LEN], uip_len) == 0) { packetbuf_copyfrom(&uip_buf[UIP_LLH_LEN], uip_len);
return UIP_FW_OK;
} else { /* XXX we should provide a callback function that is called when the
return UIP_FW_DROPPED; packet is sent. For now, we just supply a NULL pointer. */
} NETSTACK_MAC.send(NULL, NULL);
return 1;
} }
/*---------------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
const struct network_driver uip_driver = {
"uip",
init,
input
};
/*--------------------------------------------------------------------*/

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, Swedish Institute of Computer Science * Copyright (c) 2010, Swedish Institute of Computer Science.
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -26,14 +26,24 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* This file is part of the Contiki operating system. * $Id: uip-driver.h,v 1.1 2010/03/02 22:40:39 nifi Exp $
*
* @(#)$Id: tr1001-uip.h,v 1.2 2007/08/07 11:14:39 nifi Exp $
*/ */
#ifndef __TR1001_UIP_H__
#define __TR1001_UIP_H__
void tr1001_uip_init(); /**
u8_t tr1001_uip_send(void); * \file
* A brief description of what this file is
* \author
* Niclas Finne <nfi@sics.se>
* Joakim Eriksson <joakime@sics.se>
*/
#endif /* __TR1001_UIP_H__ */ #ifndef __UIP_DRIVER_H__
#define __UIP_DRIVER_H__
#include "net/netstack.h"
uint8_t uip_driver_send(void);
extern const struct network_driver uip_driver;
#endif /* __UIP_DRIVER_H__ */