aboutsummaryrefslogtreecommitdiffstats
path: root/picosoc/firmware.S
blob: efd49b45e35aae9e398b6bfb44c349a521d514f3 (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
125
126
// write RAM code (a sequence of nops followed by ret)
li      x5,0x00000013   // nop
sw      x5,4(x0)
sw      x5,8(x0)
sw      x5,12(x0)
sw      x5,16(x0)
sw      x5,20(x0)
sw      x5,24(x0)
sw      x5,28(x0)
sw      x5,32(x0)
sw      x5,36(x0)
sw      x5,40(x0)
sw      x5,44(x0)
sw      x5,48(x0)
sw      x5,52(x0)
sw      x5,56(x0)
sw      x5,60(x0)
sw      x5,64(x0)
sw      x5,68(x0)
sw      x5,72(x0)
sw      x5,76(x0)
sw      x5,80(x0)
sw      x5,84(x0)
sw      x5,88(x0)
sw      x5,92(x0)
sw      x5,96(x0)
sw      x5,100(x0)
sw      x5,104(x0)
sw      x5,108(x0)
sw      x5,112(x0)
sw      x5,116(x0)
sw      x5,120(x0)
sw      x5,124(x0)
sw      x5,128(x0)
sw      x5,132(x0)
sw      x5,136(x0)
sw      x5,140(x0)
sw      x5,144(x0)
sw      x5,148(x0)
sw      x5,152(x0)
sw      x5,156(x0)
sw      x5,160(x0)
sw      x5,164(x0)
sw      x5,168(x0)
sw      x5,172(x0)
sw      x5,176(x0)
sw      x5,180(x0)
sw      x5,184(x0)
sw      x5,188(x0)
sw      x5,192(x0)
li      x5,0x00008067   // ret
sw      x5,196(x0)

// write a few chars to UART
li      x5,0x02000004
li      x6,104
sw      x6,0(x5)
li      x5,0x02000008
li      x6,'H'
sw      x6,0(x5)
li      x6,'e'
sw      x6,0(x5)
li      x6,'l'
sw      x6,0(x5)
li      x6,'l'
sw      x6,0(x5)
li      x6,'o'
sw      x6,0(x5)
li      x6,' '
sw      x6,0(x5)
li      x6,'W'
sw      x6,0(x5)
li      x6,'o'
sw      x6,0(x5)
li      x6,'r'
sw      x6,0(x5)
li      x6,'l'
sw      x6,0(x5)
li      x6,'d'
sw      x6,0(x5)
li      x6,'!'
sw      x6,0(x5)
li      x6,'\r'
sw      x6,0(x5)
li      x6,'\n'
sw      x6,0(x5)

#if 0
// switch spimemio to continous qspi ddr mode
li      x5,0x02000000
li      x6,0x80000071
sw      x6,0(x5)
#endif

// setup gpio address in x5
li      x5,0x03000000
sw      x0,0(x5)

// initial entry point into RAM code
li      x3,4

// initialize RAM counter
sw      x0,0(x0)

// start of loop. remember this address
auipc   x4,0

// execute RAM code, come back here
jalr    x3

// load counter and increment
lw      x6,0(x0)
addi    x6,x6,1

// store counter and update gpios
sw      x6,0(x5)
sw      x6,0(x0)

// calculate new entry point into RAM code
slli    x3,x6,2
andi    x3,x3,127
addi    x3,x3,32

// execute RAM code, come back to start of loop
mv      x1,x4
jr      x3