@@ -25,6 +25,7 @@ Programmer::Programmer(QObject *parent) : QObject(parent)
2525 skipBB = true ;
2626 incSpare = false ;
2727 isConn = false ;
28+ firmwareBuffer = nullptr ;
2829 QObject::connect (&reader, SIGNAL (log (QtMsgType, QString)), this ,
2930 SLOT (logCb (QtMsgType, QString)));
3031 QObject::connect (&writer, SIGNAL (log (QtMsgType, QString)), this ,
@@ -260,7 +261,7 @@ void Programmer::writeChip(uint8_t *buf, uint32_t addr, uint32_t len,
260261 SLOT (writeProgressCb (unsigned int )));
261262
262263 writer.init (usbDevName, SERIAL_PORT_SPEED, buf, addr, len, pageSize,
263- skipBB, incSpare);
264+ skipBB, incSpare, CMD_NAND_WRITE_S, CMD_NAND_WRITE_D, CMD_NAND_WRITE_E );
264265 writer.start ();
265266}
266267
@@ -378,4 +379,153 @@ QString Programmer::fwVersionToString(FwVersion fwVersion)
378379 arg (fwVersion.minor ).arg (fwVersion.build );
379380}
380381
382+ int Programmer::firmwareImageRead ()
383+ {
384+ qint64 ret, fileSize;
385+ uint32_t updateImageSize, updateImageOffset;
386+
387+ QFile file (firmwareFileName);
388+ if (!file.open (QIODevice::ReadOnly))
389+ {
390+ qCritical () << " Failed to open file:" << firmwareFileName <<
391+ " , error:" << file.errorString ();
392+ goto Error;
393+ }
394+
395+ fileSize = file.size ();
396+ if (fileSize != (firmwareImage[FIRMWARE_IMAGE_LAST - 1 ].offset +
397+ firmwareImage[FIRMWARE_IMAGE_LAST - 1 ].size ))
398+ {
399+ qCritical () << " Firmware image " << firmwareFileName <<
400+ " size " << fileSize << " is invalid, expected " << 256 * 1024 ;
401+ goto Error;
402+ }
403+
404+ updateImage = activeImage == FIRMWARE_IMAGE_1 ? FIRMWARE_IMAGE_2 :
405+ FIRMWARE_IMAGE_1;
406+ updateImageSize = firmwareImage[updateImage].size ;
407+ updateImageOffset = firmwareImage[updateImage].offset ;
408+ if (!(firmwareBuffer = new (std::nothrow) char [updateImageSize]))
409+ {
410+ qCritical () << " Failed to allocate memory for firmware image " <<
411+ firmwareFileName;
412+ goto Error;
413+ }
414+
415+ if (!file.seek (updateImageOffset))
416+ {
417+ qCritical () << " Failed to seek firmware image " << firmwareFileName;
418+ goto Error;
419+ }
420+
421+ if ((ret = file.read (firmwareBuffer, updateImageSize)) < 0 )
422+ {
423+ qCritical () << " Failed to read firmware image " << firmwareFileName <<
424+ " , error:" << file.errorString ();
425+ goto Error;
426+ }
427+
428+ if (ret != updateImageSize)
429+ {
430+ qCritical () << " Firmware image " << firmwareFileName <<
431+ " was partially read, length" << ret;
432+ goto Error;
433+ }
434+
435+ return 0 ;
436+
437+ Error:
438+ if (firmwareBuffer)
439+ {
440+ delete [] firmwareBuffer;
441+ firmwareBuffer = nullptr ;
442+ }
443+ emit firmwareUpdateCompleted (-1 );
444+ return -1 ;
445+ }
446+
447+ void Programmer::firmwareUpdateProgressCb (unsigned int progress)
448+ {
449+ emit firmwareUpdateProgress (progress);
450+ }
451+
452+ void Programmer::firmwareUpdateCb (int ret)
453+ {
454+ QObject::disconnect (&writer, SIGNAL (progress (unsigned int )), this ,
455+ SLOT (firmwareUpdateProgressCb (unsigned int )));
456+ QObject::disconnect (&writer, SIGNAL (result (int )), this ,
457+ SLOT (firmwareUpdateCb (int )));
458+
459+ delete [] firmwareBuffer;
460+ firmwareBuffer = nullptr ;
461+
462+ emit firmwareUpdateCompleted (ret);
463+ }
464+
465+ void Programmer::firmwareUpdateStart ()
466+ {
467+ if (firmwareImageRead ())
468+ {
469+ emit firmwareUpdateCompleted (-1 );
470+ return ;
471+ }
472+
473+ QObject::connect (&writer, SIGNAL (result (int )), this ,
474+ SLOT (firmwareUpdateCb (int )));
475+ QObject::connect (&writer, SIGNAL (progress (unsigned int )), this ,
476+ SLOT (firmwareUpdateProgressCb (unsigned int )));
477+
478+ writer.init (usbDevName, SERIAL_PORT_SPEED,
479+ reinterpret_cast <uint8_t *>(firmwareBuffer),
480+ firmwareImage[updateImage].address , firmwareImage[updateImage].size ,
481+ flashPageSize, 0 , 0 , CMD_FW_UPDATE_S, CMD_FW_UPDATE_D, CMD_FW_UPDATE_E);
482+ writer.start ();
483+ }
484+
485+ void Programmer::getActiveImageCb (int ret)
486+ {
487+ QObject::disconnect (&reader, SIGNAL (result (int )), this ,
488+ SLOT (getActiveImageCb (int )));
489+
490+ if (ret < 0 )
491+ {
492+ qCritical () << " Failed to get active firmware image" ;
493+ goto Error;
494+ }
495+
496+ if (activeImage >= FIRMWARE_IMAGE_LAST)
497+ {
498+ qCritical () << " Wrong active firmware image: " << activeImage;
499+ goto Error;
500+ }
501+
502+ qInfo () << " Active firmware image: " << activeImage;
503+
504+ firmwareUpdateStart ();
505+ return ;
506+
507+ Error:
508+ emit firmwareUpdateCompleted (-1 );
509+ }
510+
511+ void Programmer::firmwareUpdate (const QString &fileName)
512+ {
513+ Cmd cmd;
514+
515+ firmwareFileName = fileName;
516+
517+ QObject::connect (&reader, SIGNAL (result (int )), this ,
518+ SLOT (getActiveImageCb (int )));
519+
520+ cmd.code = CMD_ACTIVE_IMAGE_GET;
521+
522+ writeData.clear ();
523+ writeData.append (reinterpret_cast <const char *>(&cmd), sizeof (cmd));
524+ reader.init (usbDevName, SERIAL_PORT_SPEED, &activeImage,
525+ sizeof (activeImage),
526+ reinterpret_cast <const uint8_t *>(writeData.constData ()),
527+ static_cast <uint32_t >(writeData.size ()), false , false );
528+ reader.start ();
529+ }
530+
381531
0 commit comments