aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/baremetal
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2020-04-23 19:05:15 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2020-04-25 20:52:17 +0000
commitd7867987ce72c503af5e8471c775af72759e9bd7 (patch)
tree52517ee86649abfba5031203cf00cadfa77d41f6 /src/plugins/baremetal
parentcfbc13bd02a53d40977c341403bc830b5edfc73c (diff)
BareMetal: Add support for Nordic Semiconductor devices in UVSC provider
This patch adds support for Nordic nRFx ARM devices family. Tested with J-Link debugger using the PCA10040 development board which contains nRF52832 chip. Change-Id: Iabcdd1c9678b631b58c56bf067f400324ec1915f Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/baremetal')
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp31
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/stlinkuvscserverprovider.cpp16
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp11
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h3
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp32
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp94
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.h6
-rw-r--r--src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceviewer.cpp2
8 files changed, 135 insertions, 60 deletions
diff --git a/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp b/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp
index 5a37ece6706..ee835d6f463 100644
--- a/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/jlinkuvscserverprovider.cpp
@@ -99,26 +99,31 @@ static QString buildAdapterOptions(const JLinkUvscAdapterOptions &opts)
return s;
}
-static QString buildDllRegistryKey(const DriverSelection &driver)
-{
- const QFileInfo fi(driver.dll);
- return fi.baseName();
-}
-
static QString buildDllRegistryName(const DeviceSelection &device,
const JLinkUvscAdapterOptions &opts)
{
if (device.algorithmIndex < 0 || device.algorithmIndex >= int(device.algorithms.size()))
return {};
+
const DeviceSelection::Algorithm algorithm = device.algorithms.at(device.algorithmIndex);
const QFileInfo path(algorithm.path);
- const QString start = algorithm.start.startsWith("0x") ? algorithm.start.mid(2)
- : algorithm.start;
- const QString size = algorithm.size.startsWith("0x") ? algorithm.size.mid(2)
- : algorithm.size;
+ const QString flashStart = UvscServerProvider::adjustFlashAlgorithmProperty(algorithm.flashStart);
+ const QString flashSize = UvscServerProvider::adjustFlashAlgorithmProperty(algorithm.flashSize);
const QString adaptOpts = buildAdapterOptions(opts);
- return QStringLiteral(" %6 -FN1 -FF0%1 -FS0%2 -FL0%3 -FP0($$Device:%4$%5)")
- .arg(path.fileName(), start, size, device.name, path.filePath(), adaptOpts);
+
+ QString content = QStringLiteral(" %6 -FN1 -FF0%1 -FS0%2 -FL0%3 -FP0($$Device:%4$%5)")
+ .arg(path.fileName(), flashStart, flashSize, device.name, path.filePath(), adaptOpts);
+
+ if (!algorithm.ramStart.isEmpty()) {
+ const QString ramStart = UvscServerProvider::adjustFlashAlgorithmProperty(algorithm.ramStart);
+ content += QStringLiteral(" -FD%1").arg(ramStart);
+ }
+ if (!algorithm.ramSize.isEmpty()) {
+ const QString ramSize = UvscServerProvider::adjustFlashAlgorithmProperty(algorithm.ramSize);
+ content += QStringLiteral(" -FC%1").arg(ramSize);
+ }
+
+ return content;
}
// JLinkUvProjectOptions
@@ -138,7 +143,7 @@ public:
const auto dllRegistry = m_targetOption->appendPropertyGroup("TargetDriverDllRegistry");
const auto setRegEntry = dllRegistry->appendPropertyGroup("SetRegEntry");
setRegEntry->appendProperty("Number", 0);
- const QString key = buildDllRegistryKey(driver);
+ const QString key = UvscServerProvider::buildDllRegistryKey(driver);
setRegEntry->appendProperty("Key", key);
const QString name = buildDllRegistryName(device, provider->m_adapterOpts);
setRegEntry->appendProperty("Name", name);
diff --git a/src/plugins/baremetal/debugservers/uvsc/stlinkuvscserverprovider.cpp b/src/plugins/baremetal/debugservers/uvsc/stlinkuvscserverprovider.cpp
index 074bce6164d..98adbb212af 100644
--- a/src/plugins/baremetal/debugservers/uvsc/stlinkuvscserverprovider.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/stlinkuvscserverprovider.cpp
@@ -68,12 +68,6 @@ static QString buildAdapterOptions(const StLinkUvscAdapterOptions &opts)
return s;
}
-static QString buildDllRegistryKey(const DriverSelection &driver)
-{
- const QFileInfo fi(driver.dll);
- return fi.baseName();
-}
-
static QString buildDllRegistryName(const DeviceSelection &device,
const StLinkUvscAdapterOptions &opts)
{
@@ -81,13 +75,11 @@ static QString buildDllRegistryName(const DeviceSelection &device,
return {};
const DeviceSelection::Algorithm algorithm = device.algorithms.at(device.algorithmIndex);
const QFileInfo path(algorithm.path);
- const QString start = algorithm.start.startsWith("0x") ? algorithm.start.mid(2)
- : algorithm.start;
- const QString size = algorithm.size.startsWith("0x") ? algorithm.size.mid(2)
- : algorithm.size;
+ const QString flashStart = UvscServerProvider::adjustFlashAlgorithmProperty(algorithm.flashStart);
+ const QString flashSize = UvscServerProvider::adjustFlashAlgorithmProperty(algorithm.flashSize);
const QString adaptOpts = buildAdapterOptions(opts);
return QStringLiteral(" %6 -FN1 -FF0%1 -FS0%2 -FL0%3 -FP0($$Device:%4$%5)")
- .arg(path.fileName(), start, size, device.name, path.filePath(), adaptOpts);
+ .arg(path.fileName(), flashStart, flashSize, device.name, path.filePath(), adaptOpts);
}
// StLinkUvProjectOptions
@@ -107,7 +99,7 @@ public:
const auto dllRegistry = m_targetOption->appendPropertyGroup("TargetDriverDllRegistry");
const auto setRegEntry = dllRegistry->appendPropertyGroup("SetRegEntry");
setRegEntry->appendProperty("Number", 0);
- const QString key = buildDllRegistryKey(driver);
+ const QString key = UvscServerProvider::buildDllRegistryKey(driver);
setRegEntry->appendProperty("Key", key);
const QString name = buildDllRegistryName(device, provider->m_adapterOpts);
setRegEntry->appendProperty("Name", name);
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp
index d56f38e2002..59b0b6d3734 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.cpp
@@ -66,6 +66,17 @@ constexpr int defaultPortNumber = 5101;
// UvscServerProvider
+QString UvscServerProvider::buildDllRegistryKey(const DriverSelection &driver)
+{
+ const QFileInfo fi(driver.dll);
+ return fi.baseName();
+}
+
+QString UvscServerProvider::adjustFlashAlgorithmProperty(const QString &property)
+{
+ return property.startsWith("0x") ? property.mid(2) : property;
+}
+
UvscServerProvider::UvscServerProvider(const QString &id)
: IDebugServerProvider(id)
{
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h
index f4527f03a4e..dbc054e02fd 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h
+++ b/src/plugins/baremetal/debugservers/uvsc/uvscserverprovider.h
@@ -78,6 +78,9 @@ public:
bool isValid() const override;
QString channelString() const final;
+ static QString buildDllRegistryKey(const Uv::DriverSelection &driver);
+ static QString adjustFlashAlgorithmProperty(const QString &property);
+
protected:
explicit UvscServerProvider(const QString &id);
explicit UvscServerProvider(const UvscServerProvider &other);
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp b/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp
index 601ee78a1f5..d07a66c83f4 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdevicemodel.cpp
@@ -83,6 +83,24 @@ static QStringList findKeilPackFiles(const QString &path)
return files;
}
+static QStringList findNordicSemiconductorPackFiles(const QString &path)
+{
+ QStringList files;
+ QDirIterator it(path, {"*_DeviceFamilyPack"}, QDir::Dirs);
+ while (it.hasNext()) {
+ const QDir dfpDir(it.next());
+ const QFileInfoList entries = dfpDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot,
+ QDir::Name);
+ if (entries.isEmpty())
+ continue;
+ QDirIterator fit(entries.last().absoluteFilePath(), {"*.pdsc"},
+ QDir::Files | QDir::NoSymLinks);
+ while (fit.hasNext())
+ files.push_back(fit.next());
+ }
+ return files;
+}
+
static void fillElementProperty(QXmlStreamReader &in, QString &prop)
{
prop = in.readElementText().trimmed();
@@ -115,8 +133,10 @@ static void fillAlgorithms(QXmlStreamReader &in, DeviceSelection::Algorithms &al
in.skipCurrentElement();
DeviceSelection::Algorithm algorithm;
algorithm.path = attrs.value("name").toString();
- algorithm.start = attrs.value("start").toString();
- algorithm.size = attrs.value("size").toString();
+ algorithm.flashStart = attrs.value("start").toString();
+ algorithm.flashSize = attrs.value("size").toString();
+ algorithm.ramStart = attrs.value("RAMstart").toString();
+ algorithm.ramSize = attrs.value("RAMsize").toString();
algorithms.push_back(algorithm);
}
@@ -206,11 +226,13 @@ void DeviceSelectionModel::fillAllPacks(const FilePath &toolsIniFile)
return;
QStringList allPackFiles;
- QDirIterator it(packsPath, {"Keil"}, QDir::Dirs | QDir::NoDotAndDotDot);
+ QDirIterator it(packsPath, {"Keil", "NordicSemiconductor"}, QDir::Dirs | QDir::NoDotAndDotDot);
while (it.hasNext()) {
const QString path = it.next();
if (path.endsWith("/Keil"))
allPackFiles << findKeilPackFiles(path);
+ else if (path.endsWith("/NordicSemiconductor"))
+ allPackFiles << findNordicSemiconductorPackFiles(path);
}
if (allPackFiles.isEmpty())
@@ -277,6 +299,8 @@ void DeviceSelectionModel::parseFamily(QXmlStreamReader &in, DeviceSelectionItem
const QStringRef elementName = in.name();
if (elementName == "processor") {
fillCpu(in, child->cpu);
+ } else if (elementName == "algorithm") {
+ fillAlgorithms(in, child->algorithms);
} else if (elementName == "memory") {
fillMemories(in, child->memories);
} else if (elementName == "description") {
@@ -325,6 +349,8 @@ void DeviceSelectionModel::parseDevice(QXmlStreamReader &in, DeviceSelectionItem
fillCpu(in, child->cpu);
} else if (elementName == "debug") {
fillSvd(in, child->svd);
+ } else if (elementName == "description") {
+ fillElementProperty(in, child->desc);
} else if (elementName == "memory") {
fillMemories(in, child->memories);
} else if (elementName == "algorithm") {
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp
index 4b09a3d5df3..7bb3eca8968 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.cpp
@@ -27,7 +27,8 @@
#include <QComboBox>
#include <QDataWidgetMapper>
-#include <QHBoxLayout>
+#include <QGridLayout>
+#include <QLabel>
#include <QLineEdit>
using namespace Utils;
@@ -65,8 +66,10 @@ constexpr char deviceMemorySizeKeyC[] = "BareMetal.UvscServerProvider.DeviceMemo
// Device ALGORITHM data keys.
constexpr char deviceAlgorithmKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithm";
constexpr char deviceAlgorithmPathKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmPath";
-constexpr char deviceAlgorithmStartKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmStart";
-constexpr char deviceAlgorithmSizeKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmSize";
+constexpr char deviceAlgorithmFlashStartKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmStart";
+constexpr char deviceAlgorithmFlashSizeKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmSize";
+constexpr char deviceAlgorithmRamStartKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmRamStart";
+constexpr char deviceAlgorithmRamSizeKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmRamSize";
constexpr char deviceAlgorithmIndexKeyC[] = "BareMetal.UvscServerProvider.DeviceAlgorithmIndex";
// DeviceSelection
@@ -110,8 +113,10 @@ QVariantMap DeviceSelection::toMap() const
for (const DeviceSelection::Algorithm &algorithm : qAsConst(algorithms)) {
QVariantMap m;
m.insert(deviceAlgorithmPathKeyC, algorithm.path);
- m.insert(deviceAlgorithmStartKeyC, algorithm.start);
- m.insert(deviceAlgorithmSizeKeyC, algorithm.size);
+ m.insert(deviceAlgorithmFlashStartKeyC, algorithm.flashStart);
+ m.insert(deviceAlgorithmFlashSizeKeyC, algorithm.flashSize);
+ m.insert(deviceAlgorithmRamStartKeyC, algorithm.ramStart);
+ m.insert(deviceAlgorithmRamSizeKeyC, algorithm.ramSize);
algorithmList.push_back(m);
}
map.insert(deviceAlgorithmKeyC, algorithmList);
@@ -159,8 +164,10 @@ void DeviceSelection::fromMap(const QVariantMap &map)
const auto m = entry.toMap();
DeviceSelection::Algorithm algorithm;
algorithm.path = m.value(deviceAlgorithmPathKeyC).toString();
- algorithm.start = m.value(deviceAlgorithmStartKeyC).toString();
- algorithm.size = m.value(deviceAlgorithmSizeKeyC).toString();
+ algorithm.flashStart = m.value(deviceAlgorithmFlashStartKeyC).toString();
+ algorithm.flashSize = m.value(deviceAlgorithmFlashSizeKeyC).toString();
+ algorithm.ramStart = m.value(deviceAlgorithmRamStartKeyC).toString();
+ algorithm.ramSize = m.value(deviceAlgorithmRamSizeKeyC).toString();
algorithms.push_back(algorithm);
}
}
@@ -186,7 +193,9 @@ bool DeviceSelection::Memory::operator==(const Memory &other) const
bool DeviceSelection::Algorithm::operator==(const Algorithm &other) const
{
- return path == other.path && start == other.start && size == other.size;
+ return path == other.path
+ && flashStart == other.flashStart && flashSize == other.flashSize
+ && ramStart == other.ramStart && ramSize == other.ramSize;
}
bool DeviceSelection::operator==(const DeviceSelection &other) const
@@ -297,7 +306,7 @@ void DeviceSelectionMemoryView::refresh()
class DeviceSelectionAlgorithmItem final : public TreeItem
{
public:
- enum Column { PathColumn, StartColumn, SizeColumn };
+ enum Column { PathColumn, FlashStartColumn, FlashSizeColumn, RamStartColumn, RamSizeColumn };
explicit DeviceSelectionAlgorithmItem(int index, DeviceSelection &selection)
: m_index(index), m_selection(selection)
{}
@@ -308,8 +317,10 @@ public:
const auto &algorithm = m_selection.algorithms.at(m_index);
switch (column) {
case PathColumn: return algorithm.path;
- case StartColumn: return algorithm.start;
- case SizeColumn: return algorithm.size;
+ case FlashStartColumn: return algorithm.flashStart;
+ case FlashSizeColumn: return algorithm.flashSize;
+ case RamStartColumn: return algorithm.ramStart;
+ case RamSizeColumn: return algorithm.ramSize;
}
}
return {};
@@ -320,11 +331,17 @@ public:
if (role == Qt::EditRole) {
auto &algorithm = m_selection.algorithms.at(m_index);
switch (column) {
- case StartColumn:
- algorithm.start = data.toString();
+ case FlashStartColumn:
+ algorithm.flashStart = data.toString();
return true;
- case SizeColumn:
- algorithm.size = data.toString();
+ case FlashSizeColumn:
+ algorithm.flashSize = data.toString();
+ return true;
+ case RamStartColumn:
+ algorithm.ramStart = data.toString();
+ return true;
+ case RamSizeColumn:
+ algorithm.ramSize = data.toString();
return true;
}
}
@@ -334,8 +351,10 @@ public:
Qt::ItemFlags flags(int column) const final
{
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
- if (column == StartColumn || column == SizeColumn)
+ if (column == FlashStartColumn || column == FlashSizeColumn
+ || column == RamStartColumn || column == RamSizeColumn) {
flags |= Qt::ItemIsEditable;
+ }
return flags;
}
@@ -350,7 +369,7 @@ DeviceSelectionAlgorithmModel::DeviceSelectionAlgorithmModel(DeviceSelection &se
QObject *parent)
: TreeModel<TreeItem, DeviceSelectionAlgorithmItem>(parent), m_selection(selection)
{
- setHeader({tr("Name"), tr("Start"), tr("Size")});
+ setHeader({tr("Name"), tr("FLASH Start"), tr("FLASH Size"), tr("RAM Start"), tr("RAM Size")});
refresh();
}
@@ -373,25 +392,40 @@ DeviceSelectionAlgorithmView::DeviceSelectionAlgorithmView(DeviceSelection &sele
: QWidget(parent)
{
const auto model = new DeviceSelectionAlgorithmModel(selection, this);
- const auto layout = new QHBoxLayout;
+ const auto layout = new QGridLayout;
layout->setContentsMargins(0, 0, 0, 0);
m_comboBox = new QComboBox;
m_comboBox->setToolTip(tr("Algorithm path."));
m_comboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
m_comboBox->setModel(model);
- layout->addWidget(m_comboBox);
- const auto startEdit = new QLineEdit;
- startEdit->setToolTip(tr("Start address."));
- layout->addWidget(startEdit);
- const auto sizeEdit = new QLineEdit;
- sizeEdit->setToolTip(tr("Size."));
- layout->addWidget(sizeEdit);
+ layout->addWidget(m_comboBox, 0, 0, 1, 0);
+ // Add FLASH area settings.
+ const auto flashLabel = new QLabel(tr("FLASH:"));
+ layout->addWidget(flashLabel, 1, 0);
+ const auto flashStartEdit = new QLineEdit;
+ flashStartEdit->setToolTip(tr("Start address."));
+ layout->addWidget(flashStartEdit, 1, 1);
+ const auto flashSizeEdit = new QLineEdit;
+ flashSizeEdit->setToolTip(tr("Size."));
+ layout->addWidget(flashSizeEdit, 1, 2);
+ // Add RAM area settings.
+ const auto ramLabel = new QLabel(tr("RAM:"));
+ layout->addWidget(ramLabel, 2, 0);
+ const auto ramStartEdit = new QLineEdit;
+ ramStartEdit->setToolTip(tr("Start address."));
+ layout->addWidget(ramStartEdit, 2, 1);
+ const auto ramSizeEdit = new QLineEdit;
+ ramSizeEdit->setToolTip(tr("Size."));
+ layout->addWidget(ramSizeEdit, 2, 2);
+
setLayout(layout);
const auto mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
- mapper->addMapping(startEdit, DeviceSelectionAlgorithmItem::StartColumn);
- mapper->addMapping(sizeEdit, DeviceSelectionAlgorithmItem::SizeColumn);
+ mapper->addMapping(flashStartEdit, DeviceSelectionAlgorithmItem::FlashStartColumn);
+ mapper->addMapping(flashSizeEdit, DeviceSelectionAlgorithmItem::FlashSizeColumn);
+ mapper->addMapping(ramStartEdit, DeviceSelectionAlgorithmItem::RamStartColumn);
+ mapper->addMapping(ramSizeEdit, DeviceSelectionAlgorithmItem::RamSizeColumn);
connect(m_comboBox, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, [mapper, this](int index) {
@@ -403,8 +437,10 @@ DeviceSelectionAlgorithmView::DeviceSelectionAlgorithmView(DeviceSelection &sele
emit algorithmChanged(-1);
});
- connect(startEdit, &QLineEdit::editingFinished, mapper, &QDataWidgetMapper::submit);
- connect(sizeEdit, &QLineEdit::editingFinished, mapper, &QDataWidgetMapper::submit);
+ connect(flashStartEdit, &QLineEdit::editingFinished, mapper, &QDataWidgetMapper::submit);
+ connect(flashSizeEdit, &QLineEdit::editingFinished, mapper, &QDataWidgetMapper::submit);
+ connect(ramStartEdit, &QLineEdit::editingFinished, mapper, &QDataWidgetMapper::submit);
+ connect(ramSizeEdit, &QLineEdit::editingFinished, mapper, &QDataWidgetMapper::submit);
}
void DeviceSelectionAlgorithmView::setAlgorithm(int index)
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.h b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.h
index fe9879cde5f..67afedbec02 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.h
+++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceselection.h
@@ -73,8 +73,10 @@ public:
struct Algorithm {
QString path;
- QString size;
- QString start;
+ QString flashSize;
+ QString flashStart;
+ QString ramSize;
+ QString ramStart;
bool operator==(const Algorithm &other) const;
};
diff --git a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceviewer.cpp b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceviewer.cpp
index e8aeb770793..7d01bd14401 100644
--- a/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceviewer.cpp
+++ b/src/plugins/baremetal/debugservers/uvsc/uvtargetdeviceviewer.cpp
@@ -84,7 +84,7 @@ DeviceSelectorDetailsPanel::DeviceSelectorDetailsPanel(DeviceSelection &selectio
m_memoryView = new DeviceSelectionMemoryView(m_selection);
layout->addRow(tr("Memory:"), m_memoryView);
m_algorithmView = new DeviceSelectionAlgorithmView(m_selection);
- layout->addRow(tr("Flash algorithm"), m_algorithmView);
+ layout->addRow(tr("Flash algorithm:"), m_algorithmView);
m_peripheralDescriptionFileChooser = new Utils::PathChooser(this);
m_peripheralDescriptionFileChooser->setExpectedKind(Utils::PathChooser::File);
m_peripheralDescriptionFileChooser->setPromptDialogFilter(