parent
5fa659a084
commit
fdd953c0f0
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue