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 }
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 } }
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); }
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); } }
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"); }
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); } } }
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()); } }
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()); } }
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); } }
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); }