Ejemplo n.º 1
0
// De-init all the peripherical,
// and launch the Nordic USB bootloader located @ 0x7800
void launchBootloader()
{
  void (*bootloader)() = (void (*)())0x7800;

  //Deactivate the interruptions
  IEN0 = 0x00;

  //Deinitialise the USB
  usbDeinit();

  //Deinitialise the radio
  radioDeinit();

  //Call the bootloader
  bootloader();
}
Ejemplo n.º 2
0
void usbInit()
{
	int res, actualLen;
	libusb_device *usbRawDevice;
	libusb_device_descriptor usbDevDesc;
	libusb_config_descriptor *usbConfigDesc;
	const libusb_interface_descriptor *usbIface;
	const libusb_endpoint_descriptor *usbEndpointDesc;
	const usbIfaceAssoc *usbInterfaceAssoc;
	const usbCDCConfig *usbCDCDesc;

	if (libusb_init(&usbContext) != 0)
		die("Error: Could not initialise libusb-1.0\n");

	usbDevice = libusb_open_device_with_vid_pid(usbContext, 0x1CBE, 0x00FD);
	if (usbDevice == NULL)
	{
		libusb_exit(usbContext);
		die("Error: Could not find a Tiva C Launchpad to connect to\n");
	}
	usbRawDevice = libusb_get_device(usbDevice);

	if (libusb_get_device_descriptor(usbRawDevice, &usbDevDesc) != 0 || usbDevDesc.bNumConfigurations != 1)
	{
		usbInitCleanup();
		die("Error: libusb could not get the device descriptor for the Tiva C Launchpad\n");
	}

	if (libusb_get_config_descriptor(usbRawDevice, 0, &usbConfigDesc) != 0)
	{
		usbInitCleanup();
		die("Error: libusb could not get the configuration descriptor for the Tiva C Launchpad\n");
	}
	else if (usbConfigDesc->bLength != 9 || usbConfigDesc->bDescriptorType != 2 ||
		usbConfigDesc->bNumInterfaces != 4 || usbConfigDesc->extra_length != sizeof(usbIfaceAssoc))
	{
		libusb_free_config_descriptor(usbConfigDesc);
		usbInitCleanup();
		die("Error: The descriptor returned by the device claiming to be a Tiva C Launchpad is invalid\n");
	}

	usbInterfaceAssoc = (const usbIfaceAssoc *)usbConfigDesc->extra;
	if (usbInterfaceAssoc->bLength != 8 || usbInterfaceAssoc->bDescriptorType != 11 ||
		usbInterfaceAssoc->bInterfaceCount != 2 || usbInterfaceAssoc->bFirstInterface >= usbConfigDesc->bNumInterfaces)
	{
		libusb_free_config_descriptor(usbConfigDesc);
		usbInitCleanup();
		die("Error: The interface association returned by the device claiming to be the Tiva C Launchpad is invalid\n");
	}

	usbIface = usbConfigDesc->interface[usbInterfaceAssoc->bFirstInterface].altsetting;
	if (usbIface->bNumEndpoints != 1 || usbIface->extra_length != sizeof(usbCDCConfig))
	{
		libusb_free_config_descriptor(usbConfigDesc);
		usbInitCleanup();
		die("Error: The interface descriptor that is supposed to be for the control interface is invalid\n");
	}
	usbCDCDesc = (const usbCDCConfig *)usbIface->extra;
	if (usbCDCDesc->bHeaderLen != 5 || usbCDCDesc->bcdCDC != 0x0110 ||
		usbCDCDesc->bACMLen != 4 || usbCDCDesc->bUnionLen != 5 ||
		usbCDCDesc->bCallLen != 5)
	{
		libusb_free_config_descriptor(usbConfigDesc);
		usbInitCleanup();
		die("Error: The CDC descriptor that is provided by the control interface is invalid\n");
	}
	usbEndpointDesc = &usbIface->endpoint[0];
	ctrlEndpoint = usbEndpointDesc->bEndpointAddress;

	usbIface = usbConfigDesc->interface[usbCDCDesc->iDataInterface].altsetting;
	if (usbIface->bNumEndpoints != 2 || usbIface->extra_length != 0)
	{
		libusb_free_config_descriptor(usbConfigDesc);
		usbInitCleanup();
		die("Error: The interface descriptor that is supposed to be for the data interface is invalid\n");
	}
	usbEndpointDesc = &usbIface->endpoint[0];
	inEndpoint = usbEndpointDesc->bEndpointAddress;
	usbEndpointDesc = &usbIface->endpoint[1];
	outEndpoint = usbEndpointDesc->bEndpointAddress;

	ctrlInterface = usbInterfaceAssoc->bFirstInterface;
	dataInterface = usbCDCDesc->iDataInterface;
	libusb_set_configuration(usbDevice, usbConfigDesc->bConfigurationValue);
	libusb_free_config_descriptor(usbConfigDesc);

	libusb_set_auto_detach_kernel_driver(usbDevice, true);
	if (libusb_claim_interface(usbDevice, ctrlInterface) != 0 ||
		libusb_claim_interface(usbDevice, dataInterface) != 0)
	{
		usbDeinit();
		die("Error: Could not claim the Tiva C Launchpad virtual serial port interface\n");
	}

	/* Set the port baud rate */
	*((uint32_t *)ctrlData) = 115200;
	/* 1 stop bit, no parity, 8-bit */
	ctrlData[4] = 0;
	ctrlData[5] = 0;
	ctrlData[6] = 8;
	res = libusb_control_transfer(usbDevice, 0x21, CDC_SET_LINE_CODING, 0, ctrlInterface, ctrlData, 7, 10);
	if (res != 7)
	{
		usbDeinit();
		die("libusb returned %d: %s\n", res, libusb_strerror(res));
	}

	res = libusb_control_transfer(usbDevice, 0xA1, CDC_GET_LINE_CODING, 0, ctrlInterface, ctrlData, 7, 10);
	if (res != 7)
	{
		usbDeinit();
		die("libusb returned %d: %s\n", res, libusb_strerror(res));
	}

	res = libusb_control_transfer(usbDevice, 0x21, CDC_SET_CONTROL_LINE_STATE, 0, ctrlInterface, NULL, 0, 10);
	if (res != 0)
	{
		usbDeinit();
		die("libusb returned %d: %s\n", res, libusb_strerror(res));
	}
}