1
0
Fork 0
mirror of https://github.com/betaflight/betaflight-configurator.git synced 2025-07-26 01:35:28 +03:00

Merge pull request #250 from tracernz/development

Enable flashing using USB-DFU protocol
This commit is contained in:
Dominic Clifton 2015-10-31 11:22:18 +00:00
commit afe62cc01b
12 changed files with 218 additions and 128 deletions

View file

@ -128,6 +128,22 @@
"message": "<span style=\"color: red\">Failed</span> to close serial port" "message": "<span style=\"color: red\">Failed</span> to close serial port"
}, },
"usbDeviceOpened": {
"message": "USB device <span style=\"color: green\">successfully</span> opened with ID: $1"
},
"usbDeviceOpenFail": {
"message": "<span style=\"color: red\">Failed</span> to open USB device!"
},
"usbDeviceClosed": {
"message": "USB device <span style=\"color: green\">successfully</span> closed"
},
"usbDeviceCloseFail": {
"message": "<span style=\"color: red\">Failed</span> to close USB device"
},
"usbDeviceUdevNotice": {
"message": "Are <strong>udev rules</strong> installed correctly? See docs for instructions"
},
"noConfigurationReceived": { "noConfigurationReceived": {
"message": "No configuration received within <span style=\"color: red\">10 seconds</span>, communication <span style=\"color: red\">failed</span>" "message": "No configuration received within <span style=\"color: red\">10 seconds</span>, communication <span style=\"color: red\">failed</span>"
}, },
@ -190,26 +206,17 @@
"message": "Cycle Time:" "message": "Cycle Time:"
}, },
"please_grant_usb_permissions": { "dfu_connect_message": {
"message": "Please click on <strong>\"Request Optional Permissions\"</strong> button to grant application <strong style=\"color: red\">required</strong> <strong>USB</strong> access" "message": "Please use the Firmware Flasher to access DFU devices"
}, },
"usb_permissions_granted": { "dfu_erased_kilobytes": {
"message": "Optional <strong>USB</strong> permissions <strong style=\"color: green\">granted</strong>" "message": "Erased $1 kB of flash <span style=\"color: green\">successfully</span>"
}, },
"eeprom_saved_ok": { "eeprom_saved_ok": {
"message": "EEPROM <span style=\"color: green\">saved</span>" "message": "EEPROM <span style=\"color: green\">saved</span>"
}, },
"default_optional_permissions_head": {
"message": "Optional USB Permissions"
},
"default_optional_permissions_text": {
"message": "Due to addition of <strong>Naze32PRO</strong> to the supported hardware family, Configurator <strong style=\"color: red\">requires</strong> USB access to allow firmware flashing via DFU"
},
"default_request_optional_permissions": {
"message": "Request Optional Permissions"
},
"defaultWelcomeText": { "defaultWelcomeText": {
"message": "Welcome to <strong>Cleanflight - Configurator</strong>, a utility designed to simplify updating, configuring and tuning of your flight controller.<br /><br />The application supports all hardware that can run cleanflight (<a href=\"http://seriouslypro.com/spracingf3\" target=\"_blank\">SPRacingF3</a>, <a href=\"http://www.immersionrc.com/fpv-products/vortex-racing-quad/\" target=\"_blank\">Vortex</a>, <a href=\"https://github.com/TauLabs/TauLabs/wiki/Sparky\" target=\"_blank\">Sparky</a>, <a href=\"http://www.readymaderc.com/store/index.php?main_page=product_info&cPath=76_156&products_id=4221\" target=\"_blank\">DoDo</a>, <a href=\"https://www.openpilot.org/product/coptercontrol/\" target=\"_blank\">CC3D/EVO</a>, <a href=\"http://www.multiwiicopter.com/products/paris-air-hero-32-naze\" target=\"_blank\">Air Hero 32</a>, <a href=\"http://www.readytoflyquads.com/flight-controllers/flip-series\" target=\"_blank\">Flip32/+/Deluxe</a>, <a href=\"http://multirotormania.com/129-dragonfly32\" target=\"_blank\">DragonFly32</a>, <a href=\"http://www.goodluckbuy.com/micro-quadcopter-flight-driver-controller-9dof-9-axis-altitude-sensor-stm32f103.html\" target=\"_blank\">CJMCU Microquad</a>, Chebuzz F3, <a href=\"http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF254044\" target=\"_blank\">STM32F3Discovery</a>, <a href=\"http://www.overskyrc.com/hermit-micro-fpv-brushless-quadcopter-145mm-98g-fully-assembled-p-621.html\" target=\"_blank\">Hermit</a>, <a href=\"http://rcexplorer.se/blog/2015/05/introducing-the-naze32-tricopter-frame/\" target=\"_blank\">Naze32 Tricopter Frame</a>, <a href=\"http://www.2dogrc.com/skyline-32-naze-32-bit-flight-controller-acro-version.html\" target=\"_blank\">Skyline32</a>, <a href=\"http://abusemark.com/store/index.php?main_page=index&cPath=1\" target=\"_blank\">Naze/32/Mini/Pro</a>/<a href=\"http://www.massiverc.com/PrestaShop/en/574-massive-acro-blackbox-flight-control-board.html\" target=\"_blank\">Blackbox</a> etc)<br /><br />The firmware source code can be downloaded from <a href=\"https://github.com/cleanflight/cleanflight\" title=\"www.github.com\" target=\"_blank\">here</a><br />The newest binary firmware image is available <a href=\"https://github.com/cleanflight/cleanflight/releases\" title=\"www.github.com\" target=\"_blank\">here</a>, development builds available <a href=\"http://cleanflight.memoryleaks.org/builds/\" target=\"_blank\">here</a><br /><br />Latest <strong>CP210x Drivers</strong> can be downloaded from <a href=\"http://www.silabs.com/products/mcu/pages/usbtouartbridgevcpdrivers.aspx\" title=\"http://www.silabs.com/\" target=\"_blank\">here</a><br />" "message": "Welcome to <strong>Cleanflight - Configurator</strong>, a utility designed to simplify updating, configuring and tuning of your flight controller.<br /><br />The application supports all hardware that can run cleanflight (<a href=\"http://seriouslypro.com/spracingf3\" target=\"_blank\">SPRacingF3</a>, <a href=\"http://www.immersionrc.com/fpv-products/vortex-racing-quad/\" target=\"_blank\">Vortex</a>, <a href=\"https://github.com/TauLabs/TauLabs/wiki/Sparky\" target=\"_blank\">Sparky</a>, <a href=\"http://www.readymaderc.com/store/index.php?main_page=product_info&cPath=76_156&products_id=4221\" target=\"_blank\">DoDo</a>, <a href=\"https://www.openpilot.org/product/coptercontrol/\" target=\"_blank\">CC3D/EVO</a>, <a href=\"http://www.multiwiicopter.com/products/paris-air-hero-32-naze\" target=\"_blank\">Air Hero 32</a>, <a href=\"http://www.readytoflyquads.com/flight-controllers/flip-series\" target=\"_blank\">Flip32/+/Deluxe</a>, <a href=\"http://multirotormania.com/129-dragonfly32\" target=\"_blank\">DragonFly32</a>, <a href=\"http://www.goodluckbuy.com/micro-quadcopter-flight-driver-controller-9dof-9-axis-altitude-sensor-stm32f103.html\" target=\"_blank\">CJMCU Microquad</a>, Chebuzz F3, <a href=\"http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/PF254044\" target=\"_blank\">STM32F3Discovery</a>, <a href=\"http://www.overskyrc.com/hermit-micro-fpv-brushless-quadcopter-145mm-98g-fully-assembled-p-621.html\" target=\"_blank\">Hermit</a>, <a href=\"http://rcexplorer.se/blog/2015/05/introducing-the-naze32-tricopter-frame/\" target=\"_blank\">Naze32 Tricopter Frame</a>, <a href=\"http://www.2dogrc.com/skyline-32-naze-32-bit-flight-controller-acro-version.html\" target=\"_blank\">Skyline32</a>, <a href=\"http://abusemark.com/store/index.php?main_page=index&cPath=1\" target=\"_blank\">Naze/32/Mini/Pro</a>/<a href=\"http://www.massiverc.com/PrestaShop/en/574-massive-acro-blackbox-flight-control-board.html\" target=\"_blank\">Blackbox</a> etc)<br /><br />The firmware source code can be downloaded from <a href=\"https://github.com/cleanflight/cleanflight\" title=\"www.github.com\" target=\"_blank\">here</a><br />The newest binary firmware image is available <a href=\"https://github.com/cleanflight/cleanflight/releases\" title=\"www.github.com\" target=\"_blank\">here</a>, development builds available <a href=\"http://cleanflight.memoryleaks.org/builds/\" target=\"_blank\">here</a><br /><br />Latest <strong>CP210x Drivers</strong> can be downloaded from <a href=\"http://www.silabs.com/products/mcu/pages/usbtouartbridgevcpdrivers.aspx\" title=\"http://www.silabs.com/\" target=\"_blank\">here</a><br />"
}, },
@ -1192,4 +1199,4 @@
"controlAxisAux8": { "controlAxisAux8": {
"message": "AUX 8" "message": "AUX 8"
} }
} }

