private void EraseDeploymentSectors(string devicePath, Firmware upgradeFirmware) { STDfuDevice device = new STDfuDevice(devicePath); // TODO: make sure we are in DFU mode; if we are in app mode (runtime) then we need to detach and re-enumerate. // get our total deployment sectors count List <uint> allSectorBaseAddresses = new List <uint>(); foreach (Firmware.FirmwareRegion region in upgradeFirmware.FirmwareRegions) { if (region.Name.ToUpper() == "DEPLOYMENT") { allSectorBaseAddresses.AddRange(region.SectorBaseAddresses); } } // erase each sector for (int iSector = 0; iSector < allSectorBaseAddresses.Count; iSector++) { if (!device.EraseSector(allSectorBaseAddresses[iSector])) { throw new Exception("Could not erase sector."); } _updateWorker.ReportProgress((int)((((double)iSector + 1) / (double)allSectorBaseAddresses.Count) * 100)); } //// step 4: restart board //device.SetAddressPointer(0x08000001); // NOTE: for thumb2 instructinos, we added 1 to the "base address". Otherwise our board will not restart properly. //// leave DFU mode. //device.LeaveDfuMode(); }
private void EraseAndUploadDevice(string devicePath, Firmware upgradeFirmware, double startProgressPercent, double operationTotalProgressPercent) { double localProgressPercent = 0.0; STDfuDevice device = new STDfuDevice(devicePath); // TODO: make sure we are in DFU mode; if we are in app mode (runtime) then we need to detach and re-enumerate. // get our total sectors and block counts List <uint> allSectorBaseAddresses = new List <uint>(); uint totalBlockCount = 0; foreach (Firmware.FirmwareRegion region in upgradeFirmware.FirmwareRegions) { allSectorBaseAddresses.AddRange(region.SectorBaseAddresses); if (region.Filename != null) { System.IO.StreamReader streamReader = new System.IO.StreamReader(upgradeFirmware.FolderPath + "\\" + region.Filename); string hexFileString = streamReader.ReadToEnd(); streamReader.Dispose(); byte[] hexFileBytes = SrecHexEncoding.GetBytes(hexFileString, region.BaseAddress); totalBlockCount += (uint)Math.Ceiling((double)hexFileBytes.Length / (double)device.BlockTransferSize); } } // erase each sector for (int iSector = 0; iSector < allSectorBaseAddresses.Count; iSector++) { if (!device.EraseSector(allSectorBaseAddresses[iSector])) { throw new Exception("Could not erase sector."); } localProgressPercent = (((double)iSector + 1) / (double)allSectorBaseAddresses.Count) * 0.5; _updateWorker.ReportProgress(CalculateWorkerProgress(localProgressPercent, startProgressPercent, operationTotalProgressPercent)); } // do "read unprotect" //Debug.Print("Unprotecting all sectors, erasing..."); //Debug.Print("operation " + (stdfuDeviceReadUnprotect() ? "SUCCESS" : "FAILED")); //// do mass erase //Debug.Print("erasing all sectors..."); //Debug.Print("operation " + (device.EraseAllSectors() ? "SUCCESS" : "FAILED")); //localProgressPercent = 0.3; // now flash the board! ushort blockSize = device.BlockTransferSize; ushort completedBlocks = 0; foreach (Firmware.FirmwareRegion region in upgradeFirmware.FirmwareRegions) { if (region.Filename != null) { System.IO.StreamReader streamReader = new System.IO.StreamReader(upgradeFirmware.FolderPath + "\\" + region.Filename); string hexFileString = streamReader.ReadToEnd(); streamReader.Dispose(); byte[] hexFileBytes = SrecHexEncoding.GetBytes(hexFileString, region.BaseAddress); // set our download address pointer if (device.SetAddressPointer(region.BaseAddress) == false) { throw new Exception("Could not set base address for flash operation."); } // write blocks to the board and verify; we must have already erased our sectors before this point for (ushort index = 0; index <= (hexFileBytes.Length / blockSize); index++) { // write block to the board byte[] buffer = new byte[Math.Min(hexFileBytes.Length - (index * blockSize), blockSize)]; Array.Copy(hexFileBytes, index * blockSize, buffer, 0, buffer.Length); bool success = device.WriteMemoryBlock(index, buffer); if (!success) { throw new Exception("Write failed."); } // verify written block byte[] verifyBuffer = new byte[buffer.Length]; success = device.ReadMemoryBlock(index, verifyBuffer); if (!success || !buffer.SequenceEqual(verifyBuffer)) { throw new Exception("Verify failed."); } completedBlocks++; localProgressPercent = 0.5 + (((double)(completedBlocks + 1) / (double)totalBlockCount) * 0.5); _updateWorker.ReportProgress(CalculateWorkerProgress(localProgressPercent, startProgressPercent, operationTotalProgressPercent)); } } } // step 4: restart board device.SetAddressPointer(0x08000001); // NOTE: for thumb2 instructinos, we added 1 to the "base address". Otherwise our board will not restart properly. // leave DFU mode. device.LeaveDfuMode(); }