1.1 --- a/pkg/devices/lib/cpm/src/common.cc Wed Apr 24 00:47:34 2024 +0200
1.2 +++ b/pkg/devices/lib/cpm/src/common.cc Sat Apr 27 23:46:28 2024 +0200
1.3 @@ -63,7 +63,15 @@
1.4 Field::get_field(Cpm_regs ®s)
1.5 {
1.6 if (defined)
1.7 - return regs.get_field(reg, mask, bit) + adjustment;
1.8 + {
1.9 + // With an encoding table, use the encoded value as index to obtain the
1.10 + // genuine value.
1.11 +
1.12 + if (table != NULL)
1.13 + return table[regs.get_field(reg, mask, bit)];
1.14 + else
1.15 + return regs.get_field(reg, mask, bit) + adjustment;
1.16 + }
1.17 else
1.18 return 0;
1.19 }
1.20 @@ -72,7 +80,18 @@
1.21 Field::set_field(Cpm_regs ®s, uint32_t value)
1.22 {
1.23 if (defined)
1.24 - regs.set_field(reg, mask, bit, value >= adjustment ? value - adjustment : 0);
1.25 + {
1.26 + // With an encoding table, find the index of the presented value.
1.27 +
1.28 + if (table != NULL)
1.29 + {
1.30 + for (uint32_t i = 0; i < mask; i++)
1.31 + if (table[i] == value)
1.32 + regs.set_field(reg, mask, bit, i);
1.33 + }
1.34 + else
1.35 + regs.set_field(reg, mask, bit, value >= adjustment ? value - adjustment : 0);
1.36 + }
1.37 }
1.38
1.39 // Undefined field.