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