Newer and cleaner TARGET=econotag as well as robust mc13224v

configuration system.

(also deprecate TARGET=redbee-econotag)

- mc13224v now automatically probes hardware config for buck converter
and 32kHz crystal as well as automatically monitors battery voltage
and manages the buck accordingly.

- new flashed based config system for mc13224v parameters such has
  radio modes (demod, autoack), nvmtype, mac address, channel and
  power.

- considerably cleaned up econotag platform code (suffered from severe
  case of bit-rot)
This commit is contained in:
Mariano Alvira 2012-10-20 22:29:16 -04:00
parent 01a28e47d5
commit 03ab3fe317
15 changed files with 950 additions and 25 deletions

View file

@ -10,7 +10,7 @@ CONTIKI_CPU=$(CONTIKI)/cpu/mc1322x
CONTIKI_CPU_DIRS = . lib src board dev ../arm/common/dbg-io CONTIKI_CPU_DIRS = . lib src board dev ../arm/common/dbg-io
MC1322X = debug-uart.c rtimer-arch.c watchdog.c contiki-crm.c contiki-maca.c contiki-misc.c leds-arch.c leds.c contiki-uart.c slip-uart1.c MC1322X = debug-uart.c rtimer-arch.c watchdog.c contiki-crm.c contiki-maca.c contiki-misc.c leds-arch.c leds.c contiki-uart.c slip-uart1.c init.c config.c
DBG_IO = dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c DBG_IO = dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c

83
cpu/mc1322x/config.c Normal file
View file

@ -0,0 +1,83 @@
/* MC1322x flash config system */
#include <mc1322x.h>
#include "config.h"
/* debug */
#define DEBUG DEBUG_FULL
#include "net/uip-debug.h"
mc1322xConfig mc1322x_config;
void dump_bytes(uint32_t addr, uint16_t num);
/* takes an mc1322xConf and initializes to default values */
void mc1322x_config_set_default(mc1322xConfig *c) {
nvmType_t type;
c->magic = MC1322X_CONFIG_MAGIC;
c->version = MC1322X_CONFIG_VERSION;
c->eui = 0;
c->channel = RF_CHANNEL - 11;
c->power = 0x11;
c->flags.demod = DEMOD_DCD;
c->flags.autoack = AUTOACK;
nvm_detect(gNvmInternalInterface_c, &type);
c->flags.nvmtype = type;
}
/* write out config to flash */
void mc1322x_config_save(mc1322xConfig *c) {
nvmErr_t err;
err = nvm_erase(gNvmInternalInterface_c, c->flags.nvmtype, 1 << MC1322X_CONFIG_PAGE/4096);
err = nvm_write(gNvmInternalInterface_c, c->flags.nvmtype, (uint8_t *)c, MC1322X_CONFIG_PAGE, sizeof(mc1322xConfig));
}
/* load the config from flash to the pass conf structure */
void mc1322x_config_restore(mc1322xConfig *c) {
nvmErr_t err;
nvmType_t type;
if (c->flags.nvmtype == 0) { nvm_detect(gNvmInternalInterface_c, &type); }
c->flags.nvmtype = type;
err = nvm_read(gNvmInternalInterface_c, c->flags.nvmtype, c, MC1322X_CONFIG_PAGE, sizeof(mc1322xConfig));
}
/* check the flash for magic number and proper version */
int mc1322x_config_valid(mc1322xConfig *c) {
if (c->magic == MC1322X_CONFIG_MAGIC &&
c->version == MC1322X_CONFIG_VERSION) {
return 1;
} else {
#if DEBUG
if (c->magic != MC1322X_CONFIG_MAGIC) { PRINTF("config bad magic %04x\n\r", c->magic); }
if (c->version != MC1322X_CONFIG_MAGIC) { PRINTF("config bad version %04x\n\r", c->version); }
#endif
return -1;
}
}
void mc1322x_config_print(void) {
uint64_t eui64;
PRINTF("mc1322x config:\n\r");
PRINTF(" magic: %04x\n\r", mc1322x_config.magic);
PRINTF(" version: %d\n\r", mc1322x_config.version);
PRINTF(" eui: %08x%08x\n\r", (uint32_t)(mc1322x_config.eui>>32), (uint32_t)(mc1322x_config.eui & 0xffffffff));
PRINTF(" channel: %d\n\r", mc1322x_config.channel);
PRINTF(" power: %d\n\r", mc1322x_config.power);
PRINTF(" flags: %08x\n\r", mc1322x_config.flags);
PRINTF(" demod: %d\n\r", mc1322x_config.flags.demod);
PRINTF(" autoack: %d\n\r", mc1322x_config.flags.autoack);
PRINTF(" nvm type: %d\n\r", mc1322x_config.flags.nvmtype);
}
void dump_bytes(uint32_t addr, uint16_t num) {
uint32_t buf[num/4];
nvmErr_t err;
uint16_t i;
err = nvm_read(gNvmInternalInterface_c, mc1322x_config.flags.nvmtype, (uint8_t *)buf, addr, num);
PRINTF("nvm_read returned: 0x%02x\r\n", err);
for(i=0; i < num/4; i++) {
printf("0x%08x\r\n", (unsigned int)buf[i]);
}
}

35
cpu/mc1322x/config.h Normal file
View file

@ -0,0 +1,35 @@
/* MC1322x flash config system */
#ifndef MC1322X_CONFIG_H
#define MC1322X_CONFIG_H
#define MC1322X_CONFIG_PAGE 0x1E000 /* nvm page where conf will be stored */
#define MC1322X_CONFIG_VERSION 1
#define MC1322X_CONFIG_MAGIC 0x1322
/* bitfield for various config flags */
struct FLAGS {
uint32_t demod:1; /* radio demodulation mode */
uint32_t autoack:1; /* radio autoack vs. promiscuous mode */
uint32_t nvmtype:4; /* stores the result of nvm_detect */
uint32_t : 26;
};
typedef struct {
uint16_t magic; /* mc1322x magic number 0x1322 */
uint16_t version; /* mc1322x config version number */
uint64_t eui;
uint8_t channel; /* value to pass to set_channel */
uint8_t power; /* value to pass to set_power */
struct FLAGS flags;
} mc1322xConfig;
extern mc1322xConfig mc1322x_config;
void mc1322x_config_set_default(mc1322xConfig *c);
void mc1322x_config_save(mc1322xConfig *c);
void mc1322x_config_restore(mc1322xConfig *c);
int mc1322x_config_valid(mc1322xConfig *c);
void mc1322x_config_print(void);
#endif

View file

