uint32_t nrf_drv_ppi_uninit(void) { uint32_t err_code = NRF_SUCCESS; uint32_t mask = NRF_PPI_ALL_APP_GROUPS_MASK; nrf_ppi_channel_group_t group; if (m_drv_state != NRF_DRV_STATE_UNINITIALIZED) { m_drv_state = NRF_DRV_STATE_UNINITIALIZED; // Disable all channels and groups #if (NRF_PPI_RESTRICTED > 0) err_code = sd_ppi_channel_enable_clr(NRF_PPI_ALL_APP_CHANNELS_MASK); if (err_code != NRF_SUCCESS) { return NRF_ERROR_INTERNAL; } for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) { if(mask & group_to_mask(group)) { err_code = sd_ppi_group_task_disable((uint8_t)group); if (err_code != NRF_SUCCESS) { return NRF_ERROR_INTERNAL; } } } #else nrf_ppi_channel_disable_all(); for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) { if(mask & group_to_mask(group)) { nrf_ppi_channel_group_clear(group); } } #endif channel_allocated_clr_all(); group_allocated_clr_all(); } else { err_code = NRF_ERROR_INVALID_STATE; } return err_code; }
uint32_t nrf_drv_ppi_group_alloc(nrf_ppi_channel_group_t * p_group) { uint32_t err_code; uint32_t mask = 0; nrf_ppi_channel_group_t group; err_code = NRF_ERROR_NO_MEM; mask = NRF_PPI_ALL_APP_GROUPS_MASK; for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) { CRITICAL_REGION_ENTER(); if ((mask & group_to_mask(group)) && (!is_allocated_group(group))) { group_allocated_set(group); *p_group = group; err_code = NRF_SUCCESS; } CRITICAL_REGION_EXIT(); if (err_code == NRF_SUCCESS) { NRF_LOG_INFO("Allocated group: %d.\r\n", group); break; } } NRF_LOG_INFO("Function: %s, error code: %s.\r\n", (uint32_t)__func__, (uint32_t)ERR_TO_STR(err_code)); return err_code; }
uint32_t nrf_drv_ppi_uninit(void) { ret_code_t err_code = NRF_SUCCESS; uint32_t mask = NRF_PPI_ALL_APP_GROUPS_MASK; nrf_ppi_channel_group_t group; if (m_drv_state == NRF_DRV_STATE_UNINITIALIZED) { err_code = NRF_ERROR_INVALID_STATE; NRF_LOG_WARNING("Function: %s, error code: %s.\r\n", (uint32_t)__func__, (uint32_t)ERR_TO_STR(err_code)); return err_code; } m_drv_state = NRF_DRV_STATE_UNINITIALIZED; // Disable all channels and groups nrf_ppi_channels_disable(NRF_PPI_ALL_APP_CHANNELS_MASK); for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) { if (mask & group_to_mask(group)) { nrf_ppi_channel_group_clear(group); } } channel_allocated_clr_all(); group_allocated_clr_all(); NRF_LOG_INFO("Function: %s, error code: %s.\r\n", (uint32_t)__func__, (uint32_t)ERR_TO_STR(err_code)); return err_code; }
uint32_t nrf_drv_ppi_group_alloc(nrf_ppi_channel_group_t * p_group) { uint32_t err_code; uint32_t mask = 0; nrf_ppi_channel_group_t group; err_code = NRF_ERROR_NO_MEM; mask = NRF_PPI_ALL_APP_GROUPS_MASK; for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) { CRITICAL_REGION_ENTER(); if ((mask & group_to_mask(group)) && (!is_allocated_group(group))) { group_allocated_set(group); *p_group = group; err_code = NRF_SUCCESS; } CRITICAL_REGION_EXIT(); if (err_code == NRF_SUCCESS) { break; } } return err_code; }
uint32_t nrf_drv_ppi_uninit(void) { uint32_t mask = NRF_PPI_ALL_APP_GROUPS_MASK; nrf_ppi_channel_group_t group; if (m_drv_state == NRF_DRV_STATE_UNINITIALIZED) { return NRF_ERROR_INVALID_STATE; } m_drv_state = NRF_DRV_STATE_UNINITIALIZED; // Disable all channels and groups nrf_ppi_channels_disable(NRF_PPI_ALL_APP_CHANNELS_MASK); for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++) { if(mask & group_to_mask(group)) { nrf_ppi_channel_group_clear(group); } } channel_allocated_clr_all(); group_allocated_clr_all(); return NRF_SUCCESS; }
/**@brief Set group allocated indication. * @param[in] group_num Specifies the group to set the "allocated" indication. */ __STATIC_INLINE void group_allocated_set(nrf_ppi_channel_group_t group) { m_groups_allocated |= group_to_mask(group); }
/**@brief Check whether a group is allocated. * @param[in] group_num Group number to check. * @retval true The group is allocated. * false The group is not allocated. */ __STATIC_INLINE bool is_allocated_group(nrf_ppi_channel_group_t group) { return ((m_groups_allocated & group_to_mask(group)) != 0); }
/**@brief Check whether a channel group can be used by an application. * @param[in] group Group to check. * @retval true The group is an application group. * false The group is not an application group (this group either does not exist or * it is used by a SoftDevice). */ __STATIC_INLINE bool is_app_group(nrf_ppi_channel_group_t group) { return ((NRF_PPI_ALL_APP_GROUPS_MASK & group_to_mask(group)) != 0); }