Skip to content

Commit 1dfebd6

Browse files
cvinayakkartben
authored andcommitted
Bluetooth: Controller: Add NRF_ECB crypto support in nRF54L15 SoC
Add NRF_ECB crypto support in nRF54L15 SoCs. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent b716b06 commit 1dfebd6

File tree

3 files changed

+98
-6
lines changed

3 files changed

+98
-6
lines changed

subsys/bluetooth/controller/Kconfig

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ config BT_CTLR_ENTROPY_SUPPORT
1010
bool
1111

1212
config BT_CTLR_CRYPTO_SUPPORT
13-
depends on BT_CTLR_ENTROPY_SUPPORT
1413
bool
1514

1615
config BT_CTLR_LE_ENC_SUPPORT
@@ -78,6 +77,10 @@ config BT_CTLR_SYNC_ISO_SUPPORT
7877
depends on BT_CTLR_SYNC_PERIODIC_SUPPORT
7978
bool
8079

80+
config BT_CTLR_BROADCAST_ISO_ENC_SUPPORT
81+
depends on BT_CTLR_ADV_ISO_SUPPORT || BT_CTLR_SYNC_ISO_SUPPORT
82+
bool
83+
8184
config BT_CTLR_CENTRAL_ISO_SUPPORT
8285
bool
8386

@@ -861,7 +864,7 @@ config BT_CTLR_BROADCAST_ISO
861864

862865
config BT_CTLR_BROADCAST_ISO_ENC
863866
bool
864-
depends on BT_CTLR_CRYPTO_SUPPORT && BT_CTLR_BROADCAST_ISO
867+
depends on BT_CTLR_BROADCAST_ISO_ENC_SUPPORT && BT_CTLR_BROADCAST_ISO
865868
select BT_CRYPTO if BT_LL_SW_SPLIT
866869
default y
867870

subsys/bluetooth/controller/Kconfig.ll_sw_split

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ config BT_LLL_VENDOR_NORDIC
1818
select EXPERIMENTAL if !ENTROPY_HAS_DRIVER || FAKE_ENTROPY_NATIVE_POSIX
1919

2020
select BT_HAS_HCI_VS
21-
select BT_CTLR_CRYPTO_SUPPORT if !SOC_COMPATIBLE_NRF54LX
21+
select BT_CTLR_CRYPTO_SUPPORT
2222
select BT_CTLR_LE_ENC_SUPPORT if BT_CTLR_CRYPTO_SUPPORT && \
2323
!BT_CTLR_DATA_LENGTH_CLEAR && \
24-
!BT_CTLR_PHY_2M_NRF
24+
!BT_CTLR_PHY_2M_NRF && \
25+
!SOC_COMPATIBLE_NRF54LX
2526
select BT_CTLR_PRIVACY_SUPPORT if BT_CTLR_CRYPTO_SUPPORT && \
26-
!SOC_SERIES_NRF51X
27+
!SOC_SERIES_NRF51X && \
28+
!SOC_COMPATIBLE_NRF54LX
2729
select BT_CTLR_CONN_PARAM_REQ_SUPPORT
2830
select BT_CTLR_EXT_REJ_IND_SUPPORT
2931
select BT_CTLR_PER_INIT_FEAT_XCHG_SUPPORT
@@ -41,6 +43,7 @@ config BT_LLL_VENDOR_NORDIC
4143
select BT_CTLR_SYNC_PERIODIC_SUPPORT
4244
select BT_CTLR_ADV_ISO_SUPPORT
4345
select BT_CTLR_SYNC_ISO_SUPPORT
46+
select BT_CTLR_BROADCAST_ISO_ENC_SUPPORT if !SOC_COMPATIBLE_NRF54LX
4447
select BT_CTLR_CENTRAL_ISO_SUPPORT
4548
select BT_CTLR_PERIPHERAL_ISO_SUPPORT
4649
select BT_CTLR_DF_SUPPORT if HAS_HW_NRF_RADIO_DFE

subsys/bluetooth/controller/ll_sw/nordic/hal/nrf5/ecb.c

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
/*
2-
* Copyright (c) 2016 Nordic Semiconductor ASA
2+
* Copyright (c) 2016-2024 Nordic Semiconductor ASA
33
* Copyright (c) 2016 Vinayak Kariappa Chettimada
44
*
55
* SPDX-License-Identifier: Apache-2.0
66
*/
77

8+
#include <stdint.h>
89
#include <string.h>
910

11+
#include <zephyr/sys/byteorder.h>
12+
1013
#include <hal/nrf_ecb.h>
1114

1215
#include "util/mem.h"
@@ -16,17 +19,73 @@
1619

1720
#include "hal/debug.h"
1821

