aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2011-06-28 11:57:25 +0300
committerJohan Hedberg <johan.hedberg@intel.com>2011-06-28 13:24:06 +0300
commit7dbe0c934fbba7ce135b64d3e3fc83b8c54fb191 (patch)
tree9c6de3fb1fc31c111fe68ed231721f7cdfd8d54e
parentd9b929e6574983496a90b30972fa7ec41faabfca (diff)
downloadbluez-hcidump-7dbe0c934fbba7ce135b64d3e3fc83b8c54fb191.tar.gz
Add basic parsing support for AVRCP PDU
-rw-r--r--parser/avrcp.c110
1 files changed, 109 insertions, 1 deletions
diff --git a/parser/avrcp.c b/parser/avrcp.c
index 203d1d0..0fa38d1 100644
--- a/parser/avrcp.c
+++ b/parser/avrcp.c
@@ -86,6 +86,31 @@
#define AVC_PANEL_FORWARD 0x4b
#define AVC_PANEL_BACKWARD 0x4c
+/* pdu ids */
+#define AVRCP_GET_CAPABILITIES 0x10
+#define AVRCP_LIST_PLAYER_ATTRIBUTES 0x11
+#define AVRCP_LIST_PLAYER_VALUES 0x12
+#define AVRCP_GET_CURRENT_PLAYER_VALUE 0x13
+#define AVRCP_SET_PLAYER_VALUE 0x14
+#define AVRCP_GET_PLAYER_ATTRIBUTE_TEXT 0x15
+#define AVRCP_GET_PLAYER_VALUE_TEXT 0x16
+#define AVRCP_DISPLAYABLE_CHARSET 0x17
+#define AVRCP_CT_BATTERY_STATUS 0x18
+#define AVRCP_GET_ELEMENT_ATTRIBUTES 0x20
+#define AVRCP_GET_PLAY_STATUS 0x30
+#define AVRCP_REGISTER_NOTIFICATION 0x31
+#define AVRCP_REQUEST_CONTINUING 0x40
+#define AVRCP_ABORT_CONTINUING 0x41
+#define AVRCP_SET_ABSOLUTE_VOLUME 0x50
+#define AVRCP_SET_ADDRESSED_PLAYER 0x60
+#define AVRCP_SET_BROWSED_PLAYER 0x70
+#define AVRCP_GET_FOLDER_ITEMS 0x71
+#define AVRCP_CHANGE_PATH 0x72
+#define AVRCP_GET_ITEM_ATTRIBUTES 0x73
+#define AVRCP_PLAY_ITEM 0x74
+#define AVRCP_SEARCH 0x80
+#define AVRCP_ADD_TO_NOW_PLAYING 0x90
+
static const char *ctype2str(uint8_t ctype)
{
switch (ctype & 0x0f) {
@@ -134,6 +159,76 @@ static const char *opcode2str(uint8_t opcode)
}
}
+static const char *pdu2str(uint8_t pduid)
+{
+ switch (pduid) {
+ case AVRCP_GET_CAPABILITIES:
+ return "GetCapabilities";
+ case AVRCP_LIST_PLAYER_ATTRIBUTES:
+ return "ListPlayerApplicationSettingAttributes";
+ case AVRCP_LIST_PLAYER_VALUES:
+ return "ListPlayerApplicationSettingValues";
+ case AVRCP_GET_CURRENT_PLAYER_VALUE:
+ return "GetCurrentPlayerApplicationSettingValue";
+ case AVRCP_SET_PLAYER_VALUE:
+ return "SetPlayerApplicationSettingValue";
+ case AVRCP_GET_PLAYER_ATTRIBUTE_TEXT:
+ return "GetPlayerApplicationSettingAttributeText";
+ case AVRCP_GET_PLAYER_VALUE_TEXT:
+ return "GetPlayerApplicationSettingValueText";
+ case AVRCP_DISPLAYABLE_CHARSET:
+ return "InformDisplayableCharacterSet";
+ case AVRCP_CT_BATTERY_STATUS:
+ return "InformBatteryStatusOfCT";
+ case AVRCP_GET_ELEMENT_ATTRIBUTES:
+ return "GetElementAttributes";
+ case AVRCP_GET_PLAY_STATUS:
+ return "GetPlayStatus";
+ case AVRCP_REGISTER_NOTIFICATION:
+ return "RegisterNotification";
+ case AVRCP_REQUEST_CONTINUING:
+ return "RequestContinuingResponse";
+ case AVRCP_ABORT_CONTINUING:
+ return "AbortContinuingResponse";
+ case AVRCP_SET_ABSOLUTE_VOLUME:
+ return "SetAbsoluteVolume";
+ case AVRCP_SET_ADDRESSED_PLAYER:
+ return "SetAddressedPlayer";
+ case AVRCP_SET_BROWSED_PLAYER:
+ return "SetBrowsedPlayer";
+ case AVRCP_GET_FOLDER_ITEMS:
+ return "GetFolderItems";
+ case AVRCP_CHANGE_PATH:
+ return "ChangePath";
+ case AVRCP_GET_ITEM_ATTRIBUTES:
+ return "GetItemAttributes";
+ case AVRCP_PLAY_ITEM:
+ return "PlayItem";
+ case AVRCP_SEARCH:
+ return "Search";
+ case AVRCP_ADD_TO_NOW_PLAYING:
+ return "AddToNowPlaying";
+ default:
+ return "Unknown";
+ }
+}
+
+static void avrcp_pdu_dump(int level, struct frame *frm, uint8_t ctype)
+{
+ uint8_t pduid, pt;
+ uint16_t len;
+
+ p_indent(level, frm);
+
+ pduid = get_u8(frm);
+ pt = get_u8(frm);
+ len = get_u16(frm);
+
+ printf("AVRCP: %s: pt 0x%02x len 0x%04x\n", pdu2str(pduid), pt, len);
+
+ raw_dump(level, frm);
+}
+
static char *op2str(uint8_t op)
{
switch (op & 0x7f) {
@@ -224,7 +319,8 @@ static const char *subunit2str(uint8_t subunit)
void avrcp_dump(int level, struct frame *frm)
{
- uint8_t ctype, address, subunit, opcode;
+ uint8_t ctype, address, subunit, opcode, company[3];
+ int i;
p_indent(level, frm);
@@ -254,6 +350,18 @@ void avrcp_dump(int level, struct frame *frm)
case AVC_OP_PASSTHROUGH:
avrcp_passthrough_dump(level + 1, frm);
break;
+ case AVC_OP_VENDORDEP:
+ p_indent(level + 1, frm);
+
+ printf("Company ID: 0x");
+ for (i = 0; i < 3; i++) {
+ company[i] = get_u8(frm);
+ printf("%02x", company[i]);
+ }
+ printf("\n");
+
+ avrcp_pdu_dump(level + 1, frm, ctype);
+ break;
default:
raw_dump(level, frm);
}