Skip to content

Commit 2d08b18

Browse files
cvinayakAnas Nashif
authored andcommitted
Bluetooth: controller: Fix NRF_CCM config for 2M PHY
Fixed the configuration of NRF_CCM for 2M PHY connections. Now faster 2M data rate mode will be used when a connection is in 2M PHY. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 8136c09 commit 2d08b18

File tree

1 file changed

+42
-12
lines changed
  • subsys/bluetooth/controller/hal/nrf5

1 file changed

+42
-12
lines changed

subsys/bluetooth/controller/hal/nrf5/radio.c

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -764,15 +764,36 @@ static u8_t MALIGN(4) _ccm_scratch[(RADIO_PDU_LEN_MAX - 4) + 16];
764764

765765
void *radio_ccm_rx_pkt_set(struct ccm *ccm, void *pkt)
766766
{
767+
u32_t mode;
768+
767769
NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Disabled;
768770
NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Enabled;
769-
NRF_CCM->MODE =
770-
#if !defined(CONFIG_SOC_SERIES_NRF51X)
771-
((CCM_MODE_LENGTH_Extended << CCM_MODE_LENGTH_Pos) &
772-
CCM_MODE_LENGTH_Msk) |
771+
mode = (CCM_MODE_MODE_Decryption << CCM_MODE_MODE_Pos) &
772+
CCM_MODE_MODE_Msk;
773+
#if defined(CONFIG_SOC_SERIES_NRF52X)
774+
/* Enable CCM support for 8-bit length field PDUs. */
775+
mode |= (CCM_MODE_LENGTH_Extended << CCM_MODE_LENGTH_Pos) &
776+
CCM_MODE_LENGTH_Msk;
777+
778+
/* Select CCM data rate based on current PHY in use. */
779+
/* TODO: add cases for nRF52840's coded PHY */
780+
switch ((NRF_RADIO->MODE & RADIO_MODE_MODE_Msk) >>
781+
RADIO_MODE_MODE_Pos) {
782+
default:
783+
case RADIO_MODE_MODE_Ble_1Mbit:
784+
mode |= (CCM_MODE_DATARATE_1Mbit <<
785+
CCM_MODE_DATARATE_Pos) &
786+
CCM_MODE_DATARATE_Msk;
787+
break;
788+
789+
case RADIO_MODE_MODE_Ble_2Mbit:
790+
mode |= (CCM_MODE_DATARATE_2Mbit <<
791+
CCM_MODE_DATARATE_Pos) &
792+
CCM_MODE_DATARATE_Msk;
793+
break;
794+
}
773795
#endif
774-
((CCM_MODE_MODE_Decryption << CCM_MODE_MODE_Pos) &
775-
CCM_MODE_MODE_Msk);
796+
NRF_CCM->MODE = mode;
776797
NRF_CCM->CNFPTR = (u32_t)ccm;
777798
NRF_CCM->INPTR = (u32_t)_pkt_scratch;
778799
NRF_CCM->OUTPTR = (u32_t)pkt;
@@ -793,15 +814,24 @@ void *radio_ccm_rx_pkt_set(struct ccm *ccm, void *pkt)
793814

794815
void *radio_ccm_tx_pkt_set(struct ccm *ccm, void *pkt)
795816
{
817+
u32_t mode;
818+
796819
NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Disabled;
797820
NRF_CCM->ENABLE = CCM_ENABLE_ENABLE_Enabled;
798-
NRF_CCM->MODE =
799-
#if !defined(CONFIG_SOC_SERIES_NRF51X)
800-
((CCM_MODE_LENGTH_Extended << CCM_MODE_LENGTH_Pos) &
801-
CCM_MODE_LENGTH_Msk) |
821+
mode = (CCM_MODE_MODE_Encryption << CCM_MODE_MODE_Pos) &
822+
CCM_MODE_MODE_Msk;
823+
#if defined(CONFIG_SOC_SERIES_NRF52X)
824+
/* Enable CCM support for 8-bit length field PDUs. */
825+
mode |= (CCM_MODE_LENGTH_Extended << CCM_MODE_LENGTH_Pos) &
826+
CCM_MODE_LENGTH_Msk;
827+
828+
/* NOTE: use fastest data rate as tx data needs to be prepared before
829+
* radio Tx on any PHY.
830+
*/
831+
mode |= (CCM_MODE_DATARATE_2Mbit << CCM_MODE_DATARATE_Pos) &
832+
CCM_MODE_DATARATE_Msk;
802833
#endif
803-
((CCM_MODE_MODE_Encryption << CCM_MODE_MODE_Pos) &
804-
CCM_MODE_MODE_Msk);
834+
NRF_CCM->MODE = mode;
805835
NRF_CCM->CNFPTR = (u32_t)ccm;
806836
NRF_CCM->INPTR = (u32_t)pkt;
807837
NRF_CCM->OUTPTR = (u32_t)_pkt_scratch;

0 commit comments

Comments
 (0)