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 <stdarg.h>
34
35#include "contiki.h"
36#include "dev/button-sensor.h"
38#include "dev/leds.h"
39#include "dev/serial-line.h"
40#include "dev/slip.h"
41#include "dev/uart0.h"
42#include "dev/watchdog.h"
43#include "dev/xmem.h"
44#include "lib/random.h"
45#include "net/netstack.h"
47#include "dev/adxl345.h"
48#include "sys/clock.h"
49#include "sys/energest.h"
50
51#if NETSTACK_CONF_WITH_IPV6
52#include "net/ipv6/uip-ds6.h"
53#endif /* NETSTACK_CONF_WITH_IPV6 */
54
55#include "node-id-z1.h"
56#include "cfs-coffee-arch.h"
57#include "cfs/cfs-coffee.h"
58
59extern unsigned char node_mac[8];
60
61#if DCOSYNCH_CONF_ENABLED
62static struct timer mgt_timer;
63#endif
64extern int msp430_dco_required;
65
66#define UIP_OVER_MESH_CHANNEL 8
67#if NETSTACK_CONF_WITH_IPV4
68static uint8_t is_gateway;
69#endif /* NETSTACK_CONF_WITH_IPV4 */
70
71#ifdef EXPERIMENT_SETUP
72#include "experiment-setup.h"
73#endif
74
75/*---------------------------------------------------------------------------*/
76/* Log configuration */
77#include "sys/log.h"
78#define LOG_MODULE "Z1"
79#define LOG_LEVEL LOG_LEVEL_MAIN
80/*---------------------------------------------------------------------------*/
81#ifdef UART0_CONF_BAUD_RATE
82#define UART0_BAUD_RATE UART0_CONF_BAUD_RATE
83#else
84#define UART0_BAUD_RATE 115200
85#endif
86/*---------------------------------------------------------------------------*/
87#if 0
88int
89force_float_inclusion()
90{
91 extern int __fixsfsi;
92 extern int __floatsisf;
93 extern int __mulsf3;
94 extern int __subsf3;
95
96 return __fixsfsi + __floatsisf + __mulsf3 + __subsf3;
97}
98#endif
99/*---------------------------------------------------------------------------*/
100#if 0
101void
102force_inclusion(int d1, int d2)
103{
104 snprintf(NULL, 0, "%d", d1 % d2);
105}
106#endif
107/*---------------------------------------------------------------------------*/
108static void
109set_lladdr(void)
110{
111 linkaddr_t addr;
112
113 memset(&addr, 0, sizeof(linkaddr_t));
114#if NETSTACK_CONF_WITH_IPV6
115 memcpy(addr.u8, node_mac, sizeof(addr.u8));
116#else
117 if(node_id == 0) {
118 int i;
119 for(i = 0; i < sizeof(linkaddr_t); ++i) {
120 addr.u8[i] = node_mac[7 - i];
121 }
122 } else {
123 addr.u8[0] = node_id & 0xff;
124 addr.u8[1] = node_id >> 8;
125 }
126#endif
128}
129/*---------------------------------------------------------------------------*/
130void
132{
133 /*
134 * Initalize hardware.
135 */
136 msp430_cpu_init();
137
138 leds_init();
139 leds_on(LEDS_RED);
140}
141/*---------------------------------------------------------------------------*/
142void
144{
145 clock_wait(100);
146
147 uart0_init(BAUD2UBR(UART0_BAUD_RATE)); /* Must come before first printf */
148
149 xmem_init();
150
151 leds_off(LEDS_RED);
152 /*
153 * Hardware initialization done!
154 */
155
156 /* Restore node id if such has been stored in external mem */
157 node_id_z1_restore();
158
159 /* If no MAC address was burned, we use the node id or the Z1 product ID */
160 if(!(node_mac[0] | node_mac[1] | node_mac[2] | node_mac[3] |
161 node_mac[4] | node_mac[5] | node_mac[6] | node_mac[7])) {
162
163#ifdef SERIALNUM
164 if(!node_id) {
165 LOG_INFO("Node id is not set, using Z1 product ID\n");
166 node_id = SERIALNUM;
167 }
168#endif
169 node_mac[0] = 0xc1; /* Hardcoded for Z1 */
170 node_mac[1] = 0x0c; /* Hardcoded for Revision C */
171 node_mac[2] = 0x00; /* Hardcoded to arbitrary even number so that
172 the 802.15.4 MAC address is compatible with
173 an Ethernet MAC address - byte 0 (byte 2 in
174 the DS ID) */
175 node_mac[3] = 0x00; /* Hardcoded */
176 node_mac[4] = 0x00; /* Hardcoded */
177 node_mac[5] = 0x00; /* Hardcoded */
178 node_mac[6] = node_id >> 8;
179 node_mac[7] = node_id & 0xff;
180 }
181
182 /* Overwrite node MAC if desired at compile time */
183#ifdef MACID
184#warning "***** CHANGING DEFAULT MAC *****"
185 node_mac[0] = 0xc1; /* Hardcoded for Z1 */
186 node_mac[1] = 0x0c; /* Hardcoded for Revision C */
187 node_mac[2] = 0x00; /* Hardcoded to arbitrary even number so that
188 the 802.15.4 MAC address is compatible with
189 an Ethernet MAC address - byte 0 (byte 2 in
190 the DS ID) */
191 node_mac[3] = 0x00; /* Hardcoded */
192 node_mac[4] = 0x00; /* Hardcoded */
193 node_mac[5] = 0x00; /* Hardcoded */
194 node_mac[6] = MACID >> 8;
195 node_mac[7] = MACID & 0xff;
196#endif
197
198#ifdef IEEE_802154_MAC_ADDRESS
199 /* for setting "hardcoded" IEEE 802.15.4 MAC addresses */
200 {
201 uint8_t ieee[] = IEEE_802154_MAC_ADDRESS;
202 memcpy(node_mac, ieee, sizeof(uip_lladdr.addr));
203 node_mac[7] = node_id & 0xff;
204 }
205#endif /* IEEE_802154_MAC_ADDRESS */
206
207 random_init(node_mac[6] + node_mac[7]);
208
209 set_lladdr();
210
211 /*
212 * main() will turn the radio on inside netstack_init(). The CC2420
213 * must already be initialised by that time, so we do this here early.
214 * Later on in stage three we set correct values for PANID and radio
215 * short/long address.
216 */
217 cc2420_init();
218
219 SENSORS_ACTIVATE(adxl345);
220
221 leds_off(LEDS_ALL);
222}
223/*---------------------------------------------------------------------------*/
224void
226{
227 uint8_t longaddr[8];
228 uint16_t shortaddr;
229
230 process_start(&sensors_process, NULL);
231
232 shortaddr = (linkaddr_node_addr.u8[0] << 8) + linkaddr_node_addr.u8[1];
233 memset(longaddr, 0, sizeof(longaddr));
234 linkaddr_copy((linkaddr_t *)&longaddr, &linkaddr_node_addr);
235
236 cc2420_set_pan_addr(IEEE802154_PANID, shortaddr, longaddr);
237
238 LOG_INFO("CC2420 CCA threshold %i\n", CC2420_CONF_CCA_THRESH);
239
240#if DCOSYNCH_CONF_ENABLED
241 timer_set(&mgt_timer, DCOSYNCH_PERIOD * CLOCK_SECOND);
242#endif
243}
244/*---------------------------------------------------------------------------*/
245void
247{
248 /*
249 * Idle processing.
250 */
251 int s = splhigh(); /* Disable interrupts. */
252 /* uart0_active is for avoiding LPM3 when still sending or receiving */
253 if(process_nevents() != 0 || uart0_active()) {
254 splx(s); /* Re-enable interrupts. */
255 } else {
256#if DCOSYNCH_CONF_ENABLED
257 /* before going down to sleep possibly do some management */
258 if(timer_expired(&mgt_timer)) {
260 timer_reset(&mgt_timer);
261 msp430_sync_dco();
262#if CC2420_CONF_SFD_TIMESTAMPS
263 cc2420_arch_sfd_init();
264#endif /* CC2420_CONF_SFD_TIMESTAMPS */
265 }
266#endif
267
268 /* Re-enable interrupts and go to sleep atomically. */
269 ENERGEST_SWITCH(ENERGEST_TYPE_CPU, ENERGEST_TYPE_LPM);
271 /* check if the DCO needs to be on - if so - only LPM 1 */
272 if (msp430_dco_required) {
273 _BIS_SR(GIE | CPUOFF); /* LPM1 sleep for DMA to work!. */
274 } else {
275 _BIS_SR(GIE | SCG0 | SCG1 | CPUOFF); /* LPM3 sleep. This
276 statement will block
277 until the CPU is
278 woken up by an
279 interrupt that sets
280 the wake up flag. */
281 }
283 ENERGEST_SWITCH(ENERGEST_TYPE_LPM, ENERGEST_TYPE_CPU);
284 }
285}
286/*---------------------------------------------------------------------------*/
Device drivers header file for adxl345 accelerometer in Zolertia Z1.
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 clock_wait(clock_time_t i)
Wait for a given number of ticks.
Definition clock.c:136
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
#define LEDS_ALL
The OR mask representation of all device LEDs.
Definition leds.h:195
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 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
uip_lladdr_t uip_lladdr
Host L2 address.
Definition uip6.c:107
void xmem_init(void)
Initialize the external memory.
Definition xmem.c:59
Header file for the LED HAL.
Header file for the logging system.
void uart0_init(unsigned long ubr)
Initalize the RS232 port.
Definition uart0.c:139
Include file for the Contiki low-layer network stack (NETSTACK)
Coffee architecture-dependent header for the Zolertia Z1 platform.
Generic serial I/O process header filer.
A timer.
Definition timer.h:84
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.