OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [src_processor/] [mor1kx-3.1/] [sw/] [mor1kx/] [mor1kx-utils.c] - Blame information for rev 38

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 alirezamon
#include "spr-defs.h"
2
#include "board.h" // For timer rate (IN_CLK, TICKS_PER_SEC)
3
#include <or1k-support-defs.h>
4
/* For writing into SPR. */
5
void
6
mtspr(unsigned long spr, unsigned long value)
7
{
8
  asm("l.mtspr\t\t%0,%1,0": : "r" (spr), "r" (value));
9
}
10
 
11
/* For reading SPR. */
12
unsigned long
13
mfspr(unsigned long spr)
14
{
15
  unsigned long value;
16
  asm("l.mfspr\t\t%0,%1,0" : "=r" (value) : "r" (spr));
17
  return value;
18
}
19
 
20
/* Print out a character via simulator */
21
void
22
sim_putc(unsigned char c)
23
{
24
  asm("l.addi\tr3,%0,0": :"r" (c));
25
  asm("l.nop %0": :"K" (NOP_PUTC));
26
}
27
 
28
/* print long */
29
void
30
report(unsigned long value)
31
{
32
  asm("l.addi\tr3,%0,0": :"r" (value));
33
  asm("l.nop %0": :"K" (NOP_REPORT));
34
}
35
 
36
/* Loops/exits simulation */
37
void
38
exit (int i)
39
{
40
  asm("l.add r3,r0,%0": : "r" (i));
41
  asm("l.nop %0": :"K" (NOP_EXIT));
42
  while (1);
43
}
44
 
45
/* Enable user interrupts */
46
void
47
cpu_enable_user_interrupts(void)
48
{
49
  /* Enable interrupts in supervisor register */
50
  mtspr (SPR_SR, mfspr (SPR_SR) | SPR_SR_IEE);
51
}
52
 
53
/* Tick timer variable */
54
unsigned long timer_ticks;
55
 
56
/* Tick timer functions */
57
/* Enable tick timer and interrupt generation */
58
void
59
cpu_enable_timer(void)
60
{
61
  mtspr(SPR_TTMR, SPR_TTMR_IE | SPR_TTMR_RT | ((IN_CLK/TICKS_PER_SEC) &
62
                                               SPR_TTMR_PERIOD));
63
  mtspr(SPR_SR, SPR_SR_TEE | mfspr(SPR_SR));
64
 
65
}
66
 
67
/* Disable tick timer and interrupt generation */
68
void
69
cpu_disable_timer(void)
70
{
71
  // Disable timer: clear it all!
72
  mtspr (SPR_SR, mfspr (SPR_SR) & ~SPR_SR_TEE);
73
  mtspr(SPR_TTMR, 0);
74
 
75
}
76
 
77
/* Timer increment - called by interrupt routine */
78
void
79
cpu_timer_tick(void)
80
{
81
  timer_ticks++;
82
  // Reset timer mode register to interrupt with same interval
83
  mtspr(SPR_TTMR, SPR_TTMR_IE | SPR_TTMR_RT |
84
        ((IN_CLK/TICKS_PER_SEC) & SPR_TTMR_PERIOD));
85
}
86
 
87
/* Reset tick counter */
88
void
89
cpu_reset_timer_ticks(void)
90
{
91
  timer_ticks=0;
92
}
93
 
94
/* Get tick counter */
95
unsigned long
96
cpu_get_timer_ticks(void)
97
{
98
  return timer_ticks;
99
}
100
 
101
/* Wait for 10ms, assumes CLK_HZ is 100, which it usually is.
102
   Will be slightly inaccurate!*/
103
void
104
cpu_sleep_10ms(void)
105
{
106
  unsigned long ttcr = mfspr(SPR_TTCR) & SPR_TTCR_PERIOD;
107
  unsigned long first_time = cpu_get_timer_ticks();
108
  while (first_time == cpu_get_timer_ticks()); // Wait for tick to occur
109
  // Now wait until we're past the tick value we read before to know we've
110
  // gone at least enough
111
  while(ttcr > (mfspr(SPR_TTCR) & SPR_TTCR_PERIOD));
112
 
113
}
114
 

powered by: WebSVN 2.1.0

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