// 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(); }
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)); } }