GangFlasher-ST DLL custom USB configuration
The GangFlasher-ST software provides various functions for handling multiple targets using automatically assigned or fixed USB ports.
This function executes an automatic scan of all USB ports for detection on a first-detected assignation of all MPU USB-DFU devices found. As the devices are detected, they are assigned to targets 1 through 8. The function will detect all available devices (up to 8) but the mapping of a specific MPU found to device index might not be the same if running the function multiple times:
F_USBAutoScanAndAssign(); //Detect all connected devices .. F_SaveUSBConfig("my_automatic_usb.cfg"); //Save current mapping to file for reuse.
This function provides a more deterministic way to map the MPU devices to target indices and their corresponding USB cables. Each call of this function will add one MPU’s USB port/hub address to the next available target index. Therefore, by connecting one new MPU to the computer at a time, then calling this function in a loop with a prompt, each cable can be labelled 1 through 8 with the corresponding added target (code example below). After the mapping process, the result USB addressing file can be saved using the
F_USBAutoScanAssignSingle(); //Detect devices one at a time. (call multiple times with prompt)
...
F_SaveUSBConfig("my_defined_usb.cfg"); //Save current mapping to file for reuse.
In the context of the above functions, any existing mapping is reset when the target configuration is loaded using the F_LoadTargetConfig()
function. Therefore F_USBAutoScanAndAssign()
must be called before F_USBAutoScanAssign()
or F_USBAutoScanAssignSingle()
.
Example below “simple_debug.cpp“ that can be ran from the demo/bin directory. It requires the GangFlasher.lib to be included:
#include <stdio.h>
#include <string>
#include <iostream>
#include "../include/GangFlasher-Dll.h"
using namespace std;
int main(int argc, char* argv[])
{
int st;
if (argc < 2)
{
cout << "Usage: <config>" << endl;
return 1;
}
cout << "F_Init : " << dec << F_Init() << endl;
cout << "F_LoadTargetConfig : " << dec << F_LoadTargetConfig(argv[1]) << endl;
//Uncomment to assign all units at once
//cout << "F_USBAutoScanAndAssign : " << dec << F_USBAutoScanAndAssign() << endl;
//This sequence will assign units one at a time
for (int i = 0; i < 8; i++)
{
cout << "F_USBAutoScanAssignSingle : " << dec << F_USBAutoScanAssignSingle() << endl;
//Add enter prompt or other wait state to have time to connect one device at a time
}
F_SaveUSBConfig("C:\\Users\\Public\\lastused_gfst_USB_setup.cfg");
cout << "F_LoadUSBConfig( \"C:\\Users\\Public\\lastused_gfst_USB_setup.cfg\" ) : " << dec << F_LoadUSBConfig("C:\\Public\\Downloads\\lastused_gfst_USB_setup.cfg") << endl;
cout << "F_Connect : " << dec << F_Connect() << endl;
cout << "F_Load_OS : " << dec << F_Load_OS() << endl;
cout << F_Get_Target_Report(0) << endl;
cout << F_Get_Target_Report(1) << endl;
cout << "F_DeInit : " << dec << F_DeInit() << endl;
return 0;
}
Each call of F_USBAutoScanAssignSingle()
adds a single device to GF_DLL configuration. Saving of USB configuration enables way for fixed USB ports usage for future GF_DLL programming.