View file

@ -10,7 +10,6 @@ var GUI_control = function () {
this.active_tab; this.active_tab;
this.tab_switch_in_progress = false; this.tab_switch_in_progress = false;
this.operating_system; this.operating_system;
this.optional_usb_permissions = false; // controlled by usb permissions code
this.interval_array = []; this.interval_array = [];
this.timeout_array = []; this.timeout_array = [];
this.defaultAllowedTabsWhenDisconnected = [ this.defaultAllowedTabsWhenDisconnected = [

View file

@ -1,9 +1,14 @@
'use strict'; 'use strict';
var usbDevices = {
STM32DFU: {'vendorId': 1155, 'productId': 57105}
};
var PortHandler = new function () { var PortHandler = new function () {
this.initial_ports = false; this.initial_ports = false;
this.port_detected_callbacks = []; this.port_detected_callbacks = [];
this.port_removed_callbacks = []; this.port_removed_callbacks = [];
this.dfu_available = false;
}; };
PortHandler.initialize = function () { PortHandler.initialize = function () {
@ -131,30 +136,32 @@ PortHandler.check = function () {
self.initial_ports = current_ports; self.initial_ports = current_ports;
} }
if (GUI.optional_usb_permissions) { self.check_usb_devices();
check_usb_devices();
}
GUI.updateManualPortVisibility(); GUI.updateManualPortVisibility();
setTimeout(function () { setTimeout(function () {
self.check(); self.check();
}, 250); }, 250);
}); });
};
function check_usb_devices() { PortHandler.check_usb_devices = function (callback) {
chrome.usb.getDevices(usbDevices.STM32DFU, function (result) { chrome.usb.getDevices(usbDevices.STM32DFU, function (result) {
if (result.length) { if (result.length) {
if (!$("div#port-picker #port [value='DFU']").length) { if (!$("div#port-picker #port [value='DFU']").length) {
$('div#port-picker #port').append('<option value="DFU">DFU</option>'); $('div#port-picker #port').append($('<option/>', {value: "DFU", text: "DFU", data: {isDFU: true}}));
$('div#port-picker #port').val('DFU'); $('div#port-picker #port').val('DFU');
}
} else {
if ($("div#port-picker #port [value='DFU']").length) {
$("div#port-picker #port [value='DFU']").remove();
}
} }
}); self.dfu_available = true;
} } else {
if ($("div#port-picker #port [value='DFU']").length) {
$("div#port-picker #port [value='DFU']").remove();
}
self.dfu_available = false;
}
if(callback) callback(self.dfu_available);
});
}; };
PortHandler.update_port_select = function (ports) { PortHandler.update_port_select = function (ports) {

View file

@ -100,14 +100,25 @@ STM32_protocol.prototype.connect = function (port, baud, hex, options, callback)
serial.send(bufferOut, function () { serial.send(bufferOut, function () {
serial.disconnect(function (result) { serial.disconnect(function (result) {
if (result) { if (result) {
serial.connect(port, {bitrate: self.baud, parityBit: 'even', stopBits: 'one'}, function (openInfo) { // delay to allow board to boot in bootloader mode
if (openInfo) { // required to detect if a DFU device appears
self.initialize(); setTimeout(function() {
} else { // refresh device list
GUI.connect_lock = false; PortHandler.check_usb_devices(function(dfu_available) {
GUI.log('<span style="color: red">Failed</span> to open serial port'); if(dfu_available) {
} STM32DFU.connect(usbDevices.STM32DFU, hex, options);
}); } else {
serial.connect(port, {bitrate: self.baud, parityBit: 'even', stopBits: 'one'}, function (openInfo) {
if (openInfo) {
self.initialize();
} else {
GUI.connect_lock = false;
GUI.log('<span style="color: red">Failed</span> to open serial port');
}
});
}
});
}, 1000);
} else { } else {
GUI.connect_lock = false; GUI.connect_lock = false;
} }

View file

@ -61,13 +61,26 @@ var STM32DFU_protocol = function () {
dfuUPLOAD_IDLE: 9, // The device is processing an upload operation. Expecting DFU_UPLOAD requests. dfuUPLOAD_IDLE: 9, // The device is processing an upload operation. Expecting DFU_UPLOAD requests.
dfuERROR: 10 // An error has occurred. Awaiting the DFU_CLRSTATUS request. dfuERROR: 10 // An error has occurred. Awaiting the DFU_CLRSTATUS request.
}; };
// Assume 2 kB page size (STM32F303)
// Cannot read chip ID using DFU protocol and Chrome doesn't provide the interface
// description string with flash page size information (at least on Linux anyway)
this.page_size = 2048;
}; };
STM32DFU_protocol.prototype.connect = function (device, hex, callback) { STM32DFU_protocol.prototype.connect = function (device, hex, options, callback) {
var self = this; var self = this;
self.hex = hex; self.hex = hex;
self.callback = callback; self.callback = callback;
self.options = {
erase_chip: false
};
if (options.erase_chip) {
self.options.erase_chip = true;
}
// reset and set some variables before we start // reset and set some variables before we start
self.upload_time_start = new Date().getTime(); self.upload_time_start = new Date().getTime();
self.verify_hex = []; self.verify_hex = [];
@ -89,12 +102,35 @@ STM32DFU_protocol.prototype.connect = function (device, hex, callback) {
}); });
}; };
STM32DFU_protocol.prototype.checkChromeError = function() {
if (chrome.runtime.lastError) {
if(chrome.runtime.lastError.message)
console.log(chrome.runtime.lastError.message);
else
console.log(chrome.runtime.lastError);
return true;
}
return false;
}
STM32DFU_protocol.prototype.openDevice = function (device) { STM32DFU_protocol.prototype.openDevice = function (device) {
var self = this; var self = this;
chrome.usb.openDevice(device, function (handle) { chrome.usb.openDevice(device, function (handle) {
if(self.checkChromeError()) {
console.log('Failed to open USB device!');
GUI.log(chrome.i18n.getMessage('usbDeviceOpenFail'));
if(GUI.operating_system === 'Linux') {
GUI.log(chrome.i18n.getMessage('usbDeviceUdevNotice'));
}
return;
}
self.handle = handle; self.handle = handle;
GUI.log(chrome.i18n.getMessage('usbDeviceOpened', handle.handle.toString()));
console.log('Device opened with Handle ID: ' + handle.handle); console.log('Device opened with Handle ID: ' + handle.handle);
self.claimInterface(0); self.claimInterface(0);
}); });
@ -104,6 +140,12 @@ STM32DFU_protocol.prototype.closeDevice = function () {
var self = this; var self = this;
chrome.usb.closeDevice(this.handle, function closed() { chrome.usb.closeDevice(this.handle, function closed() {
if(self.checkChromeError()) {
console.log('Failed to close USB device!');
GUI.log(chrome.i18n.getMessage('usbDeviceCloseFail'));
}
GUI.log(chrome.i18n.getMessage('usbDeviceClosed'));
console.log('Device closed with Handle ID: ' + self.handle.handle); console.log('Device closed with Handle ID: ' + self.handle.handle);
self.handle = null; self.handle = null;
@ -139,6 +181,8 @@ STM32DFU_protocol.prototype.resetDevice = function (callback) {
}; };
STM32DFU_protocol.prototype.controlTransfer = function (direction, request, value, _interface, length, data, callback) { STM32DFU_protocol.prototype.controlTransfer = function (direction, request, value, _interface, length, data, callback) {
var self = this;
if (direction == 'in') { if (direction == 'in') {
// data is ignored // data is ignored
chrome.usb.controlTransfer(this.handle, { chrome.usb.controlTransfer(this.handle, {
@ -150,6 +194,9 @@ STM32DFU_protocol.prototype.controlTransfer = function (direction, request, valu
'index': _interface, 'index': _interface,
'length': length 'length': length
}, function (result) { }, function (result) {
if(self.checkChromeError()) {
console.log('USB transfer failed!');
}
if (result.resultCode) console.log(result.resultCode); if (result.resultCode) console.log(result.resultCode);
var buf = new Uint8Array(result.data); var buf = new Uint8Array(result.data);
@ -174,6 +221,9 @@ STM32DFU_protocol.prototype.controlTransfer = function (direction, request, valu
'index': _interface, 'index': _interface,
'data': arrayBuf 'data': arrayBuf
}, function (result) { }, function (result) {
if(self.checkChromeError()) {
console.log('USB transfer failed!');
}
if (result.resultCode) console.log(result.resultCode); if (result.resultCode) console.log(result.resultCode);
callback(result); callback(result);
@ -217,7 +267,7 @@ STM32DFU_protocol.prototype.loadAddress = function (address, callback) {
if (data[4] == self.state.dfuDNLOAD_IDLE) { if (data[4] == self.state.dfuDNLOAD_IDLE) {
callback(data); callback(data);
} else { } else {
console.log('Failed to execure address load'); console.log('Failed to execute address load');
self.upload_procedure(99); self.upload_procedure(99);
} }
}); });
@ -256,32 +306,86 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
}); });
break; break;
case 2: case 2:
// full chip erase // erase
console.log('Executing global chip erase'); if (self.options.erase_chip) {
$('span.progressLabel').text('Erasing ...'); // full chip erase
console.log('Executing global chip erase');
$('span.progressLabel').text('Erasing ...');
self.controlTransfer('out', self.request.DNLOAD, 0, 0, 0, [0x41], function () { self.controlTransfer('out', self.request.DNLOAD, 0, 0, 0, [0x41], function () {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) { self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
if (data[4] == self.state.dfuDNBUSY) { // completely normal if (data[4] == self.state.dfuDNBUSY) { // completely normal
var delay = data[1] | (data[2] << 8) | (data[3] << 16); var delay = data[1] | (data[2] << 8) | (data[3] << 16);
setTimeout(function () { setTimeout(function () {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) { self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
if (data[4] == self.state.dfuDNLOAD_IDLE) { if (data[4] == self.state.dfuDNLOAD_IDLE) {
self.upload_procedure(4); self.upload_procedure(4);
} else { } else {
console.log('Failed to execute global chip erase'); console.log('Failed to execute global chip erase');
self.upload_procedure(99); self.upload_procedure(99);
} }
}); });
}, delay); }, delay);
} else { } else {
console.log('Failed to initiate global chip erase'); console.log('Failed to initiate global chip erase');
self.upload_procedure(99); self.upload_procedure(99);
} }
});
}); });
}); } else {
// local erase
var max_address = self.hex.data[self.hex.data.length - 1].address + self.hex.data[self.hex.data.length - 1].bytes - 0x8000000,
erase_pages_n = Math.ceil(max_address / self.page_size),
page = 0;
$('span.progressLabel').text('Erasing ...');
console.log('Executing local chip erase');
console.log('Erasing. page: 0x00 - 0x' + erase_pages_n.toString(16));
var erase_page = function() {
var page_addr = page * self.page_size + 0x8000000;
var cmd = [0x41, page_addr & 0xff, (page_addr >> 8) & 0xff, (page_addr >> 16) & 0xff, (page_addr >> 24) & 0xff];
self.controlTransfer('out', self.request.DNLOAD, 0, 0, 0, cmd, function () {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
if (data[4] == self.state.dfuDNBUSY) { // completely normal
var delay = data[1] | (data[2] << 8) | (data[3] << 16);
setTimeout(function () {
self.controlTransfer('in', self.request.GETSTATUS, 0, 0, 6, 0, function (data) {
if (data[4] == self.state.dfuDNLOAD_IDLE) {
// update progress bar
self.progress_bar_e.val((page + 1) / erase_pages_n * 100);
page++;
if(page == erase_pages_n) {
console.log("Erase: complete");
GUI.log(chrome.i18n.getMessage('dfu_erased_kilobytes', (erase_pages_n * self.page_size / 1024).toString()));
self.upload_procedure(4);
}
else
erase_page();
} else {
console.log('Failed to erase page 0x' + self.current_page.toString(16));
self.upload_procedure(99);
}
});
}, delay);
} else {
console.log('Failed to initiate page erase, page 0x' + self.current_page.toString(16));
self.upload_procedure(99);
}
});
});
};
// start
erase_page();
}
break; break;
case 4: case 4:
// upload // upload
// we dont need to clear the state as we are already using DFU_DNLOAD // we dont need to clear the state as we are already using DFU_DNLOAD
@ -296,9 +400,6 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
var bytes_flashed_total = 0; // used for progress bar var bytes_flashed_total = 0; // used for progress bar
var wBlockNum = 2; // required by DFU var wBlockNum = 2; // required by DFU
// start
self.loadAddress(address, write);
var write = function () { var write = function () {
if (bytes_flashed < self.hex.data[flashing_block].bytes) { if (bytes_flashed < self.hex.data[flashing_block].bytes) {
var bytes_to_write = ((bytes_flashed + 2048) <= self.hex.data[flashing_block].bytes) ? 2048 : (self.hex.data[flashing_block].bytes - bytes_flashed); var bytes_to_write = ((bytes_flashed + 2048) <= self.hex.data[flashing_block].bytes) ? 2048 : (self.hex.data[flashing_block].bytes - bytes_flashed);
@ -353,6 +454,10 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
} }
} }
} }
// start
self.loadAddress(address, write);
break; break;
case 5: case 5:
// verify // verify
@ -463,13 +568,13 @@ STM32DFU_protocol.prototype.upload_procedure = function (step) {
}); });
} }
// start
clear_before_leave();
break; break;
case 99: case 99:
// cleanup // cleanup
self.releaseInterface(0); self.releaseInterface(0);
GUI.connect_lock = false;
var timeSpent = new Date().getTime() - self.upload_time_start; var timeSpent = new Date().getTime() - self.upload_time_start;
console.log('Script finished after: ' + (timeSpent / 1000) + ' seconds'); console.log('Script finished after: ' + (timeSpent / 1000) + ' seconds');

