Contiki-NG
Loading...
Searching...
No Matches
platform.c
1/*
2 * Copyright (c) 2006, Swedish Institute of Computer Science
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the Institute nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31#include <stdio.h>
32#include <string.h>
33#include "contiki.h"
34#include "sys/energest.h"
35#include "dev/button-sensor.h"
37#include "dev/etc/ds2411/ds2411.h"
38#include "dev/leds.h"
39#include "dev/serial-line.h"
40#include "dev/slip.h"
41#include "dev/uart1.h"
42#include "dev/watchdog.h"
43#include "dev/xmem.h"
44#include "lib/random.h"
45#include "net/netstack.h"
47#include "net/mac/tsch/tsch.h"
48
49#if NETSTACK_CONF_WITH_IPV6
50#include "net/ipv6/uip-ds6.h"
51#endif /* NETSTACK_CONF_WITH_IPV6 */
52
53#include "sys/node-id.h"
54#include "cfs-coffee-arch.h"
55#include "cfs/cfs-coffee.h"
56
57#if DCOSYNCH_CONF_ENABLED
58static struct timer mgt_timer;
59#endif
60extern int msp430_dco_required;
61
62#define UIP_OVER_MESH_CHANNEL 8
63
64#ifdef EXPERIMENT_SETUP
65#include "experiment-setup.h"
66#endif
67
68SENSORS(&button_sensor);
69
70/*---------------------------------------------------------------------------*/
71/* Log configuration */
72#include "sys/log.h"
73#define LOG_MODULE "Sky"
74#define LOG_LEVEL LOG_LEVEL_MAIN
75/*---------------------------------------------------------------------------*/
76#if 0
77int
78force_float_inclusion()
79{
80 extern int __fixsfsi;
81 extern int __floatsisf;
82 extern int __mulsf3;
83 extern int __subsf3;
84
85 return __fixsfsi + __floatsisf + __mulsf3 + __subsf3;
86}
87#endif
88/*---------------------------------------------------------------------------*/
89void uip_log(char *msg) { puts(msg); }
90
91/*---------------------------------------------------------------------------*/
92#if 0
93void
94force_inclusion(int d1, int d2)
95{
96 snprintf(NULL, 0, "%d", d1 % d2);
97}
98#endif
99/*---------------------------------------------------------------------------*/
100static void
101set_lladdr(void)
102{
103 linkaddr_t addr;
104
105 memset(&addr, 0, sizeof(linkaddr_t));
106#if NETSTACK_CONF_WITH_IPV6
107 memcpy(addr.u8, ds2411_id, sizeof(addr.u8));
108#else
109 int i;
110 for(i = 0; i < sizeof(linkaddr_t); ++i) {
111 addr.u8[i] = ds2411_id[7 - i];
112 }
113#endif
115}
116/*---------------------------------------------------------------------------*/
117void
119{
120 /*
121 * Initalize hardware.
122 */
123 msp430_cpu_init();
124
125 leds_init();
126 leds_on(LEDS_RED);
127}
128/*---------------------------------------------------------------------------*/
129void
131{
132 uart1_init(BAUD2UBR(115200)); /* Must come before first printf */
133
134 leds_on(LEDS_GREEN);
135 ds2411_init();
136
137 /* XXX hack: Fix it so that the 802.15.4 MAC address is compatible
138 with an Ethernet MAC address - byte 0 (byte 2 in the DS ID)
139 cannot be odd. */
140 ds2411_id[2] &= 0xfe;
141
142 leds_on(LEDS_BLUE);
143 xmem_init();
144
145 leds_off(LEDS_RED);
146 /*
147 * Hardware initialization done!
148 */
149
150 random_init(ds2411_id[0]);
151
152 leds_off(LEDS_BLUE);
153
154 set_lladdr();
155
156 /*
157 * main() will turn the radio on inside netstack_init(). The CC2420
158 * must already be initialised by that time, so we do this here early.
159 * Later on in stage three we set correct values for PANID and radio
160 * short/long address.
161 */
162 cc2420_init();
163}
164/*---------------------------------------------------------------------------*/
165void
167{
168 uint8_t longaddr[8];
169 uint16_t shortaddr;
170
171 process_start(&sensors_process, NULL);
172
173 shortaddr = (linkaddr_node_addr.u8[0] << 8) + linkaddr_node_addr.u8[1];
174 memset(longaddr, 0, sizeof(longaddr));
175 linkaddr_copy((linkaddr_t *)&longaddr, &linkaddr_node_addr);
176
177 cc2420_set_pan_addr(IEEE802154_PANID, shortaddr, longaddr);
178
179 LOG_INFO("CC2420 CCA threshold %i\n", CC2420_CONF_CCA_THRESH);
180
181#if !NETSTACK_CONF_WITH_IPV6
182 uart1_set_input(serial_line_input_byte);
183 serial_line_init();
184#endif
185
186 leds_off(LEDS_GREEN);
187
188#if TIMESYNCH_CONF_ENABLED
189 timesynch_init();
190 timesynch_set_authority_level((linkaddr_node_addr.u8[0] << 4) + 16);
191#endif /* TIMESYNCH_CONF_ENABLED */
192
193 /*
194 * This is the scheduler loop.
195 */
196#if DCOSYNCH_CONF_ENABLED
197 timer_set(&mgt_timer, DCOSYNCH_PERIOD * CLOCK_SECOND);
198#endif
199}
200/*---------------------------------------------------------------------------*/
201void
203{
204 /*
205 * Idle processing.
206 */
207 int s = splhigh(); /* Disable interrupts. */
208 /* uart1_active is for avoiding LPM3 when still sending or receiving */
209 if(process_nevents() != 0 || uart1_active()) {
210 splx(s); /* Re-enable interrupts. */
211 } else {
212#if DCOSYNCH_CONF_ENABLED
213 /* before going down to sleep possibly do some management */
214 if(timer_expired(&mgt_timer)) {
216 timer_reset(&mgt_timer);
217 msp430_sync_dco();
218#if CC2420_CONF_SFD_TIMESTAMPS
219 cc2420_arch_sfd_init();
220#endif /* CC2420_CONF_SFD_TIMESTAMPS */
221 }
222#endif
223
224 /* Re-enable interrupts and go to sleep atomically. */
225 ENERGEST_SWITCH(ENERGEST_TYPE_CPU, ENERGEST_TYPE_LPM);
227 /* check if the DCO needs to be on - if so - only LPM 1 */
228 if (msp430_dco_required) {
229 _BIS_SR(GIE | CPUOFF); /* LPM1 sleep for DMA to work!. */
230 } else {
231 _BIS_SR(GIE | SCG0 | SCG1 | CPUOFF); /* LPM3 sleep. This
232 statement will block
233 until the CPU is
234 woken up by an
235 interrupt that sets
236 the wake up flag. */
237 }
239 ENERGEST_SWITCH(ENERGEST_TYPE_LPM, ENERGEST_TYPE_CPU);
240 }
241}
CC2420 driver header file.
Header for the Coffee file system.
Header file for the energy estimation mechanism.
802.15.4 frame creation and parsing functions
void random_init(unsigned short seed)
Seed the cc2538 random number generator.
Definition random.c:84
void watchdog_start(void)
Starts the WDT in watchdog mode if enabled by user configuration, maximum interval.
Definition watchdog.c:72
void watchdog_periodic(void)
Writes the WDT clear sequence.
Definition watchdog.c:85
void platform_init_stage_three()
Final stage of platform driver initialisation.
Definition platform.c:169
void platform_init_stage_one(void)
Basic (Stage 1) platform driver initialisation.
Definition platform.c:114
void platform_idle()
The platform's idle/sleep function.
Definition platform.c:185
void platform_init_stage_two()
Stage 2 of platform driver initialisation.
Definition platform.c:123
void watchdog_stop(void)
Stops the WDT such that it won't timeout and cause MCU reset.
#define CLOCK_SECOND
A second, measured in system clock time.
Definition clock.h:103
void leds_init(void)
Initialise the LED HAL.
Definition minileds.c:44
linkaddr_t linkaddr_node_addr
The link-layer address of the node.
Definition linkaddr.c:48
void linkaddr_copy(linkaddr_t *dest, const linkaddr_t *src)
Copy a link-layer address.
Definition linkaddr.c:63
static void linkaddr_set_node_addr(linkaddr_t *addr)
Set the address of the current node.
Definition linkaddr.h:124
void uip_log(char *m)
Print out a uIP log message.
Definition platform.c:338
void process_start(struct process *p, process_data_t data)
Start a process.
Definition process.c:121
process_num_events_t process_nevents(void)
Number of events waiting to be processed.
Definition process.c:319
void timer_set(struct timer *t, clock_time_t interval)
Set a timer.
Definition timer.c:64
bool timer_expired(struct timer *t)
Check if a timer has expired.
Definition timer.c:123
void timer_reset(struct timer *t)
Reset the timer with the same interval.
Definition timer.c:84
void xmem_init(void)
Initialize the external memory.
Definition xmem.c:59
Header file for the LED HAL.
Header file for the logging system.
Include file for the Contiki low-layer network stack (NETSTACK)
Node-id (simple 16-bit identifiers) handling.
Coffee architecture-dependent header for the Tmote Sky platform.
Generic serial I/O process header filer.
A timer.
Definition timer.h:84
Main API declarations for TSCH.
A brief description of what this file is.
void uart1_init(unsigned long ubr)
Initalize the RS232 port.
Definition uart1.c:142
Header file for IPv6-related data structures.
static uip_ds6_addr_t * addr
Pointer to a nbr cache entry.
Definition uip-nd6.c:107
Header file to the external flash memory (XMem) API.