From e9c81e92a27ad3ceb99bf6ddbd1375f5632ff699 Mon Sep 17 00:00:00 2001 From: Timo Bruderek Date: Tue, 8 Mar 2022 07:21:55 +0000 Subject: [PATCH 1/3] Added packed attribute to get correct size using sizeof() --- 24c16.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/24c16.h b/24c16.h index b47e8fe..e34694b 100644 --- a/24c16.h +++ b/24c16.h @@ -8,7 +8,7 @@ typedef struct { unsigned char address; } t_24c16; -typedef struct { +typedef struct __attribute__((packed)){ char header[3]; char data_version; char serial[6]; From 8ed03970169adc1f68d1b6c3da9f180c260d51b1 Mon Sep 17 00:00:00 2001 From: Timo Bruderek Date: Tue, 8 Mar 2022 07:22:28 +0000 Subject: [PATCH 2/3] Exclude checksum itself from checksum calculation --- 24c16.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/24c16.c b/24c16.c index 8f07d40..cba3e62 100644 --- a/24c16.c +++ b/24c16.c @@ -19,7 +19,7 @@ int update_checksum(t_eeprom_data* data) p_data = (char*)data; - for (size_t i=0; ichecksum)); i++) { checksum += *p_data; p_data++; @@ -27,6 +27,7 @@ int update_checksum(t_eeprom_data* data) //fprintf(stderr, "Checksum: %x\n", checksum); data->checksum = checksum; + return (0); } @@ -56,7 +57,7 @@ char verify_checksum(t_eeprom_data* data) p_data = (char*)data; - for (size_t i=0; ichecksum)); i++) { checksum += *p_data; p_data++; From f3d34d342b81c5b602173ff4be509a91d24fc751 Mon Sep 17 00:00:00 2001 From: Timo Bruderek Date: Thu, 17 Mar 2022 08:52:28 +0000 Subject: [PATCH 3/3] Expand SN to 8 digits Add padding for struct alignment --- 24c16.h | 9 +++++++-- sensorcal.c | 13 +++++++------ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/24c16.h b/24c16.h index e34694b..3cca5d7 100644 --- a/24c16.h +++ b/24c16.h @@ -2,20 +2,25 @@ #define EEPROM_DATA_VERSION 1 +#define SN_LENGTH 8 + // define struct for MS5611 sensor typedef struct { int fd; unsigned char address; } t_24c16; -typedef struct __attribute__((packed)){ +typedef struct { char header[3]; char data_version; - char serial[6]; float zero_offset; + char serial[SN_LENGTH]; + char padding[3]; char checksum; } t_eeprom_data; + + // prototypes int eeprom_open(t_24c16 *, unsigned char); char eeprom_write(t_24c16 *, char *, unsigned char, unsigned char); diff --git a/sensorcal.c b/sensorcal.c index 132887a..e5aa415 100644 --- a/sensorcal.c +++ b/sensorcal.c @@ -83,7 +83,7 @@ int main (int argc, char **argv) { int result; int c; int i; - char sn[7]; + char sn[SN_LENGTH]; char zero[1]={0x00}; @@ -128,8 +128,9 @@ int main (int argc, char **argv) { } strcpy(data.header, "OV"); data.data_version = EEPROM_DATA_VERSION; - memset(data.serial,'0',6); + memset(data.serial,'0',SN_LENGTH); data.zero_offset=0.0; + memset(data.padding,'0',3); update_checksum(&data); printf("Writing data to EEPROM ...\n"); result = eeprom_write(&eeprom, (char*)&data, 0x00, sizeof(data)); @@ -171,7 +172,7 @@ int main (int argc, char **argv) { printf("Reading EEPROM values ...\n\n"); if( eeprom_read_data(&eeprom, &data) == 0) { - memcpy(sn,data.serial,6); + memcpy(sn,data.serial,SN_LENGTH); printf("Actual EEPROM values:\n"); printf("---------------------\n"); printf("Serial: \t\t\t%s\n", sn); @@ -189,12 +190,12 @@ int main (int argc, char **argv) { break; case 's': - if( strlen(optarg) == 6) + if( strlen(optarg) == SN_LENGTH) { // read actual EEPROM values if( eeprom_read_data(&eeprom, &data) == 0) { - for(i=0; i<6;i++) + for(i=0; i