View file

@ -3,12 +3,19 @@
$(document).ready(function () { $(document).ready(function () {
GUI.updateManualPortVisibility = function(){ GUI.updateManualPortVisibility = function(){
if ($('div#port-picker #port option:selected').data().isManual) { var selected_port = $('div#port-picker #port option:selected');
if (selected_port.data().isManual) {
$('#port-override-option').show(); $('#port-override-option').show();
} }
else { else {
$('#port-override-option').hide(); $('#port-override-option').hide();
} }
if (selected_port.data().isDFU) {
$('select#baud').hide();
}
else {
$('select#baud').show();
}
}; };
GUI.updateManualPortVisibility(); GUI.updateManualPortVisibility();
@ -33,8 +40,10 @@ $(document).ready(function () {
var selected_port = $('div#port-picker #port option:selected').data().isManual ? var selected_port = $('div#port-picker #port option:selected').data().isManual ?
$('#port-override').val() : $('#port-override').val() :
String($('div#port-picker #port').val()); String($('div#port-picker #port').val());
if (selected_port === 'DFU') {
if (selected_port != '0' && selected_port != 'DFU') { GUI.log(chrome.i18n.getMessage('dfu_connect_message'));
}
else if (selected_port != '0') {
if (!clicks) { if (!clicks) {
console.log('Connecting to: ' + selected_port); console.log('Connecting to: ' + selected_port);
GUI.connecting_to = selected_port; GUI.connecting_to = selected_port;

View file

@ -1,36 +0,0 @@
'use strict';
var usbDevices = {
STM32DFU: {'vendorId': 1155, 'productId': 57105}
};
var usbPermissions = {permissions: [{'usbDevices': [usbDevices.STM32DFU]}]};
function check_usb_permissions(callback) {
chrome.permissions.contains(usbPermissions, function (result) {
if (result) {
GUI.optional_usb_permissions = true;
} else {
console.log('Optional USB permissions: missing');
GUI.log(chrome.i18n.getMessage('please_grant_usb_permissions'));
// display optional usb permissions request box
$('div.optional_permissions').show();
// UI hooks
document.getElementById("requestOptionalPermissions").addEventListener('click', function () {
chrome.permissions.request(usbPermissions, function (result) {
if (result) {
GUI.log(chrome.i18n.getMessage('usb_permissions_granted'));
$('div.optional_permissions').hide();
GUI.optional_usb_permissions = true;
}
});
});
}
if (callback) {
callback();
}
});
}

View file

@ -44,7 +44,6 @@
<script type="text/javascript" src="./js/port_handler.js"></script> <script type="text/javascript" src="./js/port_handler.js"></script>
<script type="text/javascript" src="./js/port_usage.js"></script> <script type="text/javascript" src="./js/port_usage.js"></script>
<script type="text/javascript" src="./js/serial.js"></script> <script type="text/javascript" src="./js/serial.js"></script>
<script type="text/javascript" src="./js/usb.js"></script>
<script type="text/javascript" src="./js/gui.js"></script> <script type="text/javascript" src="./js/gui.js"></script>
<script type="text/javascript" src="./js/model.js"></script> <script type="text/javascript" src="./js/model.js"></script>
<script type="text/javascript" src="./js/request_balancer.js"></script> <script type="text/javascript" src="./js/request_balancer.js"></script>

View file

@ -32,10 +32,7 @@
"fileSystem.write", "fileSystem.write",
"fileSystem.retainEntries", "fileSystem.retainEntries",
"notifications", "notifications",
"alwaysOnTopWindows" "alwaysOnTopWindows",
],
"optional_permissions": [
{"usbDevices": [ {"usbDevices": [
{"vendorId": 1155, "productId": 57105} {"vendorId": 1155, "productId": 57105}
]} ]}

View file

@ -307,10 +307,15 @@ TABS.firmware_flasher.initialize = function (callback) {
if (!$(this).hasClass('locked')) { if (!$(this).hasClass('locked')) {
if (!GUI.connect_lock) { // button disabled while flashing is in progress if (!GUI.connect_lock) { // button disabled while flashing is in progress
if (parsed_hex != false) { if (parsed_hex != false) {
var options = {};
if ($('input.erase_chip').is(':checked')) {
options.erase_chip = true;
}
if (String($('div#port-picker #port').val()) != 'DFU') { if (String($('div#port-picker #port').val()) != 'DFU') {
if (String($('div#port-picker #port').val()) != '0') { if (String($('div#port-picker #port').val()) != '0') {
var options = {}, var port = String($('div#port-picker #port').val()),
port = String($('div#port-picker #port').val()),
baud; baud;
switch (GUI.operating_system) { switch (GUI.operating_system) {
@ -332,10 +337,6 @@ TABS.firmware_flasher.initialize = function (callback) {
options.reboot_baud = parseInt($('div#port-picker #baud').val()); options.reboot_baud = parseInt($('div#port-picker #baud').val());
} }
if ($('input.erase_chip').is(':checked')) {
options.erase_chip = true;
}
if ($('input.flash_manual_baud').is(':checked')) { if ($('input.flash_manual_baud').is(':checked')) {
baud = parseInt($('#flash_manual_baud_rate').val()); baud = parseInt($('#flash_manual_baud_rate').val());
} }
@ -347,7 +348,7 @@ TABS.firmware_flasher.initialize = function (callback) {
GUI.log('<span style="color: red">Please select valid serial port</span>'); GUI.log('<span style="color: red">Please select valid serial port</span>');
} }
} else { } else {
STM32DFU.connect(usbDevices.STM32DFU, parsed_hex); STM32DFU.connect(usbDevices.STM32DFU, parsed_hex, options);
} }
} else { } else {
$('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFirmwareNotLoaded')); $('span.progressLabel').text(chrome.i18n.getMessage('firmwareFlasherFirmwareNotLoaded'));

View file

@ -1,11 +1,4 @@
<div class="tab-landing"> <div class="tab-landing">
<div class="section optional_permissions">
<div class="title" i18n="default_optional_permissions_head"></div>
<p i18n="default_optional_permissions_text"></p>
<a id="requestOptionalPermissions" href="#" i18n="default_request_optional_permissions"></a>
<div class="clear-both"></div>
</div>
<div class="row welcome_and_sponsors"> <div class="row welcome_and_sponsors">
<div class="left"> <div class="left">
<div class="section welcome"> <div class="section welcome">

View file

@ -10,8 +10,6 @@ TABS.landing.initialize = function (callback) {
} }
$('#content').load("./tabs/landing.html", function () { $('#content').load("./tabs/landing.html", function () {
//check_usb_permissions(); // temporary enabled in dev branch, should be commented out untill DFU support goes live
// translate to user-selected language // translate to user-selected language
localize(); localize();