1 /* $NetBSD: print.c,v 1.8 2007/04/21 06:15:24 plunky Exp $ */
4 * Copyright (c) 2006 Itronix Inc.
7 * Written by Iain Hibbert for Itronix Inc.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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.
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.
34 * Copyright (c) 2004 Maksim Yevmenkin <m_evmenkin@yahoo.com>
35 * All rights reserved.
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
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.
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
60 #include <sys/cdefs.h>
61 __RCSID("$NetBSD: print.c,v 1.8 2007/04/21 06:15:24 plunky Exp $");
63 #include <sys/types.h>
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>
71 #include <prop/proplib.h>
73 #include <bluetooth.h>
79 static void cfg_bthidev(prop_dictionary_t dict
);
80 static void cfg_btsco(prop_dictionary_t dict
);
82 static void hid_dump_item(char const *, struct hid_item
*);
83 static void hid_parse(prop_data_t
);
86 cfg_print(prop_dictionary_t dict
)
90 obj
= prop_dictionary_get(dict
, BTDEVladdr
);
91 if (prop_object_type(obj
) != PROP_TYPE_DATA
) {
94 printf("local bdaddr: %s\n", bt_ntoa(prop_data_data_nocopy(obj
), NULL
));
96 obj
= prop_dictionary_get(dict
, BTDEVraddr
);
97 if (prop_object_type(obj
) != PROP_TYPE_DATA
) {
100 printf("remote bdaddr: %s\n", bt_ntoa(prop_data_data_nocopy(obj
), NULL
));
102 obj
= prop_dictionary_get(dict
, BTDEVmode
);
103 if (prop_object_type(obj
) == PROP_TYPE_STRING
)
104 printf("link mode: %s\n", prop_string_cstring_nocopy(obj
));
106 obj
= prop_dictionary_get(dict
, BTDEVtype
);
107 if (prop_object_type(obj
) != PROP_TYPE_STRING
) {
108 printf("No device type!\n");
111 printf("device type: %s\n", prop_string_cstring_nocopy(obj
));
113 if (prop_string_equals_cstring(obj
, "bthidev")) {
118 if (prop_string_equals_cstring(obj
, "btsco")) {
123 printf("Unknown device type!\n");
127 cfg_bthidev(prop_dictionary_t dict
)
131 obj
= prop_dictionary_get(dict
, BTHIDEVcontrolpsm
);
132 if (prop_object_type(obj
) == PROP_TYPE_NUMBER
)
133 printf("control psm: 0x%4.4" PRIx64
"\n",
134 prop_number_integer_value(obj
));
136 obj
= prop_dictionary_get(dict
, BTHIDEVinterruptpsm
);
137 if (prop_object_type(obj
) == PROP_TYPE_NUMBER
)
138 printf("interrupt psm: 0x%4.4" PRIx64
"\n",
139 prop_number_integer_value(obj
));
141 obj
= prop_dictionary_get(dict
, BTHIDEVreconnect
);
142 if (prop_bool_true(obj
))
143 printf("reconnect mode: true\n");
145 obj
= prop_dictionary_get(dict
, BTHIDEVdescriptor
);
146 if (prop_object_type(obj
) == PROP_TYPE_DATA
)
151 cfg_btsco(prop_dictionary_t dict
)
155 obj
= prop_dictionary_get(dict
, BTSCOlisten
);
156 printf("mode: %s\n", prop_bool_true(obj
) ? "listen" : "connect");
158 obj
= prop_dictionary_get(dict
, BTSCOchannel
);
159 if (prop_object_type(obj
) == PROP_TYPE_NUMBER
)
160 printf("channel: %" PRId64
"\n",
161 prop_number_integer_value(obj
));
165 hid_parse(prop_data_t desc
)
173 r
= hid_use_report_desc(prop_data_data_nocopy(desc
),
174 prop_data_size(desc
));
178 d
= hid_start_parse(r
, ~0, -1);
179 while (hid_get_item(d
, &h
)) {
182 printf("Collection page=%s usage=%s\n",
183 hid_usage_page(HID_PAGE(h
.usage
)),
184 hid_usage_in_page(h
.usage
));
187 case hid_endcollection
:
188 printf("End collection\n");
192 hid_dump_item(" Input", &h
);
196 hid_dump_item(" Output", &h
);
200 hid_dump_item("Feature", &h
);
206 hid_dispose_report_desc(r
);
210 hid_dump_item(char const *label
, struct hid_item
*h
)
213 printf("%s id=%u size=%u count=%u page=%s usage=%s%s%s%s%s%s%s%s%s%s",
214 label
, (uint8_t) h
->report_ID
, h
->report_size
, h
->report_count
,
215 hid_usage_page(HID_PAGE(h
->usage
)),
216 hid_usage_in_page(h
->usage
),
217 (h
->flags
& HIO_CONST
) ? " Const" : "",
218 (h
->flags
& HIO_VARIABLE
) ? " Variable" : "",
219 (h
->flags
& HIO_RELATIVE
) ? " Relative" : "",
220 (h
->flags
& HIO_WRAP
) ? " Wrap" : "",
221 (h
->flags
& HIO_NONLINEAR
) ? " NonLinear" : "",
222 (h
->flags
& HIO_NOPREF
) ? " NoPref" : "",
223 (h
->flags
& HIO_NULLSTATE
) ? " NullState" : "",
224 (h
->flags
& HIO_VOLATILE
) ? " Volatile" : "",
225 (h
->flags
& HIO_BUFBYTES
) ? " BufBytes" : "");
227 printf(", logical range %d..%d",
228 h
->logical_minimum
, h
->logical_maximum
);
230 if (h
->physical_minimum
!= h
->physical_maximum
)
231 printf(", physical range %d..%d",
232 h
->physical_minimum
, h
->physical_maximum
);
235 printf(", unit=0x%02x exp=%d", h
->unit
, h
->unit_exponent
);