diff options
Diffstat (limited to 'chip/nrf51/ppi.c')
-rw-r--r-- | chip/nrf51/ppi.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/chip/nrf51/ppi.c b/chip/nrf51/ppi.c new file mode 100644 index 0000000000..d0be87f2ba --- /dev/null +++ b/chip/nrf51/ppi.c @@ -0,0 +1,69 @@ +/* Copyright 2016 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "ppi.h" +#include "registers.h" +#include "util.h" + +#define NRF51_PPI_FIRST_PP_CH NRF51_PPI_CH_TIMER0_CC0__RADIO_TXEN +#define NRF51_PPI_LAST_PP_CH NRF51_PPI_CH_RTC0_COMPARE0__TIMER0_START + +static uint32_t channels_in_use; +static uint32_t channel_groups_in_use; + +int ppi_request_pre_programmed_channel(int ppi_chan) +{ + ASSERT(ppi_chan >= NRF51_PPI_FIRST_PP_CH && + ppi_chan <= NRF51_PPI_LAST_PP_CH); + + if (channels_in_use & (1 << ppi_chan)) + return EC_ERROR_BUSY; + + channels_in_use |= (1 << ppi_chan); + + return EC_SUCCESS; +} + +int ppi_request_channel(int *ppi_chan) +{ + int chan; + + for (chan = 0; chan < NRF51_PPI_NUM_PROGRAMMABLE_CHANNELS; chan++) + if ((channels_in_use & (1 << chan)) == 0) + break; + + if (chan == NRF51_PPI_NUM_PROGRAMMABLE_CHANNELS) + return EC_ERROR_BUSY; + + channels_in_use |= (1 << chan); + *ppi_chan = chan; + return EC_SUCCESS; +} + +void ppi_release_channel(int ppi_chan) +{ + channels_in_use &= ~(1 << ppi_chan); +} + +void ppi_release_group(int ppi_group) +{ + channel_groups_in_use &= ~(1 << ppi_group); +} + +int ppi_request_group(int *ppi_group) +{ + int group; + + for (group = 0; group < NRF51_PPI_NUM_GROUPS; group++) + if ((channel_groups_in_use & (1 << group)) == 0) + break; + + if (group == NRF51_PPI_NUM_GROUPS) + return EC_ERROR_BUSY; + + channel_groups_in_use |= (1 << group); + *ppi_group = group; + return EC_SUCCESS; +} |