From 66443dd2c2ddface9a72693612711391933cd169 Mon Sep 17 00:00:00 2001 From: fgsfds Date: Sun, 27 Aug 2023 17:49:27 +0200 Subject: [PATCH] port: don't explode when EEPROM can't be saved or loaded --- port/src/libultra.c | 65 ++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/port/src/libultra.c b/port/src/libultra.c index b8da8ed60..6d9e844a7 100644 --- a/port/src/libultra.c +++ b/port/src/libultra.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include "system.h" @@ -24,6 +25,9 @@ s32 osTvType = OS_TV_NTSC; /* 0 = PAL, 1 = NTSC, 2 = MPAL */ s32 osResetType = 0; /* 0 = cold reset */ s32 osViClock = VI_NTSC_CLOCK; +static u8 eeprom[EEPROM_SIZE]; +static s32 eepromLoaded = 0; + /* Time */ OSTime osGetTime(void) @@ -247,6 +251,31 @@ s32 __osMotorAccess(OSPfs *pfs, s32 cmd) /* Eeprom */ +static inline void osEeepromLoad(const char *fname) +{ + if (!eepromLoaded) { + eepromLoaded = 1; + FILE *fp = fsFileOpenRead(fname); + if (fp) { + fread(eeprom, 1, EEPROM_SIZE, fp); + fsFileClose(fp); + } else { + printf("could not read EEPROM from `%s`: %s\n", fname, strerror(errno)); + } + } +} + +static inline void osEeepromSave(const char *fname) +{ + FILE* fp = fsFileOpenWrite(fname); + if (fp) { + fwrite(eeprom, 1, EEPROM_SIZE, fp); + fsFileClose(fp); + } else { + fprintf(stderr, "could not save EEPROM to `%s`: %s\n", fname, strerror(errno)); + } +} + s32 osEepromProbe(OSMesgQueue *mq) { return EEPROM_TYPE_16K; @@ -254,34 +283,22 @@ s32 osEepromProbe(OSMesgQueue *mq) s32 osEepromLongRead(OSMesgQueue *mq, u8 address, u8 *buffer, int nbytes) { - u8 content[EEPROM_SIZE]; - s32 ret = -1; - FILE *fp = fsFileOpenRead(EEPROM_FNAME); - if (fp == NULL) { - return -1; - } - if (fread(content, 1, EEPROM_SIZE, fp) == EEPROM_SIZE) { - memcpy(buffer, content + address * 8, nbytes); - ret = 0; - } - fsFileClose(fp); - return ret; + osEeepromLoad(EEPROM_FNAME); + + memcpy(buffer, eeprom + address * 8, nbytes); + + return 0; } s32 osEepromLongWrite(OSMesgQueue *mq, u8 address, u8 *buffer, int nbytes) { - u8 content[EEPROM_SIZE] = { 0 }; - if (address != 0 || nbytes != EEPROM_SIZE) { - osEepromLongRead(mq, 0, content, EEPROM_SIZE); - } - memcpy(content + address * 8, buffer, nbytes); - FILE* fp = fsFileOpenWrite(EEPROM_FNAME); - if (fp == NULL) { - return -1; - } - s32 ret = fwrite(content, 1, EEPROM_SIZE, fp) == EEPROM_SIZE ? 0 : -1; - fsFileClose(fp); - return ret; + osEeepromLoad(EEPROM_FNAME); + + memcpy(eeprom + address * 8, buffer, nbytes); + + osEeepromSave(EEPROM_FNAME); + + return 0; } /* Pfs */