summaryrefslogtreecommitdiff
path: root/monitor/broadcom.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2017-06-10 05:23:45 -0700
committerMarcel Holtmann <marcel@holtmann.org>2017-06-10 05:23:45 -0700
commit0f791b0cc6d8da278172f7cb3bbc6f4857e4d63b (patch)
tree2f307baae40dfe8750caf45162e43ffbd4a89ba6 /monitor/broadcom.c
parentfedb7f6eaba7bc4ac879d1762ff267789c4db552 (diff)
downloadbluez-0f791b0cc6d8da278172f7cb3bbc6f4857e4d63b.tar.gz
monitor: Add Broadcom controller features decoding
Diffstat (limited to 'monitor/broadcom.c')
-rw-r--r--monitor/broadcom.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/monitor/broadcom.c b/monitor/broadcom.c
index a3c344398..7e714db02 100644
--- a/monitor/broadcom.c
+++ b/monitor/broadcom.c
@@ -27,6 +27,7 @@
#endif
#include <stdio.h>
+#include <inttypes.h>
#include "src/shared/util.h"
#include "display.h"
@@ -36,6 +37,8 @@
#include "vendor.h"
#include "broadcom.h"
+#define COLOR_UNKNOWN_FEATURE_BIT COLOR_WHITE_BG
+
static void print_status(uint8_t status)
{
packet_print_error("Status", status);
@@ -103,6 +106,52 @@ static void read_vid_pid_rsp(const void *data, uint8_t size)
print_field("Product: %4.4x:%4.4x", vid, pid);
}
+static const struct {
+ uint8_t bit;
+ const char *str;
+} features_table[] = {
+ { 0, "Multi-AV transport bandwidth reducer" },
+ { 1, "WBS SBC" },
+ { 2, "FW LC-PLC" },
+ { 3, "FM SBC internal stack" },
+ { }
+};
+
+static void print_features(const uint8_t *features_array)
+{
+ uint64_t mask, features = 0;
+ char str[41];
+ int i;
+
+ for (i = 0; i < 8; i++) {
+ sprintf(str + (i * 5), " 0x%2.2x", features_array[i]);
+ features |= ((uint64_t) features_array[i]) << (i * 8);
+ }
+
+ print_field("Features:%s", str);
+
+ mask = features;
+
+ for (i = 0; features_table[i].str; i++) {
+ if (features & (((uint64_t) 1) << features_table[i].bit)) {
+ print_field(" %s", features_table[i].str);
+ mask &= ~(((uint64_t) 1) << features_table[i].bit);
+ }
+ }
+
+ if (mask)
+ print_text(COLOR_UNKNOWN_FEATURE_BIT, " Unknown features "
+ "(0x%16.16" PRIx64 ")", mask);
+}
+
+static void read_controller_features_rsp(const void *data, uint8_t size)
+{
+ uint8_t status = get_u8(data);
+
+ print_status(status);
+ print_features(data + 1);
+}
+
static void read_verbose_version_info_rsp(const void *data, uint8_t size)
{
uint8_t status = get_u8(data);
@@ -154,6 +203,9 @@ static const struct vendor_ocf vendor_ocf_table[] = {
{ 0x05a, "Read VID PID",
null_cmd, 0, true,
read_vid_pid_rsp, 5, true },
+ { 0x06e, "Read Controller Features",
+ null_cmd, 0, true,
+ read_controller_features_rsp, 9, true },
{ 0x079, "Read Verbose Config Version Info",
null_cmd, 0, true,
read_verbose_version_info_rsp, 7, true },