You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/03/10 11:52:56 UTC

[mynewt-nimble] 05/07: nimble/ll: Use common helper to calculate chan_idx for dci

This is an automated email from the ASF dual-hosted git repository.

andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git

commit ad36fd84d50df3d859c6ebaca0dd1f746b51fa98
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Mon Feb 28 11:49:14 2022 +0100

    nimble/ll: Use common helper to calculate chan_idx for dci
---
 .../controller/include/controller/ble_ll_utils.h   |  6 +++
 nimble/controller/src/ble_ll_utils.c               | 63 ++++++++++++++++------
 2 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/nimble/controller/include/controller/ble_ll_utils.h b/nimble/controller/include/controller/ble_ll_utils.h
index 48d76a6..12d14ed 100644
--- a/nimble/controller/include/controller/ble_ll_utils.h
+++ b/nimble/controller/include/controller/ble_ll_utils.h
@@ -23,6 +23,12 @@ uint32_t ble_ll_utils_calc_access_addr(void);
 uint8_t ble_ll_utils_remapped_channel(uint8_t remap_index, const uint8_t *chanmap);
 uint8_t ble_ll_utils_calc_dci_csa2(uint16_t event_cntr, uint16_t channel_id,
                                    uint8_t num_used_chans, const uint8_t *chanmap);
+uint16_t ble_ll_utils_dci_iso_event(uint16_t counter, uint16_t chan_id,
+                                    uint16_t *prn_sub_lu, uint8_t num_used_chans,
+                                    const uint8_t *chan_map, uint16_t *remap_idx);
+uint16_t ble_ll_utils_dci_iso_subevent(uint16_t chan_id, uint16_t *prn_sub_lu,
+                                       uint8_t num_used_chans, const uint8_t *chan_map,
+                                       uint16_t *remap_idx);
 uint8_t ble_ll_utils_calc_num_used_chans(const uint8_t *chan_map);
 uint32_t ble_ll_utils_calc_window_widening(uint32_t anchor_point,
                                            uint32_t last_anchor_point,
diff --git a/nimble/controller/src/ble_ll_utils.c b/nimble/controller/src/ble_ll_utils.c
index c2edb0d..1b28576 100644
--- a/nimble/controller/src/ble_ll_utils.c
+++ b/nimble/controller/src/ble_ll_utils.c
@@ -342,28 +342,61 @@ uint8_t
 ble_ll_utils_calc_dci_csa2(uint16_t event_cntr, uint16_t channel_id,
                            uint8_t num_used_chans, const uint8_t *chanmap)
 {
-    uint16_t channel_unmapped;
-    uint8_t remap_index;
-
     uint16_t prn_e;
-    uint8_t bitpos;
+    uint16_t chan_idx;
+    uint16_t remap_idx;
 
     prn_e = ble_ll_utils_csa2_prng(event_cntr, channel_id);
 
-    channel_unmapped = prn_e % 37;
+    chan_idx = ble_ll_utils_csa2_calc_chan_idx(prn_e, num_used_chans, chanmap,
+                                               &remap_idx);
 
-    /*
-     * If unmapped channel is the channel index of a used channel it is used
-     * as channel index.
-     */
-    bitpos = 1 << (channel_unmapped & 0x07);
-    if (chanmap[channel_unmapped >> 3] & bitpos) {
-        return channel_unmapped;
-    }
+    return chan_idx;
+}
+
+uint16_t
+ble_ll_utils_dci_iso_event(uint16_t counter, uint16_t chan_id,
+                           uint16_t *prn_sub_lu, uint8_t num_used_chans,
+                           const uint8_t *chan_map, uint16_t *remap_idx)
+{
+    uint16_t prn_s;
+    uint16_t prn_e;
+    uint16_t chan_idx;
+
+    prn_s = ble_ll_utils_csa2_prn_s(counter, chan_id);
+    prn_e = prn_s ^ chan_id;
 
-    remap_index = (num_used_chans * prn_e) / 0x10000;
+    *prn_sub_lu = prn_s;
 
-    return ble_ll_utils_remapped_channel(remap_index, chanmap);
+    chan_idx = ble_ll_utils_csa2_calc_chan_idx(prn_e, num_used_chans, chan_map,
+                                               remap_idx);
+
+    return chan_idx;
+}
+
+uint16_t
+ble_ll_utils_dci_iso_subevent(uint16_t chan_id, uint16_t *prn_sub_lu,
+                              uint8_t num_used_chans, const uint8_t *chan_map,
+                              uint16_t *remap_idx)
+{
+    uint16_t prn_sub_se;
+    uint16_t chan_idx;
+    uint16_t d;
+
+    *prn_sub_lu = ble_ll_utils_csa2_perm(*prn_sub_lu);
+    *prn_sub_lu = ble_ll_utils_csa2_mam(*prn_sub_lu, chan_id);
+    prn_sub_se = *prn_sub_lu ^ chan_id;
+
+    /* Core 5.3, Vol 6, Part B, 4.5.8.3.6 (enjoy!) */
+    /* TODO optimize this somehow */
+    d = max(1, max(min(3, num_used_chans - 5),
+                   min(11, (num_used_chans - 10) / 2)));
+    *remap_idx = (*remap_idx + d + prn_sub_se *
+                  (num_used_chans - 2 * d + 1) / 65536) % num_used_chans;
+
+    chan_idx = ble_ll_utils_csa2_remap2chan(*remap_idx, chan_map);
+
+    return chan_idx;
 }
 #endif