Skip to content

Commit ec02138

Browse files
Jeppe Odgaardkartben
authored andcommitted
drivers: sensor: ti: tmp11x: add optional attribute storage
Enable optional storage of sensor attribute values in EEPROM. On reset, the device goes through a POR sequence that loads the values programmed in the EEPROM into the respective register map locations. The driver stores sample frequency, offset, oversampling, lower threshold, upper threshold, alert pin polarity, alert mode and conversion mode if the value is continuous or shutdown. The functionality has been tested with sensor shell and power cycling sensor: Test (undocumented) temperature offset is stored: ```shell uart:~$ sensor attr_set ti_tmp11x@48 ambient_temp offset 0 ti_tmp11x@48 channel=ambient_temp, attr=offset set to value=0 uart:~$ sensor get ti_tmp11x@48 ambient_temp [...] (25.523436) uart:~$ sensor attr_set ti_tmp11x@48 ambient_temp offset 50 ti_tmp11x@48 channel=ambient_temp, attr=offset set to value=50 uart:~$ sensor get ti_tmp11x@48 ambient_temp [...] (75.617186) uart:~$ [15:12:20.088] Disconnected [15:12:36.106] Connected uart:~$ sensor get ti_tmp11x@48 ambient_temp [...] (75.554686) uart:~$ sensor attr_get ti_tmp11x@48 ambient_temp offset ti_tmp11x@48(channel=ambient_temp, attr=offset) value=50.000000 ``` Test one-shot mode is not stored: ```shell uart:~$ sensor attr_set ti_tmp11x@48 ambient_temp 18 1 ti_tmp11x@48 channel=ambient_temp, attr=accel_x set to value=1 uart:~$ sensor get ti_tmp11x@48 ambient_temp [...] (75.562499) uart:~$ sensor get ti_tmp11x@48 ambient_temp Read failed [00:00:21.332,000] <wrn> sensor_compat: Failed to fetch samples uart:~$ [15:16:24.529] Disconnected [15:16:33.540] Connected uart:~$ sensor get ti_tmp11x@48 ambient_temp [...] (75.406249) uart:~$ sensor get ti_tmp11x@48 ambient_temp [...] (75.351561) ``` Signed-off-by: Jeppe Odgaard <[email protected]>
1 parent 0eebb85 commit ec02138

File tree

3 files changed

+99
-16
lines changed

3 files changed

+99
-16
lines changed

drivers/sensor/ti/tmp11x/tmp11x.c

Lines changed: 85 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define EEPROM_SIZE_REG sizeof(uint16_t)
2424
#define EEPROM_TMP117_RESERVED (2 * sizeof(uint16_t))
2525
#define EEPROM_MIN_BUSY_MS 7
26+
#define RESET_MIN_BUSY_MS 2
2627

2728
LOG_MODULE_REGISTER(TMP11X, CONFIG_SENSOR_LOG_LEVEL);
2829

@@ -311,27 +312,70 @@ static int16_t tmp11x_conv_value(const struct sensor_value *val)
311312
}
312313
}
313314

