/* * * BlueZ - Bluetooth protocol stack for Linux * * Copyright (C) 2003-2011 Marcel Holtmann * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * */ #ifdef HAVE_CONFIG_H #include #endif #define _GNU_SOURCE #include #include #include #include #include #include "parser.h" static char *type2str(uint8_t head) { switch (head & 0xf0) { case 0x00: return "Handshake"; case 0x10: return "Control"; case 0x40: return "Get report"; case 0x50: return "Set report"; case 0x60: return "Get protocol"; case 0x70: return "Set protocol"; case 0x80: return "Get idle"; case 0x90: return "Set idle"; case 0xa0: return "Data"; case 0xb0: return "Data continuation"; default: return "Reserved"; } } static char *result2str(uint8_t head) { switch (head & 0x0f) { case 0x00: return "Successful"; case 0x01: return "Not ready"; case 0x02: return "Invalid report ID"; case 0x03: return "Unsupported request"; case 0x04: return "Invalid parameter"; case 0x0e: return "Unknown"; case 0x0f: return "Fatal"; default: return "Reserved"; } } static char *operation2str(uint8_t head) { switch (head & 0x0f) { case 0x00: return "No operation"; case 0x01: return "Hard reset"; case 0x02: return "Soft reset"; case 0x03: return "Suspend"; case 0x04: return "Exit suspend"; case 0x05: return "Virtual cable unplug"; default: return "Reserved"; } } static char *report2str(uint8_t head) { switch (head & 0x03) { case 0x00: return "Other report"; case 0x01: return "Input report"; case 0x02: return "Output report"; case 0x03: return "Feature report"; default: return "Reserved"; } } static char *protocol2str(uint8_t head) { switch (head & 0x01) { case 0x00: return "Boot protocol"; case 0x01: return "Report protocol"; default: return "Reserved"; } } void hidp_dump(int level, struct frame *frm) { uint8_t hdr; char *param; hdr = p_get_u8(frm); switch (hdr & 0xf0) { case 0x00: param = result2str(hdr); break; case 0x10: param = operation2str(hdr); break; case 0x60: case 0x70: param = protocol2str(hdr); break; case 0x40: case 0x50: case 0xa0: case 0xb0: param = report2str(hdr); break; default: param = ""; break; } p_indent(level, frm); printf("HIDP: %s: %s\n", type2str(hdr), param); raw_dump(level, frm); }