Exemple #1
0
int main(int argc, char *argv[])
{
	int err;

	libusb_init(NULL);
	libusb_set_debug(NULL, 3);

	/* Try to open directly accessory. If it's not there, try to switch phone to it */
	handle = libusb_open_device_with_vid_pid(NULL, ACCESSORY_VID, ACCESSORY_PID_DBG);
	//if(handle)
		//libusb_reset_device(handle);

	if(handle == NULL){
		printf("Device not in Accessory mode. Trying to switch it to it...\n");
		err = setupAccessory("STMicroelectronics", "adkping", "Just pings data", "2.0",
			"http://www.st.com", "1234567890123456");
		if(err < 0){
			fprintf(stdout, "Sorry, can't set up accessory, giving up\n");
			deInit();
			return -1;
		}
	}

	/* Do some stuff */
	if(mainPhase() < 0){
		fprintf(stdout, "Error during main phase\n");
		deInit();
		return -1;
	}
	
	deInit();
	fprintf(stdout, "Done, no errors\n");

	return 0;
}
int main (int argc, char *argv[]){
	if(isUsbAccessory() < 0){
		if(init() < 0){
			deInit();
			return 0;
		}

		//doTransfer();
		if(setupAccessory(
			"Nexus-Computing GmbH",
			"osciprime",
			"Description",
			"antilope",
			"http://neuxs-computing.ch",
			"2254711SerialNo.") < 0){
			fprintf(stdout, "Error setting up accessory\n");
			deInit();
			return -1;
		};
	}

	if(mainPhase() < 0){
		fprintf(stdout, "Error during main phase\n");
		deInit();
		return -1;
	}	
	deInit();
	fprintf(stdout, "Done, no errors\n");
	return 0;
}
int main (int argc, char *argv[]){
	if(init() < 0)
		return;
	//doTransfer();
	if(setupAccessory(
		"Manufacturer",
		"Model",
		"Description",
		"VersionName",
		"http://neuxs-computing.ch",
		"2254711SerialNo.") < 0){
		fprintf(stdout, "Error setting up accessory\n");
		deInit();
		return -1;
	};
	if(mainPhase() < 0){
		fprintf(stdout, "Error during main phase\n");
		deInit();
		return -1;
	}	
	deInit();
	fprintf(stdout, "Done, no errors\n");
	return 0;
}
/**
 * try to find a android accessory device, and try to open it.
 *
 * @return handle of the accessory device, or null if none are found.
 */
libusb_device_handle* findAndInitAccessory(
		libusb_context* ctx,
		const char* manufacturer,
		const char* modelName,
		const char* description,
		const char* version,
		const char* uri,
		const char* serialNumber)
{
	libusb_device** list;
#ifdef DEBUG
	printf("libAndroidAccessory: Enumerating devices\n");
#endif
	ssize_t cnt = libusb_get_device_list(ctx, &list);

	int i, j;
	struct libusb_device_descriptor desc;
	libusb_device_handle* handle = NULL;
	for (i = 0; i < cnt; i++) {
		libusb_device* tmpdevice = list[i];

		if (libusb_get_device_descriptor(tmpdevice, &desc) < 0) {
			continue;
		}

		debugDescriptor(&desc);

		for (j = 0; j < (sizeof vendors / sizeof *vendors); ++j)
		{
			if (desc.idVendor == vendors[j]) {
#ifdef DEBUG
				printf("libAndroidAccessory: Supported vendor Id found: %04hx\n", desc.idVendor);
#endif
				// Check to see if the device is already in accessory mode
				if(desc.idVendor == GOOGLE)
				{
					switch(desc.idProduct)
					{
						case ACCESSORY:
						case ACCESSORY_ADB:
						case ACCESSORY_AUDIO:
						case ACCESSORY_AUDIO_ADB:
#ifdef DEBUG
							printf("libAndroidAccessory: Connected device already in accessory mode, continuing!\n");
#endif
							; // Do not remove this empty statement. Removing it might make gcc refuse to compile our project.
							int errorCode = libusb_open(tmpdevice, &handle);
							if ( errorCode != 0 )
							{
								fprintf(stderr, "libAndroidAccessory: %s %d -> %s\n",__FILE__, __LINE__, libusb_error_name(errorCode));
							}
							determineEndpoints(tmpdevice);
							libusb_release_interface(handle, 0);
							libusb_release_interface(handle, 1);
							libusb_free_device_list(list, 1);
							return handle;
						default:
							break;
					}
				}

				// We should in no circumstance try to put a accessory in accessory mode. This should filter most of them out.
				if (desc.idVendor == GOOGLE && (desc.idProduct >= ACCESSORY && desc.idProduct <= ACCESSORY_AUDIO_ADB) )
				{
					printf("libAndroidAccessory: Ignoring a device which is already in accessory mode\n");
					break;
				}

				// We're not already in accessory mode, try to send configuration commands.
				handle = openUsb(ctx, desc.idVendor, desc.idProduct); //try to open the USB interface

				if (handle != NULL) {
					int version_supported = -1;

					version_supported = checkAndroid(handle);

					switch(version_supported) {
					case 2:
#ifdef DEBUG
						printf("libAndroidAccessory: Android Open Accessory version 2 support detected\n");
#endif
						// Fallthrough to next case
						/* no break */
					case 1:
#ifdef DEBUG
						printf("libAndroidAccessory: Android Open Accessory version 1 support detected\n");
						printf("libAndroidAccessory: Trying to setup accessory mode\n");
#endif
						handle = setupAccessory(
								manufacturer,
								modelName,
								description,
								version,
								uri,
								serialNumber,
								handle); //try to set-up Accessory
						libusb_free_device_list(list, 1);
						closeUsb(handle);
						return handle = NULL;
						break;
					default:
#ifdef DEBUG
						printf("libAndroidAccessory: Unsupported or no Android device support\n");
#endif
						closeUsb(handle);
						handle = NULL;
						break;

					}
				}
			}
		}
	}
	libusb_free_device_list(list, 1);

	// Upon reaching this location we didn't find any supported android device, so we return NULL
	return NULL;
}