123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- /* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
- * All rights reserved.
- *
- * This software is supplied "AS IS" without any warranties.
- * RDA assumes no responsibility or liability for the use of the software,
- * conveys no license or title under any patent, copyright, or mask work
- * right to the product. RDA reserves the right to make changes in the
- * software without notification. RDA also make no representation or
- * warranty that such application will be suitable for the specified use
- * without further testing or modification.
- */
- #ifndef _DRV_GPIO_H_
- #define _DRV_GPIO_H_
- #include "osi_api.h"
- #include "quec_common.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- struct drvGpio;
- /**
- * opaque data struct for GPIO instance
- */
- typedef struct drvGpio drvGpio_t;
- /**
- * GPIO interrupt callback
- *
- * It will be called when GPIO interrupt occurs. Due to it is executed in
- * ISR, the callback should follow ISR programming guides.
- */
- typedef void (*drvGpioIntrCB_t)(void *ctx);
- typedef enum
- {
- DRV_GPIO_INPUT,
- DRV_GPIO_OUTPUT
- } drvGpioMode_t;
- /**
- * GPIO configuration
- */
- typedef struct
- {
- drvGpioMode_t mode; ///< GPIO mode
- bool out_level; ///< level to be set for GPIO output
- bool intr_enabled; ///< interrupt enabled, only for GPIO input
- bool intr_level; ///< true for level interrupt, false for edge interrupt
- bool debounce; ///< debounce enabled
- bool rising; ///< rising edge or level high interrupt enabled
- bool falling; ///< falling edge or level low interrupt enabled
- } drvGpioConfig_t;
- /**
- * @brief GPIO module initialization
- *
- * It just initialize GPIO module, and won't touch any GPIO. It should be
- * called before any \p drvGpioOpen.
- */
- void drvGpioInit(void);
- /**
- * @brief open a GPIO
- *
- * IOMUX will be set to GPIO mode at open.
- *
- * Each GPIO sould be opened only once. When it is already opened, this
- * API will return NULL.
- *
- * If the specified GPIO can't support the specified mode, this API will
- * return NULL.
- *
- * If the specified GPIO can't support input interrupt, and interrupt is
- * enabled, this API will return NULL.
- *
- * The returned instance is dynamic allocated, caller should free it after
- * \p drvGpioClose is called.
- *
- * @param id GPIO id. The range may be different among chips.
- * @param cfg GPIO configuration
- * @param cb callback at interrupt
- * @param cb_ctx context pointer for callback
- * @return
- * - GPIO instance pointer
- * - NULL if parameter is invalid
- */
- drvGpio_t *drvGpioOpen(uint32_t id, const drvGpioConfig_t *cfg, drvGpioIntrCB_t cb, void *cb_ctx);
- /**
- * @brief close a GPIO
- *
- * IOMUX will be kept, and the GPIO will be set to input mode.
- *
- * @param d GPIO instance
- */
- void drvGpioClose(drvGpio_t *d);
- /**
- * @brief reconfigure the opened GPIO
- *
- * When the configuration is invalid, the current configuration will
- * be kept.
- *
- * @param d GPIO instance
- * @param cfg GPIO configuration
- * @return
- * - true if GPIO configuration is valid
- * - false if GPIO configuration is invalid
- */
- bool drvGpioReconfig(drvGpio_t *d, const drvGpioConfig_t *cfg);
- /**
- * @brief read the level of GPIO
- *
- * It can be called for both GPIO input and output. For GPIO output,
- * it is the level set by software.
- *
- * @param d GPIO instance
- * @return
- * - true for level high
- * - false for level low
- */
- bool drvGpioRead(drvGpio_t *d);
- /**
- * @brief write level for GPIO
- *
- * When it is called for GPIO input, it will do nothing.
- *
- * When it is called for GPIO output, set the output level.
- *
- * @param d GPIO instance
- * @param level GPIO level to be set,
- * - true for level high
- * - false for level low
- */
- void drvGpioWrite(drvGpio_t *d, bool level);
- /**
- * @brief GPIO suspend callback
- *
- * Explicit GPIO suspend and resume call will be used, in case the order
- * of GPIO suspend/resume is sensitive.
- *
- * @param mode suspend mode
- */
- void drvGpioSuspend(osiSuspendMode_t mode);
- /**
- * @brief GPIO resume callback
- *
- * Explicit GPIO suspend and resume call will be used, in case the order
- * of GPIO suspend/resume is sensitive.
- *
- * @param mode suspend mode
- * @param source wakeup source
- */
- void drvGpioResume(osiSuspendMode_t mode, uint32_t source);
- #ifdef CONFIG_QUEC_PROJECT_FEATURE_GPIO
- void quec_drvGpioOpen(uint32_t id, drvGpioIntrCB_t cb, void *cb_ctx);
- void quec_drvGpioClose(uint32_t id);
- void quec_drvGpioInit(uint32_t gpio_set1, uint32_t gpio_set2);
- #endif
- #ifdef __cplusplus
- }
- #endif
- #endif
|