From 358612c8a2fc7c178a8e3086128e6943b77e1979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8B=A4=E4=B8=BA=E6=9C=AC?= <1207280597@qq.com> Date: Thu, 20 Jul 2017 17:35:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81GPIO=E4=B8=AD=E6=96=AD?= =?UTF-8?q?=EF=BC=88=E5=A4=96=E9=83=A8=E4=B8=AD=E6=96=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/ls1cdev/libraries/ls1c_gpio.c | 59 +++++++++++++++++++++++++++++++ bsp/ls1cdev/libraries/ls1c_gpio.h | 20 +++++++++++ bsp/ls1cdev/libraries/ls1c_regs.h | 42 ++++++++++++++++++---- libcpu/mips/loongson_1c/ls1c.h | 5 +++ 4 files changed, 119 insertions(+), 7 deletions(-) diff --git a/bsp/ls1cdev/libraries/ls1c_gpio.c b/bsp/ls1cdev/libraries/ls1c_gpio.c index 11d696d48e..d0f0633b4e 100644 --- a/bsp/ls1cdev/libraries/ls1c_gpio.c +++ b/bsp/ls1cdev/libraries/ls1c_gpio.c @@ -204,4 +204,63 @@ unsigned int gpio_get(unsigned int gpio) } +/** + * 设置中断类型 + * @gpio gpio引脚 + * @type 触发中断的条件。高电平触发、低电平触发、上升沿触发 or 下降沿触发 + */ +void gpio_set_irq_type(unsigned int gpio, gpio_irq_type_t type) +{ + volatile unsigned int *int_pol; // 中断极性选择寄存器 + volatile unsigned int *int_edge; // 中断边沿选择寄存器 + unsigned int port = GPIO_GET_PORT(gpio); + unsigned int pin = GPIO_GET_PIN(gpio); + + // 获取寄存器地址 + switch (port) + { + case 0: // GPIO[31:0] + int_pol = (volatile unsigned int *)LS1C_INT2_POL; + int_edge = (volatile unsigned int *)LS1C_INT2_EDGE; + break; + + case 1: // GPIO[63:32] + int_pol = (volatile unsigned int *)LS1C_INT3_POL; + int_edge = (volatile unsigned int *)LS1C_INT3_EDGE; + break; + + case 2: // GPIO[95:64] + int_pol = (volatile unsigned int *)LS1C_INT4_POL; + int_edge = (volatile unsigned int *)LS1C_INT4_EDGE; + break; + } + + // 设置中断类型 + switch (type) + { + case IRQ_TYPE_EDGE_RISING: + *int_pol |= (1 << pin); + *int_edge |= (1 << pin); + break; + + case IRQ_TYPE_EDGE_FALLING: + *int_pol &= ~(1 << pin); + *int_edge |= (1 << pin); + break; + + case IRQ_TYPE_LEVEL_HIGH: + *int_pol |= (1 << pin); + *int_edge &= ~(1 << pin); + break; + + case IRQ_TYPE_LEVEL_LOW: + *int_pol &= ~(1 << pin); + *int_edge &= ~(1 << pin); + break; + } + + return ; +} + + diff --git a/bsp/ls1cdev/libraries/ls1c_gpio.h b/bsp/ls1cdev/libraries/ls1c_gpio.h index d20085cf4a..1609684bd3 100644 --- a/bsp/ls1cdev/libraries/ls1c_gpio.h +++ b/bsp/ls1cdev/libraries/ls1c_gpio.h @@ -29,6 +29,19 @@ typedef enum{ }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; + /* @@ -73,6 +86,13 @@ 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 diff --git a/bsp/ls1cdev/libraries/ls1c_regs.h b/bsp/ls1cdev/libraries/ls1c_regs.h index 22ac433fda..fb67086d34 100644 --- a/bsp/ls1cdev/libraries/ls1c_regs.h +++ b/bsp/ls1cdev/libraries/ls1c_regs.h @@ -74,13 +74,41 @@ - - - - - - - +// 中断配置寄存器 +#define LS1C_INT0_SR (0xbfd01040) +#define LS1C_INT0_EN (0xbfd01044) +#define LS1C_INT0_SET (0xbfd01048) +#define LS1C_INT0_CLR (0xbfd0104c) +#define LS1C_INT0_POL (0xbfd01050) +#define LS1C_INT0_EDGE (0xbfd01054) + +#define LS1c_INT1_SR (0xbfd01058) +#define LS1C_INT1_EN (0xbfd0105c) +#define LS1C_INT1_SET (0xbfd01060) +#define LS1C_INT1_CLR (0xbfd01064) +#define LS1C_INT1_POL (0xbfd01068) +#define LS1C_INT1_EDGE (0xbfd0106c) + +#define LS1C_INT2_SR (0xbfd01070) +#define LS1C_INT2_EN (0xbfd01074) +#define LS1C_INT2_SET (0xbfd01078) +#define LS1C_INT2_CLR (0xbfd0107c) +#define LS1C_INT2_POL (0xbfd01080) +#define LS1C_INT2_EDGE (0xbfd01084) + +#define LS1C_INT3_SR (0xbfd01088) +#define LS1C_INT3_EN (0xbfd0108c) +#define LS1C_INT3_SET (0xbfd01090) +#define LS1C_INT3_CLR (0xbfd01094) +#define LS1C_INT3_POL (0xbfd01098) +#define LS1C_INT3_EDGE (0xbfd0109c) + +#define LS1C_INT4_SR (0xbfd010a0) +#define LS1C_INT4_EN (0xbfd010a4) +#define LS1C_INT4_SET (0xbfd010a8) +#define LS1C_INT4_CLR (0xbfd010ac) +#define LS1C_INT4_POL (0xbfd010b0) +#define LS1C_INT4_EDGE (0xbfd010b4) diff --git a/libcpu/mips/loongson_1c/ls1c.h b/libcpu/mips/loongson_1c/ls1c.h index c47b9a42bb..a203810c37 100644 --- a/libcpu/mips/loongson_1c/ls1c.h +++ b/libcpu/mips/loongson_1c/ls1c.h @@ -77,6 +77,11 @@ #define LS1C_NR_IRQS (32*5) +// GPIO编号和中断号之间的互相转换 +#define LS1C_GPIO_TO_IRQ(GPIOn) (LS1C_GPIO_FIRST_IRQ + (GPIOn)) +#define LS1C_IRQ_TO_GPIO(IRQn) ((IRQn) - LS1C_GPIO_FIRST_IRQ) + + struct ls1c_intc_regs { volatile unsigned int int_isr; -- GitLab