Just in case you (or anyone else) do end up wanting to look further into editing the calibration data, here's what I could work out on it so far:
The calibration block is stored at 0x80 in the EEPROM and is 0xf7e bytes long. There is a checksum for it at 0xFFE, which needs to be correct. This is calculated by adding up all the bytes in the block, adding 0x1fe, and casting it down to a uint16.
The actual calibration constants don't take up much of that block. They're stored as floats at the start of the block. The first four floats are handled specially and I'm guessing that they're offsets, since they're very small and can be positive or negative in your example. Also the firmware defaults them to 0.0 if the EEPROM data is invalid.
After that, there are pairs of gain & offset corrections. They are loaded as groups of 3 pairs, for a total of 5 groups. I assume these will correspond to points throughout the measurement ranges.
These are the float values from your EEPROM:
$ od -Ax -j 0x80 --endian=big -f '4338B EEPROM DUMP.BIN'
000080 -1.33072e-05 -7.6217e-06 1.6031385e-05 1.7778738e-06
000090 1.014507 -0.02629138 1.0134906 -0.026007662
0000a0 1.0134878 -0.026201833 1.0039018 -0.025654815
0000b0 1.002896 -0.025374427 1.0028933 -0.025566569
0000c0 1.0030564 -0.025575776 1.0020514 -0.025295684
0000d0 1.0020487 -0.025487663 1.0039852 -0.025926284
0000e0 1.0029793 -0.025645602 1.0029765 -0.02583776
0000f0 1.004992 -0.026207505 1.0039852 -0.025926284
000100 1.0039824 -0.026118636 -nan -nan
000110 -nan -nan -nan -nan
*
Hi Miek, thank you so much for help me again!
I tried some work you shared here before, and then I gave up.
I still have the Python code I wrote for checksum, it simply adds those bytes from 0x80 to 0xffd, then gets a 16-bit integer, and put this 16-bit integer into offset 0xffe-0xfff. I believe you got the algorithm by analyzing the decompiled code, there should be nothing wrong. Glad that at least our results were consistent.
About the calibration data, my previous thought was that they were in groups of four floats, corresponding to 8 ranges. But the fact that there are only 30 floats there, not the 32 I was expecting, I guess that's why I gave up at the time.
If you're reading the code, maybe you can help me out with this, I'd really appreciate it!
(I'm going to try that too, although the last time I did something like this was probably about 25 years ago)