static void Main(string[] args) { Console.WriteLine("SmartTable bootloader C&C software by Tomasz Jaworski"); random = new Random(); MemoryMap fw = new MemoryMap(32 * 1024 - 2 * 1024); IntelHEX16Storage st = new IntelHEX16Storage(fw); st.Load(@"d:\SystemDocuments\SmartTableDriver\SmartTableFirmware\Debug\SmartTableFirmware.hex"); int pos1 = fw.FindSequence(new byte[] { 0xaa, 0x11, 0x0d, 0x4d }); int pos2 = fw.FindSequence(new byte[] { 0x75, 0x87, 0x60, 0x64 }); Debug.Assert(pos2 == pos1 + 5); fw.Dump("test.txt"); AVRBootloaderCnC cnc = new AVRBootloaderCnC(); cnc.SendAdvertisementToEveryDetectedPort(); cnc.AcquireBootloaderDevices(0x20); // show found devices cnc.ShowDevices(); Console.WriteLine("Reading bootloader version and signature"); foreach (Device dev in cnc.Devices) { // read bootloader version and timestamp string ver = ""; cnc.ReadVersion(dev, ref ver); // read CPU signature byte[] bsig = null; cnc.ReadSignature(dev, out bsig); } Console.WriteLine("Writing firmare..."); foreach (Device dev in cnc.Devices) { // preapre modified firmare fw.Write((uint)pos1 + 4, (byte)dev.address); cnc.WriteFLASH(dev, fw); cnc.VerifyFLASH(dev, fw); } foreach (Device dev in cnc.Devices) { cnc.Reset(dev); } }
public void ReadEEPROM(BootloaderClient endpoint, MemoryMap dest) { Console.CursorVisible = false; Console.Write(" Reading EEPROM memory ({0}kB): ", dest.Size / 1024); ConsoleProgressBar cpb = new ConsoleProgressBar(0, dest.Size); for (uint addr = 0; addr < dest.Size; addr += 128, cpb.Progress = addr) { Message msg_readpage = new Message(endpoint.BootloaderAddress, MessageType.ReadEepromPage, new byte[] { (byte)(addr & 0xFF), (byte)(addr >> 8), }); Message response = SendAndWaitForResponse(endpoint, msg_readpage, 2000); dest.Write(addr, response.Payload, 0, 128); } Console.CursorVisible = true; Console.WriteLine("Done."); }
public bool VerifyEEPROM(BootloaderClient endpoint, MemoryMap expected) { Console.CursorVisible = false; Console.Write(" Verifying EEPROM memory ({0}kB): ", expected.Size / 1024); ConsoleProgressBar cpb = new ConsoleProgressBar(0, expected.Size); MemoryMap mmread = new MemoryMap(expected.Size); for (uint addr = 0; addr < expected.Size; addr += 128, cpb.Progress = addr) { Message msg_readpage = new Message(endpoint.BootloaderAddress, MessageType.ReadEepromPage, new byte[] { (byte)(addr & 0xFF), (byte)(addr >> 8), }); Message response = SendAndWaitForResponse(endpoint, msg_readpage, 2000); mmread.Write(addr, response.Payload, 0, 128); } UInt32 difference_address = 0; bool result = expected.BinaryCompare(mmread, ref difference_address); Console.CursorVisible = true; if (result) { Console.WriteLine("Correct."); } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Failed."); Console.ForegroundColor = ConsoleColor.Gray; byte expected_byte = expected.ReadByte(difference_address); byte existing_byte = mmread.ReadByte(difference_address); throw new MemoryVerificationException("FLASH", difference_address, expected_byte, existing_byte); } return(result); }