123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #ifndef __OPENLOONGSON_GPIO_H
- #define __OPENLOONGSON_GPIO_H
- // 龙芯1c的gpio是按照0,1,2,3,4...这样的顺序编号的,
- // 但在操作寄存器的时候,又是按照每32个一组来分的
- // 这里利用这个特性,将每组的32个gpio叫做一个"port",每个gpio在每组中的索引叫"pin"
- // port = gpio / 32
- // pin = gpio % 32
- // 例如GPIO50,port=1,pin=18
- #define GPIO_GET_PORT(gpio) ((gpio) / 32)
- #define GPIO_GET_PIN(gpio) ((gpio) % 32)
- // gpio的工作模式--输入、输出
- typedef enum{
- gpio_mode_output = 0, // 输出
- gpio_mode_input = 1 // 输入
- }gpio_mode_t;
- // gpio高低电平值
- typedef enum{
- gpio_level_low = 0, // 低电平
- gpio_level_high = 1 // 高电平
- }gpio_level_t;
- typedef enum {
- // 上升沿触发
- IRQ_TYPE_EDGE_RISING = 0x00000001,
- // 下降沿触发
- IRQ_TYPE_EDGE_FALLING = 0x00000002,
- IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
- // 高电平触发
- IRQ_TYPE_LEVEL_HIGH = 0x00000004,
- // 低电平触发
- IRQ_TYPE_LEVEL_LOW = 0x00000008,
- IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
- }gpio_irq_type_t;
- /*
- * 获取指定gpio的CFG寄存器
- * @gpio gpio编号
- * @ret CFG寄存器
- */
- volatile unsigned int *gpio_get_cfg_reg(unsigned int gpio);
- /*
- * gpio初始化
- * @gpio gpio引脚,取值范围[0, 127]
- * @mode gpio的工作模式(输入、输出)
- *
- * 例: 将gpio50初始化为输出
- * gpio_init(50, gpio_mode_output);
- */
- void gpio_init(unsigned int gpio, gpio_mode_t mode);
- /*
- * 在指定gpio输出高电平或低电平
- * @gpio gpio引脚,取值范围[0, 127]
- * @level 电平值
- *
- * 例: 在gpio50上输出低电平
- * gpio_set(50, gpio_level_low);
- */
- void gpio_set(unsigned int gpio, gpio_level_t level);
- /*
- * 读取指定gpio引脚的值
- * @gpio gpio引脚,取值范围[0,127]
- *
- * 例: 读取gpio50引脚上的值
- * gpio_level_t level;
- * level = gpio_get(50);
- */
- unsigned int gpio_get(unsigned int gpio);
- /**
- * 设置中断类型
- * @gpio gpio引脚
- * @type 触发中断的条件。高电平触发、低电平触发、上升沿触发 or 下降沿触发
- */
- void gpio_set_irq_type(unsigned int gpio, gpio_irq_type_t type);
- #endif
|