Style changes.

This commit is contained in:
nvt-se 2007-08-02 08:17:43 +00:00
parent 0412975efd
commit a6af72d129
2 changed files with 61 additions and 61 deletions

View file

@ -57,62 +57,65 @@ Berlin, 2007
#include <msp430/flash.h> #include <msp430/flash.h>
#include "infomem.h" #include "infomem.h"
void infomem_read(void* buffer, unsigned int offset, unsigned char size) { void
UINT8* address = (UINT8*)INFOMEM_START + offset; infomem_read(void *buffer, unsigned int offset, unsigned char size)
memcpy(buffer, address, size); {
UINT8 *address = (UINT8 *) INFOMEM_START + offset;
memcpy(buffer, address, size);
} }
bool infomem_write(unsigned int offset, unsigned char count, ...) { bool
char backup[INFOMEM_BLOCK_SIZE]; infomem_write(unsigned int offset, unsigned char count, ...)
{
char backup[INFOMEM_BLOCK_SIZE];
UINT8 *buffer;
UINT16 i;
UINT8 *flash;
va_list argp;
UINT16 size;
UINT8 *data;
register UINT8* buffer; if (offset > (2 * INFOMEM_BLOCK_SIZE))
register UINT16 i; return false;
UINT8* flash;
if( offset > ( 2 * INFOMEM_BLOCK_SIZE) ) flash = (UINT8 *) INFOMEM_START + offset;
return false;
flash = (UINT8*)INFOMEM_START + offset; _DINT();
_DINT(); // backup into RAM
memcpy(backup, flash, INFOMEM_BLOCK_SIZE);
// backup into RAM // merge backup with new data
memcpy(backup, flash, INFOMEM_BLOCK_SIZE); va_start(argp, count);
// merge backup with new data buffer = (UINT8 *) backup;
va_list argp; for (i = 0; i < count; i++) {
va_start(argp, count); data = va_arg(argp, UINT8*);
size = va_arg(argp, UINT16);
memcpy(buffer, data, size);
buffer += size;
}
buffer = (UINT8*)backup; va_end(argp);
for( i = 0; i < count; i++ ) {
register UINT16 size;
register UINT8* data;
data = va_arg(argp, UINT8*); // init flash access
size = va_arg(argp, UINT16); FCTL2 = FWKEY + FSSEL1 + FN2;
memcpy(buffer, data, size); FCTL3 = FWKEY;
buffer += size;
}
va_end(argp);
// init flash access // erase flash
FCTL2 = FWKEY + FSSEL1 + FN2; FCTL1 = FWKEY + ERASE;
FCTL3 = FWKEY; *flash = 0;
// erase flash // write flash
FCTL1 = FWKEY + ERASE; FCTL1 = FWKEY + WRT;
*flash = 0; buffer = (UINT8 *) backup;
for (i = 0; i < INFOMEM_BLOCK_SIZE; i++) {
*flash++ = *buffer++;
}
// write flash FCTL1 = FWKEY;
FCTL1 = FWKEY + WRT; FCTL3 = FWKEY + LOCK;
buffer = (UINT8*)backup;
for( i = 0; i < INFOMEM_BLOCK_SIZE; i++ ) {
*flash = *buffer;
buffer++; flash++;
}
FCTL1 = FWKEY;
FCTL3 = FWKEY + LOCK;
_EINT(); _EINT();
return true; return true;
} }

View file

@ -42,21 +42,17 @@ Berlin, 2006
/** /**
* @file infomem.h * @file infomem.h
* @addtogroup storage * @addtogroup storage
* @brief MSP430 Infomemory Storage * @brief MSP430 Infomemory Storage
* *
* @author Michael Baar <baar@inf.fu-berlin.de> * @author Michael Baar <baar@inf.fu-berlin.de>
*/ */
#ifndef INFOMEM_H_ #ifndef INFOMEM_H
#define INFOMEM_H_ #define INFOMEM_H
/* These defines might depend on the specific CPU used and have to be defined in platform:
#define INFOMEM_START 0x1000
#define INFOMEM_BLOCK_SIZE 128
*/
#if !defined(INFOMEM_START) || !defined(INFOMEM_BLOCK_SIZE) #if !defined(INFOMEM_START) || !defined(INFOMEM_BLOCK_SIZE)
#error "Infomemory position (INFOMEM_START) and blocksize (INFOMEM_BLOCK_SIZE) need to be defined for current platform" #error "infomem position (INFOMEM_START) and block size (INFOMEM_BLOCK_SIZE) need to be defined for the platform"
#endif #endif
/** /**
@ -65,21 +61,22 @@ Berlin, 2006
* @param[in] offset Offset in infomemory (0-254) * @param[in] offset Offset in infomemory (0-254)
* @param[in] size Number of bytes to read * @param[in] size Number of bytes to read
*/ */
void infomem_read(void* buffer, unsigned int offset, unsigned char size); void infomem_read(void *buffer, unsigned int offset, unsigned char size);
/** /**
* @brief Write bytes to infomemory * @brief Write bytes to infomemory
* @param[in] offset Offset in infomemory (0-254) * @param[in] offset Offset in infomemory (0-254)
* @param[in] count Number of items following * @param[in] count Number of items following
* each item is a pair pointer, length * each item is a pair pointer, length
* *
* Example: Infomem_write( 0, 2, &a,3, &b,1 ); * Example: Infomem_write( 0, 2, &a,3, &b,1 );
* *
* \note: The MSP430 has two consecutive blocks of infomemory. Each is 128 Bytes large. * \note: The MSP430 has two consecutive blocks of infomemory.
* The offset is the relative address starting at the beginning of the first block. * Each is 128 bytes large. The offset is the relative address
* You can write an arbitrary number of bytes at any offse, but this * starting at the beginning of the first block. You can write an
* function cannot write across the two blocks of infomemory. * arbitrary number of bytes at any offset, but this function
* cannot write across the two blocks of infomemory.
*/ */
bool infomem_write(unsigned int offset, unsigned char count, ...); bool infomem_write(unsigned int offset, unsigned char count, ...);
#endif // INFOMEM_H #endif // !INFOMEM_H