From cb1e085ebfe063241beca5b2fad380cc2f0c65c0 Mon Sep 17 00:00:00 2001 From: Ralf Schlatterbeck Date: Sun, 8 May 2016 16:49:54 +0200 Subject: [PATCH] First implementation of cc2520 radio Can write and read memory of radio chip. No communication with merkur-board so far. --- cpu/pico-rv32/Makefile.pico-rv32 | 4 +- cpu/pico-rv32/dev/clock.c | 58 ++++---- cpu/pico-rv32/dev/spi.c | 2 + cpu/pico-rv32/dev/spi.h | 85 +++++++++++ cpu/pico-rv32/irq.c | 138 ++++++++++++++++++ cpu/pico-rv32/irq.h | 67 +++++++++ dev/cc2520/cc2520.c | 6 + examples/osd/ico-wallclock-time/icosoc.cfg | 27 +++- examples/osd/ico-wallclock-time/wallclock.c | 25 +--- .../Makefile.pico-rv32-icoboard | 9 +- platform/pico-rv32-icoboard/cc2520-arch-sfd.c | 62 ++++++++ platform/pico-rv32-icoboard/cc2520-arch-sfd.h | 38 +++++ platform/pico-rv32-icoboard/cc2520-arch.c | 79 ++++++++++ platform/pico-rv32-icoboard/cc2520-arch.h | 96 ++++++++++++ platform/pico-rv32-icoboard/contiki-conf.h | 8 +- platform/pico-rv32-icoboard/contiki-main.c | 5 +- platform/pico-rv32-icoboard/params.h | 2 + 17 files changed, 646 insertions(+), 65 deletions(-) create mode 100644 cpu/pico-rv32/dev/spi.c create mode 100644 cpu/pico-rv32/dev/spi.h create mode 100644 cpu/pico-rv32/irq.c create mode 100644 cpu/pico-rv32/irq.h create mode 100644 platform/pico-rv32-icoboard/cc2520-arch-sfd.c create mode 100644 platform/pico-rv32-icoboard/cc2520-arch-sfd.h create mode 100644 platform/pico-rv32-icoboard/cc2520-arch.c create mode 100644 platform/pico-rv32-icoboard/cc2520-arch.h diff --git a/cpu/pico-rv32/Makefile.pico-rv32 b/cpu/pico-rv32/Makefile.pico-rv32 index 0f20936e5..1a27dd79a 100644 --- a/cpu/pico-rv32/Makefile.pico-rv32 +++ b/cpu/pico-rv32/Makefile.pico-rv32 @@ -3,7 +3,7 @@ CONTIKI_CPU_DIRS = . dev ### Define the CPU directory of the AVR port CONTIKI_CPU=$(CONTIKI)/cpu/pico-rv32 -PICORV32_SOURCES = mtarch.c rtimer-arch.c clock.c watchdog.c +PICORV32_SOURCES = mtarch.c rtimer-arch.c clock.c watchdog.c irq.c spi.c CONTIKI_TARGET_SOURCEFILES += $(PICORV32_SOURCES) $(SENSORS) $(SYSAPPS) \ nullsec.c @@ -24,7 +24,7 @@ CFLAGSWERROR=-Werror endif CFLAGSNO = -Wall -march=RV32IXcustom -g \ -I$(CONTIKI)/platform/$(TARGET) \ - -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) + -I. -I$(CONTIKI_CPU) -I$(CONTIKI)/core -fno-strict-aliasing CFLAGS += $(CFLAGSNO) -Os ifeq ($(HOST_OS),Darwin) diff --git a/cpu/pico-rv32/dev/clock.c b/cpu/pico-rv32/dev/clock.c index af4374710..d161dc1cd 100644 --- a/cpu/pico-rv32/dev/clock.c +++ b/cpu/pico-rv32/dev/clock.c @@ -69,15 +69,26 @@ #include "sys/etimer.h" #include "icosoc.h" -#include // FIXME +#include // 1/128 second ticks #define CLOCK_TIMER_PERIOD (F_CPU >> 7) -static volatile clock_time_t count; unsigned long offset; -void irq_handler(uint32_t irq_mask, uint32_t *regs); +/** \brief irq handler + * for running interrupts every 1/128 second. + */ + +void +clock_irq_handler (void) +{ + // FIXME: Want to call rtimer_run_next(); + icosoc_timer(CLOCK_TIMER_PERIOD); + if(etimer_pending()) { + etimer_request_poll(); + } +} /*---------------------------------------------------------------------------*/ /** @@ -86,8 +97,8 @@ void irq_handler(uint32_t irq_mask, uint32_t *regs); void clock_init(void) { - icosoc_irq(irq_handler); - icosoc_maskirq(0); + register_irq (TIMER_IRQ, clock_irq_handler); + enable_irq (TIMER_IRQ); icosoc_timer(CLOCK_TIMER_PERIOD); } /*---------------------------------------------------------------------------*/ @@ -98,7 +109,7 @@ clock_init(void) clock_time_t clock_time(void) { - uint32_t low, high; + volatile uint32_t low, high; asm ("1: rdcycleh %1\n" "rdcycle %0\n" "rdcycleh t0\n" @@ -145,6 +156,17 @@ clock_delay_usec(uint16_t dt) clock_wait (CLOCK_SECOND * dt / 1000000ULL); } /*---------------------------------------------------------------------------*/ +/** + * Legacy delay. The original clock_delay for the msp430 used a granularity + * of 2.83 usec. This approximates that delay for values up to 1456 usec. + * (The largest core call in leds.c uses 400). + */ +void +clock_delay(unsigned int howlong) +{ + clock_delay_usec((45*howlong)>>4); +} +/*---------------------------------------------------------------------------*/ /** * Adjust the system current clock time. * \param howmany How many ticks to add @@ -158,29 +180,5 @@ clock_adjust_ticks(clock_time_t howmany) { } -/** \brief irq handler - * for running interrupts every 1/128 second. - */ - -void -irq_handler(uint32_t irq_mask, uint32_t *regs) -{ - // timer interrupt - if (irq_mask & 1) { - // FIXME: Want to call rtimer_run_next(); - icosoc_timer(CLOCK_TIMER_PERIOD); - if(etimer_pending()) { - etimer_request_poll(); - } - } - // SBREAK, ILLINS or BUSERROR - if (irq_mask & 4) { - printf("Bus Error!\n"); - } - // Can we distinguish ILLINS and SBREAK? - if (irq_mask & 2) { - icosoc_sbreak(); - } -} /** @} */ /** @} */ diff --git a/cpu/pico-rv32/dev/spi.c b/cpu/pico-rv32/dev/spi.c new file mode 100644 index 000000000..0d7796c4c --- /dev/null +++ b/cpu/pico-rv32/dev/spi.c @@ -0,0 +1,2 @@ +#include "spi.h" +uint8_t spi_rxbuf = 0; diff --git a/cpu/pico-rv32/dev/spi.h b/cpu/pico-rv32/dev/spi.h new file mode 100644 index 000000000..31f13fc21 --- /dev/null +++ b/cpu/pico-rv32/dev/spi.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2016, Dr. Ralf Schlatterbeck Open Source Consulting + * 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. + * + */ +/** + * \brief This module contains PicoRV32-specific code to implement + * SPI routines + * + * \author Ralf Schlatterbeck . + * + */ +/** \addtogroup picorv32 + * @{ + */ +/** + * \file + * SPI macros + * + */ + +#ifndef SPI_H_ +#define SPI_H_ + +#include "icosoc.h" + +#define SPI_RXBUF spi_rxbuf + +extern uint8_t spi_rxbuf; + +/* Write one character to SPI */ +#define SPI_WRITE(data) (spi_rxbuf = icosoc_cc2520_spi_xfer(data)) +/* Currently no fast writing without waiting for transmission to + * terminate + */ +#define SPI_WRITE_FAST(data) SPI_WRITE(data) + +/* Read one character from SPI */ +#define SPI_READ(data) (data = spi_rxbuf = icosoc_cc2520_spi_xfer(0)) + +/* No async operation, therefore no flush */ +#define SPI_FLUSH() + +#define SPI_WAITFORTx_BEFORE() +#define SPI_WAITFORTx_AFTER() SPI_WAITFOREOTx() +#define SPI_WAITFORTx_ENDED() +#define SPI_WAITFORTxREADY() + +#define BV(x) (1<. + * + */ +/** \addtogroup picorv32 + * @{ + */ +/** + * \defgroup picorv32 irq implementation + * @{ + */ +/** + * \file + * This file contains PicoRV32-specific code to implement + * Interrupt handling for Timer and other interrupts + * + */ +#include "irq.h" +#include +#include + +/* Initially allow bus-error and illegal instruction / sbreak */ +static uint32_t irqmask = ~0x6; + +/* Interrupt table, for convenience we waste some memory for the lower 3 + * callbacks + */ +static void (*irq_callback_functions [MAXIRQ + 1])(void); + +/** \brief irq handler + */ + +void +irq_handler(uint32_t irq_mask, uint32_t *regs) +{ + // Other interrupts + if (irq_mask & (((1 << (MAXIRQ + 2)) - 1) & ~0x6)) { + int i; + for (i=0; i<=MAXIRQ; i++) { + if (irq_mask & (1<0) { + printf ("irq: %d\n", i); + } + if (irq_callback_functions [i] == NULL) { + printf ("Ooops: IRQ without callback: %d\n", i); + } else { + irq_callback_functions [i] (); + } + } + } + } + // SBREAK, ILLINS or BUSERROR + if (irq_mask & 6) { + if (irq_mask & 4) { + if (irq_callback_functions [2]) { + irq_callback_functions [2] (); + } else { + printf("Bus Error!\n"); + icosoc_sbreak(); + } + } + if (irq_mask & 2) { + if (irq_callback_functions [1]) { + irq_callback_functions [1] (); + } else { + printf("Illegal Instruction or SBREAK!\n"); + icosoc_sbreak(); + } + } + } +} + +void irq_init(void) +{ + icosoc_irq(irq_handler); + icosoc_maskirq(irqmask); +} + +void register_irq (int irq, void (*callback)(void)) +{ + printf ("register: %d\n", irq); + assert (irq <= MAXIRQ); + irq_callback_functions [irq] = callback; +} + +void enable_irq (int irq) +{ + printf ("enable: %d\n", irq); + assert (irq <= MAXIRQ); + if (irq_callback_functions [irq] != NULL) { + irqmask &= (~(1<. + * + */ +/** \addtogroup picorv32 + * @{ + */ +/** + * \file + * Interrupt handling for Timer and other interrupts + * + */ + +#ifndef IRQ_H_ +#define IRQ_H_ + +#include "icosoc.h" + +/* Want to set this higher if we have more than two external interrupts + * See used interrupts in icosoc.cfg. Don't set lower than 2 (2 is the + * bus-error interrupt) + */ +#define MAXIRQ 4 +#define TIMER_IRQ 0 + +void irq_init (void); +void register_irq (int irq, void (*callback)(void)); +void enable_irq (int irq); +void disable_irq (int irq); + +#endif /* IRQ_H_ */ + +/** @} */ diff --git a/dev/cc2520/cc2520.c b/dev/cc2520/cc2520.c index 37f5f128e..581fb7ba0 100644 --- a/dev/cc2520/cc2520.c +++ b/dev/cc2520/cc2520.c @@ -342,6 +342,12 @@ cc2520_init(void) setreg(CC2520_TXCTRL, 0x94); setreg(CC2520_TXPOWER, 0x13); // Output power 1 dBm + /* write test data to memory */ + setreg(0x200, 0x47); + setreg(0x201, 0x11); + printf ("getreg: %x\n", getreg(0x200)); + printf ("getreg: %x\n", getreg(0x201)); + /* valeurs de TXPOWER diff --git a/examples/osd/ico-wallclock-time/icosoc.cfg b/examples/osd/ico-wallclock-time/icosoc.cfg index f3c0ac274..93fad168d 100644 --- a/examples/osd/ico-wallclock-time/icosoc.cfg +++ b/examples/osd/ico-wallclock-time/icosoc.cfg @@ -1,5 +1,3 @@ -# hello world example - # enable compressed ISA support compressed_isa @@ -11,8 +9,27 @@ mod rs232 ser0 connect rx pmod3_3 connect tx pmod3_2 -# Digilent Pmod8LD in PMOD1 and PMOD2 -mod gpio leds +# Texas cc2520 RF module connected via SPI +mod spi cc2520_spi address 2 - connect IO pmod2 pmod1 + connect CS pmod1_1 + connect miso pmod1_3 + connect mosi pmod1_2 + connect sclk pmod1_4 +mod extirq cc2520_fifop + address 3 + interrupt 3 + connect pin pmod1_7 + +# pmod1_9 sfd +mod extirq cc2520_sfd + address 4 + interrupt 4 + connect pin pmod1_9 + +# pmod1_8 Reset: *Output* +# pmod1_10 cca +mod gpio cc2520_io + address 5 + connect IO pmod1_10 pmod1_8 diff --git a/examples/osd/ico-wallclock-time/wallclock.c b/examples/osd/ico-wallclock-time/wallclock.c index 9c63bf65a..56ed32b56 100644 --- a/examples/osd/ico-wallclock-time/wallclock.c +++ b/examples/osd/ico-wallclock-time/wallclock.c @@ -41,6 +41,7 @@ #include #include #include "contiki.h" +#include "params.h" #include "contiki-net.h" //FIXME#include "er-coap-engine.h" //FIXME#include "xtime.h" @@ -49,7 +50,7 @@ //FIXME#include "jsonparse.h" #include "icosoc.h" -#define DEBUG 0 +#define DEBUG 1 #if DEBUG #include #define PRINTF(...) printf(__VA_ARGS__) @@ -64,8 +65,8 @@ void hw_init () { - icosoc_leds_dir (0xFFFF); - icosoc_leds_set (0); + //icosoc_leds_dir (0xFFFF); + //icosoc_leds_set (0); } PROCESS (wallclock, "Wallclock Example Server"); @@ -81,28 +82,18 @@ AUTOSTART_PROCESSES(&wallclock); */ void led_set (void *onoff) { - int status = (int)onoff; - icosoc_leds_set (0xFF * status); + //int status = (int)onoff; + //icosoc_leds_set (0xFF * status); } -#if 0 -/* long long printing not working */ -void test_print (void) -{ - clock_time_t big = 0x1234567890098765LL; - printf ("Test: %016llx\n", big); - printf ("Test: %08lx%08lx\n", (uint32_t)(big>>32), (uint32_t)big); -} -#endif - PROCESS_THREAD(wallclock, ev, data) { static struct etimer loop_periodic_timer; PROCESS_BEGIN(); PRINTF("Starting Wallclock Example\n"); -#ifdef RF_CHANNEL - PRINTF("RF channel: %u\n", RF_CHANNEL); +#ifdef CHANNEL_802_15_4 + PRINTF("RF channel: %u\n", CHANNEL_802_15_4); #endif #ifdef IEEE802154_PANID PRINTF("PAN ID: 0x%04X\n", IEEE802154_PANID); diff --git a/platform/pico-rv32-icoboard/Makefile.pico-rv32-icoboard b/platform/pico-rv32-icoboard/Makefile.pico-rv32-icoboard index 2ff262d9f..68a56b3c5 100644 --- a/platform/pico-rv32-icoboard/Makefile.pico-rv32-icoboard +++ b/platform/pico-rv32-icoboard/Makefile.pico-rv32-icoboard @@ -1,8 +1,9 @@ -CONTIKI_TARGET_DIRS = . apps net loader +CONTIKI_TARGET_DIRS = . dev apps net CONTIKI_CORE=contiki-main CONTIKI_TARGET_MAIN = ${CONTIKI_CORE}.o -CONTIKI_TARGET_SOURCEFILES += contiki-main.c params.c +CONTIKI_TARGET_SOURCEFILES += contiki-main.c params.c \ + cc2520.c cc2520-arch.c cc2520-arch-sfd.c CONTIKIPICORV32=$(CONTIKI)/cpu/pico-rv32 CONTIKIBOARD=. @@ -12,5 +13,5 @@ CONTIKI_PLAT_DEFS = -DAUTO_CRC_PADDING=2 MCU=pico-rv32 include $(CONTIKIPICORV32)/Makefile.pico-rv32 -#include $(CONTIKIPICORV32)/radio/Makefile.radio -MODULES += core/net/mac core/net core/net/mac/sicslowmac core/net/mac/contikimac +MODULES += core/net/mac core/net core/net/mac/sicslowmac \ + core/net/mac/contikimac dev/cc2520 diff --git a/platform/pico-rv32-icoboard/cc2520-arch-sfd.c b/platform/pico-rv32-icoboard/cc2520-arch-sfd.c new file mode 100644 index 000000000..4302a0887 --- /dev/null +++ b/platform/pico-rv32-icoboard/cc2520-arch-sfd.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2011, Swedish Institute of Computer Science + * 2016, Dr. Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +#include "contiki.h" +#include "dev/spi.h" +#include "dev/cc2520/cc2520.h" +#include "irq.h" + +extern volatile uint8_t cc2520_sfd_counter; +extern volatile uint16_t cc2520_sfd_start_time; +extern volatile uint16_t cc2520_sfd_end_time; + +/*---------------------------------------------------------------------------*/ +/* SFD interrupt for timestamping radio packets */ +void cc2520_timerb1_interrupt (void) +{ + ENERGEST_ON(ENERGEST_TYPE_IRQ); + /* This timer needs 32768 ticks per second */ + if(CC2520_SFD_IS_1) { + cc2520_sfd_counter++; + cc2520_sfd_start_time = (uint16_t)(clock_time() * 32768 / F_CPU); + } else { + cc2520_sfd_counter = 0; + cc2520_sfd_end_time = (uint16_t)(clock_time() * 32768 / F_CPU); + } + ENERGEST_OFF(ENERGEST_TYPE_IRQ); +} +/*---------------------------------------------------------------------------*/ +void +cc2520_arch_sfd_init(void) +{ + register_irq (4, cc2520_arch_sfd_init); + enable_irq (4); +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/pico-rv32-icoboard/cc2520-arch-sfd.h b/platform/pico-rv32-icoboard/cc2520-arch-sfd.h new file mode 100644 index 000000000..ce6257ab2 --- /dev/null +++ b/platform/pico-rv32-icoboard/cc2520-arch-sfd.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2011, 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. + */ +#ifndef CC2520_ARCH_SFD_H +#define CC2520_ARCH_SFD_H + +extern volatile uint8_t cc2520_arch_sfd_counter; +extern volatile uint16_t cc2520_arch_sfd_start_time; +extern volatile uint16_t cc2520_arch_sfd_end_time; + +void cc2520_arch_sfd_init(void); + +#endif /* CC2520_ARCH_SFD_H */ diff --git a/platform/pico-rv32-icoboard/cc2520-arch.c b/platform/pico-rv32-icoboard/cc2520-arch.c new file mode 100644 index 000000000..949671d38 --- /dev/null +++ b/platform/pico-rv32-icoboard/cc2520-arch.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2011, Swedish Institute of Computer Science + * 2016, Dr. Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +#include "contiki.h" +#include "contiki-net.h" + +#include "icosoc.h" +#include "cc2520-arch.h" +#include "dev/cc2520/cc2520.h" + +#ifdef CC2520_CONF_SFD_TIMESTAMPS +#define CONF_SFD_TIMESTAMPS CC2520_CONF_SFD_TIMESTAMPS +#endif /* CC2520_CONF_SFD_TIMESTAMPS */ + +#ifndef CONF_SFD_TIMESTAMPS +#define CONF_SFD_TIMESTAMPS 0 +#endif /* CONF_SFD_TIMESTAMPS */ + +#ifdef CONF_SFD_TIMESTAMPS +#include "cc2520-arch-sfd.h" +#endif + +/*---------------------------------------------------------------------------*/ +void icosoc_cc2520_fifop_irq (void) +{ + ENERGEST_ON(ENERGEST_TYPE_IRQ); + + cc2520_interrupt(); + + ENERGEST_OFF(ENERGEST_TYPE_IRQ); +} +/*---------------------------------------------------------------------------*/ +void +cc2520_arch_init(void) +{ + // All inputs except for RESET pin which is an output + icosoc_cc2520_io_dir (BV(CC2520_RESET_SHIFT)); + + // Prescaler set to F_CPU / 4MHz will result in <= 4MHz + // rate, chip should perform up to 8MHz) + icosoc_cc2520_spi_prescale (F_CPU / 4000000); + + // SPI mode cpol, cpha + icosoc_cc2520_spi_mode (0, 0); + +#if CONF_SFD_TIMESTAMPS + cc2520_arch_sfd_init(); +#endif + + CC2520_SPI_DISABLE(); /* Unselect radio. */ +} +/*---------------------------------------------------------------------------*/ diff --git a/platform/pico-rv32-icoboard/cc2520-arch.h b/platform/pico-rv32-icoboard/cc2520-arch.h new file mode 100644 index 000000000..8eaa85b0b --- /dev/null +++ b/platform/pico-rv32-icoboard/cc2520-arch.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2016, Dr. Ralf Schlatterbeck Open Source Consulting + * 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. + */ + +/** + * \file + * Platform configuration for the pico-rv32-icoboard + * Definitions for the radio hardware access + */ + +#ifndef RADIO_CONF_H_ +#define RADIO_CONF_H_ + +#include "icosoc.h" + +extern void icosoc_cc2520_fifop_irq (void); + +/* the low-level radio driver */ +#define NETSTACK_CONF_RADIO cc2520_driver + +/* + * SPI bus - CC2520 pin configuration. + */ + +// Two instructions loop at F_CPU for 326us +#define CC2520_CONF_SYMBOL_LOOP_COUNT (F_CPU / (3067 * 2)) + +#define CC2520_RESET_SHIFT 0 +#define CC2520_CCA_SHIFT 1 + +/* Pin status.CC2520 */ +#define CC2520_FIFOP_IS_1 (!!(icosoc_cc2520_fifop_read())) +#define CC2520_SFD_IS_1 (!!(icosoc_cc2520_sfd_read())) +#define CC2520_CCA_IS_1 (!!(icosoc_cc2520_io_get() & (1< #include "params.h" -//#include "radio/rf230bb/rf230bb.h" #include "net/mac/frame802154.h" #include "net/mac/framer-802154.h" #include "net/ipv6/sicslowpan.h" @@ -114,6 +113,7 @@ uint16_t *p=&__bss_end; } while (p