http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.h ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.h b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.h deleted file mode 100644 index 980822a..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twi_master/nrf_drv_twi.h +++ /dev/null @@ -1,415 +0,0 @@ -/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ - -/** - * - * @defgroup nrf_twi Two-wire interface (TWI) - * @ingroup nrf_drivers - * @brief Two-wire interface (TWI) APIs. - * - * @defgroup nrf_twi_master TWI master HAL and driver - * @ingroup nrf_twi - * @brief TWI master APIs. - * @details The TWI and TWIM HALs provide basic APIs for accessing the registers of the TWI and TWIM peripherals, respectively. - * - * The TWI master driver provides APIs on a higher level. - * - */ - -#ifndef NRF_DRV_TWI_H__ -#define NRF_DRV_TWI_H__ - -#include "nordic_common.h" -#include "nrf_drv_config.h" - -#ifdef __cplusplus -extern "C" { -#endif - -// This set of macros makes it possible to exclude parts of code when one type -// of supported peripherals is not used. -#if ((TWI0_ENABLED == 1 && TWI0_USE_EASY_DMA == 1) || \ - (TWI1_ENABLED == 1 && TWI1_USE_EASY_DMA == 1)) - #define TWIM_IN_USE -#endif -#if ((TWI0_ENABLED == 1 && TWI0_USE_EASY_DMA != 1) || \ - (TWI1_ENABLED == 1 && TWI1_USE_EASY_DMA != 1)) - #define TWI_IN_USE -#endif - -#include "nrf_twi.h" -#ifdef TWIM_IN_USE - #include "nrf_twim.h" -#endif -#include "sdk_errors.h" - -#if defined(NRF52) - #define NRF_DRV_TWI_PERIPHERAL(id) \ - (CONCAT_3(TWI, id, _USE_EASY_DMA) == 1 ? \ - (void *)CONCAT_2(NRF_TWIM, id) \ - : (void *)CONCAT_2(NRF_TWI, id)) -#else - #define NRF_DRV_TWI_PERIPHERAL(id) (void *)CONCAT_2(NRF_TWI, id) -#endif - -/** - * @defgroup nrf_drv_twi TWI master driver - * @{ - * @ingroup nrf_twi_master - * @brief Multi-instance TWI master driver. - */ - -/** - * @brief Structure for the TWI master driver instance. - */ -typedef struct -{ - union - { -#ifdef TWIM_IN_USE - NRF_TWIM_Type * p_twim; ///< Pointer to a structure with TWIM registers. -#endif - NRF_TWI_Type * p_twi; ///< Pointer to a structure with TWI registers. - } reg; - uint8_t drv_inst_idx; ///< Driver instance index. - bool use_easy_dma; ///< True if the peripheral with EasyDMA (TWIM) shall be used. -} nrf_drv_twi_t; - -/** - * @brief Macro for creating a TWI master driver instance. - */ -#define NRF_DRV_TWI_INSTANCE(id) \ -{ \ - .reg = {NRF_DRV_TWI_PERIPHERAL(id)}, \ - .drv_inst_idx = CONCAT_3(TWI, id, _INSTANCE_INDEX), \ - .use_easy_dma = CONCAT_3(TWI, id, _USE_EASY_DMA) \ -} - -/** - * @brief Structure for the TWI master driver instance configuration. - */ -typedef struct -{ - uint32_t scl; ///< SCL pin number. - uint32_t sda; ///< SDA pin number. - nrf_twi_frequency_t frequency; ///< TWI frequency. - uint8_t interrupt_priority; ///< Interrupt priority. -} nrf_drv_twi_config_t; - -/** - * @brief TWI master driver instance default configuration. - */ -#define NRF_DRV_TWI_DEFAULT_CONFIG(id) \ -{ \ - .frequency = CONCAT_3(TWI, id, _CONFIG_FREQUENCY), \ - .scl = CONCAT_3(TWI, id, _CONFIG_SCL), \ - .sda = CONCAT_3(TWI, id, _CONFIG_SDA), \ - .interrupt_priority = CONCAT_3(TWI, id, _CONFIG_IRQ_PRIORITY) \ -} - -#define NRF_DRV_TWI_FLAG_TX_POSTINC (1UL << 0) /**< TX buffer address incremented after transfer. */ -#define NRF_DRV_TWI_FLAG_RX_POSTINC (1UL << 1) /**< RX buffer address incremented after transfer. */ -#define NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER (1UL << 2) /**< Interrupt after each transfer is suppressed, and the event handler is not called. */ -#define NRF_DRV_TWI_FLAG_HOLD_XFER (1UL << 3) /**< Set up the transfer but do not start it. */ -#define NRF_DRV_TWI_FLAG_REPEATED_XFER (1UL << 4) /**< Flag indicating that the transfer will be executed multiple times. */ -#define NRF_DRV_TWI_FLAG_TX_NO_STOP (1UL << 5) /**< Flag indicating that the TX transfer will not end with a stop condition. */ -#define NRF_DRV_TWI_FLAG_RX_NO_STOP (1UL << 6) /**< Flag indicating that the RX transfer will not end with a stop condition. */ - -/** - * @brief TWI master driver event types. - */ -typedef enum -{ - NRF_DRV_TWI_EVT_DONE, ///< Transfer completed event. - NRF_DRV_TWI_EVT_ADDRESS_NACK, ///< Error event: NACK received after sending the address. - NRF_DRV_TWI_EVT_DATA_NACK ///< Error event: NACK received after sending a data byte. -} nrf_drv_twi_evt_type_t; - -/** - * @brief TWI master driver transfer types. - */ -typedef enum -{ - NRF_DRV_TWI_XFER_TX, ///< TX transfer. - NRF_DRV_TWI_XFER_RX, ///< RX transfer. - NRF_DRV_TWI_XFER_TXRX, ///< TX transfer followed by RX transfer with repeated start. - NRF_DRV_TWI_XFER_TXTX ///< TX transfer followed by TX transfer with repeated start. -} nrf_drv_twi_xfer_type_t; - -/** - * @brief Structure for a TWI transfer descriptor. - */ -typedef struct -{ - nrf_drv_twi_xfer_type_t type; ///< Type of transfer. - uint8_t address; ///< Slave address. - uint8_t primary_length; ///< Number of bytes transferred. - uint8_t secondary_length; ///< Number of bytes transferred. - uint8_t * p_primary_buf; ///< Pointer to transferred data. - uint8_t * p_secondary_buf; ///< Pointer to transferred data. -} nrf_drv_twi_xfer_desc_t; - - -/**@brief Macro for setting the TX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_TX(addr, p_data, length) \ - { \ - .type = NRF_DRV_TWI_XFER_TX, \ - .address = addr, \ - .primary_length = length, \ - .p_primary_buf = p_data, \ - } - -/**@brief Macro for setting the RX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_RX(addr, p_data, length) \ - { \ - .type = NRF_DRV_TWI_XFER_RX, \ - .address = addr, \ - .primary_length = length, \ - .p_primary_buf = p_data, \ - } - -/**@brief Macro for setting the TXRX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_TXRX(addr, p_tx, tx_len, p_rx, rx_len) \ - { \ - .type = NRF_DRV_TWI_XFER_TXRX, \ - .address = addr, \ - .primary_length = tx_len, \ - .secondary_length = rx_len, \ - .p_primary_buf = p_tx, \ - .p_secondary_buf = p_rx, \ - } - -/**@brief Macro for setting the TXTX transfer descriptor. */ -#define NRF_DRV_TWI_XFER_DESC_TXTX(addr, p_tx, tx_len, p_tx2, tx_len2) \ - { \ - .type = NRF_DRV_TWI_XFER_TXTX, \ - .address = addr, \ - .primary_length = tx_len, \ - .secondary_length = tx_len2, \ - .p_primary_buf = p_tx, \ - .p_secondary_buf = p_tx2, \ - } - -/** - * @brief Structure for a TWI event. - */ -typedef struct -{ - nrf_drv_twi_evt_type_t type; ///< Event type. - nrf_drv_twi_xfer_desc_t xfer_desc; ///< Transfer details. -} nrf_drv_twi_evt_t; - -/** - * @brief TWI event handler prototype. - */ -typedef void (* nrf_drv_twi_evt_handler_t)(nrf_drv_twi_evt_t const * p_event, - void * p_context); - -/** - * @brief Function for initializing the TWI instance. - * - * @param[in] p_instance TWI instance. - * @param[in] p_config Initial configuration. If NULL, the default configuration is used. - * @param[in] event_handler Event handler provided by the user. If NULL, blocking mode is enabled. - * @param[in] p_context Context passed to event handler. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is in invalid state. - * @retval NRF_ERROR_BUSY If some other peripheral with the same - * instance ID is already in use. This is - * possible only if PERIPHERAL_RESOURCE_SHARING_ENABLED - * is set to a value other than zero. - */ -ret_code_t nrf_drv_twi_init(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_config_t const * p_config, - nrf_drv_twi_evt_handler_t event_handler, - void * p_context); - -/** - * @brief Function for uninitializing the TWI instance. - * - * @param[in] p_instance TWI instance. - */ -void nrf_drv_twi_uninit(nrf_drv_twi_t const * p_instance); - -/** - * @brief Function for enabling the TWI instance. - * - * @param[in] p_instance TWI instance. - */ -void nrf_drv_twi_enable(nrf_drv_twi_t const * p_instance); - -/** - * @brief Function for disabling the TWI instance. - * - * @param[in] p_instance TWI instance. - */ -void nrf_drv_twi_disable(nrf_drv_twi_t const * p_instance); - -/** - * @brief Function for sending data to a TWI slave. - * - * The transmission will be stopped when an error occurs. If a transfer is ongoing, - * the function returns the error code @ref NRF_ERROR_BUSY. - * - * @param[in] p_instance TWI instance. - * @param[in] address Address of a specific slave device (only 7 LSB). - * @param[in] p_data Pointer to a transmit buffer. - * @param[in] length Number of bytes to send. - * @param[in] no_stop If set, the stop condition is not generated on the bus - * after the transfer has completed successfully (allowing - * for a repeated start in the next transfer). - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_INTERNAL If an error was detected by hardware. - */ -ret_code_t nrf_drv_twi_tx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t const * p_data, - uint8_t length, - bool no_stop); - -/** - * @brief Function for reading data from a TWI slave. - * - * The transmission will be stopped when an error occurs. If a transfer is ongoing, - * the function returns the error code @ref NRF_ERROR_BUSY. - * - * @param[in] p_instance TWI instance. - * @param[in] address Address of a specific slave device (only 7 LSB). - * @param[in] p_data Pointer to a receive buffer. - * @param[in] length Number of bytes to be received. - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_INTERNAL If an error was detected by hardware. - */ -ret_code_t nrf_drv_twi_rx(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t * p_data, - uint8_t length); - -/** - * @brief Function for reading data from a TWI slave. - * - * The transmission will be stopped when an error occurs. If a transfer is ongoing, - * the function returns the error code @ref NRF_ERROR_BUSY. - * - * @param[in] p_instance TWI instance. - * @param[in] address Address of a specific slave device (only 7 LSB). - * @param[in] p_data Pointer to a receive buffer. - * @param[in] length Number of bytes to be received. - * @param[in] no_stop If set, do not generate a stop after transfer - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_INTERNAL If an error was detected by hardware. - */ -ret_code_t nrf_drv_twi_rx_ext(nrf_drv_twi_t const * p_instance, - uint8_t address, - uint8_t * p_data, - uint8_t length, - bool no_stop); - -/** - * @brief Function for preparing a TWI transfer. - * - * The following transfer types can be configured (@ref nrf_drv_twi_xfer_desc_t::type): - * - @ref NRF_DRV_TWI_XFER_TXRX<span></span>: Write operation followed by a read operation (without STOP condition in between). - * - @ref NRF_DRV_TWI_XFER_TXTX<span></span>: Write operation followed by a write operation (without STOP condition in between). - * - @ref NRF_DRV_TWI_XFER_TX<span></span>: Write operation (with or without STOP condition). - * - @ref NRF_DRV_TWI_XFER_RX<span></span>: Read operation (with STOP condition). - * - * Additional options are provided using the flags parameter: - * - @ref NRF_DRV_TWI_FLAG_TX_POSTINC and @ref NRF_DRV_TWI_FLAG_RX_POSTINC<span></span>: Post-incrementation of buffer addresses. Supported only by TWIM. - * - @ref NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER<span></span>: No user event handler after transfer completion. In most cases, this also means no interrupt at the end of the transfer. - * - @ref NRF_DRV_TWI_FLAG_HOLD_XFER<span></span>: Driver is not starting the transfer. Use this flag if the transfer is triggered externally by PPI. Supported only by TWIM. - * Use @ref nrf_drv_twi_start_task_get to get the address of the start task. - * - @ref NRF_DRV_TWI_FLAG_REPEATED_XFER<span></span>: Prepare for repeated transfers. You can set up a number of transfers that will be triggered externally (for example by PPI). - * An example is a TXRX transfer with the options @ref NRF_DRV_TWI_FLAG_RX_POSTINC, @ref NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER, and @ref NRF_DRV_TWI_FLAG_REPEATED_XFER. - * After the transfer is set up, a set of transfers can be triggered by PPI that will read, for example, the same register of an - * external component and put it into a RAM buffer without any interrupts. @ref nrf_drv_twi_stopped_event_get can be used to get the - * address of the STOPPED event, which can be used to count the number of transfers. If @ref NRF_DRV_TWI_FLAG_REPEATED_XFER is used, - * the driver does not set the instance into busy state, so you must ensure that the next transfers are set up - * when TWIM is not active. Supported only by TWIM. - * - @ref NRF_DRV_TWI_FLAG_TX_NO_STOP<span></span>: No stop condition after TX transfer. - * - * @note - * Some flag combinations are invalid: - * - @ref NRF_DRV_TWI_FLAG_TX_NO_STOP with @ref nrf_drv_twi_xfer_desc_t::type different than @ref NRF_DRV_TWI_XFER_TX - * - @ref NRF_DRV_TWI_FLAG_REPEATED_XFER with @ref nrf_drv_twi_xfer_desc_t::type set to @ref NRF_DRV_TWI_XFER_TXTX - * - * If @ref nrf_drv_twi_xfer_desc_t::type is set to @ref NRF_DRV_TWI_XFER_TX and the @ref NRF_DRV_TWI_FLAG_TX_NO_STOP and @ref NRF_DRV_TWI_FLAG_REPEATED_XFER - * flags are set, two tasks must be used to trigger a transfer: TASKS_RESUME followed by TASKS_STARTTX. If no stop condition is generated, - * TWIM is in SUSPENDED state. Therefore, it must be resumed before the transfer can be started. - * - * @note - * This function should be used only if the instance is configured to work in non-blocking mode. If the function is used in blocking mode, the driver asserts. - * @note If you are using this function with TWI, the only supported flag is @ref NRF_DRV_TWI_FLAG_TX_NO_STOP. All other flags require TWIM. - * - * @param[in] p_instance TWI instance. - * @param[in] p_xfer_desc Pointer to the transfer descriptor. - * @param[in] flags Transfer options (0 for default settings). - * - * @retval NRF_SUCCESS If the procedure was successful. - * @retval NRF_ERROR_BUSY If the driver is not ready for a new transfer. - * @retval NRF_ERROR_NOT_SUPPORTED If the provided parameters are not supported. - */ -ret_code_t nrf_drv_twi_xfer(nrf_drv_twi_t const * p_instance, - nrf_drv_twi_xfer_desc_t const * p_xfer_desc, - uint32_t flags); - -/** - * @brief Function for getting the transferred data count. - * - * This function provides valid results only in legacy mode. - * - * @param[in] p_instance TWI instance. - * - * @return Data count. - */ -uint32_t nrf_drv_twi_data_count_get(nrf_drv_twi_t const * const p_instance); - -/** - * @brief Function for returning the address of a TWI/TWIM start task. - * - * This function should be used if @ref nrf_drv_twi_xfer was called with the flag @ref NRF_DRV_TWI_FLAG_HOLD_XFER. - * In that case, the transfer is not started by the driver, but it must be started externally by PPI. - * - * @param[in] p_instance TWI instance. - * @param[in] xfer_type Transfer type used in the last call of the @ref nrf_drv_twi_xfer function. - * - * @return Start task address (TX or RX) depending on the value of xfer_type. - */ -uint32_t nrf_drv_twi_start_task_get(nrf_drv_twi_t const * p_instance, nrf_drv_twi_xfer_type_t xfer_type); - -/** - * @brief Function for returning the address of a STOPPED TWI/TWIM event. - * - * A STOPPED event can be used to detect the end of a transfer if the @ref NRF_DRV_TWI_FLAG_NO_XFER_EVT_HANDLER - * option is used. - * - * @param[in] p_instance TWI instance. - * - * @return STOPPED event address. - */ -uint32_t nrf_drv_twi_stopped_event_get(nrf_drv_twi_t const * p_instance); -/** - *@} - **/ - -#ifdef __cplusplus -} -#endif - -#endif // NRF_DRV_TWI_H__
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.c ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.c b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.c deleted file mode 100644 index 21f98ed..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.c +++ /dev/null @@ -1,881 +0,0 @@ -/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ -#include "nrf_drv_twis.h" -#include "nrf_assert.h" -#include "nordic_common.h" -#include "app_util_platform.h" -#include "nrf_gpio.h" - -#if TWIS_COUNT == 0 -#error "TWIS driver included but none of TWIS devices is activated in the configuration file" -#endif - -/** - * @internal - * @ingroup lib_twis_drv - * @defgroup lib_twis_drv_ivars Software controlled TWI Slave internal variables - * - * Internal variables for TWIS. - * @{ - */ - -/** - * @brief Actual state of internal state machine - * - * Current substate of powered on state. - */ -typedef enum -{ - NRF_DRV_TWIS_SUBSTATE_IDLE, ///< No ongoing transmission - NRF_DRV_TWIS_SUBSTATE_READ_WAITING, ///< Read request received, waiting for data - NRF_DRV_TWIS_SUBSTATE_READ_PENDING, ///< Reading is actually pending (data sending) - NRF_DRV_TWIS_SUBSTATE_WRITE_WAITING, ///< Write request received, waiting for data buffer - NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING, ///< Writing is actually pending (data receiving) -}nrf_drv_twis_substate_t; - -/** - * @brief Constant instance part - * - * Instance data that have not to change. - * It may be placed in FLASH memory. - */ -typedef struct -{ - NRF_TWIS_Type * const p_reg; ///< Peripheral registry address -} nrf_drv_twis_const_inst_t; - -/** - * @brief Variable instance part - * - * There are all informations for the instance that may change. - */ -typedef struct -{ - nrf_drv_state_t state; ///< Actual driver state - volatile nrf_drv_twis_substate_t substate; ///< Actual driver substate - nrf_drv_twis_event_handler_t ev_handler; ///< Event handler functiomn - volatile uint32_t error; ///< Internal error flags - /**< Internal copy of hardware errors flags merged - * with specific internal driver errors flags. - * - * @note This value can be changed in the interrupt - * and cleared in the main program. - * Always use Atomic load-store when updating - * this value in main loop. - */ -}nrf_drv_twis_var_inst_t; - - -/** The constant instance part implementation */ -static const nrf_drv_twis_const_inst_t m_const_inst[TWIS_COUNT] = -{ - #define X(n) { .p_reg = NRF_TWIS##n }, - #include "nrf_drv_twis_inst.def" -}; - -/** The variable instance part implementation */ -static nrf_drv_twis_var_inst_t m_var_inst[TWIS_COUNT] = -{ - #define X(n) { .state = NRF_DRV_STATE_UNINITIALIZED, \ - .substate = NRF_DRV_TWIS_SUBSTATE_IDLE, \ - .ev_handler = NULL, \ - .error = 0 }, - #include "nrf_drv_twis_inst.def" -}; - -#if PERIPHERAL_RESOURCE_SHARING_ENABLED - #define IRQ_HANDLER_NAME(n) irq_handler_for_instance_##n - #define IRQ_HANDLER(n) static void IRQ_HANDLER_NAME(n)(void) - - #if TWIS0_ENABLED - IRQ_HANDLER(0); - #endif - #if TWIS1_ENABLED - IRQ_HANDLER(1); - #endif - static nrf_drv_irq_handler_t const m_irq_handlers[TWIS_COUNT] = { - #if TWIS0_ENABLED - IRQ_HANDLER_NAME(0), - #endif - #if TWIS1_ENABLED - IRQ_HANDLER_NAME(1), - #endif - }; -#else - #define IRQ_HANDLER(n) \ - void SPIM##n##_SPIS##n##_TWIM##n##_TWIS##n##_SPI##n##_TWI##n##_IRQHandler(void) -#endif // PERIPHERAL_RESOURCE_SHARING_ENABLED - -/** - * @brief State processing semaphore - * - * There are semaphores used when when working in synchronous mode (without interrupts activated). - * @note - * In synchronous mode before every state checking the state machine is executed. - * But the situation where state checking function is called from main task and in the same from - * interrupt task has to be considered. - * In such a situation the @ref nrf_drv_twis_state_machine function may be interrupted by second - * call to the same function. - * If in this second call any event will be detected it may be lost because new substate would be - * overwritten when interrupted function finishes. - * In the same time information about event would be lost because it is cleared in interrupting - * function. - * @note - * To make situation described above safe, simple semaphore is implemented. - * It is just a binary flag that informs that state machine is actually executing and should not - * be processed in any interrupting function. - * Because of how it is used no atomic instructions are required to support this kind of semaphore. - * It is not waitable semaphore - function executed or not depending of its state. - */ -static uint8_t m_sm_semaphore[TWIS_COUNT]; - -/** - * @brief Default configuration - * - * Array with default configurations for each driver instance. - */ -static const nrf_drv_twis_config_t m_config_default[TWIS_COUNT] = -{ - #define X(n) NRF_DRV_TWIS_DEFAULT_CONFIG(n), - #include "nrf_drv_twis_inst.def" -}; - -/** - * @brief Used interrupts mask - * - * Mask for all interrupts used by this library - */ -static const uint32_t m_used_ints_mask = - NRF_TWIS_INT_STOPPED_MASK | - NRF_TWIS_INT_ERROR_MASK | - NRF_TWIS_INT_RXSTARTED_MASK | - NRF_TWIS_INT_TXSTARTED_MASK | - NRF_TWIS_INT_WRITE_MASK | - NRF_TWIS_INT_READ_MASK; - - -/** @} */ /* End of lib_driver_twis_slave_ivars */ - -/** - * @internal - * @ingroup lib_twis_drv - * @defgroup lib_twis_drv_ifunc Software controlled TWI Slave auxiliary internal functions - * - * Internal variables for TWIS. - * @{ - */ - -/** - * @brief Clear all events - * - * Function clears all actually pending events - */ -static void nrf_drv_twis_clear_all_events(NRF_TWIS_Type * const p_reg) -{ - /* Clear all events */ - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_STOPPED); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_ERROR); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_RXSTARTED); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_TXSTARTED); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_WRITE); - nrf_twis_event_clear(p_reg, NRF_TWIS_EVENT_READ); -} - -/** - * @brief Reset all the registers to known state - * - * This function clears all registers that requires it to known state. - * TWIS is left disabled after this function. - * All events are cleared. - * @param[out] p_reg TWIS to reset register address - */ -static inline void nrf_drv_twis_swreset(NRF_TWIS_Type * const p_reg) -{ - /* Disable TWIS */ - nrf_twis_disable(p_reg); - - /* Disconnect pins */ - nrf_twis_pins_set(p_reg, ~0U, ~0U); - - /* Disable interrupt global for the instance */ - nrf_drv_common_irq_disable(nrf_drv_get_IRQn(p_reg)); - - /* Disable interrupts */ - nrf_twis_int_disable(p_reg, ~0U); -} - -/** - * @brief Configure pin - * - * Function configures selected for work as SDA or SCL. - * @param pin Pin number to configure - */ -static inline void nrf_drv_twis_config_pin(uint32_t pin) -{ - nrf_gpio_cfg(pin, - NRF_GPIO_PIN_DIR_INPUT, - NRF_GPIO_PIN_INPUT_DISCONNECT, - NRF_GPIO_PIN_NOPULL, - NRF_GPIO_PIN_S0D1, - NRF_GPIO_PIN_NOSENSE); -} - -/** - * @brief Call event handler - * - * Function that calls event handler. - * The event handler would be only called if its value is != NULL. - * @param instNr Driver instance number that has called this runtime. - * @param[in] pev Event structure to pass to event handler - * @note - * Remember about possible multithreading. - * It is acceptable to call old event function if it was already disabled. - * What is unacceptable is jump into NULL pointer. - */ -static void nrf_drv_call_event_handler(uint8_t instNr, nrf_drv_twis_evt_t const * const pev) -{ - nrf_drv_twis_event_handler_t evh = m_var_inst[instNr].ev_handler; - if(NULL != evh) - { - evh(pev); - } -} - -/** - * @brief Auxiliary function for getting event state on right bit possition - * - * This function calls @ref nrf_twis_event_get function but the the result - * is shifted to match INTEN register scheme. - * - * @param[in,out] p_reg TWIS to read event from - * @param ev Event code - * - * @return Selected event state shifted by @ref nrf_drv_event_to_bitpos - * - * @sa nrf_twis_event_get - * @sa nrf_drv_event_to_bitpos - */ -static inline uint32_t nrf_drv_twis_event_bit_get(NRF_TWIS_Type * const p_reg, nrf_twis_event_t ev) -{ - return (uint32_t)nrf_twis_event_get_and_clear(p_reg, ev) << nrf_drv_event_to_bitpos(ev); -} - -/** - * @brief Auxiliary function for checking event bit inside given flags value - * - * Function used here to check presence of the event inside given flags value. - * It transforms given event to bit possition and then checks if in given variable it is cleared. - * - * @param flags Flags to test - * @param ev Event code - * - * @retval true Flag for selected event is set - * @retval false Flag for selected event is cleared - */ -static inline bool nrf_drv_twis_check_bit(uint32_t flags, nrf_twis_event_t ev) -{ - return 0 != (flags & (1U<<nrf_drv_event_to_bitpos(ev))); -} - -/** - * @brief Auxiliary function for clearing event bit in given flags value - * - * Function used to clear selected event bit. - * - * @param flags Flags to process - * @param ev Event code to clear - * - * @return Value @em flags with cleared event bit that matches given @em ev - */ -static inline uint32_t nrf_drv_twis_clear_bit(uint32_t flags, nrf_twis_event_t ev) -{ - return flags & ~(1U<<nrf_drv_event_to_bitpos(ev)); -} - -/** - * @brief Auxiliary function for error processing - * - * Function called when in current substate the event apears and it cannot be processed. - * It should be called also on ERROR event. - * If given @em error parameter has zero value the @ref NRF_DRV_TWIS_ERROR_UNEXPECTED_EVENT - * would be set. - * - * @param instNr Instance number - * @param ev What error event raport to event handler - * @param error Error flags - */ -static inline void nrf_drv_twis_process_error( - uint8_t instNr, - nrf_drv_twis_evt_type_t ev, - uint32_t error) -{ - if(0 == error) - error = NRF_DRV_TWIS_ERROR_UNEXPECTED_EVENT; - nrf_drv_twis_evt_t evdata; - evdata.type = ev; - evdata.data.error = error; - - m_var_inst[instNr].error |= error; - - nrf_drv_call_event_handler(instNr, &evdata); -} - - -/** - * @brief State machine main function - * - * State machine function that reacts on events. - * This function gets all events and reacts on them only if there is any event detected. - * It makes it possible to use it either in interrupt or in polling mode. - * @param instNr Driver instance number that has called this runtime. - */ -static void nrf_drv_twis_state_machine(uint8_t instNr) -{ - if(!TWIS_NO_SYNC_MODE) - { - /* Exclude parallel processing of this function */ - if(m_sm_semaphore[instNr]) - { - return; - } - m_sm_semaphore[instNr] = 1; - } - - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - /* Event data structure to be passed into event handler */ - nrf_drv_twis_evt_t evdata; - /* Current substate copy */ - nrf_drv_twis_substate_t substate = m_var_inst[instNr].substate; - /* Event flags */ - uint32_t ev = 0; - - /* Get all events */ - ev |= nrf_drv_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_STOPPED); - ev |= nrf_drv_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_ERROR); - ev |= nrf_drv_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_RXSTARTED); - ev |= nrf_drv_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_TXSTARTED); - ev |= nrf_drv_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_WRITE); - ev |= nrf_drv_twis_event_bit_get(p_reg, NRF_TWIS_EVENT_READ); - - /* State machine */ - while(0 != ev) - { - switch(substate) - { - case NRF_DRV_TWIS_SUBSTATE_IDLE: - if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) - { - /* Stopped event is always allowed in IDLE state - just ignore */ - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); - } - else if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_READ)) - { - evdata.type = TWIS_EVT_READ_REQ; - if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_TXSTARTED)) - { - substate = NRF_DRV_TWIS_SUBSTATE_READ_PENDING; - evdata.data.buf_req = false; - } - else - { - substate = NRF_DRV_TWIS_SUBSTATE_READ_WAITING; - evdata.data.buf_req = true; - } - nrf_drv_call_event_handler(instNr, &evdata); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_READ); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_TXSTARTED); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_WRITE); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_RXSTARTED); - } - else if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE)) - { - evdata.type = TWIS_EVT_WRITE_REQ; - if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_RXSTARTED)) - { - substate = NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING; - evdata.data.buf_req = false; - } - else - { - substate = NRF_DRV_TWIS_SUBSTATE_WRITE_WAITING; - evdata.data.buf_req = true; - } - nrf_drv_call_event_handler(instNr, &evdata); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_READ); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_TXSTARTED); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_WRITE); - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_RXSTARTED); - } - else - { - nrf_drv_twis_process_error(instNr, TWIS_EVT_GENERAL_ERROR, nrf_twis_error_source_get_and_clear(p_reg)); - ev = 0; - } - break; - case NRF_DRV_TWIS_SUBSTATE_READ_WAITING: - if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_TXSTARTED) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) - { - substate = NRF_DRV_TWIS_SUBSTATE_READ_PENDING; - /* Any other bits requires further processing in PENDING substate */ - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_TXSTARTED); - } - else - { - nrf_drv_twis_process_error(instNr, TWIS_EVT_READ_ERROR, nrf_twis_error_source_get_and_clear(p_reg)); - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = 0; - } - break; - case NRF_DRV_TWIS_SUBSTATE_READ_PENDING: - if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE)|| - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) - { - evdata.type = TWIS_EVT_READ_DONE; - evdata.data.tx_amount = nrf_twis_tx_amount_get(p_reg); - nrf_drv_call_event_handler(instNr, &evdata); - /* Go to idle and repeat the state machine if READ or WRITE events detected. - * This time READ or WRITE would be started */ - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); - } - else - { - nrf_drv_twis_process_error(instNr, TWIS_EVT_READ_ERROR, nrf_twis_error_source_get_and_clear(p_reg)); - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = 0; - } - break; - case NRF_DRV_TWIS_SUBSTATE_WRITE_WAITING: - if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_RXSTARTED) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) - { - substate = NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING; - /* Any other bits requires further processing in PENDING substate */ - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_RXSTARTED); - } - else - { - nrf_drv_twis_process_error(instNr, TWIS_EVT_WRITE_ERROR, nrf_twis_error_source_get_and_clear(p_reg)); - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = 0; - } - break; - case NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING: - if(nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_WRITE)|| - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_READ) || - nrf_drv_twis_check_bit(ev, NRF_TWIS_EVENT_STOPPED)) - { - evdata.type = TWIS_EVT_WRITE_DONE; - evdata.data.rx_amount = nrf_twis_rx_amount_get(p_reg); - nrf_drv_call_event_handler(instNr, &evdata); - /* Go to idle and repeat the state machine if READ or WRITE events detected. - * This time READ or WRITE would be started */ - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = nrf_drv_twis_clear_bit(ev, NRF_TWIS_EVENT_STOPPED); - } - else - { - nrf_drv_twis_process_error(instNr, TWIS_EVT_WRITE_ERROR, nrf_twis_error_source_get_and_clear(p_reg)); - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - ev = 0; - } - break; - default: - substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - /* Do not clear any events and repeat the machine */ - break; - } - } - - m_var_inst[instNr].substate = substate; - if(!TWIS_NO_SYNC_MODE) - { - m_sm_semaphore[instNr] = 0; - } -} - -/** - * @brief This function - */ -static inline void nrf_drv_twis_preprocess_status(uint8_t instNr) -{ - if(!TWIS_NO_SYNC_MODE) - { - if(NULL == m_var_inst[instNr].ev_handler) - { - nrf_drv_twis_state_machine(instNr); - } - } -} - -/** - * @brief Interrupt service - * - * This function is called by all interrupts runtime for instances enabled in this library. - * @param instNr Driver instance number that has called this runtime. - */ -static inline void nrf_drv_twis_on_ISR(uint8_t instNr) -{ - nrf_drv_twis_state_machine(instNr); -} - -/** @} */ /* End of lib_driver_twis_slave_ifunc */ - - -/* ------------------------------------------------------------------------- - * Implementation of IRQ Handlers - */ -#define X(n) \ - IRQ_HANDLER(n) \ - { \ - nrf_drv_twis_on_ISR(TWIS##n##_INSTANCE_INDEX); \ - } -#include "nrf_drv_twis_inst.def" - -/* ------------------------------------------------------------------------- - * Implementation of interface functions - * - */ - - -ret_code_t nrf_drv_twis_init( - nrf_drv_twis_t const * const p_inst, - nrf_drv_twis_config_t const * p_config, - nrf_drv_twis_event_handler_t const event_handler) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_twis_config_addr_mask_t addr_mask = (nrf_twis_config_addr_mask_t)0; - - if( m_var_inst[instNr].state != NRF_DRV_STATE_UNINITIALIZED) - { - return NRF_ERROR_INVALID_STATE; - } - -#if PERIPHERAL_RESOURCE_SHARING_ENABLED - if (nrf_drv_common_per_res_acquire(p_reg, m_irq_handlers[instNr]) != - NRF_SUCCESS) - { - return NRF_ERROR_BUSY; - } -#endif - - if(NULL == p_config) - { - p_config = &m_config_default[instNr]; - } - - if(!TWIS_ASSUME_INIT_AFTER_RESET_ONLY) - { - nrf_drv_twis_swreset(p_reg); - } - - nrf_drv_twis_config_pin(p_config->scl); - nrf_drv_twis_config_pin(p_config->sda); - - if(0 == (p_config->addr[0] | p_config->addr[1])) - addr_mask = NRF_TWIS_CONFIG_ADDRESS0_MASK; - else - { - if(0 != p_config->addr[0]) - { - addr_mask |= NRF_TWIS_CONFIG_ADDRESS0_MASK; - } - if(0 != p_config->addr[1]) - { - addr_mask |= NRF_TWIS_CONFIG_ADDRESS1_MASK; - } - } - - /* Peripheral interrupt configure - * (note - interrupts still needs to be configured in INTEN register. - * This is done in enable function) */ - nrf_drv_common_irq_enable(nrf_drv_get_IRQn(p_reg), p_config->interrupt_priority); - - /* Configure */ - nrf_twis_pins_set (p_reg, p_config->scl, p_config->sda); - nrf_twis_address_set (p_reg, 0, p_config->addr[0]); - nrf_twis_address_set (p_reg, 1, p_config->addr[1]); - nrf_twis_config_address_set(p_reg, addr_mask); - - /* Clear semaphore */ - if(!TWIS_NO_SYNC_MODE) - { - m_sm_semaphore[instNr] = 0; - } - /* Set internal instance variables */ - m_var_inst[instNr].substate = NRF_DRV_TWIS_SUBSTATE_IDLE; - m_var_inst[instNr].ev_handler = event_handler; - m_var_inst[instNr].state = NRF_DRV_STATE_INITIALIZED; - return NRF_SUCCESS; -} - - -void nrf_drv_twis_uninit(nrf_drv_twis_t const * const p_inst) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - TWIS_PSEL_Type psel = p_reg->PSEL; - - ASSERT(m_var_inst[instNr].state != NRF_DRV_STATE_UNINITIALIZED); - - nrf_drv_twis_swreset(p_reg); - - /* Clear pins state if */ - if(!(TWIS_PSEL_SCL_CONNECT_Msk & psel.SCL)) - { - nrf_gpio_cfg_default(psel.SCL); - } - if(!(TWIS_PSEL_SDA_CONNECT_Msk & psel.SDA)) - { - nrf_gpio_cfg_default(psel.SDA); - } - -#if PERIPHERAL_RESOURCE_SHARING_ENABLED - nrf_drv_common_per_res_release(p_reg); -#endif - - /* Clear variables */ - m_var_inst[instNr].ev_handler = NULL; - m_var_inst[instNr].state = NRF_DRV_STATE_UNINITIALIZED; -} - - -void nrf_drv_twis_enable(nrf_drv_twis_t const * const p_inst) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[instNr]; - - ASSERT(m_var_inst[instNr].state == NRF_DRV_STATE_INITIALIZED); - - nrf_drv_twis_clear_all_events(p_reg); - - /* Enable interrupts */ - if(NULL != p_var_inst->ev_handler) - { - nrf_twis_int_enable(p_reg, m_used_ints_mask); - } - - nrf_twis_enable(p_reg); - p_var_inst->error = 0; - p_var_inst->state = NRF_DRV_STATE_POWERED_ON; - p_var_inst->substate = NRF_DRV_TWIS_SUBSTATE_IDLE; -} - - -void nrf_drv_twis_disable(nrf_drv_twis_t const * const p_inst) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - - ASSERT(m_var_inst[instNr].state != NRF_DRV_STATE_UNINITIALIZED); - - nrf_twis_int_disable(p_reg, m_used_ints_mask); - - nrf_twis_disable(p_reg); - m_var_inst[instNr].state = NRF_DRV_STATE_INITIALIZED; -} - -/* ARM recommends not using the LDREX and STREX instructions in C code. - * This is because the compiler might generate loads and stores between - * LDREX and STREX, potentially clearing the exclusive monitor set by LDREX. - * This recommendation also applies to the byte, halfword, and doubleword - * variants LDREXB, STREXB, LDREXH, STREXH, LDREXD, and STREXD. - * - * This is the reason for the function below to be implemented in assembly. - */ -//lint -save -e578 -#if defined (__CC_ARM ) -static __asm uint32_t nrf_drv_twis_error_get_and_clear_internal(uint32_t volatile * const perror) -{ - mov r3, r0 - mov r1, #0 -nrf_drv_twis_error_get_and_clear_internal_try - ldrex r0, [r3] - strex r2, r1, [r3] - cmp r2, r1 /* did this succeed? */ - bne nrf_drv_twis_error_get_and_clear_internal_try /* no â try again */ - bx lr -} -#elif defined ( __GNUC__ ) -static uint32_t nrf_drv_twis_error_get_and_clear_internal(uint32_t volatile * const perror) -{ - uint32_t ret; - uint32_t temp; - asm volatile( - " .syntax unified \n" - "nrf_drv_twis_error_get_and_clear_internal_try: \n" - " ldrex %[ret], [%[perror]] \n" - " strex %[temp], %[zero], [%[perror]] \n" - " cmp %[temp], %[zero] \n" - " bne nrf_drv_twis_error_get_and_clear_internal_try \n" - : /* Output */ - [ret]"=&l"(ret), - [temp]"=&l"(temp) - : /* Input */ - [zero]"l"(0), - [perror]"l"(perror) - ); - UNUSED_VARIABLE(temp); - return ret; -} -#elif defined ( __ICCARM__ ) -static uint32_t nrf_drv_twis_error_get_and_clear_internal(uint32_t volatile * const perror) -{ - uint32_t ret; - uint32_t temp; - asm volatile( - "1: \n" - " ldrex %[ret], [%[perror]] \n" - " strex %[temp], %[zero], [%[perror]] \n" - " cmp %[temp], %[zero] \n" - " bne.n 1b \n" - : /* Output */ - [ret]"=&l"(ret), - [temp]"=&l"(temp) - : /* Input */ - [zero]"l"(0), - [perror]"l"(perror) - ); - UNUSED_VARIABLE(temp); - return ret; -} -#else - #error Unknown compiler -#endif -//lint -restore - -uint32_t nrf_drv_twis_error_get_and_clear(nrf_drv_twis_t const * const p_inst) -{ - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[p_inst->instNr]; - nrf_drv_twis_preprocess_status(p_inst->instNr); - /* Make sure that access to error member is atomic - * so there is no bit that is cleared if it is not copied to local variable already. */ - return nrf_drv_twis_error_get_and_clear_internal(&p_var_inst->error); -} - - -ret_code_t nrf_drv_twis_tx_prepare( - nrf_drv_twis_t const * const p_inst, - void const * const p_buf, - size_t size) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[instNr]; - - /* Check power state*/ - if(p_var_inst->state != NRF_DRV_STATE_POWERED_ON) - { - return NRF_ERROR_INVALID_STATE; - } - /* Check data address */ - if(!nrf_drv_is_in_RAM(p_buf)) - { - return NRF_ERROR_INVALID_ADDR; - } - /* Check data size */ - if((size & TWIS_TXD_MAXCNT_MAXCNT_Msk) != size) - { - return NRF_ERROR_INVALID_LENGTH; - } - - nrf_twis_tx_prepare(p_reg, (uint8_t const *)p_buf, (nrf_twis_amount_t)size); - return NRF_SUCCESS; - -} - - -size_t nrf_drv_twis_tx_amount(nrf_drv_twis_t const * const p_inst) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type const * const p_reg = m_const_inst[instNr].p_reg; - - return nrf_twis_tx_amount_get(p_reg); -} - - -ret_code_t nrf_drv_twis_rx_prepare( - nrf_drv_twis_t const * const p_inst, - void * const p_buf, - size_t size) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type * const p_reg = m_const_inst[instNr].p_reg; - nrf_drv_twis_var_inst_t * const p_var_inst = &m_var_inst[instNr]; - - /* Check power state*/ - if(p_var_inst->state != NRF_DRV_STATE_POWERED_ON) - { - return NRF_ERROR_INVALID_STATE; - } - /* Check data address */ - if(!nrf_drv_is_in_RAM(p_buf)) - { - return NRF_ERROR_INVALID_ADDR; - } - /* Check data size */ - if((size & TWIS_RXD_MAXCNT_MAXCNT_Msk) != size) - { - return NRF_ERROR_INVALID_LENGTH; - } - - nrf_twis_rx_prepare(p_reg, (uint8_t *)p_buf, (nrf_twis_amount_t)size); - return NRF_SUCCESS; -} - - -size_t nrf_drv_twis_rx_amount(nrf_drv_twis_t const * const p_inst) -{ - uint8_t instNr = p_inst->instNr; - NRF_TWIS_Type const * const p_reg = m_const_inst[instNr].p_reg; - - return nrf_twis_rx_amount_get(p_reg); -} - - -bool nrf_drv_twis_is_busy(nrf_drv_twis_t const * const p_inst) -{ - nrf_drv_twis_preprocess_status(p_inst->instNr); - return NRF_DRV_TWIS_SUBSTATE_IDLE != m_var_inst[(p_inst->instNr)].substate; -} - -bool nrf_drv_twis_is_waiting_tx_buff(nrf_drv_twis_t const * const p_inst) -{ - nrf_drv_twis_preprocess_status(p_inst->instNr); - return NRF_DRV_TWIS_SUBSTATE_READ_WAITING == m_var_inst[(p_inst->instNr)].substate; -} - -bool nrf_drv_twis_is_waiting_rx_buff(nrf_drv_twis_t const * const p_inst) -{ - nrf_drv_twis_preprocess_status(p_inst->instNr); - return NRF_DRV_TWIS_SUBSTATE_WRITE_WAITING == m_var_inst[(p_inst->instNr)].substate; -} - -bool nrf_drv_twis_is_pending_tx(nrf_drv_twis_t const * const p_inst) -{ - nrf_drv_twis_preprocess_status(p_inst->instNr); - return NRF_DRV_TWIS_SUBSTATE_READ_PENDING == m_var_inst[(p_inst->instNr)].substate; -} - -bool nrf_drv_twis_is_pending_rx(nrf_drv_twis_t const * const p_inst) -{ - nrf_drv_twis_preprocess_status(p_inst->instNr); - return NRF_DRV_TWIS_SUBSTATE_WRITE_PENDING == m_var_inst[(p_inst->instNr)].substate; -} http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.h ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.h b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.h deleted file mode 100644 index c8d95f6..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis.h +++ /dev/null @@ -1,406 +0,0 @@ -/* Copyright (c) 2015 Nordic Semiconductor. All Rights Reserved. - * - * The information contained herein is property of Nordic Semiconductor ASA. - * Terms and conditions of usage are described in detail in NORDIC - * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. - * - * Licensees are granted free, non-transferable use of the information. NO - * WARRANTY of ANY KIND is provided. This heading must NOT be removed from - * the file. - * - */ -#ifndef NRF_DRV_TWIS_H__ -#define NRF_DRV_TWIS_H__ - -#include "nrf_drv_config.h" -#include "nrf_drv_common.h" -#include "sdk_errors.h" -#include "nrf_twis.h" -#include <stdint.h> -#include "app_util.h" -#ifdef __cplusplus -extern "C" { -#endif - -/** - * @ingroup nrf_twi - * @defgroup nrf_twis TWI slave HAL and driver - * @brief @tagAPI52 TWI slave APIs. - * @details The TWIS HAL provides basic APIs for accessing the registers of the TWIS. - * The TWIS driver provides APIs on a higher level. - */ - -/** - * @ingroup nrf_twis - * @defgroup nrf_twis_drv TWI slave with EasyDMA driver - * - * @brief @tagAPI52 TWI slave with EasyDMA driver. - * @{ - */ - -/** - * @defgroup nrf_twis_drv_config TWIS driver global configuration - * - * @brief This configuration is placed in the global configuration file @c nrf_drv_config.h. - * @{ - */ - - /** - * @def TWIS_ASSUME_INIT_AFTER_RESET_ONLY - * @brief Assume that any instance would be initialized only once - * - * Optimization flag. - * Registers used by TWIS are shared by other peripherals. - * Normally, during initialization driver tries to clear all registers to known state before - * doing the initialization itself. - * This gives initialization safe procedure, no matter when it would be called. - * If you activate TWIS only once and do never uninitialize it - set this flag to 1 what gives - * more optimal code. - */ - - /** - * @def TWIS_NO_SYNC_MODE - * @brief Remove support for synchronous mode - * - * Synchronous mode would be used in specific situations. - * And it uses some additional code and data memory to safely process state machine - * by polling it in status functions. - * If this functionality is not required it may be disabled to free some resources. - */ -/** @} */ - -/** - * @brief Event callback function event definitions. - */ -typedef enum -{ - TWIS_EVT_READ_REQ, ///< Read request detected - /**< If there is no buffer prepared, buf_req flag in the even will be set. - Call then @ref nrf_drv_twis_tx_prepare to give parameters for buffer. - */ - TWIS_EVT_READ_DONE, ///< Read request has finished - free any data - TWIS_EVT_READ_ERROR, ///< Read request finished with error - TWIS_EVT_WRITE_REQ, ///< Write request detected - /**< If there is no buffer prepared, buf_req flag in the even will be set. - Call then @ref nrf_drv_twis_rx_prepare to give parameters for buffer. - */ - TWIS_EVT_WRITE_DONE, ///< Write request has finished - process data - TWIS_EVT_WRITE_ERROR, ///< Write request finished with error - TWIS_EVT_GENERAL_ERROR ///< Error that happens not inside WRITE or READ transaction -} nrf_drv_twis_evt_type_t; - -/** - * @brief TWIS driver instance structure - * - * @note We only need instance number here so we could really use just a number - * that would be send to every driver function. - * But for compatibility reason this number is inserted into the structure. - */ -typedef struct -{ - uint8_t instNr; /**< Instance number */ -}nrf_drv_twis_t; - -/** - * @brief TWIS driver event structure - */ -typedef struct -{ - nrf_drv_twis_evt_type_t type; ///< Event type - union - { - bool buf_req; ///< Flag for @ref TWIS_EVT_READ_REQ and @ref TWIS_EVT_WRITE_REQ - /**< Information if transmission buffer requires to be prepared */ - uint32_t tx_amount; ///< Data for @ref TWIS_EVT_READ_DONE - uint32_t rx_amount; ///< Data for @ref TWIS_EVT_WRITE_DONE - uint32_t error; ///< Data for @ref TWIS_EVT_GENERAL_ERROR - }data; -}nrf_drv_twis_evt_t; - -/** - * @brief TWI slave event callback function type. - * - * @param[in] p_event Event information structure. - */ -typedef void (*nrf_drv_twis_event_handler_t)(nrf_drv_twis_evt_t const * const p_event); - -/** - * @brief Structure for TWIS configuration - */ -typedef struct -{ - uint32_t addr[2]; //!< Set addresses that this slave should respond. Set 0 to disable. - uint32_t scl; //!< SCL pin number - uint32_t sda; //!< SDA pin number - uint8_t interrupt_priority; //!< The priority of interrupt for the module to set -}nrf_drv_twis_config_t; - -/** - * @brief Possible error sources - * - * This is flag enum - values from this enum can be connected using logical or operator. - * @note - * We could use directly @ref nrf_twis_error_t. Error type enum is redefined here becouse - * of possible future extension (eg. supporting timeouts and synchronous mode). - */ -typedef enum -{ - NRF_DRV_TWIS_ERROR_OVERFLOW = NRF_TWIS_ERROR_OVERFLOW, /**< RX buffer overflow detected, and prevented */ - NRF_DRV_TWIS_ERROR_DATA_NACK = NRF_TWIS_ERROR_DATA_NACK, /**< NACK sent after receiving a data byte */ - NRF_DRV_TWIS_ERROR_OVERREAD = NRF_TWIS_ERROR_OVERREAD, /**< TX buffer over-read detected, and prevented */ - NRF_DRV_TWIS_ERROR_UNEXPECTED_EVENT = 1 << 8 /**< Unexpected event detected by state machine */ -}nrf_drv_twis_error_t; - -/** - * @internal - * @brief Internal macro for creating TWIS driver instance - * - * Second level of indirection in creating the instance. - * Do not use this macro directly. - * Use @ref NRF_DRV_TWIS_INSTANCE instead. - */ -#define NRF_DRV_TWIS_INSTANCE_x(id) \ - { \ - TWIS##id##_INSTANCE_INDEX \ - } - -/** - * @brief Macro for creating TWIS driver instance - * - * @param[in] id Instance index. Use 0 for TWIS0 and 1 for TWIS1 - */ -#define NRF_DRV_TWIS_INSTANCE(id) NRF_DRV_TWIS_INSTANCE_x(id) - -/** - * @internal - * @brief Internal macro for creating TWIS driver default configuration - * - * Second level of indirection in creating the instance. - * Do not use this macro directly. - * Use @ref NRF_DRV_TWIS_SLAVE_DEFAULT_CONFIG instead. - */ -#define NRF_DRV_TWIS_DEFAULT_CONFIG_x(id) \ -{ \ - .addr = { TWIS##id##_CONFIG_ADDR0, TWIS##id##_CONFIG_ADDR1 }, \ - .scl = TWIS##id##_CONFIG_SCL, \ - .sda = TWIS##id##_CONFIG_SDA, \ - .interrupt_priority = TWIS##id##_CONFIG_IRQ_PRIORITY \ -} - -/** - * @brief Generate default configuration for TWIS driver instance - * - * @param[in] id Instance index. Use 0 for TWIS0 and 1 for TWIS1 - */ -#define NRF_DRV_TWIS_DEFAULT_CONFIG(id) NRF_DRV_TWIS_DEFAULT_CONFIG_x(id) - -/** - * @brief Function for initializing the TWIS driver instance. - * - * Function initializes and enables TWIS driver. - * @attention After driver initialization enable it by @ref nrf_drv_twis_enable - * - * @param[in] p_inst TWIS driver instance. - * @attention @em p_inst has to be global object. - * It would be used by interrupts so make it sure that object - * would not be destroyed when function is leaving. - * @param[in] p_config Initial configuration. If NULL, the default configuration is used. - * @param[in] event_handler Event handler provided by the user. - * - * @retval NRF_SUCCESS If initialization was successful. - * @retval NRF_ERROR_INVALID_STATE If the driver is already initialized. - * @retval NRF_ERROR_BUSY If some other peripheral with the same - * instance ID is already in use. This is - * possible only if PERIPHERAL_RESOURCE_SHARING_ENABLED - * is set to a value other than zero. - */ -ret_code_t nrf_drv_twis_init( - nrf_drv_twis_t const * const p_inst, - nrf_drv_twis_config_t const * p_config, - nrf_drv_twis_event_handler_t const event_handler); - -/** - * @brief Function for uninitializing the TWIS driver instance. - * - * Function initializes the peripheral and resets all registers to default values. - * - * @param[in] p_inst TWIS driver instance to uninitialize. - * @note - * It is safe to call nrf_drv_twis_uninit even before initialization. - * Actually @ref nrf_drv_twis_init function calls this function to - * make sure that TWIS state is known. - * @note - * If TWIS driver was in uninitialized state before calling this function, - * selected pins would not be reset to default configuration. - */ -void nrf_drv_twis_uninit(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Enable TWIS instance - * - * This function enables TWIS instance. - * Function defined if there is needs for dynamically enabling and disabling the peripheral. - * Use @ref nrf_drv_twis_enable and @ref nrf_drv_twis_disable functions. - * They do not change any configuration registers. - * - * @param p_inst TWIS driver instance. - */ -void nrf_drv_twis_enable(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Disable TWIS instance - * - * Disabling TWIS instance gives possibility to turn off the TWIS while - * holding configuration done by @ref nrf_drv_twis_init - * - * @param p_inst TWIS driver instance. - */ -void nrf_drv_twis_disable(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Get and clear last error flags - * - * Function gets information about errors. - * This is also the only possibility to exit from error substate of the internal state machine. - * - * @param[in] p_inst TWIS driver instance. - * @return Error flags defined in @ref nrf_drv_twis_error_t - * @attention - * This function clears error state and flags. - */ -uint32_t nrf_drv_twis_error_get_and_clear(nrf_drv_twis_t const * const p_inst); - - -/** - * @brief Prepare data for sending - * - * This function should be used in response for @ref TWIS_EVT_READ_REQ event. - * - * @param[in] p_inst TWIS driver instance. - * @param[in] p_buf Transmission buffer - * @attention Transmission buffer has to be placed in RAM. - * @param size Maximum number of bytes that master may read from buffer given. - * - * @retval NRF_SUCCESS Preparation finished properly - * @retval NRF_ERROR_INVALID_ADDR Given @em p_buf is not placed inside the RAM - * @retval NRF_ERROR_INVALID_LENGTH Wrong value in @em size parameter - * @retval NRF_ERROR_INVALID_STATE Module not initialized or not enabled - */ -ret_code_t nrf_drv_twis_tx_prepare( - nrf_drv_twis_t const * const p_inst, - void const * const p_buf, - size_t size); - -/** - * @brief Get number of transmitted bytes - * - * Function returns number of bytes sent. - * This function may be called after @ref TWIS_EVT_READ_DONE or @ref TWIS_EVT_READ_ERROR events. - * - * @param[in] p_inst TWIS driver instance. - * - * @return Number of bytes sent. - */ -size_t nrf_drv_twis_tx_amount(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Prepare data for receiving - * - * This function should be used in response for @ref TWIS_EVT_WRITE_REQ event. - * - * @param[in] p_inst TWIS driver instance. - * @param[in] p_buf Buffer that would be filled with received data - * @attention Receiving buffer has to be placed in RAM. - * @param size Size of the buffer (maximum amount of data to receive) - * - * @retval NRF_SUCCESS Preparation finished properly - * @retval NRF_ERROR_INVALID_ADDR Given @em p_buf is not placed inside the RAM - * @retval NRF_ERROR_INVALID_LENGTH Wrong value in @em size parameter - * @retval NRF_ERROR_INVALID_STATE Module not initialized or not enabled - */ -ret_code_t nrf_drv_twis_rx_prepare( - nrf_drv_twis_t const * const p_inst, - void * const p_buf, - size_t size); - -/** - * @brief Get number of received bytes - * - * Function returns number of bytes received. - * This function may be called after @ref TWIS_EVT_WRITE_DONE or @ref TWIS_EVT_WRITE_ERROR events. - * - * @param[in] p_inst TWIS driver instance. - * - * @return Number of bytes received. - */ -size_t nrf_drv_twis_rx_amount(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Function checks if driver is busy right now - * - * Actual driver substate is tested. - * If driver is in any other state than IDLE or ERROR this function returns true. - * - * @param[in] p_inst TWIS driver instance. - * - * @retval true Driver is in state other than ERROR or IDLE - * @retval false There is no transmission pending. - */ -bool nrf_drv_twis_is_busy(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Function checks if driver is waiting for tx buffer - * - * If this function returns true, it means that driver is stalled expecting - * of the @ref nrf_drv_twis_tx_prepare function call. - * - * @param[in] p_inst TWIS driver instance. - * - * @retval true Driver waits for @ref nrf_drv_twis_tx_prepare - * @retval false Driver is not in the state where it waits for preparing tx buffer. - */ -bool nrf_drv_twis_is_waiting_tx_buff(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Function checks if driver is waiting for rx buffer - * - * If this function returns true, it means that driver is staled expecting - * of the @ref nrf_drv_twis_rx_prepare function call. - * - * @param[in] p_inst TWIS driver instance. - * - * @retval true Driver waits for @ref nrf_drv_twis_rx_prepare - * @retval false Driver is not in the state where it waits for preparing rx buffer. - */ -bool nrf_drv_twis_is_waiting_rx_buff(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Check if driver is sending data - * - * If this function returns true, it means that there is ongoing output transmission. - * - * @param[in] p_inst TWIS driver instance. - * - * @retval true There is ongoing output transmission. - * @retval false Driver is in other state. - */ -bool nrf_drv_twis_is_pending_tx(nrf_drv_twis_t const * const p_inst); - -/** - * @brief Check if driver is receiving data - * - * If this function returns true, it means that there is ongoing input transmission. - * - * @param[in] p_inst TWIS driver instance. - * - * @retval true There is ongoing input transmission. - * @retval false Driver is in other state. - */ -bool nrf_drv_twis_is_pending_rx(nrf_drv_twis_t const * const p_inst); - -/** @} */ /* End of lib_twis_drv group */ -#ifdef __cplusplus -} -#endif - -#endif /* NRF_DRV_TWIS_H__ */ http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/a1481cb2/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis_inst.def ---------------------------------------------------------------------- diff --git a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis_inst.def b/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis_inst.def deleted file mode 100644 index c2f642a..0000000 --- a/hw/mcu/nordic/src/ext/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/twis_slave/nrf_drv_twis_inst.def +++ /dev/null @@ -1,20 +0,0 @@ -/** - * @file - * @brief Xmacro file with contains enumeration of TWIS instances to implement - * - * Use this file everywhere where anything has to be generated for all active TWIS instances. - * Xmacro format: - * - * @code - X(n) - * @endcode - * - * Where @em n is number of the instance itself (0 for NRF_TWIS0). - */ -#if (TWIS0_ENABLED == 1) - X(0) -#endif -#if (TWIS1_ENABLED == 1) - X(1) -#endif -#undef X
