summaryrefslogtreecommitdiff
path: root/zephyr/emul/pwm_mock.c
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/emul/pwm_mock.c')
-rw-r--r--zephyr/emul/pwm_mock.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/zephyr/emul/pwm_mock.c b/zephyr/emul/pwm_mock.c
new file mode 100644
index 0000000000..0d32155d8f
--- /dev/null
+++ b/zephyr/emul/pwm_mock.c
@@ -0,0 +1,80 @@
+/* Copyright 2022 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#define DT_DRV_COMPAT cros_pwm_mock
+
+#include <zephyr/device.h>
+#include <zephyr/devicetree.h>
+#include <zephyr/kernel.h>
+#include <zephyr/drivers/pwm.h>
+
+#include "pwm_mock.h"
+
+#define CYCLES_PER_SEC 1000000
+
+struct pwm_mock_data {
+ uint32_t period_cycles;
+ uint32_t pulse_cycles;
+ pwm_flags_t pwm_flags;
+};
+
+static int pwm_mock_init(const struct device *dev)
+{
+ return 0;
+}
+
+static int pwm_mock_set_cycles(const struct device *dev, uint32_t channel,
+ uint32_t period_cycles, uint32_t pulse_cycles,
+ pwm_flags_t flags)
+{
+ struct pwm_mock_data *const data = dev->data;
+
+ data->period_cycles = period_cycles;
+ data->pulse_cycles = pulse_cycles;
+ data->pwm_flags = flags;
+
+ return 0;
+}
+
+static int pwm_mock_get_cycles_per_sec(const struct device *dev,
+ uint32_t channel, uint64_t *cycles)
+{
+ *cycles = CYCLES_PER_SEC;
+
+ return 0;
+}
+
+int pwm_mock_get_duty(const struct device *dev, uint32_t channel)
+{
+ struct pwm_mock_data *const data = dev->data;
+
+ if (data->period_cycles == 0) {
+ return -EINVAL;
+ }
+
+ return data->pulse_cycles * 100 / data->period_cycles;
+}
+
+pwm_flags_t pwm_mock_get_flags(const struct device *dev, uint32_t channel)
+{
+ ARG_UNUSED(channel);
+
+ struct pwm_mock_data *const data = dev->data;
+
+ return data->pwm_flags;
+}
+
+static const struct pwm_driver_api pwm_mock_api = {
+ .set_cycles = pwm_mock_set_cycles,
+ .get_cycles_per_sec = pwm_mock_get_cycles_per_sec,
+};
+
+#define INIT_PWM_MOCK(inst) \
+ static struct pwm_mock_data pwm_mock_data##inst; \
+ DEVICE_DT_INST_DEFINE(inst, &pwm_mock_init, NULL, \
+ &pwm_mock_data##inst, NULL, PRE_KERNEL_1, \
+ CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \
+ &pwm_mock_api);
+DT_INST_FOREACH_STATUS_OKAY(INIT_PWM_MOCK)