/*
** ==============================================================================
**
** bootLoading_main.c
**
** Provides basic output via the serial port to show that the application
** has booted.
**
** todo:
**    2020.1 - update to use a compiler SYMBOL to blink the LEDs as a visual
**             indicator that booting was successful
**             stretch goal - use buttons to select LED blink pattern/rate
**
**    202?.? - use this with the sharedResources lab - work with Lance
**             this bootloading exercise could be valuable as a completion stage
**             to the sharedResources cluster. the downside is that it couldn't be
**             run in emulation until the PL is supported.
**
** History: 
**    2020/03/06 - WK - new for 2019.2
**
** Copyright Xilinx, 2013-2016
**
** ----------------------------------------------------------------------------
** ----------------------------------------------------------------------------
**
** Xilinx, Inc.
** XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
** COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
** ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
** STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
** IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
** FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION
** XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
** THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
** ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
** FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
** AND FITNESS FOR A PARTICULAR PURPOSE.
**
******************************************************************************/


#include <stdio.h>
#include "platform.h"
#include "stdint.h"

// function prototypes
void delay(unsigned nSec);
void delayms(unsigned nMsec);

/*** main ***/
int main()
{
   // define local variables
   unsigned           phase1_counter  =  10;
   unsigned           phase2_counter  = 500;

   // perform device initializations
   //init_platform();
   Xil_DCacheDisable();

   // give the USB uart some time to come up before writing to it
   delay(1);
   xil_printf("\n\r\nbootLoading Application started!\n\r");   // let the user know what's happening

   // Main Loop (infinite)
   while (1) {
      
      while (phase1_counter--) {
         xil_printf("WOW! we booted!\n\r");
         delayms(250);
      }
      
      while (phase2_counter--) {
         xil_printf("   %03d\n\r",phase2_counter);
         delayms(100);
      }
      
      phase1_counter =  10;
      phase2_counter = 500;
      
      break; // exit the infinite loop
      
   } // end of infinite while loop

   return 0;
}

/**
 *  delay (number of seconds)
 *
 *      loop configured to delay a certain amount to generate a 1 second pause in execution
 *      WARNING! This function is not calibrated and is only used as an example!
 *
 * @param nSec - number of seconds to delay
 * @return none
 */
void delay(unsigned nSec) {
   volatile int  delay;
   for (delay = 0; delay < 4000000 * nSec; delay++);
}

/**
 *  delayms (number of milliseconds)
 *
 *      loop configured to delay a certain amount to generate a 1 ms pause in execution
 *      WARNING! This function is not calibrated and is only used as an example!
 *
 * @param nMsec - number of milliseconds to delay
 * @return none
 */
void delayms(unsigned nSec) {
   volatile int  delay;
   for (delay = 0; delay < 40000 * nSec; delay++);
}

//<copyright-disclaimer-start>
//  ************************************************************************************************************
//  * © Copyright 2013-2022 Xilinx, Inc. All rights reserved.                                                  *
//  * This file contains confidential and proprietary information of Xilinx, Inc. and                          *
//  * is protected under U.S. and international copyright and other intellectual property laws.                *
//  * DISCLAIMER                                                                                               *
//  * This disclaimer is not a license and does not grant any rights to the materials distributed              *
//  * herewith. Except as otherwise provided in a valid license issued to you by Xilinx, and to the            *
//  * maximum extent permitted by applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS"               *
//  * AND WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,                 *
//  * IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT,     *
//  * OR FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract or tort,  *
//  * including negligence, or under any other theory of liability) for any loss or damage of any kind or      *
//  * nature related to, arising under or in connection with these materials, including for any direct, or     *
//  * any indirect, special, incidental, or consequential loss or damage (including loss of data, profits,     *
//  * goodwill, or any type of loss or damage suffered as a result of any action brought by a third party)     *
//  * even if such damage or loss was reasonably foreseeable or Xilinx had been advised of the possibility     *
//  * of the same.                                                                                             *
//  * CRITICAL APPLICATIONS                                                                                    *
//  * Xilinx products are not designed or intended to be fail-safe, or for use in any application requiring    *
//  * fail-safe performance, such as life-support or safety devices or systems, Class III medical devices,     *
//  * nuclear facilities, applications related to the deployment of airbags, or any other applications that    *
//  * could lead to death, personal injury, or severe property or environmental damage (individually and       *
//  * collectively, "Critical Applications"). Customer assumes the sole risk and liability of any use of       *
//  * Xilinx products in Critical Applications, subject only to applicable laws and regulations governing      *
//  * limitations on product liability.                                                                        *
//  * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE AT ALL TIMES.                 *
//  *                                                                                                          *
//  ************************************************************************************************************
//<copyright-disclaimer-end>
