OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_52/] [or1ksim/] [tick/] [tick.c] - Diff between revs 1390 and 1408

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 1390 Rev 1408
Line 39... Line 39...
#include "spr_defs.h"
#include "spr_defs.h"
#include "pic.h"
#include "pic.h"
#include "sprs.h"
#include "sprs.h"
#include "sim-config.h"
#include "sim-config.h"
#include "sched.h"
#include "sched.h"
 
#include "debug.h"
 
 
 
DEFAULT_DEBUG_CHANNEL(tick);
 
 
/* When did the timer start to count */
/* When did the timer start to count */
int cycles_start = 0;
int cycles_start = 0;
 
 
/* TT Count Register */
/* TT Count Register */
Line 62... Line 65...
 
 
/* Job handler for tick timer */
/* Job handler for tick timer */
void tick_job (void *param)
void tick_job (void *param)
{
{
  int mode = (ttmr & SPR_TTMR_M) >> 30;
  int mode = (ttmr & SPR_TTMR_M) >> 30;
  /*debug (7, "tick_job%i, param %i\n", param, mode);*/
  TRACE("tick_job param: %i, mode: %i at %lli (%lli)\n", (int)param, mode,
 
        runtime.sim.cycles, runtime.cpu.instructions);
  switch (mode) {
  switch (mode) {
  case 1:
  case 1:
    if (!param) {
    if (!param) {
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = runtime.sim.cycles - ttcr;
      cycles_start = runtime.sim.cycles - ttcr;
 
      TRACE("Scheduleing timer job for %li\n", (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
    }
    }
  case 2:
  case 2:
    if (ttmr & SPR_TTMR_IE) {
    if (ttmr & SPR_TTMR_IE) {
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
Line 89... Line 94...
 
 
/* Starts the tick timer.  This function is called by a write to ttcr spr register */
/* Starts the tick timer.  This function is called by a write to ttcr spr register */
void spr_write_ttcr (unsigned long value)
void spr_write_ttcr (unsigned long value)
{
{
  unsigned mode = (ttmr & SPR_TTMR_M) >> 30;
  unsigned mode = (ttmr & SPR_TTMR_M) >> 30;
  /*debug (7, "ttcr = %08x\n", value);*/
  TRACE("set ttcr = %"PRIxREG"\n", value);
  ttcr = value;
  ttcr = value;
  /* Remove previous if it exists */
  /* Remove previous if it exists */
 
  TRACE("Removeing scheduled jobs\n");
  SCHED_FIND_REMOVE(tick_job, (void *)0);
  SCHED_FIND_REMOVE(tick_job, (void *)0);
  SCHED_FIND_REMOVE(tick_job, (void *)1);
  SCHED_FIND_REMOVE(tick_job, (void *)1);
  if (mode == 1 || mode == 2) {
  if (mode == 1 || mode == 2) {
 
    TRACE("Scheduleing timer job for %li\n", (ttmr & SPR_TTMR_PERIOD) - ttcr);
    SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
    SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
    cycles_start = runtime.sim.cycles - ttcr;
    cycles_start = runtime.sim.cycles - ttcr;
  }
  }
}
}
 
 
void spr_write_ttmr (unsigned long value)
void spr_write_ttmr (unsigned long value)
{
{
  /*debug (7, "ttmr = %08x\n", value);*/
  TRACE("set ttmr = %"PRIxREG"\n", value);
  ttmr = value;
  ttmr = value;
  /* Handle the modes properly. */
  /* Handle the modes properly. */
  switch((ttmr & SPR_TTMR_M) >> 30) {
  switch((ttmr & SPR_TTMR_M) >> 30) {
    case 0:    /* Timer is disabled */
    case 0:    /* Timer is disabled */
 
      TRACE("Removeing scheduled jobs\n");
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      break;
      break;
    case 1:    /* Timer should auto restart */
    case 1:    /* Timer should auto restart */
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = runtime.sim.cycles;
      cycles_start = runtime.sim.cycles;
 
      TRACE("Removeing scheduled jobs\n");
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
 
      TRACE("Scheduleing timer job for %li\n", (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
      break;
      break;
    case 2:    /* Stop the timer when match */
    case 2:    /* Stop the timer when match */
 
      TRACE("Removeing scheduled jobs\n");
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      break;
      break;
    case 3:    /* Timer keeps running -- do nothing*/
    case 3:    /* Timer keeps running -- do nothing*/
      break;
      break;
  }
  }
}
}
 
 
unsigned long spr_read_ttcr ()
unsigned long spr_read_ttcr ()
{
{
  /*debug (7, "ttcr ---- %08x\n", runtime.sim.cycles - cycles_start);*/
  TRACE("read ttcr %lli\n", runtime.sim.cycles - cycles_start);
  return runtime.sim.cycles - cycles_start;
  return runtime.sim.cycles - cycles_start;
}
}
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.