diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2005-05-16 13:17:57 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2005-05-16 13:17:57 +0000 |
commit | 10f133c4a22f29eb31616f699c1abf9e614da23d (patch) | |
tree | fa2d29404b63e41ab3834473ccf5c09b169a4d4b /parser/csr.c | |
parent | 534badef4f1d883781a4cc4a0d45cecd4c901db0 (diff) | |
download | hcidump-10f133c4a22f29eb31616f699c1abf9e614da23d.tar.gz |
Add CSR verbose decoding support
Diffstat (limited to 'parser/csr.c')
-rw-r--r-- | parser/csr.c | 119 |
1 files changed, 116 insertions, 3 deletions
diff --git a/parser/csr.c b/parser/csr.c index 182874b..c48d604 100644 --- a/parser/csr.c +++ b/parser/csr.c @@ -52,6 +52,85 @@ static char *type2str(uint16_t type) } } +static inline void uint16_dump(int level, char *str, struct frame *frm) +{ + uint16_t value; + + value = CSR_U16(frm); + + p_indent(level, frm); + printf("%s: value %d (0x%4.4x)\n", str, value, value); +} + +static inline void bdaddr_dump(int level, char *str, struct frame *frm) +{ + char addr[18]; + + ba2str(frm->ptr, addr); + + p_indent(level, frm); + printf("%s: bdaddr %s\n", str, addr); +} + +static inline void handle_length_dump(int level, char *str, struct frame *frm) +{ + uint16_t handle, length; + + handle = CSR_U16(frm); + length = CSR_U16(frm); + + p_indent(level, frm); + printf("%s: handle %d length %d\n", str, handle, length); +} + +static inline void pskey_dump(int level, struct frame *frm) +{ + uint16_t key, length, stores; + + key = CSR_U16(frm); + length = CSR_U16(frm); + stores = CSR_U16(frm); + + p_indent(level, frm); + printf("PSKEY: key 0x%4.4x len %d stores %d\n", key, length, stores); + + switch (key) { + case 0x0001: + bdaddr_dump(level + 1, "BDADDR", frm); + break; + case 0x00da: + uint16_dump(level + 1, "ENC_KEY_LMIN", frm); + break; + case 0x00db: + uint16_dump(level + 1, "ENC_KEY_LMAX", frm); + break; + case 0x01ab: + uint16_dump(level + 1, "HOSTIO_MAP_SCO_PCM", frm); + break; + case 0x01be: + uint16_dump(level + 1, "UART_BAUDRATE", frm); + break; + case 0x01f9: + uint16_dump(level + 1, "HOST_INTERFACE", frm); + break; + case 0x02be: + uint16_dump(level + 1, "USB_VENDOR_ID", frm); + break; + case 0x02bf: + uint16_dump(level + 1, "USB_PRODUCT_ID", frm); + break; + case 0x02cb: + uint16_dump(level + 1, "USB_DFU_PRODUCT_ID", frm); + break; + case 0x03cd: + uint16_dump(level + 1, "INITIAL_BOOTMODE", frm); + break; + default: + raw_dump(level + 1, frm); + break; + } +} + static inline void bccmd_dump(int level, struct frame *frm) { uint16_t type, length, seqno, varid, status; @@ -65,6 +144,41 @@ static inline void bccmd_dump(int level, struct frame *frm) p_indent(level, frm); printf("BCCMD: %s: len %d seqno %d varid 0x%4.4x status %d\n", type2str(type), length, seqno, varid, status); + + if (!(parser.flags & DUMP_VERBOSE)) { + raw_dump(level + 1, frm); + return; + } + + switch (varid) { + case 0x2819: + uint16_dump(level + 1, "BUILDID", frm); + break; + case 0x281a: + uint16_dump(level + 1, "CHIPVER", frm); + break; + case 0x281b: + uint16_dump(level + 1, "CHIPREV", frm); + break; + case 0x282c: + uint16_dump(level + 1, "MAX_CRYPT_KEY_LENGTH", frm); + break; + case 0x3008: + handle_length_dump(level + 1, "CRYPT_KEY_LENGTH", frm); + break; + case 0x6805: + uint16_dump(level + 1, "PANIC_ARG", frm); + break; + case 0x6806: + uint16_dump(level + 1, "FAULT_ARG", frm); + break; + case 0x7003: + pskey_dump(level + 1, frm); + break; + default: + raw_dump(level + 1, frm); + break; + } } static char *cid2str(uint8_t cid) @@ -133,7 +247,6 @@ void csr_dump(int level, struct frame *frm) switch (cid) { case 2: bccmd_dump(level, frm); - level++; break; case 20: @@ -172,13 +285,13 @@ void csr_dump(int level, struct frame *frm) p_indent(level, frm); printf("CSR: Debug (type 0x%2.2x)\n", type); + raw_dump(level, frm); break; default: p_indent(level, frm); printf("CSR: %s (channel %d)%s\n", cid2str(cid), cid, frag2str(desc)); + raw_dump(level, frm); break; } - - raw_dump(level, frm); } |