1 /* $NetBSD: print.c,v 1.7 2006/09/29 18:48:17 plunky Exp $ */ 2 3 /*- 4 * Copyright (c) 2006 Itronix Inc. 5 * All rights reserved. 6 * 7 * Written by Iain Hibbert for Itronix Inc. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. The name of Itronix Inc. may not be used to endorse 18 * or promote products derived from this software without specific 19 * prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY 25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 28 * ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 * POSSIBILITY OF SUCH DAMAGE. 32 */ 33 /* 34 * Copyright (c) 2004 Maksim Yevmenkin <m_evmenkin@yahoo.com> 35 * All rights reserved. 36 * 37 * Redistribution and use in source and binary forms, with or without 38 * modification, are permitted provided that the following conditions 39 * are met: 40 * 1. Redistributions of source code must retain the above copyright 41 * notice, this list of conditions and the following disclaimer. 42 * 2. Redistributions in binary form must reproduce the above copyright 43 * notice, this list of conditions and the following disclaimer in the 44 * documentation and/or other materials provided with the distribution. 45 * 46 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 47 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 48 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 49 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 50 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 51 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 52 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 53 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 54 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 55 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 56 * SUCH DAMAGE. 57 * 58 */ 59 60 #include <sys/cdefs.h> 61 __RCSID("$NetBSD: print.c,v 1.7 2006/09/29 18:48:17 plunky Exp $"); 62 63 #include <sys/types.h> 64 65 #include <dev/bluetooth/btdev.h> 66 #include <dev/bluetooth/bthidev.h> 67 #include <dev/bluetooth/btsco.h> 68 #include <dev/usb/usb.h> 69 #include <dev/usb/usbhid.h> 70 71 #include <prop/proplib.h> 72 73 #include <bluetooth.h> 74 #include <err.h> 75 #include <usbhid.h> 76 77 #include "btdevctl.h" 78 79 static void cfg_bthidev(prop_dictionary_t dict); 80 static void cfg_btsco(prop_dictionary_t dict); 81 82 static void hid_dump_item(char const *, struct hid_item *); 83 static void hid_parse(prop_data_t); 84 85 void 86 cfg_print(prop_dictionary_t dict) 87 { 88 prop_object_t obj; 89 90 obj = prop_dictionary_get(dict, BTDEVladdr); 91 if (prop_object_type(obj) != PROP_TYPE_DATA) { 92 return; 93 } 94 printf("local bdaddr: %s\n", bt_ntoa(prop_data_data_nocopy(obj), NULL)); 95 96 obj = prop_dictionary_get(dict, BTDEVraddr); 97 if (prop_object_type(obj) != PROP_TYPE_DATA) { 98 return; 99 } 100 printf("remote bdaddr: %s\n", bt_ntoa(prop_data_data_nocopy(obj), NULL)); 101 102 obj = prop_dictionary_get(dict, BTDEVtype); 103 if (prop_object_type(obj) != PROP_TYPE_STRING) { 104 printf("No device type!\n"); 105 return; 106 } 107 printf("device type: %s\n", prop_string_cstring_nocopy(obj)); 108 109 if (prop_string_equals_cstring(obj, "bthidev")) { 110 cfg_bthidev(dict); 111 return; 112 } 113 114 if (prop_string_equals_cstring(obj, "btsco")) { 115 cfg_btsco(dict); 116 return; 117 } 118 119 printf("Unknown device type!\n"); 120 } 121 122 static void 123 cfg_bthidev(prop_dictionary_t dict) 124 { 125 prop_object_t obj; 126 127 obj = prop_dictionary_get(dict, BTHIDEVcontrolpsm); 128 if (prop_object_type(obj) == PROP_TYPE_NUMBER) 129 printf("control psm: 0x%4.4" PRIx64 "\n", 130 prop_number_integer_value(obj)); 131 132 obj = prop_dictionary_get(dict, BTHIDEVinterruptpsm); 133 if (prop_object_type(obj) == PROP_TYPE_NUMBER) 134 printf("interrupt psm: 0x%4.4" PRIx64 "\n", 135 prop_number_integer_value(obj)); 136 137 obj = prop_dictionary_get(dict, BTHIDEVreconnect); 138 if (prop_bool_true(obj)) 139 printf("reconnect mode: TRUE\n"); 140 141 obj = prop_dictionary_get(dict, BTHIDEVdescriptor); 142 if (prop_object_type(obj) == PROP_TYPE_DATA) 143 hid_parse(obj); 144 } 145 146 static void 147 cfg_btsco(prop_dictionary_t dict) 148 { 149 prop_object_t obj; 150 151 obj = prop_dictionary_get(dict, BTSCOlisten); 152 printf("mode: %s\n", prop_bool_true(obj) ? "listen" : "connect"); 153 154 obj = prop_dictionary_get(dict, BTSCOchannel); 155 if (prop_object_type(obj) == PROP_TYPE_NUMBER) 156 printf("channel: %" PRId64 "\n", 157 prop_number_integer_value(obj)); 158 } 159 160 static void 161 hid_parse(prop_data_t desc) 162 { 163 report_desc_t r; 164 hid_data_t d; 165 struct hid_item h; 166 167 hid_init(NULL); 168 169 r = hid_use_report_desc((unsigned char *)prop_data_data_nocopy(desc), 170 prop_data_size(desc)); 171 if (r == NULL) 172 return; 173 174 d = hid_start_parse(r, ~0, -1); 175 while (hid_get_item(d, &h)) { 176 switch (h.kind) { 177 case hid_collection: 178 printf("Collection page=%s usage=%s\n", 179 hid_usage_page(HID_PAGE(h.usage)), 180 hid_usage_in_page(h.usage)); 181 break; 182 183 case hid_endcollection: 184 printf("End collection\n"); 185 break; 186 187 case hid_input: 188 hid_dump_item(" Input", &h); 189 break; 190 191 case hid_output: 192 hid_dump_item(" Output", &h); 193 break; 194 195 case hid_feature: 196 hid_dump_item("Feature", &h); 197 break; 198 } 199 } 200 201 hid_end_parse(d); 202 hid_dispose_report_desc(r); 203 } 204 205 static void 206 hid_dump_item(char const *label, struct hid_item *h) 207 { 208 209 printf("%s id=%u size=%u count=%u page=%s usage=%s%s%s%s%s%s%s%s%s%s", 210 label, (uint8_t) h->report_ID, h->report_size, h->report_count, 211 hid_usage_page(HID_PAGE(h->usage)), 212 hid_usage_in_page(h->usage), 213 (h->flags & HIO_CONST) ? " Const" : "", 214 (h->flags & HIO_VARIABLE) ? " Variable" : "", 215 (h->flags & HIO_RELATIVE) ? " Relative" : "", 216 (h->flags & HIO_WRAP) ? " Wrap" : "", 217 (h->flags & HIO_NONLINEAR) ? " NonLinear" : "", 218 (h->flags & HIO_NOPREF) ? " NoPref" : "", 219 (h->flags & HIO_NULLSTATE) ? " NullState" : "", 220 (h->flags & HIO_VOLATILE) ? " Volatile" : "", 221 (h->flags & HIO_BUFBYTES) ? " BufBytes" : ""); 222 223 printf(", logical range %d..%d", 224 h->logical_minimum, h->logical_maximum); 225 226 if (h->physical_minimum != h->physical_maximum) 227 printf(", physical range %d..%d", 228 h->physical_minimum, h->physical_maximum); 229 230 if (h->unit) 231 printf(", unit=0x%02x exp=%d", h->unit, h->unit_exponent); 232 233 printf("\n"); 234 } 235