Add esp/gpio_regs.h
This commit is contained in:
parent
2ffd3da71e
commit
fc1a1a7d0a
6 changed files with 167 additions and 114 deletions
133
core/include/esp/gpio_regs.h
Normal file
133
core/include/esp/gpio_regs.h
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/* esp/iomux_regs.h
|
||||
*
|
||||
* ESP8266 GPIO register definitions
|
||||
*
|
||||
* Not compatible with ESP SDK register access code.
|
||||
*/
|
||||
|
||||
#ifndef _ESP_GPIO_REGS_H
|
||||
#define _ESP_GPIO_REGS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include "common_macros.h"
|
||||
|
||||
#define GPIO_BASE 0x60000300
|
||||
#define GPIO (*(struct GPIO_REGS *)(GPIO_BASE))
|
||||
|
||||
/** GPIO output registers GPIO.OUT, GPIO.OUT_SET, GPIO.OUT_CLEAR:
|
||||
*
|
||||
* _SET and _CLEAR write-only registers set and clear bits in the main register,
|
||||
* respectively.
|
||||
*
|
||||
* i.e.
|
||||
* GPIO.OUT_SET = BIT(3);
|
||||
* and
|
||||
* GPIO.OUT |= BIT(3);
|
||||
*
|
||||
* ... are equivalent, but the former uses fewer CPU cycles.
|
||||
*
|
||||
* ENABLE_OUT / ENABLE_OUT_SET / ENABLE_OUT_CLEAR:
|
||||
*
|
||||
* Determine whether the corresponding GPIO has its output enabled or not.
|
||||
* When clear, GPIO can function as an input. When set, GPIO will drive its
|
||||
* output (and IN register will simply reflect the output state).
|
||||
*
|
||||
* (_SET/_CLEAR function similarly to OUT registers)
|
||||
*
|
||||
* STATUS / STATUS_SET / STATUS_CLEAR:
|
||||
*
|
||||
* Indicates which GPIOs have triggered an interrupt. Interrupt status should
|
||||
* be reset by writing to STATUS or STATUS_CLEAR.
|
||||
*
|
||||
* (_SET/_CLEAR function similarly to OUT registers)
|
||||
*/
|
||||
|
||||
struct GPIO_REGS {
|
||||
uint32_t volatile OUT; // 0x00
|
||||
uint32_t volatile OUT_SET; // 0x04
|
||||
uint32_t volatile OUT_CLEAR; // 0x08
|
||||
uint32_t volatile ENABLE_OUT; // 0x0c
|
||||
uint32_t volatile ENABLE_OUT_SET; // 0x10
|
||||
uint32_t volatile ENABLE_OUT_CLEAR; // 0x14
|
||||
uint32_t volatile IN; // 0x18
|
||||
uint32_t volatile STATUS; // 0x1c
|
||||
uint32_t volatile STATUS_SET; // 0x20
|
||||
uint32_t volatile STATUS_CLEAR; // 0x24
|
||||
uint32_t volatile CONF[16]; // 0x28 - 0x64
|
||||
uint32_t volatile PWM; // 0x68
|
||||
uint32_t volatile RTC_CALIB; // 0x6c
|
||||
uint32_t volatile RTC_CALIB_RESULT; // 0x70
|
||||
} __attribute__ (( packed ));
|
||||
|
||||
/* Double-check the structure size to make sure the compiler hasn't done
|
||||
* something strange (or somebody typoed in the struct definition, etc)
|
||||
*/
|
||||
_Static_assert(sizeof(struct GPIO_REGS) == 0x74, "GPIO_REGS is the wrong size");
|
||||
|
||||
/* Bit mapping for CONF[i] registers */
|
||||
|
||||
/* GPIO.CONF[i] control the pin behavior for the corresponding GPIO in/output.
|
||||
*
|
||||
* GPIO_CONF_CONFIG (multi-value)
|
||||
* FIXME: Unclear what these do. Need to find a better name.
|
||||
*
|
||||
* GPIO_CONF_WAKEUP_ENABLE (boolean)
|
||||
* Can an interrupt contion on this pin wake the processor from a sleep
|
||||
* state?
|
||||
*
|
||||
* GPIO_CONF_INTTYPE (multi-value)
|
||||
* Under what conditions this GPIO input should generate an interrupt.
|
||||
* (see gpio_inttype_t enum below for values)
|
||||
*
|
||||
* GPIO_CONF_DRIVER_ENABLE (boolean)
|
||||
* When set, a high output state will pull the pin up to +Vcc (3.3V). When
|
||||
* cleared, output functions in "open drain" mode (low state will pull down
|
||||
* to ground, but high state allows output to "float").
|
||||
*
|
||||
* GPIO_CONF_SOURCE_PWM (boolean)
|
||||
* When set, GPIO pin output will be connected to the sigma-delta PWM
|
||||
* generator (controlled by the GPIO.PWM register). When cleared, pin
|
||||
* output will function as a normal GPIO output (controlled by the
|
||||
* GPIO.OUT* registers).
|
||||
*/
|
||||
|
||||
#define GPIO_CONF_CONFIG_M 0x00000003
|
||||
#define GPIO_CONF_CONFIG_S 11
|
||||
#define GPIO_CONF_WAKEUP_ENABLE BIT(10)
|
||||
#define GPIO_CONF_INTTYPE_M 0x00000007
|
||||
#define GPIO_CONF_INTTYPE_S 7
|
||||
#define GPIO_CONF_DRIVER_ENABLE BIT(2)
|
||||
#define GPIO_CONF_SOURCE_PWM BIT(0)
|
||||
|
||||
/* Valid values for the GPIO_CONF_INTTYPE field */
|
||||
typedef enum {
|
||||
GPIO_INTTYPE_NONE = 0,
|
||||
GPIO_INTTYPE_EDGE_POS = 1,
|
||||
GPIO_INTTYPE_EDGE_NEG = 2,
|
||||
GPIO_INTTYPE_EDGE_ANY = 3,
|
||||
GPIO_INTTYPE_LEVEL_LOW = 4,
|
||||
GPIO_INTTYPE_LEVEL_HIGH = 5,
|
||||
} gpio_inttype_t;
|
||||
|
||||
/* Bit mapping for PWM register */
|
||||
|
||||
#define GPIO_PWM_ENABLE BIT(16)
|
||||
#define GPIO_PWM_PRESCALER_M 0x000000ff
|
||||
#define GPIO_PWM_PRESCALER_S 8
|
||||
#define GPIO_PWM_TARGET_M 0x000000ff
|
||||
#define GPIO_PWM_TARGET_S 0
|
||||
|
||||
/* Bit mapping for RTC_CALIB register */
|
||||
|
||||
#define GPIO_RTC_CALIB_START BIT(31)
|
||||
#define GPIO_RTC_CALIB_PERIOD_M 0x000003ff
|
||||
#define GPIO_RTC_CALIB_PERIOD_S 0
|
||||
|
||||
/* Bit mapping for RTC_CALIB_RESULT register */
|
||||
|
||||
#define GPIO_RTC_CALIB_RESULT_READY BIT(31)
|
||||
#define GPIO_RTC_CALIB_RESULT_READY_REAL BIT(30)
|
||||
#define GPIO_RTC_CALIB_RESULT_VALUE_M 0x000fffff
|
||||
#define GPIO_RTC_CALIB_RESULT_VALUE_S 0
|
||||
|
||||
#endif /* _ESP_GPIO_REGS_H */
|
||||
Loading…
Add table
Add a link
Reference in a new issue