/*
 * Copyright (c) 2019 Piotr Mienkowski
 *
 * SPDX-License-Identifier: Apache-2.0
 */


#include <limits.h>
#include <sys/util.h>
#include "test_gpio_api.h"

#define TEST_GPIO_MAX_SINGLE_ENDED_RISE_FALL_TIME_MS    100
#define TEST_POINT(n)   (n)

static void pin_get_raw_and_verify(const struct device *port,
				   unsigned int pin,
				   int val_expected, int idx)
{
	int val_actual;

	val_actual = gpio_pin_get_raw(port, pin);
	zassert_true(val_actual >= 0,
		     "Test point %d: failed to get pin value", idx);
	zassert_equal(val_expected, val_actual,
		      "Test point %d: invalid pin get value", idx);
}

static void pin_set_raw_and_verify(const struct device *port,
				   unsigned int pin,
				   int val, int idx)
{
	zassert_equal(gpio_pin_set_raw(port, pin, val), 0,
		      "Test point %d: failed to set pin value", idx);
	k_busy_wait(TEST_GPIO_MAX_RISE_FALL_TIME_US);
}

/** @brief Verify gpio_pin_configure function in push pull mode.
 *
 * - Configure pin in in/out mode, verify that gpio_pin_set_raw /
 *   gpio_pin_get_raw operations change pin state.
 * - Verify that GPIO_OUTPUT_HIGH flag is initializing the pin to high.
 * - Verify that GPIO_OUTPUT_LOW flag is initializing the pin to low.
 * - Verify that configuring the pin as an output without initializing it
 *   to high or low does not change pin state.
 * - Verify that it is not possible to change value of a pin via
 *   gpio_pin_set_raw function if pin is configured as an input.
 */
void test_gpio_pin_configure_push_pull(void)
{
	const struct device *port;
	int ret;

	port = device_get_binding(TEST_DEV);
	zassert_not_null(port, "device " TEST_DEV " not found");

	TC_PRINT("Running test on port=%s, pin=%d\n", TEST_DEV, TEST_PIN);

	ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT);
	zassert_equal(ret, 0, "Failed to configure the pin as an output");

	pin_set_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(1));
	pin_set_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(1));

	/* Configure pin in in/out mode, verify that gpio_pin_set_raw /
	 * gpio_pin_get_raw operations change pin state.
	 */
	ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT | GPIO_INPUT);
	if (ret == -ENOTSUP) {
		TC_PRINT("Simultaneous pin in/out mode is not supported.\n");
		ztest_test_skip();
		return;
	}
	zassert_equal(ret, 0, "Failed to configure the pin in in/out mode");

	pin_set_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(2));
	pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(2));

	pin_set_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(3));
	pin_get_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(3));

	pin_set_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(4));
	pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(4));

	/* Verify that GPIO_OUTPUT_HIGH flag is initializing the pin to high. */
	ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT_HIGH | GPIO_INPUT);
	zassert_equal(ret, 0,
		      "Failed to configure the pin in in/out mode and "
		      "initialize it to high");

	pin_get_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(5));

	/* Verify that configuring the pin as an output without initializing it
	 * to high or low does not change pin state.
	 */
	ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT | GPIO_INPUT);
	zassert_equal(ret, 0, "Failed to configure the pin in in/out mode");

	pin_get_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(6));

	/* Verify that GPIO_OUTPUT_LOW flag is initializing the pin to low. */
	ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT_LOW | GPIO_INPUT);
	zassert_equal(ret, 0,
		      "Failed to configure the pin in in/out mode and "
		      "initialize it to low");

	pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(7));

	/* Verify that configuring the pin as an output without initializing it
	 * to high or low does not change pin state.
	 */
	ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT | GPIO_INPUT);
	zassert_equal(ret, 0, "Failed to configure the pin in in/out mode");

	pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(8));

	/* Verify that it is not possible to change value of a pin via
	 * gpio_pin_set_raw function if pin is configured as an input.
	 */
	ret = gpio_pin_configure(port, TEST_PIN, GPIO_INPUT);
	zassert_equal(ret, 0, "Failed to configure the pin as an input");
	k_busy_wait(TEST_GPIO_MAX_RISE_FALL_TIME_US);

	int pin_in_val;

	pin_in_val = gpio_pin_get_raw(port, TEST_PIN);
	zassert_true(pin_in_val >= 0,
		     "Test point %d: failed to get pin value", TEST_POINT(9));

	pin_set_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(10));
	pin_get_raw_and_verify(port, TEST_PIN, pin_in_val, TEST_POINT(10));

	pin_set_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(11));
	pin_get_raw_and_verify(port, TEST_PIN, pin_in_val, TEST_POINT(11));
}

/** @brief Verify gpio_pin_configure function in single ended mode.
 *
 * @note This test verifies single ended mode only partially. It should not be
 *       used as a sign off test.
 *
 * - Verify that pin configured in Open Drain mode and initialized
 *   to high results in pin high value if the same pin configured
 *   as input is high. Drivers that do not support Open Drain flag
 *   return ENOTSUP.
 * - Setting pin configured in Open Drain mode to low results in
 *   pin low value if the same pin configured as input is high.
 * - Verify that pin configured in Open Source mode and
 *   initialized to low results in pin high value if the same pin
 *   configured as input is high. Drivers that do not support Open
 *   Source flag return ENOTSUP.
 * - Verify that pin configured in Open Source mode and
 *   initialized to low results in pin low value if the same pin
 *   configured as input is low. Drivers that do not support Open
 *   Source flag return ENOTSUP.
 * - Setting pin configured in Open Source mode to high results in
 *   pin high value if the same pin configured as input is low.
 * - Verify that pin configured in Open Drain mode and
 *   initialized to high results in pin low value if the same pin
 *   configured as input is low. Drivers that do not support Open
 *   Drain flag return ENOTSUP.
 */
