Coverage for tropicsquare / config / sensors.py: 89%
124 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-27 21:24 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-27 21:24 +0000
1"""Sensors configuration (CFG_SENSORS @ 0x08)"""
3from tropicsquare.config.base import BaseConfig
4from tropicsquare.config.constants import (
5 SENSORS_PTRNG0_TEST_DIS_BIT,
6 SENSORS_PTRNG1_TEST_DIS_BIT,
7 SENSORS_OSCMON_DIS_BIT,
8 SENSORS_SHIELD_DIS_BIT,
9 SENSORS_VMON_DIS_BIT,
10 SENSORS_GLITCH_DIS_BIT,
11 SENSORS_TEMP_DIS_BIT,
12 SENSORS_LASER_DIS_BIT,
13 SENSORS_EMP_DIS_BIT,
14 SENSORS_CPU_ALERT_DIS_BIT,
15 SENSORS_BF_PIN_VER_DIS_BIT,
16 SENSORS_BF_SCB_DIS_BIT,
17 SENSORS_BF_CPB_DIS_BIT,
18 SENSORS_BF_ECC_DIS_BIT,
19 SENSORS_BF_RAM_DIS_BIT,
20 SENSORS_BF_EKDB_DIS_BIT,
21 SENSORS_BF_IMEM_DIS_BIT,
22 SENSORS_BF_PLATFORM_DIS_BIT
23)
26class SensorsConfig(BaseConfig):
27 """Sensors and fault detection configuration register.
29 Controls security sensors and bit-flip detection mechanisms.
30 Each field disables a specific security feature when set to True.
32 Fields:
34 - ptrng0_test_dis: PTRNG0 test disable (bit 0)
35 - ptrng1_test_dis: PTRNG1 test disable (bit 1)
36 - oscmon_dis: Oscillator monitoring disable (bit 2)
37 - shield_dis: Shield monitoring disable (bit 3)
38 - vmon_dis: Voltage monitoring disable (bit 4)
39 - glitch_dis: Glitch detection disable (bit 5)
40 - temp_dis: Temperature sensor disable (bit 6)
41 - laser_dis: Laser detection disable (bit 7)
42 - emp_dis: EMP detection disable (bit 8)
43 - cpu_alert_dis: CPU alert disable (bit 9)
44 - bf_pin_ver_dis: Bit-flip PIN verification disable (bit 10)
45 - bf_scb_dis: Bit-flip SCB disable (bit 11)
46 - bf_cpb_dis: Bit-flip CPB disable (bit 12)
47 - bf_ecc_dis: Bit-flip ECC disable (bit 13)
48 - bf_ram_dis: Bit-flip RAM disable (bit 14)
49 - bf_ekdb_dis: Bit-flip EKDB disable (bit 15)
50 - bf_imem_dis: Bit-flip instruction memory disable (bit 16)
51 - bf_platform_dis: Bit-flip platform disable (bit 17)
52 """
54 def _get_bit(self, bit_pos):
55 """Helper to get bit value."""
56 return bool((self._value >> bit_pos) & 1)
58 def _set_bit(self, bit_pos, value):
59 """Helper to set bit value."""
60 if value:
61 self._value |= (1 << bit_pos)
62 else:
63 self._value &= ~(1 << bit_pos)
65 @property
66 def ptrng0_test_dis(self) -> bool:
67 """PTRNG0 test disable (bit 0)."""
68 return self._get_bit(SENSORS_PTRNG0_TEST_DIS_BIT)
70 @ptrng0_test_dis.setter
71 def ptrng0_test_dis(self, value: bool) -> None:
72 self._set_bit(SENSORS_PTRNG0_TEST_DIS_BIT, value)
74 @property
75 def ptrng1_test_dis(self) -> bool:
76 """PTRNG1 test disable (bit 1)."""
77 return self._get_bit(SENSORS_PTRNG1_TEST_DIS_BIT)
79 @ptrng1_test_dis.setter
80 def ptrng1_test_dis(self, value: bool) -> None:
81 self._set_bit(SENSORS_PTRNG1_TEST_DIS_BIT, value)
83 @property
84 def oscmon_dis(self) -> bool:
85 """Oscillator monitoring disable (bit 2)."""
86 return self._get_bit(SENSORS_OSCMON_DIS_BIT)
88 @oscmon_dis.setter
89 def oscmon_dis(self, value: bool) -> None:
90 self._set_bit(SENSORS_OSCMON_DIS_BIT, value)
92 @property
93 def shield_dis(self) -> bool:
94 """Shield monitoring disable (bit 3)."""
95 return self._get_bit(SENSORS_SHIELD_DIS_BIT)
97 @shield_dis.setter
98 def shield_dis(self, value: bool) -> None:
99 self._set_bit(SENSORS_SHIELD_DIS_BIT, value)
101 @property
102 def vmon_dis(self) -> bool:
103 """Voltage monitoring disable (bit 4)."""
104 return self._get_bit(SENSORS_VMON_DIS_BIT)
106 @vmon_dis.setter
107 def vmon_dis(self, value: bool) -> None:
108 self._set_bit(SENSORS_VMON_DIS_BIT, value)
110 @property
111 def glitch_dis(self) -> bool:
112 """Glitch detection disable (bit 5)."""
113 return self._get_bit(SENSORS_GLITCH_DIS_BIT)
115 @glitch_dis.setter
116 def glitch_dis(self, value: bool) -> None:
117 self._set_bit(SENSORS_GLITCH_DIS_BIT, value)
119 @property
120 def temp_dis(self) -> bool:
121 """Temperature sensor disable (bit 6)."""
122 return self._get_bit(SENSORS_TEMP_DIS_BIT)
124 @temp_dis.setter
125 def temp_dis(self, value: bool) -> None:
126 self._set_bit(SENSORS_TEMP_DIS_BIT, value)
128 @property
129 def laser_dis(self) -> bool:
130 """Laser detection disable (bit 7)."""
131 return self._get_bit(SENSORS_LASER_DIS_BIT)
133 @laser_dis.setter
134 def laser_dis(self, value: bool) -> None:
135 self._set_bit(SENSORS_LASER_DIS_BIT, value)
137 @property
138 def emp_dis(self) -> bool:
139 """EMP detection disable (bit 8)."""
140 return self._get_bit(SENSORS_EMP_DIS_BIT)
142 @emp_dis.setter
143 def emp_dis(self, value: bool) -> None:
144 self._set_bit(SENSORS_EMP_DIS_BIT, value)
146 @property
147 def cpu_alert_dis(self) -> bool:
148 """CPU alert disable (bit 9)."""
149 return self._get_bit(SENSORS_CPU_ALERT_DIS_BIT)
151 @cpu_alert_dis.setter
152 def cpu_alert_dis(self, value: bool) -> None:
153 self._set_bit(SENSORS_CPU_ALERT_DIS_BIT, value)
155 @property
156 def bf_pin_ver_dis(self) -> bool:
157 """Bit-flip PIN verification disable (bit 10)."""
158 return self._get_bit(SENSORS_BF_PIN_VER_DIS_BIT)
160 @bf_pin_ver_dis.setter
161 def bf_pin_ver_dis(self, value: bool) -> None:
162 self._set_bit(SENSORS_BF_PIN_VER_DIS_BIT, value)
164 @property
165 def bf_scb_dis(self) -> bool:
166 """Bit-flip SCB disable (bit 11)."""
167 return self._get_bit(SENSORS_BF_SCB_DIS_BIT)
169 @bf_scb_dis.setter
170 def bf_scb_dis(self, value: bool) -> None:
171 self._set_bit(SENSORS_BF_SCB_DIS_BIT, value)
173 @property
174 def bf_cpb_dis(self) -> bool:
175 """Bit-flip CPB disable (bit 12)."""
176 return self._get_bit(SENSORS_BF_CPB_DIS_BIT)
178 @bf_cpb_dis.setter
179 def bf_cpb_dis(self, value: bool) -> None:
180 self._set_bit(SENSORS_BF_CPB_DIS_BIT, value)
182 @property
183 def bf_ecc_dis(self) -> bool:
184 """Bit-flip ECC disable (bit 13)."""
185 return self._get_bit(SENSORS_BF_ECC_DIS_BIT)
187 @bf_ecc_dis.setter
188 def bf_ecc_dis(self, value: bool) -> None:
189 self._set_bit(SENSORS_BF_ECC_DIS_BIT, value)
191 @property
192 def bf_ram_dis(self) -> bool:
193 """Bit-flip RAM disable (bit 14)."""
194 return self._get_bit(SENSORS_BF_RAM_DIS_BIT)
196 @bf_ram_dis.setter
197 def bf_ram_dis(self, value: bool) -> None:
198 self._set_bit(SENSORS_BF_RAM_DIS_BIT, value)
200 @property
201 def bf_ekdb_dis(self) -> bool:
202 """Bit-flip EKDB disable (bit 15)."""
203 return self._get_bit(SENSORS_BF_EKDB_DIS_BIT)
205 @bf_ekdb_dis.setter
206 def bf_ekdb_dis(self, value: bool) -> None:
207 self._set_bit(SENSORS_BF_EKDB_DIS_BIT, value)
209 @property
210 def bf_imem_dis(self) -> bool:
211 """Bit-flip instruction memory disable (bit 16)."""
212 return self._get_bit(SENSORS_BF_IMEM_DIS_BIT)
214 @bf_imem_dis.setter
215 def bf_imem_dis(self, value: bool) -> None:
216 self._set_bit(SENSORS_BF_IMEM_DIS_BIT, value)
218 @property
219 def bf_platform_dis(self) -> bool:
220 """Bit-flip platform disable (bit 17)."""
221 return self._get_bit(SENSORS_BF_PLATFORM_DIS_BIT)
223 @bf_platform_dis.setter
224 def bf_platform_dis(self, value: bool) -> None:
225 self._set_bit(SENSORS_BF_PLATFORM_DIS_BIT, value)
227 def to_dict(self) -> dict:
228 """Export fields as dictionary.
230 :returns: Configuration fields and their values
231 :rtype: dict
232 """
233 return {
234 'ptrng0_test_dis': self.ptrng0_test_dis,
235 'ptrng1_test_dis': self.ptrng1_test_dis,
236 'oscmon_dis': self.oscmon_dis,
237 'shield_dis': self.shield_dis,
238 'vmon_dis': self.vmon_dis,
239 'glitch_dis': self.glitch_dis,
240 'temp_dis': self.temp_dis,
241 'laser_dis': self.laser_dis,
242 'emp_dis': self.emp_dis,
243 'cpu_alert_dis': self.cpu_alert_dis,
244 'bf_pin_ver_dis': self.bf_pin_ver_dis,
245 'bf_scb_dis': self.bf_scb_dis,
246 'bf_cpb_dis': self.bf_cpb_dis,
247 'bf_ecc_dis': self.bf_ecc_dis,
248 'bf_ram_dis': self.bf_ram_dis,
249 'bf_ekdb_dis': self.bf_ekdb_dis,
250 'bf_imem_dis': self.bf_imem_dis,
251 'bf_platform_dis': self.bf_platform_dis
252 }
254 def __str__(self) -> str:
255 """Human-readable representation."""
256 fields = self.to_dict()
257 enabled_sensors = [k for k, v in fields.items() if not v]
258 disabled_sensors = [k for k, v in fields.items() if v]
259 return "SensorsConfig({} enabled, {} disabled)".format(
260 len(enabled_sensors), len(disabled_sensors))