123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /*
- * Copyright (c) 2020 Actions Semiconductor Co., Ltd
- *
- * SPDX-License-Identifier: Apache-2.0
- */
- /**
- * @file
- * @brief Bluetooth hci driver
- */
- #include <errno.h>
- #include <kernel.h>
- #include <device.h>
- #include <init.h>
- #include <sys/printk.h>
- #include <sys/byteorder.h>
- #ifdef CONFIG_ACTS_BT
- #include <acts_bluetooth/buf.h>
- #include <acts_bluetooth/bluetooth.h>
- #include <acts_bluetooth/hci.h>
- #else
- #include <bluetooth/buf.h>
- #include <bluetooth/bluetooth.h>
- #include <bluetooth/hci.h>
- #endif
- #include <drivers/bluetooth/hci_driver.h>
- #include <drivers/bluetooth/bt_drv.h>
- static struct net_buf *buf;
- static uint8_t *hci_get_buf(uint8_t type, uint8_t evt, uint16_t exp_len)
- {
- switch (type) {
- case HCI_EVT:
- if (exp_len) {
- buf = bt_buf_get_evt_len(evt, false, K_NO_WAIT, exp_len);
- } else {
- buf = bt_buf_get_evt(evt, false, K_NO_WAIT);
- }
- break;
- case HCI_ACL:
- if (exp_len) {
- buf = bt_buf_get_rx_len(BT_BUF_ACL_IN, K_NO_WAIT, exp_len);
- } else {
- buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT);
- }
- break;
- case HCI_SCO:
- if (exp_len) {
- buf = bt_buf_get_rx_len(BT_BUF_SCO_IN, K_NO_WAIT, exp_len);
- } else {
- buf = bt_buf_get_rx(BT_BUF_SCO_IN, K_NO_WAIT);
- }
- break;
- case HCI_ISO:
- if (exp_len) {
- buf = bt_buf_get_rx_len(BT_BUF_ISO_IN, K_NO_WAIT, exp_len);
- } else {
- buf = bt_buf_get_rx(BT_BUF_ISO_IN, K_NO_WAIT);
- }
- break;
- default:
- buf = NULL;
- break;
- }
- if (!buf) {
- printk("Error to get buf!\n");
- return NULL;
- }
- return buf->data;
- }
- /* process hci rx buf */
- static int hci_recv(uint16_t len)
- {
- if (buf) {
- net_buf_add(buf, len);
- return bt_recv(buf);
- } else {
- printk("hci_recv buf NULL!\n");
- return -ENOMEM;
- }
- }
- static int acts_hci_send(struct net_buf *buf)
- {
- int err = 0;
- uint8_t type = 0;
- if (buf == NULL) {
- return -EINVAL;
- }
- switch (bt_buf_get_type(buf)) {
- case BT_BUF_CMD:
- type = HCI_CMD;
- break;
- case BT_BUF_ACL_OUT:
- type = HCI_ACL;
- break;
- case BT_BUF_SCO_OUT:
- type = HCI_SCO;
- break;
- case BT_BUF_ISO_OUT:
- type = HCI_ISO;
- break;
- default:
- printk("unknown buf type\n");
- break;
- }
- err = btdrv_send(type, buf->data, buf->len);
- net_buf_unref(buf); //should unref buf
- return err;
- }
- static const btdrv_hci_cb_t cb = {
- .get_buf = hci_get_buf,
- .recv = hci_recv,
- };
- static int acts_hci_open(void)
- {
- return btdrv_init((btdrv_hci_cb_t *)&cb);
- }
- static const struct bt_hci_driver drv = {
- .name = "H:ACTS",
- .bus = BT_HCI_DRIVER_BUS_VIRTUAL,
- .quirks = BT_QUIRK_NO_AUTO_DLE, /* Controller does not auto-initiate a DLE procedure */
- .open = acts_hci_open,
- .send = acts_hci_send,
- };
- static int bt_acts_init(const struct device *unused)
- {
- ARG_UNUSED(unused);
- printk("bt hci drv register\n");
- bt_hci_driver_register(&drv);
- return 0;
- }
- SYS_INIT(bt_acts_init, POST_KERNEL, CONFIG_KERNEL_INIT_PRIORITY_DEVICE);
|