From 0a107b0c74748172676776b73370748797696cce Mon Sep 17 00:00:00 2001 From: Boris Honman Date: Fri, 23 Aug 2019 17:35:02 -0400 Subject: [PATCH] utility now detects devices connected in their normal operating mode and sends command to make them jump into bootloader mode --- qt5_src/Bootloader/MainWindow.cpp | 56 ++++++++++++++++++++++++- qt5_src/Bootloader/MainWindow.ui | 63 +++++++--------------------- qt5_src/Bootloader/img/amx_logo.ico | Bin 0 -> 3262 bytes qt5_src/Bootloader/main.cpp | 20 +-------- qt5_src/Bootloader/resources.qrc | 1 + 5 files changed, 72 insertions(+), 68 deletions(-) create mode 100644 qt5_src/Bootloader/img/amx_logo.ico diff --git a/qt5_src/Bootloader/MainWindow.cpp b/qt5_src/Bootloader/MainWindow.cpp index ee75200..c099bb2 100644 --- a/qt5_src/Bootloader/MainWindow.cpp +++ b/qt5_src/Bootloader/MainWindow.cpp @@ -69,8 +69,18 @@ #define DEFAULT_VID 0x04D8 #define DEFAULT_PID 0x003C +// the command to make the device jump into bootloader mode +#define COMMAND_JUMP_BOOTLOADER 0xBB - +struct USBDevIds +{ + unsigned short vendor_id; + unsigned short product_id; +} NormalModeDevIds[2] = +{ + {0x1209, 0x0600}, // from pid.codes + {0x04D8, 0xECEE} // from microchip sublicense +}; //Surely the micro doesn't have a programmable memory region greater than 268 Megabytes... @@ -367,6 +377,50 @@ void MainWindow::Connection(void) emit SetProgressBar(0); } } + + // check if a device is found in normal non-bootloader mode + hid_device_info *hidDevs = hid_enumerate(0, 0); + hid_device_info *d = hidDevs; + while (d) + { + for (unsigned int i=0;ivendor_id == ids.vendor_id && + d->product_id == ids.product_id) + { + // a device was found, prompt user that it will need to be reset into bootloader mode + QMessageBox msgbox(QMessageBox::Information, + "Device detected in non-FW update mode", + "A device was detected in normal operating mode. Press OK to reset the device into firmware update mode and proceed.", + QMessageBox::Ok, + this, + Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint | Qt::CustomizeWindowHint | Qt::WindowTitleHint); + msgbox.setWindowModality(Qt::ApplicationModal); + msgbox.exec(); + + // the user has closed the message box - send the bootloader entry command to the device + hid_device *dev = hid_open_path(d->path); + if (dev == NULL) + { + QMessageBox::critical(this, "Error", "Failed to open the HID device"); + break; + } + unsigned char hidOutData[2] = {0, COMMAND_JUMP_BOOTLOADER}; + int bytesWritten = hid_write(dev, &hidOutData[0], sizeof(hidOutData)); + if (bytesWritten == -1) + { + QString errMsg = QString("Failed to send mode switch command to the device:\n\n%1").arg(hid_error(dev)); + QMessageBox::critical(this, "Error", errMsg); + } + hid_close(dev); + } + } + + d = d->next; + } + + hid_free_enumeration(hidDevs); } void MainWindow::setBootloadEnabled(bool enable) diff --git a/qt5_src/Bootloader/MainWindow.ui b/qt5_src/Bootloader/MainWindow.ui index 19d932f..7ac7d38 100644 --- a/qt5_src/Bootloader/MainWindow.ui +++ b/qt5_src/Bootloader/MainWindow.ui @@ -26,7 +26,7 @@ - :/MainWindow/img/Microchip_logo.Ico:/MainWindow/img/Microchip_logo.Ico + :/MainWindow/img/amx_logo.ico:/MainWindow/img/amx_logo.ico @@ -518,58 +518,25 @@ QGroupBox::title { - + + + false + + + + 0 + 0 + + Segoe UI + 10 - - - - - false - - - - 0 - 0 - - - - - Segoe UI - 10 - - - - Reset Device - - - - - - - false - - - - 0 - 0 - - - - - Segoe UI - 10 - - - - Reset Device into FW Update Mode - - - - + + Reset Device + diff --git a/qt5_src/Bootloader/img/amx_logo.ico b/qt5_src/Bootloader/img/amx_logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..9dbc43ce6fd199cf2cd7cba9f2016cc5a6ff4b56 GIT binary patch literal 3262 zcmds3Sx{3~7``Dw5L5~jMS+AQ_huuJeHBX}2_bCR6ZR}5kVPOULRi8UBPbw3(XrdK z`edimK6iX#I#s9BnObMMj-3&7T*j4ZwNNd8Zw4DPvW%v0J()lA-S2$gf6o2Sz2{s6 zA>hBnL-;Ac!~qUoAa7Rd1-(Xv>vqNu#M=ASisD z`zt8OZ_rmMl#-@qJ%{71*y@&?oZQ~tooQl!B9}ax9ttbt~Iy7mMvla^JbK0zB zsY1}|FyUQ%em}H^Lj%yl|dTW|97VrQ1(`<&4BkRH3FCO<6`W0 zA$D_m@IEgsIw2u$#U)cn=on>xhuuHP#@Mmn%r8ta3t`56o5_vB3z$GfM%%oVujDQn z3#I>wh3XZxmyXT+S2vMtJ}US6f=zj8eH!$%Bg*E>!0|!B@6V z2XxLRwOY1X900RpM@(ww>P>(v*jV=x-wI-jV*V%4N9$q*~9?WUY}ZbL44{MeHk8 zxlkldvf7O6i38xP>&oo*P6=y4z_{|k*bPD9K%O-%Y&Mg|3_0Zn0eYQJzv6Mg z_BcePmaZudfVA2TQUza;x{R-EN8NpG4)h&7tg+=;=RoxYlr9DYFK-Ef-4z~GU#$0H6Yj1T;pmKB$nNPeS)LSd2F zY#JRM@wxCi4E3HZ#ufzVt*PPb={a$=4H8$^8FeaXwJNLq<^JHaYyec6GDq7$R!&k# zNH8wbXcbfzY0!*sIP;afXSMa}+Io3@es%(lc-RiZR*0t&*E|;29D+ijFgY=wzYD2p zETgFw*EHxWyE|rznUC-%XR;emPAHeh!TDB)L8DP=GhlM~M+Rq`xa4)$T2h{UwCm3! zJwH$xVV&K!m|e)I0|eML5&GD9aKdO-txOC>X<2#H#(k|x1~ z=NvnQ6cdl+^Lcc}TjdpEpX?Ptro`_lU`)9$ixNSb`>ZtSo{(|1g!y>D`C)_c)fWms zxj4zuBaUVKaJQGk;TEt;V0v_x&J5pR2$i~$&JLULTrWnS@~Jn9s1K)IkjMy?$;)1u z41RgA%SLC1zc+rfoU^<){!Y%0oA^i0G50q#G*&KOclWmMGcnj(U0tW9`(WnKjU--7 zPoHCT@)gErHzud=R48Smz2D>d@yP^r}QTw<|6XH;b6(Ml_G_qCeW zldbR=Mzh#-C1sfzx$$}L(6lx97o%bG=Fp8@cyDm9_bqt+77`K?6cqIO`v0zk7i|_6 z29Sce0)#S4nT?o@m?I5FED#4tKqQc0h%gDWL~j7hlK>XH5dpCHBD~leb2vXoghg-g l39!KD!y+;pv53r(76}W)=Y&PVGVwVAq-6qJg-hO{{{dkOBf0

img/Reset.png img/help.png img/Microchip_logo.Ico + img/amx_logo.ico