diff options
| author | 勤为本 <[email protected]> | 2017-07-20 17:35:03 +0800 |
|---|---|---|
| committer | 勤为本 <[email protected]> | 2017-07-20 17:35:03 +0800 |
| commit | 358612c8a2fc7c178a8e3086128e6943b77e1979 (patch) | |
| tree | 92689fb0c111db2a028366fc6a3895628d177949 /bsp/ls1cdev/libraries | |
| parent | d1bb7c61f4d46d07ae0ce4735c857b742974cafb (diff) | |
支持GPIO中断(外部中断)
Diffstat (limited to 'bsp/ls1cdev/libraries')
| -rw-r--r-- | bsp/ls1cdev/libraries/ls1c_gpio.c | 59 | ||||
| -rw-r--r-- | bsp/ls1cdev/libraries/ls1c_gpio.h | 20 | ||||
| -rw-r--r-- | bsp/ls1cdev/libraries/ls1c_regs.h | 34 |
3 files changed, 110 insertions, 3 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) |
