1 /*
2  * Copyright (C) 2022, Canaan Bright Sight Co., Ltd
3  *
4  * All enquiries to https://www.canaan-creative.com/
5  */
6 
7 /*
8  * Copyright (c) 2006-2025 RT-Thread Development Team
9  *
10  * SPDX-License-Identifier: Apache-2.0
11  */
12 
13  /*
14   * 本测试用例演示基于 01Studio Canmv-K230 开发板测试 gpio 的基本输入和输出功能。其中
15   * gpio_led_flashing 演示 LED 的跑马灯功能。LED 采用开发板上的 LED2(连接 LED_GPIO52)。
16   * gpio_io 演示用杜邦线将 40Pin GPIO 中的 GPIO33 和 GPIO32 连接起来,GPIO33 配
17   * 置为输出,GPIO32 配置为输入。分别用 GPIO33 产生输出给 GPIO32 读取并检查是否
18   * 和预期的输出一致。
19   */
20 #include <unistd.h>
21 #include <stdio.h>
22 #include <rtthread.h>
23 #include <rtdevice.h>
24 #include <ioremap.h>
25 #include "board.h"
26 #include "drv_pinctrl.h"
27 #include "drv_gpio.h"
28 #include "utest.h"
29 
30 #define LED_PIN_NUM 52
31 
32 #define OUT_PIN_NUM 33
33 #define IN_PIN_NUM  32
34 
gpio_led_flashing(void)35 static void gpio_led_flashing(void)
36 {
37     int cnt = 5;
38 
39     /* Use default pinmux function */
40     kd_pin_mode(LED_PIN_NUM, GPIO_DM_OUTPUT);
41 
42     while(cnt--)
43     {
44         LOG_I("led ON");
45         kd_pin_write(LED_PIN_NUM, GPIO_PV_HIGH);
46         rt_thread_mdelay(1000);
47 
48         LOG_I("led OFF");
49         kd_pin_write(LED_PIN_NUM, GPIO_PV_LOW);
50         rt_thread_mdelay(1000);
51     }
52 }
53 
gpio_io(void)54 static void gpio_io(void)
55 {
56     int cnt = 5;
57     int level = 0xff;
58 
59     rt_uint32_t val;
60 
61     /* Set pinmux function */
62     k230_pinctrl_set_function(IN_PIN_NUM, IOMUX_FUNC1);
63     k230_pinctrl_set_ie(IN_PIN_NUM, 1);
64     k230_pinctrl_set_oe(IN_PIN_NUM, 0);
65 
66     k230_pinctrl_set_function(OUT_PIN_NUM, IOMUX_FUNC1);
67     k230_pinctrl_set_ie(OUT_PIN_NUM, 0);
68     k230_pinctrl_set_oe(OUT_PIN_NUM, 1);
69 
70     /* Set GPIO mode */
71     kd_pin_mode(OUT_PIN_NUM, GPIO_DM_OUTPUT);
72     kd_pin_mode(IN_PIN_NUM, GPIO_DM_INPUT);
73 
74     while(cnt--)
75     {
76         kd_pin_write(OUT_PIN_NUM, GPIO_PV_LOW);
77         level = kd_pin_read(IN_PIN_NUM);
78         LOG_I("--> %d", level);
79         uassert_int_equal(level, GPIO_PV_LOW);
80 
81         kd_pin_write(OUT_PIN_NUM, GPIO_PV_HIGH);
82         level = kd_pin_read(IN_PIN_NUM);
83         LOG_I("--> %d", level);
84         uassert_int_equal(level, GPIO_PV_HIGH);
85 
86         rt_thread_mdelay(500);
87     }
88 }
89 
testcase(void)90 static void testcase(void)
91 {
92     UTEST_UNIT_RUN(gpio_led_flashing);
93     UTEST_UNIT_RUN(gpio_io);
94 }
95 
utest_tc_init(void)96 static rt_err_t utest_tc_init(void)
97 {
98     return RT_EOK;
99 }
utest_tc_cleanup(void)100 static rt_err_t utest_tc_cleanup(void)
101 {
102     return RT_EOK;
103 }
104 
105 UTEST_TC_EXPORT(testcase, "gpio", utest_tc_init, utest_tc_cleanup, 100);