v01d commented on a change in pull request #2735:
URL: https://github.com/apache/incubator-nuttx/pull/2735#discussion_r567483593



##########
File path: arch/arm/src/nrf52/nrf52_sdc.c
##########
@@ -0,0 +1,609 @@
+/****************************************************************************
+ * arch/arm/src/chip/nrf52_sdc.c
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.  The
+ * ASF licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+#include <nuttx/config.h>
+#include <nuttx/net/bluetooth.h>
+#include <nuttx/wireless/bluetooth/bt_hci.h>
+#include <nuttx/wireless/bluetooth/bt_driver.h>
+#include <nuttx/irq.h>
+#include <nuttx/arch.h>
+#include <arch/armv7-m/nvicpri.h>
+#include <arch/nrf52/nrf52_irq.h>
+#include <nuttx/wqueue.h>
+
+#include "arm_internal.h"
+#include "ram_vectors.h"
+#include "arm_arch.h"
+
+#include <mpsl.h>
+#include <sdc.h>
+#include <sdc_hci.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#if defined(CONFIG_SDC_SLAVE_COUNT) && \
+    CONFIG_SDC_SLAVE_COUNT > CONFIG_BLUETOOTH_MAX_CONN
+#  error "Cannot support more BLE slave roles than connections"
+#endif
+
+#define SDC_MASTER_COUNT (CONFIG_BLUETOOTH_MAX_CONN - \
+                          CONFIG_NRF52_SDC_SLAVE_COUNT)
+
+/* Todo: check central/peripheral against master/slave count */
+
+#define MASTER_MEM_SIZE  (SDC_MEM_PER_MASTER_LINK( \
+                          SDC_DEFAULT_TX_PACKET_SIZE, \
+                          SDC_DEFAULT_RX_PACKET_SIZE, \
+                          SDC_DEFAULT_TX_PACKET_COUNT, \
+                          SDC_DEFAULT_RX_PACKET_COUNT) \
+                          + SDC_MEM_MASTER_LINKS_SHARED)
+
+#define SLAVE_MEM_SIZE (SDC_MEM_PER_SLAVE_LINK( \
+                        SDC_DEFAULT_TX_PACKET_SIZE, \
+                        SDC_DEFAULT_RX_PACKET_SIZE, \
+                        SDC_DEFAULT_TX_PACKET_COUNT, \
+                        SDC_DEFAULT_RX_PACKET_COUNT) \
+                        + SDC_MEM_SLAVE_LINKS_SHARED)
+
+#define MEMPOOL_SIZE  ((CONFIG_NRF52_SDC_SLAVE_COUNT * SLAVE_MEM_SIZE) + \
+                       (SDC_MASTER_COUNT * MASTER_MEM_SIZE))
+
+/****************************************************************************
+ * Private Types
+ ****************************************************************************/
+
+struct nrf52_sdc_dev_s
+{
+  uint8_t mempool[MEMPOOL_SIZE];
+  uint8_t msg_buffer[HCI_MSG_BUFFER_MAX_SIZE];
+
+  sem_t exclsem;
+  struct work_s work;
+};
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static void mpsl_assert_handler(const char *const file, const uint32_t line);
+static void sdc_fault_handler(const char *file, const uint32_t line);
+
+static int bt_open(FAR const struct bt_driver_s *btdev);
+static int bt_hci_send(FAR const struct bt_driver_s *btdev,
+                       FAR struct bt_buf_s *buf);
+
+static void on_hci(void);
+static void on_hci_worker(void *arg);
+
+static void low_prio_worker(void *arg);
+
+static int swi_isr(int irq, FAR void *context, FAR void *arg);
+static int power_clock_isr(int irq, FAR void *context, FAR void *arg);
+
+static void rng_handler(void);
+static void rtc0_handler(void);
+static void timer0_handler(void);
+static void radio_handler(void);
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const struct bt_driver_s g_bt_driver =
+{
+  .head_reserve = 0,
+  .open         = bt_open,
+  .send         = bt_hci_send
+};
+
+static const mpsl_clock_lfclk_cfg_t g_clock_config =
+{
+  .source                   = MPSL_CLOCK_LF_SRC_XTAL,
+  .rc_ctiv                  = 0,
+  .rc_temp_ctiv             = 0,
+  .accuracy_ppm             = CONFIG_NRF52_SDC_CLOCK_ACCURACY,
+  .skip_wait_lfclk_started  = false
+};
+
+static struct nrf52_sdc_dev_s g_sdc_dev;
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: bt_open
+ ****************************************************************************/
+
+static int bt_open(FAR const struct bt_driver_s *btdev)
+{
+  return 0;
+}
+
+/****************************************************************************
+ * Name: bt_open
+ ****************************************************************************/
+
+static int bt_hci_send(FAR const struct bt_driver_s *btdev,
+                       FAR struct bt_buf_s *buf)
+{
+  int ret = OK;
+  irqstate_t flags;
+
+  /* Pass HCI CMD/DATA to SDC */
+
+  if (buf->type == BT_CMD)
+    {
+      struct bt_hci_cmd_hdr_s *cmd = (struct bt_hci_cmd_hdr_s *)buf->data;
+
+      wlinfo("passing CMD %d to softdevice\n", cmd->opcode);
+
+      /* Ensure non-concurrent access to SDC operations */

Review comment:
       That whole paragraph is a bit confusing to me. Since the "alternatively" 
is not clear about what is referring to. One of the previous bullets states:
   
     > Application must only call MPSL APIs from non-preemptible threads, or 
with interrupts disabled (e.g. during initialization).
   
   which is what confuses me. Anyway, if you look at NRF SDK code, there only 
seems to be a semaphore protecting the calls. So I guess that should be enough. 
I will do the change and do some more stress testing to see if something 
strange comes up.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to