@@ -71,6 +71,31 @@ static inline bool tmp11x_is_offset_supported(const struct tmp11x_data *drv_data
71
71
return drv_data -> id == TMP117_DEVICE_ID || drv_data -> id == TMP119_DEVICE_ID ;
72
72
}
73
73
74
+ /**
75
+ * @brief Convert sensor_value temperature to TMP11X register format
76
+ *
77
+ * This function converts a temperature from sensor_value format (val1 in degrees C,
78
+ * val2 in micro-degrees C) to the TMP11X register format. It uses 64-bit arithmetic
79
+ * to prevent overflow and clamps the result to the valid int16_t range.
80
+ *
81
+ * @param val Pointer to sensor_value containing temperature
82
+ * @return Temperature value in TMP11X register format (int16_t)
83
+ */
84
+ static inline int16_t tmp11x_sensor_value_to_reg_format (const struct sensor_value * val )
85
+ {
86
+ int64_t temp_micro = ((int64_t )val -> val1 * 1000000 ) + val -> val2 ;
87
+ int64_t temp_scaled = (temp_micro * 10 ) / TMP11X_RESOLUTION ;
88
+
89
+ /* Clamp to int16_t range */
90
+ if (temp_scaled > INT16_MAX ) {
91
+ return INT16_MAX ;
92
+ } else if (temp_scaled < INT16_MIN ) {
93
+ return INT16_MIN ;
94
+ } else {
95
+ return (int16_t )temp_scaled ;
96
+ }
97
+ }
98
+
74
99
static bool check_eeprom_bounds (const struct device * dev , off_t offset ,
75
100
size_t len )
76
101
{
@@ -310,8 +335,7 @@ static int tmp11x_attr_set(const struct device *dev,
310
335
/*
311
336
* The offset is encoded into the temperature register format.
312
337
*/
313
- value = (((val -> val1 ) * 10000000 ) + ((val -> val2 ) * 10 ))
314
- / (int32_t )TMP11X_RESOLUTION ;
338
+ value = tmp11x_sensor_value_to_reg_format (val );
315
339
316
340
return tmp11x_reg_write (dev , TMP117_REG_TEMP_OFFSET , value );
317
341
@@ -347,6 +371,34 @@ static int tmp11x_attr_set(const struct device *dev,
347
371
case SENSOR_ATTR_TMP11X_ONE_SHOT_MODE :
348
372
return tmp11x_write_config (dev , TMP11X_CFGR_MODE , TMP11X_MODE_ONE_SHOT );
349
373
374
+ #ifdef CONFIG_TMP11X_TRIGGER
375
+ case SENSOR_ATTR_TMP11X_ALERT_PIN_POLARITY :
376
+ if (val -> val1 == TMP11X_ALERT_PIN_ACTIVE_HIGH ) {
377
+ return tmp11x_write_config (dev , TMP11X_CFGR_ALERT_PIN_POL ,
378
+ TMP11X_CFGR_ALERT_PIN_POL );
379
+ } else {
380
+ return tmp11x_write_config (dev , TMP11X_CFGR_ALERT_PIN_POL , 0 );
381
+ }
382
+
383
+ case SENSOR_ATTR_TMP11X_ALERT_PIN_MODE :
384
+ if (val -> val1 == TMP11X_ALERT_PIN_THERM_MODE ) {
385
+ return tmp11x_write_config (dev , TMP11X_CFGR_ALERT_PIN_MODE ,
386
+ TMP11X_CFGR_ALERT_PIN_MODE );
387
+ } else {
388
+ return tmp11x_write_config (dev , TMP11X_CFGR_ALERT_PIN_MODE , 0 );
389
+ }
390
+
391
+ case SENSOR_ATTR_UPPER_THRESH :
392
+ /* Convert temperature to register format */
393
+ value = tmp11x_sensor_value_to_reg_format (val );
394
+ return tmp11x_reg_write (dev , TMP11X_REG_HIGH_LIM , value );
395
+
396
+ case SENSOR_ATTR_LOWER_THRESH :
397
+ /* Convert temperature to register format */
398
+ value = tmp11x_sensor_value_to_reg_format (val );
399
+ return tmp11x_reg_write (dev , TMP11X_REG_LOW_LIM , value );
400
+ #endif /* CONFIG_TMP11X_TRIGGER */
401
+
350
402
default :
351
403
return - ENOTSUP ;
352
404
}
@@ -385,6 +437,25 @@ static int tmp11x_attr_get(const struct device *dev, enum sensor_channel chan,
385
437
}
386
438
387
439
return rc ;
440
+
441
+ #ifdef CONFIG_TMP11X_TRIGGER
442
+ case SENSOR_ATTR_UPPER_THRESH :
443
+ rc = tmp11x_reg_read (dev , TMP11X_REG_HIGH_LIM , & data );
444
+ if (rc == 0 ) {
445
+ tmp11x_temperature_to_sensor_value (data , val );
446
+ }
447
+
448
+ return rc ;
449
+
450
+ case SENSOR_ATTR_LOWER_THRESH :
451
+ rc = tmp11x_reg_read (dev , TMP11X_REG_LOW_LIM , & data );
452
+ if (rc == 0 ) {
453
+ tmp11x_temperature_to_sensor_value (data , val );
454
+ }
455
+
456
+ return rc ;
457
+ #endif /* CONFIG_TMP11X_TRIGGER */
458
+
388
459
default :
389
460
return - ENOTSUP ;
390
461
}
@@ -394,7 +465,10 @@ static DEVICE_API(sensor, tmp11x_driver_api) = {
394
465
.attr_set = tmp11x_attr_set ,
395
466
.attr_get = tmp11x_attr_get ,
396
467
.sample_fetch = tmp11x_sample_fetch ,
397
- .channel_get = tmp11x_channel_get
468
+ .channel_get = tmp11x_channel_get ,
469
+ #ifdef CONFIG_TMP11X_TRIGGER
470
+ .trigger_set = tmp11x_trigger_set ,
471
+ #endif
398
472
};
399
473
400
474
static int tmp11x_init (const struct device * dev )
@@ -424,18 +498,28 @@ static int tmp11x_init(const struct device *dev)
424
498
425
499
rc = tmp11x_write_config (dev , TMP11X_CFGR_AVG , cfg -> oversampling );
426
500
501
+ #ifdef CONFIG_TMP11X_TRIGGER
502
+ drv_data -> dev = dev ;
503
+ rc = tmp11x_init_interrupt (dev );
504
+ if (rc < 0 ) {
505
+ LOG_ERR ("%s: Failed to initialize alert pin" , dev -> name );
506
+ return rc ;
507
+ }
508
+ #endif /* CONFIG_TMP11X_TRIGGER */
509
+
427
510
return rc ;
428
511
}
429
512
430
- #define DEFINE_TMP11X (_num ) \
431
- static struct tmp11x_data tmp11x_data_##_num; \
432
- static const struct tmp11x_dev_config tmp11x_config_##_num = { \
433
- .bus = I2C_DT_SPEC_INST_GET(_num), \
434
- .odr = DT_INST_PROP(_num, odr), \
435
- .oversampling = DT_INST_PROP(_num, oversampling), \
436
- }; \
437
- SENSOR_DEVICE_DT_INST_DEFINE(_num, tmp11x_init, NULL, \
438
- &tmp11x_data_##_num, &tmp11x_config_##_num, POST_KERNEL, \
439
- CONFIG_SENSOR_INIT_PRIORITY, &tmp11x_driver_api);
513
+ #define DEFINE_TMP11X (_num ) \
514
+ static struct tmp11x_data tmp11x_data_##_num; \
515
+ static const struct tmp11x_dev_config tmp11x_config_##_num = { \
516
+ .bus = I2C_DT_SPEC_INST_GET(_num), \
517
+ .odr = DT_INST_PROP(_num, odr), \
518
+ .oversampling = DT_INST_PROP(_num, oversampling), \
519
+ IF_ENABLED(CONFIG_TMP11X_TRIGGER, \
520
+ (.alert_gpio = GPIO_DT_SPEC_INST_GET_OR(_num, alert_gpios, {}),)) }; \
521
+ SENSOR_DEVICE_DT_INST_DEFINE(_num, tmp11x_init, NULL, &tmp11x_data_##_num, \
522
+ &tmp11x_config_##_num, POST_KERNEL, \
523
+ CONFIG_SENSOR_INIT_PRIORITY, &tmp11x_driver_api);
440
524
441
525
DT_INST_FOREACH_STATUS_OKAY (DEFINE_TMP11X )
0 commit comments