1 /* 2 * 3 * BlueZ - Bluetooth protocol stack for Linux 4 * 5 * Copyright (C) 2003-2011 Marcel Holtmann <marcel (at) holtmann.org> 6 * 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 21 * 22 */ 23 24 #ifdef HAVE_CONFIG_H 25 #include <config.h> 26 #endif 27 28 #include <stdio.h> 29 #include <errno.h> 30 #include <unistd.h> 31 #include <stdlib.h> 32 #include <string.h> 33 34 #include <sys/types.h> 35 #include <netinet/in.h> 36 37 #include "parser.h" 38 39 static char *type2str(uint8_t head) 40 { 41 switch (head & 0xf0) { 42 case 0x00: 43 return "Handshake"; 44 case 0x10: 45 return "Control"; 46 case 0x40: 47 return "Get report"; 48 case 0x50: 49 return "Set report"; 50 case 0x60: 51 return "Get protocol"; 52 case 0x70: 53 return "Set protocol"; 54 case 0x80: 55 return "Get idle"; 56 case 0x90: 57 return "Set idle"; 58 case 0xa0: 59 return "Data"; 60 case 0xb0: 61 return "Data continuation"; 62 default: 63 return "Reserved"; 64 } 65 } 66 67 static char *result2str(uint8_t head) 68 { 69 switch (head & 0x0f) { 70 case 0x00: 71 return "Successful"; 72 case 0x01: 73 return "Not ready"; 74 case 0x02: 75 return "Invalid report ID"; 76 case 0x03: 77 return "Unsupported request"; 78 case 0x04: 79 return "Invalid parameter"; 80 case 0x0e: 81 return "Unknown"; 82 case 0x0f: 83 return "Fatal"; 84 default: 85 return "Reserved"; 86 } 87 } 88 89 static char *operation2str(uint8_t head) 90 { 91 switch (head & 0x0f) { 92 case 0x00: 93 return "No operation"; 94 case 0x01: 95 return "Hard reset"; 96 case 0x02: 97 return "Soft reset"; 98 case 0x03: 99 return "Suspend"; 100 case 0x04: 101 return "Exit suspend"; 102 case 0x05: 103 return "Virtual cable unplug"; 104 default: 105 return "Reserved"; 106 } 107 } 108 109 static char *report2str(uint8_t head) 110 { 111 switch (head & 0x03) { 112 case 0x00: 113 return "Other report"; 114 case 0x01: 115 return "Input report"; 116 case 0x02: 117 return "Output report"; 118 case 0x03: 119 return "Feature report"; 120 default: 121 return "Reserved"; 122 } 123 } 124 125 static char *protocol2str(uint8_t head) 126 { 127 switch (head & 0x01) { 128 case 0x00: 129 return "Boot protocol"; 130 case 0x01: 131 return "Report protocol"; 132 default: 133 return "Reserved"; 134 } 135 } 136 137 void hidp_dump(int level, struct frame *frm) 138 { 139 uint8_t hdr; 140 char *param; 141 142 hdr = get_u8(frm); 143 144 switch (hdr & 0xf0) { 145 case 0x00: 146 param = result2str(hdr); 147 break; 148 case 0x10: 149 param = operation2str(hdr); 150 break; 151 case 0x60: 152 case 0x70: 153 param = protocol2str(hdr); 154 break; 155 case 0x40: 156 case 0x50: 157 case 0xa0: 158 case 0xb0: 159 param = report2str(hdr); 160 break; 161 default: 162 param = ""; 163 break; 164 } 165 166 p_indent(level, frm); 167 168 printf("HIDP: %s: %s\n", type2str(hdr), param); 169 170 raw_dump(level, frm); 171 } 172