diff --git a/49-gx-link.rules b/49-gx-link.rules new file mode 100644 index 0000000000000000000000000000000000000000..0c2cf8cb0ee10e2ed6718cfa466944b84c5c6549 --- /dev/null +++ b/49-gx-link.rules @@ -0,0 +1,39 @@ +# SPDX-License-Identifier: LGPL-3.0-or-later + +# Copy this file to /etc/udev/rules.d/ +# If rules fail to reload automatically, you can refresh udev rules +# with the command "udevadm control --reload" + +# Reload udev rules after rules file change: +# sudo udevadm control --reload-rules +# sudo udevadm trigger + +# The device group for newer versions of Linux such as Arch is uucp. +# sudo usermod -aG uucp $USER +# or +# sudo gpasswd -a $USER uucp + +# Older Linux device groups such as Ubuntu are plugdev +# sudo usermod -aG plugdev $USER +# or +# sudo gpasswd -a $USER plugdev + +ACTION!="add|change", GOTO="gx_link_rules_end" + +SUBSYSTEM=="gpio", MODE="0660", TAG+="uaccess" + +SUBSYSTEM!="usb|tty|hidraw", GOTO="gx_link_rules_end" + +# Get VID:PID +# ls /dev/hidraw* +# udevadm info -a -n /dev/hidrawX + +# Please keep this list sorted by VID:PID + +# MC3172 EVB v203 ver1.0 +ATTRS{idVendor}=="5131", ATTRS{idProduct}=="2007", MODE="666", TAG+="uaccess", SYMLINK+="GX_LINK_%n" + +# Other +ATTRS{manufacturer}=="GAN_XIN", ATTRS{product}=="GX_LINK", MODE="666", TAG+="uaccess", SYMLINK+="GX_LINK_%n" + +LABEL="gx_link_rules_end" diff --git a/GX_ISPTool.pro b/GX_ISPTool.pro index 023e9fa2534a1a5ef0cab1062a1ef513c0b52456..d4b424d763e834acc286ef3b90bd10ffc4621364 100644 --- a/GX_ISPTool.pro +++ b/GX_ISPTool.pro @@ -71,4 +71,8 @@ unix:!macx { gx_isptool_desktop.files += $$_PRO_FILE_PWD_/gx-isptool.desktop gx_isptool_desktop.path = /usr/share/applications INSTALLS += gx_isptool_desktop + + gx_isptool_udev_rules.files += $$_PRO_FILE_PWD_/49-gx-link.rules + gx_isptool_udev_rules.path = /usr/lib/udev/rules.d + INSTALLS += gx_isptool_udev_rules } diff --git a/README.md b/README.md index 4f2abc0ca7652ea52f285d4da76e19165e75b2c0..153d3b8d1815a22f761fccbe17a600c469f7fb29 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ GX芯片下载工具,用于连接USB给GX芯片下载固件/调试固件,持 ##### Arch Linux -Arch Linux 可以通过 [AUR gx-isptool-git](https://aur.archlinux.org/packages/gx-isptool-git) 或[自建源](https://github.com/taotieren/au-repo)安装 +Arch Linux 可以通过 [AUR gx-isptool-git](https://aur.archlinux.org/packages/gx-isptool-git) 或[自建源](https://github.com/taotieren/aur-repo)安装 ```bash yay -Syu gx-isptool @@ -26,11 +26,25 @@ cd GX_ISPTool # 参考 [AUR gx-isptool-git](https://aur.archlinux.org/packages/gx-isptool-git) 中的编译 qmake make install +make uninstall ``` - #### 使用说明 -完善中 + +注意: `49-gx-link.rules` 默认安装在 `/usr/lib/udev/rules.d` 下 +不同 Linux 还需要将当前用户添加进响应的设别组里面,如: + +```bash +# Arch 等新版本的 Linux 设备组是 uucp +sudo usermod -aG uucp $USER +# or +sudo gpasswd -a $USER uucp + +# Ubuntu 等老版本的 Linux 设备组是 plugdev +sudo usermod -aG plugdev $USER +# or +sudo gpasswd -a $USER plugdev +``` #### 参与贡献 diff --git a/main.cpp b/main.cpp index cbc1e92ab8949d440467469e4cb8a4a2b93ff395..e9cde4ad53bc8155c6b2cfff9904a57005a42b70 100644 --- a/main.cpp +++ b/main.cpp @@ -1,33 +1,31 @@ #include "mainwindow.h" #include +#include +#include #include #include -#include -#include -quint32 program_version = 0x01000101; //1.1.1 +quint32 program_version = 0x01000101; // 1.1.1 -QString loadFontFamilyFromFiles(const QString &fontFileName) +QString loadFontFamilyFromFiles(const QString& fontFileName) { QString font = ""; QFile fontFile(fontFileName); - if(!fontFile.open(QIODevice::ReadOnly)) - { - qDebug()<<"Open font file error"; + if (!fontFile.open(QIODevice::ReadOnly)) { + qDebug() << "Open font file error"; return font; } int loadedFontID = QFontDatabase::addApplicationFontFromData(fontFile.readAll()); QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(loadedFontID); - if(!loadedFontFamilies.empty()) - { + if (!loadedFontFamilies.empty()) { font = loadedFontFamilies.at(0); } fontFile.close(); return font; } -int main(int argc, char *argv[]) +int main(int argc, char* argv[]) { QApplication a(argc, argv); MainWindow w; @@ -46,9 +44,9 @@ int main(int argc, char *argv[]) // // 3.Add your file downloaded. // 4.Good LUCK :D - QString strFont0 = loadFontFamilyFromFiles(":/fonts/fonts/NotoSansSC-Regular.otf"); + QString strFont0 = loadFontFamilyFromFiles(":/fonts/fonts/NotoSansSC-Regular.otf"); qDebug() << "strFont0 is: " << strFont0; - if(strFont0 != "" && !strFont0.isNull() && !strFont0.isEmpty()){ + if (strFont0 != "" && !strFont0.isNull() && !strFont0.isEmpty()) { a.setFont(strFont0); QFont font; font.setFamily(strFont0); diff --git a/mainwindow.cpp b/mainwindow.cpp index 7dc1260985a0924d503092fa26b3fd2f66446d92..e79a1ccc27324f15a74050a6ff06841cd7c5116a 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -3,17 +3,17 @@ #include #include -MainWindow::MainWindow(QWidget *parent) +MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); refreshDPI(); myusbthread = new USBThread(this); - connect(myusbthread,SIGNAL(new_data(const QByteArray)),this,SLOT(usbreceivedata(const QByteArray))); - connect(myusbthread,SIGNAL(usb_connect(QString)),this,SLOT(usbconnect(QString))); - connect(myusbthread,SIGNAL(usb_disconnect()),this,SLOT(usbdisconnect())); - connect(myusbthread,SIGNAL(usb_send_error()),this,SLOT(usbsenderror())); + connect(myusbthread, SIGNAL(new_data(const QByteArray)), this, SLOT(usbreceivedata(const QByteArray))); + connect(myusbthread, SIGNAL(usb_connect(QString)), this, SLOT(usbconnect(QString))); + connect(myusbthread, SIGNAL(usb_disconnect()), this, SLOT(usbdisconnect())); + connect(myusbthread, SIGNAL(usb_send_error()), this, SLOT(usbsenderror())); myusbthread->vid = DEFAULT_VENDOR_ID; myusbthread->pid = DEFAULT_PRODUCT_ID; @@ -22,15 +22,14 @@ MainWindow::MainWindow(QWidget *parent) hid_device_list = myusbthread->get_device_list(); device_nums = hid_device_list.size(); ui->comboBox_device->clear(); - foreach (HidDeviceInfo i, hid_device_list) - { - if(!hid_device_num.contains(i.path)) + foreach (HidDeviceInfo i, hid_device_list) { + if (!hid_device_num.contains(i.path)) hid_device_num.insert(i.path, hid_device_num.size()); ui->comboBox_device->addItem(tr("GX_LINK#%1").arg(hid_device_num[i.path]), i.path); } device_nums = hid_device_list.size(); systimer = new QTimer(this); - connect(systimer,SIGNAL(timeout()),this,SLOT(systimerUpdate())); + connect(systimer, SIGNAL(timeout()), this, SLOT(systimerUpdate())); systimer->start(2000); sender_timer = new QTimer(this); connect(sender_timer, SIGNAL(timeout()), this, SLOT(sender_update())); @@ -39,59 +38,55 @@ MainWindow::MainWindow(QWidget *parent) MainWindow::~MainWindow() { - if(myusbthread->isRunning()) - { + if (myusbthread->isRunning()) { myusbthread->stop_thread(); myusbthread->wait(); } #if DEBUG_WRITE_BIN_FILE - if(save_debug_bin.isOpen()) + if (save_debug_bin.isOpen()) save_debug_bin.close(); #endif delete ui; } -//刷新dpi +// 刷新dpi void MainWindow::refreshDPI() { - //计算dpi + // 计算dpi QList screens = QApplication::screens(); QScreen* screen = screens[0]; qreal dpi = screen->logicalDotsPerInch(); - //计算dpi对应的缩放比例 - double objectRate = dpi/96.0; + // 计算dpi对应的缩放比例 + double objectRate = dpi / 96.0; changeObjectSize(*this, objectRate); - qDebug()<<"width "<(o.children().at(i)); + for (int i = 0; i < o.children().size(); ++i) { + QWidget* pWidget = qobject_cast(o.children().at(i)); if (pWidget != nullptr) { qDebug() << pWidget->width() << pWidget->height(); - //pWidget->resize(pWidget->width()*objectRate, pWidget->height()*objectRate); - pWidget->setGeometry(pWidget->x()*objectRate,pWidget->y()*objectRate, - pWidget->width()*objectRate, pWidget->height()*objectRate); - changeObjectSize(*(o.children().at(i)),objectRate); + // pWidget->resize(pWidget->width()*objectRate, pWidget->height()*objectRate); + pWidget->setGeometry(pWidget->x() * objectRate, pWidget->y() * objectRate, + pWidget->width() * objectRate, pWidget->height() * objectRate); + changeObjectSize(*(o.children().at(i)), objectRate); } } } void MainWindow::systimerUpdate() { - if(!hid_isopen) - { + if (!hid_isopen) { hid_device_list = myusbthread->get_device_list(); qDebug() << "device_nums:" << device_nums << "|hid_device_list:" << hid_device_list.size(); - if(device_nums != hid_device_list.size()) - { + if (device_nums != hid_device_list.size()) { ui->comboBox_device->clear(); - foreach (HidDeviceInfo i, hid_device_list) - { - if(!hid_device_num.contains(i.path)) + foreach (HidDeviceInfo i, hid_device_list) { + if (!hid_device_num.contains(i.path)) hid_device_num.insert(i.path, hid_device_num.size()); ui->comboBox_device->addItem(tr("GX_Link #%1").arg(hid_device_num[i.path]), i.path); } @@ -100,14 +95,13 @@ void MainWindow::systimerUpdate() } } - void MainWindow::usbconnect(QString dev_str) { qDebug() << "usbconnect"; hid_isopen = true; refresh_button(); - //ui->textEdit_information->append("设备已连接"); - //ui->textEdit_information->append("设备名称:"+dev_str); + // ui->textEdit_information->append("设备已连接"); + // ui->textEdit_information->append("设备名称:"+dev_str); } void MainWindow::usbdisconnect() @@ -122,24 +116,21 @@ void MainWindow::usbsenderror() { qDebug() << "usbsenderror"; myusbthread->pause_thread(); - //QMessageBox::warning(this,QString::fromUtf8(u8"错误"),QString::fromUtf8(u8"USB发送数据异常"),QMessageBox::Ok); + // QMessageBox::warning(this,QString::fromUtf8(u8"错误"),QString::fromUtf8(u8"USB发送数据异常"),QMessageBox::Ok); } void MainWindow::sender_update() { qDebug() << "sender_update"; - if(downloading) - { - if(write_end_flash) - { + if (downloading) { + if (write_end_flash) { QByteArray data_send; data_send.append((char)(0x00)); data_send.append(hex_parser.flash_end_data); send_bin_data(WRITEA_FLASH_PC_TO_MCU, data_send); download_count++; download_end_count++; - if(download_end_count >= 6) - { + if (download_end_count >= 6) { write_end_flash = false; sender_timer->stop(); #ifdef DOWNLOAD_AND_CHECK @@ -147,45 +138,38 @@ void MainWindow::sender_update() checking_end = true; check_data(); #else - //WRITE16_IN_PC_TO_MCU 00 20 00 0B + // WRITE16_IN_PC_TO_MCU 00 20 00 0B { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,0x20); - gen_data.append(1,0x00); - gen_data.append(1,0x0B); + gen_data.append(1, 0x00); + gen_data.append(1, 0x20); + gen_data.append(1, 0x00); + gen_data.append(1, 0x0B); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } refresh_button(); ui->textEdit_information->append(QString::fromUtf8(u8"下载成功:") + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); #endif } - } - else - { + } else { QByteArray data_send; data_send.append((char)(0x00)); - if(write_flash) - { - data_send.append(hex_parser.flash_data.mid(download_count*DEFAULT_BIN_PACKAGE_SIZE,DEFAULT_BIN_PACKAGE_SIZE)); + if (write_flash) { + data_send.append(hex_parser.flash_data.mid(download_count * DEFAULT_BIN_PACKAGE_SIZE, DEFAULT_BIN_PACKAGE_SIZE)); send_bin_data(WRITEA_FLASH_PC_TO_MCU, data_send); - } - else - { - data_send.append(hex_parser.bin_data.mid(download_count*DEFAULT_BIN_PACKAGE_SIZE,DEFAULT_BIN_PACKAGE_SIZE)); + } else { + data_send.append(hex_parser.bin_data.mid(download_count * DEFAULT_BIN_PACKAGE_SIZE, DEFAULT_BIN_PACKAGE_SIZE)); send_bin_data(WRITEN_MCU_PC_TO_MCU, data_send); } download_count += 1; - ui->progressBar_Download_Speed->setValue((int)(download_count*DEFAULT_BIN_PACKAGE_SIZE*100/hex_parser.bin_data.size())); - if(hex_parser.bin_data.size() <= download_count*DEFAULT_BIN_PACKAGE_SIZE) - { + ui->progressBar_Download_Speed->setValue((int)(download_count * DEFAULT_BIN_PACKAGE_SIZE * 100 / hex_parser.bin_data.size())); + if (hex_parser.bin_data.size() <= download_count * DEFAULT_BIN_PACKAGE_SIZE) { sender_timer->stop(); #if DEBUG_WRITE_BIN_FILE - if(save_debug_bin.isOpen()) - save_debug_bin.close(); + if (save_debug_bin.isOpen()) + save_debug_bin.close(); #endif - if(write_flash) - { + if (write_flash) { Delay_MSec(30); check_count = 0; #ifdef DOWNLOAD_AND_CHECK @@ -196,18 +180,16 @@ void MainWindow::sender_update() write_end_flash = true; sender_timer->start(1); #endif - } - else - { - //MCU 02 0x00000000 + } else { + // MCU 02 0x00000000 { QByteArray gen_data; - gen_data.append(1,0x02); - gen_data.append(4,0x00); + gen_data.append(1, 0x02); + gen_data.append(4, 0x00); send_data(WRITE32_MCU_PC_TO_MCU, gen_data); } - //MCU read 01 + // MCU read 01 { QByteArray gen_data; gen_data.append((char)0x01); @@ -216,8 +198,7 @@ void MainWindow::sender_update() downloading = false; refresh_button(); ui->textEdit_information->append(QString::fromUtf8(u8"下载成功:") + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); - if(1) - { + if (1) { ui->textEdit_information->append(QString::fromUtf8(u8"运行程序...")); QByteArray gen_data; gen_data.append((char)0x01); @@ -226,16 +207,11 @@ void MainWindow::sender_update() } } } - } - else - { - if(repeated_count < repeated_time) - { + } else { + if (repeated_count < repeated_time) { myusbthread->send_data(last_send_data); repeated_count++; - } - else - { + } else { sender_timer->stop(); } } @@ -243,98 +219,84 @@ void MainWindow::sender_update() void MainWindow::usbreceivedata(const QByteArray recv_data) { - //qDebug() << recv_data.toHex(' '); - //ui->plainTextEdit_receive->appendPlainText(recv_data.toHex(' ')); - if((recv_data.at(0) == (char)WRITEN_MCU_MCU_TO_PC) && downloading) - { + // qDebug() << recv_data.toHex(' '); + // ui->plainTextEdit_receive->appendPlainText(recv_data.toHex(' ')); + if ((recv_data.at(0) == (char)WRITEN_MCU_MCU_TO_PC) && downloading) { int new_count = (uchar)recv_data.at(2); - new_count = new_count*256+(uchar)recv_data.at(3); + new_count = new_count * 256 + (uchar)recv_data.at(3); qDebug() << "Repeat Send :" << new_count; - //ui->textEdit_information->append(tr("Repeat Send :%1").arg(new_count)); + // ui->textEdit_information->append(tr("Repeat Send :%1").arg(new_count)); download_count = new_count; download_end_count--; } - if((recv_data.at(0) == (char)HELLO_MCU_TO_PC)) - { + if ((recv_data.at(0) == (char)HELLO_MCU_TO_PC)) { qDebug() << recv_data.toHex(' '); - QString mtlink_version = "0x" + recv_data.mid(4,4).toHex(0); - QString MCU_ID = "0x" + recv_data.mid(8,8).toHex(0); - QString Flash_ID = "0x" + recv_data.mid(16,2).toHex(0); - QString USB_ID = "0x" + recv_data.mid(18,6).toHex(0); -// ui->textEdit_information->append(tr("mtlink_version :%1").arg(mtlink_version)); - ui->textEdit_information->append(QString::fromUtf8(u8"找到可操作设备:")+tr("%1").arg(MCU_ID)); -// ui->textEdit_information->append(tr("Flash_ID :%1").arg(Flash_ID)); -// ui->textEdit_information->append(tr("USB_ID :%1").arg(USB_ID)); + QString mtlink_version = "0x" + recv_data.mid(4, 4).toHex(0); + QString MCU_ID = "0x" + recv_data.mid(8, 8).toHex(0); + QString Flash_ID = "0x" + recv_data.mid(16, 2).toHex(0); + QString USB_ID = "0x" + recv_data.mid(18, 6).toHex(0); + // ui->textEdit_information->append(tr("mtlink_version :%1").arg(mtlink_version)); + ui->textEdit_information->append(QString::fromUtf8(u8"找到可操作设备:") + tr("%1").arg(MCU_ID)); + // ui->textEdit_information->append(tr("Flash_ID :%1").arg(Flash_ID)); + // ui->textEdit_information->append(tr("USB_ID :%1").arg(USB_ID)); } - if(recv_data.at(0) == (char)READA_FLASH_MCU_TO_PC && checking) - { + if (recv_data.at(0) == (char)READA_FLASH_MCU_TO_PC && checking) { checking = false; - if(checking_end) - { + if (checking_end) { uint32_t read_data_size = (uchar)recv_data.at(1) - 4 - 3; - uint32_t read_addr = ((uchar)recv_data.at(4))*256*256 + ((uchar)recv_data.at(5))*256 + ((uchar)recv_data.at(6)); - int data_cout = (read_addr - 0x000200)/DEFAULT_BIN_PACKAGE_SIZE; + uint32_t read_addr = ((uchar)recv_data.at(4)) * 256 * 256 + ((uchar)recv_data.at(5)) * 256 + ((uchar)recv_data.at(6)); + int data_cout = (read_addr - 0x000200) / DEFAULT_BIN_PACKAGE_SIZE; - QByteArray read_data = recv_data.mid(7,read_data_size); + QByteArray read_data = recv_data.mid(7, read_data_size); - QByteArray flash_data = hex_parser.flash_data.mid(data_cout*DEFAULT_BIN_PACKAGE_SIZE,read_data_size); + QByteArray flash_data = hex_parser.flash_data.mid(data_cout * DEFAULT_BIN_PACKAGE_SIZE, read_data_size); qDebug() << "Read Data:" << read_data.toHex(' '); qDebug() << "Flash Data:" << flash_data.toHex(' '); - if(read_data.left(flash_data.size()) != flash_data) - { + if (read_data.left(flash_data.size()) != flash_data) { ui->textEdit_information->append(QString::fromUtf8(u8"数据校验失败,请重新下载!") + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); - //ui->textEdit_information->append("尾部数据校验失败,请重新下载!" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); + // ui->textEdit_information->append("尾部数据校验失败,请重新下载!" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); QTimer::singleShot(10, this, SLOT(redownload_data())); return; } - if(read_data.right(read_data.size()-flash_data.size()) != hex_parser.flash_end_data.left(read_data.size()-flash_data.size())) - { + if (read_data.right(read_data.size() - flash_data.size()) != hex_parser.flash_end_data.left(read_data.size() - flash_data.size())) { ui->textEdit_information->append(QString::fromUtf8(u8"数据校验失败,请重新下载!") + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); - //ui->textEdit_information->append("尾部数据校验失败,请重新下载!" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); - //error download + // ui->textEdit_information->append("尾部数据校验失败,请重新下载!" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); + // error download QTimer::singleShot(10, this, SLOT(redownload_data())); return; } checking_end = false; - //ui->textEdit_information->append("尾部数据校验成功,下载完成:" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); + // ui->textEdit_information->append("尾部数据校验成功,下载完成:" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); ui->textEdit_information->append(QString::fromUtf8(u8"校验成功,下载完成:") + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); - //WRITE16_IN_PC_TO_MCU 00 20 00 0B + // WRITE16_IN_PC_TO_MCU 00 20 00 0B { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,0x20); - gen_data.append(1,0x00); - gen_data.append(1,0x0B); + gen_data.append(1, 0x00); + gen_data.append(1, 0x20); + gen_data.append(1, 0x00); + gen_data.append(1, 0x0B); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } downloading = false; refresh_button(); - } - else - { + } else { uint32_t read_data_size = (uchar)recv_data.at(1) - 4 - 3; - uint32_t read_addr = ((uchar)recv_data.at(4))*256*256 + ((uchar)recv_data.at(5))*256 + ((uchar)recv_data.at(6)); - int data_cout = (read_addr - 0x000200)/DEFAULT_BIN_PACKAGE_SIZE; - QByteArray read_data = recv_data.mid(7,read_data_size); - QByteArray flash_data = hex_parser.flash_data.mid(data_cout*DEFAULT_BIN_PACKAGE_SIZE,read_data_size); - if(read_data == flash_data) - { + uint32_t read_addr = ((uchar)recv_data.at(4)) * 256 * 256 + ((uchar)recv_data.at(5)) * 256 + ((uchar)recv_data.at(6)); + int data_cout = (read_addr - 0x000200) / DEFAULT_BIN_PACKAGE_SIZE; + QByteArray read_data = recv_data.mid(7, read_data_size); + QByteArray flash_data = hex_parser.flash_data.mid(data_cout * DEFAULT_BIN_PACKAGE_SIZE, read_data_size); + if (read_data == flash_data) { check_count++; - if(check_count*DEFAULT_BIN_PACKAGE_SIZE >= hex_parser.flash_data.size()) - { - //ui->textEdit_information->append("校验成功,正在写入尾部数据:" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); + if (check_count * DEFAULT_BIN_PACKAGE_SIZE >= hex_parser.flash_data.size()) { + // ui->textEdit_information->append("校验成功,正在写入尾部数据:" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); download_end_count = 0; write_end_flash = true; sender_timer->start(20); - } - else - { + } else { check_data(); } - } - else - { + } else { ui->textEdit_information->append(tr("%1").arg(data_cout) + QString::fromUtf8(u8"校验失败,请重新下载!") + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); qDebug() << "Read Data:" << read_data.toHex(' '); qDebug() << "Flash Data:" << flash_data.toHex(' '); @@ -345,24 +307,21 @@ void MainWindow::usbreceivedata(const QByteArray recv_data) } } - void MainWindow::on_pushButton_openclose_clicked() { - if(!hid_isopen){ - if(myusbthread->get_usbstatus() != USB_CONNECT) - { + if (!hid_isopen) { + if (myusbthread->get_usbstatus() != USB_CONNECT) { QString usb_path = ui->comboBox_device->currentData().toString(); - if(usb_path.isEmpty()){ - QMessageBox::warning(this,"error",QString::fromUtf8(u8"USB打开失败,请检查设备!"),QMessageBox::Ok); + if (usb_path.isEmpty()) { + QMessageBox::warning(this, "error", QString::fromUtf8(u8"USB打开失败,请检查设备!"), QMessageBox::Ok); return; } hid_isopen = myusbthread->open_usb(usb_path); - if(!hid_isopen){ - QMessageBox::warning(this,"error",QString::fromUtf8(u8"USB打开失败,请检查设备!"),QMessageBox::Ok); + if (!hid_isopen) { + QMessageBox::warning(this, "error", QString::fromUtf8(u8"USB打开失败,请检查设备!"), QMessageBox::Ok); } } - } - else{ + } else { myusbthread->pause_thread(); } } @@ -370,46 +329,43 @@ void MainWindow::on_pushButton_openclose_clicked() void MainWindow::on_pushButton_OpenFile_clicked() { ui->textEdit_information->append(QString::fromUtf8(u8"打开文件...")); - QString fileName = QFileDialog::getOpenFileName(this,QString::fromUtf8(u8"打开固件文件"), QDir::currentPath(), QString::fromUtf8(u8"HEX文件(*.hex)")); - qDebug()<<"文件名: "+fileName; + QString fileName = QFileDialog::getOpenFileName(this, QString::fromUtf8(u8"打开固件文件"), QDir::currentPath(), QString::fromUtf8(u8"HEX文件(*.hex)")); + qDebug() << "文件名: " + fileName; - if(fileName.isEmpty()) + if (fileName.isEmpty()) return; ui->lineEdit_FileName->setText(fileName); hex_parser.clear(); load_bin = hex_parser.parse(fileName); - if(!load_bin) - { - QMessageBox::warning(this,"error",hex_parser.error_info,QMessageBox::Ok); - ui->textEdit_information->append(fileName+QString::fromUtf8(u8" 解析失败")); + if (!load_bin) { + QMessageBox::warning(this, "error", hex_parser.error_info, QMessageBox::Ok); + ui->textEdit_information->append(fileName + QString::fromUtf8(u8" 解析失败")); return; } - //ui->textEdit_information->append(fileName+" 解析成功, bin长度:" + tr("%1").arg(hex_parser.bin_data.size()-16)); - ui->textEdit_information->append(fileName+QString::fromUtf8(u8"成功")); + // ui->textEdit_information->append(fileName+" 解析成功, bin长度:" + tr("%1").arg(hex_parser.bin_data.size()-16)); + ui->textEdit_information->append(fileName + QString::fromUtf8(u8"成功")); refresh_button(); - //ui->pushButton_StartDownload->setEnabled(hid_isopen & load_bin & !downloading); + // ui->pushButton_StartDownload->setEnabled(hid_isopen & load_bin & !downloading); } - void MainWindow::on_pushButton_StartDownload_clicked() { - if(!load_bin || !hid_isopen || downloading) + if (!load_bin || !hid_isopen || downloading) return; sender_timer->stop(); write_flash = false; hex_parser.clear(); load_bin = hex_parser.parse(ui->lineEdit_FileName->text()); - if(!load_bin) - { - QMessageBox::warning(this,"error",hex_parser.error_info,QMessageBox::Ok); - ui->textEdit_information->append(ui->lineEdit_FileName->text()+QString::fromUtf8(u8" 解析失败")); + if (!load_bin) { + QMessageBox::warning(this, "error", hex_parser.error_info, QMessageBox::Ok); + ui->textEdit_information->append(ui->lineEdit_FileName->text() + QString::fromUtf8(u8" 解析失败")); return; } #if DEBUG_WRITE_BIN_FILE - if(save_debug_bin.isOpen()) + if (save_debug_bin.isOpen()) save_debug_bin.close(); save_debug_bin.setFileName("download.bin"); - save_debug_bin.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate); + save_debug_bin.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate); #endif download_data(); } @@ -418,31 +374,26 @@ void MainWindow::check_data() { char check_size = DEFAULT_BIN_PACKAGE_SIZE; - uint32_t read_addr = 0x000200 + check_count*DEFAULT_BIN_PACKAGE_SIZE; + uint32_t read_addr = 0x000200 + check_count * DEFAULT_BIN_PACKAGE_SIZE; QByteArray gen_data; checking = true; - if(checking_end) - { - check_size = DEFAULT_BIN_PACKAGE_SIZE - ((check_count+1)*DEFAULT_BIN_PACKAGE_SIZE - hex_parser.flash_data.size()) + 16; - } - else - { - if((check_count+1)*DEFAULT_BIN_PACKAGE_SIZE >= hex_parser.flash_data.size()) - { - if(check_count*DEFAULT_BIN_PACKAGE_SIZE >= hex_parser.flash_data.size()) - { + if (checking_end) { + check_size = DEFAULT_BIN_PACKAGE_SIZE - ((check_count + 1) * DEFAULT_BIN_PACKAGE_SIZE - hex_parser.flash_data.size()) + 16; + } else { + if ((check_count + 1) * DEFAULT_BIN_PACKAGE_SIZE >= hex_parser.flash_data.size()) { + if (check_count * DEFAULT_BIN_PACKAGE_SIZE >= hex_parser.flash_data.size()) { checking = false; return; } - check_size = DEFAULT_BIN_PACKAGE_SIZE- ((check_count+1)*DEFAULT_BIN_PACKAGE_SIZE - hex_parser.flash_data.size()); + check_size = DEFAULT_BIN_PACKAGE_SIZE - ((check_count + 1) * DEFAULT_BIN_PACKAGE_SIZE - hex_parser.flash_data.size()); } } - ui->progressBar_Download_Speed->setValue((int)((check_count+1)*DEFAULT_BIN_PACKAGE_SIZE*100/hex_parser.flash_data.size())); - gen_data.append(1,check_size); - gen_data.append((read_addr>>16)&0x0ff); - gen_data.append((read_addr>>8)&0x0ff); - gen_data.append((read_addr)&0x0ff); + ui->progressBar_Download_Speed->setValue((int)((check_count + 1) * DEFAULT_BIN_PACKAGE_SIZE * 100 / hex_parser.flash_data.size())); + gen_data.append(1, check_size); + gen_data.append((read_addr >> 16) & 0x0ff); + gen_data.append((read_addr >> 8) & 0x0ff); + gen_data.append((read_addr) & 0x0ff); send_data(READA_FLASH_PC_TO_MCU, gen_data); } @@ -450,7 +401,7 @@ void MainWindow::redownload_data() { downloading = false; refresh_button(); - //download_data(); + // download_data(); } void MainWindow::download_data() @@ -459,198 +410,195 @@ void MainWindow::download_data() refresh_button(); download_count = 0; ui->progressBar_Download_Speed->setValue(0); - if(write_flash) - { - //flash F6 01 06 00 00 + if (write_flash) { + // flash F6 01 06 00 00 { QByteArray gen_data; - gen_data.append(1,0x01); - gen_data.append(1,0x06); - gen_data.append(2,0x00); + gen_data.append(1, 0x01); + gen_data.append(1, 0x06); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } - //flash F6 04 D8 00 00 00 + // flash F6 04 D8 00 00 00 { QByteArray gen_data; - gen_data.append(1,0x04); - gen_data.append(1,0xD8); - gen_data.append(3,0x00); + gen_data.append(1, 0x04); + gen_data.append(1, 0xD8); + gen_data.append(3, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } Delay_MSec(30); - //flash F6 01 06 00 00 + // flash F6 01 06 00 00 { QByteArray gen_data; - gen_data.append(1,0x01); - gen_data.append(1,0x06); - gen_data.append(2,0x00); + gen_data.append(1, 0x01); + gen_data.append(1, 0x06); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } - //flash F6 04 D8 01 00 00 + // flash F6 04 D8 01 00 00 { QByteArray gen_data; - gen_data.append(1,0x04); - gen_data.append(1,0xD8); - gen_data.append(1,0x01); - gen_data.append(2,0x00); + gen_data.append(1, 0x04); + gen_data.append(1, 0xD8); + gen_data.append(1, 0x01); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } Delay_MSec(30); - //flash F6 01 06 00 00 + // flash F6 01 06 00 00 { QByteArray gen_data; - gen_data.append(1,0x01); - gen_data.append(1,0x06); - gen_data.append(2,0x00); + gen_data.append(1, 0x01); + gen_data.append(1, 0x06); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } - //flash F6 04 D8 02 00 00 + // flash F6 04 D8 02 00 00 { QByteArray gen_data; - gen_data.append(1,0x04); - gen_data.append(1,0xD8); - gen_data.append(1,0x02); - gen_data.append(2,0x00); + gen_data.append(1, 0x04); + gen_data.append(1, 0xD8); + gen_data.append(1, 0x02); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } Delay_MSec(30); - //HELLO + // HELLO { QByteArray gen_data; - gen_data.append((program_version>>24)&0x0ff); - gen_data.append((program_version>>16)&0x0ff); - gen_data.append((program_version>>8)&0x0ff); - gen_data.append((program_version)&0x0ff); + gen_data.append((program_version >> 24) & 0x0ff); + gen_data.append((program_version >> 16) & 0x0ff); + gen_data.append((program_version >> 8) & 0x0ff); + gen_data.append((program_version) & 0x0ff); send_data(HELLO_PC_TO_MCU, gen_data); } - //WRITE16_IN_PC_TO_MCU 00 10 00 02 + // WRITE16_IN_PC_TO_MCU 00 10 00 02 { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,0x10); - gen_data.append(1,0x00); - gen_data.append(1,0x02); + gen_data.append(1, 0x00); + gen_data.append(1, 0x10); + gen_data.append(1, 0x00); + gen_data.append(1, 0x02); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } - //WRITE16_IN_PC_TO_MCU 00 20 00 0C + // WRITE16_IN_PC_TO_MCU 00 20 00 0C { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,0x20); - gen_data.append(1,0x00); - gen_data.append(1,0x0C); + gen_data.append(1, 0x00); + gen_data.append(1, 0x20); + gen_data.append(1, 0x00); + gen_data.append(1, 0x0C); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } - //WRITE16_IN_PC_TO_MCU 00 20 00 0D + // WRITE16_IN_PC_TO_MCU 00 20 00 0D { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,0x20); - gen_data.append(1,0x00); - gen_data.append(1,0x0D); + gen_data.append(1, 0x00); + gen_data.append(1, 0x20); + gen_data.append(1, 0x00); + gen_data.append(1, 0x0D); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } - } - else - { - //RST = 0 + } else { + // RST = 0 { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,RESET_MCU_MCU_TO_PC); - gen_data.append(2,0x00); + gen_data.append(1, 0x00); + gen_data.append(1, RESET_MCU_MCU_TO_PC); + gen_data.append(2, 0x00); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } - //RST = 1 + // RST = 1 { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,RESET_MCU_MCU_TO_PC); - gen_data.append(1,0x00); - gen_data.append(1,0x01); + gen_data.append(1, 0x00); + gen_data.append(1, RESET_MCU_MCU_TO_PC); + gen_data.append(1, 0x00); + gen_data.append(1, 0x01); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } - //MCU 00 0x5DF80001 + // MCU 00 0x5DF80001 { QByteArray gen_data; - gen_data.append(1,0x00); + gen_data.append(1, 0x00); gen_data.append((char)0x5d); gen_data.append((char)0xf8); - gen_data.append(1,0x00); - gen_data.append(1,0x01); + gen_data.append(1, 0x00); + gen_data.append(1, 0x01); send_data(WRITE32_MCU_PC_TO_MCU, gen_data); } Delay_MSec(30); - //RST = 0 + // RST = 0 { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,RESET_MCU_MCU_TO_PC); - gen_data.append(2,0x00); + gen_data.append(1, 0x00); + gen_data.append(1, RESET_MCU_MCU_TO_PC); + gen_data.append(2, 0x00); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } - //RST = 1 + // RST = 1 { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(1,RESET_MCU_MCU_TO_PC); - gen_data.append(1,0x00); - gen_data.append(1,0x01); + gen_data.append(1, 0x00); + gen_data.append(1, RESET_MCU_MCU_TO_PC); + gen_data.append(1, 0x00); + gen_data.append(1, 0x01); send_data(WRITE16_IN_PC_TO_MCU, gen_data); } - //MCU 00 0x000000a0 + // MCU 00 0x000000a0 { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(3,0x00); - gen_data.append(1,0xa0); + gen_data.append(1, 0x00); + gen_data.append(3, 0x00); + gen_data.append(1, 0xa0); send_data(WRITE32_MCU_PC_TO_MCU, gen_data); } - //MCU 02 0x00000080 + // MCU 02 0x00000080 { QByteArray gen_data; - gen_data.append(1,0x02); - gen_data.append(3,0x00); - gen_data.append(1,0x80); + gen_data.append(1, 0x02); + gen_data.append(3, 0x00); + gen_data.append(1, 0x80); send_data(WRITE32_MCU_PC_TO_MCU, gen_data); } - //MCU 00 0x000000a1 + // MCU 00 0x000000a1 { QByteArray gen_data; - gen_data.append(1,0x00); - gen_data.append(3,0x00); - gen_data.append(1,0xa1); + gen_data.append(1, 0x00); + gen_data.append(3, 0x00); + gen_data.append(1, 0xa1); send_data(WRITE32_MCU_PC_TO_MCU, gen_data); } - //HELLO + // HELLO { QByteArray gen_data; - gen_data.append((program_version>>24)&0x0ff); - gen_data.append((program_version>>16)&0x0ff); - gen_data.append((program_version>>8)&0x0ff); - gen_data.append((program_version)&0x0ff); + gen_data.append((program_version >> 24) & 0x0ff); + gen_data.append((program_version >> 16) & 0x0ff); + gen_data.append((program_version >> 8) & 0x0ff); + gen_data.append((program_version) & 0x0ff); send_data(HELLO_PC_TO_MCU, gen_data); } } - //HELLO + // HELLO { QByteArray gen_data; gen_data.append(HELLO_PC_TO_MCU); gen_data.append(0x08); - gen_data.append(2,0xFF); - gen_data.append((program_version>>24)&0x0ff); - gen_data.append((program_version>>16)&0x0ff); - gen_data.append((program_version>>8)&0x0ff); - gen_data.append((program_version)&0x0ff); + gen_data.append(2, 0xFF); + gen_data.append((program_version >> 24) & 0x0ff); + gen_data.append((program_version >> 16) & 0x0ff); + gen_data.append((program_version >> 8) & 0x0ff); + gen_data.append((program_version) & 0x0ff); myusbthread->send_data(gen_data.leftJustified(64, 0x00, true)); } sender_timer->start(1); @@ -659,7 +607,7 @@ void MainWindow::download_data() void MainWindow::refresh_button() { - if(hid_isopen) + if (hid_isopen) ui->pushButton_openclose->setText(QString::fromUtf8(u8"断开连接")); else ui->pushButton_openclose->setText(QString::fromUtf8(u8"连接设备")); @@ -671,7 +619,6 @@ void MainWindow::refresh_button() ui->pushButton_emptyFlash->setEnabled(hid_isopen & !downloading); } - /************************************************* Function: hexStringtoByteArray() Description: 十六进制字串转化为十六进制编码 @@ -684,15 +631,14 @@ QByteArray MainWindow::hexStrToByteArray(QString hex) { QByteArray ret; hex = hex.trimmed(); - //formatString(hex,2,QChar(' ')); + // formatString(hex,2,QChar(' ')); qDebug() << hex; - QStringList slist=hex.split(" "); + QStringList slist = hex.split(" "); qDebug() << slist; - foreach(QString str,slist) - { + foreach (QString str, slist) { qDebug() << str; - if(!str.isEmpty()) - ret.append((char)str.toInt(0,16)&0xFF); + if (!str.isEmpty()) + ret.append((char)str.toInt(0, 16) & 0xFF); } return ret; } @@ -706,49 +652,45 @@ Input: org->待处理的字串 ch->分隔标志,在此取空格 Return: void *************************************************/ -void MainWindow::formatString(QString &str, int n=2,const QChar &ch=QChar(' ')) +void MainWindow::formatString(QString& str, int n = 2, const QChar& ch = QChar(' ')) { - int size= str.size(); - int space= qRound(size*1.0/n+0.5)-1; - if(space<=0) + int size = str.size(); + int space = qRound(size * 1.0 / n + 0.5) - 1; + if (space <= 0) return; - for(int i=0,pos=n;i>8)&0x0ff)); - gen_data.append((char)(command_num&0x0ff)); + gen_data.append((char)((command_num >> 8) & 0x0ff)); + gen_data.append((char)(command_num & 0x0ff)); command_num++; gen_data.append(data); myusbthread->send_data(gen_data.leftJustified(64, 0x00, true)); } -void MainWindow::send_bin_data(uint8_t command, QByteArray & data) +void MainWindow::send_bin_data(uint8_t command, QByteArray& data) { QByteArray gen_data; uint8_t size = 0; size = 2 + 2 + data.size(); gen_data.append(command); gen_data.append(size); - gen_data.append((char)((download_count>>8)&0x0ff)); - gen_data.append((char)(download_count&0x0ff)); + gen_data.append((char)((download_count >> 8) & 0x0ff)); + gen_data.append((char)(download_count & 0x0ff)); gen_data.append(data); #if DEBUG_WRITE_BIN_FILE save_debug_bin.write(data.toHex(' ')); @@ -759,7 +701,6 @@ void MainWindow::send_bin_data(uint8_t command, QByteArray & data) void MainWindow::on_comboBox_device_currentIndexChanged(int index) { - } void MainWindow::Delay_MSec(unsigned int msec) @@ -769,84 +710,80 @@ void MainWindow::Delay_MSec(unsigned int msec) loop.exec(); } - void MainWindow::on_pushButton_StartDownloadFlash_clicked() { write_flash = true; download_data(); } - void MainWindow::on_pushButton_GetMCUID_clicked() { QByteArray gen_data; - gen_data.append((program_version>>24)&0x0ff); - gen_data.append((program_version>>16)&0x0ff); - gen_data.append((program_version>>8)&0x0ff); - gen_data.append((program_version)&0x0ff); + gen_data.append((program_version >> 24) & 0x0ff); + gen_data.append((program_version >> 16) & 0x0ff); + gen_data.append((program_version >> 8) & 0x0ff); + gen_data.append((program_version) & 0x0ff); send_data(HELLO_PC_TO_MCU, gen_data); } - void MainWindow::on_pushButton_emptyFlash_clicked() { - //ui->textEdit_information->append("擦除数据:" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); - //flash F6 01 06 00 00 + // ui->textEdit_information->append("擦除数据:" + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); + // flash F6 01 06 00 00 { QByteArray gen_data; - gen_data.append(1,0x01); - gen_data.append(1,0x06); - gen_data.append(2,0x00); + gen_data.append(1, 0x01); + gen_data.append(1, 0x06); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } - //flash F6 04 D8 00 00 00 + // flash F6 04 D8 00 00 00 { QByteArray gen_data; - gen_data.append(1,0x04); - gen_data.append(1,0xD8); - gen_data.append(3,0x00); + gen_data.append(1, 0x04); + gen_data.append(1, 0xD8); + gen_data.append(3, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } Delay_MSec(30); - //flash F6 01 06 00 00 + // flash F6 01 06 00 00 { QByteArray gen_data; - gen_data.append(1,0x01); - gen_data.append(1,0x06); - gen_data.append(2,0x00); + gen_data.append(1, 0x01); + gen_data.append(1, 0x06); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } - //flash F6 04 D8 01 00 00 + // flash F6 04 D8 01 00 00 { QByteArray gen_data; - gen_data.append(1,0x04); - gen_data.append(1,0xD8); - gen_data.append(1,0x01); - gen_data.append(2,0x00); + gen_data.append(1, 0x04); + gen_data.append(1, 0xD8); + gen_data.append(1, 0x01); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } Delay_MSec(30); - //flash F6 01 06 00 00 + // flash F6 01 06 00 00 { QByteArray gen_data; - gen_data.append(1,0x01); - gen_data.append(1,0x06); - gen_data.append(2,0x00); + gen_data.append(1, 0x01); + gen_data.append(1, 0x06); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } - //flash F6 04 D8 02 00 00 + // flash F6 04 D8 02 00 00 { QByteArray gen_data; - gen_data.append(1,0x04); - gen_data.append(1,0xD8); - gen_data.append(1,0x02); - gen_data.append(2,0x00); + gen_data.append(1, 0x04); + gen_data.append(1, 0xD8); + gen_data.append(1, 0x02); + gen_data.append(2, 0x00); send_data(WRITEN_FLASH_PC_TO_MCU, gen_data); } Delay_MSec(30); ui->textEdit_information->append(QString::fromUtf8(u8"擦除数据:") + QDateTime::currentDateTime().toString("hh:mm:ss.zzz")); } - diff --git a/mainwindow.h b/mainwindow.h index f256e995176b8f9c761e9c6a56a752fda7335bbd..688346c5e914a08f066d209df753eb233bfab25c 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -1,48 +1,47 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include -#include +#include "parsehex.h" +#include "usbthread.h" #include -#include -#include #include -#include +#include +#include +#include #include -#include "usbthread.h" -#include "parsehex.h" +#include /* 指令定义 */ -#define HELLO_PC_TO_MCU 0xA0 -#define HELLO_MCU_TO_PC 0xA1 -#define READ16_IN_PC_TO_MCU 0xC0 -#define READ16_IN_MCU_TO_PC 0xC1 -#define WRITE16_IN_PC_TO_MCU 0xC2 -#define WRITE16_IN_MCU_TO_PC 0xC3 -#define READ32_MCU_PC_TO_MCU 0xC8 -#define READ32_MCU_MCU_TO_PC 0xC9 -#define WRITE32_MCU_PC_TO_MCU 0xCA -#define WRITE32_MCU_MCU_TO_PC 0xCB -#define READ64_MCU_PC_TO_MCU 0xCC -#define READ64_MCU_MCU_TO_PC 0xCD -#define WRITE64_MCU_PC_TO_MCU 0xCE -#define WRITE64_MCU_MCU_TO_PC 0xCF -#define WRITEN_MCU_PC_TO_MCU 0xD0 -#define WRITEN_MCU_MCU_TO_PC 0xD1 -#define WRITEA_FLASH_PC_TO_MCU 0xF2 -#define WRITEN_FLASH_PC_TO_MCU 0xF6 -#define WRITEN_FLASH_MCU_TO_PC 0xF7 -#define READA_FLASH_PC_TO_MCU 0xF8 -#define READA_FLASH_MCU_TO_PC 0xF9 +#define HELLO_PC_TO_MCU 0xA0 +#define HELLO_MCU_TO_PC 0xA1 +#define READ16_IN_PC_TO_MCU 0xC0 +#define READ16_IN_MCU_TO_PC 0xC1 +#define WRITE16_IN_PC_TO_MCU 0xC2 +#define WRITE16_IN_MCU_TO_PC 0xC3 +#define READ32_MCU_PC_TO_MCU 0xC8 +#define READ32_MCU_MCU_TO_PC 0xC9 +#define WRITE32_MCU_PC_TO_MCU 0xCA +#define WRITE32_MCU_MCU_TO_PC 0xCB +#define READ64_MCU_PC_TO_MCU 0xCC +#define READ64_MCU_MCU_TO_PC 0xCD +#define WRITE64_MCU_PC_TO_MCU 0xCE +#define WRITE64_MCU_MCU_TO_PC 0xCF +#define WRITEN_MCU_PC_TO_MCU 0xD0 +#define WRITEN_MCU_MCU_TO_PC 0xD1 +#define WRITEA_FLASH_PC_TO_MCU 0xF2 +#define WRITEN_FLASH_PC_TO_MCU 0xF6 +#define WRITEN_FLASH_MCU_TO_PC 0xF7 +#define READA_FLASH_PC_TO_MCU 0xF8 +#define READA_FLASH_MCU_TO_PC 0xF9 /* 寄存器地址表 */ -#define WADDR_MCU_PC_TO_MCU 0x10 -#define RESET_MCU_MCU_TO_PC 0x90 +#define WADDR_MCU_PC_TO_MCU 0x10 +#define RESET_MCU_MCU_TO_PC 0x90 /* 配置的默认值 */ -#define DEFAULT_VENDOR_ID 0x5131 -#define DEFAULT_PRODUCT_ID 0x2007 +#define DEFAULT_VENDOR_ID 0x5131 +#define DEFAULT_PRODUCT_ID 0x2007 #define DEFAULT_BIN_PACKAGE_SIZE 56 #define DEFAULT_REPORT_ID 0 @@ -50,39 +49,36 @@ #define DEBUG_WRITE_BIN_FILE 1 -namespace InterCommand -{ - enum : int - { - HELLO = 0, - READ16_IN, - WRITE16_IN, - READ32_MCU, - WRITE32_MCU, - READ64_MCU, - WRITE64_MCU, - WRITEN_FLASH, - READA_FLASH, - RESET_MCU - }; +namespace InterCommand { +enum : int { + HELLO = 0, + READ16_IN, + WRITE16_IN, + READ32_MCU, + WRITE32_MCU, + READ64_MCU, + WRITE64_MCU, + WRITEN_FLASH, + READA_FLASH, + RESET_MCU +}; } - - QT_BEGIN_NAMESPACE -namespace Ui { class MainWindow; } +namespace Ui { +class MainWindow; +} QT_END_NAMESPACE -class MainWindow : public QMainWindow -{ +class MainWindow : public QMainWindow { Q_OBJECT public: - MainWindow(QWidget *parent = nullptr); + MainWindow(QWidget* parent = nullptr); ~MainWindow(); protected: - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject* obj, QEvent* event); private slots: void redownload_data(); @@ -101,23 +97,23 @@ private slots: void on_pushButton_emptyFlash_clicked(); private: - void check_data(); + void check_data(); void refreshDPI(); - void changeObjectSize(const QObject &o, double objectRate); + void changeObjectSize(const QObject& o, double objectRate); void download_data(); void Delay_MSec(unsigned int msec); - QByteArray hexStrToByteArray(QString);//transform hex QString to hex QByteArray - void formatString(QString &str, int n, const QChar &ch);//inserte space in every two charater + QByteArray hexStrToByteArray(QString); // transform hex QString to hex QByteArray + void formatString(QString& str, int n, const QChar& ch); // inserte space in every two charater void refresh_button(); - void send_data(uint8_t command, QByteArray & data); - void send_bin_data(uint8_t command, QByteArray & data); - Ui::MainWindow *ui; - USBThread *myusbthread; - QTimer * sender_timer, * systimer; - bool hid_isopen = false, load_bin = false, downloading=false, write_flash=false, write_end_flash=false, checking=false, checking_end=false; - int download_count = 0,download_end_count = 0, check_count = 0; + void send_data(uint8_t command, QByteArray& data); + void send_bin_data(uint8_t command, QByteArray& data); + Ui::MainWindow* ui; + USBThread* myusbthread; + QTimer *sender_timer, *systimer; + bool hid_isopen = false, load_bin = false, downloading = false, write_flash = false, write_end_flash = false, checking = false, checking_end = false; + int download_count = 0, download_end_count = 0, check_count = 0; uint16_t command_num = 0; - QByteArray last_send_data; + QByteArray last_send_data; int repeated_time = 0, repeated_count = 0; ParseHex hex_parser; QList hid_device_list; diff --git a/mainwindow.ui b/mainwindow.ui index 0412e874419505d8d386dd5375a87f1aa3e8f332..9d7dad7eaa8b0f30e93adc24d79846ef2cca90f8 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -1,312 +1,311 @@ - MainWindow - - - - 0 - 0 - 440 - 559 - - - - GX_ISPTool - - - - :/img/favicon.ico:/img/favicon.ico - - - + MainWindow + - - 110 - 10 - 221 - 41 - + + 0 + 0 + 440 + 559 + - - - 14 - 75 - true - + + GX_ISPTool - - + + :/img/favicon.ico:/img/favicon.ico - - 厦门感芯科技有限公司 - - - - - - 240 - 40 - 191 - 41 - - - - - 12 - 75 - true - - - - 下载烧录工具V1.0 - - - - - - 10 - 320 - 421 - 211 - - - - - - - 300 - 141 - 111 - 31 - - - - - 12 - 75 - true - - - - 选择固件文件 - - - - - - 10 - 290 - 51 - 31 - - - - font: 12pt; - - - 信息: - - - - - - 30 - 140 - 261 - 31 - - - - - - - 30 - 90 - 261 - 31 - - - - - - - 10 - 270 - 421 - 21 - - - - - 12 - 9 - false - false - - - - font: 75 12pt; - - - 0 - - - - - - 10 - 235 - 81 - 31 - - - - font: 75 12pt; - - - 下载进度: - - - - - true - - - - 300 - 90 - 111 - 31 - - - - - 12 - 75 - true - - - - 连接下载器 - - - - - - 20 - 180 - 401 - 51 - - - - - - - false - - - - 0 - 31 - - - - font: 75 12pt; - - - 查询设备 - + + + + + 110 + 10 + 221 + 41 + + + + + 14 + 75 + true + + + + + + + 厦门感芯科技有限公司 + + + + + + 240 + 40 + 191 + 41 + + + + + 12 + 75 + true + + + + 下载烧录工具V1.0 + + + + + + 10 + 320 + 421 + 211 + + + + + + + 300 + 141 + 111 + 31 + + + + + 12 + 75 + true + + + + 选择固件文件 + + + + + + 10 + 290 + 51 + 31 + + + + font: 12pt; + + + 信息: + + + + + + 30 + 140 + 261 + 31 + + + + + + + 30 + 90 + 261 + 31 + + + + + + + 10 + 270 + 421 + 21 + + + + + 12 + 9 + false + false + + + + font: 75 12pt; + + + 0 + - - - - - false - - - - 0 - 31 - - - - - 12 - 9 - false - false - - - - font: 75 12pt; - - - 擦除固件 - + + + + 10 + 235 + 81 + 31 + + + + font: 75 12pt; + + + 下载进度: + - - - - - false - - - - 0 - 31 - - - - - 12 - 9 - false - false - - - - font: 75 12pt; - - - 单次运行 - + + + true + + + + 300 + 90 + 111 + 31 + + + + + 12 + 75 + true + + + + 连接下载器 + - - - - - false - - - - 0 - 31 - - - - - 12 - 9 - false - false - - - - font: 75 12pt; - - - 烧录固件 - + + + + 20 + 180 + 401 + 51 + + + + + + + false + + + + 0 + 31 + + + + font: 75 12pt; + + + 查询设备 + + + + + + + false + + + + 0 + 31 + + + + + 12 + 9 + false + false + + + + font: 75 12pt; + + + 擦除固件 + + + + + + + false + + + + 0 + 31 + + + + + 12 + 9 + false + false + + + + font: 75 12pt; + + + 单次运行 + + + + + + + false + + + + 0 + 31 + + + + + 12 + 9 + false + false + + + + font: 75 12pt; + + + 烧录固件 + + + + - - - + + - - - - - - + + + + diff --git a/parsehex.cpp b/parsehex.cpp index c19d1c53a9821c580bc0b60018f75b56a9dd25da..16aed3de1be0c7719c3276be5b3846e7eb1c06d3 100644 --- a/parsehex.cpp +++ b/parsehex.cpp @@ -2,19 +2,19 @@ ParseHex::ParseHex() { - const uchar data_begin[] = {0xff, 0x00, 0xaa, 0x55, 0xcc, 0x00, 0xdd, 0xee}; - flash_data = QByteArray::fromRawData((const char *)data_begin, sizeof(data_begin)); + const uchar data_begin[] = { 0xff, 0x00, 0xaa, 0x55, 0xcc, 0x00, 0xdd, 0xee }; + flash_data = QByteArray::fromRawData((const char*)data_begin, sizeof(data_begin)); flash_data.append(8, 0x0f); - const uchar data_end[] = {0xcc, 0x00, 0xdd, 0xee, 0xff, 0x00, 0xaa, 0x55}; - flash_end_data= QByteArray::fromRawData((const char *)data_end, sizeof(data_end)); + const uchar data_end[] = { 0xcc, 0x00, 0xdd, 0xee, 0xff, 0x00, 0xaa, 0x55 }; + flash_end_data = QByteArray::fromRawData((const char*)data_end, sizeof(data_end)); flash_end_data.append(48, 0xf0); -// const uchar data_begin[] = {0x13, 0x01, 0x00, 0x08}; -// bin_data = QByteArray::fromRawData((const char *)data_begin, sizeof(data_begin)); -// bin_data.append(bin_data); -// bin_data.append(bin_data); -// bin_data.append(bin_data); -// qDebug() << bin_data.toHex(' '); + // const uchar data_begin[] = {0x13, 0x01, 0x00, 0x08}; + // bin_data = QByteArray::fromRawData((const char *)data_begin, sizeof(data_begin)); + // bin_data.append(bin_data); + // bin_data.append(bin_data); + // bin_data.append(bin_data); + // qDebug() << bin_data.toHex(' '); } void ParseHex::clear() @@ -24,252 +24,243 @@ void ParseHex::clear() absoluteAddrLocal = 0x00; bin_data.clear(); flash_data.truncate(16); - //bin_data.truncate(16); + // bin_data.truncate(16); } bool ParseHex::parse(QString fileName) { QByteArray text_hex, data_hex; - if(fileName.isEmpty()) + if (fileName.isEmpty()) return false; QFile hexfile(fileName); - if(!hexfile.open(QIODevice::ReadOnly )) - { + if (!hexfile.open(QIODevice::ReadOnly)) { error_info = "打开文件失败"; return false; } bool parse_hex = false; - text_hex.fill(0x00, 128*1024-16); - while(!hexfile.atEnd()){//循环处理,至hex文件读完 - /*若: alinedata =QByteArray::fromHex(":12345678"); - 则: alinedara ={0x12,0x23,0x45,0x78};*/ - QByteArray alinedata = QByteArray::fromHex(hexfile.readLine());//从hex文件中读取一行 - if(alinedata.isEmpty()) - continue; - char ret = ReadHexLineData(alinedata, text_hex, data_hex);//将一行数据解读到HexDataStr结构体 - if(ret == 2){ - parse_hex = false; - break; - } - else if(ret == 1){ + text_hex.fill(0x00, 128 * 1024 - 16); + while (!hexfile.atEnd()) { // 循环处理,至hex文件读完 + /*若: alinedata =QByteArray::fromHex(":12345678"); + 则: alinedara ={0x12,0x23,0x45,0x78};*/ + QByteArray alinedata = QByteArray::fromHex(hexfile.readLine()); // 从hex文件中读取一行 + if (alinedata.isEmpty()) + continue; + char ret = ReadHexLineData(alinedata, text_hex, data_hex); // 将一行数据解读到HexDataStr结构体 + if (ret == 2) { + parse_hex = false; + break; + } else if (ret == 1) { parse_hex = true; break; - } - else{ - parse_hex = true; - } + } else { + parse_hex = true; + } } hexfile.close(); QFile out3_file("out3_bin.txt"); - out3_file.open(QIODevice::WriteOnly|QIODevice::Text); + out3_file.open(QIODevice::WriteOnly | QIODevice::Text); out3_file.write(text_hex.toHex(' ')); out3_file.close(); bin_data = text_hex; - QByteArray temp(4, 0); - for(int i=0; i < bin_data.size(); i+=8) - { - //12 34 56 78 9a bc de ff - //ff de bc 9a 78 56 34 12 + for (int i = 0; i < bin_data.size(); i += 8) { + // 12 34 56 78 9a bc de ff + // ff de bc 9a 78 56 34 12 temp[0] = bin_data[i]; - temp[1] = bin_data[i+1]; - temp[2] = bin_data[i+2]; - temp[3] = bin_data[i+3]; + temp[1] = bin_data[i + 1]; + temp[2] = bin_data[i + 2]; + temp[3] = bin_data[i + 3]; - bin_data[i] = bin_data[i+7]; - bin_data[i+1] = bin_data[i+6]; - bin_data[i+2] = bin_data[i+5]; - bin_data[i+3] = bin_data[i+4]; + bin_data[i] = bin_data[i + 7]; + bin_data[i + 1] = bin_data[i + 6]; + bin_data[i + 2] = bin_data[i + 5]; + bin_data[i + 3] = bin_data[i + 4]; - bin_data[i+7] = temp[0]; - bin_data[i+6] = temp[1]; - bin_data[i+5] = temp[2]; - bin_data[i+4] = temp[3]; + bin_data[i + 7] = temp[0]; + bin_data[i + 6] = temp[1]; + bin_data[i + 5] = temp[2]; + bin_data[i + 4] = temp[3]; } flash_data.append(bin_data); + // if(parse_hex) + // { + // data_hex = data_hex.right(data_hex.size() - 16); + // qDebug() << "text_hex:" << text_hex.size() << "|data_hex:" << data_hex.size(); + // if(data_hex.size() <= 32*1024) + // { + // if(text_hex.size() > 32*3*1024) + // { + // error_info = "文件超过128K!"; + // return false; + // } + // bin_data.append(text_hex); + // bin_data.append(32*3*1024-text_hex.size(), 0x00); + // bin_data.append(data_hex); + // bin_data.append(32*1024-data_hex.size(), 0x00); + // } + // else if(data_hex.size() <= 32*2*1024) + // { + // if(text_hex.size() > 32*2*1024) + // { + // error_info = "文件超过128K!"; + // return false; + // } + // bin_data.append(text_hex); + // bin_data.append(32*2*1024-text_hex.size(), 0x00); + // bin_data.append(data_hex); + // bin_data.append(32*2*1024-data_hex.size(), 0x00); + // } + // else if(data_hex.size() <= 32*3*1024) + // { + // if(text_hex.size() > 32*1*1024) + // { + // error_info = "文件超过128K!"; + // return false; + // } + // bin_data.append(text_hex); + // bin_data.append(32*1*1024-text_hex.size(), 0x00); + // bin_data.append(data_hex); + // bin_data.append(32*3*1024-data_hex.size(), 0x00); + // } + // else + // { + // error_info = "文件超过128K!"; + // return false; + // } -// if(parse_hex) -// { -// data_hex = data_hex.right(data_hex.size() - 16); -// qDebug() << "text_hex:" << text_hex.size() << "|data_hex:" << data_hex.size(); -// if(data_hex.size() <= 32*1024) -// { -// if(text_hex.size() > 32*3*1024) -// { -// error_info = "文件超过128K!"; -// return false; -// } -// bin_data.append(text_hex); -// bin_data.append(32*3*1024-text_hex.size(), 0x00); -// bin_data.append(data_hex); -// bin_data.append(32*1024-data_hex.size(), 0x00); -// } -// else if(data_hex.size() <= 32*2*1024) -// { -// if(text_hex.size() > 32*2*1024) -// { -// error_info = "文件超过128K!"; -// return false; -// } -// bin_data.append(text_hex); -// bin_data.append(32*2*1024-text_hex.size(), 0x00); -// bin_data.append(data_hex); -// bin_data.append(32*2*1024-data_hex.size(), 0x00); -// } -// else if(data_hex.size() <= 32*3*1024) -// { -// if(text_hex.size() > 32*1*1024) -// { -// error_info = "文件超过128K!"; -// return false; -// } -// bin_data.append(text_hex); -// bin_data.append(32*1*1024-text_hex.size(), 0x00); -// bin_data.append(data_hex); -// bin_data.append(32*3*1024-data_hex.size(), 0x00); -// } -// else -// { -// error_info = "文件超过128K!"; -// return false; -// } - -// QByteArray temp(4, 0); -// bin_data.truncate(128*1024-16); -// for(int i=0; i < bin_data.size(); i+=8) -// { -// //12 34 56 78 9a bc de ff -// //ff de bc 9a 78 56 34 12 -// temp[0] = bin_data[i]; -// temp[1] = bin_data[i+1]; -// temp[2] = bin_data[i+2]; -// temp[3] = bin_data[i+3]; + // QByteArray temp(4, 0); + // bin_data.truncate(128*1024-16); + // for(int i=0; i < bin_data.size(); i+=8) + // { + // //12 34 56 78 9a bc de ff + // //ff de bc 9a 78 56 34 12 + // temp[0] = bin_data[i]; + // temp[1] = bin_data[i+1]; + // temp[2] = bin_data[i+2]; + // temp[3] = bin_data[i+3]; -// bin_data[i] = bin_data[i+7]; -// bin_data[i+1] = bin_data[i+6]; -// bin_data[i+2] = bin_data[i+5]; -// bin_data[i+3] = bin_data[i+4]; + // bin_data[i] = bin_data[i+7]; + // bin_data[i+1] = bin_data[i+6]; + // bin_data[i+2] = bin_data[i+5]; + // bin_data[i+3] = bin_data[i+4]; -// bin_data[i+7] = temp[0]; -// bin_data[i+6] = temp[1]; -// bin_data[i+5] = temp[2]; -// bin_data[i+4] = temp[3]; -// } -// flash_data.append(bin_data); -// } + // bin_data[i+7] = temp[0]; + // bin_data[i+6] = temp[1]; + // bin_data[i+5] = temp[2]; + // bin_data[i+4] = temp[3]; + // } + // flash_data.append(bin_data); + // } return parse_hex; } -char ParseHex::ReadHexLineData(const QByteArray & ba, QByteArray & out, QByteArray & out2)//return 0: ok 1:hex文件结束 2:hex文件有误 +char ParseHex::ReadHexLineData(const QByteArray& ba, QByteArray& out, QByteArray& out2) // return 0: ok 1:hex文件结束 2:hex文件有误 { - HexFormatForLine hex_data; - unsigned char i,checkoutCal=0; + HexFormatForLine hex_data; + unsigned char i, checkoutCal = 0; - //计算校验值 - for(i=0;i < ba.size()-1;i++){ + // 计算校验值 + for (i = 0; i < ba.size() - 1; i++) { checkoutCal += (unsigned char)ba.at(i); - } - checkoutCal = 0x100-checkoutCal; - //获取个部分域的值 - hex_data.datalen =(unsigned char)ba.at(0); - hex_data.addr = ((unsigned char)ba.at(1)<<8)|(unsigned char)ba.at(2); - hex_data.datatype = (unsigned char)ba.at(3); - memset(hex_data.databuf,0,sizeof(hex_data.databuf)); - for(i = 0;idatatype){ - case 0x00://数据记录 - //计算出当前记录的绝对地址 - absoluteAddrCurrent = (ba->addr+ExStageAddr); + switch (ba->datatype) { + case 0x00: // 数据记录 + // 计算出当前记录的绝对地址 + absoluteAddrCurrent = (ba->addr + ExStageAddr); break; - case 0x01://文件结束记录 - return 1; + case 0x01: // 文件结束记录 + return 1; break; - case 0x02://扩展段地址记录 - ExStageAddr = (ba->databuf[0]<<8|ba->databuf[1])<<4; - return 0;//return ok + case 0x02: // 扩展段地址记录 + ExStageAddr = (ba->databuf[0] << 8 | ba->databuf[1]) << 4; + return 0; // return ok break; - case 0x04://扩展线性地址记录 - ExStageAddr = (ba->databuf[0]<<8|ba->databuf[1])<<16; - return 0;//return ok + case 0x04: // 扩展线性地址记录 + ExStageAddr = (ba->databuf[0] << 8 | ba->databuf[1]) << 16; + return 0; // return ok break; - case 0x03://开始段地址记录 - //ExStageAddr = (ba->databuf[0]<<8|ba->databuf[1])<<2; - //ExLineAddr = 0x00; - return 0;//return ok + case 0x03: // 开始段地址记录 + // ExStageAddr = (ba->databuf[0]<<8|ba->databuf[1])<<2; + // ExLineAddr = 0x00; + return 0; // return ok break; - default: - return 2; + default: + return 2; break; } -//out3 should be 128k-16 byte all zreo at initial state; - if(absoluteAddrCurrent >= 0x00018000 && absoluteAddrCurrent < 0x20000000) return 2; - if(absoluteAddrCurrent >= 0x20018000) return 2; - if(absoluteAddrCurrent < 0x00000010) return 2; + // out3 should be 128k-16 byte all zreo at initial state; + if (absoluteAddrCurrent >= 0x00018000 && absoluteAddrCurrent < 0x20000000) + return 2; + if (absoluteAddrCurrent >= 0x20018000) + return 2; + if (absoluteAddrCurrent < 0x00000010) + return 2; - if(absoluteAddrCurrent >= 0x00000010 && absoluteAddrCurrent < 0x00018000) - { - for(unsigned int i = 0;i < ba->datalen;i++){ - out3[absoluteAddrCurrent-0x10+i]=(ba->databuf[i]); + if (absoluteAddrCurrent >= 0x00000010 && absoluteAddrCurrent < 0x00018000) { + for (unsigned int i = 0; i < ba->datalen; i++) { + out3[absoluteAddrCurrent - 0x10 + i] = (ba->databuf[i]); } - if(absoluteAddrCurrent >= 0x00000000 && absoluteAddrCurrent < 0x00008000)absoluteAddrLocal|=0x1; - if(absoluteAddrCurrent >= 0x00008000 && absoluteAddrCurrent < 0x00010000)absoluteAddrLocal|=0x3; - if(absoluteAddrCurrent >= 0x00010000 && absoluteAddrCurrent < 0x00018000)absoluteAddrLocal|=0x7; - } - else if(absoluteAddrCurrent >= 0x20000000 && absoluteAddrCurrent < 0x20008000) - { + if (absoluteAddrCurrent >= 0x00000000 && absoluteAddrCurrent < 0x00008000) + absoluteAddrLocal |= 0x1; + if (absoluteAddrCurrent >= 0x00008000 && absoluteAddrCurrent < 0x00010000) + absoluteAddrLocal |= 0x3; + if (absoluteAddrCurrent >= 0x00010000 && absoluteAddrCurrent < 0x00018000) + absoluteAddrLocal |= 0x7; + } else if (absoluteAddrCurrent >= 0x20000000 && absoluteAddrCurrent < 0x20008000) { - for(unsigned int i = 0;i < ba->datalen;i++){ - out3[absoluteAddrCurrent-0x20000010+0x18000+i]=(ba->databuf[i]); + for (unsigned int i = 0; i < ba->datalen; i++) { + out3[absoluteAddrCurrent - 0x20000010 + 0x18000 + i] = (ba->databuf[i]); } - } - else if(absoluteAddrCurrent >= 0x20008000 && absoluteAddrCurrent < 0x20010000) - { - if(absoluteAddrLocal&0x4) return 2; - for(unsigned int i = 0;i < ba->datalen;i++){ - out3[absoluteAddrCurrent-0x20000010+0x8000+i]=(ba->databuf[i]); + } else if (absoluteAddrCurrent >= 0x20008000 && absoluteAddrCurrent < 0x20010000) { + if (absoluteAddrLocal & 0x4) + return 2; + for (unsigned int i = 0; i < ba->datalen; i++) { + out3[absoluteAddrCurrent - 0x20000010 + 0x8000 + i] = (ba->databuf[i]); } - } - else if(absoluteAddrCurrent >= 0x20010000 && absoluteAddrCurrent < 0x20018000) - { - if(absoluteAddrLocal&0x6) return 2; + } else if (absoluteAddrCurrent >= 0x20010000 && absoluteAddrCurrent < 0x20018000) { + if (absoluteAddrLocal & 0x6) + return 2; - for(unsigned int i = 0;i < ba->datalen;i++){ - out3[absoluteAddrCurrent-0x20000010-0x8000+i]=(ba->databuf[i]); + for (unsigned int i = 0; i < ba->datalen; i++) { + out3[absoluteAddrCurrent - 0x20000010 - 0x8000 + i] = (ba->databuf[i]); } - } - - return 0;//return ok + return 0; // return ok } diff --git a/parsehex.h b/parsehex.h index df4723a192d9de53df6e64fe20f56562f2fbb145..355e548a04c87caae45455ff715520fe79f0b962 100644 --- a/parsehex.h +++ b/parsehex.h @@ -1,20 +1,19 @@ #ifndef PARSEHEX_H #define PARSEHEX_H -#include -#include #include +#include +#include -typedef struct{ +typedef struct { unsigned char datalen; unsigned short addr; unsigned char datatype; unsigned char databuf[16]; unsigned char checkout; -}HexFormatForLine; +} HexFormatForLine; -class ParseHex -{ +class ParseHex { public: ParseHex(); void clear(); @@ -23,13 +22,14 @@ public: QByteArray bin_data; QByteArray flash_data; QByteArray flash_end_data; + private: - char ReadHexLineData(const QByteArray & ba, QByteArray & out, QByteArray & out2);//return 0: ok 1:hex文件结束 2:hex文件有误 - char HexToBin2(HexFormatForLine* ba,QByteArray & out3); + char ReadHexLineData(const QByteArray& ba, QByteArray& out, QByteArray& out2); // return 0: ok 1:hex文件结束 2:hex文件有误 + char HexToBin2(HexFormatForLine* ba, QByteArray& out3); QString fileName; - unsigned int ExStageAddr = 0x00;//扩展段地址 - unsigned int ExLineAddr = 0x00;//扩展线性地址 - unsigned int absoluteAddrLocal = 0x00;//本地记录绝对地址 + unsigned int ExStageAddr = 0x00; // 扩展段地址 + unsigned int ExLineAddr = 0x00; // 扩展线性地址 + unsigned int absoluteAddrLocal = 0x00; // 本地记录绝对地址 }; #endif // PARSEHEX_H diff --git a/qrc.qrc b/qrc.qrc index 912d456407423083380381ab4ab9a5aa98302d1b..b6ff31a4a2ca09733db89cd14bc393067c35bc9b 100644 --- a/qrc.qrc +++ b/qrc.qrc @@ -1,3 +1,4 @@ + favicon.ico diff --git a/usbthread.cpp b/usbthread.cpp index 32fb7ce2e296cf04d52efb7ca168a9e3fc3682b2..040c2dbe1d44a88e7c46caf209ca5a616df20309 100644 --- a/usbthread.cpp +++ b/usbthread.cpp @@ -3,7 +3,8 @@ #include -USBThread::USBThread(QObject *parent) : QThread(parent) +USBThread::USBThread(QObject* parent) + : QThread(parent) { status = USB_DISCONNECT; @@ -13,21 +14,18 @@ USBThread::USBThread(QObject *parent) : QThread(parent) report_id = DEFAULT_REPORT_ID; - hid_init(); // 这一句可要可不要 + hid_init(); // 这一句可要可不要 tick = QDateTime::currentMSecsSinceEpoch(); - - } QList USBThread::get_device_list() { QList hid_device_list; - struct hid_device_info * hid_device_infos = hid_enumerate(vid,pid); - if(hid_device_infos == NULL) + struct hid_device_info* hid_device_infos = hid_enumerate(vid, pid); + if (hid_device_infos == NULL) return hid_device_list; - while(hid_device_infos != NULL) - { + while (hid_device_infos != NULL) { hid_device_list.push_back(HidDeviceInfo(hid_device_infos)); qDebug() << sizeof(hid_device_infos->serial_number); qDebug() << QString::fromWCharArray(hid_device_infos->serial_number); @@ -43,76 +41,74 @@ bool USBThread::open_usb(QString usb_path) status = USB_DISCONNECT; usbthread_handle = hid_open_path(usb_path.toLocal8Bit().constData()); qDebug() << usbthread_handle; - if(usbthread_handle != NULL) - { + if (usbthread_handle != NULL) { status = USB_CONNECT; -// wchar_t wchar_str[64]; -// hid_get_product_string(usbthread_handle,wchar_str,64); -// qDebug()< 0) - { - //qDebug() << "res:" << res; - emit new_data(QByteArray((char *)usb_read_data, res)); - } - else if(res == 0) - { - - } - else - { - // qDebug() << QDateTime::currentMSecsSinceEpoch() - tick; - if(QDateTime::currentMSecsSinceEpoch() - tick < 500 ) - break; - - tick = QDateTime::currentMSecsSinceEpoch(); - wchar_t str[16]; - int res; - res = hid_get_serial_number_string(usbthread_handle,str,16); - qDebug() << "hid_get_serial_number_string:" << res; - if(res == 0) - { - status = USB_DISCONNECT; - emit usb_disconnect(); - } + while (!thread_stop) { + if (!thread_pause) { + switch (status) { + case USB_CONNECT: { + // int res = hid_get_feature_report(usbthread_handle,usb_read_data,USB_MAX_DATA_LENGTH); + int res = hid_read_timeout(usbthread_handle, usb_read_data, USB_MAX_DATA_LENGTH, 2000); + // int res = hid_read(usbthread_handle,usb_read_data,8); + if (res > 0) { + // qDebug() << "res:" << res; + emit new_data(QByteArray((char*)usb_read_data, res)); + } else if (res == 0) { + + } else { + // qDebug() << QDateTime::currentMSecsSinceEpoch() - tick; + if (QDateTime::currentMSecsSinceEpoch() - tick < 500) + break; + + tick = QDateTime::currentMSecsSinceEpoch(); + wchar_t str[16]; + int res; + res = hid_get_serial_number_string(usbthread_handle, str, 16); + qDebug() << "hid_get_serial_number_string:" << res; + if (res == 0) { + status = USB_DISCONNECT; + emit usb_disconnect(); } } - break; - case USB_DISCONNECT: - { - msleep(100); -// /* USB未连接的时候,对实时性要求并不高,避免浪费CPU */ -// if(QDateTime::currentMSecsSinceEpoch() - tick < 500 ) -// break; - -// tick = QDateTime::currentMSecsSinceEpoch(); - -// usbthread_handle = hid_open(vid,pid,NULL); -// if(usbthread_handle != NULL) -// { -// qDebug()<<"USB设备打开成功"; -// status = USB_CONNECT; - -// wchar_t wchar_str[64]; -// hid_get_product_string(usbthread_handle,wchar_str,64); -// qDebug()< -#include -#include #include -#include +#include #include +#include +#include +#include extern quint32 program_version; @@ -14,10 +14,10 @@ extern quint32 program_version; #define USB_MAX_DATA_LENGTH 64 -typedef enum {USB_CONNECT=0,USB_DISCONNECT}_USB_STATUS; +typedef enum { USB_CONNECT = 0, + USB_DISCONNECT } _USB_STATUS; -struct HidDeviceInfo -{ +struct HidDeviceInfo { HidDeviceInfo(hid_device_info* info) { path = QString::fromLocal8Bit(info->path); @@ -34,52 +34,50 @@ struct HidDeviceInfo friend QDebug& operator<<(QDebug out, const HidDeviceInfo& info) { - out << info.path << "|" << info.serialNum< get_device_list(); - //QList hid_device_list; + // QList hid_device_list; unsigned short vid; unsigned short pid; @@ -89,18 +87,16 @@ public: bool open_usb(QString usb_path); - void send_data(const QByteArray & data); //向USB发送数据 + void send_data(const QByteArray& data); // 向USB发送数据 _USB_STATUS get_usbstatus(); signals: - void new_data(const QByteArray); //收到新数据 + void new_data(const QByteArray); // 收到新数据 void usb_connect(QString dev_str); void usb_disconnect(); void usb_send_error(); - - }; #endif // USBTHREAD_H