You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by an...@apache.org on 2022/06/09 09:24:52 UTC
[mynewt-nimble] branch master updated: nimble/ll: Add more HCI commands for fake dual-mode
This is an automated email from the ASF dual-hosted git repository.
andk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git
The following commit(s) were added to refs/heads/master by this push:
new fc660991 nimble/ll: Add more HCI commands for fake dual-mode
fc660991 is described below
commit fc66099158978911586b642989e2015d27ac825e
Author: Andrzej Kaczmarek <an...@codecoup.pl>
AuthorDate: Thu Apr 21 23:16:11 2022 +0200
nimble/ll: Add more HCI commands for fake dual-mode
This allows NimBLE to be initialized as "dual-mode" controller by BlueZ.
Also inquiry "works" a bit better since Inquiry Complete event is
simulated after inquiry duration has elapsed.
---
nimble/controller/src/ble_ll_hci.c | 78 ++++++++++++++++++++++++++++++++++++++
1 file changed, 78 insertions(+)
diff --git a/nimble/controller/src/ble_ll_hci.c b/nimble/controller/src/ble_ll_hci.c
index 6aff00eb..ed543404 100644
--- a/nimble/controller/src/ble_ll_hci.c
+++ b/nimble/controller/src/ble_ll_hci.c
@@ -1580,6 +1580,43 @@ ble_ll_hci_status_params_cmd_proc(const uint8_t *cmdbuf, uint8_t len,
}
#if MYNEWT_VAL(BLE_LL_HBD_FAKE_DUAL_MODE)
+static void
+ble_ll_hci_cmd_fake_dual_mode_inquiry_complete(struct ble_npl_event *ev)
+{
+ struct ble_hci_ev *hci_ev;
+
+ hci_ev = ble_transport_alloc_evt(1);
+ if (!hci_ev) {
+ return;
+ }
+
+ hci_ev->opcode = BLE_HCI_EVCODE_INQUIRY_CMP;
+ hci_ev->length = 1;
+ hci_ev->data[0] = 0;
+
+ ble_ll_hci_event_send(hci_ev);
+}
+
+static void
+ble_ll_hci_cmd_fake_dual_mode_inquiry(uint32_t length)
+{
+ static struct ble_npl_callout inquiry_timer;
+ static bool init;
+
+ if (!init) {
+ ble_npl_callout_init(&inquiry_timer, &g_ble_ll_data.ll_evq,
+ ble_ll_hci_cmd_fake_dual_mode_inquiry_complete,
+ NULL);
+ }
+
+ if (length) {
+ ble_npl_callout_reset(&inquiry_timer,
+ ble_npl_time_ms_to_ticks32(length * 1280));
+ } else {
+ ble_npl_callout_stop(&inquiry_timer);
+ }
+}
+
static int
ble_ll_hci_cmd_fake_dual_mode(uint16_t opcode, uint8_t *cmdbuf, uint8_t len,
uint8_t *rspbuf, uint8_t *rsplen)
@@ -1588,10 +1625,16 @@ ble_ll_hci_cmd_fake_dual_mode(uint16_t opcode, uint8_t *cmdbuf, uint8_t len,
switch (opcode) {
case BLE_HCI_OP(BLE_HCI_OGF_LINK_CTRL, 0x01): /* Inquiry */
+ ble_ll_hci_cmd_fake_dual_mode_inquiry(cmdbuf[3]);
rc = BLE_ERR_MAX + 1;
break;
case BLE_HCI_OP(BLE_HCI_OGF_LINK_CTRL, 0x02): /* Inquiry Cancel */
+ ble_ll_hci_cmd_fake_dual_mode_inquiry(0);
+ rc = 0;
+ break;
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x05): /* Set Event Filter */
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x13): /* Write Local Name */
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x16): /* Write Connection Accept Timeout */
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x18): /* Write Page Timeout */
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x1a): /* Write Scan Enable */
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x1c): /* Write Page Scan Activity */
@@ -1601,9 +1644,37 @@ ble_ll_hci_cmd_fake_dual_mode(uint16_t opcode, uint8_t *cmdbuf, uint8_t len,
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x33): /* Host Buffer Size */
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x45): /* Write Inquiry Mode */
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x52): /* Write Extended Inquiry Response */
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x56): /* Write Simple Pairing Mode */
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x6d): /* Write LE Host Support */
rc = 0;
break;
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x14): /* Read Local Name */
+ memset(rspbuf, 0, 248);
+ strcpy((char *)rspbuf, "NimBLE");
+ *rsplen = 248;
+ rc = 0;
+ break;
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x23): /* Read Class Of Device */
+ put_le24(rspbuf, 0);
+ *rsplen = 3;
+ rc = 0;
+ break;
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x25): /* Read Voice Settings */
+ put_le16(rspbuf, 0);
+ *rsplen = 2;
+ rc = 0;
+ break;
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x38): /* Read Number Of Supported IAC */
+ rspbuf[0] = 1;
+ *rsplen = 1;
+ rc = 0;
+ break;
+ case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x39): /* Read Current IAC LAP */
+ rspbuf[0] = 1;
+ put_le24(&rspbuf[1], 0x9e8b33);
+ *rsplen = 4;
+ rc = 0;
+ break;
case BLE_HCI_OP(BLE_HCI_OGF_CTLR_BASEBAND, 0x58): /* Read Inquiry Response Transmit Power Level */
rspbuf[0] = 0x04;
*rsplen = 1;
@@ -1614,6 +1685,13 @@ ble_ll_hci_cmd_fake_dual_mode(uint16_t opcode, uint8_t *cmdbuf, uint8_t len,
*rsplen = 8;
rc = 0;
break;
+ case BLE_HCI_OP(BLE_HCI_OGF_INFO_PARAMS, 0x04): /* Read Local Extended Features */
+ rspbuf[0] = 0;
+ rspbuf[1] = 0;
+ put_le64(&rspbuf[2], 0x877bffdbfe0ffebf);
+ *rsplen = 10;
+ rc = 0;
+ break;
case BLE_HCI_OP(BLE_HCI_OGF_INFO_PARAMS, BLE_HCI_OCF_IP_RD_BUF_SIZE):
put_le16(rspbuf, 255);
rspbuf[2] = 0;