diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2017-06-10 05:23:45 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2017-06-10 05:23:45 -0700 |
commit | 0f791b0cc6d8da278172f7cb3bbc6f4857e4d63b (patch) | |
tree | 2f307baae40dfe8750caf45162e43ffbd4a89ba6 /monitor/broadcom.c | |
parent | fedb7f6eaba7bc4ac879d1762ff267789c4db552 (diff) | |
download | bluez-0f791b0cc6d8da278172f7cb3bbc6f4857e4d63b.tar.gz |
monitor: Add Broadcom controller features decoding
Diffstat (limited to 'monitor/broadcom.c')
-rw-r--r-- | monitor/broadcom.c | 52 |
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 }, |