/// <summary> /// Function to Transmit the UBL via the device ROM Serial boot /// </summary> private static void TransmitUBL(Byte[] imageData, UARTBOOT_Header ackHeader) { // Local Variables for building up output StringBuilder UBLsb; CRC32 MyCRC; ProgressBar progressBar; Int32 blockCnt; UBLsb = new StringBuilder(imageData.Length * 2); // Read the data from the UBL file into the appropriate structures for (int i = 0; i < imageData.Length; i += sizeof(UInt32)) { UBLsb.AppendFormat("{0:X8}", System.BitConverter.ToUInt32(imageData, i)); } // Create CRC object and use it to calculate the UBL file's CRC // Note that this CRC is not quite the standard CRC-32 algorithm // commonly in use since the final register value is not XOR'd // with 0xFFFFFFFF. As a result the CRC value returned here // will be the bitwise inverse of the standard CRC-32 value. MyCRC = new CRC32(0x04C11DB7, 0xFFFFFFFF, 0x00000000, true, 1, CRCType.ONESHOT, CRCCalcMethod.LUT); ackHeader.crcVal = MyCRC.CalculateCRC(imageData); ackHeader.byteCnt = (UInt32)imageData.Length; try { BOOTMESEQ: Console.WriteLine("\nWaiting for the " + devString + "..."); // Wait for the device to send the ^BOOTME/0 sequence if (SerialIO.waitForSequence(" BOOTME\0", " BOOTME\0", MySP, cmdParams.verbose)) { Console.WriteLine("BOOTME commmand received. Returning ACK and header..."); } else { goto BOOTMESEQ; } // Output 28 Bytes for the ACK sequence and header // 8 bytes acknowledge sequence = " ACK\0" #if (DM35x_REVB || DM36x_REVA) MySP.Write(" ACK"); #else MySP.Write(" ACK\0"); #endif // 8 bytes of CRC data = ASCII string of 8 hex characters MySP.Write(ackHeader.crcVal.ToString("X8")); // 4 bytes of UBL data size = ASCII string of 4 hex characters (3800h = 14336d) MySP.Write(ackHeader.byteCnt.ToString("X4")); // 4 bytes of start address = ASCII string of 4 hex characters (>=0100h) MySP.Write(ackHeader.startAddr.ToString("X4")); // 4 bytes of constant zeros = "0000" MySP.Write("0000"); Console.WriteLine("ACK command sent. Waiting for BEGIN command... "); // Wait for the BEGIN sequence if (SerialIO.waitForSequence(" BEGIN\0", " BOOTME\0", MySP, true)) { Console.WriteLine("BEGIN commmand received. Sending CRC table..."); } else { goto BOOTMESEQ; } // Send the 1024 byte (256 word) CRC table progressBar = new ProgressBar(); progressBar.Update(0.0, "Sending CRC table..."); for (int i = 0; i < MyCRC.Length; i++) { MySP.Write(MyCRC[i].ToString("x8")); progressBar.Percent = (((Double)(i + 1)) / MyCRC.Length); } progressBar.Update(100.0, "CRC table sent."); Console.WriteLine("Waiting for DONE..."); // Wait for the first DONE sequence if (SerialIO.waitForSequence(" DONE\0", " BOOTME\0", MySP, cmdParams.verbose)) { Console.WriteLine("DONE received. Sending the UBL..."); } else { goto BOOTMESEQ; } // Send the contents of the UBL file (as hex text) progressBar = new ProgressBar(); progressBar.Update(0.0, "Sending UBL..."); blockCnt = UBLsb.Length / 128; for (int i = 0; i < (blockCnt * 128); i += 128) { MySP.Write(UBLsb.ToString(i, 128)); progressBar.Percent = (((Double)(i + 1)) / UBLsb.Length); } // Write last (possibly partial) block MySP.Write(UBLsb.ToString(blockCnt * 128, UBLsb.Length - (blockCnt * 128))); progressBar.Update(100.0, "UBL sent."); // Wait for the second DONE sequence if (SerialIO.waitForSequence(" DONE\0", " BOOTME\0", MySP, cmdParams.verbose)) { Console.WriteLine("DONE received. UBL was accepted."); } else { goto BOOTMESEQ; } Console.WriteLine("UBL transmitted successfully.\n"); } catch (ObjectDisposedException e) { Console.WriteLine(e.StackTrace); throw e; } }