blob: 62a6f42b313ab88262af38aff6d1aad7ff21ba91 [file] [log] [blame]
shalanfd13eb52020-08-21 16:48:07 +02001.section .text
2
3start:
4
5# zero-initialize register file
6addi x1, zero, 0
7# x2 (sp) is initialized by reset
8addi x3, zero, 0
9addi x4, zero, 0
10addi x5, zero, 0
11addi x6, zero, 0
12addi x7, zero, 0
13addi x8, zero, 0
14addi x9, zero, 0
15addi x10, zero, 0
16addi x11, zero, 0
17addi x12, zero, 0
18addi x13, zero, 0
19addi x14, zero, 0
20addi x15, zero, 0
21addi x16, zero, 0
22addi x17, zero, 0
23addi x18, zero, 0
24addi x19, zero, 0
25addi x20, zero, 0
26addi x21, zero, 0
27addi x22, zero, 0
28addi x23, zero, 0
29addi x24, zero, 0
30addi x25, zero, 0
31addi x26, zero, 0
32addi x27, zero, 0
33addi x28, zero, 0
34addi x29, zero, 0
35addi x30, zero, 0
36addi x31, zero, 0
37
38# zero initialize scratchpad memory
39# setmemloop:
40# sw zero, 0(x1)
41# addi x1, x1, 4
42# blt x1, sp, setmemloop
43
44# copy data section
45la a0, _sidata
46la a1, _sdata
47la a2, _edata
48bge a1, a2, end_init_data
49loop_init_data:
50lw a3, 0(a0)
51sw a3, 0(a1)
52addi a0, a0, 4
53addi a1, a1, 4
54blt a1, a2, loop_init_data
55end_init_data:
56
57# zero-init bss section
58la a0, _sbss
59la a1, _ebss
60bge a0, a1, end_init_bss
61loop_init_bss:
62sw zero, 0(a0)
63addi a0, a0, 4
64blt a0, a1, loop_init_bss
65end_init_bss:
66
67# call main
68call main
69loop:
70j loop
71
72.global flashio_worker_begin
73.global flashio_worker_end
74
75.balign 4
76
77flashio_worker_begin:
78# a0 ... data pointer
79# a1 ... data length
80# a2 ... optional WREN cmd (0 = disable)
81
82# address of SPI ctrl reg
83li t0, 0x28000000
84
85# Set CS high, IO0 is output
86li t1, 0x120
87sh t1, 0(t0)
88
89# Enable Manual SPI Ctrl
90sb zero, 3(t0)
91
92# Send optional WREN cmd
93beqz a2, flashio_worker_L1
94li t5, 8
95andi t2, a2, 0xff
96flashio_worker_L4:
97srli t4, t2, 7
98sb t4, 0(t0)
99ori t4, t4, 0x10
100sb t4, 0(t0)
101slli t2, t2, 1
102andi t2, t2, 0xff
103addi t5, t5, -1
104bnez t5, flashio_worker_L4
105sb t1, 0(t0)
106
107# SPI transfer
108flashio_worker_L1:
109
110# If byte count is zero, we're done
111beqz a1, flashio_worker_L3
112
113# Set t5 to count down 32 bits
114li t5, 32
115# Load t2 from address a0 (4 bytes)
116lw t2, 0(a0)
117
118flashio_worker_LY:
119# Set t6 to count down 8 bits
120li t6, 8
121
122flashio_worker_L2:
123# Clock out the bit (msb first) on IO0 and read bit in from IO1
124srli t4, t2, 31
125sb t4, 0(t0)
126ori t4, t4, 0x10
127sb t4, 0(t0)
128lbu t4, 0(t0)
129andi t4, t4, 2
130srli t4, t4, 1
131slli t2, t2, 1
132or t2, t2, t4
133
134# Decrement 32 bit count
135addi t5, t5, -1
136bnez t5, flashio_worker_LX
137
138sw t2, 0(a0)
139addi a0, a0, 4
140lw t2, 0(a0)
141
142flashio_worker_LX:
143addi t6, t6, -1
144bnez t6, flashio_worker_L2
145addi a1, a1, -1
146bnez a1, flashio_worker_LY
147
148beqz t5, flashio_worker_L3
149sw t2, 0(a0)
150
151flashio_worker_L3:
152# Back to MEMIO mode
153li t1, 0x80
154sb t1, 3(t0)
155
156ret
157.balign 4
158flashio_worker_end:
159