/*
 * Copyright (c) 2018 Roman Tataurov <diytronic@yandex.ru>
 * Copyright (c) 2022 Thomas Stranger
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Public 1-Wire Driver APIs
 */

#ifndef ZEPHYR_INCLUDE_DRIVERS_W1_H_
#define ZEPHYR_INCLUDE_DRIVERS_W1_H_

#include <zephyr/types.h>
#include <zephyr/device.h>
#include <zephyr/sys/crc.h>
#include <zephyr/sys/byteorder.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 1-Wire Interface
 * @defgroup w1_interface 1-Wire Interface
 * @ingroup io_interfaces
 * @{
 */

/**  @cond INTERNAL_HIDDEN */

/*
 * Count the number of slaves expected on the bus.
 * This can be used to decide if the bus has a multidrop topology or
 * only a single slave is present.
 * There is a comma after each ordinal (including the last)
 * Hence FOR_EACH adds "+1" once too often which has to be subtracted in the end.
 */
#define F1(x) 1
#define W1_SLAVE_COUNT(node_id) \
		(FOR_EACH(F1, (+), DT_SUPPORTS_DEP_ORDS(node_id)) - 1)
#define W1_INST_SLAVE_COUNT(inst)  \
		(W1_SLAVE_COUNT(DT_DRV_INST(inst)))

/** @endcond */

/**
 * @brief Defines the 1-Wire master settings types, which are runtime configurable.
 */
enum w1_settings_type {
	/** Overdrive speed is enabled in case a value of 1 is passed and
	 * disabled passing 0.
	 */
	W1_SETTING_SPEED,
	/**
	 * The strong pullup resistor is activated immediately after the next
	 * written data block by passing a value of 1, and deactivated passing 0.
	 */
	W1_SETTING_STRONG_PULLUP,

	/**
	 * Number of different settings types.
	 */
	W1_SETINGS_TYPE_COUNT,
};

/**  @cond INTERNAL_HIDDEN */

/** Configuration common to all 1-Wire master implementations. */
struct w1_master_config {
	/* Number of connected slaves */
	uint16_t slave_count;
};

/** Data common to all 1-Wire master implementations. */
struct w1_master_data {
	/* The mutex used by w1_lock_bus and w1_unlock_bus methods */
	struct k_mutex bus_lock;
};

typedef int (*w1_reset_bus_t)(const struct device *dev);
typedef int (*w1_read_bit_t)(const struct device *dev);
typedef int (*w1_write_bit_t)(const struct device *dev, bool bit);
typedef int (*w1_read_byte_t)(const struct device *dev);
typedef int (*w1_write_byte_t)(const struct device *dev, const uint8_t byte);
typedef int (*w1_read_block_t)(const struct device *dev, uint8_t *buffer,
			       size_t len);
typedef int (*w1_write_block_t)(const struct device *dev, const uint8_t *buffer,
				size_t len);
typedef size_t (*w1_get_slave_count_t)(const struct device *dev);
typedef int (*w1_configure_t)(const struct device *dev,
			      enum w1_settings_type type, uint32_t value);

__subsystem struct w1_driver_api {
	w1_reset_bus_t reset_bus;
	w1_read_bit_t read_bit;
	w1_write_bit_t write_bit;
	w1_read_byte_t read_byte;
	w1_write_byte_t write_byte;
	w1_read_block_t read_block;
	w1_write_block_t write_block;
	w1_configure_t configure;
};
/** @endcond */

/** @cond INTERNAL_HIDDEN */
__syscall int w1_change_bus_lock(const struct device *dev, bool lock);

static inline int z_impl_w1_change_bus_lock(const struct device *dev, bool lock)
{
	struct w1_master_data *ctrl_data = (struct w1_master_data *)dev->data;

	if (lock) {
		return k_mutex_lock(&ctrl_data->bus_lock, K_FOREVER);
	} else {
		return k_mutex_unlock(&ctrl_data->bus_lock);
	}
}
/** @endcond */

/**
 * @brief Lock the 1-wire bus to prevent simultaneous access.
 *
 * This routine locks the bus to prevent simultaneous access from different
 * threads. The calling thread waits until the bus becomes available.
 * A thread is permitted to lock a mutex it has already locked.
 *
 * @param[in] dev Pointer to the device structure for the driver instance.
 *
 * @retval        0 If successful.
 * @retval -errno Negative error code on error.
 */
static inline int w1_lock_bus(const struct device *dev)
{
	return w1_change_bus_lock(dev, true);
}

/**
 * @brief Unlock the 1-wire bus.
 *
 * This routine unlocks the bus to permit access to bus line.
 *
 * @param[in] dev Pointer to the device structure for the driver instance.
 *
 * @retval 0      If successful.
 * @retval -errno Negative error code on error.
 */
static inline int w1_unlock_bus(const struct device *dev)
{
	return w1_change_bus_lock(dev, false);
}

/**
 * @brief 1-Wire data link layer
 * @defgroup w1_data_link 1-Wire data link layer
 * @ingroup w1_interface
 * @{
 */

/**
 * @brief Reset the 1-Wire bus to prepare slaves for communication.
 *
 * This routine resets all 1-Wire bus slaves such that they are
 * ready to receive a command.
 * Connected slaves answer with a presence pulse once they are ready
 * to receive data.
 *
 * In case the driver supports both standard speed and overdrive speed,
 * the reset routine takes care of sendig either a short or a long reset pulse
 * depending on the current state. The speed can be changed using
 * @a w1_configure().
 *
 * @param[in] dev Pointer to the device structure for the driver instance.
 *
 * @retval 0      If no slaves answer with a present pulse.
 * @retval 1      If at least one slave answers with a present pulse.
 * @retval -errno Negative error code on error.
 */
__syscall int w1_reset_bus(const struct device *dev);

static inline int z_impl_w1_reset_bus(const struct device *dev)
{
	const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;

	return api->reset_bus(dev);
}

/**
 * @brief Read a single bit from the 1-Wire bus.
 *
 * @param[in] dev Pointer to the device structure for the driver instance.
 *
 * @retval rx_bit The read bit value on success.
 * @retval -errno Negative error code on error.
 */
__syscall int w1_read_bit(const struct device *dev);

static inline int z_impl_w1_read_bit(const struct device *dev)
{
	const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;

	return api->read_bit(dev);
}

/**
 * @brief Write a single bit to the 1-Wire bus.
 *
 * @param[in] dev Pointer to the device structure for the driver instance.
 * @param bit     Transmitting bit value 1 or 0.
 *
 * @retval 0      If successful.
 * @retval -errno Negative error code on error.
 */
__syscall int w1_write_bit(const struct device *dev, const bool bit);

static inline int z_impl_w1_write_bit(const struct device *dev, bool bit)
{
	const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;

	return api->write_bit(dev, bit);
}

/**
 * @brief Read a single byte from the 1-Wire bus.
 *
 * @param[in] dev Pointer to the device structure for the driver instance.
 *
 * @retval rx_byte The read byte value on success.
 * @retval -errno  Negative error code on error.
 */
__syscall int w1_read_byte(const struct device *dev);

static inline int z_impl_w1_read_byte(const struct device *dev)
{
	const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;

	return api->read_byte(dev);
}

/**
 * @brief Write a single byte to the 1-Wire bus.
 *
 * @param[in] dev Pointer to the device structure for the driver instance.
 * @param byte    Transmitting byte.
 *
 * @retval 0      If successful.
 * @retval -errno Negative error code on error.
 */
__syscall int w1_write_byte(const struct device *dev, uint8_t byte);

static inline int z_impl_w1_write_byte(const struct device *dev, uint8_t byte)
{
	const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;

	return api->write_byte(dev, byte);
}

/**
 * @brief Read a block of data from the 1-Wire bus.
 *
 * @param[in] dev     Pointer to the device structure for the driver instance.
 * @param[out] buffer Pointer to receive buffer.
 * @param len         Length of receiving buffer (in bytes).
 *
 * @retval 0      If successful.
 * @retval -errno Negative error code on error.
 */
__syscall int w1_read_block(const struct device *dev, uint8_t *buffer, size_t len);

/**
 * @brief Write a block of data from the 1-Wire bus.
 *
 * @param[in] dev    Pointer to the device structure for the driver instance.
 * @param[in] buffer Pointer to transmitting buffer.
 * @param len        Length of transmitting buffer (in bytes).
 *
 * @retval 0      If successful.
 * @retval -errno Negative error code on error.
 */
__syscall int w1_write_block(const struct device *dev,
			     const uint8_t *buffer, size_t len);

/**
 * @brief Get the number of slaves on the bus.
 *
 * @param[in] dev  Pointer to the device structure for the driver instance.
 *
 * @retval slave_count  Positive Number of connected 1-Wire slaves on success.
 * @retval -errno       Negative error code on error.
 */
__syscall size_t w1_get_slave_count(const struct device *dev);

static inline size_t z_impl_w1_get_slave_count(const struct device *dev)
{
	const struct w1_master_config *ctrl_cfg =
		(const struct w1_master_config *)dev->config;

	return ctrl_cfg->slave_count;
}

/**
 * @brief Configure parameters of the 1-Wire master.
 *
 * Allowed configuration parameters are defined in enum w1_settings_type,
 * but master devices may not support all types.
 *
 * @param[in] dev  Pointer to the device structure for the driver instance.
 * @param type     Enum specifying the setting type.
 * @param value    The new value for the passed settings type.
 *
 * @retval 0        If successful.
 * @retval -ENOTSUP The master doesn't support the configuration of the supplied type.
 * @retval -EIO     General input / output error, failed to configure master devices.
 */
__syscall int w1_configure(const struct device *dev,
			   enum w1_settings_type type, uint32_t value);

static inline int z_impl_w1_configure(const struct device *dev,
				      enum w1_settings_type type, uint32_t value)
{
	const struct w1_driver_api *api = (const struct w1_driver_api *)dev->api;

	return api->configure(dev, type, value);
}

/**
 * @}
 */

/**
 * @brief 1-Wire network layer
 * @defgroup w1_network 1-Wire network layer
 * @ingroup w1_interface
 * @{
 */

/**
 * @name 1-Wire ROM Commands
 * @{
 */
#define W1_CMD_SKIP_ROM			0xCC
#define W1_CMD_MATCH_ROM		0x55
#define W1_CMD_RESUME			0xA5
#define W1_CMD_READ_ROM			0x33
#define W1_CMD_SEARCH_ROM		0xF0
#define W1_CMD_SEARCH_ALARM		0xEC
#define W1_CMD_OVERDRIVE_SKIP_ROM	0x3C
#define W1_CMD_OVERDRIVE_MATCH_ROM	0x69

/** @} */

/**
 * @name CRC Defines
 * @{
 */

/** Seed value used to calculate the 1-Wire 8-bit crc. */
#define W1_CRC8_SEED		0x00
/** Polynomial used to calculate the 1-Wire 8-bit crc. */
#define W1_CRC8_POLYNOMIAL	0x8C
/** Seed value used to calculate the 1-Wire 16-bit crc. */
#define W1_CRC16_SEED		0x0000
/** Polynomial used to calculate the 1-Wire 16-bit crc. */
#define W1_CRC16_POLYNOMIAL	0xa001

/** @} */

/** This flag can be passed to searches in order to not filter on family ID. */
#define W1_SEARCH_ALL_FAMILIES		0x00

/** Intitialize all w1_rom struct members to zero. */
#define W1_ROM_INIT_ZERO					\
	{							\
		.family = 0, .serial = { 0 }, .crc = 0,		\
	}

/**
 * @brief w1_rom struct.
 */
struct w1_rom {
	/** @brief The 1-Wire family code identifying the slave device type.
	 *
	 * An incomplete list of family codes is available at:
	 * https://www.maximintegrated.com/en/app-notes/index.mvp/id/155
	 * others are documented in the respective device data sheet.
	 */
	uint8_t family;
	/** The serial together with the family code composes the unique 56-bit id */
	uint8_t serial[6];
	/** 8-bit checksum of the 56-bit unique id. */
	uint8_t crc;
};

/**
 * @brief Node specific 1-wire configuration struct.
 *
 * This struct is passed to network functions, such that they can configure
 * the bus to address the specific slave using the selected speed.
 */
struct w1_slave_config {
	/** Unique 1-Wire ROM. */
	struct w1_rom rom;
	/** overdrive speed is used if set to 1. */
	uint32_t overdrive : 1;
	/** @cond INTERNAL_HIDDEN */
	uint32_t res : 31;
	/** @endcond */
};

/**
 * @brief Define the application callback handler function signature
 *        for searches.
 *
 * @param rom found The ROM of the found slave.
 * @param user_data User data provided to the w1_search_bus() call.
 */
typedef void (*w1_search_callback_t)(struct w1_rom rom, void *user_data);

/**
 * @brief Read Peripheral 64-bit ROM.
 *
 * This procedure allows the 1-Wire bus master to read the peripherals’
 * 64-bit ROM without using the Search ROM procedure.
 * This command can be used as long as not more than a sigle peripheral is
 * connected to the bus.
 * Otherwise data collisons occur and a faulty ROM is read.
 *
 * @param[in] dev  Pointer to the device structure for the driver instance.
 * @param[out] rom Pointer to the ROM structure.
 *
 * @retval 0       If successful.
 * @retval -ENODEV In case no slave responds to reset.
 * @retval -errno  Other negative error code in case of invalid crc and
 *         communication errors.
 */
int w1_read_rom(const struct device *dev, struct w1_rom *rom);

/**
 * @brief Select a specific slave by broadcasting a selected ROM.
 *
 * This routine allows the 1-Wire bus master to select a slave
 * identified by its unique ROM, such that the next command will target only
 * this single selected slave.
 *
 * This command is only necessary in multidrop environments, otherwise the
 * Skip ROM command can be issued.
 * Once a slave has been selected, to reduce the communication overhead, the
 * resume command can be used instead of this command to communicate with the
 * selected slave.
 *
 * @param[in] dev    Pointer to the device structure for the driver instance.
 * @param[in] config Pointer to the slave specific 1-Wire config.
 *
 * @retval 0       If successful.
 * @retval -ENODEV In case no slave responds to reset.
 * @retval -errno  Other negative error code on error.
 */
int w1_match_rom(const struct device *dev, const struct w1_slave_config *config);

/**
 * @brief Select the slave last addressed with a Match ROM or Search ROM commnad.
 *
 * This routine allows the 1-Wire bus master to re-select a slave
 * device that was already addressed using a Match ROM or Search ROM command.
 *
 * @param dev     Pointer to the device structure for the driver instance.
 *
 * @retval 0       If successful.
 * @retval -ENODEV In case no slave responds to reset.
 * @retval -errno  Other negative error code on error.
 */
int w1_resume_command(const struct device *dev);

/**
 * @brief Select all slaves regardless of ROM.
 *
 * This routine sets up the bus slaves to receive a command.
 * It is usually used when there is only one peripheral on the bus
 * to avoid the overhead of the Match ROM command.
 * But it can also be used to concurrently write to all slave devices.
 *
 * @param[in] dev    Pointer to the device structure for the driver instance.
 * @param[in] config Pointer to the slave specific 1-Wire config.
 *
 * @retval 0       If successful.
 * @retval -ENODEV In case no slave responds to reset.
 * @retval -errno  Other negative error code on error.
 */
int w1_skip_rom(const struct device *dev, const struct w1_slave_config *config);

/**
 * @brief In single drop configurations use Skip Select command, otherweise use
 *        Match ROM command.
 *
 * @param[in] dev    Pointer to the device structure for the driver instance.
 * @param[in] config Pointer to the slave specific 1-Wire config.
 *
 * @retval 0       If successful.
 * @retval -ENODEV In case no slave responds to reset.
 * @retval -errno  Other negative error code on error.
 */
int w1_reset_select(const struct device *dev, const struct w1_slave_config *config);

/**
 * @brief Write then read data from the 1-Wire slave with matching ROM.
 *
 * This routine uses w1_reset_select to select the given ROM.
 * Then writes given data and reads the response back from the slave.
 *
 * @param[in] dev       Pointer to the device structure for the driver instance.
 * @param[in] config    Pointer to the slave specific 1-Wire config.
 * @param[in] write_buf Pointer to the data to be written.
 * @param write_len     Number of bytes to write.
 * @param[out] read_buf Pointer to storage for read data.
 * @param read_len      Number of bytes to read.
 *
 * @retval 0       If successful.
 * @retval -ENODEV In case no slave responds to reset.
 * @retval -errno  Other negative error code on error.
 */
int w1_write_read(const struct device *dev, const struct w1_slave_config *config,
		  const uint8_t *write_buf, size_t write_len,
		  uint8_t *read_buf, size_t read_len);

/**
 * @brief Search 1-wire slaves on the bus.
 *
 * This function searches slaves on the 1-wire bus, with the possibility
 * to search either all slaves or only slaves that have an active alarm state.
 * If a callback is passed, the callback is called for each found slave.
 *
 * The algorithm mostly follows the suggestions of
 * https://pdfserv.maximintegrated.com/en/an/AN187.pdf
 *
 * Note: Filtering on families is not supported.
 *
 * @param[in] dev       Pointer to the device structure for the driver instance.
 * @param command       Can either be W1_SEARCH_ALARM or W1_SEARCH_ROM.
 * @param family        W1_SEARCH_ALL_FAMILIES searcheas all families,
 *                      filtering on a specific family is not yet supported.
 * @param callback      Application callback handler function to be called
 *                      for each found slave.
 * @param[in] user_data User data to pass to the application callback handler
 *                      function.
 *
 * @retval slave_count  Number of slaves found.
 * @retval -errno       Negative error code on error.
 */
__syscall int w1_search_bus(const struct device *dev, uint8_t command,
			    uint8_t family, w1_search_callback_t callback,
			    void *user_data);

/**
 * @brief Search for 1-Wire slave on bus.
 *
 * This routine can discover unknown slaves on the bus by scanning for the
 * unique 64-bit registration number.
 *
 * @param[in] dev       Pointer to the device structure for the driver instance.
 * @param callback      Application callback handler function to be called
 *                      for each found slave.
 * @param[in] user_data User data to pass to the application callback handler
 *                      function.
 *
 * @retval slave_count  Number of slaves found.
 * @retval -errno       Negative error code on error.
 */
static inline int w1_search_rom(const struct device *dev,
				w1_search_callback_t callback, void *user_data)
{
	return w1_search_bus(dev, W1_CMD_SEARCH_ROM, W1_SEARCH_ALL_FAMILIES,
			     callback, user_data);
}

/**
 * @brief Search for 1-Wire slaves with an active alarm.
 *
 * This routine searches 1-Wire slaves on the bus, which currently have
 * an active alarm.
 *
 * @param[in] dev       Pointer to the device structure for the driver instance.
 * @param callback      Application callback handler function to be called
 *                      for each found slave.
 * @param[in] user_data User data to pass to the application callback handler
 *                      function.
 *
 * @retval slave_count  Number of slaves found.
 * @retval -errno       Negative error code on error.
 */
static inline int w1_search_alarm(const struct device *dev,
				  w1_search_callback_t callback, void *user_data)
{
	return w1_search_bus(dev, W1_CMD_SEARCH_ALARM, W1_SEARCH_ALL_FAMILIES,
			     callback, user_data);
}

/**
 * @brief Function to convert a w1_rom struct to an uint64_t.
 *
 * @param[in] rom Pointer to the ROM struct.
 *
 * @retval rom64 The ROM converted to an unsigned integer in  endianness.
 */
static inline uint64_t w1_rom_to_uint64(const struct w1_rom *rom)
{
	return sys_get_be64((uint8_t *)rom);
}

/**
 * @brief Function to write an uint64_t to struct w1_rom pointer.
 *
 * @param rom64    Unsigned 64 bit integer representing the ROM in host endianness.
 * @param[out] rom The ROM struct pointer.
 */
static inline void w1_uint64_to_rom(const uint64_t rom64, struct w1_rom *rom)
{
	sys_put_be64(rom64, (uint8_t *)rom);
}

/**
 * @brief Compute CRC-8 chacksum as defined in the 1-Wire specification.
 *
 * The 1-Wire of CRC 8 variant is using 0x31 as its polynomial with the initial
 * value set to 0x00.
 * This CRC is used to check the correctness of the unique 56-bit ROM.
 *
 * @param[in] src Input bytes for the computation.
 * @param len     Length of the input in bytes.
 *
 * @retval crc The computed CRC8 value.
 */
static inline uint8_t w1_crc8(const uint8_t *src, size_t len)
{
	return crc8(src, len, W1_CRC8_POLYNOMIAL, W1_CRC8_SEED, true);
}

/**
 * @brief Compute 1-Wire variant of CRC 16
 *
 * The 16-bit 1-Wire crc variant is using the reflected polynomial function
 * X^16 + X^15 * + X^2 + 1 with the initial value set to 0x0000.
 * See also APPLICATION NOTE 27:
 * "UNDERSTANDING AND USING CYCLIC REDUNDANCY CHECKS WITH MAXIM 1-WIRE AND IBUTTON PRODUCTS"
 * https://www.maximintegrated.com/en/design/technical-documents/app-notes/2/27.html
 *
 * @param seed    Init value for the CRC, it is usually set to 0x0000.
 * @param[in] src Input bytes for the computation.
 * @param len     Length of the input in bytes.
 *
 * @retval crc The computed CRC16 value.
 */
static inline uint16_t w1_crc16(const uint16_t seed, const uint8_t *src,
				const size_t len)
{
	return crc16_reflect(W1_CRC16_POLYNOMIAL, seed, src, len);
}

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

/**
 * @}
 */
#include <syscalls/w1.h>

#endif /* ZEPHYR_INCLUDE_DRIVERS_W1_H_ */
