1/* 2 * 3 * BlueZ - Bluetooth protocol stack for Linux 4 * 5 * Copyright (C) 2003-2007 Marcel Holtmann <marcel@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 39static 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 67static 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 89static 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 109static 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 125static 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 137void 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