mirror of
https://github.com/zephyrproject-rtos/zephyr
synced 2025-09-09 02:33:00 +00:00
Based on review of the similar charger driver API, it's been demonstrated from the community that embedding a per value property type when fetching properties. Separating off the property types from the property values themselves also allow an array of property types to declared as static const. Break up fuel_gauge_property struct into a fuel_gauge_prop_val union and a fuel_gauge_prop_t property type as inputs into fuel gauge API functions. Signed-off-by: Aaron Massey <aaronmassey@google.com>
105 lines
3.0 KiB
C
105 lines
3.0 KiB
C
/*
|
|
* Copyright 2023 Google LLC
|
|
* Copyright 2023 Microsoft Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/syscall_handler.h>
|
|
#include <zephyr/drivers/fuel_gauge.h>
|
|
|
|
static inline int z_vrfy_fuel_gauge_get_prop(const struct device *dev, fuel_gauge_prop_t prop,
|
|
union fuel_gauge_prop_val *val)
|
|
{
|
|
union fuel_gauge_prop_val k_val;
|
|
|
|
Z_OOPS(Z_SYSCALL_DRIVER_FUEL_GAUGE(dev, get_property));
|
|
|
|
Z_OOPS(z_user_from_copy(&k_val, val, sizeof(union fuel_gauge_prop_val)));
|
|
|
|
int ret = z_impl_fuel_gauge_get_prop(dev, prop, &k_val);
|
|
|
|
Z_OOPS(z_user_to_copy(val, &k_val, sizeof(union fuel_gauge_prop_val)));
|
|
|
|
return ret;
|
|
}
|
|
|
|
#include <syscalls/fuel_gauge_get_prop_mrsh.c>
|
|
|
|
static inline int z_vrfy_fuel_gauge_get_props(const struct device *dev, fuel_gauge_prop_t *props,
|
|
union fuel_gauge_prop_val *vals, size_t len)
|
|
{
|
|
union fuel_gauge_prop_val k_vals[len];
|
|
fuel_gauge_prop_t k_props[len];
|
|
|
|
Z_OOPS(Z_SYSCALL_DRIVER_FUEL_GAUGE(dev, get_property));
|
|
|
|
Z_OOPS(z_user_from_copy(k_vals, vals, len * sizeof(union fuel_gauge_prop_val)));
|
|
Z_OOPS(z_user_from_copy(k_props, props, len * sizeof(fuel_gauge_prop_t)));
|
|
|
|
int ret = z_impl_fuel_gauge_get_props(dev, k_props, k_vals, len);
|
|
|
|
Z_OOPS(z_user_to_copy(vals, k_vals, len * sizeof(union fuel_gauge_prop_val)));
|
|
|
|
return ret;
|
|
}
|
|
|
|
#include <syscalls/fuel_gauge_get_props_mrsh.c>
|
|
|
|
static inline int z_vrfy_fuel_gauge_set_prop(const struct device *dev, fuel_gauge_prop_t prop,
|
|
union fuel_gauge_prop_val val)
|
|
{
|
|
Z_OOPS(Z_SYSCALL_DRIVER_FUEL_GAUGE(dev, set_property));
|
|
|
|
int ret = z_impl_fuel_gauge_set_prop(dev, prop, val);
|
|
|
|
return ret;
|
|
}
|
|
|
|
#include <syscalls/fuel_gauge_set_prop_mrsh.c>
|
|
|
|
static inline int z_vrfy_fuel_gauge_set_props(const struct device *dev, fuel_gauge_prop_t *props,
|
|
union fuel_gauge_prop_val *vals, size_t len)
|
|
{
|
|
union fuel_gauge_prop_val k_vals[len];
|
|
fuel_gauge_prop_t k_props[len];
|
|
|
|
Z_OOPS(Z_SYSCALL_DRIVER_FUEL_GAUGE(dev, set_property));
|
|
|
|
Z_OOPS(z_user_from_copy(k_vals, vals, len * sizeof(union fuel_gauge_prop_val)));
|
|
Z_OOPS(z_user_from_copy(k_props, props, len * sizeof(fuel_gauge_prop_t)));
|
|
|
|
int ret = z_impl_fuel_gauge_set_props(dev, k_props, k_vals, len);
|
|
|
|
/* We only copy back vals because props will never be modified */
|
|
Z_OOPS(z_user_to_copy(vals, k_vals, len * sizeof(union fuel_gauge_prop_val)));
|
|
|
|
return ret;
|
|
}
|
|
|
|
#include <syscalls/fuel_gauge_set_props_mrsh.c>
|
|
|
|
static inline int z_vrfy_fuel_gauge_get_buffer_prop(const struct device *dev,
|
|
fuel_gauge_prop_t prop, void *dst,
|
|
size_t dst_len)
|
|
{
|
|
Z_OOPS(Z_SYSCALL_DRIVER_FUEL_GAUGE(dev, get_buffer_property));
|
|
|
|
Z_OOPS(Z_SYSCALL_MEMORY_WRITE(dst, dst_len));
|
|
|
|
int ret = z_impl_fuel_gauge_get_buffer_prop(dev, prop, dst, dst_len);
|
|
|
|
return ret;
|
|
}
|
|
|
|
#include <syscalls/fuel_gauge_get_buffer_prop_mrsh.c>
|
|
|
|
static inline int z_vrfy_fuel_gauge_battery_cutoff(const struct device *dev)
|
|
{
|
|
Z_OOPS(Z_SYSCALL_DRIVER_FUEL_GAUGE(dev, battery_cutoff));
|
|
|
|
return z_impl_fuel_gauge_battery_cutoff(dev);
|
|
}
|
|
|
|
#include <syscalls/fuel_gauge_battery_cutoff_mrsh.c>
|