1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2017-09-06     勤为本       first version
9  */
10 
11 
12 #ifndef __LOONGSON_GPIO_H
13 #define __LOONGSON_GPIO_H
14 
15 
16 
17 // 龙芯1c的gpio是按照0,1,2,3,4...这样的顺序编号的,
18 // 但在操作寄存器的时候,又是按照每32个一组来分的
19 // 这里利用这个特性,将每组的32个gpio叫做一个"port",每个gpio在每组中的索引叫"pin"
20 // port = gpio / 32
21 // pin  = gpio % 32
22 // 例如GPIO50,port=1,pin=18
23 #define GPIO_GET_PORT(gpio)                 ((gpio) / 32)
24 #define GPIO_GET_PIN(gpio)                  ((gpio) % 32)
25 
26 
27 // gpio的工作模式--输入、输出
28 typedef enum{
29     gpio_mode_output = 0,       // 输出
30     gpio_mode_input = 1         // 输入
31 }gpio_mode_t;
32 
33 
34 //  gpio高低电平值
35 typedef enum{
36     gpio_level_low = 0,         // 低电平
37     gpio_level_high = 1         // 高电平
38 }gpio_level_t;
39 
40 
41 typedef enum {
42     // 上升沿触发
43 	IRQ_TYPE_EDGE_RISING	= 0x00000001,
44 	// 下降沿触发
45 	IRQ_TYPE_EDGE_FALLING	= 0x00000002,
46 	IRQ_TYPE_EDGE_BOTH	= (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
47 	// 高电平触发
48 	IRQ_TYPE_LEVEL_HIGH	= 0x00000004,
49 	// 低电平触发
50 	IRQ_TYPE_LEVEL_LOW	= 0x00000008,
51 	IRQ_TYPE_LEVEL_MASK	= (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
52 }gpio_irq_type_t;
53 
54 
55 
56 /*
57  * 获取指定gpio的CFG寄存器
58  * @gpio gpio编号
59  * @ret CFG寄存器
60  */
61 volatile unsigned int *gpio_get_cfg_reg(unsigned int gpio);
62 
63 /*
64  * gpio初始化
65  * @gpio gpio引脚,取值范围[0, 127]
66  * @mode gpio的工作模式(输入、输出)
67  *
68  * 例: 将gpio50初始化为输出
69  * gpio_init(50, gpio_mode_output);
70  */
71 void gpio_init(unsigned int gpio, gpio_mode_t mode);
72 
73 
74 /*
75  * 在指定gpio输出高电平或低电平
76  * @gpio gpio引脚,取值范围[0, 127]
77  * @level 电平值
78  *
79  * 例: 在gpio50上输出低电平
80  * gpio_set(50, gpio_level_low);
81  */
82 void gpio_set(unsigned int gpio, gpio_level_t level);
83 
84 
85 
86 /*
87  * 读取指定gpio引脚的值
88  * @gpio gpio引脚,取值范围[0,127]
89  *
90  * 例: 读取gpio50引脚上的值
91  * gpio_level_t level;
92  * level = gpio_get(50);
93  */
94 unsigned int gpio_get(unsigned int gpio);
95 
96 
97 
98 /**
99  * 设置中断类型
100  * @gpio gpio引脚
101  * @type 触发中断的条件。高电平触发、低电平触发、上升沿触发 or 下降沿触发
102  */
103 void gpio_set_irq_type(unsigned int gpio, gpio_irq_type_t type);
104 
105 
106 
107 #endif
108 
109