Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sun May 14 23:18:57 2017 +0000
Revision:
18:6a4db94011d3
Publishing again

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /*
sahilmgandhi 18:6a4db94011d3 2 * Copyright (c) 2015 Nordic Semiconductor ASA
sahilmgandhi 18:6a4db94011d3 3 * All rights reserved.
sahilmgandhi 18:6a4db94011d3 4 *
sahilmgandhi 18:6a4db94011d3 5 * Redistribution and use in source and binary forms, with or without modification,
sahilmgandhi 18:6a4db94011d3 6 * are permitted provided that the following conditions are met:
sahilmgandhi 18:6a4db94011d3 7 *
sahilmgandhi 18:6a4db94011d3 8 * 1. Redistributions of source code must retain the above copyright notice, this list
sahilmgandhi 18:6a4db94011d3 9 * of conditions and the following disclaimer.
sahilmgandhi 18:6a4db94011d3 10 *
sahilmgandhi 18:6a4db94011d3 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
sahilmgandhi 18:6a4db94011d3 12 * integrated circuit in a product or a software update for such product, must reproduce
sahilmgandhi 18:6a4db94011d3 13 * the above copyright notice, this list of conditions and the following disclaimer in
sahilmgandhi 18:6a4db94011d3 14 * the documentation and/or other materials provided with the distribution.
sahilmgandhi 18:6a4db94011d3 15 *
sahilmgandhi 18:6a4db94011d3 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
sahilmgandhi 18:6a4db94011d3 17 * used to endorse or promote products derived from this software without specific prior
sahilmgandhi 18:6a4db94011d3 18 * written permission.
sahilmgandhi 18:6a4db94011d3 19 *
sahilmgandhi 18:6a4db94011d3 20 * 4. This software, with or without modification, must only be used with a
sahilmgandhi 18:6a4db94011d3 21 * Nordic Semiconductor ASA integrated circuit.
sahilmgandhi 18:6a4db94011d3 22 *
sahilmgandhi 18:6a4db94011d3 23 * 5. Any software provided in binary or object form under this license must not be reverse
sahilmgandhi 18:6a4db94011d3 24 * engineered, decompiled, modified and/or disassembled.
sahilmgandhi 18:6a4db94011d3 25 *
sahilmgandhi 18:6a4db94011d3 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
sahilmgandhi 18:6a4db94011d3 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
sahilmgandhi 18:6a4db94011d3 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
sahilmgandhi 18:6a4db94011d3 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
sahilmgandhi 18:6a4db94011d3 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
sahilmgandhi 18:6a4db94011d3 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
sahilmgandhi 18:6a4db94011d3 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
sahilmgandhi 18:6a4db94011d3 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
sahilmgandhi 18:6a4db94011d3 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
sahilmgandhi 18:6a4db94011d3 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sahilmgandhi 18:6a4db94011d3 36 *
sahilmgandhi 18:6a4db94011d3 37 */
sahilmgandhi 18:6a4db94011d3 38
sahilmgandhi 18:6a4db94011d3 39
sahilmgandhi 18:6a4db94011d3 40 #include <stdlib.h>
sahilmgandhi 18:6a4db94011d3 41
sahilmgandhi 18:6a4db94011d3 42 #include "nrf.h"
sahilmgandhi 18:6a4db94011d3 43 #include "nrf_drv_ppi.h"
sahilmgandhi 18:6a4db94011d3 44 #include "nrf_drv_common.h"
sahilmgandhi 18:6a4db94011d3 45 #include "nrf_ppi.h"
sahilmgandhi 18:6a4db94011d3 46 #include "app_util_platform.h"
sahilmgandhi 18:6a4db94011d3 47 #include "sdk_common.h"
sahilmgandhi 18:6a4db94011d3 48
sahilmgandhi 18:6a4db94011d3 49
sahilmgandhi 18:6a4db94011d3 50 static nrf_drv_state_t m_drv_state; /**< Driver state */
sahilmgandhi 18:6a4db94011d3 51 static uint32_t m_channels_allocated; /**< Bitmap representing channels availability. 1 when a channel is allocated, 0 otherwise. */
sahilmgandhi 18:6a4db94011d3 52 static uint8_t m_groups_allocated; /**< Bitmap representing groups availability. 1 when a group is allocated, 0 otherwise.*/
sahilmgandhi 18:6a4db94011d3 53
sahilmgandhi 18:6a4db94011d3 54
sahilmgandhi 18:6a4db94011d3 55 /**@brief Compute a group mask (needed for driver internals, not used for NRF_PPI registers).
sahilmgandhi 18:6a4db94011d3 56 * @param[in] group Group number to transform to a mask.
sahilmgandhi 18:6a4db94011d3 57 * @retval Group mask.
sahilmgandhi 18:6a4db94011d3 58 */
sahilmgandhi 18:6a4db94011d3 59 __STATIC_INLINE uint32_t group_to_mask(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 60 {
sahilmgandhi 18:6a4db94011d3 61 return (1uL << (uint32_t) group);
sahilmgandhi 18:6a4db94011d3 62 }
sahilmgandhi 18:6a4db94011d3 63
sahilmgandhi 18:6a4db94011d3 64
sahilmgandhi 18:6a4db94011d3 65 /**@brief Check whether a channel is a programmable channel and can be used by an application.
sahilmgandhi 18:6a4db94011d3 66 * @param[in] channel Channel to check.
sahilmgandhi 18:6a4db94011d3 67 * @retval true The channel is a programmable application channel.
sahilmgandhi 18:6a4db94011d3 68 * false The channel is used by a SoftDevice or is preprogrammed.
sahilmgandhi 18:6a4db94011d3 69 */
sahilmgandhi 18:6a4db94011d3 70 __STATIC_INLINE bool is_programmable_app_channel(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 71 {
sahilmgandhi 18:6a4db94011d3 72 return ((NRF_PPI_PROG_APP_CHANNELS_MASK & nrf_drv_ppi_channel_to_mask(channel)) != 0);
sahilmgandhi 18:6a4db94011d3 73 }
sahilmgandhi 18:6a4db94011d3 74
sahilmgandhi 18:6a4db94011d3 75
sahilmgandhi 18:6a4db94011d3 76 /**@brief Check whether a channels can be used by an application.
sahilmgandhi 18:6a4db94011d3 77 * @param[in] channel Channel mask to check.
sahilmgandhi 18:6a4db94011d3 78 * @retval true All specified channels can be used by an application.
sahilmgandhi 18:6a4db94011d3 79 * false At least one specified channel is used by a SoftDevice.
sahilmgandhi 18:6a4db94011d3 80 */
sahilmgandhi 18:6a4db94011d3 81 __STATIC_INLINE bool are_app_channels(uint32_t channel_mask)
sahilmgandhi 18:6a4db94011d3 82 {
sahilmgandhi 18:6a4db94011d3 83 //lint -e(587)
sahilmgandhi 18:6a4db94011d3 84 return ((~(NRF_PPI_ALL_APP_CHANNELS_MASK) & channel_mask) == 0);
sahilmgandhi 18:6a4db94011d3 85 }
sahilmgandhi 18:6a4db94011d3 86
sahilmgandhi 18:6a4db94011d3 87
sahilmgandhi 18:6a4db94011d3 88 /**@brief Check whether a channel can be used by an application.
sahilmgandhi 18:6a4db94011d3 89 * @param[in] channel Channel to check.
sahilmgandhi 18:6a4db94011d3 90 * @retval true The channel can be used by an application.
sahilmgandhi 18:6a4db94011d3 91 * false The channel is used by a SoftDevice.
sahilmgandhi 18:6a4db94011d3 92 */
sahilmgandhi 18:6a4db94011d3 93 __STATIC_INLINE bool is_app_channel(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 94 {
sahilmgandhi 18:6a4db94011d3 95 return are_app_channels(nrf_drv_ppi_channel_to_mask(channel));
sahilmgandhi 18:6a4db94011d3 96 }
sahilmgandhi 18:6a4db94011d3 97
sahilmgandhi 18:6a4db94011d3 98
sahilmgandhi 18:6a4db94011d3 99 /**@brief Check whether a channel group can be used by an application.
sahilmgandhi 18:6a4db94011d3 100 * @param[in] group Group to check.
sahilmgandhi 18:6a4db94011d3 101 * @retval true The group is an application group.
sahilmgandhi 18:6a4db94011d3 102 * false The group is not an application group (this group either does not exist or
sahilmgandhi 18:6a4db94011d3 103 * it is used by a SoftDevice).
sahilmgandhi 18:6a4db94011d3 104 */
sahilmgandhi 18:6a4db94011d3 105 __STATIC_INLINE bool is_app_group(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 106 {
sahilmgandhi 18:6a4db94011d3 107 return ((NRF_PPI_ALL_APP_GROUPS_MASK & group_to_mask(group)) != 0);
sahilmgandhi 18:6a4db94011d3 108 }
sahilmgandhi 18:6a4db94011d3 109
sahilmgandhi 18:6a4db94011d3 110
sahilmgandhi 18:6a4db94011d3 111 /**@brief Check whether a channel is allocated.
sahilmgandhi 18:6a4db94011d3 112 * @param[in] channel_num Channel number to check.
sahilmgandhi 18:6a4db94011d3 113 * @retval true The channel is allocated.
sahilmgandhi 18:6a4db94011d3 114 * false The channel is not allocated.
sahilmgandhi 18:6a4db94011d3 115 */
sahilmgandhi 18:6a4db94011d3 116 __STATIC_INLINE bool is_allocated_channel(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 117 {
sahilmgandhi 18:6a4db94011d3 118 return ((m_channels_allocated & nrf_drv_ppi_channel_to_mask(channel)) != 0);
sahilmgandhi 18:6a4db94011d3 119 }
sahilmgandhi 18:6a4db94011d3 120
sahilmgandhi 18:6a4db94011d3 121
sahilmgandhi 18:6a4db94011d3 122 /**@brief Set channel allocated indication.
sahilmgandhi 18:6a4db94011d3 123 * @param[in] channel_num Specifies the channel to set the "allocated" indication.
sahilmgandhi 18:6a4db94011d3 124 */
sahilmgandhi 18:6a4db94011d3 125 __STATIC_INLINE void channel_allocated_set(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 126 {
sahilmgandhi 18:6a4db94011d3 127 m_channels_allocated |= nrf_drv_ppi_channel_to_mask(channel);
sahilmgandhi 18:6a4db94011d3 128 }
sahilmgandhi 18:6a4db94011d3 129
sahilmgandhi 18:6a4db94011d3 130
sahilmgandhi 18:6a4db94011d3 131 /**@brief Clear channel allocated indication.
sahilmgandhi 18:6a4db94011d3 132 * @param[in] channel_num Specifies the channel to clear the "allocated" indication.
sahilmgandhi 18:6a4db94011d3 133 */
sahilmgandhi 18:6a4db94011d3 134 __STATIC_INLINE void channel_allocated_clr(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 135 {
sahilmgandhi 18:6a4db94011d3 136 m_channels_allocated &= ~nrf_drv_ppi_channel_to_mask(channel);
sahilmgandhi 18:6a4db94011d3 137 }
sahilmgandhi 18:6a4db94011d3 138
sahilmgandhi 18:6a4db94011d3 139
sahilmgandhi 18:6a4db94011d3 140 /**@brief Clear all allocated channels.
sahilmgandhi 18:6a4db94011d3 141 */
sahilmgandhi 18:6a4db94011d3 142 __STATIC_INLINE void channel_allocated_clr_all(void)
sahilmgandhi 18:6a4db94011d3 143 {
sahilmgandhi 18:6a4db94011d3 144 m_channels_allocated &= ~NRF_PPI_ALL_APP_CHANNELS_MASK;
sahilmgandhi 18:6a4db94011d3 145 }
sahilmgandhi 18:6a4db94011d3 146
sahilmgandhi 18:6a4db94011d3 147
sahilmgandhi 18:6a4db94011d3 148 /**@brief Check whether a group is allocated.
sahilmgandhi 18:6a4db94011d3 149 * @param[in] group_num Group number to check.
sahilmgandhi 18:6a4db94011d3 150 * @retval true The group is allocated.
sahilmgandhi 18:6a4db94011d3 151 * false The group is not allocated.
sahilmgandhi 18:6a4db94011d3 152 */
sahilmgandhi 18:6a4db94011d3 153 __STATIC_INLINE bool is_allocated_group(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 154 {
sahilmgandhi 18:6a4db94011d3 155 return ((m_groups_allocated & group_to_mask(group)) != 0);
sahilmgandhi 18:6a4db94011d3 156 }
sahilmgandhi 18:6a4db94011d3 157
sahilmgandhi 18:6a4db94011d3 158
sahilmgandhi 18:6a4db94011d3 159 /**@brief Set group allocated indication.
sahilmgandhi 18:6a4db94011d3 160 * @param[in] group_num Specifies the group to set the "allocated" indication.
sahilmgandhi 18:6a4db94011d3 161 */
sahilmgandhi 18:6a4db94011d3 162 __STATIC_INLINE void group_allocated_set(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 163 {
sahilmgandhi 18:6a4db94011d3 164 m_groups_allocated |= group_to_mask(group);
sahilmgandhi 18:6a4db94011d3 165 }
sahilmgandhi 18:6a4db94011d3 166
sahilmgandhi 18:6a4db94011d3 167
sahilmgandhi 18:6a4db94011d3 168 /**@brief Clear group allocated indication.
sahilmgandhi 18:6a4db94011d3 169 * @param[in] group_num Specifies the group to clear the "allocated" indication.
sahilmgandhi 18:6a4db94011d3 170 */
sahilmgandhi 18:6a4db94011d3 171 __STATIC_INLINE void group_allocated_clr(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 172 {
sahilmgandhi 18:6a4db94011d3 173 m_groups_allocated &= ~group_to_mask(group);
sahilmgandhi 18:6a4db94011d3 174 }
sahilmgandhi 18:6a4db94011d3 175
sahilmgandhi 18:6a4db94011d3 176
sahilmgandhi 18:6a4db94011d3 177 /**@brief Clear all allocated groups.
sahilmgandhi 18:6a4db94011d3 178 */
sahilmgandhi 18:6a4db94011d3 179 __STATIC_INLINE void group_allocated_clr_all()
sahilmgandhi 18:6a4db94011d3 180 {
sahilmgandhi 18:6a4db94011d3 181 m_groups_allocated &= ~NRF_PPI_ALL_APP_GROUPS_MASK;
sahilmgandhi 18:6a4db94011d3 182 }
sahilmgandhi 18:6a4db94011d3 183
sahilmgandhi 18:6a4db94011d3 184
sahilmgandhi 18:6a4db94011d3 185 uint32_t nrf_drv_ppi_init(void)
sahilmgandhi 18:6a4db94011d3 186 {
sahilmgandhi 18:6a4db94011d3 187 uint32_t err_code;
sahilmgandhi 18:6a4db94011d3 188
sahilmgandhi 18:6a4db94011d3 189 if (m_drv_state == NRF_DRV_STATE_UNINITIALIZED)
sahilmgandhi 18:6a4db94011d3 190 {
sahilmgandhi 18:6a4db94011d3 191 m_drv_state = NRF_DRV_STATE_INITIALIZED;
sahilmgandhi 18:6a4db94011d3 192 err_code = NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 193 }
sahilmgandhi 18:6a4db94011d3 194 else
sahilmgandhi 18:6a4db94011d3 195 {
sahilmgandhi 18:6a4db94011d3 196 err_code = MODULE_ALREADY_INITIALIZED;
sahilmgandhi 18:6a4db94011d3 197 }
sahilmgandhi 18:6a4db94011d3 198
sahilmgandhi 18:6a4db94011d3 199 return err_code;
sahilmgandhi 18:6a4db94011d3 200 }
sahilmgandhi 18:6a4db94011d3 201
sahilmgandhi 18:6a4db94011d3 202
sahilmgandhi 18:6a4db94011d3 203 uint32_t nrf_drv_ppi_uninit(void)
sahilmgandhi 18:6a4db94011d3 204 {
sahilmgandhi 18:6a4db94011d3 205 uint32_t mask = NRF_PPI_ALL_APP_GROUPS_MASK;
sahilmgandhi 18:6a4db94011d3 206 nrf_ppi_channel_group_t group;
sahilmgandhi 18:6a4db94011d3 207
sahilmgandhi 18:6a4db94011d3 208 if (m_drv_state == NRF_DRV_STATE_UNINITIALIZED)
sahilmgandhi 18:6a4db94011d3 209 {
sahilmgandhi 18:6a4db94011d3 210 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 211 }
sahilmgandhi 18:6a4db94011d3 212
sahilmgandhi 18:6a4db94011d3 213 m_drv_state = NRF_DRV_STATE_UNINITIALIZED;
sahilmgandhi 18:6a4db94011d3 214
sahilmgandhi 18:6a4db94011d3 215 // Disable all channels and groups
sahilmgandhi 18:6a4db94011d3 216 nrf_ppi_channels_disable(NRF_PPI_ALL_APP_CHANNELS_MASK);
sahilmgandhi 18:6a4db94011d3 217
sahilmgandhi 18:6a4db94011d3 218 for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++)
sahilmgandhi 18:6a4db94011d3 219 {
sahilmgandhi 18:6a4db94011d3 220 if(mask & group_to_mask(group))
sahilmgandhi 18:6a4db94011d3 221 {
sahilmgandhi 18:6a4db94011d3 222 nrf_ppi_channel_group_clear(group);
sahilmgandhi 18:6a4db94011d3 223 }
sahilmgandhi 18:6a4db94011d3 224 }
sahilmgandhi 18:6a4db94011d3 225 channel_allocated_clr_all();
sahilmgandhi 18:6a4db94011d3 226 group_allocated_clr_all();
sahilmgandhi 18:6a4db94011d3 227 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 228 }
sahilmgandhi 18:6a4db94011d3 229
sahilmgandhi 18:6a4db94011d3 230
sahilmgandhi 18:6a4db94011d3 231 uint32_t nrf_drv_ppi_channel_alloc(nrf_ppi_channel_t * p_channel)
sahilmgandhi 18:6a4db94011d3 232 {
sahilmgandhi 18:6a4db94011d3 233 uint32_t err_code;
sahilmgandhi 18:6a4db94011d3 234 nrf_ppi_channel_t channel;
sahilmgandhi 18:6a4db94011d3 235 uint32_t mask = 0;
sahilmgandhi 18:6a4db94011d3 236
sahilmgandhi 18:6a4db94011d3 237 err_code = NRF_ERROR_NO_MEM;
sahilmgandhi 18:6a4db94011d3 238
sahilmgandhi 18:6a4db94011d3 239 mask = NRF_PPI_PROG_APP_CHANNELS_MASK;
sahilmgandhi 18:6a4db94011d3 240 for (channel = NRF_PPI_CHANNEL0; mask != 0; mask &= ~nrf_drv_ppi_channel_to_mask(channel), channel++)
sahilmgandhi 18:6a4db94011d3 241 {
sahilmgandhi 18:6a4db94011d3 242 CRITICAL_REGION_ENTER();
sahilmgandhi 18:6a4db94011d3 243 if ((mask & nrf_drv_ppi_channel_to_mask(channel)) && (!is_allocated_channel(channel)))
sahilmgandhi 18:6a4db94011d3 244 {
sahilmgandhi 18:6a4db94011d3 245 channel_allocated_set(channel);
sahilmgandhi 18:6a4db94011d3 246 *p_channel = channel;
sahilmgandhi 18:6a4db94011d3 247 err_code = NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 248 }
sahilmgandhi 18:6a4db94011d3 249 CRITICAL_REGION_EXIT();
sahilmgandhi 18:6a4db94011d3 250 if (err_code == NRF_SUCCESS)
sahilmgandhi 18:6a4db94011d3 251 {
sahilmgandhi 18:6a4db94011d3 252 break;
sahilmgandhi 18:6a4db94011d3 253 }
sahilmgandhi 18:6a4db94011d3 254 }
sahilmgandhi 18:6a4db94011d3 255
sahilmgandhi 18:6a4db94011d3 256 return err_code;
sahilmgandhi 18:6a4db94011d3 257 }
sahilmgandhi 18:6a4db94011d3 258
sahilmgandhi 18:6a4db94011d3 259
sahilmgandhi 18:6a4db94011d3 260 uint32_t nrf_drv_ppi_channel_free(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 261 {
sahilmgandhi 18:6a4db94011d3 262 if (!is_programmable_app_channel(channel))
sahilmgandhi 18:6a4db94011d3 263 {
sahilmgandhi 18:6a4db94011d3 264 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 265 }
sahilmgandhi 18:6a4db94011d3 266 // First disable this channel
sahilmgandhi 18:6a4db94011d3 267 nrf_ppi_channel_disable(channel);
sahilmgandhi 18:6a4db94011d3 268 CRITICAL_REGION_ENTER();
sahilmgandhi 18:6a4db94011d3 269 channel_allocated_clr(channel);
sahilmgandhi 18:6a4db94011d3 270 CRITICAL_REGION_EXIT();
sahilmgandhi 18:6a4db94011d3 271 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 272 }
sahilmgandhi 18:6a4db94011d3 273
sahilmgandhi 18:6a4db94011d3 274
sahilmgandhi 18:6a4db94011d3 275 uint32_t nrf_drv_ppi_channel_assign(nrf_ppi_channel_t channel, uint32_t eep, uint32_t tep)
sahilmgandhi 18:6a4db94011d3 276 {
sahilmgandhi 18:6a4db94011d3 277 VERIFY_PARAM_NOT_NULL((uint32_t *)eep);
sahilmgandhi 18:6a4db94011d3 278 VERIFY_PARAM_NOT_NULL((uint32_t *)tep);
sahilmgandhi 18:6a4db94011d3 279
sahilmgandhi 18:6a4db94011d3 280 if (!is_programmable_app_channel(channel))
sahilmgandhi 18:6a4db94011d3 281 {
sahilmgandhi 18:6a4db94011d3 282 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 283 }
sahilmgandhi 18:6a4db94011d3 284 if (!is_allocated_channel(channel))
sahilmgandhi 18:6a4db94011d3 285 {
sahilmgandhi 18:6a4db94011d3 286 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 287 }
sahilmgandhi 18:6a4db94011d3 288
sahilmgandhi 18:6a4db94011d3 289 nrf_ppi_channel_endpoint_setup(channel, eep, tep);
sahilmgandhi 18:6a4db94011d3 290 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 291 }
sahilmgandhi 18:6a4db94011d3 292
sahilmgandhi 18:6a4db94011d3 293 uint32_t nrf_drv_ppi_channel_fork_assign(nrf_ppi_channel_t channel, uint32_t fork_tep)
sahilmgandhi 18:6a4db94011d3 294 {
sahilmgandhi 18:6a4db94011d3 295 #ifdef NRF51
sahilmgandhi 18:6a4db94011d3 296 return NRF_ERROR_NOT_SUPPORTED;
sahilmgandhi 18:6a4db94011d3 297 #else
sahilmgandhi 18:6a4db94011d3 298 if (!is_programmable_app_channel(channel))
sahilmgandhi 18:6a4db94011d3 299 {
sahilmgandhi 18:6a4db94011d3 300 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 301 }
sahilmgandhi 18:6a4db94011d3 302 if (!is_allocated_channel(channel))
sahilmgandhi 18:6a4db94011d3 303 {
sahilmgandhi 18:6a4db94011d3 304 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 305 }
sahilmgandhi 18:6a4db94011d3 306 nrf_ppi_fork_endpoint_setup(channel, fork_tep);
sahilmgandhi 18:6a4db94011d3 307 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 308 #endif
sahilmgandhi 18:6a4db94011d3 309 }
sahilmgandhi 18:6a4db94011d3 310
sahilmgandhi 18:6a4db94011d3 311 uint32_t nrf_drv_ppi_channel_enable(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 312 {
sahilmgandhi 18:6a4db94011d3 313 if (!is_app_channel(channel))
sahilmgandhi 18:6a4db94011d3 314 {
sahilmgandhi 18:6a4db94011d3 315 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 316 }
sahilmgandhi 18:6a4db94011d3 317 if (is_programmable_app_channel(channel) && !is_allocated_channel(channel))
sahilmgandhi 18:6a4db94011d3 318 {
sahilmgandhi 18:6a4db94011d3 319 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 320 }
sahilmgandhi 18:6a4db94011d3 321 nrf_ppi_channel_enable(channel);
sahilmgandhi 18:6a4db94011d3 322 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 323 }
sahilmgandhi 18:6a4db94011d3 324
sahilmgandhi 18:6a4db94011d3 325
sahilmgandhi 18:6a4db94011d3 326 uint32_t nrf_drv_ppi_channel_disable(nrf_ppi_channel_t channel)
sahilmgandhi 18:6a4db94011d3 327 {
sahilmgandhi 18:6a4db94011d3 328 if (!is_app_channel(channel))
sahilmgandhi 18:6a4db94011d3 329 {
sahilmgandhi 18:6a4db94011d3 330 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 331 }
sahilmgandhi 18:6a4db94011d3 332 if (is_programmable_app_channel(channel) && !is_allocated_channel(channel))
sahilmgandhi 18:6a4db94011d3 333 {
sahilmgandhi 18:6a4db94011d3 334 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 335 }
sahilmgandhi 18:6a4db94011d3 336 nrf_ppi_channel_disable(channel);
sahilmgandhi 18:6a4db94011d3 337 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 338 }
sahilmgandhi 18:6a4db94011d3 339
sahilmgandhi 18:6a4db94011d3 340
sahilmgandhi 18:6a4db94011d3 341 uint32_t nrf_drv_ppi_group_alloc(nrf_ppi_channel_group_t * p_group)
sahilmgandhi 18:6a4db94011d3 342 {
sahilmgandhi 18:6a4db94011d3 343 uint32_t err_code;
sahilmgandhi 18:6a4db94011d3 344 uint32_t mask = 0;
sahilmgandhi 18:6a4db94011d3 345 nrf_ppi_channel_group_t group;
sahilmgandhi 18:6a4db94011d3 346
sahilmgandhi 18:6a4db94011d3 347 err_code = NRF_ERROR_NO_MEM;
sahilmgandhi 18:6a4db94011d3 348
sahilmgandhi 18:6a4db94011d3 349 mask = NRF_PPI_ALL_APP_GROUPS_MASK;
sahilmgandhi 18:6a4db94011d3 350 for (group = NRF_PPI_CHANNEL_GROUP0; mask != 0; mask &= ~group_to_mask(group), group++)
sahilmgandhi 18:6a4db94011d3 351 {
sahilmgandhi 18:6a4db94011d3 352 CRITICAL_REGION_ENTER();
sahilmgandhi 18:6a4db94011d3 353 if ((mask & group_to_mask(group)) && (!is_allocated_group(group)))
sahilmgandhi 18:6a4db94011d3 354 {
sahilmgandhi 18:6a4db94011d3 355 group_allocated_set(group);
sahilmgandhi 18:6a4db94011d3 356 *p_group = group;
sahilmgandhi 18:6a4db94011d3 357 err_code = NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 358 }
sahilmgandhi 18:6a4db94011d3 359 CRITICAL_REGION_EXIT();
sahilmgandhi 18:6a4db94011d3 360 if (err_code == NRF_SUCCESS)
sahilmgandhi 18:6a4db94011d3 361 {
sahilmgandhi 18:6a4db94011d3 362 break;
sahilmgandhi 18:6a4db94011d3 363 }
sahilmgandhi 18:6a4db94011d3 364 }
sahilmgandhi 18:6a4db94011d3 365
sahilmgandhi 18:6a4db94011d3 366 return err_code;
sahilmgandhi 18:6a4db94011d3 367 }
sahilmgandhi 18:6a4db94011d3 368
sahilmgandhi 18:6a4db94011d3 369
sahilmgandhi 18:6a4db94011d3 370 uint32_t nrf_drv_ppi_group_free(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 371 {
sahilmgandhi 18:6a4db94011d3 372 if (!is_app_group(group))
sahilmgandhi 18:6a4db94011d3 373 {
sahilmgandhi 18:6a4db94011d3 374 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 375 }
sahilmgandhi 18:6a4db94011d3 376 if (!is_allocated_group(group))
sahilmgandhi 18:6a4db94011d3 377 {
sahilmgandhi 18:6a4db94011d3 378 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 379 }
sahilmgandhi 18:6a4db94011d3 380 else
sahilmgandhi 18:6a4db94011d3 381 nrf_ppi_group_disable(group);
sahilmgandhi 18:6a4db94011d3 382 CRITICAL_REGION_ENTER();
sahilmgandhi 18:6a4db94011d3 383 group_allocated_clr(group);
sahilmgandhi 18:6a4db94011d3 384 CRITICAL_REGION_EXIT();
sahilmgandhi 18:6a4db94011d3 385 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 386 }
sahilmgandhi 18:6a4db94011d3 387
sahilmgandhi 18:6a4db94011d3 388
sahilmgandhi 18:6a4db94011d3 389 uint32_t nrf_drv_ppi_group_enable(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 390 {
sahilmgandhi 18:6a4db94011d3 391 if (!is_app_group(group))
sahilmgandhi 18:6a4db94011d3 392 {
sahilmgandhi 18:6a4db94011d3 393 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 394 }
sahilmgandhi 18:6a4db94011d3 395 if (!is_allocated_group(group))
sahilmgandhi 18:6a4db94011d3 396 {
sahilmgandhi 18:6a4db94011d3 397 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 398 }
sahilmgandhi 18:6a4db94011d3 399 nrf_ppi_group_enable(group);
sahilmgandhi 18:6a4db94011d3 400 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 401 }
sahilmgandhi 18:6a4db94011d3 402
sahilmgandhi 18:6a4db94011d3 403
sahilmgandhi 18:6a4db94011d3 404 uint32_t nrf_drv_ppi_group_disable(nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 405 {
sahilmgandhi 18:6a4db94011d3 406 if (!is_app_group(group))
sahilmgandhi 18:6a4db94011d3 407 {
sahilmgandhi 18:6a4db94011d3 408 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 409 }
sahilmgandhi 18:6a4db94011d3 410 nrf_ppi_group_disable(group);
sahilmgandhi 18:6a4db94011d3 411 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 412 }
sahilmgandhi 18:6a4db94011d3 413
sahilmgandhi 18:6a4db94011d3 414 uint32_t nrf_drv_ppi_channels_remove_from_group(uint32_t channel_mask,
sahilmgandhi 18:6a4db94011d3 415 nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 416 {
sahilmgandhi 18:6a4db94011d3 417 if (!is_app_group(group))
sahilmgandhi 18:6a4db94011d3 418 {
sahilmgandhi 18:6a4db94011d3 419 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 420 }
sahilmgandhi 18:6a4db94011d3 421 if (!is_allocated_group(group))
sahilmgandhi 18:6a4db94011d3 422 {
sahilmgandhi 18:6a4db94011d3 423 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 424 }
sahilmgandhi 18:6a4db94011d3 425 if (!are_app_channels(channel_mask))
sahilmgandhi 18:6a4db94011d3 426 {
sahilmgandhi 18:6a4db94011d3 427 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 428 }
sahilmgandhi 18:6a4db94011d3 429 CRITICAL_REGION_ENTER();
sahilmgandhi 18:6a4db94011d3 430 nrf_ppi_channels_remove_from_group(channel_mask, group);
sahilmgandhi 18:6a4db94011d3 431 CRITICAL_REGION_EXIT();
sahilmgandhi 18:6a4db94011d3 432 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 433 }
sahilmgandhi 18:6a4db94011d3 434
sahilmgandhi 18:6a4db94011d3 435 uint32_t nrf_drv_ppi_channels_include_in_group(uint32_t channel_mask,
sahilmgandhi 18:6a4db94011d3 436 nrf_ppi_channel_group_t group)
sahilmgandhi 18:6a4db94011d3 437 {
sahilmgandhi 18:6a4db94011d3 438 if (!is_app_group(group))
sahilmgandhi 18:6a4db94011d3 439 {
sahilmgandhi 18:6a4db94011d3 440 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 441 }
sahilmgandhi 18:6a4db94011d3 442 if (!is_allocated_group(group))
sahilmgandhi 18:6a4db94011d3 443 {
sahilmgandhi 18:6a4db94011d3 444 return NRF_ERROR_INVALID_STATE;
sahilmgandhi 18:6a4db94011d3 445 }
sahilmgandhi 18:6a4db94011d3 446 if (!are_app_channels(channel_mask))
sahilmgandhi 18:6a4db94011d3 447 {
sahilmgandhi 18:6a4db94011d3 448 return NRF_ERROR_INVALID_PARAM;
sahilmgandhi 18:6a4db94011d3 449 }
sahilmgandhi 18:6a4db94011d3 450 CRITICAL_REGION_ENTER();
sahilmgandhi 18:6a4db94011d3 451 nrf_ppi_channels_include_in_group(channel_mask, group);
sahilmgandhi 18:6a4db94011d3 452 CRITICAL_REGION_EXIT();
sahilmgandhi 18:6a4db94011d3 453 return NRF_SUCCESS;
sahilmgandhi 18:6a4db94011d3 454 }