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-5.0/] [sw/] [mor1kx/] [mor1kx-utils.c] - Blame information for rev 48

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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