コード例 #1
0
        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();
        }
コード例 #2
0
        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();
        }