osd-contiki/cpu/mc1322x/config.c

84 lines
2.7 KiB
C

/* MC1322x flash config system */
#include <mc1322x.h>
#include "config.h"
/* debug */
#define DEBUG DEBUG_FULL
#include "net/ip/uip-debug.h"
mc1322xConfig mc1322x_config;
void dump_bytes(uint32_t addr, uint16_t num);
/* takes an mc1322xConf and initializes to default values */
void mc1322x_config_set_default(mc1322xConfig *c) {
nvmType_t type;
c->magic = MC1322X_CONFIG_MAGIC;
c->version = MC1322X_CONFIG_VERSION;
c->eui = 0;
c->channel = RF_CHANNEL - 11;
c->power = 0x11;
c->flags.demod = DEMOD_DCD;
c->flags.autoack = AUTOACK;
nvm_detect(gNvmInternalInterface_c, &type);
c->flags.nvmtype = type;
}
/* write out config to flash */
void mc1322x_config_save(mc1322xConfig *c) {
nvmErr_t err;
err = nvm_erase(gNvmInternalInterface_c, c->flags.nvmtype, 1 << MC1322X_CONFIG_PAGE/4096);
err = nvm_write(gNvmInternalInterface_c, c->flags.nvmtype, (uint8_t *)c, MC1322X_CONFIG_PAGE, sizeof(mc1322xConfig));
}
/* load the config from flash to the pass conf structure */
void mc1322x_config_restore(mc1322xConfig *c) {
nvmErr_t err;
nvmType_t type;
if (c->flags.nvmtype == 0) { nvm_detect(gNvmInternalInterface_c, &type); }
c->flags.nvmtype = type;
err = nvm_read(gNvmInternalInterface_c, c->flags.nvmtype, c, MC1322X_CONFIG_PAGE, sizeof(mc1322xConfig));
}
/* check the flash for magic number and proper version */
int mc1322x_config_valid(mc1322xConfig *c) {
if (c->magic == MC1322X_CONFIG_MAGIC &&
c->version == MC1322X_CONFIG_VERSION) {
return 1;
} else {
#if DEBUG
if (c->magic != MC1322X_CONFIG_MAGIC) { PRINTF("config bad magic %04x\n\r", c->magic); }
if (c->version != MC1322X_CONFIG_MAGIC) { PRINTF("config bad version %04x\n\r", c->version); }
#endif
return -1;
}
}
void mc1322x_config_print(void) {
uint64_t eui64;
PRINTF("mc1322x config:\n\r");
PRINTF(" magic: %04x\n\r", mc1322x_config.magic);
PRINTF(" version: %d\n\r", mc1322x_config.version);
PRINTF(" eui: %08x%08x\n\r", (uint32_t)(mc1322x_config.eui>>32), (uint32_t)(mc1322x_config.eui & 0xffffffff));
PRINTF(" channel: %d\n\r", mc1322x_config.channel);
PRINTF(" power: %d\n\r", mc1322x_config.power);
PRINTF(" flags: %08x\n\r", mc1322x_config.flags);
PRINTF(" demod: %d\n\r", mc1322x_config.flags.demod);
PRINTF(" autoack: %d\n\r", mc1322x_config.flags.autoack);
PRINTF(" nvm type: %d\n\r", mc1322x_config.flags.nvmtype);
}
void dump_bytes(uint32_t addr, uint16_t num) {
uint32_t buf[num/4];
nvmErr_t err;
uint16_t i;
err = nvm_read(gNvmInternalInterface_c, mc1322x_config.flags.nvmtype, (uint8_t *)buf, addr, num);
PRINTF("nvm_read returned: 0x%02x\r\n", err);
for(i=0; i < num/4; i++) {
printf("0x%08x\r\n", (unsigned int)buf[i]);
}
}