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