Example #1
0
        public void WriteOptionBytes(int options) //throws Exception
        {
            DfuStatus dfuStatus = new DfuStatus();

            do
            {
                ClearStatus();
                GetStatus(dfuStatus);
            } while (dfuStatus.bState != STATE_DFU_IDLE);

            SetAddressPointer(mOptionByteStartAddress);
            GetStatus(dfuStatus);
            GetStatus(dfuStatus);
            if (dfuStatus.bState == STATE_DFU_ERROR)
            {
                throw new Exception("Option Byte Start address not supported");
            }

            Console.WriteLine(TAG, "writing options: 0x" + options.ToString("X2")); // Integer.toHexString(options));

            byte[] buffer = new byte[2];
            buffer[0] = (byte)(options & 0xFF);
            buffer[1] = (byte)((options >> 8) & 0xFF);
            Download(buffer);
            GetStatus(dfuStatus);       // device will reset
        }
Example #2
0
        private void Detach(int Address) //throws Exception
        {
            DfuStatus dfuStatus = new DfuStatus();

            GetStatus(dfuStatus);
            while (dfuStatus.bState != STATE_DFU_IDLE)
            {
                ClearStatus();
                GetStatus(dfuStatus);
            }
            // Set the command pointer to the new application base address
            SetAddressPointer(Address);
            GetStatus(dfuStatus);
            while (dfuStatus.bState != STATE_DFU_IDLE)
            {
                ClearStatus();
                GetStatus(dfuStatus);
            }
            // Issue the DFU detach command
            LeaveDfu();
            try
            {
                GetStatus(dfuStatus);
                ClearStatus();
                GetStatus(dfuStatus);
            }
            catch (Exception)
            {
                // if caught, ignore since device might have disconnected already
            }
        }
Example #3
0
        private bool IsDeviceProtected() //throws Exception
        {
            DfuStatus dfuStatus   = new DfuStatus();
            bool      isProtected = false;

            do
            {
                ClearStatus();
                GetStatus(dfuStatus);
            } while (dfuStatus.bState != STATE_DFU_IDLE);

            SetAddressPointer(mInternalFlashStartAddress);
            GetStatus(dfuStatus); // to execute
            GetStatus(dfuStatus); // to verify

            if (dfuStatus.bState == STATE_DFU_ERROR)
            {
                isProtected = true;
            }
            while (dfuStatus.bState != STATE_DFU_IDLE)
            {
                ClearStatus();
                GetStatus(dfuStatus);
            }
            return(isProtected);
        }
Example #4
0
        private void ReadDeviceFeature(byte[] configBytes) //throws Exception
        {
            DfuStatus dfuStatus = new DfuStatus();

            do
            {
                ClearStatus();
                GetStatus(dfuStatus);
            } while (dfuStatus.bState != STATE_DFU_IDLE);

            SetAddressPointer(0xFFFF0000);
            GetStatus(dfuStatus);

            GetStatus(dfuStatus);
            if (dfuStatus.bState == STATE_DFU_ERROR)
            {
                throw new Exception("Fast Operations not supported");
            }

            while (dfuStatus.bState != STATE_DFU_IDLE)
            {
                ClearStatus();
                GetStatus(dfuStatus);
            }

            Upload(configBytes, configBytes.Length, 2);
            GetStatus(dfuStatus);

            while (dfuStatus.bState != STATE_DFU_IDLE)
            {
                ClearStatus();
                GetStatus(dfuStatus);
            }
        }
Example #5
0
        private void RemoveReadProtection() //throws Exception
        {
            DfuStatus dfuStatus = new DfuStatus();

            UnProtectCommand();
            GetStatus(dfuStatus);
            if (dfuStatus.bState != STATE_DFU_DOWNLOAD_BUSY)
            {
                throw new Exception("Failed to execute unprotect command");
            }
            usb.Close(); // Release();     // XXX device will self-reset
            Console.WriteLine(TAG, "USB was released");
        }
Example #6
0
        private void ReadImage(byte[] deviceFw) //throws Exception
        {
            DfuStatus dfuStatus    = new DfuStatus();
            int       maxBlockSize = dfuFile.maxBlockSize;
            int       startAddress = dfuFile.elementStartAddress;

            byte[] block = new byte[maxBlockSize];
            int    nBlock;
            int    remLength   = deviceFw.Length;
            int    numOfBlocks = remLength / maxBlockSize;

            do
            {
                ClearStatus();
                GetStatus(dfuStatus);
            } while (dfuStatus.bState != STATE_DFU_IDLE);

            SetAddressPointer(startAddress);
            GetStatus(dfuStatus);   // to execute
            GetStatus(dfuStatus);   //to verify
            if (dfuStatus.bState == STATE_DFU_ERROR)
            {
                throw new Exception("Start address not supported");
            }


            // will read full and last partial blocks ( NOTE: last partial block will be read with maxkblocksize)
            for (nBlock = 0; nBlock <= numOfBlocks; nBlock++)
            {
                while (dfuStatus.bState != STATE_DFU_IDLE)
                {        // todo if fails, maybe stop reading
                    ClearStatus();
                    GetStatus(dfuStatus);
                }
                Upload(block, maxBlockSize, nBlock + 2);
                GetStatus(dfuStatus);

                if (remLength >= maxBlockSize)
                {
                    remLength -= maxBlockSize;
                    System.Array.Copy(block, 0, deviceFw, (nBlock * maxBlockSize), maxBlockSize);
                }
                else
                {
                    System.Array.Copy(block, 0, deviceFw, (nBlock * maxBlockSize), remLength);
                }
            }
        }
