1 #include "aos/hal/gpio.h"
2 #include "gpio_test.h"
3 
4 /******************************************************
5 *               Variables Definitions
6 ******************************************************/
7 
8 extern const qc_test_gpio_pair_t qc_test_gpio_pairs[];
9 extern const int qc_test_gpio_pairs_num;
10 
11 static int gpio_result = 0;
12 
13 /******************************************************
14 *               Function Definitions
15 ******************************************************/
16 
_gpio_test_one(const qc_test_gpio_pair_t * gpio_test_pair)17 static int _gpio_test_one( const qc_test_gpio_pair_t* gpio_test_pair )
18 {
19     gpio_dev_t  gpio_out;
20     gpio_dev_t  gpio_in;
21     int ret=-1, val;
22 
23     gpio_out.port = gpio_test_pair->output_pin;
24     gpio_out.config = OUTPUT_PUSH_PULL;
25     gpio_in.port = gpio_test_pair->input_pin;
26     gpio_in.config = INPUT_PULL_DOWN;
27     hal_gpio_init(&gpio_out);
28     hal_gpio_init(&gpio_in);
29     hal_gpio_output_high(&gpio_out);
30     aos_msleep(1);
31     hal_gpio_input_get(&gpio_in, &val);
32     if (val != 1)
33         goto EXIT;
34 
35     gpio_in.config = INPUT_PULL_UP;
36     hal_gpio_init(&gpio_in);
37     hal_gpio_output_low(&gpio_out);
38     aos_msleep(1);
39     hal_gpio_input_get(&gpio_in, &val);
40     if (val != 0)
41         goto EXIT;
42 
43     ret = 0;
44 
45 EXIT:
46     hal_gpio_deinit(&gpio_out);
47     hal_gpio_deinit(&gpio_in);
48     return ret;
49 }
50 
_gpio_test(const qc_test_gpio_pair_t * gpio_test_pair,int num)51 static int _gpio_test( const qc_test_gpio_pair_t* gpio_test_pair, int num )
52 {
53     int i;
54     int err = 0;
55     qc_test_gpio_pair_t * gpio_test = (qc_test_gpio_pair_t *)gpio_test_pair;
56 
57     gpio_result = 0;
58 
59     for ( i = 0; i < num; i++ )
60     {
61         if ( 0 == _gpio_test_one( &gpio_test_pair[i] ) )
62         {
63             gpio_result |= (1 << i);
64         }
65         else
66         {
67             err = -1;
68         }
69     }
70 
71     return err;
72 }
73 
qc_test_gpio(void)74 void qc_test_gpio( void )
75 {
76     char test_result[32];
77     int gpio_num = 0;
78 
79     if (qc_test_gpio_pairs_num == 0)
80         return;
81 
82     if ( 0 == _gpio_test( qc_test_gpio_pairs, qc_test_gpio_pairs_num ) )
83     {
84         qc_printf( "GPIO TEST: PASS\r\n" );
85     }
86     else
87     {
88         sprintf( test_result, "Fail: %d:%x", gpio_num, gpio_result );
89         qc_printf( "GPIO TEST: %s\r\n", test_result );
90     }
91 
92     return;
93 }
94 
95