4,7 → 4,7 |
// + www.MikroKopter.com |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation), |
// + dass eine Nutzung (auch auszugsweise) nur f�r den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + dass eine Nutzung (auch auszugsweise) nur für den privaten und nicht-kommerziellen Gebrauch zulässig ist. |
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt |
// + bzgl. der Nutzungsbedingungen aufzunehmen. |
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen, |
50,15 → 50,6 |
// + POSSIBILITY OF SUCH DAMAGE. |
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
// + Contant Values |
// + 0-250 -> normale Values |
// + 251 -> Poti1 |
// + 252 -> Poti2 |
// + 253 -> Poti3 |
// + 254 -> Poti4 |
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
#ifndef EEMEM |
#define EEMEM __attribute__ ((section (".eeprom"))) |
#endif |
104,37 → 95,41 |
} |
*/ |
|
uint8_t calculateChecksum(uint8_t* data, uint16_t length) { |
uint8_t result = 0; |
uint16_t CRC16(uint8_t* data, uint16_t length) { |
uint16_t crc = 0; |
for (uint16_t i=0; i<length; i++) { |
result += data[i]; |
crc = (uint8_t)(crc >> 8) | (crc << 8); |
crc ^= data[i]; |
crc ^= (uint8_t)(crc & 0xff) >> 4; |
crc ^= (crc << 8) << 4; |
crc ^= ((crc & 0xff) << 4) << 1; |
} |
return result; |
return crc; |
} |
|
// offset is where the checksum is stored, offset+1 is the revision number, and offset+2... are the data. |
// length is the length of the pure data not including checksum and revision number. |
void writeChecksummedBlock(uint8_t revisionNumber, uint8_t* data, uint16_t offset, uint16_t length) { |
uint8_t checksum = calculateChecksum(data, length); |
eeprom_write_byte(&EEPromArray[offset], checksum); |
eeprom_write_byte(&EEPromArray[offset+1], revisionNumber); |
eeprom_write_block(data, &EEPromArray[offset+2], length); |
uint16_t CRC = CRC16(data, length); |
eeprom_write_word(&EEPromArray[offset], CRC); |
eeprom_write_byte(&EEPromArray[offset+2], revisionNumber); |
eeprom_write_block(data, &EEPromArray[offset+3], length); |
} |
|
// offset is where the checksum is stored, offset+1 is the revision number, and offset+2... are the data. |
// length is the length of the pure data not including checksum and revision number. |
uint8_t readChecksummedBlock(uint8_t revisionNumber, uint8_t* target, uint16_t offset, uint16_t length) { |
uint8_t checksumRead = eeprom_read_byte(&EEPromArray[offset]); |
uint8_t revisionNumberRead = eeprom_read_byte(&EEPromArray[offset+1]); |
eeprom_read_block(target, &EEPromArray[offset+2], length); |
uint8_t checksumCalculated = calculateChecksum(target, length); |
uint16_t CRCRead = eeprom_read_word(&EEPromArray[offset]); |
uint8_t revisionNumberRead = eeprom_read_byte(&EEPromArray[offset+2]); |
eeprom_read_block(target, &EEPromArray[offset+3], length); |
uint16_t CRCCalculated = CRC(target, length); |
|
uint8_t checksumError = (checksumRead != checksumCalculated); |
uint8_t CRCError = (CRCRead != CRCCalculated); |
uint8_t revisionMismatch = (revisionNumber != revisionNumberRead); |
|
if (checksumError && revisionMismatch) printf("\n\rEEPROM checksum error and revision mismatch, "); |
else if (checksumError) printf("\n\rEEPROM checksum error, "); |
else if (revisionMismatch) printf("\n\rEEPROM revision mismatch, "); |
if (CRCError && revisionMismatch) printf("\n\rEEPROM CRC error and revision mismatch; "); |
else if (CRCError) printf("\n\rEEPROM CRC error; "); |
else if (revisionMismatch) printf("\n\rEEPROM revision mismatch; "); |
return (checksumError || revisionMismatch); |
} |
|
143,7 → 138,7 |
/***************************************************/ |
// setnumber [1..5] |
uint8_t paramSet_readFromEEProm(uint8_t setnumber) { |
uint16_t offset = EEPROM_ADR_PARAMSET_BEGIN + (setnumber-1)*(sizeof(paramset_t)+2); |
uint16_t offset = EEPROM_ADR_PARAMSET_BEGIN + (setnumber-1)*(sizeof(paramset_t)+EEPROM_CHECKSUMMED_BLOCK_OVERHEAD); |
output_init(); // what's that doing here?? |
return readChecksummedBlock(EEPARAM_REVISION, (uint8_t*)&staticParams, offset, sizeof(paramset_t)); |
} |
152,7 → 147,7 |
/* Write Parameter Set to EEPROM */ |
/***************************************************/ |
void paramSet_writeToEEProm(uint8_t setnumber) { |
uint16_t offset = EEPROM_ADR_PARAMSET_BEGIN + (setnumber-1)*(sizeof(paramset_t)+2); |
uint16_t offset = EEPROM_ADR_PARAMSET_BEGIN + (setnumber-1)*(sizeof(paramset_t)+EEPROM_CHECKSUMMED_BLOCK_OVERHEAD); |
writeChecksummedBlock(EEPARAM_REVISION, (uint8_t*)&staticParams, offset, sizeof(paramset_t)); |
// set this parameter set to active set |
setActiveParamSet(setnumber); |