void test_gpio_pin_configure_single_ended(void)
{
	const struct device *port;
	int pin_in_val;
	int pin_val;
	unsigned int cfg_flag;
	int ret;

	port = device_get_binding(TEST_DEV);
	zassert_not_null(port, "device " TEST_DEV " not found");

	TC_PRINT("Running test on port=%s, pin=%d\n", TEST_DEV, TEST_PIN);

	/* If the LED is connected directly between the MCU pin and power or
	 * ground we can test only one of the Open Drain / Open Source modes.
	 * Guess pin level when the LED is off. If the pin is not connected
	 * directly to LED but instead the signal is routed to an input of
	 * another chip we could test both modes. However, there is no way to
	 * find it out so only one mode is tested.
	 */
	if ((TEST_PIN_DTS_FLAGS & GPIO_ACTIVE_LOW) != 0) {
		cfg_flag = GPIO_PULL_UP;
		pin_val = 1;
	} else {
		cfg_flag = GPIO_PULL_DOWN;
		pin_val = 0;
	}

	/* Configure pin as an input with pull up/down and check input level. */
	ret = gpio_pin_configure(port, TEST_PIN, GPIO_INPUT | cfg_flag);
	if (ret == -ENOTSUP) {
		TC_PRINT("Pull Up / Pull Down pin bias is not supported\n");
		ztest_test_skip();
		return;
	}
	zassert_equal(ret, 0, "Failed to configure pin as an input");

	k_sleep(K_MSEC(TEST_GPIO_MAX_SINGLE_ENDED_RISE_FALL_TIME_MS));

	pin_in_val = gpio_pin_get_raw(port, TEST_PIN);
	zassert_true(pin_in_val >= 0, "Failed to get pin value");

	if (pin_val != pin_in_val) {
		TC_PRINT("Board configuration does not allow to run the test\n");
		ztest_test_skip();
		return;
	}

	if (pin_val == 1) {
		TC_PRINT("When configured as input test pin value is high\n");
		/* Verify that pin configured in Open Drain mode and initialized
		 * to high results in pin high value if the same pin configured
		 * as input is high. Drivers that do not support Open Drain flag
		 * return -ENOTSUP.
		 */
		ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT_HIGH |
				GPIO_OPEN_DRAIN | GPIO_INPUT | GPIO_PULL_UP);
		if (ret == -ENOTSUP) {
			TC_PRINT("Open Drain configuration or Pull Up pin "
				 "bias is not supported\n");
			ztest_test_skip();
			return;
		}
		zassert_equal(ret, 0,
			      "Failed to configure the pin in Open Drain mode");

		pin_get_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(1));

		/* Setting pin configured in Open Drain mode to low results in
		 * pin low value if the same pin configured as input is high.
		 */
		pin_set_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(2));
		pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(2));

		/* Verify that pin configured in Open Source mode and
		 * initialized to low results in pin high value if the same pin
		 * configured as input is high. Drivers that do not support Open
		 * Source flag return -ENOTSUP.
		 */
		ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT_LOW |
				GPIO_OPEN_SOURCE | GPIO_INPUT | GPIO_PULL_UP);
		if (ret == -ENOTSUP) {
			TC_PRINT("Open Source configuration or Pull Up pin "
				 "bias is not supported\n");
			return;
		}
		zassert_equal(ret, 0,
			      "Failed to configure the pin in Open Source mode");

		k_sleep(K_MSEC(TEST_GPIO_MAX_SINGLE_ENDED_RISE_FALL_TIME_MS));

		pin_get_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(3));

		pin_set_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(4));
		pin_get_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(4));
	} else {
		TC_PRINT("When configured as input test pin value is low\n");
		/* Verify that pin configured in Open Source mode and
		 * initialized to low results in pin low value if the same pin
		 * configured as input is low. Drivers that do not support Open
		 * Source flag return -ENOTSUP.
		 */
		ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT_LOW |
				GPIO_OPEN_SOURCE | GPIO_INPUT | GPIO_PULL_DOWN);
		if (ret == -ENOTSUP) {
			TC_PRINT("Open Source configuration or Pull Down pin "
				 "bias is not supported\n");
			ztest_test_skip();
			return;
		}
		zassert_equal(ret, 0,
			      "Failed to configure the pin in Open Source mode");

		pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(5));

		/* Setting pin configured in Open Source mode to high results in
		 * pin high value if the same pin configured as input is low.
		 */
		pin_set_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(6));
		pin_get_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(6));

		/* Verify that pin configured in Open Drain mode and
		 * initialized to high results in pin low value if the same pin
		 * configured as input is low. Drivers that do not support Open
		 * Drain flag return -ENOTSUP.
		 */
		ret = gpio_pin_configure(port, TEST_PIN, GPIO_OUTPUT_HIGH |
				GPIO_OPEN_DRAIN | GPIO_INPUT | GPIO_PULL_DOWN);
		if (ret == -ENOTSUP) {
			TC_PRINT("Open Drain configuration or Pull Down pin "
				 "bias is not supported\n");
			return;
		}
		zassert_equal(ret, 0,
			      "Failed to configure the pin in Open Drain mode");

		k_sleep(K_MSEC(TEST_GPIO_MAX_SINGLE_ENDED_RISE_FALL_TIME_MS));

		pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(7));

		pin_set_raw_and_verify(port, TEST_PIN, 1, TEST_POINT(8));
		pin_get_raw_and_verify(port, TEST_PIN, 0, TEST_POINT(8));
	}
}
