/*
 *  bsp_start
 *
 *  This routine does the bulk of the system initialization.
 */
void bsp_start( void )
{
  /*
   * For real boards you need to setup the hardware
   * and need to copy the vector table from rom to ram.
   *
   * Depending on the board this can either be done from inside the rom
   * startup code, rtems startup code or here.
   */

  #ifndef START_HW_INIT
    /* board hardware setup here, or from 'start.S' */
    bsp_hw_init();
  #endif

  /*
   *  initialize the interrupt stack for this BSP
   */
  #if ( CPU_ALLOCATE_INTERRUPT_STACK == FALSE )
    _CPU_Interrupt_stack_low = &CPU_Interrupt_stack_low ;
    _CPU_Interrupt_stack_high = &CPU_Interrupt_stack_high ;
  #endif

  /*
   *  initialize the device driver parameters
   */
  bsp_clicks_per_second = CPU_CLOCK_RATE_HZ;
}
void bsp_start(void)
{
  /*
     For real boards you need to setup the hardware
     and need to copy the vector table from rom to ram.

     Depending on the board this can ether be done from inside the rom
     startup code, rtems startup code or here.
   */

#ifndef START_HW_INIT
  /* board hardware setup here, or from 'start.S' */
  bsp_hw_init();
#endif

  /*
   *  Allocate the memory for the RTEMS Work Space.  This can come from
   *  a variety of places: hard coded address, malloc'ed from outside
   *  RTEMS world (e.g. simulator or primitive memory manager), or (as
   *  typically done by stock BSPs) by subtracting the required amount
   *  of work space from the last physical address on the CPU board.
   */

  /*
   *  Need to "allocate" the memory for the RTEMS Workspace and
   *  tell the RTEMS configuration where it is.  This memory is
   *  not malloc'ed.  It is just "pulled from the air".
   */

  BSP_Configuration.work_space_start = (void *) &WorkSpaceStart ;
  BSP_Configuration.work_space_size  =
    &WorkSpaceEnd - &WorkSpaceStart ;

  /*
   *  initialize the CPU table for this BSP
   */

#if ( CPU_ALLOCATE_INTERRUPT_STACK == FALSE )
  _CPU_Interrupt_stack_low = &CPU_Interrupt_stack_low ;
  _CPU_Interrupt_stack_high = &CPU_Interrupt_stack_high ;

  /* This isn't used anywhere */
  Cpu_table.interrupt_stack_size =
    &CPU_Interrupt_stack_high - &CPU_Interrupt_stack_low ;
#endif

  Cpu_table.pretasking_hook = bsp_pretasking_hook;  /* init libc, etc. */
  Cpu_table.postdriver_hook = bsp_postdriver_hook;

#if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE )
  Cpu_table.interrupt_stack_size = CONFIGURE_INTERRUPT_STACK_MEMORY;
#endif

  Cpu_table.clicks_per_second = CPU_CLOCK_RATE_HZ ;
}