diff options
author | Mega Mind <68985133+megamind4089@users.noreply.github.com> | 2020-10-06 15:52:21 +0800 |
---|---|---|
committer | Mega Mind <68985133+megamind4089@users.noreply.github.com> | 2020-10-10 08:11:46 +0800 |
commit | 4d81b10ba7047a4dbd63cfe33ac879ecf437e108 (patch) | |
tree | ce5a5dcded5c41f7dc8b2ed6d3ac0088bc843e6e /app/include/drivers/ext_power.h | |
parent | e53320a687a8b402fac3ed972a776993495a2f9a (diff) |
Added driver to control the external power output
This PR adds support to control the external power output from controllers like nice!nano, nRFMicro etc
I have implemented based on my understanding of Pete suggestion on this feature.
Testing done:
Tested by enabling and disabling the ext_power from application and verified
Verified the application does not crash with boards that does not have ext_power support
Note:
I did not test this in nice!nano since I don't have the boards. Will get help from others once the behavior PR is up
Next Steps:
Create a behavior PR to control enable/disable ext_power
Diffstat (limited to 'app/include/drivers/ext_power.h')
-rw-r--r-- | app/include/drivers/ext_power.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/app/include/drivers/ext_power.h b/app/include/drivers/ext_power.h new file mode 100644 index 0000000..6c1923e --- /dev/null +++ b/app/include/drivers/ext_power.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +#include <zephyr/types.h> +#include <stddef.h> +#include <device.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @cond INTERNAL_HIDDEN + * + * Behavior driver API definition and system call entry points. + * + * (Internal use only.) + */ + +typedef int (*ext_power_enable_t)(struct device *dev); +typedef int (*ext_power_disable_t)(struct device *dev); +typedef int (*ext_power_get_t)(struct device *dev); + +__subsystem struct ext_power_api { + ext_power_enable_t enable; + ext_power_disable_t disable; + ext_power_get_t get; +}; +/** + * @endcond + */ + +/** + * @brief Enable the external power output + * @param dev Pointer to the device structure for the driver instance. + * + * @retval 0 If successful. + * @retval Negative errno code if failure. + */ +__syscall int ext_power_enable(struct device *dev); + +static inline int z_impl_ext_power_enable(struct device *dev) { + const struct ext_power_api *api = (const struct ext_power_api *)dev->driver_api; + + if (api->enable == NULL) { + return -ENOTSUP; + } + + return api->enable(dev); +} + +/** + * @brief Disable the external power output + * @param dev Pointer to the device structure for the driver instance. + * + * @retval 0 If successful. + * @retval Negative errno code if failure. + */ +__syscall int ext_power_disable(struct device *dev); + +static inline int z_impl_ext_power_disable(struct device *dev) { + const struct ext_power_api *api = (const struct ext_power_api *)dev->driver_api; + + if (api->disable == NULL) { + return -ENOTSUP; + } + + return api->disable(dev); +} + +/** + * @brief Get the current status of the external power output + * @param dev Pointer to the device structure for the driver instance. + * + * @retval 0 If ext power is disabled. + * @retval 1 if ext power is enabled. + * @retval Negative errno code if failure. + */ +__syscall int ext_power_get(struct device *dev); + +static inline int z_impl_ext_power_get(struct device *dev) { + const struct ext_power_api *api = (const struct ext_power_api *)dev->driver_api; + + if (api->get == NULL) { + return -ENOTSUP; + } + + return api->get(dev); +} + +#ifdef __cplusplus +} +#endif + +/** + * @} + */ + +#include <syscalls/ext_power.h> |