xref: /aosp_15_r20/external/libusb/examples/hotplugtest.c (revision 86b64dcb59b3a0b37502ecd56e119234366a6f7e)
1*86b64dcbSAndroid Build Coastguard Worker /* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */
2*86b64dcbSAndroid Build Coastguard Worker /*
3*86b64dcbSAndroid Build Coastguard Worker  * libusb example program for hotplug API
4*86b64dcbSAndroid Build Coastguard Worker  * Copyright © 2012-2013 Nathan Hjelm <[email protected]>
5*86b64dcbSAndroid Build Coastguard Worker  *
6*86b64dcbSAndroid Build Coastguard Worker  * This library is free software; you can redistribute it and/or
7*86b64dcbSAndroid Build Coastguard Worker  * modify it under the terms of the GNU Lesser General Public
8*86b64dcbSAndroid Build Coastguard Worker  * License as published by the Free Software Foundation; either
9*86b64dcbSAndroid Build Coastguard Worker  * version 2.1 of the License, or (at your option) any later version.
10*86b64dcbSAndroid Build Coastguard Worker  *
11*86b64dcbSAndroid Build Coastguard Worker  * This library is distributed in the hope that it will be useful,
12*86b64dcbSAndroid Build Coastguard Worker  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*86b64dcbSAndroid Build Coastguard Worker  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*86b64dcbSAndroid Build Coastguard Worker  * Lesser General Public License for more details.
15*86b64dcbSAndroid Build Coastguard Worker  *
16*86b64dcbSAndroid Build Coastguard Worker  * You should have received a copy of the GNU Lesser General Public
17*86b64dcbSAndroid Build Coastguard Worker  * License along with this library; if not, write to the Free Software
18*86b64dcbSAndroid Build Coastguard Worker  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19*86b64dcbSAndroid Build Coastguard Worker  */
20*86b64dcbSAndroid Build Coastguard Worker 
21*86b64dcbSAndroid Build Coastguard Worker #include <stdlib.h>
22*86b64dcbSAndroid Build Coastguard Worker #include <stdio.h>
23*86b64dcbSAndroid Build Coastguard Worker 
24*86b64dcbSAndroid Build Coastguard Worker #include "libusb.h"
25*86b64dcbSAndroid Build Coastguard Worker 
26*86b64dcbSAndroid Build Coastguard Worker int done = 0;
27*86b64dcbSAndroid Build Coastguard Worker libusb_device_handle *handle = NULL;
28*86b64dcbSAndroid Build Coastguard Worker 
hotplug_callback(libusb_context * ctx,libusb_device * dev,libusb_hotplug_event event,void * user_data)29*86b64dcbSAndroid Build Coastguard Worker static int LIBUSB_CALL hotplug_callback(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
30*86b64dcbSAndroid Build Coastguard Worker {
31*86b64dcbSAndroid Build Coastguard Worker 	struct libusb_device_descriptor desc;
32*86b64dcbSAndroid Build Coastguard Worker 	int rc;
33*86b64dcbSAndroid Build Coastguard Worker 
34*86b64dcbSAndroid Build Coastguard Worker 	(void)ctx;
35*86b64dcbSAndroid Build Coastguard Worker 	(void)dev;
36*86b64dcbSAndroid Build Coastguard Worker 	(void)event;
37*86b64dcbSAndroid Build Coastguard Worker 	(void)user_data;
38*86b64dcbSAndroid Build Coastguard Worker 
39*86b64dcbSAndroid Build Coastguard Worker 	rc = libusb_get_device_descriptor(dev, &desc);
40*86b64dcbSAndroid Build Coastguard Worker 	if (LIBUSB_SUCCESS == rc) {
41*86b64dcbSAndroid Build Coastguard Worker 		printf ("Device attached: %04x:%04x\n", desc.idVendor, desc.idProduct);
42*86b64dcbSAndroid Build Coastguard Worker 	} else {
43*86b64dcbSAndroid Build Coastguard Worker 		printf ("Device attached\n");
44*86b64dcbSAndroid Build Coastguard Worker 		fprintf (stderr, "Error getting device descriptor: %s\n",
45*86b64dcbSAndroid Build Coastguard Worker 			 libusb_strerror((enum libusb_error)rc));
46*86b64dcbSAndroid Build Coastguard Worker 	}
47*86b64dcbSAndroid Build Coastguard Worker 
48*86b64dcbSAndroid Build Coastguard Worker 	if (handle) {
49*86b64dcbSAndroid Build Coastguard Worker 		libusb_close (handle);
50*86b64dcbSAndroid Build Coastguard Worker 		handle = NULL;
51*86b64dcbSAndroid Build Coastguard Worker 	}
52*86b64dcbSAndroid Build Coastguard Worker 
53*86b64dcbSAndroid Build Coastguard Worker 	rc = libusb_open (dev, &handle);
54*86b64dcbSAndroid Build Coastguard Worker 	if (LIBUSB_SUCCESS != rc) {
55*86b64dcbSAndroid Build Coastguard Worker 		fprintf (stderr, "No access to device: %s\n",
56*86b64dcbSAndroid Build Coastguard Worker 			 libusb_strerror((enum libusb_error)rc));
57*86b64dcbSAndroid Build Coastguard Worker 	}
58*86b64dcbSAndroid Build Coastguard Worker 
59*86b64dcbSAndroid Build Coastguard Worker 	done++;
60*86b64dcbSAndroid Build Coastguard Worker 
61*86b64dcbSAndroid Build Coastguard Worker 	return 0;
62*86b64dcbSAndroid Build Coastguard Worker }
63*86b64dcbSAndroid Build Coastguard Worker 
hotplug_callback_detach(libusb_context * ctx,libusb_device * dev,libusb_hotplug_event event,void * user_data)64*86b64dcbSAndroid Build Coastguard Worker static int LIBUSB_CALL hotplug_callback_detach(libusb_context *ctx, libusb_device *dev, libusb_hotplug_event event, void *user_data)
65*86b64dcbSAndroid Build Coastguard Worker {
66*86b64dcbSAndroid Build Coastguard Worker 	struct libusb_device_descriptor desc;
67*86b64dcbSAndroid Build Coastguard Worker 	int rc;
68*86b64dcbSAndroid Build Coastguard Worker 
69*86b64dcbSAndroid Build Coastguard Worker 	(void)ctx;
70*86b64dcbSAndroid Build Coastguard Worker 	(void)dev;
71*86b64dcbSAndroid Build Coastguard Worker 	(void)event;
72*86b64dcbSAndroid Build Coastguard Worker 	(void)user_data;
73*86b64dcbSAndroid Build Coastguard Worker 
74*86b64dcbSAndroid Build Coastguard Worker 	rc = libusb_get_device_descriptor(dev, &desc);
75*86b64dcbSAndroid Build Coastguard Worker 	if (LIBUSB_SUCCESS == rc) {
76*86b64dcbSAndroid Build Coastguard Worker 		printf ("Device detached: %04x:%04x\n", desc.idVendor, desc.idProduct);
77*86b64dcbSAndroid Build Coastguard Worker 	} else {
78*86b64dcbSAndroid Build Coastguard Worker 		printf ("Device detached\n");
79*86b64dcbSAndroid Build Coastguard Worker 		fprintf (stderr, "Error getting device descriptor: %s\n",
80*86b64dcbSAndroid Build Coastguard Worker 			 libusb_strerror((enum libusb_error)rc));
81*86b64dcbSAndroid Build Coastguard Worker 	}
82*86b64dcbSAndroid Build Coastguard Worker 
83*86b64dcbSAndroid Build Coastguard Worker 	if (handle) {
84*86b64dcbSAndroid Build Coastguard Worker 		libusb_close (handle);
85*86b64dcbSAndroid Build Coastguard Worker 		handle = NULL;
86*86b64dcbSAndroid Build Coastguard Worker 	}
87*86b64dcbSAndroid Build Coastguard Worker 
88*86b64dcbSAndroid Build Coastguard Worker 	done++;
89*86b64dcbSAndroid Build Coastguard Worker 
90*86b64dcbSAndroid Build Coastguard Worker 	return 0;
91*86b64dcbSAndroid Build Coastguard Worker }
92*86b64dcbSAndroid Build Coastguard Worker 
main(int argc,char * argv[])93*86b64dcbSAndroid Build Coastguard Worker int main(int argc, char *argv[])
94*86b64dcbSAndroid Build Coastguard Worker {
95*86b64dcbSAndroid Build Coastguard Worker 	libusb_hotplug_callback_handle hp[2];
96*86b64dcbSAndroid Build Coastguard Worker 	int product_id, vendor_id, class_id;
97*86b64dcbSAndroid Build Coastguard Worker 	int rc;
98*86b64dcbSAndroid Build Coastguard Worker 
99*86b64dcbSAndroid Build Coastguard Worker 	vendor_id  = (argc > 1) ? (int)strtol (argv[1], NULL, 0) : LIBUSB_HOTPLUG_MATCH_ANY;
100*86b64dcbSAndroid Build Coastguard Worker 	product_id = (argc > 2) ? (int)strtol (argv[2], NULL, 0) : LIBUSB_HOTPLUG_MATCH_ANY;
101*86b64dcbSAndroid Build Coastguard Worker 	class_id   = (argc > 3) ? (int)strtol (argv[3], NULL, 0) : LIBUSB_HOTPLUG_MATCH_ANY;
102*86b64dcbSAndroid Build Coastguard Worker 
103*86b64dcbSAndroid Build Coastguard Worker 	rc = libusb_init_context(/*ctx=*/NULL, /*options=*/NULL, /*num_options=*/0);
104*86b64dcbSAndroid Build Coastguard Worker 	if (LIBUSB_SUCCESS != rc)
105*86b64dcbSAndroid Build Coastguard Worker 	{
106*86b64dcbSAndroid Build Coastguard Worker 		printf ("failed to initialise libusb: %s\n",
107*86b64dcbSAndroid Build Coastguard Worker 			libusb_strerror((enum libusb_error)rc));
108*86b64dcbSAndroid Build Coastguard Worker 		return EXIT_FAILURE;
109*86b64dcbSAndroid Build Coastguard Worker 	}
110*86b64dcbSAndroid Build Coastguard Worker 
111*86b64dcbSAndroid Build Coastguard Worker 	if (!libusb_has_capability (LIBUSB_CAP_HAS_HOTPLUG)) {
112*86b64dcbSAndroid Build Coastguard Worker 		printf ("Hotplug capabilities are not supported on this platform\n");
113*86b64dcbSAndroid Build Coastguard Worker 		libusb_exit (NULL);
114*86b64dcbSAndroid Build Coastguard Worker 		return EXIT_FAILURE;
115*86b64dcbSAndroid Build Coastguard Worker 	}
116*86b64dcbSAndroid Build Coastguard Worker 
117*86b64dcbSAndroid Build Coastguard Worker 	rc = libusb_hotplug_register_callback (NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, 0, vendor_id,
118*86b64dcbSAndroid Build Coastguard Worker 		product_id, class_id, hotplug_callback, NULL, &hp[0]);
119*86b64dcbSAndroid Build Coastguard Worker 	if (LIBUSB_SUCCESS != rc) {
120*86b64dcbSAndroid Build Coastguard Worker 		fprintf (stderr, "Error registering callback 0\n");
121*86b64dcbSAndroid Build Coastguard Worker 		libusb_exit (NULL);
122*86b64dcbSAndroid Build Coastguard Worker 		return EXIT_FAILURE;
123*86b64dcbSAndroid Build Coastguard Worker 	}
124*86b64dcbSAndroid Build Coastguard Worker 
125*86b64dcbSAndroid Build Coastguard Worker 	rc = libusb_hotplug_register_callback (NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, vendor_id,
126*86b64dcbSAndroid Build Coastguard Worker 		product_id,class_id, hotplug_callback_detach, NULL, &hp[1]);
127*86b64dcbSAndroid Build Coastguard Worker 	if (LIBUSB_SUCCESS != rc) {
128*86b64dcbSAndroid Build Coastguard Worker 		fprintf (stderr, "Error registering callback 1\n");
129*86b64dcbSAndroid Build Coastguard Worker 		libusb_exit (NULL);
130*86b64dcbSAndroid Build Coastguard Worker 		return EXIT_FAILURE;
131*86b64dcbSAndroid Build Coastguard Worker 	}
132*86b64dcbSAndroid Build Coastguard Worker 
133*86b64dcbSAndroid Build Coastguard Worker 	while (done < 2) {
134*86b64dcbSAndroid Build Coastguard Worker 		rc = libusb_handle_events (NULL);
135*86b64dcbSAndroid Build Coastguard Worker 		if (LIBUSB_SUCCESS != rc)
136*86b64dcbSAndroid Build Coastguard Worker 			printf ("libusb_handle_events() failed: %s\n",
137*86b64dcbSAndroid Build Coastguard Worker 				libusb_strerror((enum libusb_error)rc));
138*86b64dcbSAndroid Build Coastguard Worker 	}
139*86b64dcbSAndroid Build Coastguard Worker 
140*86b64dcbSAndroid Build Coastguard Worker 	if (handle) {
141*86b64dcbSAndroid Build Coastguard Worker 		libusb_close (handle);
142*86b64dcbSAndroid Build Coastguard Worker 	}
143*86b64dcbSAndroid Build Coastguard Worker 
144*86b64dcbSAndroid Build Coastguard Worker 	libusb_exit (NULL);
145*86b64dcbSAndroid Build Coastguard Worker 
146*86b64dcbSAndroid Build Coastguard Worker 	return EXIT_SUCCESS;
147*86b64dcbSAndroid Build Coastguard Worker }
148