Example #7
0
        public void FastOperations()
        {
            if (!IsUsbConnected())
            {
                return;
            }

            DfuStatus dfuStatus = new DfuStatus();

            byte[] configBytes = new byte[4];

            try
            {
                if (IsDeviceProtected())
                {
                    OnStatusMsg("Device is Read-Protected...First Mass Erase");
                    return;
                }

                ReadDeviceFeature(configBytes);

                if (configBytes[0] != 0x03)
                {
                    configBytes[0] = 0x03;

                    Download(configBytes, 2);
                    GetStatus(dfuStatus);

                    GetStatus(dfuStatus);
                    while (dfuStatus.bState != STATE_DFU_IDLE)
                    {
                        ClearStatus();
                        GetStatus(dfuStatus);
                    }
                    OnStatusMsg("Fast Operations set (Parallelism x32)");
                }
                else
                {
                    OnStatusMsg("Fast Operations was already set (Parallelism x32)");
                }
            }
            catch (Exception e)
            {
                OnStatusMsg(e.ToString());
            }
        }
Example #8
0
        public void MassErase()
        {
            if (!IsUsbConnected())
            {
                return;
            }

            DfuStatus dfuStatus = new DfuStatus();
            DateTime  startTime = DateTime.UtcNow; // long startTime = System.currentTimeMillis();  // note current time

            try
            {
                do
                {
                    ClearStatus();
                    GetStatus(dfuStatus);
                } while (dfuStatus.bState != STATE_DFU_IDLE);

                if (IsDeviceProtected())
                {
                    RemoveReadProtection();
                    OnStatusMsg("Read Protection removed. Device resets...Wait until it   re-enumerates "); // XXX This will reset the device
                    return;
                }

                MassEraseCommand();                        // sent erase command request
                GetStatus(dfuStatus);                      // initiate erase command, returns 'download busy' even if invalid address or ROP
                int pollingTime = dfuStatus.bwPollTimeout; // note requested waiting time
                do
                {
                    /* wait specified time before next getStatus call */
                    Thread.Sleep(pollingTime);
                    ClearStatus();
                    GetStatus(dfuStatus);
                } while (dfuStatus.bState != STATE_DFU_IDLE);
                OnStatusMsg("Mass erase completed in " + DateTime.UtcNow.Subtract(startTime).TotalMilliseconds + " ms"); //(System.currentTimeMillis() - startTime) + " ms");
            }
            //catch (InterruptedException e)
            //{
            //    e.printStackTrace();
            //}
            catch (Exception e)
            {
                OnStatusMsg(e.ToString());
            }
        }
Example #9
0
        private void WriteBlock(int address, byte[] block, int blockNumber) //throws Exception
        {
            DfuStatus dfuStatus = new DfuStatus();

            do
            {
                ClearStatus();
                GetStatus(dfuStatus);
            } while (dfuStatus.bState != STATE_DFU_IDLE);

            if (0 == blockNumber)
            {
                SetAddressPointer(address);
                GetStatus(dfuStatus);
                GetStatus(dfuStatus);
                if (dfuStatus.bState == STATE_DFU_ERROR)
                {
                    throw new Exception("Start address not supported");
                }
            }

            do
            {
                ClearStatus();
                GetStatus(dfuStatus);
            } while (dfuStatus.bState != STATE_DFU_IDLE);

            Download(block, (blockNumber + 2));
            GetStatus(dfuStatus);   // to execute
            if (dfuStatus.bState != STATE_DFU_DOWNLOAD_BUSY)
            {
                throw new Exception("error when downloading, was not busy ");
            }
            GetStatus(dfuStatus);   // to verify action
            if (dfuStatus.bState == STATE_DFU_ERROR)
            {
                throw new Exception("error when downloading, did not perform action");
            }

            while (dfuStatus.bState != STATE_DFU_IDLE)
            {
                ClearStatus();
                GetStatus(dfuStatus);
            }
        }
Example #10
0
        private void GetStatus(DfuStatus status) //throws Exception
        {
            byte[] buffer = new byte[6];
            //int length = usb.controlTransfer(DFU_RequestType | USB_DIR_IN, DFU_GETSTATUS, 0, 0, buffer, 6, 500);
            LibUsbDotNet.Main.UsbSetupPacket setup = new LibUsbDotNet.Main.UsbSetupPacket()
            {
                RequestType = (byte)(DFU_RequestType | USB_DIR_IN),
                Request     = (byte)DFU_GETSTATUS,
                Value       = 0,
                Index       = 0
            };
            int length = usb.ControlTransfer(setup, buffer, 0, 6);

            if (length < 0)
            {
                throw new Exception("USB Failed during getStatus");
            }
            status.bStatus        = buffer[0]; // state during request
            status.bState         = buffer[4]; // state after request
            status.bwPollTimeout  = (buffer[3] & 0xFF) << 16;
            status.bwPollTimeout |= (buffer[2] & 0xFF) << 8;
            status.bwPollTimeout |= (buffer[1] & 0xFF);
        }