Diff between 3d5e41fc6f449504238f26d084d2d6fc38ab3da0 and 1c5b832c0fe686da559449ef64c336678d964725

Changed Files

File Additions Deletions Status
monitor/bt.h +13 -0 modified
monitor/packet.c +68 -0 modified

Full Patch

diff --git a/monitor/bt.h b/monitor/bt.h
index f25646f..d32d3a1 100644
--- a/monitor/bt.h
+++ b/monitor/bt.h
@@ -2448,6 +2448,19 @@ struct bt_hci_cmd_le_receiver_test_v3 {
 	uint8_t  antenna_ids[0];
 } __attribute__ ((packed));
 
+#define BT_HCI_CMD_LE_TX_TEST_V3		0x2050
+struct bt_hci_cmd_le_tx_test_v3 {
+	uint8_t  chan;
+	uint8_t  data_len;
+	uint8_t  payload;
+	uint8_t  phy;
+	uint8_t  cte_len;
+	uint8_t  cte_type;
+	uint8_t  duration;
+	uint8_t  num_antenna_id;
+	uint8_t  antenna_ids[0];
+} __attribute__ ((packed));
+
 #define BT_HCI_EVT_INQUIRY_COMPLETE		0x01
 struct bt_hci_evt_inquiry_complete {
 	uint8_t  status;
diff --git a/monitor/packet.c b/monitor/packet.c
index 64cb104..fa0ea36 100644
--- a/monitor/packet.c
+++ b/monitor/packet.c
@@ -7470,6 +7470,71 @@ static void le_receiver_test_cmd_v3(const void *data, uint8_t size)
 		print_field("  Antenna ID: %u", cmd->antenna_ids[i]);
 }
 
+static const char *parse_tx_test_payload(uint8_t payload)
+{
+	switch (payload) {
+	case 0x00:
+		return "PRBS9 sequence 11111111100000111101...";
+	case 0x01:
+		return "Repeated 11110000";
+	case 0x02:
+		return "Repeated 10101010";
+	case 0x03:
+		return "PRBS15";
+	case 0x04:
+		return "Repeated 11111111";
+	case 0x05:
+		return "Repeated 00000000";
+	case 0x06:
+		return "Repeated 00001111";
+	case 0x07:
+		return "Repeated 01010101";
+	default:
+		return "Reserved";
+	}
+}
+
+static void le_tx_test_cmd_v3(const void *data, uint8_t size)
+{
+	const struct bt_hci_cmd_le_tx_test_v3 *cmd = data;
+	uint8_t i;
+
+	print_field("TX Channel: %u MHz (0x%2.2x)", cmd->chan * 2 + 2402,
+								cmd->chan);
+	print_field("Length of Test Data: %u", cmd->data_len);
+	print_field("Packet Payload: %s (0x%2.2x)",
+			parse_tx_test_payload(cmd->payload), cmd->payload);
+
+	switch (cmd->phy) {
+	case 0x01:
+		print_field("PHY: LE 1M (0x%2.2x)", cmd->phy);
+		break;
+	case 0x02:
+		print_field("PHY: LE 2M (0x%2.2x)", cmd->phy);
+		break;
+	case 0x03:
+		print_field("PHY: LE Coded with S=8 (0x%2.2x)", cmd->phy);
+		break;
+	case 0x04:
+		print_field("PHY: LE Coded with S=2 (0x%2.2x)", cmd->phy);
+		break;
+	}
+
+	print_field("Expected CTE Length: %u us (0x%2.2x)", cmd->cte_len * 8,
+								cmd->cte_len);
+	print_field("Expected CTE Type: %u us slots (0x%2.2x)", cmd->cte_type,
+								cmd->cte_type);
+	print_field("Slot Duration: %u us (0x%2.2x)", cmd->duration,
+								cmd->duration);
+	print_field("Number of Antenna IDs: %u", cmd->num_antenna_id);
+
+	if (size < sizeof(*cmd) + cmd->num_antenna_id)
+		return;
+
+	for (i = 0; i < cmd->num_antenna_id; i++)
+		print_field("  Antenna ID: %u", cmd->antenna_ids[i]);
+}
+
 struct opcode_data {
 	uint16_t opcode;
 	int bit;
@@ -8260,6 +8325,9 @@ static const struct opcode_data opcode_table[] = {
 	{ 0x204f, 315, "LE Receiver Test command [v3]",
 				le_receiver_test_cmd_v3, 7, false,
 				status_rsp, 1, true },
+	{ 0x2050, 316, "LE Transmitter Test command [v3]",
+				le_tx_test_cmd_v3, 9, false,
+				status_rsp, 1, true },
 	{ }
 };