Example #1
0
        /// <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;
            }
        }