Skip to content

Commit

Permalink
Bluetooth: drivers: Convert ST STM32WBA driver to new API
Browse files Browse the repository at this point in the history
Convert the hci_stm32wba.c driver to the new HCI API. Unlike in most cases,
the devicetree node is already enabled on the SoC level (rather than board
level). This is in order to mirror how the Kconfig option was originally
enabled, i.e. on the SoC level.

Signed-off-by: Johan Hedberg <[email protected]>
  • Loading branch information
jhedberg authored and nashif committed Jun 11, 2024
1 parent 5a09c17 commit b7b606b
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 22 deletions.
2 changes: 2 additions & 0 deletions drivers/bluetooth/hci/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ config BT_STM32_IPM

config BT_STM32WBA
bool "STM32WBA HCI driver"
default y
depends on DT_HAS_ST_HCI_STM32WBA_ENABLED
select HAS_STM32LIB
help
ST STM32WBA HCI Bluetooth interface
Expand Down
47 changes: 29 additions & 18 deletions drivers/bluetooth/hci/hci_stm32wba.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,10 @@
* SPDX-License-Identifier: Apache-2.0
*/


#include <zephyr/init.h>
#include <zephyr/sys/util.h>
#include <zephyr/bluetooth/hci.h>
#include <zephyr/drivers/bluetooth/hci_driver.h>
#include <zephyr/drivers/bluetooth.h>
#include <zephyr/bluetooth/addr.h>
#include <zephyr/drivers/clock_control/stm32_clock_control.h>
#include <linklayer_plat_local.h>
Expand All @@ -27,6 +26,12 @@
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(hci_wba);

#define DT_DRV_COMPAT st_hci_stm32wba

struct hci_data {
bt_hci_recv_t recv;
};

static K_SEM_DEFINE(hci_sem, 1, 1);

#define BLE_CTRLR_STACK_BUFFER_SIZE 300
Expand Down Expand Up @@ -212,9 +217,10 @@ static struct net_buf *treat_iso(const uint8_t *data, size_t len,
return buf;
}

static int receive_data(const uint8_t *data, size_t len,
static int receive_data(const struct device *dev, const uint8_t *data, size_t len,
const uint8_t *ext_data, size_t ext_len)
{
struct hci_data *hci = dev->data;
uint8_t pkt_indicator;
struct net_buf *buf;
int err = 0;
Expand Down Expand Up @@ -242,7 +248,7 @@ static int receive_data(const uint8_t *data, size_t len,
}

if (buf) {
bt_recv(buf);
hci->recv(dev, buf);
} else {
err = -ENOMEM;
ll_state_busy = 1;
Expand All @@ -254,6 +260,7 @@ static int receive_data(const uint8_t *data, size_t len,
uint8_t BLECB_Indication(const uint8_t *data, uint16_t length,
const uint8_t *ext_data, uint16_t ext_length)
{
const struct device *dev = DEVICE_DT_GET(DT_DRV_INST(0));
int ret = 0;
int err;

Expand All @@ -264,7 +271,7 @@ uint8_t BLECB_Indication(const uint8_t *data, uint16_t length,

k_sem_take(&hci_sem, K_FOREVER);

err = receive_data(data, (size_t)length - 1,
err = receive_data(dev, data, (size_t)length - 1,
ext_data, (size_t)ext_length);

k_sem_give(&hci_sem);
Expand All @@ -278,12 +285,14 @@ uint8_t BLECB_Indication(const uint8_t *data, uint16_t length,
return ret;
}

static int bt_hci_stm32wba_send(struct net_buf *buf)
static int bt_hci_stm32wba_send(const struct device *dev, struct net_buf *buf)
{
uint16_t event_length;
uint8_t pkt_indicator;
uint8_t tx_buffer[BLE_CTRLR_STACK_BUFFER_SIZE];

ARG_UNUSED(dev);

k_sem_take(&hci_sem, K_FOREVER);

LOG_DBG("buf %p type %u len %u", buf, bt_buf_get_type(buf), buf->len);
Expand Down Expand Up @@ -311,7 +320,7 @@ static int bt_hci_stm32wba_send(struct net_buf *buf)
LOG_DBG("event_length: %u", event_length);

if (event_length) {
receive_data((uint8_t *)&tx_buffer, (size_t)event_length, NULL, 0);
receive_data(dev, (uint8_t *)&tx_buffer, (size_t)event_length, NULL, 0);
}

k_sem_give(&hci_sem);
Expand Down Expand Up @@ -349,15 +358,19 @@ static int bt_ble_ctlr_init(void)
return 0;
}

static int bt_hci_stm32wba_open(void)
static int bt_hci_stm32wba_open(const struct device *dev, bt_hci_recv_t recv)
{
struct hci_data *data = dev->data;
int ret = 0;

link_layer_register_isr();

ll_sys_config_params();

ret = bt_ble_ctlr_init();
if (ret == 0) {
data->recv = recv;
}

/* TODO. Enable Flash manager once available */
if (IS_ENABLED(CONFIG_FLASH)) {
Expand All @@ -367,18 +380,16 @@ static int bt_hci_stm32wba_open(void)
return ret;
}

static const struct bt_hci_driver drv = {
.name = "BT IPM",
.bus = BT_HCI_DRIVER_BUS_IPM,
static const struct bt_hci_driver_api drv = {
.open = bt_hci_stm32wba_open,
.send = bt_hci_stm32wba_send,
};

static int bt_stm32wba_hci_init(void)
{
bt_hci_driver_register(&drv);

return 0;
}
#define HCI_DEVICE_INIT(inst) \
static struct hci_data hci_data_##inst = { \
}; \
DEVICE_DT_INST_DEFINE(inst, NULL, NULL, &hci_data_##inst, NULL, \
POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE, &drv)

SYS_INIT(bt_stm32wba_hci_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE);
/* Only one instance supported */
HCI_DEVICE_INIT(0)
6 changes: 6 additions & 0 deletions dts/arm/st/wba/stm32wba.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
zephyr,entropy = &rng;
zephyr,flash-controller = &flash;
st,lptim-stdby-timer = &rtc;
zephyr,bt-hci = &bt_hci_wba;
};

cpus {
Expand Down Expand Up @@ -472,6 +473,11 @@
};
};

bt_hci_wba: bt_hci_wba {
compatible = "st,hci-stm32wba";
status = "okay";
};

swj_port: swj_port {
compatible = "swj-connector";
pinctrl-0 = <&debug_jtms_swdio_pa13 &debug_jtck_swclk_pa14
Expand Down
11 changes: 11 additions & 0 deletions dts/bindings/bluetooth/st,hci-stm32wba.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
description: Bluetooth HCI driver for ST STM32WBA

compatible: "st,hci-stm32wba"

include: bt-hci.yaml

properties:
bt-hci-name:
default: "BT IPM"
bt-hci-bus:
default: "BT_HCI_BUS_IPM"
4 changes: 0 additions & 4 deletions soc/st/stm32/stm32wbax/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ config STM32_LPTIM_TIMER
config STM32_FLASH_PREFETCH
default y

config BT_STM32WBA
depends on BT
default y

config BT_STM32WBA
select DYNAMIC_INTERRUPTS
select DYNAMIC_DIRECT_INTERRUPTS
Expand Down

0 comments on commit b7b606b

Please sign in to comment.