-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
drivers: sensor: current_amp: add driver
Add current sense amplifier driver. Implements zephyrproject-rtos/zephyr#60415 (cherry picked from commit 17f2046) Original-Co-authored-by: Marco Argiolas <marco.argiolas@ftpsolutions.com.au> Original-Signed-off-by: Nick Ward <nix.ward@gmail.com> GitOrigin-RevId: 17f2046 Change-Id: I951d43d93671c2c5ce988bfe646de4e5e5129bc5 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/zephyr/+/4862407 Reviewed-by: Tristan Honscheid <honscheid@google.com> Tested-by: Tristan Honscheid <honscheid@google.com> Tested-by: ChromeOS Prod (Robot) <chromeos-ci-prod@chromeos-bot.iam.gserviceaccount.com> Commit-Queue: Tristan Honscheid <honscheid@google.com>
- Loading branch information
Showing
5 changed files
with
135 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
zephyr_library() | ||
|
||
zephyr_library_sources(current_amp.c) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
# Current sense amplifier driver | ||
# | ||
# Copyright (c) 2023 FTP Technologies | ||
# | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
config CURRENT_AMP | ||
bool "Current sense amplifier driver" | ||
default y | ||
depends on DT_HAS_CURRENT_SENSE_AMPLIFIER_ENABLED | ||
depends on ADC | ||
help | ||
Enable current sense amplifier driver. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
/* | ||
* Copyright (c) 2023 FTP Technologies | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#define DT_DRV_COMPAT current_sense_amplifier | ||
|
||
#include <zephyr/drivers/adc.h> | ||
#include <zephyr/drivers/adc/current_sense_amplifier.h> | ||
#include <zephyr/drivers/sensor.h> | ||
|
||
#include <zephyr/logging/log.h> | ||
LOG_MODULE_REGISTER(current_amp, CONFIG_SENSOR_LOG_LEVEL); | ||
|
||
struct current_sense_amplifier_data { | ||
struct adc_sequence sequence; | ||
int16_t raw; | ||
}; | ||
|
||
static int fetch(const struct device *dev, enum sensor_channel chan) | ||
{ | ||
const struct current_sense_amplifier_dt_spec *config = dev->config; | ||
struct current_sense_amplifier_data *data = dev->data; | ||
int ret; | ||
|
||
if ((chan != SENSOR_CHAN_CURRENT) && (chan != SENSOR_CHAN_ALL)) { | ||
return -ENOTSUP; | ||
} | ||
|
||
ret = adc_read(config->port.dev, &data->sequence); | ||
if (ret != 0) { | ||
LOG_ERR("adc_read: %d", ret); | ||
} | ||
|
||
return ret; | ||
} | ||
|
||
static int get(const struct device *dev, enum sensor_channel chan, struct sensor_value *val) | ||
{ | ||
const struct current_sense_amplifier_dt_spec *config = dev->config; | ||
struct current_sense_amplifier_data *data = dev->data; | ||
int32_t raw_val = data->raw; | ||
int32_t i_ma; | ||
int ret; | ||
|
||
__ASSERT_NO_MSG(val != NULL); | ||
|
||
if (chan != SENSOR_CHAN_CURRENT) { | ||
return -ENOTSUP; | ||
} | ||
|
||
ret = adc_raw_to_millivolts_dt(&config->port, &raw_val); | ||
if (ret != 0) { | ||
LOG_ERR("raw_to_mv: %d", ret); | ||
return ret; | ||
} | ||
|
||
i_ma = raw_val; | ||
current_sense_amplifier_scale_dt(config, &i_ma); | ||
|
||
LOG_DBG("%d/%d, %dmV, current:%duA", data->raw, | ||
(1 << data->sequence.resolution) - 1, raw_val, i_ma); | ||
|
||
val->val1 = i_ma / 1000; | ||
val->val2 = i_ma % 1000; | ||
|
||
return 0; | ||
} | ||
|
||
static const struct sensor_driver_api current_api = { | ||
.sample_fetch = fetch, | ||
.channel_get = get, | ||
}; | ||
|
||
static int current_init(const struct device *dev) | ||
{ | ||
const struct current_sense_amplifier_dt_spec *config = dev->config; | ||
struct current_sense_amplifier_data *data = dev->data; | ||
int ret; | ||
|
||
if (!adc_is_ready_dt(&config->port)) { | ||
LOG_ERR("ADC is not ready"); | ||
return -ENODEV; | ||
} | ||
|
||
ret = adc_channel_setup_dt(&config->port); | ||
if (ret != 0) { | ||
LOG_ERR("setup: %d", ret); | ||
return ret; | ||
} | ||
|
||
ret = adc_sequence_init_dt(&config->port, &data->sequence); | ||
if (ret != 0) { | ||
LOG_ERR("sequence init: %d", ret); | ||
return ret; | ||
} | ||
|
||
data->sequence.buffer = &data->raw; | ||
data->sequence.buffer_size = sizeof(data->raw); | ||
|
||
return 0; | ||
} | ||
|
||
#define CURRENT_SENSE_AMPLIFIER_INIT(inst) \ | ||
static struct current_sense_amplifier_data current_amp_##inst##_data; \ | ||
\ | ||
static const struct current_sense_amplifier_dt_spec current_amp_##inst##_config = \ | ||
CURRENT_SENSE_AMPLIFIER_DT_SPEC_GET(DT_DRV_INST(inst)); \ | ||
\ | ||
SENSOR_DEVICE_DT_INST_DEFINE(inst, ¤t_init, NULL, ¤t_amp_##inst##_data, \ | ||
¤t_amp_##inst##_config, POST_KERNEL, \ | ||
CONFIG_SENSOR_INIT_PRIORITY, ¤t_api); | ||
|
||
DT_INST_FOREACH_STATUS_OKAY(CURRENT_SENSE_AMPLIFIER_INIT) |