32 #define PRINTF(FORMAT, args ...) printf_P(PSTR(FORMAT),##args)
36 #define PRINTD(FORMAT, args ...) printf_P(PSTR(FORMAT),##args)
42 #include <avr/pgmspace.h>
43 #include <avr/eeprom.h>
52 #include "contiki-net.h"
55 #if CONTIKI_CONF_RANDOM_MAC
56 extern uint8_t rng_get_uint8(
void);
58 generate_new_eui64(uint8_t eui64[8])
61 eui64[1] = rng_get_uint8();
62 eui64[2] = rng_get_uint8();
65 eui64[5] = rng_get_uint8();
66 eui64[6] = rng_get_uint8();
67 eui64[7] = rng_get_uint8();
73 extern uint8_t default_mac_address[8];
74 extern uint8_t default_server_name[16];
75 extern uint8_t default_domain_name[30];
77 const uint8_t default_mac_address[8] PROGMEM = PARAMS_EUI64ADDR;
78 const uint8_t default_server_name[] PROGMEM = PARAMS_SERVERNAME;
79 const uint8_t default_domain_name[] PROGMEM = PARAMS_DOMAINNAME;
82 #if PARAMETER_STORAGE == 0
85 params_get_eui64(uint8_t *eui64)
87 #if CONTIKI_CONF_RANDOM_MAC
88 PRINTD(
"Generating random EUI64 MAC\n");
89 generate_new_eui64(eui64);
93 for(i = 0; i <
sizeof(default_mac_address); i++) {
94 eui64[i] = pgm_read_byte_near(default_mac_address + i);
99 #elif PARAMETER_STORAGE == 1
107 uint8_t eemem_mac_address[] EEMEM = PARAMS_EUI64ADDR;
108 uint8_t eemem_server_name[] EEMEM = PARAMS_SERVERNAME;
109 uint8_t eemem_domain_name[] EEMEM = PARAMS_DOMAINNAME;
112 uint16_t eemem_nodeid EEMEM = PARAMS_NODEID;
113 uint8_t eemem_channel[2] EEMEM = { PARAMS_CHANNEL, ~PARAMS_CHANNEL };
114 uint16_t eemem_panid EEMEM = PARAMS_PANID;
115 uint16_t eemem_panaddr EEMEM = PARAMS_PANADDR;
116 uint8_t eemem_txpower EEMEM = PARAMS_TXPOWER;
118 #if CONTIKI_CONF_RANDOM_MAC
119 static uint8_t randomeui64;
123 params_get_channel(
void)
126 *(uint16_t *)x = eeprom_read_word((uint16_t *)&eemem_channel);
128 if((x[0] < 11) || (x[0] > 26)) {
132 if((uint8_t)x[0] != (uint8_t) ~x[1]) {
134 uint8_t i, buffer[32];
135 PRINTD(
"EEPROM is corrupt, rewriting with defaults.\n");
136 #if CONTIKI_CONF_RANDOM_MAC
137 PRINTD(
"Generating random EUI64 MAC\n");
138 generate_new_eui64(&buffer);
141 for(i = 0; i <
sizeof(default_mac_address); i++) {
142 buffer[i] = pgm_read_byte_near(default_mac_address + i);
147 eeprom_write_block(&buffer, &eemem_mac_address,
sizeof(eemem_mac_address));
148 for(i = 0; i <
sizeof(default_server_name); i++) {
149 buffer[i] = pgm_read_byte_near(default_server_name + i);
151 eeprom_write_block(&buffer, &eemem_server_name,
sizeof(eemem_server_name));
152 for(i = 0; i <
sizeof(default_domain_name); i++) {
153 buffer[i] = pgm_read_byte_near(default_domain_name + i);
155 eeprom_write_block(&buffer, &eemem_domain_name,
sizeof(eemem_domain_name));
156 eeprom_write_word(&eemem_panid, PARAMS_PANID);
157 eeprom_write_word(&eemem_panaddr, PARAMS_PANADDR);
158 eeprom_write_byte(&eemem_txpower, PARAMS_TXPOWER);
159 eeprom_write_word(&eemem_nodeid, PARAMS_NODEID);
160 x[0] = PARAMS_CHANNEL;
162 eeprom_write_word((uint16_t *)&eemem_channel, *(uint16_t *)x);
169 params_get_eui64(uint8_t *eui64)
172 eeprom_read_block((
void *)eui64, &eemem_mac_address,
sizeof(linkaddr_t));
174 #if CONTIKI_CONF_RANDOM_MAC
181 params_get_panid(
void)
183 return eeprom_read_word(&eemem_panid);
186 params_get_panaddr(
void)
188 return eeprom_read_word(&eemem_panaddr);
191 params_get_txpower(
void)
193 return eeprom_read_byte(&eemem_txpower);
203 PRINTD(
"<-Get RF channel %u\n", x);
207 PRINTD(
"->Set EEPROM RF channel to %d\n", x);
213 params_get_eui64(uint8_t *eui64)
215 size_t size =
sizeof(linkaddr_t);
217 PRINTD(
"<-Get EUI64 MAC\n");
220 #if CONTIKI_CONF_RANDOM_MAC
221 PRINTD(
"Generating random EUI64 MAC\n");
222 generate_new_eui64(eui64);
225 for(i = 0; i < 8; i++) {
226 eui64[i] = pgm_read_byte_near(default_mac_address + i);
231 PRINTD(
"->Set EEPROM MAC address\n");
233 #if CONTIKI_CONF_RANDOM_MAC
240 params_get_panid(
void)
245 PRINTD(
"<-Get PAN ID of %04x\n", x);
249 PRINTD(
"->Set EEPROM PAN ID to %04x\n", x);
255 params_get_panaddr(
void)
260 PRINTD(
"<-Get PAN address of %04x\n", x);
264 PRINTD(
"->Set EEPROM PAN address to %04x\n", x);
270 params_get_txpower(
void)
275 PRINTD(
"<-Get tx power of %d (0=max)\n", x);
279 PRINTD(
"->Set EEPROM tx power of %d (0=max)\n", x);
settings_status_t settings_get(settings_key_t key, uint8_t index, uint8_t *value, settings_length_t *value_size)
Fetches the value associated with the given key.
#define SETTINGS_KEY_PAN_ADDR
settings_status_t settings_add(settings_key_t key, const uint8_t *value, settings_length_t value_size)
Adds the given key-value pair to the end of the settings store.
#define SETTINGS_KEY_EUI64
EUI64 Address, 8 bytes.
#define SETTINGS_KEY_PAN_ID
#define SETTINGS_KEY_CHANNEL
#define SETTINGS_KEY_TXPOWER