summaryrefslogtreecommitdiff
path: root/chip/nrf51/ppi.c
diff options
context:
space:
mode:
Diffstat (limited to 'chip/nrf51/ppi.c')
-rw-r--r--chip/nrf51/ppi.c69
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;
+}