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); } }
static void Main(string[] args) { ShowIntro(); random = new Random(); BootloaderJobsLoader btp = new BootloaderJobsLoader(); Console.WriteLine($"Reading task file..."); try { btp.LoadTasks("bootloader_tasks_real.json"); } catch (Exception ex) { ColorConsole.WriteLine(ConsoleColor.Red, "Error druing reading: " + ex.Message); } // Find highest bootloader id byte[] addresses_to_check = btp.Jobs.Where(x => x.BootloaderID.HasValue).Select(x => x.BootloaderID.Value).Distinct().ToArray(); // Show some summary Console.WriteLine($"Task summary:"); Console.WriteLine($" Found {btp.Count} task(s)."); Console.WriteLine($" Highest bootloader ID: 0x{addresses_to_check.Max():X2}"); Console.WriteLine($" Unique bootloaders (by ID): {btp.Jobs.Select(x => x.BootloaderID).Where(x => x.HasValue).Distinct().Count()}"); Console.WriteLine($" Unique bootloaders: {string.Join(",", addresses_to_check.Select(x => "0x" + x.ToString("X2")).Distinct())}"); // // Wait for all serial ports to be connected and identified AVRBootloaderCnC cnc = new AVRBootloaderCnC(); cnc.SendAdvertisementToEveryDetectedPort(); // Scan all available serial ports for bootloaders cnc.AcquireBootloaderDevicesInParallel(addresses_to_check); // show found devices cnc.ShowDevices(); for (int job_index = 0; job_index < btp.Count; job_index++) { JobEntry job_entry = btp.Jobs[job_index]; JobTypeDescriptor job_type_descriptor = JobTypeDescriptorCollection.GetDescriptor(job_entry.JobType); ColorConsole.WriteLine(ConsoleColor.Cyan, $"Running task {job_index}: {job_entry.JobType} for device {job_entry.CPU} ID={job_entry.BootloaderID:X2}..."); // Get the device BootloaderClient device = cnc.Devices.Where(x => x.BootloaderAddress == job_entry.BootloaderID).FirstOrDefault(); if (device == null && job_type_descriptor.IsPhysicalDeviceNeeded) { ColorConsole.WriteLine(ConsoleColor.Yellow, " No proper device found."); continue; } if (job_entry.JobType == JobType.ReadEepromMemory) { MemoryMap mm = new MemoryMap(job_entry.ProgrammableMemorySize); cnc.ReadEEPROM(device, mm); IntelHEX16Storage storage = new IntelHEX16Storage(mm); storage.Save(job_entry.FileName); } if (job_entry.JobType == JobType.ReadFlashMemory) { MemoryMap mm = new MemoryMap(job_entry.ProgrammableMemorySize); cnc.ReadFLASH(device, mm); IntelHEX16Storage storage = new IntelHEX16Storage(mm); storage.Save(job_entry.FileName); } if (job_entry.JobType == JobType.WriteEepromMemory) { FileInfo fi = new FileInfo(job_entry.FileName); MemoryMap mm = new MemoryMap(job_entry.ProgrammableMemorySize); IntelHEX16Storage storage = new IntelHEX16Storage(mm); storage.Load(fi.FullName); Console.WriteLine($" File name: {fi.FullName}"); Console.WriteLine($" Modified.: {fi.LastWriteTime}"); cnc.WriteEEPROM(device, mm); } if (job_entry.JobType == JobType.WriteFlashMemory) { FileInfo fi = new FileInfo(job_entry.FileName); MemoryMap mm = new MemoryMap(job_entry.ProgrammableMemorySize); IntelHEX16Storage storage = new IntelHEX16Storage(mm); storage.Load(fi.FullName); Console.WriteLine($" File name: {fi.FullName}"); Console.WriteLine($" Modified.: {fi.LastWriteTime}"); cnc.WriteFLASH(device, mm); } if (job_entry.JobType == JobType.Reboot) { cnc.Reboot(device); } if (job_entry.JobType == JobType.WaitForKey) { if (!string.IsNullOrEmpty(job_entry.WaitForKeyMessage)) { ColorConsole.PressAnyKey(job_entry.WaitForKeyMessage); } else { ColorConsole.PressAnyKey(); } } if (job_entry.JobType == JobType.ReadBootloaderVersion) { string ver = ""; cnc.ReadBootloaderVersion(device, ref ver); } } ColorConsole.PressAnyKey(); }
public void LoadTasks(string taskDescriptionFile) { // Read tasks Jobs.JobEntryCollection collection = null; try { string content = File.ReadAllText(taskDescriptionFile); collection = JsonConvert.DeserializeObject <Jobs.JobEntryCollection>(content); } catch (IOException ioex) { throw new BootloaderException($"Job list load error: {ioex.Message}", ioex); } catch (JsonException jex) { throw new BootloaderException($"Job list parsing error: {jex.Message}", jex); } // Verify jobs for (int i = 0; i < collection.Jobs.Length; i++) { JobEntry task = collection.Jobs[i]; try { //todo: refactorize if (task.JobType == JobType.WriteEepromMemory) { //TODO: replace fake load into fake memory with a clear verification procedure MemoryMap mm = new MemoryMap(task.ProgrammableMemorySize); IntelHEX16Storage s = new IntelHEX16Storage(mm); s.Load(task.FileName); } if (task.JobType == JobType.WriteFlashMemory) { //TODO: replace fake load into fake memory with a clear verification procedure MemoryMap mm = new MemoryMap(task.ProgrammableMemorySize); IntelHEX16Storage s = new IntelHEX16Storage(mm); s.Load(task.FileName); } if (task.JobType == JobType.ReadFlashMemory || task.JobType == JobType.ReadEepromMemory) { //TODO: replace fake load into fake memory with a clear verification procedure // MemoryMap mm = new MemoryMap(task.ProgrammableMemorySize); // IntelHEX16Storage s = new IntelHEX16Storage(mm); //s.Load(task.FileName); } if (task.JobType == JobType.Reboot) { //? } } catch (Exception ex) { throw new BootloaderException($"Job verification failed ({task.JobType}, task #{i}): {ex.Message}", ex); } } // Seems ok this.jobs = collection.Jobs; }