@ -37,21 +37,21 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
/* debug */
#define DEBUG DEBUG_ANNOTATE
#include "net/uip-debug.h"
/* contiki */ /* contiki */
#include "radio.h" #include "radio.h"
#include "sys/process.h" #include "sys/process.h"
#include "net/packetbuf.h" #include "net/packetbuf.h"
#include "net/netstack.h" #include "net/netstack.h"
#include "mc1322x.h"
#include "contiki-conf.h" #include "contiki-conf.h"
#define CONTIKI_MACA_DEBUG 0 /* mc1322x */
#if CONTIKI_MACA_DEBUG #include "mc1322x.h"
#define PRINTF(...) printf(__VA_ARGS__) #include "config.h"
#else
#define PRINTF(...)
#endif
#ifndef CONTIKI_MACA_PREPEND_BYTE #ifndef CONTIKI_MACA_PREPEND_BYTE
#define CONTIKI_MACA_PREPEND_BYTE 0xff #define CONTIKI_MACA_PREPEND_BYTE 0xff
@ -61,6 +61,8 @@
#define BLOCKING_TX 1 #define BLOCKING_TX 1
#endif #endif
unsigned short node_id = 0;
static volatile uint8_t tx_complete; static volatile uint8_t tx_complete;
static volatile uint8_t tx_status; static volatile uint8_t tx_status;
@ -98,6 +100,40 @@ static process_event_t event_data_ready;
static volatile packet_t prepped_p; static volatile packet_t prepped_p;
void contiki_maca_set_mac_address(uint64_t eui) {
rimeaddr_t addr;
uint8_t i;
/* setup mac address registers in maca hardware */
*MACA_MACPANID = 0xcdab; /* this is the hardcoded contiki pan, register is PACKET order */
*MACA_MAC16ADDR = 0xffff; /* short addressing isn't used, set this to 0xffff for now */
*MACA_MAC64HI = (uint32_t) (eui >> 32);
*MACA_MAC64LO = (uint32_t) eui;
ANNOTATE("setting panid 0x%04x\n\r", *MACA_MACPANID);
ANNOTATE("setting short mac 0x%04x\n\r", *MACA_MAC16ADDR);
ANNOTATE("setting long mac 0x%08x_%08x\n\r", *MACA_MAC64HI, *MACA_MAC64LO);
/* setup mac addresses in Contiki (RIME) */
rimeaddr_copy(&addr, &rimeaddr_null);
for(i=0; i < RIMEADDR_CONF_SIZE; i++) {
addr.u8[RIMEADDR_CONF_SIZE - 1 - i] = (mc1322x_config.eui >> (i * 8)) & 0xff;
}
node_id = (addr.u8[6] << 8 | addr.u8[7]);
rimeaddr_set_node_addr(&addr);
#if DEBUG_ANNOTATE
ANNOTATE("Rime configured with address ");
for(i = 0; i < sizeof(addr.u8) - 1; i++) {
ANNOTATE("%02X:", addr.u8[i]);
}
ANNOTATE("%02X\n", addr.u8[i]);
#endif
}
int contiki_maca_init(void) { int contiki_maca_init(void) {
// trim_xtal(); // trim_xtal();
// vreg_init(); // vreg_init();
@ -143,7 +179,7 @@ int contiki_maca_off_request(void) {
int contiki_maca_read(void *buf, unsigned short bufsize) { int contiki_maca_read(void *buf, unsigned short bufsize) {
volatile uint32_t i; volatile uint32_t i;
volatile packet_t *p; volatile packet_t *p;
if((p = rx_packet())) { if((p = rx_packet())) {
PRINTF("maca read"); PRINTF("maca read");
#if CONTIKI_MACA_RAW_MODE #if CONTIKI_MACA_RAW_MODE
@ -162,7 +198,7 @@ int contiki_maca_read(void *buf, unsigned short bufsize) {
for( i = p->offset ; i < (bufsize + p->offset) ; i++) { for( i = p->offset ; i < (bufsize + p->offset) ; i++) {
PRINTF(" %02x",p->data[i]); PRINTF(" %02x",p->data[i]);
} }
#endif #endif
PRINTF("\n\r"); PRINTF("\n\r");
free_packet(p); free_packet(p);
return bufsize; return bufsize;
@ -177,12 +213,12 @@ int contiki_maca_read(void *buf, unsigned short bufsize) {
/* the same packet repeatedly */ /* the same packet repeatedly */
int contiki_maca_prepare(const void *payload, unsigned short payload_len) { int contiki_maca_prepare(const void *payload, unsigned short payload_len) {
volatile int i; volatile int i;
PRINTF("contiki maca prepare"); PRINTF("contiki maca prepare");
#if CONTIKI_MACA_RAW_MODE #if CONTIKI_MACA_RAW_MODE
prepped_p.offset = 1; prepped_p.offset = 1;
prepped_p.length = payload_len + 1; prepped_p.length = payload_len + 1;
#else #else
prepped_p.offset = 0; prepped_p.offset = 0;
prepped_p.length = payload_len; prepped_p.length = payload_len;
#endif #endif
@ -200,7 +236,7 @@ int contiki_maca_prepare(const void *payload, unsigned short payload_len) {
} }
PRINTF("\n\r"); PRINTF("\n\r");
#endif #endif
return RADIO_TX_OK; return RADIO_TX_OK;
} }
@ -216,10 +252,10 @@ int contiki_maca_transmit(unsigned short transmit_len) {
tx_complete = 0; tx_complete = 0;
#endif #endif
if(p = get_free_packet()) { if(p = get_free_packet()) {
p->offset = prepped_p.offset; p->offset = prepped_p.offset;
p->length = prepped_p.length; p->length = prepped_p.length;
memcpy((uint8_t *)(p->data + p->offset), memcpy((uint8_t *)(p->data + p->offset),
(const uint8_t *)(prepped_p.data + prepped_p.offset), (const uint8_t *)(prepped_p.data + prepped_p.offset),
prepped_p.length); prepped_p.length);
tx_packet(p); tx_packet(p);
} else { } else {
@ -230,7 +266,7 @@ int contiki_maca_transmit(unsigned short transmit_len) {
#if BLOCKING_TX #if BLOCKING_TX
/* block until tx_complete, set by contiki_maca_tx_callback */ /* block until tx_complete, set by contiki_maca_tx_callback */
while(!tx_complete && (tx_head != 0)); while(!tx_complete && (tx_head != 0));
#endif #endif
} }
int contiki_maca_send(const void *payload, unsigned short payload_len) { int contiki_maca_send(const void *payload, unsigned short payload_len) {
@ -255,7 +291,7 @@ PROCESS_THREAD(contiki_maca_process, ev, data)
{ {
volatile uint32_t i; volatile uint32_t i;
int len; int len;
PROCESS_BEGIN(); PROCESS_BEGIN();
while (1) { while (1) {
@ -276,7 +312,7 @@ PROCESS_THREAD(contiki_maca_process, ev, data)
packetbuf_clear(); packetbuf_clear();
len = contiki_maca_read(packetbuf_dataptr(), PACKETBUF_SIZE); len = contiki_maca_read(packetbuf_dataptr(), PACKETBUF_SIZE);
if(len > 0) { if(len > 0) {
packetbuf_set_datalen(len); packetbuf_set_datalen(len);
NETSTACK_RDC.input(); NETSTACK_RDC.input();
} }
} }
@ -284,9 +320,9 @@ PROCESS_THREAD(contiki_maca_process, ev, data)
if (rx_head != NULL) { if (rx_head != NULL) {
process_poll(&contiki_maca_process); process_poll(&contiki_maca_process);
} }
}; };
PROCESS_END(); PROCESS_END();
} }

201
cpu/mc1322x/init.c Normal file
View file

@ -0,0 +1,201 @@
#include <stdio.h>
/* debug */
#define DEBUG DEBUG_FULL
#include "net/uip-debug.h"
/* contiki */
#include "sys/process.h"
/* mc1322x */
#include "mc1322x.h"
#include "contiki-maca.h"
#include "config.h"
/* Threshold for buck converter; buck will be disabled if vbatt is below this */
#define MC1322X_BUCK_THRES 2425
/* Hysterisis window around buck threshold */
#define MC1322X_BUCK_WINDOW 150
#define MC1322X_BUCK_THRES_H (MC1322X_BUCK_THRES + MC1322X_BUCK_WINDOW/2)
#define MC1322X_BUCK_THRES_L (MC1322X_BUCK_THRES - MC1322X_BUCK_WINDOW/2)
/* Time between vbatt checks for the buck */
#define MC1322X_BUCK_MONITOR_PERIOD 600 * CLOCK_SECOND
/* periodically poll adc_vbatt and manages the buck appropriately */
static struct etimer et_buck;
PROCESS(buck_monitor, "buck monitor");
PROCESS_THREAD(buck_monitor, ev, data)
{
PROCESS_BEGIN();
PRINTF("starting vbatt monitor\n");
etimer_set(&et_buck, MC1322X_BUCK_MONITOR_PERIOD);
while (1) {
PROCESS_WAIT_EVENT();
if(etimer_expired(&et_buck))
{
adc_service();
PRINTF("buck monitor: vbatt: %d mV\n\r", adc_vbatt);
if( CRM->VREG_CNTLbits.BUCK_EN == 1 && adc_vbatt < MC1322X_BUCK_THRES_L ) {
PRINTF("vbatt low, disabling buck\n\r", adc_vbatt);
CRM->SYS_CNTLbits.PWR_SOURCE = 0;
CRM->VREG_CNTLbits.BUCK_SYNC_REC_EN = 0;
CRM->VREG_CNTLbits.BUCK_BYPASS_EN = 1;
CRM->VREG_CNTLbits.BUCK_EN = 0;
} else if ( CRM->VREG_CNTLbits.BUCK_EN == 0 && adc_vbatt > MC1322X_BUCK_THRES_H ) {
PRINTF("vbatt high, enabling buck\n\r", adc_vbatt);
CRM->SYS_CNTLbits.PWR_SOURCE = 1;
CRM->VREG_CNTLbits.BUCK_SYNC_REC_EN = 1;
CRM->VREG_CNTLbits.BUCK_BYPASS_EN = 0;
CRM->VREG_CNTLbits.BUCK_EN = 1;
}
etimer_set(&et_buck, MC1322X_BUCK_MONITOR_PERIOD);
}
}
PROCESS_END();
}
void buck_setup(void) {
nvmType_t type;
nvmErr_t err;
volatile int i;
default_vreg_init();
while(CRM->STATUSbits.VREG_1P5V_RDY == 0) { continue; }
while(CRM->STATUSbits.VREG_1P8V_RDY == 0) { continue; }
/* takes time for the flash supply to fail (if there is no buck) */
/* spin while this happens doing nvm_detects */
/* XXX todo: don't probe buck if Vbatt < 2.5V */
adc_service();
PRINTF("vbatt: %04u mV\n\r", adc_vbatt);
type = 1;
for(i = 0; i < 128 && type != 0; i++) {
err = nvm_detect(gNvmInternalInterface_c, &type);
}
if (type == gNvmType_NoNvm_c)
{
PRINTF("NVM failed without buck, trying with buck\n\r");
if (adc_vbatt < MC1322X_BUCK_THRES_L)
{
PRINTF("Vbatt is low, bypassing buck\n\r");
CRM->SYS_CNTLbits.PWR_SOURCE = 0;
CRM->VREG_CNTLbits.BUCK_SYNC_REC_EN = 0;
CRM->VREG_CNTLbits.BUCK_BYPASS_EN = 1;
CRM->VREG_CNTLbits.BUCK_EN = 0;
} else {
CRM->SYS_CNTLbits.PWR_SOURCE = 1;
CRM->VREG_CNTLbits.BUCK_SYNC_REC_EN = 1;
CRM->VREG_CNTLbits.BUCK_BYPASS_EN = 0;
CRM->VREG_CNTLbits.BUCK_EN = 1;
}
while(CRM->STATUSbits.VREG_BUCK_RDY == 0) { continue; }
CRM->VREG_CNTLbits.VREG_1P5V_SEL = 3;
CRM->VREG_CNTLbits.VREG_1P5V_EN = 3;
CRM->VREG_CNTLbits.VREG_1P8V_EN = 1;
while(CRM->STATUSbits.VREG_1P5V_RDY == 0) { continue; }
while(CRM->STATUSbits.VREG_1P8V_RDY == 0) { continue; }
type = 1;
for(i = 0; i < 128 && type != 0; i++) {
err = nvm_detect(gNvmInternalInterface_c, &type);
}
if (type != gNvmType_NoNvm_c) {
PRINTF("buck ok\n\r");
/* start a process to monitor vbatt and enable/disable the buck as necessary */
process_start(&buck_monitor, NULL);
} else {
printf("fatal: couldn't detect NVM\n\r");
}
} else {
PRINTF("NVM ok without buck\n\r");
}
}
/* setup the RTC */
/* try to start the 32kHz xtal */
void rtc_setup(void) {
volatile uint32_t rtc_count;
volatile uint32_t i;
ring_osc_off();
xtal32_on();
xtal32_exists();
rtc_count = CRM->RTC_COUNT;
PRINTF("trying to start 32kHz xtal\n\r");
for(i = 0; i < 150000 && CRM->RTC_COUNT == rtc_count; i++) { continue; }
if(CRM->RTC_COUNT == rtc_count) {
PRINTF("32xtal failed, using ring osc\n\r");
CRM->SYS_CNTLbits.XTAL32_EXISTS = 0;
CRM->XTAL32_CNTLbits.XTAL32_EN = 0;
ring_osc_on();
/* Set default tune values from datasheet */
CRM->RINGOSC_CNTLbits.ROSC_CTUNE = 0x6;
CRM->RINGOSC_CNTLbits.ROSC_FTUNE = 0x17;
/* Trigger calibration */
rtc_calibrate();
PRINTF("RTC calibrated to %d Hz\r\n", rtc_freq);
} else {
PRINTF("32kHz xtal started\n\r");
}
}
/* call mc1322x_init once to initalize everything with the current config */
void mc1322x_init(void) {
/* XXX TODO load config from flash */
/* config should say what uart to use for debug console */
/* config should also set the baud rate */
/* for now, just clean up contiki-conf.h */
/* maybe factor into conf.h -> contiki-conf.h and mc1322x-conf.h platform-conf.h */
/* print out config in debug */
/* initialize the uarts */
uart_init(CONSOLE_UART, CONSOLE_BAUD);
PRINTF("mc1322x init\n\r");
adc_init();
clock_init();
ctimer_init();
process_init();
process_start(&etimer_process, NULL);
process_start(&contiki_maca_process, NULL);
buck_setup();
rtc_setup();
/* start with a default config */
mc1322x_config_restore(&mc1322x_config);
if ( mc1322x_config_valid(&mc1322x_config) != 1 ) {
PRINTF("flash invalid\n\r");
/* save the default config to flash */
mc1322x_config_set_default(&mc1322x_config);
mc1322x_config_save(&mc1322x_config);
}
#if DEBUG_FULL
mc1322x_config_print();
#endif
/* setup the radio */
maca_init();
set_power(mc1322x_config.power);
set_channel(mc1322x_config.channel);
set_demodulator_type(mc1322x_config.flags.demod);
set_prm_mode(mc1322x_config.flags.autoack);
}

View file

@ -174,14 +174,14 @@ void rtc_calibrate(void)
#define TIMEOUT 100 /* 50 msec per attempt */ #define TIMEOUT 100 /* 50 msec per attempt */
for (i = 0; i < 9; i++) for (i = 0; i < 16; i++)
{ {
mid = (low + high) / 2; mid = (low + high) / 2;
count = __rtc_try(mid, TIMEOUT); count = __rtc_try(mid, TIMEOUT);
// careful about overflow // careful about overflow
rtc_freq = REF_OSC / ((count + TIMEOUT/2) / TIMEOUT); rtc_freq = REF_OSC / ((count + TIMEOUT/2) / TIMEOUT);
if (rtc_freq > 2000) if (rtc_freq > 2048)
low = mid; // increase loading low = mid; // increase loading
else else
high = mid; // decrease loading high = mid; // decrease loading

View file

@ -0,0 +1,22 @@
# -*- makefile -*-
CONTIKI_TARGET_DIRS = . dev apps net
CONTIKI_CORE = main
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o
CONTIKI_TARGET_SOURCEFILES += main.c clock.c button-sensor.c sensors.c slip.c platform_prints.c
${warning $(CONTIKI)}
CONTIKIMC1322X=$(CONTIKI)/cpu/mc1322x
CONTIKIBOARD=.
CONTIKI_PLAT_DEFS =
MCU=arm7tdmi-s
ifdef UIP_CONF_IPV6
CFLAGS += -DWITH_UIP6=1
endif
include $(CONTIKIMC1322X)/Makefile.mc1322x

View file

@ -0,0 +1,92 @@
/*
* Copyright (c) 2010, Mariano Alvira <mar@devl.org> and other contributors
* to the MC1322x project (http://mc1322x.devl.org) and Contiki.
*
* 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 OS.
*
* $Id: button-sensor.c,v 1.1 2010/06/09 14:46:30 maralvira Exp $
*/
#include "lib/sensors.h"
#include "dev/button-sensor.h"
#include "mc1322x.h"
#include <signal.h>
const struct sensors_sensor button_sensor;
static struct timer debouncetimer;
static int status(int type);
void kbi4_isr(void) {
if(timer_expired(&debouncetimer)) {
timer_set(&debouncetimer, CLOCK_SECOND / 4);
sensors_changed(&button_sensor);
}
clear_kbi_evnt(4);
}
static int
value(int type)
{
return GPIO->DATA.GPIO_26 || !timer_expired(&debouncetimer);
}
static int
configure(int type, int c)
{
switch (type) {
case SENSORS_ACTIVE:
if (c) {
if(!status(SENSORS_ACTIVE)) {
timer_set(&debouncetimer, 0);
enable_irq_kbi(4);
}
} else {
disable_irq_kbi(4);
}
return 1;
}
return 0;
}
static int
status(int type)
{
switch (type) {
case SENSORS_ACTIVE:
case SENSORS_READY:
return bit_is_set(*CRM_WU_CNTL, 20); /* check if kbi4 irq is enabled */
}
return 0;
}
SENSORS_SENSOR(button_sensor, BUTTON_SENSOR,
value, configure, status);

View file

@ -0,0 +1,246 @@
/*
* Copyright (c) 2010, Mariano Alvira <mar@devl.org> and other contributors
* to the MC1322x project (http://mc1322x.devl.org) and Contiki.
*
* 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
* Configuration for Econotag
*
* \author
* Original by:
* Simon Barner <barner@in.tum.de>
* This version by:
* Mariano Alvira <mar@devl.org>
*/
#ifndef __CONTIKI_CONF_H__
#define __CONTIKI_CONF_H__
#include <stdint.h>
/* mc1322x files */
#include "contiki-mc1322x-conf.h"
/* Econotag I tune parameters */
#define ECONOTAG_CTUNE_4PF 1
/* Coarse tune: add 0-15 pf (CTUNE is 4 bits) */
#define ECONOTAG_CTUNE 11
/* Fine tune: add FTUNE * 156fF (FTUNE is 5bits) */
#define ECONOTAG_FTUNE 7
/* M12 tune parameters */
#define M12_CTUNE_4PF 1
#define M12_CTUNE 3
#define M12_FTUNE 3
/* the econotag platform will correctly detect an Econotag I (no M12) vs. Econotag II (w/M12) */
/* and trim the main crystal accordingly */
/* this detection will be incorrect if you populate the 32.768kHz crystal on the Econotag I */
/* In that case, you should FORCE_ECONOTAG_I below */
#define FORCE_ECONOTAG_I 0
/* if you define a serial number then it will be used to comput the mac address */
/* otherwise, a random mac address in the Redwire development IAB will be used */
/* #define M12_CONF_SERIAL 0x000000 */
/* Clock ticks per second */
#define CLOCK_CONF_SECOND 100
#define CCIF
#define CLIF
#define CONSOLE_UART UART1
#define CONSOLE_BAUD 115200
#define dbg_putchar(x) uart1_putc(x)
#define USE_FORMATTED_STDIO 1
#define MACA_DEBUG 0
#define CONTIKI_MACA_RAW_MODE 0
#define BLOCKING_TX 1
#define MACA_AUTOACK 1
#define NULLRDC_CONF_802154_AUTOACK_HW 1
#define USE_WDT 0
#ifndef WDT_TIMEOUT
#define WDT_TIMEOUT 5000 /* watchdog timeout in ms */
#endif
/* end of mc1322x specific config. */
/* start of conitki config. */
#define PLATFORM_HAS_LEDS 1
#define PLATFORM_HAS_BUTTON 1
/* Core rtimer.h defaults to 16 bit timer unless RTIMER_CLOCK_LT is defined */
typedef unsigned long rtimer_clock_t;
#define RTIMER_CLOCK_LT(a,b) ((signed long)((a)-(b)) < 0)
#define RIMEADDR_CONF_SIZE 8
#if WITH_UIP6
/* Network setup for IPv6 */
#define NETSTACK_CONF_NETWORK sicslowpan_driver
#define NETSTACK_CONF_MAC nullmac_driver
#define NETSTACK_CONF_RDC nullrdc_driver
#define NETSTACK_CONF_RADIO contiki_maca_driver
#define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
#define RIME_CONF_NO_POLITE_ANNOUCEMENTS 0
#define CXMAC_CONF_ANNOUNCEMENTS 0
#define XMAC_CONF_ANNOUNCEMENTS 0
#else /* WITH_UIP6 */
/* Network setup for non-IPv6 (rime). */
#define NETSTACK_CONF_NETWORK rime_driver
#define NETSTACK_CONF_MAC csma_driver
#define NETSTACK_CONF_RDC sicslowmac_driver
#define NETSTACK_CONF_RADIO contiki_maca_driver
#define NETSTACK_CONF_FRAMER framer_802154
#define NETSTACK_CONF_RDC_CHANNEL_CHECK_RATE 8
#define COLLECT_CONF_ANNOUNCEMENTS 1
#define RIME_CONF_NO_POLITE_ANNOUCEMENTS 0
#define CXMAC_CONF_ANNOUNCEMENTS 0
#define XMAC_CONF_ANNOUNCEMENTS 0
#define CONTIKIMAC_CONF_ANNOUNCEMENTS 0
#define CONTIKIMAC_CONF_COMPOWER 0
#define XMAC_CONF_COMPOWER 0
#define CXMAC_CONF_COMPOWER 0
#define COLLECT_NEIGHBOR_CONF_MAX_NEIGHBORS 32
#endif /* WITH_UIP6 */
#define QUEUEBUF_CONF_NUM 16
#define PACKETBUF_CONF_ATTRS_INLINE 1
#ifndef RF_CHANNEL
#define RF_CHANNEL 26
#endif /* RF_CHANNEL */
#define CONTIKIMAC_CONF_BROADCAST_RATE_LIMIT 0
#define IEEE802154_CONF_PANID 0xABCD
#define PROFILE_CONF_ON 0
#define ENERGEST_CONF_ON 0
#define AODV_COMPLIANCE
#define AODV_NUM_RT_ENTRIES 32
#define WITH_ASCII 1
#define PROCESS_CONF_NUMEVENTS 8
#define PROCESS_CONF_STATS 1
#ifdef WITH_UIP6
#define RIMEADDR_CONF_SIZE 8
#define UIP_CONF_LL_802154 1
#define UIP_CONF_LLH_LEN 0
#define UIP_CONF_ROUTER 1
#define UIP_CONF_IPV6_RPL 1
#define UIP_CONF_DS6_NBR_NBU 30
#define UIP_CONF_DS6_ROUTE_NBU 30
#define UIP_CONF_ND6_SEND_RA 0
#define UIP_CONF_ND6_REACHABLE_TIME 600000
#define UIP_CONF_ND6_RETRANS_TIMER 10000
#define UIP_CONF_IPV6 1
#define UIP_CONF_IPV6_QUEUE_PKT 0
#define UIP_CONF_IPV6_CHECKS 1
#define UIP_CONF_IPV6_REASSEMBLY 0
#define UIP_CONF_NETIF_MAX_ADDRESSES 3
#define UIP_CONF_ND6_MAX_PREFIXES 3
#define UIP_CONF_ND6_MAX_NEIGHBORS 4
#define UIP_CONF_ND6_MAX_DEFROUTERS 2
#define UIP_CONF_IP_FORWARD 0
#define UIP_CONF_BUFFER_SIZE 1300
#define SICSLOWPAN_CONF_FRAG 1
#define SICSLOWPAN_CONF_MAXAGE 8
#define SICSLOWPAN_CONF_COMPRESSION_IPV6 0
#define SICSLOWPAN_CONF_COMPRESSION_HC1 1
#define SICSLOWPAN_CONF_COMPRESSION_HC01 2
#define SICSLOWPAN_CONF_COMPRESSION SICSLOWPAN_COMPRESSION_HC06
#ifndef SICSLOWPAN_CONF_FRAG
#define SICSLOWPAN_CONF_FRAG 1
#define SICSLOWPAN_CONF_MAXAGE 8
#endif /* SICSLOWPAN_CONF_FRAG */
#define SICSLOWPAN_CONF_CONVENTIONAL_MAC 1
#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 2
#else /* WITH_UIP6 */
#define UIP_CONF_IP_FORWARD 1
#define UIP_CONF_BUFFER_SIZE 1300
#endif /* WITH_UIP6 */
#define UIP_CONF_ICMP_DEST_UNREACH 1
#define UIP_CONF_DHCP_LIGHT
#define UIP_CONF_LLH_LEN 0
#define UIP_CONF_RECEIVE_WINDOW 48
#define UIP_CONF_TCP_MSS 48
#define UIP_CONF_MAX_CONNECTIONS 4
#define UIP_CONF_MAX_LISTENPORTS 8
#define UIP_CONF_UDP_CONNS 12
#define UIP_CONF_FWCACHE_SIZE 30
#define UIP_CONF_BROADCAST 1
#define UIP_ARCH_IPCHKSUM 1
#define UIP_CONF_UDP 1
#define UIP_CONF_UDP_CHECKSUMS 1
#define UIP_CONF_PINGADDRCONF 0
#define UIP_CONF_LOGGING 0
#define UIP_CONF_TCP_SPLIT 0
/* include the project config */
/* PROJECT_CONF_H might be defined in the project Makefile */
#ifdef PROJECT_CONF_H
#include PROJECT_CONF_H
#endif /* PROJECT_CONF_H */
#endif /* __CONTIKI_CONF_H__ */

148
platform/econotag/main.c Normal file
View file

@ -0,0 +1,148 @@
/*
* Copyright (c) 2012, Mariano Alvira <mar@devl.org> and other contributors
* to the MC1322x project (http://mc1322x.devl.org) and Contiki.
*
* 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.
*
*/
#include <string.h>
/* debug */
#define DEBUG DEBUG_FULL
#include "net/uip-debug.h"
/* contiki */
#include "contiki.h"
#include "dev/button-sensor.h"
#include "net/rime/rimeaddr.h"
#include "net/netstack.h"
/* mc1322x */
#include "mc1322x.h"
#include "config.h"
#include "contiki-uart.h"
/* econotag */
#include "platform_prints.h"
SENSORS(&button_sensor);
#ifndef M12_CONF_SERIAL
#define M12_SERIAL 0x000000
#else
#define M12_SERIAL M12_CONF_SERIAL
#endif
int main(void) {
mc1322x_init();
/* m12_init() flips the mux switch */
/* trims the main crystal load capacitance */
if (!FORCE_ECONOTAG_I && CRM->SYS_CNTLbits.XTAL32_EXISTS) {
/* M12 based econotag */
PRINTF("trim xtal for M12\n\r");
CRM->XTAL_CNTLbits.XTAL_CTUNE = (M12_CTUNE_4PF << 4) | M12_CTUNE;
CRM->XTAL_CNTLbits.XTAL_FTUNE = M12_FTUNE;
} else {
/* econotag I */
PRINTF("trim xtal for Econotag I\n\r");
CRM->XTAL_CNTLbits.XTAL_CTUNE = (ECONOTAG_CTUNE_4PF << 4) | ECONOTAG_CTUNE;
CRM->XTAL_CNTLbits.XTAL_FTUNE = ECONOTAG_FTUNE;
}
/* create mac address if blank*/
if (mc1322x_config.eui == 0) {
/* mac address is blank */
/* construct a new mac address based on IAB or OUI definitions */
/* if an M12_SERIAL number is not defined */
/* generate a random extension in the Redwire experimental IAB */
/* The Redwire IAB (for development only) is: */
/* OUI: 0x0050C2 IAB: 0xA8C */
/* plus a random 24-bit extension */
/* Otherwise, construct a mac based on the M12_SERIAL */
/* Owners of an Econotag I (not M12 based) can request a serial number from Redwire */
/* to use here */
/* M12 mac is of the form "EC473C4D12000000" */
/* Redwire's OUI: EC473C */
/* M12: 4D12 */
/* next six nibbles are the M12 serial number as hex */
/* e.g. if the barcode reads: "12440021" = BDD1D5 */
/* full mac is EC473C4D12BDD1D5 */
#if (M12_SERIAL == 0)
/* use random mac from experimental range */
mc1322x_config.eui = (0x0050C2A8Cull << 24) | (*MACA_RANDOM & (0xffffff));
#else
/* construct mac from serial number */
mc1322x_config.eui = (0xEC473C4D12ull << 24) | M12_SERIAL;
#endif
mc1322x_config_save(&mc1322x_config);
}
/* configure address on maca hardware and RIME */
contiki_maca_set_mac_address(mc1322x_config.eui);
#if WITH_UIP6
memcpy(&uip_lladdr.addr, &rimeaddr_node_addr.u8, sizeof(uip_lladdr.addr));
queuebuf_init();
NETSTACK_RDC.init();
NETSTACK_MAC.init();
NETSTACK_NETWORK.init();
#if DEBUG_ANNOTATE
print_netstack();
#endif
process_start(&tcpip_process, NULL);
#if DEBUG_ANNOTATE
print_lladdrs();
#endif
#endif /* endif WITH_UIP6 */
process_start(&sensors_process, NULL);
print_processes(autostart_processes);
autostart_start(autostart_processes);
/* Main scheduler loop */
while(1) {
check_maca();
if(uart1_input_handler != NULL) {
if(uart1_can_get()) {
uart1_input_handler(uart1_getc());
}
}
process_run();
}
return 0;
}

View file

@ -0,0 +1,45 @@
/* Temp place to put informational printing that happens a lot in platform code */
/* XXX TODO Factor this out to some place, almost all of the platforms use it */
#include "contiki.h"
#include "net/netstack.h"
#include "net/uip-ds6.h"
void
print_processes(struct process * const processes[])
{
/* const struct process * const * p = processes;*/
printf("Starting");
while(*processes != NULL) {
printf(" '%s'", (*processes)->name);
processes++;
}
printf("\n");
}
void
print_netstack(void) {
printf("%s %s, channel check rate %lu Hz, radio channel %u\n",
NETSTACK_MAC.name, NETSTACK_RDC.name,
CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval() == 0 ? 1:
NETSTACK_RDC.channel_check_interval()),
RF_CHANNEL);
}
void print_lladdrs(void) {
int i, a;
printf("Tentative link-local IPv6 address ");
for(a = 0; a < UIP_DS6_ADDR_NB; a++) {
if (uip_ds6_if.addr_list[a].isused) {
for(i = 0; i < 7; ++i) {
printf("%02x%02x:",
uip_ds6_if.addr_list[a].ipaddr.u8[i * 2],
uip_ds6_if.addr_list[a].ipaddr.u8[i * 2 + 1]);
}
printf("%02x%02x\n",
uip_ds6_if.addr_list[a].ipaddr.u8[14],
uip_ds6_if.addr_list[a].ipaddr.u8[15]);
}
}
}

View file

@ -0,0 +1,3 @@
void print_processes(struct process * const processes[]);
void print_netstack(void);
void print_lladdrs(void);

View file

@ -1,5 +1,16 @@
# -*- makefile -*- # -*- makefile -*-
define nl
endef
ifndef ALLOW_OLD_PLATFORMS
${error $(nl)$(nl)**** This platform is old and will soon be removed **** $(nl)$(nl)\
please use TARGET=econotag instead.$(nl)$(nl) \
(or set ALLOW_OLD_PLATFORMS=1 to proceed)$(nl)$(nl) }
endif
CONTIKI_TARGET_DIRS = . dev apps net CONTIKI_TARGET_DIRS = . dev apps net
CONTIKI_CORE=contiki-mc1322x-main CONTIKI_CORE=contiki-mc1322x-main
CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o

View file

@ -81,6 +81,9 @@
#define SAMP UCON_SAMP_8X #define SAMP UCON_SAMP_8X
//#define SAMP UCON_SAMP_16X //#define SAMP UCON_SAMP_16X
#define CONSOLE_UART UART1
#define CONSOLE_BAUD 115200
//#define uart_init uart1_init //#define uart_init uart1_init
#define dbg_putchar(x) uart1_putc(x) #define dbg_putchar(x) uart1_putc(x)

View file

@ -280,7 +280,7 @@ void oui_to_eui64(rimeaddr_t *eui64, uint32_t oui, uint64_t ext) {
eui64->u8[7] = ext & 0xff; eui64->u8[7] = ext & 0xff;
} }
unsigned short node_id = 0; extern unsigned short node_id;
void void
set_rimeaddr(rimeaddr_t *addr) set_rimeaddr(rimeaddr_t *addr)