315+
static bool tmp11x_is_attr_store_supported(enum sensor_attribute attr)
316+
{
317+
switch ((int) attr) {
318+
case SENSOR_ATTR_SAMPLING_FREQUENCY:
319+
case SENSOR_ATTR_LOWER_THRESH:
320+
case SENSOR_ATTR_UPPER_THRESH:
321+
case SENSOR_ATTR_OFFSET:
322+
case SENSOR_ATTR_OVERSAMPLING:
323+
case SENSOR_ATTR_TMP11X_SHUTDOWN_MODE:
324+
case SENSOR_ATTR_TMP11X_CONTINUOUS_CONVERSION_MODE:
325+
case SENSOR_ATTR_TMP11X_ALERT_PIN_POLARITY:
326+
case SENSOR_ATTR_TMP11X_ALERT_MODE:
327+
return true;
328+
case SENSOR_ATTR_TMP11X_ONE_SHOT_MODE:
329+
return false;
330+
}
331+
332+
return false;
333+
}
334+
335+
static int tmp11x_attr_store_reload(const struct device *dev)
336+
{
337+
int await_res = tmp11x_eeprom_await(dev);
338+
int reset_res = tmp11x_reg_write(dev, TMP11X_REG_CFGR, TMP11X_CFGR_RESET);
339+
340+
k_sleep(K_MSEC(RESET_MIN_BUSY_MS));
341+
342+
return await_res != 0 ? await_res : reset_res;
343+
}
344+
314345
static int tmp11x_attr_set(const struct device *dev,
315346
enum sensor_channel chan,
316347
enum sensor_attribute attr,
317348
const struct sensor_value *val)
318349
{
350+
const struct tmp11x_dev_config *cfg = dev->config;
319351
struct tmp11x_data *drv_data = dev->data;
320352
int16_t value;
321353
uint16_t avg;
354+
int res = 0;
355+
bool store;
356+
int store_res = 0;
322357

323358
if (chan != SENSOR_CHAN_AMBIENT_TEMP) {
324359
return -ENOTSUP;
325360
}
326361

362+
store = cfg->store_attr_values && tmp11x_is_attr_store_supported(attr);
363+
if (store) {
364+
store_res = tmp11x_reg_write(dev, TMP11X_REG_EEPROM_UL, TMP11X_EEPROM_UL_UNLOCK);
365+
if (store_res != 0) {
366+
return store_res;
367+
}
368+
}
369+
327370
switch ((int)attr) {
328371
case SENSOR_ATTR_SAMPLING_FREQUENCY:
329372
value = tmp11x_conv_value(val);
330373
if (value < 0) {
331374
return value;
332375
}
333376

334-
return tmp11x_write_config(dev, TMP11X_CFGR_CONV, value);
377+
res = tmp11x_write_config(dev, TMP11X_CFGR_CONV, value);
378+
break;
335379

336380
case SENSOR_ATTR_OFFSET:
337381
if (!tmp11x_is_offset_supported(drv_data)) {
@@ -343,7 +387,8 @@ static int tmp11x_attr_set(const struct device *dev,
343387
*/
344388
value = tmp11x_sensor_value_to_reg_format(val);
345389

346-
return tmp11x_reg_write(dev, TMP117_REG_TEMP_OFFSET, value);
390+
res = tmp11x_reg_write(dev, TMP117_REG_TEMP_OFFSET, value);
391+
break;
347392

348393
case SENSOR_ATTR_OVERSAMPLING:
349394
/* sensor supports averaging 1, 8, 32 and 64 samples */
@@ -365,56 +410,79 @@ static int tmp11x_attr_set(const struct device *dev,
365410
break;
366411

367412
default:
368-
return -EINVAL;
413+
res = -EINVAL;
414+
break;
415+
}
416+
417+
if (res == 0) {
418+
res = tmp11x_write_config(dev, TMP11X_CFGR_AVG, avg);
369419
}
370-
return tmp11x_write_config(dev, TMP11X_CFGR_AVG, avg);
420+
421+
break;
422+
371423
case SENSOR_ATTR_TMP11X_SHUTDOWN_MODE:
372-
return tmp11x_write_config(dev, TMP11X_CFGR_MODE, TMP11X_MODE_SHUTDOWN);
424+
res = tmp11x_write_config(dev, TMP11X_CFGR_MODE, TMP11X_MODE_SHUTDOWN);
425+
break;
373426

374427
case SENSOR_ATTR_TMP11X_CONTINUOUS_CONVERSION_MODE:
375-
return tmp11x_write_config(dev, TMP11X_CFGR_MODE, TMP11X_MODE_CONTINUOUS);
428+
res = tmp11x_write_config(dev, TMP11X_CFGR_MODE, TMP11X_MODE_CONTINUOUS);
429+
break;
376430

377431
case SENSOR_ATTR_TMP11X_ONE_SHOT_MODE:
378-
return tmp11x_write_config(dev, TMP11X_CFGR_MODE, TMP11X_MODE_ONE_SHOT);
432+
res = tmp11x_write_config(dev, TMP11X_CFGR_MODE, TMP11X_MODE_ONE_SHOT);
433+
break;
379434

380435
#ifdef CONFIG_TMP11X_TRIGGER
381436
case SENSOR_ATTR_TMP11X_ALERT_PIN_POLARITY:
382437
if (val->val1 == TMP11X_ALERT_PIN_ACTIVE_HIGH) {
383-
return tmp11x_write_config(dev, TMP11X_CFGR_ALERT_PIN_POL,
438+
res = tmp11x_write_config(dev, TMP11X_CFGR_ALERT_PIN_POL,
384439
TMP11X_CFGR_ALERT_PIN_POL);
385440
} else {
386-
return tmp11x_write_config(dev, TMP11X_CFGR_ALERT_PIN_POL, 0);
441+
res = tmp11x_write_config(dev, TMP11X_CFGR_ALERT_PIN_POL, 0);
387442
}
443+
break;
388444

389445
case SENSOR_ATTR_TMP11X_ALERT_MODE:
390446
if (val->val1 == TMP11X_ALERT_THERM_MODE) {
391-
return tmp11x_write_config(dev, TMP11X_CFGR_ALERT_MODE,
447+
res = tmp11x_write_config(dev, TMP11X_CFGR_ALERT_MODE,
392448
TMP11X_CFGR_ALERT_MODE);
393449
} else {
394-
return tmp11x_write_config(dev, TMP11X_CFGR_ALERT_MODE, 0);
450+
res = tmp11x_write_config(dev, TMP11X_CFGR_ALERT_MODE, 0);
395451
}
452+
break;
396453

397454
case SENSOR_ATTR_UPPER_THRESH:
398455
/* Convert temperature to register format */
399456
value = tmp11x_sensor_value_to_reg_format(val);
400-
return tmp11x_reg_write(dev, TMP11X_REG_HIGH_LIM, value);
457+
res = tmp11x_reg_write(dev, TMP11X_REG_HIGH_LIM, value);
458+
break;
401459

402460
case SENSOR_ATTR_LOWER_THRESH:
403461
/* Convert temperature to register format */
404462
value = tmp11x_sensor_value_to_reg_format(val);
405-
return tmp11x_reg_write(dev, TMP11X_REG_LOW_LIM, value);
463+
res = tmp11x_reg_write(dev, TMP11X_REG_LOW_LIM, value);
464+
break;
465+
406466
case SENSOR_ATTR_TMP11X_ALERT_PIN_SELECT:
407467
if (val->val1 == TMP11X_ALERT_PIN_ALERT_SEL) {
408-
return tmp11x_write_config(dev, TMP11X_CFGR_ALERT_DR_SEL, 0);
468+
res = tmp11x_write_config(dev, TMP11X_CFGR_ALERT_DR_SEL, 0);
409469
} else {
410-
return tmp11x_write_config(dev, TMP11X_CFGR_ALERT_DR_SEL,
470+
res = tmp11x_write_config(dev, TMP11X_CFGR_ALERT_DR_SEL,
411471
TMP11X_CFGR_ALERT_DR_SEL);
412472
}
473+
break;
413474
#endif /* CONFIG_TMP11X_TRIGGER */
414475

415476
default:
416-
return -ENOTSUP;
477+
res = -ENOTSUP;
478+
break;
417479
}
480+
481+
if (store) {
482+
store_res = tmp11x_attr_store_reload(dev);
483+
}
484+
485+
return res != 0 ? res : store_res;
418486
}
419487

420488
static int tmp11x_attr_get(const struct device *dev, enum sensor_channel chan,
@@ -585,6 +653,7 @@ static int tmp11x_pm_control(const struct device *dev, enum pm_device_action act
585653
.alert_pin_polarity = DT_INST_PROP(_num, alert_polarity), \
586654
.alert_mode = DT_INST_PROP(_num, alert_mode), \
587655
.alert_dr_sel = DT_INST_PROP(_num, alert_dr_sel), \
656+
.store_attr_values = DT_INST_PROP(_num, store_attr_values), \
588657
IF_ENABLED(CONFIG_TMP11X_TRIGGER, \
589658
(.alert_gpio = GPIO_DT_SPEC_INST_GET_OR(_num, alert_gpios, {}),)) }; \
590659
PM_DEVICE_DT_INST_DEFINE(_num, tmp11x_pm_control); \

drivers/sensor/ti/tmp11x/tmp11x.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#define TMP117_DEVICE_ID 0x0117
3131
#define TMP119_DEVICE_ID 0x2117
3232

33+
#define TMP11X_CFGR_RESET BIT(1)
3334
#define TMP11X_CFGR_AVG (BIT(5) | BIT(6))
3435
#define TMP11X_CFGR_CONV (BIT(7) | BIT(8) | BIT(9))
3536
#define TMP11X_CFGR_MODE (BIT(10) | BIT(11))
@@ -76,6 +77,7 @@ struct tmp11x_dev_config {
7677
bool alert_pin_polarity;
7778
bool alert_mode;
7879
bool alert_dr_sel;
80+
bool store_attr_values;
7981
#ifdef CONFIG_TMP11X_TRIGGER
8082
struct gpio_dt_spec alert_gpio;
8183
#endif

dts/bindings/sensor/ti,tmp11x.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,15 @@ properties:
6060
GPIO pin used for alert/interrupt functionality.
6161
Supported on TMP116, TMP117, and TMP119 devices.
6262
Alert pin functionality depends on Therm/alert modus.
63+
store-attr-values:
64+
type: boolean
65+
description: |
66+
Enable storage of sensor attribute values in EEPROM. On reset, the device
67+
goes through a POR sequence that loads the values programmed in the
68+
EEPROM into the respective register map locations.
69+
70+
The following values are supported by the sensor:
71+
High limit register, low limit register, conversion cycle time, averaging
72+
mode, conversion mode (continuous or shutdown mode), alert function mode
73+
(alert or therm mode), alert polarity, and temperature offset (not
74+
specified in datasheet).

0 commit comments

Comments
 (0)