blob: 0f3946d1366f83ba51487f8be9a52d30e1650805 [file] [log] [blame]
/*
* Copyright (c) 2017 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @addtogroup t_pinmux_basic
* @{
* @defgroup t_pinmux_gpio test_pinmux_gpio
* @brief TestPurpose: verify PINMUX works on GPIO port
* @details
* - Test Steps (Quark_se_c1000_devboard)
* -# Connect pin_53(GPIO_19) and pin_50(GPIO_16).
* -# Configure GPIO_19 as output pin and set init LOW.
* -# Configure GPIO_16 as input pin and set LEVEL HIGH interrupt.
* -# Set pin_50 to PINMUX_FUNC_A and test GPIO functionality.
* -# Set pin_50 to PINMUX_FUNC_B and test GPIO functionality.
* - Expected Results
* -# When set pin_50 to PINMUX_FUNC_A, pin_50 works as GPIO and gpio
* callback will be triggered.
* -# When set pin_50 to PINMUX_FUNC_B, pin_50 works as I2S and gpio
* callback will not be triggered.
* @}
*/
#include <gpio.h>
#include <pinmux.h>
#include <ztest.h>
#define PINMUX_NAME CONFIG_PINMUX_NAME
#if defined(CONFIG_BOARD_QUARK_SE_C1000_DEVBOARD)
#define GPIO_DEV_NAME CONFIG_GPIO_QMSI_0_NAME
#define GPIO_OUT 15 /* GPIO15_I2S_RXD */
#define GPIO_IN 16 /* GPIO16_I2S_RSCK */
#define PIN_IN 50 /* GPIO16_I2S_RSCK */
#elif defined(CONFIG_BOARD_QUARK_SE_C1000_DEVBOARD_SS)
#define GPIO_DEV_NAME CONFIG_GPIO_QMSI_SS_0_NAME
#define GPIO_OUT 4 /* GPIO_SS_AIN_12 */
#define GPIO_IN 5 /* GPIO_SS_AIN_13 */
#define PIN_IN 13 /* GPIO_SS_AIN_13 */
#elif defined(CONFIG_BOARD_ARDUINO_101)
#define GPIO_DEV_NAME CONFIG_GPIO_QMSI_0_NAME
#define GPIO_OUT 16 /* IO8 */
#define GPIO_IN 19 /* IO4 */
#define PIN_IN 53 /* IO4 */
#elif defined(CONFIG_BOARD_ARDUINO_101_SSS)
#define GPIO_DEV_NAME CONFIG_GPIO_QMSI_SS_0_NAME
#define GPIO_OUT 2 /* AD0 */
#define GPIO_IN 3 /* AD1 */
#define PIN_IN 11 /* AD1 */
#elif defined(CONFIG_BOARD_QUARK_D2000_CRB)
#define GPIO_DEV_NAME CONFIG_GPIO_QMSI_0_NAME
#define GPIO_OUT 8 /* DIO7 */
#define GPIO_IN 9 /* DIO8 */
#define PIN_IN 9 /* DIO8 */
#endif
#define MAX_INT_CNT 10
static bool cb_triggered;
static void callback(struct device *dev,
struct gpio_callback *gpio_cb, u32_t pins)
{
static int cb_cnt;
TC_PRINT("callback triggered: %d\n", ++cb_cnt);
if (cb_cnt >= MAX_INT_CNT) {
cb_triggered = true;
gpio_pin_write(dev, GPIO_OUT, 0);
}
}
static int test_gpio(u32_t pin, u32_t func)
{
u32_t function;
struct gpio_callback gpio_cb;
struct device *pinmux = device_get_binding(PINMUX_NAME);
if (!pinmux) {
TC_PRINT("Cannot get PINMUX\n");
return TC_FAIL;
}
struct device *gpio_dev = device_get_binding(GPIO_DEV_NAME);
if (!gpio_dev) {
TC_PRINT("Cannot get GPIO device\n");
return TC_FAIL;
}
cb_triggered = false;
/* 1. Configure PIN_OUT and set init voltage */
if (gpio_pin_configure(gpio_dev, GPIO_OUT, GPIO_DIR_OUT)) {
TC_PRINT("PIN_OUT configure fail\n");
return TC_FAIL;
}
if (gpio_pin_write(gpio_dev, GPIO_OUT, 0)) {
TC_PRINT("Set PIN_OUT init LOW fail\n");
return TC_FAIL;
}
/* 2. Configure PIN_IN and set callback */
if (gpio_pin_configure(gpio_dev, GPIO_IN,
GPIO_DIR_IN | GPIO_INT | GPIO_INT_DEBOUNCE |
GPIO_INT_LEVEL | GPIO_INT_ACTIVE_HIGH)) {
TC_PRINT("PIN_IN configure fail\n");
return TC_FAIL;
}
gpio_init_callback(&gpio_cb, callback, BIT(GPIO_IN));
if (gpio_add_callback(gpio_dev, &gpio_cb)) {
TC_PRINT("Set PIN_IN callback fail\n");
return TC_FAIL;
}
gpio_pin_enable_callback(gpio_dev, GPIO_IN);
/* 3. Verify pinmux_pin_set() */
if (pinmux_pin_set(pinmux, pin, func)) {
TC_PRINT("Fail to set pin func, %u : %u\n", pin, func);
return TC_FAIL;
}
/* 4. Verify pinmux_pin_get() */
if (pinmux_pin_get(pinmux, pin, &function)) {
TC_PRINT("Fail to get pin func\n");
return TC_FAIL;
}
/* 5. Verify the setting works */
if (function != func) {
TC_PRINT("Error. PINMUX get doesn't match PINMUX set\n");
return TC_FAIL;
}
/* 6. Set PIN_OUT HIGH and verify pin func works */
if (gpio_pin_write(gpio_dev, GPIO_OUT, 1)) {
TC_PRINT("Set PIN_OUT HIGH fail\n");
return TC_FAIL;
}
k_sleep(1000);
if (cb_triggered) {
TC_PRINT("GPIO callback is triggered\n");
return TC_PASS;
} else {
TC_PRINT("GPIO callback is not triggered\n");
return TC_FAIL;
}
}
void test_pinmux_gpio(void)
{
zassert_true(test_gpio(PIN_IN, PINMUX_FUNC_A) == TC_PASS, NULL);
zassert_true(test_gpio(PIN_IN, PINMUX_FUNC_B) == TC_FAIL, NULL);
}