source: rtems/cpukit/dev/i2c/sensor-lm75a.c

Last change on this file was bcef89f2, checked in by Sebastian Huber <sebastian.huber@…>, on 05/19/23 at 06:18:25

Update company name

The embedded brains GmbH & Co. KG is the legal successor of embedded
brains GmbH.

  • Property mode set to 100644
File size: 4.0 KB
Line 
1/**
2 * @file
3 *
4 * @brief Temperature Sensor LM75A Driver Implementation
5 *
6 * @ingroup I2CSensorLM75A
7 */
8
9/*
10 * Copyright (c) 2017 embedded brains GmbH & Co. KG
11 *
12 * The license and distribution terms for this file may be
13 * found in the file LICENSE in this distribution or at
14 * http://www.rtems.org/license/LICENSE.
15 */
16
17#ifdef HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21#include <dev/i2c/sensor-lm75a.h>
22
23typedef enum {
24  SENSOR_LM75A_PTR_TEMP,
25  SENSOR_LM75A_PTR_CONF,
26  SENSOR_LM75A_PTR_THYST,
27  SENSOR_LM75A_PTR_TOS
28} sensor_lm75a_ptr;
29
30static int sensor_lm75a_get_reg_8(
31  i2c_dev *dev,
32  sensor_lm75a_ptr ptr,
33  uint8_t *val
34)
35{
36  uint8_t out[1] = { ptr };
37  uint8_t in[sizeof(*val)];
38  i2c_msg msgs[2] = {
39    {
40      .addr = dev->address,
41      .flags = 0,
42      .len = (uint16_t) sizeof(out),
43      .buf = &out[0]
44    }, {
45      .addr = dev->address,
46      .flags = I2C_M_RD,
47      .len = (uint16_t) sizeof(in),
48      .buf = &in[0]
49    }
50  };
51  int err;
52
53  err = i2c_bus_transfer(dev->bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
54  *val = in[0];
55
56  return err;
57}
58
59static int sensor_lm75a_set_reg_8(
60  i2c_dev *dev,
61  sensor_lm75a_ptr ptr,
62  uint8_t val
63)
64{
65  uint8_t out[2] = { ptr, val };
66  i2c_msg msgs[1] = {
67    {
68      .addr = dev->address,
69      .flags = 0,
70      .len = (uint16_t) sizeof(out),
71      .buf = &out[0]
72    }
73  };
74
75  return i2c_bus_transfer(dev->bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
76}
77
78static int sensor_lm75a_get_reg_16(
79  i2c_dev *dev,
80  sensor_lm75a_ptr ptr,
81  uint16_t *val
82)
83{
84  uint8_t out[1] = { ptr };
85  uint8_t in[sizeof(*val)];
86  i2c_msg msgs[2] = {
87    {
88      .addr = dev->address,
89      .flags = 0,
90      .len = (uint16_t) sizeof(out),
91      .buf = &out[0]
92    }, {
93      .addr = dev->address,
94      .flags = I2C_M_RD,
95      .len = (uint16_t) sizeof(in),
96      .buf = &in[0]
97    }
98  };
99  int err;
100
101  err = i2c_bus_transfer(dev->bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
102  *val = (in[0] << 8) | in[1];
103
104  return err;
105}
106
107static int sensor_lm75a_set_reg_16(
108  i2c_dev *dev,
109  sensor_lm75a_ptr ptr,
110  uint16_t val
111)
112{
113  uint8_t out[3] = { ptr, (uint8_t) (val >> 8), (uint8_t) val };
114  i2c_msg msgs[1] = {
115    {
116      .addr = dev->address,
117      .flags = 0,
118      .len = (uint16_t) sizeof(out),
119      .buf = &out[0]
120    }
121  };
122
123  return i2c_bus_transfer(dev->bus, &msgs[0], RTEMS_ARRAY_SIZE(msgs));
124}
125
126static int sensor_lm75a_ioctl(
127  i2c_dev *dev,
128  ioctl_command_t command,
129  void *arg
130)
131{
132  uint8_t v8 = (uint8_t) (uintptr_t) arg;
133  uint16_t v16 = (uint16_t) (uintptr_t) arg;
134  int err;
135
136  switch (command) {
137    case SENSOR_LM75A_GET_CONF:
138      err = sensor_lm75a_get_reg_8(dev, SENSOR_LM75A_PTR_CONF, arg);
139      break;
140    case SENSOR_LM75A_SET_CONF:
141      err = sensor_lm75a_set_reg_8(dev, SENSOR_LM75A_PTR_CONF, v8);
142      break;
143    case SENSOR_LM75A_CLEAR_AND_SET_CONF:
144      i2c_bus_obtain(dev->bus);
145      err = sensor_lm75a_get_reg_8(dev, SENSOR_LM75A_PTR_CONF, &v8);
146      if (err == 0) {
147        v8 &= ~((uint8_t) v16);
148        v8 |= (uint8_t) (v16 >> 8);
149        err = sensor_lm75a_set_reg_8(dev, SENSOR_LM75A_PTR_CONF, v8);
150      }
151      i2c_bus_release(dev->bus);
152      break;
153    case SENSOR_LM75A_GET_TEMP:
154      err = sensor_lm75a_get_reg_16(dev, SENSOR_LM75A_PTR_TEMP, arg);
155      break;
156    case SENSOR_LM75A_GET_TOS:
157      err = sensor_lm75a_get_reg_16(dev, SENSOR_LM75A_PTR_TOS, arg);
158      break;
159    case SENSOR_LM75A_SET_TOS:
160      err = sensor_lm75a_set_reg_16(dev, SENSOR_LM75A_PTR_TOS, v16);
161      break;
162    case SENSOR_LM75A_GET_THYST:
163      err = sensor_lm75a_get_reg_16(dev, SENSOR_LM75A_PTR_THYST, arg);
164      break;
165    case SENSOR_LM75A_SET_THYST:
166      err = sensor_lm75a_set_reg_16(dev, SENSOR_LM75A_PTR_THYST, v16);
167      break;
168    default:
169      err = -ENOTTY;
170      break;
171  }
172
173  return err;
174}
175
176int i2c_dev_register_sensor_lm75a(
177  const char *bus_path,
178  const char *dev_path,
179  uint16_t address
180)
181{
182  i2c_dev *dev;
183
184  dev = i2c_dev_alloc_and_init(sizeof(*dev), bus_path, address);
185  if (dev == NULL) {
186    return -1;
187  }
188
189  dev->ioctl = sensor_lm75a_ioctl;
190
191  return i2c_dev_register(dev, dev_path);
192}
Note: See TracBrowser for help on using the repository browser.