* introduced flashrom driver for msb430
* restructured some files concerning flashrom access * added some ifdefs to shell commandsdev/timer
parent
fb1cb91c75
commit
1eec8e170e
@ -1,6 +1,9 @@
|
||||
#include <stdint.h>
|
||||
#include <board-conf.h>
|
||||
#include <config.h>
|
||||
#include <flashrom.h>
|
||||
|
||||
uint8_t config_save(void) {
|
||||
return 1;
|
||||
configmem_t mem = { CONFIG_KEY, sysconfig };
|
||||
return (flashrom_erase((uint8_t*) INFOMEM) && flashrom_write((uint8_t*) INFOMEM, (char*) &mem, sizeof(mem)));
|
||||
}
|
||||
|
@ -0,0 +1,6 @@
|
||||
#ifndef BOARD_CONF_H
|
||||
#define BOARD_CONF_H
|
||||
|
||||
#define INFOMEM (0x1000)
|
||||
|
||||
#endif /* BOARD-CONF_H */
|
@ -0,0 +1,80 @@
|
||||
#include <stddef.h>
|
||||
#include <msp430x16x.h>
|
||||
#include <msp430/flash.h>
|
||||
#include <irq.h>
|
||||
|
||||
uint8_t ie1, ie2;
|
||||
|
||||
static uint8_t prepare(void);
|
||||
static void finish(uint8_t istate);
|
||||
static inline void busy_wait(void);
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
uint8_t flashrom_erase(uint8_t *addr) {
|
||||
uint8_t istate = prepare();
|
||||
|
||||
FCTL3 = FWKEY; /* Lock = 0 */
|
||||
busy_wait();
|
||||
FCTL1 = FWKEY | ERASE;
|
||||
*addr = 0; /* erase Flash segment */
|
||||
busy_wait();
|
||||
FCTL1 = FWKEY; /* ERASE = 0 */
|
||||
FCTL3 = FWKEY | LOCK;
|
||||
finish(istate);
|
||||
return 1;
|
||||
}
|
||||
|
||||
void flashrom_write(uint8_t *dst, uint8_t *src, size_t size) {
|
||||
unsigned int i;
|
||||
FCTL3 = FWKEY; /* Lock = 0 */
|
||||
busy_wait();
|
||||
for (i = size; i > 0; i--) {
|
||||
FCTL1 = FWKEY | WRT;
|
||||
*dst = *src; /* program Flash word */
|
||||
while (!(FCTL3 & WAIT)) {
|
||||
nop();
|
||||
}
|
||||
}
|
||||
busy_wait();
|
||||
FCTL1 = FWKEY; /* WRT = 0 */
|
||||
FCTL3 = FWKEY | LOCK; /* Lock = 1 */
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static uint8_t prepare(void) {
|
||||
uint8_t istate;
|
||||
|
||||
/* Disable all interrupts. */
|
||||
|
||||
/* Clear interrupt flag1. */
|
||||
IFG1 = 0;
|
||||
|
||||
/* DCO(SMCLK) is 2,4576MHz, /6 = 409600 Hz
|
||||
select SMCLK for flash timing, divider 4+1 */
|
||||
FCTL2 = FWKEY | FSSEL_3 | FN2 | FN0;
|
||||
|
||||
/* disable all interrupts to protect CPU
|
||||
during programming from system crash */
|
||||
istate = disableIRQ();
|
||||
|
||||
/* disable all NMI-Interrupt sources */
|
||||
ie1 = IE1;
|
||||
ie2 = IE2;
|
||||
IE1 = 0x00;
|
||||
IE2 = 0x00;
|
||||
return istate;
|
||||
}
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void finish(uint8_t istate) {
|
||||
/* Enable interrupts. */
|
||||
IE1 = ie1;
|
||||
IE2 = ie2;
|
||||
restoreIRQ(istate);
|
||||
}
|
||||
|
||||
static inline void busy_wait(void) {
|
||||
/* Wait for BUSY = 0, not needed unless run from RAM */
|
||||
while(FCTL3 & 0x0001) {
|
||||
nop();
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
#ifndef FLASHROM_H
|
||||
#define FLASHROM_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/*
|
||||
* @brief Erase sector
|
||||
*
|
||||
* @param addr Address within a flash sector to erase
|
||||
*
|
||||
* @return 1 on success, 0 otherwise
|
||||
*/
|
||||
uint8_t flashrom_erase(uint8_t *addr);
|
||||
|
||||
/* @brief Write buffer from ram to flash
|
||||
*
|
||||
* @param dst Address within a flash sector to write, must be a 256 byte boundary
|
||||
* @param src Address within ram, must be a word boundary
|
||||
* @param size Bytes to write
|
||||
*
|
||||
* @return 1 on success, 0 otherwise
|
||||
*/
|
||||
uint8_t flashrom_write(uint8_t *dst, char *src, size_t size);
|
||||
|
||||
|
||||
#endif /* FLASHROM_H */
|
@ -1,5 +1,5 @@
|
||||
SubDir TOP projects msb430_cc110x_ng ;
|
||||
|
||||
Module msb430_cc110x_ng : main.c : cc110x_ng transceiver ps posix_io uart0 auto_init ;
|
||||
Module msb430_cc110x_ng : main.c : cc110x_ng transceiver shell shell_commands ps posix_io uart0 auto_init ;
|
||||
|
||||
UseModule msb430_cc110x_ng ;
|
||||
|
@ -1,17 +1,20 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <config.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void _id_handler(char *id) {
|
||||
uint16_t newid;
|
||||
long newid;
|
||||
|
||||
if (sscanf(id, "id %hu", &newid) == 1) {
|
||||
printf("Setting new id %u\n", newid);
|
||||
newid = atoi(id+3);
|
||||
if (strlen(id) < 3) {
|
||||
printf("Current id: %u\n", sysconfig.id);
|
||||
}
|
||||
else {
|
||||
printf("Setting new id %lu\n", newid);
|
||||
sysconfig.id = newid;
|
||||
if (!config_save()) {
|
||||
puts("ERROR setting new id");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("Current id: %u\n", sysconfig.id);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue