diff options
author | JF <jf@codingfield.com> | 2020-05-24 09:15:59 +0200 |
---|---|---|
committer | JF <jf@codingfield.com> | 2020-05-24 09:15:59 +0200 |
commit | 3cc76d7673f6a3b8b5253d04b358b440e550fdb4 (patch) | |
tree | d21c4e3b54e13bdc9fdeaa28a2a5b8c8081f9f18 /src/Components/Ble/DfuService.cpp | |
parent | ce328636935dbc580aad1245fdaff54d6ba947a3 (diff) |
Working demo of OTA using MCUBoot https://github.com/lupyuen/pinetime-rust-mynewt/releases/tag/v4.1.4
Diffstat (limited to 'src/Components/Ble/DfuService.cpp')
-rw-r--r-- | src/Components/Ble/DfuService.cpp | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/src/Components/Ble/DfuService.cpp b/src/Components/Ble/DfuService.cpp index e7b4c5f4..de525321 100644 --- a/src/Components/Ble/DfuService.cpp +++ b/src/Components/Ble/DfuService.cpp @@ -107,7 +107,7 @@ int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf *om) { bleController.FirmwareUpdateTotalBytes(applicationSize); NRF_LOG_INFO("[DFU] -> Start data received : SD size : %d, BT size : %d, app size : %d", softdeviceSize, bootloaderSize, applicationSize); - for(int erased = 0; erased < applicationSize; erased += 0x1000) { + for(int erased = 0; erased < maxImageSize; erased += 0x1000) { #if 1 spiNorFlash.SectorErase(writeOffset + erased); @@ -159,7 +159,7 @@ int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf *om) { bytesReceived += om->om_len; bleController.FirmwareUpdateCurrentBytes(bytesReceived); - NRF_LOG_INFO("[DFU] -> Bytes received : %d in %d packets", bytesReceived, nbPacketReceived); + //NRF_LOG_INFO("[DFU] -> Bytes received : %d in %d packets", bytesReceived, nbPacketReceived); @@ -170,6 +170,16 @@ int DfuService::WritePacketHandler(uint16_t connectionHandle, os_mbuf *om) { SendNotification(connectionHandle, data, 5); } if(bytesReceived == applicationSize) { + if((nbPacketReceived % nbPacketsToNotify) != 0) { + auto remaningPacket = nbPacketReceived % nbPacketsToNotify; + uint32_t spiOffset = writeOffset + ((nbPacketReceived-remaningPacket)*20); + + spiNorFlash.Write(writeOffset + ((nbPacketReceived-remaningPacket)*20), tempBuffer, remaningPacket * 20); + } + if(applicationSize < maxImageSize) { + WriteMagicNumber(); + } + uint8_t data[3]{static_cast<uint8_t>(Opcodes::Response), static_cast<uint8_t>(Opcodes::ReceiveFirmwareImage), static_cast<uint8_t>(ErrorCodes::NoError)}; @@ -304,14 +314,27 @@ void DfuService::Validate() { while(currentOffset < applicationSize) { uint32_t readSize = (applicationSize - currentOffset) > chunkSize ? chunkSize : (applicationSize - currentOffset); - spiNorFlash.Read(writeOffset + currentOffset, tempBuffer, chunkSize); + spiNorFlash.Read(writeOffset + currentOffset, tempBuffer, readSize); if(first) { - crc = ComputeCrc(tempBuffer, chunkSize, NULL); + crc = ComputeCrc(tempBuffer, readSize, NULL); first = false; } else - crc = ComputeCrc(tempBuffer, chunkSize, &crc); + crc = ComputeCrc(tempBuffer, readSize, &crc); currentOffset += readSize; } + NRF_LOG_INFO("CRC : %u", crc); } + +void DfuService::WriteMagicNumber() { + uint32_t magic[4] = { + 0xf395c277, + 0x7fefd260, + 0x0f505235, + 0x8079b62c, + }; + + uint32_t offset = writeOffset + (maxImageSize - (4 * sizeof(uint32_t))); + spiNorFlash.Write(offset, reinterpret_cast<uint8_t *>(magic), 4 * sizeof(uint32_t)); +} |