blob: c090b37964fdbae9c60d480ad5d64f403362d16b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
// See LICENSE for license details.
#include <stdint.h>
#include <stdbool.h>
#include <stdatomic.h>
#include "encoding.h"
#include <platform.h>
#ifndef _SIFIVE_COREPLEXIP_ARTY_H
#error 'coreplexip_welcome' demo only supported for Coreplex IP Eval Kits
#endif
static const char sifive_msg[] = "\n\r\
\n\r\
SIFIVE, INC.\n\r\
\n\r\
5555555555555555555555555\n\r\
5555 5555\n\r\
5555 5555\n\r\
5555 5555\n\r\
5555 5555555555555555555555\n\r\
5555 555555555555555555555555\n\r\
5555 5555\n\r\
5555 5555\n\r\
5555 5555\n\r\
5555555555555555555555555555 55555\n\r\
55555 555555555 55555\n\r\
55555 55555 55555\n\r\
55555 5 55555\n\r\
55555 55555\n\r\
55555 55555\n\r\
55555 55555\n\r\
55555 55555\n\r\
55555 55555\n\r\
555555555\n\r\
55555\n\r\
5\n\r\
\n\r\
";
#if __riscv_xlen == 32
static const char welcome_msg[] = "\n\r\
\n\r\
Welcome to the E31 Coreplex IP FPGA Evaluation Kit!\n\r\
\n\r";
#else
static const char welcome_msg[] = "\n\r\
\n\r\
Welcome to the E51 Coreplex IP FPGA Evaluation Kit!\n\r\
\n\r";
#endif
static void _putc(char c) {
while ((int32_t) UART0_REG(UART_REG_TXFIFO) < 0);
UART0_REG(UART_REG_TXFIFO) = c;
}
int _getc(char * c){
int32_t val = (int32_t) UART0_REG(UART_REG_RXFIFO);
if (val > 0) {
*c = val & 0xFF;
return 1;
}
return 0;
}
static void _puts(const char * s) {
while (*s != '\0'){
_putc(*s++);
}
}
int main (void){
// 115200 Baud Rate at (65 / 2) MHz
UART0_REG(UART_REG_DIV) = 282;
UART0_REG(UART_REG_TXCTRL) = UART_TXEN;
UART0_REG(UART_REG_RXCTRL) = UART_RXEN;
// Wait a bit because we were changing the GPIOs
volatile int i=0;
while(i < 10000){i++;}
_puts(sifive_msg);
_puts(welcome_msg);
uint16_t r=0x3F;
uint16_t g=0;
uint16_t b=0;
// Set up RGB PWM
PWM0_REG(PWM_CFG) = 0;
PWM0_REG(PWM_CFG) = (PWM_CFG_ENALWAYS) | (PWM_CFG_ZEROCMP) | (PWM_CFG_DEGLITCH);
PWM0_REG(PWM_COUNT) = 0;
// The LEDs are intentionally left somewhat dim.
PWM0_REG(PWM_CMP0) = 0xFE;
while(1){
volatile uint64_t * now = (volatile uint64_t*)(CLINT_CTRL_ADDR + CLINT_MTIME);
volatile uint64_t then = *now + 400;
while (*now < then) { }
if(r > 0 && b == 0){
r--;
g++;
}
if(g > 0 && r == 0){
g--;
b++;
}
if(b > 0 && g == 0){
r++;
b--;
}
PWM0_REG(PWM_CMP1) = 0xFF - (r >> 2);
PWM0_REG(PWM_CMP2) = 0xFF - (g >> 2);
PWM0_REG(PWM_CMP3) = 0xFF - (b >> 2);
}// While (1)
}
|