134 lines
3.5 KiB
C
134 lines
3.5 KiB
C
|
/*
|
||
|
* Copyright (c) 2020 Google LLC.
|
||
|
*
|
||
|
* SPDX-License-Identifier: Apache-2.0
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @file
|
||
|
* @brief Public APIs for Host Command Peripherals that respond to host commands
|
||
|
*/
|
||
|
|
||
|
#ifndef ZEPHYR_INCLUDE_DRIVERS_HOST_CMD_PERIPH_H_
|
||
|
#define ZEPHYR_INCLUDE_DRIVERS_HOST_CMD_PERIPH_H_
|
||
|
|
||
|
#include <sys/__assert.h>
|
||
|
#include <zephyr/types.h>
|
||
|
#include <device.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* @brief Host Command Peripherals API
|
||
|
* @defgroup ec_host_cmd_periph Host Command Peripherals API
|
||
|
* @ingroup io_interfaces
|
||
|
* @{
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @brief Context for host command peripheral and framework to pass rx data
|
||
|
*/
|
||
|
struct ec_host_cmd_periph_rx_ctx {
|
||
|
/** Buffer written to by device (when dev_owns) and read from by
|
||
|
* command framework and handler (when handler_owns). Buffer is owned
|
||
|
* by devices and lives as long as device is valid. Device will never
|
||
|
* read from this buffer (for security reasons).
|
||
|
*/
|
||
|
uint8_t *buf;
|
||
|
/** Number of bytes written to @a buf by device (when dev_owns). */
|
||
|
size_t *len;
|
||
|
/** Device will take when it needs to write to @a buf and @a size. */
|
||
|
struct k_sem *dev_owns;
|
||
|
/** Handler will take so it can read @a buf and @a size */
|
||
|
struct k_sem *handler_owns;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Context for host command peripheral and framework to pass tx data
|
||
|
*/
|
||
|
struct ec_host_cmd_periph_tx_buf {
|
||
|
/** Data to write to the host */
|
||
|
void *buf;
|
||
|
/** Number of bytes to write from @a buf */
|
||
|
size_t len;
|
||
|
};
|
||
|
|
||
|
typedef int (*ec_host_cmd_periph_api_init)(
|
||
|
const struct device *dev, struct ec_host_cmd_periph_rx_ctx *rx_ctx);
|
||
|
|
||
|
typedef int (*ec_host_cmd_periph_api_send)(
|
||
|
const struct device *dev,
|
||
|
const struct ec_host_cmd_periph_tx_buf *tx_buf);
|
||
|
|
||
|
__subsystem struct ec_host_cmd_periph_api {
|
||
|
ec_host_cmd_periph_api_init init;
|
||
|
ec_host_cmd_periph_api_send send;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* @brief Initialize a host command device
|
||
|
*
|
||
|
* This routine initializes a host command device, prior to its first use. The
|
||
|
* receive context object are an output of this function and are valid
|
||
|
* for the lifetime of this device. The RX context is used by the client to
|
||
|
* receive data from the host.
|
||
|
*
|
||
|
* @param dev Pointer to the device structure for the driver instance.
|
||
|
* @param rx_ctx [out] The receiving context object that are valid for the
|
||
|
* lifetime of the device. These objects are used to receive data
|
||
|
* from the driver when the host send data.
|
||
|
*
|
||
|
* @retval 0 if successful
|
||
|
*/
|
||
|
__syscall int ec_host_cmd_periph_init(const struct device *dev,
|
||
|
struct ec_host_cmd_periph_rx_ctx *rx_ctx);
|
||
|
|
||
|
static inline int
|
||
|
z_impl_ec_host_cmd_periph_init(const struct device *dev,
|
||
|
struct ec_host_cmd_periph_rx_ctx *rx_ctx)
|
||
|
{
|
||
|
const struct ec_host_cmd_periph_api *api =
|
||
|
(const struct ec_host_cmd_periph_api *)dev->api;
|
||
|
|
||
|
return api->init(dev, rx_ctx);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Sends the specified data to the host
|
||
|
*
|
||
|
* Sends the data specified in @a tx_buf to the host over the host communication
|
||
|
* bus.
|
||
|
*
|
||
|
* @param dev Pointer to the device structure for the driver instance.
|
||
|
* @param tx_buf The data to transmit to the host.
|
||
|
*
|
||
|
* @retval 0 if successful
|
||
|
*/
|
||
|
__syscall int ec_host_cmd_periph_send(
|
||
|
const struct device *dev,
|
||
|
const struct ec_host_cmd_periph_tx_buf *tx_buf);
|
||
|
|
||
|
static inline int z_impl_ec_host_cmd_periph_send(
|
||
|
const struct device *dev,
|
||
|
const struct ec_host_cmd_periph_tx_buf *tx_buf)
|
||
|
{
|
||
|
const struct ec_host_cmd_periph_api *api =
|
||
|
(const struct ec_host_cmd_periph_api *)dev->api;
|
||
|
|
||
|
return api->send(dev, tx_buf);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @}
|
||
|
*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#include <syscalls/ec_host_cmd_periph.h>
|
||
|
|
||
|
#endif /* ZEPHYR_INCLUDE_DRIVERS_HOST_CMD_PERIPH_H_ */
|