diff --git a/drivers/bluetooth/hci/Kconfig b/drivers/bluetooth/hci/Kconfig index 24080884ab2..dbec279fc62 100644 --- a/drivers/bluetooth/hci/Kconfig +++ b/drivers/bluetooth/hci/Kconfig @@ -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 diff --git a/drivers/bluetooth/hci/hci_stm32wba.c b/drivers/bluetooth/hci/hci_stm32wba.c index 4e29edbf26c..34e2385b241 100644 --- a/drivers/bluetooth/hci/hci_stm32wba.c +++ b/drivers/bluetooth/hci/hci_stm32wba.c @@ -7,11 +7,10 @@ * SPDX-License-Identifier: Apache-2.0 */ - #include #include #include -#include +#include #include #include #include @@ -27,6 +26,12 @@ #include 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 @@ -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; @@ -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; @@ -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; @@ -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); @@ -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); @@ -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); @@ -349,8 +358,9 @@ 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(); @@ -358,6 +368,9 @@ static int bt_hci_stm32wba_open(void) 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)) { @@ -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); +#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) - return 0; -} - -SYS_INIT(bt_stm32wba_hci_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE); +/* Only one instance supported */ +HCI_DEVICE_INIT(0) diff --git a/dts/arm/st/wba/stm32wba.dtsi b/dts/arm/st/wba/stm32wba.dtsi index 05efb0a9431..5b402ae9501 100644 --- a/dts/arm/st/wba/stm32wba.dtsi +++ b/dts/arm/st/wba/stm32wba.dtsi @@ -23,6 +23,7 @@ zephyr,entropy = &rng; zephyr,flash-controller = &flash; st,lptim-stdby-timer = &rtc; + zephyr,bt-hci = &bt_hci_wba; }; cpus { @@ -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 diff --git a/dts/bindings/bluetooth/st,hci-stm32wba.yaml b/dts/bindings/bluetooth/st,hci-stm32wba.yaml new file mode 100644 index 00000000000..ea7c8dbbcc7 --- /dev/null +++ b/dts/bindings/bluetooth/st,hci-stm32wba.yaml @@ -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" diff --git a/soc/st/stm32/stm32wbax/Kconfig.defconfig b/soc/st/stm32/stm32wbax/Kconfig.defconfig index c2f53fd3641..b6dfd878afd 100644 --- a/soc/st/stm32/stm32wbax/Kconfig.defconfig +++ b/soc/st/stm32/stm32wbax/Kconfig.defconfig @@ -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