22+
#if defined(NRF54L_SERIES)
23+
#define NRF_ECB NRF_ECB00
24+
#define ECB_IRQn ECB00_IRQn
25+
#define ECB_INTENSET_ERRORECB_Msk ECB_INTENSET_ERROR_Msk
26+
#define ECB_INTENSET_ENDECB_Msk ECB_INTENSET_END_Msk
27+
#define TASKS_STARTECB TASKS_START
28+
#define TASKS_STOPECB TASKS_STOP
29+
#define EVENTS_ENDECB EVENTS_END
30+
#define EVENTS_ERRORECB EVENTS_ERROR
31+
#define NRF_ECB_TASK_STARTECB NRF_ECB_TASK_START
32+
#define NRF_ECB_TASK_STOPECB NRF_ECB_TASK_STOP
33+
#define ECBDATAPTR IN.PTR
34+
35+
struct ecb_job_ptr {
36+
void *ptr;
37+
struct {
38+
uint32_t length:24;
39+
uint32_t attribute:8;
40+
} __packed;
41+
} __packed;
42+
43+
/* Product Specification recommends a value of 11, but prior work had used 7 */
44+
#define ECB_JOB_PTR_ATTRIBUTE 7U
45+
#endif /* NRF54L_SERIES */
46+
1947
struct ecb_param {
2048
uint8_t key[16];
2149
uint8_t clear_text[16];
2250
uint8_t cipher_text[16];
51+
52+
#if defined(NRF54L_SERIES)
53+
struct ecb_job_ptr in[2];
54+
struct ecb_job_ptr out[2];
55+
#endif /* NRF54L_SERIES */
2356
} __packed;
2457

2558
static void do_ecb(struct ecb_param *ecb)
2659
{
2760
do {
2861
nrf_ecb_task_trigger(NRF_ECB, NRF_ECB_TASK_STOPECB);
62+
63+
#if defined(NRF54L_SERIES)
64+
NRF_ECB->KEY.VALUE[3] = sys_get_be32(&ecb->key[0]);
65+
NRF_ECB->KEY.VALUE[2] = sys_get_be32(&ecb->key[4]);
66+
NRF_ECB->KEY.VALUE[1] = sys_get_be32(&ecb->key[8]);
67+
NRF_ECB->KEY.VALUE[0] = sys_get_be32(&ecb->key[12]);
68+
69+
ecb->in[0].ptr = ecb->clear_text;
70+
ecb->in[0].length = sizeof(ecb->clear_text);
71+
ecb->in[0].attribute = ECB_JOB_PTR_ATTRIBUTE;
72+
ecb->in[1].ptr = NULL;
73+
ecb->in[1].length = 0U;
74+
ecb->in[1].attribute = 0U;
75+
76+
ecb->out[0].ptr = ecb->cipher_text;
77+
ecb->out[0].length = sizeof(ecb->cipher_text);
78+
ecb->out[0].attribute = ECB_JOB_PTR_ATTRIBUTE;
79+
ecb->out[1].ptr = NULL;
80+
ecb->out[1].length = 0U;
81+
ecb->out[1].attribute = 0U;
82+
83+
NRF_ECB->IN.PTR = (uint32_t)ecb->in;
84+
NRF_ECB->OUT.PTR = (uint32_t)ecb->out;
85+
#else /* !NRF54L_SERIES */
2986
NRF_ECB->ECBDATAPTR = (uint32_t)ecb;
87+
#endif /* !NRF54L_SERIES */
88+
3089
NRF_ECB->EVENTS_ENDECB = 0;
3190
NRF_ECB->EVENTS_ERRORECB = 0;
3291
nrf_ecb_task_trigger(NRF_ECB, NRF_ECB_TASK_STARTECB);
@@ -96,7 +155,34 @@ uint32_t ecb_encrypt_nonblocking(struct ecb *ecb)
96155
}
97156

98157
/* setup the encryption h/w */
158+
#if defined(NRF54L_SERIES)
159+
NRF_ECB->KEY.VALUE[3] = sys_get_be32(&ecb->in_key_be[0]);
160+
NRF_ECB->KEY.VALUE[2] = sys_get_be32(&ecb->in_key_be[4]);
161+
NRF_ECB->KEY.VALUE[1] = sys_get_be32(&ecb->in_key_be[8]);
162+
NRF_ECB->KEY.VALUE[0] = sys_get_be32(&ecb->in_key_be[12]);
163+
164+
struct ecb_job_ptr *in = (void *)((uint8_t *)ecb + sizeof(*ecb));
165+
struct ecb_job_ptr *out = (void *)((uint8_t *)in + 16U);
166+
167+
in[0].ptr = ecb->in_clear_text_be;
168+
in[0].length = sizeof(ecb->in_clear_text_be);
169+
in[0].attribute = ECB_JOB_PTR_ATTRIBUTE;
170+
in[1].ptr = NULL;
171+
in[1].length = 0U;
172+
in[1].attribute = 0U;
173+
174+
out[0].ptr = ecb->out_cipher_text_be;
175+
out[0].length = sizeof(ecb->out_cipher_text_be);
176+
out[0].attribute = ECB_JOB_PTR_ATTRIBUTE;
177+
out[1].ptr = NULL;
178+
out[1].length = 0U;
179+
out[1].attribute = 0U;
180+
181+
NRF_ECB->IN.PTR = (uint32_t)in;
182+
NRF_ECB->OUT.PTR = (uint32_t)out;
183+
#else /* !NRF54L_SERIES */
99184
NRF_ECB->ECBDATAPTR = (uint32_t)ecb;
185+
#endif /* !NRF54L_SERIES */
100186
NRF_ECB->EVENTS_ENDECB = 0;
101187
NRF_ECB->EVENTS_ERRORECB = 0;
102188
nrf_ecb_int_enable(NRF_ECB, ECB_INTENSET_ERRORECB_Msk

0 commit comments

Comments
 (0)