You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by cc...@apache.org on 2016/11/22 03:25:50 UTC
[35/51] [abbrv] [partial] incubator-mynewt-core git commit: Remove
non-Apache-compatible Nordic SDK files.
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 \u2013 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