c7a904fa12
- Clarify the macros MSSIO_EC_DEFAULT and MSSIO_EC_USB_DEFAULT - Remove PULLDOWN bit from MSSIO_EC_DEFAULT, it was on by accident - Fix some EC configuration macros; DRVSTR was wrong, clean up the others - Define GPIO_PULLUP and GPIO_PULLDOWN like on many other platforms Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
324 lines
11 KiB
C
324 lines
11 KiB
C
/****************************************************************************
|
|
* arch/risc-v/src/mpfs/mpfs_gpio.h
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef __ARCH_RISCV_SRC_MPFS_MPFS_GPIO_H
|
|
#define __ARCH_RISCV_SRC_MPFS_MPFS_GPIO_H
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#endif
|
|
|
|
#include <nuttx/irq.h>
|
|
#include <nuttx/arch.h>
|
|
|
|
#include "chip.h"
|
|
#include "hardware/mpfs_gpio.h"
|
|
|
|
/****************************************************************************
|
|
* Pre-Processor Declarations
|
|
****************************************************************************/
|
|
|
|
/* Bit-encoded input to mpfs_configgpio() */
|
|
|
|
/* Each port bit of the general-purpose I/O (GPIO) ports can be individually
|
|
* configured by software in several modes:
|
|
*
|
|
* - Input
|
|
* - Output
|
|
* - Output with buffer enable
|
|
* - Output with buffer disable
|
|
* - Input with irq level high
|
|
* - Input with irq level low
|
|
* - Input with irq edge positive
|
|
* - Input with irq edge negative
|
|
* - Alternate Function IO (pad) mux
|
|
*
|
|
* 16-bit Encoding: 1111 1100 0000 0000
|
|
* 5432 1098 7654 3210
|
|
* ---- ---- ---- ----
|
|
* MMBI III. .bbP PPPP
|
|
*/
|
|
|
|
/* Mode:
|
|
*
|
|
* 1111 1100 0000 0000
|
|
* 5432 1098 7654 3210
|
|
* ---- ---- ---- ----
|
|
* MM.. .... .... ....
|
|
*/
|
|
|
|
#define GPIO_EC_SHIFT (20) /* Bits 20-31 Electrical Configuration */
|
|
#define GPIO_EC_MASK (0xFFF << GPIO_EC_SHIFT)
|
|
#define GPIO_EC_PUPD_SHIFT (30) /* Bit 30-31 Electrical Configuration PUPD */
|
|
#define GPIO_EC_PUPD_MASK (3 << GPIO_EC_PUPD_SHIFT)
|
|
#define GPIO_PULLDOWN (1 << GPIO_EC_PUPD_SHIFT)
|
|
#define GPIO_PULLUP (2 << GPIO_EC_PUPD_SHIFT)
|
|
#define GPIO_EC_LOCKDN_SHIFT (29) /* Bit 29 Electrical Configuration Lockdn */
|
|
#define GPIO_EC_LOCKDN (1 << GPIO_EC_LOCKDN_SHIFT)
|
|
#define GPIO_EC_ENHYST_SHIFT (28) /* Bit 28 Electrical Configuration Hyst */
|
|
#define GPIO_EC_ENHYST (1 << GPIO_EC_ENHYST_SHIFT)
|
|
#define GPIO_EC_CLAMP_SHIFT (27) /* Bit 27 Electrical Configuration Clamp */
|
|
#define GPIO_EC_CLAMP (1 << GPIO_EC_CLAMP_SHIFT)
|
|
#define GPIO_EC_DRVSTR_SHIFT (23) /* Bit 23-26 Electrical Configuration drive strength */
|
|
#define GPIO_EC_DRVSTR_MASK (0xF << GPIO_EC_DRVSTR_SHIFT)
|
|
#define GPIO_EC_DRVSTR(x) (((x) << GPIO_EC_DRVSTR_SHIFT) & GPIO_EC_DRVSTR_MASK)
|
|
#define GPIO_EC_BUFM_SHIFT (20) /* Bit 20-22 Electrical Configuration Buffer Mode*/
|
|
#define GPIO_EC_BUFM_MASK (0x7 << GPIO_EC_BUFM_SHIFT)
|
|
#define GPIO_EC_BUFM(x) (((x) << GPIO_EC_BUFM_SHIFT) & GPIO_EC_BUFM_MASK)
|
|
#define GPIO_AF_SHIFT (16) /* Bit 16-19 Alternate Function */
|
|
#define GPIO_AF_MASK (15 << GPIO_AF_SHIFT)
|
|
#define GPIO_MODE_SHIFT (14) /* Bit 14-15: IO Mode */
|
|
#define GPIO_MODE_MASK (3 << GPIO_MODE_SHIFT)
|
|
# define GPIO_NOINOUT (0 << GPIO_MODE_SHIFT) /* No input or output */
|
|
# define GPIO_INPUT (1 << GPIO_MODE_SHIFT) /* Input Enable */
|
|
# define GPIO_OUTPUT (2 << GPIO_MODE_SHIFT) /* Output Enable */
|
|
|
|
/* Output buffer:
|
|
*
|
|
* 1111 1100 0000 0000
|
|
* 5432 1098 7654 3210
|
|
* ---- ---- ---- ----
|
|
* ..B. .... .... ....
|
|
*/
|
|
|
|
#define GPIO_BUFFER_SHIFT (13) /* Bit 13: Output buffer enabled */
|
|
#define GPIO_BUFFER_MASK (1 << GPIO_BUFFER_SHIFT)
|
|
#define GPIO_BUFFER_DISABLE (0 << GPIO_BUFFER_SHIFT) /* Disable Output buffer */
|
|
#define GPIO_BUFFER_ENABLE (1 << GPIO_BUFFER_SHIFT) /* Enable Output buffer */
|
|
|
|
/* Irq:
|
|
*
|
|
* 1111 1100 0000 0000
|
|
* 5432 1098 7654 3210
|
|
* ---- ---- ---- ----
|
|
* ...I III. .... ....
|
|
*/
|
|
|
|
#define GPIO_IRQ_SHIFT (9) /* Bits 9-12: Irq Mode */
|
|
#define GPIO_IRQ_MASK (15 << GPIO_IRQ_SHIFT)
|
|
#define GPIO_IRQ_HIGH (0 << GPIO_IRQ_SHIFT)
|
|
#define GPIO_IRQ_LOW (1 << GPIO_IRQ_SHIFT)
|
|
#define GPIO_IRQ_EDGE_POS (2 << GPIO_IRQ_SHIFT)
|
|
#define GPIO_IRQ_EDGE_NEG (3 << GPIO_IRQ_SHIFT)
|
|
#define GPIO_IRQ_EDGE_BOTH (4 << GPIO_IRQ_SHIFT)
|
|
#define GPIO_IRQ_ENABLE (8 << GPIO_IRQ_SHIFT)
|
|
#define GPIO_IRQ_DISABLE (0 << GPIO_IRQ_SHIFT)
|
|
|
|
/* Bank:
|
|
*
|
|
* 1111 1100 0000 0000
|
|
* 5432 1098 7654 3210
|
|
* ---- ---- ---- ----
|
|
* .... .... .bb. ....
|
|
*/
|
|
|
|
#define GPIO_BANK_SHIFT (5) /* Bits 5-6: Bank */
|
|
#define GPIO_BANK_MASK (3 << GPIO_BANK_SHIFT)
|
|
#define GPIO_BANK0 (0 << GPIO_BANK_SHIFT)
|
|
#define GPIO_BANK1 (1 << GPIO_BANK_SHIFT)
|
|
#define GPIO_BANK2 (2 << GPIO_BANK_SHIFT)
|
|
|
|
#define GPIO_BANK0_NUM_PINS 14
|
|
#define GPIO_BANK1_NUM_PINS 24
|
|
#define GPIO_BANK2_NUM_PINS 32
|
|
|
|
/* This identifies the bit in the bank:
|
|
*
|
|
* 1111 1100 0000 0000
|
|
* 5432 1098 7654 3210
|
|
* ---- ---- ---- ----
|
|
* .... .... ...P PPPP
|
|
*/
|
|
|
|
#define GPIO_PIN_SHIFT (0) /* Bits 0-4: GPIO number: 0-31 */
|
|
#define GPIO_PIN_MASK (0x1f << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN0 (0 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN1 (1 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN2 (2 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN3 (3 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN4 (4 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN5 (5 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN6 (6 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN7 (7 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN8 (8 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN9 (9 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN10 (10 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN11 (11 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN12 (12 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN13 (13 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN14 (14 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN15 (15 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN16 (16 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN17 (17 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN18 (18 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN19 (19 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN20 (20 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN21 (21 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN22 (22 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN23 (23 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN24 (24 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN25 (25 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN26 (26 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN27 (27 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN28 (28 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN29 (29 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN30 (30 << GPIO_PIN_SHIFT)
|
|
#define GPIO_PIN31 (31 << GPIO_PIN_SHIFT)
|
|
|
|
/****************************************************************************
|
|
* Public Types
|
|
****************************************************************************/
|
|
|
|
/* The smallest integer type that can hold the GPIO encoding */
|
|
|
|
typedef uint32_t gpio_pinset_t;
|
|
|
|
/****************************************************************************
|
|
* Public Data
|
|
****************************************************************************/
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#undef EXTERN
|
|
#if defined(__cplusplus)
|
|
#define EXTERN extern "C"
|
|
extern "C"
|
|
{
|
|
#else
|
|
#define EXTERN extern
|
|
#endif
|
|
|
|
/****************************************************************************
|
|
* Public Function Prototypes
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Name: mpfs_configgpio
|
|
*
|
|
* Description:
|
|
* Configure a GPIO pin based on bit-encoded description of the pin.
|
|
*
|
|
* Returned Value:
|
|
* OK on success
|
|
* ERROR on invalid port.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int mpfs_configgpio(gpio_pinset_t cfgset);
|
|
|
|
/****************************************************************************
|
|
* Name: mpfs_gpio_deinit
|
|
*
|
|
* Description:
|
|
* Deinit a GPIO (Set GPIO to floating input state)
|
|
*
|
|
* Returned Value:
|
|
* OK on success
|
|
* ERROR on invalid port.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int mpfs_gpio_deinit(uint8_t pin);
|
|
|
|
/****************************************************************************
|
|
* Name: mpfs_gpiowrite
|
|
*
|
|
* Description:
|
|
* Write one or zero to the selected GPIO pin
|
|
*
|
|
****************************************************************************/
|
|
|
|
void mpfs_gpiowrite(gpio_pinset_t pinset, bool value);
|
|
|
|
/****************************************************************************
|
|
* Name: mpfs_gpioread
|
|
*
|
|
* Description:
|
|
* Read one or zero from the selected GPIO pin
|
|
*
|
|
****************************************************************************/
|
|
|
|
bool mpfs_gpioread(gpio_pinset_t pinset);
|
|
|
|
/****************************************************************************
|
|
* Name: mpfs_gpiosetevent
|
|
*
|
|
* Description:
|
|
* Sets/clears GPIO based event and interrupt triggers.
|
|
*
|
|
* Input Parameters:
|
|
* - pinset: GPIO pin configuration
|
|
* - risingedge: Enables interrupt on rising edges
|
|
* - fallingedge: Enables interrupt on falling edges
|
|
* - high: Enables interrupt on level high
|
|
* - low: Enables interrupt on level low
|
|
* - event: Generate event when set
|
|
* - func: When non-NULL, generate interrupt
|
|
* - arg: Argument passed to the interrupt callback
|
|
*
|
|
* Returned Value:
|
|
* Zero (OK) on success; a negated errno value on failure indicating the
|
|
* nature of the failure.
|
|
*
|
|
****************************************************************************/
|
|
|
|
int mpfs_gpiosetevent(gpio_pinset_t pinset, bool risingedge,
|
|
bool fallingedge, bool high, bool low, bool event,
|
|
xcpt_t func, void *arg);
|
|
|
|
/****************************************************************************
|
|
* Name: mpfs_gpio_initialize
|
|
*
|
|
* Description:
|
|
* Initialize GPIO drivers for use with /apps/examples/gpio
|
|
*
|
|
****************************************************************************/
|
|
|
|
int mpfs_gpio_initialize(void);
|
|
|
|
/****************************************************************************
|
|
* Function: mpfs_dumpgpio
|
|
*
|
|
* Description:
|
|
* Dump all GPIO registers associated with the provided base address
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifdef CONFIG_DEBUG_GPIO_INFO
|
|
int mpfs_dumpgpio(gpio_pinset_t pinset, const char *msg);
|
|
#else
|
|
#define mpfs_dumpgpio(p, m)
|
|
#endif
|
|
|
|
#undef EXTERN
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
#endif /* __ARCH_RISCV_SRC_MPFS_MPFS_GPIO_H */
|