public static void Upload(PageCollection pageCollection) { OutputPort onboardLed = new OutputPort(ShieldConfiguration.CurrentConfiguration.OnboardLedPin, true); SPI.Configuration spiConfig = new SPI.Configuration( ShieldConfiguration.CurrentConfiguration.SpiChipSelectPin, false, 100, 100, false, true, 1000, ShieldConfiguration.CurrentConfiguration.SpiModule ); var spi = new SpotSpi(spiConfig); var uploader = new Uploader(spi); if (uploader.IsShieldInBootloaderMode()) { var uploadStatusIndicator = new UploadStatusIndicator( spi ); try { //var securityRegisterData = uploader.SecurityRegisterRead(); //var userData = new byte[Constants.SecurityRegisterUserFieldLength]; //Array.Copy(securityRegisterData, 4, userData, 0, userData.Length); //var userDataString = new string(System.Text.Encoding.UTF8.GetChars(userData)); //Debug.Print("Programming \"" + userDataString + "\""); uploadStatusIndicator.Status = UploadStatusIndicator.UploadStatus.Uploading; uploader.UploadBitstream(pageCollection); uploadStatusIndicator.Status = UploadStatusIndicator.UploadStatus.Succeeded; } catch { // Any exception is a failed upload uploadStatusIndicator.Status = UploadStatusIndicator.UploadStatus.Failed; throw; } finally { onboardLed.Write(false); } } else { // Flash the onboard LED to indicate upload failure due to // not being in bootstrapping mode Thread.Sleep(500); onboardLed.Write(false); Thread.Sleep(500); onboardLed.Write(true); Thread.Sleep(500); onboardLed.Write(false); } }
public void UploadBitstream(PageCollection pageCollection) { foreach (Page page in pageCollection) { bool verifyFailed = false; int verifyFailedCount = 0; do { // Wait until ready WaitUntilReady(); // Write it to the ISF page.Data[page.Offset] = (byte)SpiCommands.PageProgramThroughBuffer1; spi.Write(page.Data, page.Offset, Constants.SramPageBufferSize + 4); // Wait until ready WaitUntilReady(); // Verify it wrote page.Data[page.Offset] = (byte)SpiCommands.PageToBuffer1Compare; spi.Write(page.Data, page.Offset, 4); // Wait until ready, and when it is, the compare result // comes back in bit 6. Set is bad. verifyFailed = ((WaitUntilReady() & Constants.StatusRegisterCompareMask) != 0); if (verifyFailed) { Debug.Print("Failed to write page"); ++verifyFailedCount; if (verifyFailedCount == MaxPageWriteRetries) { throw new XilinxUploaderException("Failed to write page"); } } else { // Page successfully uploaded } } while (verifyFailed); } }