diff --git a/sdk/bsp/include/gpio.h b/sdk/bsp/include/gpio.h index c244548..ab9a1c4 100644 --- a/sdk/bsp/include/gpio.h +++ b/sdk/bsp/include/gpio.h @@ -1,23 +1,95 @@ -#ifndef _GPIO_H_ -#define _GPIO_H_ - -#define GPIO_BASE (0x30000000) -#define GPIO_CTRL (GPIO_BASE + (0x00)) -#define GPIO_DATA (GPIO_BASE + (0x04)) - -#define GPIO_REG(addr) (*((volatile uint32_t *)addr)) - - -#define GPIO0 (0) -#define GPIO1 (1) - -#define GPIO_OUTPUT (1) -#define GPIO_INPUT (2) - -void gpio_output_enable(uint8_t gpio); -void gpio_input_enable(uint8_t gpio); -uint8_t gpio_get_data(uint8_t gpio); -void gpio_set_data(uint8_t gpio, uint8_t data); -void gpio_data_toggle(uint8_t gpio); - -#endif +// Generated register defines for gpio + +// Copyright information found in source file: +// Copyright lowRISC contributors. + +// Licensing information found in source file: +// Licensed under the Apache License, Version 2.0, see LICENSE for details. +// SPDX-License-Identifier: Apache-2.0 + +#ifndef _GPIO_REG_DEFS_ +#define _GPIO_REG_DEFS_ + +#ifdef __cplusplus +extern "C" { +#endif +// Register width +#define GPIO_PARAM_REG_WIDTH 32 + +#define GPIO_BASE_ADDR (0x30000000) +#define GPIO_REG(offset) (*((volatile uint32_t *)(GPIO_BASE_ADDR + offset))) + +typedef enum { + GPIO_MODE_NONE = 0, + GPIO_MODE_INPUT, + GPIO_MODE_OUTPUT, +} gpio_mode_e; + +typedef enum { + GPIO_INTR_NONE = 0, + GPIO_INTR_RAISING_EDGE, + GPIO_INTR_FALLING_EDGE, + GPIO_INTR_DOUBLE_EDGE, +} gpio_intr_mode_e; + +typedef enum { + GPIO0 = 0, + GPIO1, + GPIO2, + GPIO3, + GPIO4, + GPIO5, + GPIO6, + GPIO7, +} gpio_e; + +// gpio mode register +#define GPIO_MODE_REG_OFFSET 0x0 +#define GPIO_MODE_REG_RESVAL 0x0 +#define GPIO_MODE_GPIO_MASK 0xffff +#define GPIO_MODE_GPIO_OFFSET 0 +#define GPIO_MODE_GPIO_FIELD \ + ((bitfield_field32_t) { .mask = GPIO_MODE_GPIO_MASK, .index = GPIO_MODE_GPIO_OFFSET }) + +// gpio interrupt register +#define GPIO_INTR_REG_OFFSET 0x4 +#define GPIO_INTR_REG_RESVAL 0x0 +#define GPIO_INTR_GPIO_INT_MASK 0xffff +#define GPIO_INTR_GPIO_INT_OFFSET 0 +#define GPIO_INTR_GPIO_INT_FIELD \ + ((bitfield_field32_t) { .mask = GPIO_INTR_GPIO_INT_MASK, .index = GPIO_INTR_GPIO_INT_OFFSET }) +#define GPIO_INTR_GPIO_PENDING_MASK 0xff +#define GPIO_INTR_GPIO_PENDING_OFFSET 16 +#define GPIO_INTR_GPIO_PENDING_FIELD \ + ((bitfield_field32_t) { .mask = GPIO_INTR_GPIO_PENDING_MASK, .index = GPIO_INTR_GPIO_PENDING_OFFSET }) + +// gpio data register +#define GPIO_DATA_REG_OFFSET 0x8 +#define GPIO_DATA_REG_RESVAL 0x0 +#define GPIO_DATA_GPIO_MASK 0xff +#define GPIO_DATA_GPIO_OFFSET 0 +#define GPIO_DATA_GPIO_FIELD \ + ((bitfield_field32_t) { .mask = GPIO_DATA_GPIO_MASK, .index = GPIO_DATA_GPIO_OFFSET }) + +// gpio input filter enable register +#define GPIO_FILTER_REG_OFFSET 0xc +#define GPIO_FILTER_REG_RESVAL 0x0 +#define GPIO_FILTER_GPIO_MASK 0xff +#define GPIO_FILTER_GPIO_OFFSET 0 +#define GPIO_FILTER_GPIO_FIELD \ + ((bitfield_field32_t) { .mask = GPIO_FILTER_GPIO_MASK, .index = GPIO_FILTER_GPIO_OFFSET }) + +void gpio_set_mode(gpio_e gpio, gpio_mode_e mode); +uint8_t gpio_get_input_data(gpio_e gpio); +void gpio_set_output_data(gpio_e gpio, uint8_t data); +void gpio_set_output_toggle(gpio_e gpio); +void gpio_set_input_filter_enable(gpio_e gpio, uint8_t en); +void gpio_set_interrupt_mode(gpio_e gpio, gpio_intr_mode_e mode); +void gpio_clear_intr_pending(gpio_e gpio); +uint8_t gpio_get_intr_pending(gpio_e gpio); + +#ifdef __cplusplus +} // extern "C" +#endif +#endif // _GPIO_REG_DEFS_ +// End generated register defines for gpio \ No newline at end of file diff --git a/sdk/bsp/lib/gpio.c b/sdk/bsp/lib/gpio.c index 3f271e0..c3c6ea8 100644 --- a/sdk/bsp/lib/gpio.c +++ b/sdk/bsp/lib/gpio.c @@ -3,35 +3,56 @@ #include "../../bsp/include/gpio.h" #include "../../bsp/include/utils.h" -void gpio_output_enable(uint8_t gpio) +void gpio_set_mode(gpio_e gpio, gpio_mode_e mode) { - GPIO_REG(GPIO_CTRL) &= ~(0x3 << (gpio << 1)); - GPIO_REG(GPIO_CTRL) |= GPIO_OUTPUT << (gpio << 1); + GPIO_REG(GPIO_MODE_REG_OFFSET) &= ~(0x3 << (gpio << 1)); + GPIO_REG(GPIO_MODE_REG_OFFSET) |= ((uint8_t)mode) << (gpio << 1); } -void gpio_input_enable(uint8_t gpio) +uint8_t gpio_get_input_data(gpio_e gpio) { - GPIO_REG(GPIO_CTRL) &= ~(0x3 << (gpio << 1)); - GPIO_REG(GPIO_CTRL) |= GPIO_INPUT << (gpio << 1); -} - -uint8_t gpio_get_data(uint8_t gpio) -{ - if (GPIO_REG(GPIO_DATA) & (1 << gpio)) + if (GPIO_REG(GPIO_DATA_REG_OFFSET) & (1 << gpio)) return 1; else return 0; } -void gpio_set_data(uint8_t gpio, uint8_t data) +void gpio_set_output_data(gpio_e gpio, uint8_t data) { if (data) - GPIO_REG(GPIO_DATA) |= 1 << gpio; + GPIO_REG(GPIO_DATA_REG_OFFSET) |= 1 << gpio; else - GPIO_REG(GPIO_DATA) &= ~(1 << gpio); + GPIO_REG(GPIO_DATA_REG_OFFSET) &= ~(1 << gpio); } -void gpio_data_toggle(uint8_t gpio) +void gpio_set_output_toggle(gpio_e gpio) { - GPIO_REG(GPIO_DATA) ^= 1 << gpio; + GPIO_REG(GPIO_DATA_REG_OFFSET) ^= 1 << gpio; +} + +void gpio_set_input_filter_enable(gpio_e gpio, uint8_t en) +{ + if (en) + GPIO_REG(GPIO_FILTER_REG_OFFSET) |= 1 << gpio; + else + GPIO_REG(GPIO_FILTER_REG_OFFSET) &= ~(1 << gpio); +} + +void gpio_set_interrupt_mode(gpio_e gpio, gpio_intr_mode_e mode) +{ + GPIO_REG(GPIO_INTR_REG_OFFSET) &= ~(0x3 << (gpio << 1)); + GPIO_REG(GPIO_INTR_REG_OFFSET) |= ((uint8_t)mode) << (gpio << 1); +} + +void gpio_clear_intr_pending(gpio_e gpio) +{ + GPIO_REG(GPIO_INTR_REG_OFFSET) |= 1 << (gpio + 16); +} + +uint8_t gpio_get_intr_pending(gpio_e gpio) +{ + if (GPIO_REG(GPIO_INTR_REG_OFFSET) & (1 << (gpio + 16))) + return 1; + else + return 0; } diff --git a/sdk/bsp/trap_entry.S b/sdk/bsp/trap_entry.S index 5556e07..e8a4fc8 100644 --- a/sdk/bsp/trap_entry.S +++ b/sdk/bsp/trap_entry.S @@ -17,6 +17,9 @@ vector_table: .word handle_exception_unknown .word handle_exception_unknown .word timer_irq_handler + .word uart0_irq_handler + .word gpio0_irq_handler + .word gpio1_irq_handler /* add your ISR here */ .weak illegal_instruction_handler @@ -27,6 +30,9 @@ vector_table: .weak store_misaligned_handler .weak handle_exception_unknown .weak timer_irq_handler +.weak uart0_irq_handler +.weak gpio0_irq_handler +.weak gpio1_irq_handler handle_exception_unknown: j handle_exception_unknown @@ -58,6 +64,15 @@ store_misaligned_handler: timer_irq_handler: j timer_irq_handler +uart0_irq_handler: + j uart0_irq_handler + +gpio0_irq_handler: + j gpio0_irq_handler + +gpio1_irq_handler: + j gpio1_irq_handler + /* 异常和中断总入口 */ trap_entry: addi sp, sp, -32*17