/** * * \file * * \brief WINC Peripherals Application Interface. * * Copyright (c) 2016 Atmel Corporation. All rights reserved. * * \asf_license_start * * \page License * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. The name of Atmel may not be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * \asf_license_stop * */ #ifndef _M2M_PERIPH_H_ #define _M2M_PERIPH_H_ /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* INCLUDES *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ #include "common/include/nm_common.h" #include "driver/include/m2m_types.h" /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* MACROS *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* DATA TYPES *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ /*! @struct \ tstrPerphInitParam @brief Peripheral module initialization parameters. */ typedef struct { void * arg; } tstrPerphInitParam; /*! @enum \ tenuGpioNum @brief A list of GPIO numbers configurable through the m2m_periph module. */ typedef enum { M2M_PERIPH_GPIO3, /*!< GPIO15 pad */ M2M_PERIPH_GPIO4, /*!< GPIO16 pad */ M2M_PERIPH_GPIO5, /*!< GPIO18 pad */ M2M_PERIPH_GPIO6, /*!< GPIO18 pad */ M2M_PERIPH_GPIO15, /*!< GPIO15 pad */ M2M_PERIPH_GPIO16, /*!< GPIO16 pad */ M2M_PERIPH_GPIO18, /*!< GPIO18 pad */ M2M_PERIPH_GPIO_MAX } tenuGpioNum; /*! @enum \ tenuI2cMasterSclMuxOpt @brief Allowed pin multiplexing options for I2C master SCL signal. */ typedef enum { M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_HOST_WAKEUP, /*!< I2C master SCL is avaiable on HOST_WAKEUP. */ M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_SD_DAT3, /*!< I2C master SCL is avaiable on SD_DAT3 (GPIO 7). */ M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO13, /*!< I2C master SCL is avaiable on GPIO 13. */ M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_GPIO4, /*!< I2C master SCL is avaiable on GPIO 4.*/ M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_I2C_SCL, /*!< I2C master SCL is avaiable on I2C slave SCL. */ M2M_PERIPH_I2C_MASTER_SCL_MUX_OPT_NUM } tenuI2cMasterSclMuxOpt; /*! @enum \ tenuI2cMasterSdaMuxOpt @brief Allowed pin multiplexing options for I2C master SDA signal. */ typedef enum { M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_RTC_CLK , /*!< I2C master SDA is avaiable on RTC_CLK. */ M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_SD_CLK, /*!< I2C master SDA is avaiable on SD_CLK (GPIO 8). */ M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO14, /*!< I2C master SDA is avaiable on GPIO 14. */ M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_GPIO6, /*!< I2C master SDA is avaiable on GPIO 6.*/ M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_I2C_SDA, /*!< I2C master SDA is avaiable on I2C slave SDA. */ M2M_PERIPH_I2C_MASTER_SDA_MUX_OPT_NUM } tenuI2cMasterSdaMuxOpt; /*! @struct \ tstrI2cMasterInitParam @brief I2C master configuration parameters. @sa tenuI2cMasterSclMuxOpt tenuI2cMasterSdaMuxOpt */ typedef struct { uint8 enuSclMuxOpt; /*!< SCL multiplexing option. Allowed value are defined in tenuI2cMasterSclMuxOpt */ uint8 enuSdaMuxOpt; /*!< SDA multiplexing option. Allowed value are defined in tenuI2cMasterSdaMuxOpt */ uint8 u8ClkSpeedKHz; /*!< I2C master clock speed in KHz. */ } tstrI2cMasterInitParam; /*! @enum \ tenuI2cMasterFlags @brief Bitwise-ORed flags for use in m2m_periph_i2c_master_write and m2m_periph_i2c_master_read @sa m2m_periph_i2c_master_write m2m_periph_i2c_master_read */ typedef enum { I2C_MASTER_NO_FLAGS = 0x00, /*!< No flags. */ I2C_MASTER_NO_STOP = 0x01, /*!< No stop bit after this transaction. Useful for scattered buffer read/write operations. */ I2C_MASTER_NO_START = 0x02, /*!< No start bit at the beginning of this transaction. Useful for scattered buffer read/write operations.*/ } tenuI2cMasterFlags; /*! @enum \ tenuPullupMask @brief Bitwise-ORed flags for use in m2m_perph_pullup_ctrl. @sa m2m_periph_pullup_ctrl */ typedef enum { M2M_PERIPH_PULLUP_DIS_HOST_WAKEUP = (1ul << 0), M2M_PERIPH_PULLUP_DIS_RTC_CLK = (1ul << 1), M2M_PERIPH_PULLUP_DIS_IRQN = (1ul << 2), M2M_PERIPH_PULLUP_DIS_GPIO_3 = (1ul << 3), M2M_PERIPH_PULLUP_DIS_GPIO_4 = (1ul << 4), M2M_PERIPH_PULLUP_DIS_GPIO_5 = (1ul << 5), M2M_PERIPH_PULLUP_DIS_SD_DAT3 = (1ul << 6), M2M_PERIPH_PULLUP_DIS_SD_DAT2_SPI_RXD = (1ul << 7), M2M_PERIPH_PULLUP_DIS_SD_DAT1_SPI_SSN = (1ul << 9), M2M_PERIPH_PULLUP_DIS_SD_CMD_SPI_SCK = (1ul << 10), M2M_PERIPH_PULLUP_DIS_SD_DAT0_SPI_TXD = (1ul << 11), M2M_PERIPH_PULLUP_DIS_GPIO_6 = (1ul << 12), M2M_PERIPH_PULLUP_DIS_SD_CLK = (1ul << 13), M2M_PERIPH_PULLUP_DIS_I2C_SCL = (1ul << 14), M2M_PERIPH_PULLUP_DIS_I2C_SDA = (1ul << 15), M2M_PERIPH_PULLUP_DIS_GPIO_11 = (1ul << 16), M2M_PERIPH_PULLUP_DIS_GPIO_12 = (1ul << 17), M2M_PERIPH_PULLUP_DIS_GPIO_13 = (1ul << 18), M2M_PERIPH_PULLUP_DIS_GPIO_14 = (1ul << 19), M2M_PERIPH_PULLUP_DIS_GPIO_15 = (1ul << 20), M2M_PERIPH_PULLUP_DIS_GPIO_16 = (1ul << 21), M2M_PERIPH_PULLUP_DIS_GPIO_17 = (1ul << 22), M2M_PERIPH_PULLUP_DIS_GPIO_18 = (1ul << 23), M2M_PERIPH_PULLUP_DIS_GPIO_19 = (1ul << 24), M2M_PERIPH_PULLUP_DIS_GPIO_20 = (1ul << 25), M2M_PERIPH_PULLUP_DIS_GPIO_21 = (1ul << 26), M2M_PERIPH_PULLUP_DIS_GPIO_22 = (1ul << 27), M2M_PERIPH_PULLUP_DIS_GPIO_23 = (1ul << 28), M2M_PERIPH_PULLUP_DIS_GPIO_24 = (1ul << 29), } tenuPullupMask; /*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* FUNCTION PROTOTYPES *=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ #ifdef __cplusplus extern "C" { #endif /*! @fn \ NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); @brief Initialize the NMC1500 peripheral driver module. @param [in] param Peripheral module initialization structure. See members of tstrPerphInitParam. @return The function SHALL return 0 for success and a negative value otherwise. @sa tstrPerphInitParam */ NMI_API sint8 m2m_periph_init(tstrPerphInitParam * param); /*! @fn \ NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); @brief Configure a specific NMC1500 pad as a GPIO and sets its direction (input or output). @param [in] u8GpioNum GPIO number. Allowed values are defined in tenuGpioNum. @param [in] u8GpioDir GPIO direction: Zero = input. Non-zero = output. @return The function SHALL return 0 for success and a negative value otherwise. @sa tenuGpioNum */ NMI_API sint8 m2m_periph_gpio_set_dir(uint8 u8GpioNum, uint8 u8GpioDir); /*! @fn \ NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); @brief Set an NMC1500 GPIO output level high or low. @param [in] u8GpioNum GPIO number. Allowed values are defined in tenuGpioNum. @param [in] u8GpioVal GPIO output value. Zero = low, non-zero = high. @return The function SHALL return 0 for success and a negative value otherwise. @sa tenuGpioNum */ NMI_API sint8 m2m_periph_gpio_set_val(uint8 u8GpioNum, uint8 u8GpioVal); /*! @fn \ NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); @brief Read an NMC1500 GPIO input level. @param [in] u8GpioNum GPIO number. Allowed values are defined in tenuGpioNum. @param [out] pu8GpioVal GPIO input value. Zero = low, non-zero = high. @return The function SHALL return 0 for success and a negative value otherwise. @sa tenuGpioNum */ NMI_API sint8 m2m_periph_gpio_get_val(uint8 u8GpioNum, uint8 * pu8GpioVal); /*! @fn \ NMI_API sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn); @brief Set an NMC1500 GPIO pullup resisitor enable or disable. @param [in] u8GpioNum GPIO number. Allowed values are defined in tenuGpioNum. @param [in] u8PullupEn Zero: pullup disabled. Non-zero: pullup enabled. @return The function SHALL return 0 for success and a negative value otherwise. @sa tenuGpioNum */ NMI_API sint8 m2m_periph_gpio_pullup_ctrl(uint8 u8GpioNum, uint8 u8PullupEn); /*! @fn \ NMI_API sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam * param); @brief Initialize and configure the NMC1500 I2C master peripheral. @param [in] param I2C master initialization structure. See members of tstrI2cMasterInitParam. @return The function SHALL return 0 for success and a negative value otherwise. @sa tstrI2cMasterInitParam */ NMI_API sint8 m2m_periph_i2c_master_init(tstrI2cMasterInitParam * param); /*! @fn \ NMI_API sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint8 flags); @brief Write a stream of bytes to the I2C slave device. @param [in] u8SlaveAddr 7-bit I2C slave address. @param [in] pu8Buf A pointer to an input buffer which contains a stream of bytes. @param [in] u16BufLen Input buffer length in bytes. @param [in] flags Write operation bitwise-ORed flags. See tenuI2cMasterFlags. @return The function SHALL return 0 for success and a negative value otherwise. @sa tenuI2cMasterFlags */ NMI_API sint8 m2m_periph_i2c_master_write(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint8 flags); /*! @fn \ NMI_API sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint16 * pu16ReadLen, uint8 flags); @brief Write a stream of bytes to the I2C slave device. @param [in] u8SlaveAddr 7-bit I2C slave address. @param [out] pu8Buf A pointer to an output buffer in which a stream of bytes are received. @param [in] u16BufLen Max output buffer length in bytes. @param [out] pu16ReadLen Actual number of bytes received. @param [in] flags Write operation bitwise-ORed flags. See tenuI2cMasterFlags. @return The function SHALL return 0 for success and a negative value otherwise. @sa tenuI2cMasterFlags */ NMI_API sint8 m2m_periph_i2c_master_read(uint8 u8SlaveAddr, uint8 * pu8Buf, uint16 u16BufLen, uint16 * pu16ReadLen, uint8 flags); /*! @fn \ NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); @brief Control the programmable pull-up resistor on the chip pads . @param [in] pinmask Write operation bitwise-ORed mask for which pads to control. Allowed values are defined in tenuPullupMask. @param [in] enable Set to 0 to disable pull-up resistor. Non-zero will enable the pull-up. @return The function SHALL return 0 for success and a negative value otherwise. @sa tenuPullupMask */ NMI_API sint8 m2m_periph_pullup_ctrl(uint32 pinmask, uint8 enable); #ifdef __cplusplus } #endif #endif /* _M2M_PERIPH_H_ */