]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/hal/hw_reg_access.S
Microsemi RISC-V project:
[freertos] / FreeRTOS / Demo / RISC-V_IGLOO2_Creative_SoftConsole / Microsemi_Code / hal / hw_reg_access.S
1 /***************************************************************************//**\r
2  * (c) Copyright 2007-2018 Microsemi SoC Products Group. All rights reserved.\r
3  *\r
4  * Hardware registers access functions.\r
5  * The implementation of these function is platform and toolchain specific.\r
6  * The functions declared here are implemented using assembler as part of the\r
7  * processor/toolchain specific HAL.\r
8  *\r
9  * SVN $Revision: 9661 $\r
10  * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
11  */\r
12 \r
13 .section .text\r
14     .globl HW_set_32bit_reg\r
15     .globl HW_get_32bit_reg\r
16     .globl HW_set_32bit_reg_field\r
17     .globl HW_get_32bit_reg_field\r
18     .globl HW_set_16bit_reg\r
19     .globl HW_get_16bit_reg\r
20     .globl HW_set_16bit_reg_field\r
21     .globl HW_get_16bit_reg_field\r
22     .globl HW_set_8bit_reg\r
23     .globl HW_get_8bit_reg\r
24     .globl HW_set_8bit_reg_field\r
25     .globl HW_get_8bit_reg_field\r
26 \r
27 \r
28 /***************************************************************************//**\r
29  * HW_set_32bit_reg is used to write the content of a 32 bits wide peripheral\r
30  * register.\r
31  *\r
32  * a0:   addr_t reg_addr\r
33  * a1:   uint32_t value\r
34  */\r
35 HW_set_32bit_reg:\r
36     sw a1, 0(a0)\r
37     ret\r
38 \r
39 /***************************************************************************//**\r
40  * HW_get_32bit_reg is used to read the content of a 32 bits wide peripheral\r
41  * register.\r
42  *\r
43  * R0:   addr_t reg_addr\r
44  * @return          32 bits value read from the peripheral register.\r
45  */\r
46 HW_get_32bit_reg:\r
47     lw a0, 0(a0)\r
48     ret\r
49 \r
50 /***************************************************************************//**\r
51  * HW_set_32bit_reg_field is used to set the content of a field in a 32 bits\r
52  * wide peripheral register.\r
53  *\r
54  * a0:   addr_t reg_addr\r
55  * a1:   int_fast8_t shift\r
56  * a2:   uint32_t mask\r
57  * a3:   uint32_t value\r
58  */\r
59 HW_set_32bit_reg_field:\r
60     mv t3, a3\r
61     sll t3, t3, a1\r
62     and  t3, t3, a2\r
63     lw t1, 0(a0)\r
64     mv t2, a2\r
65     not t2, t2\r
66     and t1, t1, t2\r
67     or t1, t1, t3\r
68     sw t1, 0(a0)\r
69     ret\r
70 \r
71 /***************************************************************************//**\r
72  * HW_get_32bit_reg_field is used to read the content of a field out of a\r
73  * 32 bits wide peripheral register.\r
74  *\r
75  * a0:   addr_t reg_addr\r
76  * a1:   int_fast8_t shift\r
77  * a2:   uint32_t mask\r
78  *\r
79  * @return          32 bits value containing the register field value specified\r
80  *                  as parameter.\r
81  */\r
82 HW_get_32bit_reg_field:\r
83     lw a0, 0(a0)\r
84     and a0, a0, a2\r
85     srl a0, a0, a1\r
86     ret\r
87 \r
88 /***************************************************************************//**\r
89  * HW_set_16bit_reg is used to write the content of a 16 bits wide peripheral\r
90  * register.\r
91  *\r
92  * a0:   addr_t reg_addr\r
93  * a1:   uint_fast16_t value\r
94  */\r
95 HW_set_16bit_reg:\r
96     sh a1, 0(a0)\r
97     ret\r
98 \r
99 /***************************************************************************//**\r
100  * HW_get_16bit_reg is used to read the content of a 16 bits wide peripheral\r
101  * register.\r
102  *\r
103  * a0:   addr_t reg_addr\r
104  * @return          16 bits value read from the peripheral register.\r
105  */\r
106 HW_get_16bit_reg:\r
107     lh a0, (a0)\r
108     ret\r
109 \r
110 /***************************************************************************//**\r
111  * HW_set_16bit_reg_field is used to set the content of a field in a 16 bits\r
112  * wide peripheral register.\r
113  *\r
114  * a0:   addr_t reg_addr\r
115  * a1:   int_fast8_t shift\r
116  * a2:   uint_fast16_t mask\r
117  * a3:   uint_fast16_t value\r
118  * @param value     Value to be written in the specified field.\r
119  */\r
120 HW_set_16bit_reg_field:\r
121     mv t3, a3\r
122     sll t3, t3, a1\r
123     and  t3, t3, a2\r
124     lh t1, 0(a0)\r
125     mv t2, a2\r
126     not t2, t2\r
127     and t1, t1, t2\r
128     or t1, t1, t3\r
129     sh t1, 0(a0)\r
130     ret\r
131 \r
132 /***************************************************************************//**\r
133  * HW_get_16bit_reg_field is used to read the content of a field from a\r
134  * 16 bits wide peripheral register.\r
135  *\r
136  * a0:   addr_t reg_addr\r
137  * a1:   int_fast8_t shift\r
138  * a2:   uint_fast16_t mask\r
139  *\r
140  * @return          16 bits value containing the register field value specified\r
141  *                  as parameter.\r
142  */\r
143 HW_get_16bit_reg_field:\r
144     lh a0, 0(a0)\r
145     and a0, a0, a2\r
146     srl a0, a0, a1\r
147     ret\r
148 \r
149 /***************************************************************************//**\r
150  * HW_set_8bit_reg is used to write the content of a 8 bits wide peripheral\r
151  * register.\r
152  *\r
153  * a0:   addr_t reg_addr\r
154  * a1:   uint_fast8_t value\r
155  */\r
156 HW_set_8bit_reg:\r
157     sb a1, 0(a0)\r
158     ret\r
159 \r
160 /***************************************************************************//**\r
161  * HW_get_8bit_reg is used to read the content of a 8 bits wide peripheral\r
162  * register.\r
163  *\r
164  * a0:   addr_t reg_addr\r
165  * @return          8 bits value read from the peripheral register.\r
166  */\r
167 HW_get_8bit_reg:\r
168     lb a0, 0(a0)\r
169     ret\r
170 \r
171 /***************************************************************************//**\r
172  * HW_set_8bit_reg_field is used to set the content of a field in a 8 bits\r
173  * wide peripheral register.\r
174  *\r
175  * a0:   addr_t reg_addr,\r
176  * a1:   int_fast8_t shift\r
177  * a2:   uint_fast8_t mask\r
178  * a3:   uint_fast8_t value\r
179  */\r
180 HW_set_8bit_reg_field:\r
181     mv t3, a3\r
182     sll t3, t3, a1\r
183     and  t3, t3, a2\r
184     lb t1, 0(a0)\r
185     mv t2, a2\r
186     not t2, t2\r
187     and t1, t1, t2\r
188     or t1, t1, t3\r
189     sb t1, 0(a0)\r
190     ret\r
191 \r
192 /***************************************************************************//**\r
193  * HW_get_8bit_reg_field is used to read the content of a field from a\r
194  * 8 bits wide peripheral register.\r
195  *\r
196  * a0:   addr_t reg_addr\r
197  * a1:   int_fast8_t shift\r
198  * a2:   uint_fast8_t mask\r
199  *\r
200  * @return          8 bits value containing the register field value specified\r
201  *                  as parameter.\r
202  */\r
203 HW_get_8bit_reg_field:\r
204     lb a0, 0(a0)\r
205     and a0, a0, a2\r
206     srl a0, a0, a1\r
207     ret\r
208 \r
209 .end\r