This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push: new c58fddb Open ble controller adaptation code c58fddb is described below commit c58fddb91554ecec873931609d0224a5117a4f7e Author: jsun <j...@bouffalolab.com> AuthorDate: Fri Sep 24 11:15:02 2021 +0800 Open ble controller adaptation code N/A Signed-off-by: jsun <j...@bouffalolab.com> --- arch/risc-v/src/bl602/Make.defs | 2 +- .../risc-v/bl602/bl602evb/configs/wifi/defconfig | 1 + boards/risc-v/bl602/bl602evb/scripts/ld.script | 12 - boards/risc-v/bl602/bl602evb/src/bl602_bringup.c | 278 ++++++++++++++++++++- 4 files changed, 278 insertions(+), 15 deletions(-) diff --git a/arch/risc-v/src/bl602/Make.defs b/arch/risc-v/src/bl602/Make.defs index 43575a8..4cb1219 100644 --- a/arch/risc-v/src/bl602/Make.defs +++ b/arch/risc-v/src/bl602/Make.defs @@ -84,7 +84,7 @@ CHIP_CSRCS += bl602_glb.c bl602_gpio.c bl602_hbn.c bl602_systemreset.c ifeq ($(CONFIG_BL602_WIRELESS),y) WIRELESS_DRV_UNPACK = bl_blob -WIRELESS_DRV_VERSION = 1.9.1-dev +WIRELESS_DRV_VERSION = 1.9.1-ble-test WIRELESS_DRV_ZIP = v$(WIRELESS_DRV_VERSION).zip WIRELESS_DRV_URL = https://github.com/bouffalolab/bl_blob/archive/refs/heads diff --git a/boards/risc-v/bl602/bl602evb/configs/wifi/defconfig b/boards/risc-v/bl602/bl602evb/configs/wifi/defconfig index c7d45de..409bada 100644 --- a/boards/risc-v/bl602/bl602evb/configs/wifi/defconfig +++ b/boards/risc-v/bl602/bl602evb/configs/wifi/defconfig @@ -79,6 +79,7 @@ CONFIG_NETUTILS_IPERF=y CONFIG_NET_ARP_IPIN=y CONFIG_NET_ARP_SEND=y CONFIG_NET_BROADCAST=y +CONFIG_NET_ETH_PKTSIZE=1518 CONFIG_NET_ICMP=y CONFIG_NET_ICMP_SOCKET=y CONFIG_NET_TCP=y diff --git a/boards/risc-v/bl602/bl602evb/scripts/ld.script b/boards/risc-v/bl602/bl602evb/scripts/ld.script index 8a594dc..84c15c1 100644 --- a/boards/risc-v/bl602/bl602evb/scripts/ld.script +++ b/boards/risc-v/bl602/bl602evb/scripts/ld.script @@ -137,18 +137,6 @@ SECTIONS *(.srodata.cst2) *(.srodata .srodata.*) - . = ALIGN(8); - *(._k_queue.static.*) - *(._k_sem.static.*) - *(._k_mutex.static.*) - _net_buf_pool_list = .; - KEEP(*(SORT_BY_NAME("._net_buf_pool.static.*"))) - _bt_gatt_service_static_list_start = .; - KEEP(*(SORT_BY_NAME("._bt_gatt_service_static.static.*"))) - _bt_gatt_service_static_list_end = .; - _bt_l2cap_fixed_chan_list_start = .; - KEEP(*(SORT_BY_NAME("._bt_l2cap_fixed_chan.static.*"))) - _bt_l2cap_fixed_chan_list_end = .; } > ram_tcm AT > flash .boot2 (NOLOAD) : diff --git a/boards/risc-v/bl602/bl602evb/src/bl602_bringup.c b/boards/risc-v/bl602/bl602evb/src/bl602_bringup.c index 981308f..0902541 100644 --- a/boards/risc-v/bl602/bl602evb/src/bl602_bringup.c +++ b/boards/risc-v/bl602/bl602evb/src/bl602_bringup.c @@ -53,6 +53,17 @@ #include <bl602_spiflash.h> #endif +#if defined(CONFIG_BL602_BLE_CONTROLLER) +#include <nuttx/kmalloc.h> +#include <nuttx/net/bluetooth.h> +#include <nuttx/wireless/bluetooth/bt_driver.h> +#include <nuttx/wireless/bluetooth/bt_uart.h> +#include <nuttx/mm/circbuf.h> +#if defined(CONFIG_UART_BTH4) +#include <nuttx/serial/uart_bth4.h> +#endif +#endif /* CONFIG_BL602_BLE_CONTROLLER */ + #ifdef CONFIG_FS_ROMFS #include <nuttx/drivers/ramdisk.h> @@ -83,8 +94,271 @@ extern int bl602_net_initialize(void); #endif #if defined(CONFIG_BL602_BLE_CONTROLLER) -extern void bl602_hci_uart_init(uint8_t uartid); -#endif +struct bthci_s +{ + FAR struct bt_driver_s drv; + int id; + int fd; + sq_entry_t link; +}; + +struct uart_rxchannel +{ + void (*callback)(void *, uint8_t); + void *dummy; + uint32_t remain_size; + uint8_t *remain_data; +}; + +struct uart_env_tag +{ + struct uart_rxchannel rx; +}; + +static FAR struct bthci_s *hci_dev; +static FAR struct circbuf_s circbuf_rd; +static struct uart_env_tag uart_env; + +static int bthci_send(FAR struct bt_driver_s *drv, + enum bt_buf_type_e type, + FAR void *data, + size_t len); +static int bthci_open(FAR struct bt_driver_s *drv); +static void bthci_close(FAR struct bt_driver_s *drv); +static int bthci_receive(uint8_t *data, uint32_t len); + +static int bthci_register(void); +extern void rw_main_task_post_from_fw(void); +extern void bl602_hci_uart_api_init(void *ble_uart_read, + void *ble_uart_write); + +static void ble_uart_read(uint8_t *bufptr, + uint32_t size, + void (*callback)(void *, uint8_t), + void *dummy) +{ + irqstate_t flags; + + if (!bufptr || !size || !callback) + return; + + if (circbuf_used(&circbuf_rd) >= size) + { + flags = enter_critical_section(); + size_t nread = circbuf_read(&circbuf_rd, bufptr, size); + leave_critical_section(flags); + if (nread != size) + { + printf("%s\n", __func__); + } + + callback(dummy, 0); + + /* rw_main_task_post_from_fw(); */ + + return; + } + + uart_env.rx.callback = callback; + uart_env.rx.dummy = dummy; + uart_env.rx.remain_size = size; + uart_env.rx.remain_data = bufptr; +} + +static void ble_uart_write(const uint8_t *bufptr, + uint32_t size, + void (*callback)(void *, uint8_t), + void *dummy) +{ + if (!bufptr || !size || !callback) + return; + + bthci_receive((uint8_t *)bufptr, size); + + callback(dummy, 0); + + return; +} + +static int bthci_send(FAR struct bt_driver_s *drv, + enum bt_buf_type_e type, + FAR void *data, + size_t len) +{ + FAR char *hdr = (FAR char *)data - drv->head_reserve; + void (*callback)(void *, uint8_t) = NULL; + void *dummy = NULL; + int nlen; + int rlen; + irqstate_t flags; + + if (type == BT_CMD) + { + *hdr = H4_CMD; + } + else if (type == BT_ACL_OUT) + { + *hdr = H4_ACL; + } + else if (type == BT_ISO_OUT) + { + *hdr = H4_ISO; + } + else + { + return -EINVAL; + } + + /* Host send to controller */ + + flags = enter_critical_section(); + nlen = circbuf_write(&circbuf_rd, hdr, len + H4_HEADER_SIZE); + if (uart_env.rx.remain_size && + circbuf_used(&circbuf_rd) >= uart_env.rx.remain_size) + { + /* Read data */ + + rlen = circbuf_read(&circbuf_rd, + uart_env.rx.remain_data, + uart_env.rx.remain_size); + if (rlen < uart_env.rx.remain_size) + { + printf("bthci_send rlen is error\n"); + } + + /* printf("Rx len[%d]\n", len); */ + + uart_env.rx.remain_data += rlen; + uart_env.rx.remain_size -= rlen; + + callback = uart_env.rx.callback; + dummy = uart_env.rx.dummy; + + if (callback != NULL && !uart_env.rx.remain_size) + { + uart_env.rx.callback = NULL; + uart_env.rx.dummy = NULL; + callback(dummy, 0); + } + } + + leave_critical_section(flags); + + return nlen; +} + +static void bthci_close(FAR struct bt_driver_s *drv) +{ +} + +static int bthci_receive(uint8_t *data, uint32_t len) +{ + enum bt_buf_type_e type; + + if (len <= 0) + { + return len; + } + + if (data[0] == H4_EVT) + { + type = BT_EVT; + } + else if (data[0] == H4_ACL) + { + type = BT_ACL_IN; + } + else if (data[0] == H4_ISO) + { + type = BT_ISO_IN; + } + else + { + return -EINVAL; + } + + return bt_netdev_receive(&hci_dev->drv, + type, + data + H4_HEADER_SIZE, + len - H4_HEADER_SIZE); +} + +static int bthci_open(FAR struct bt_driver_s *drv) +{ + return OK; +} + +static FAR struct bthci_s *bthci_alloc(void) +{ + /* Register the driver with the Bluetooth stack */ + + FAR struct bthci_s *dev; + FAR struct bt_driver_s *drv; + + dev = (FAR struct bthci_s *)kmm_zalloc(sizeof(*dev)); + if (dev == NULL) + { + return NULL; + } + + dev->id = 0; + dev->fd = -1; + drv = &dev->drv; + drv->head_reserve = H4_HEADER_SIZE; + drv->open = bthci_open; + drv->send = bthci_send; + drv->close = bthci_close; + + return dev; +} + +int bthci_register(void) +{ + int ret; + + hci_dev = bthci_alloc(); + if (hci_dev == NULL) + { + return -ENOMEM; + } + + #if defined(CONFIG_UART_BTH4) + ret = uart_bth4_register("/dev/ttyHCI0", &hci_dev->drv); + #elif defined(CONFIG_NET_BLUETOOTH) + ret = bt_netdev_register(&hci_dev->drv); + #elif defined(BL602_BLE_CONTROLLER) + #error "Must select CONFIG_UART_BTH4 or CONFIG_NET_BLUETOOTH" + #endif + if (ret < 0) + { + printf("register faile[%d] errno %d\n", ret, errno); + kmm_free(hci_dev); + } + + return ret; +} + +void bl602_hci_uart_init(uint8_t uartid) +{ + int ret; + + if (uartid) + return; + + ret = circbuf_init(&circbuf_rd, NULL, 512); + if (ret < 0) + { + circbuf_uninit(&circbuf_rd); + return; + } + + bl602_hci_uart_api_init(ble_uart_read, ble_uart_write); + + bthci_register(); + rw_main_task_post_from_fw(); + return; +} +#endif /* CONFIG_BL602_BLE_CONTROLLER */ /**************************************************************************** * Name: bl602_bringup