// CrossWorks Tasking Library.
//
// CTL support for the ATMEL AT91RM9200-EK evaluation board
//
// Copyright (c) 2009 Rowley Associates Limited.
//
// This file may be distributed under the terms of the License Agreement
// provided with this software.
//
// THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

#include <ctl_api.h>
#include <targets/AT91RM9200.h>

#define BUTTON (1 << 29)
#define LED (7 << 0)
  
#define PIOB_ID 3

#define SW1 (1 << 19)
#define SW2 (1 << 20)
#define SW3 (1 << 15)
#define SW4 (1 << 14)

#define PROCESSOR_CLOCK_FREQUENCY 180000000
#define MCK_FREQUENCY (PROCESSOR_CLOCK_FREQUENCY / 3)

void
ctl_board_init(void)
{  
  /* Setup LEDs */
  PIOB_PER = LED;
  PIOB_OER = LED;
  PIOB_SODR = LED;
}

unsigned long
MCKFrequency(void)
{
  return MCK_FREQUENCY;
}

void
ctl_board_on_button_pressed(CTL_ISR_FN_t isr)
{
  // Not implemented as there are no buttons to generate an interrupt from.
}

void
ctl_board_set_leds(unsigned v)
{
  if (v)
    PIOB_CODR = LED;
  else
    PIOB_SODR = LED;
}

void
delay(volatile unsigned int d)
{
  d *= 10;
  for (;d ;--d);
}

#define TC0_ID 17

static CTL_ISR_FN_t userTimerISR;

static void
timerISR(void)
{
  userTimerISR();
  /* Clear the timer interrupt */
  TC0_SR;
}

void
ctl_start_timer(CTL_ISR_FN_t isr)
{
  PMC_PCER = 1 << TC0_ID; /* Ensure T0 peripheral clock is running */
  TC0_CCR = TC0_CCR_CLKDIS_MASK;
  TC0_IDR = 0xFFFFFFFF;
  TC0_CMR = TC0_CMR_CPCTRG | 3; /* Timer clock 4 (/128) */
  TC0_RC = MCKFrequency() / 128 / ctl_get_ticks_per_second();
  TC0_IER = TC0_IER_CPCS;
  TC0_CCR = TC0_CCR_CLKEN | TC0_CCR_SWTRG;
  userTimerISR = isr;
  ctl_set_isr(TC0_ID, 1, CTL_ISR_TRIGGER_LOW_LEVEL, timerISR, 0);
  ctl_unmask_isr(TC0_ID);
}

unsigned long
ctl_get_ticks_per_second(void)
{
  return 1000;
}

#ifdef __FLASH_BUILD
#include "sdram_pll.c"
#endif

