]> git.sur5r.net Git - freertos/blob
3a0b2543680ca206799744a63d2fde11a92ca8fc
[freertos] /
1 /*******************************************************************************\r
2  * (c) Copyright 2008-2013 Microsemi SoC Products Group. All rights reserved.\r
3  * \r
4  * SVN $Revision: 5258 $\r
5  * SVN $Date: 2013-03-21 12:41:02 +0000 (Thu, 21 Mar 2013) $\r
6  */\r
7 \r
8     .text\r
9     .global HW_set_32bit_reg\r
10     .global HW_get_32bit_reg\r
11     .global HW_set_32bit_reg_field\r
12     .global HW_get_32bit_reg_field\r
13     .global HW_set_16bit_reg\r
14     .global HW_get_16bit_reg\r
15     .global HW_set_16bit_reg_field\r
16     .global HW_get_16bit_reg_field\r
17     .global HW_set_8bit_reg\r
18     .global HW_get_8bit_reg\r
19     .global HW_set_8bit_reg_field\r
20     .global HW_get_8bit_reg_field\r
21     .code 16\r
22     .syntax unified\r
23     .type HW_set_32bit_reg, function\r
24     .type HW_get_32bit_reg, function\r
25     .type HW_set_32bit_reg_field, function\r
26     .type HW_get_32bit_reg_field, function\r
27     .type HW_set_16bit_reg, function\r
28     .type HW_get_16bit_reg, function\r
29     .type HW_set_16bit_reg_field, function\r
30     .type HW_get_16bit_reg_field, function\r
31     .type HW_set_8bit_reg, function\r
32     .type HW_get_8bit_reg, function\r
33     .type HW_set_8bit_reg_field, function\r
34     .type HW_get_8bit_reg_field, function\r
35 \r
36 /*------------------------------------------------------------------------------\r
37  * R0:   addr_t reg_addr\r
38  * R1:   uint32_t value\r
39  */\r
40 HW_set_32bit_reg:\r
41     STR R1, [R0]\r
42     BX LR\r
43 \r
44 /*------------------------------------------------------------------------------\r
45  * R0:   addr_t reg_addr\r
46  */      \r
47 HW_get_32bit_reg:\r
48     LDR R0, [R0]\r
49     BX LR\r
50 \r
51 /*------------------------------------------------------------------------------\r
52  * R0:   addr_t reg_addr\r
53  * R1:   int_fast8_t shift\r
54  * R2:   uint32_t mask\r
55  * R3:   uint32_t value\r
56  */\r
57 HW_set_32bit_reg_field:\r
58     PUSH {R1,R2,R3,LR}\r
59     LSL.W R3, R3, R1\r
60     AND.W R3, R3, R2\r
61     LDR R1, [R0]\r
62     MVN.W R2, R2\r
63     AND.W R1, R1, R2\r
64     ORR.W R1, R1, R3\r
65     STR R1, [R0]\r
66     POP {R1,R2,R3,PC}\r
67 \r
68 /*------------------------------------------------------------------------------\r
69  * R0:   addr_t reg_addr\r
70  * R1:   int_fast8_t shift\r
71  * R2:   uint32_t mask\r
72  */\r
73 HW_get_32bit_reg_field:\r
74     LDR R0, [R0]\r
75     AND.W R0, R0, R2\r
76     LSR.W R0, R0, R1\r
77     BX LR\r
78 \r
79 /*------------------------------------------------------------------------------\r
80  * R0:   addr_t reg_addr\r
81  * R1:   uint_fast16_t value\r
82  */\r
83 HW_set_16bit_reg:\r
84     STRH R1, [R0]\r
85     BX LR\r
86         \r
87 /*------------------------------------------------------------------------------\r
88  * R0:   addr_t reg_addr\r
89  */\r
90 HW_get_16bit_reg:\r
91     LDRH R0, [R0]\r
92     BX LR\r
93 \r
94 /*------------------------------------------------------------------------------\r
95  * R0:   addr_t reg_addr\r
96  * R1:   int_fast8_t shift\r
97  * R2:   uint_fast16_t mask\r
98  * R3:   uint_fast16_t value\r
99  */\r
100 HW_set_16bit_reg_field:\r
101     PUSH {R1,R2,R3,LR}\r
102     LSL.W R3, R3, R1\r
103     AND.W R3, R3, R2\r
104     LDRH R1, [R0]\r
105     MVN.W R2, R2\r
106     AND.W R1, R1, R2\r
107     ORR.W R1, R1, R3\r
108     STRH R1, [R0]\r
109     POP {R1,R2,R3,PC}\r
110 \r
111 /*------------------------------------------------------------------------------\r
112  * R0:   addr_t reg_addr\r
113  * R1:   int_fast8_t shift\r
114  * R2:   uint_fast16_t mask\r
115  */\r
116 HW_get_16bit_reg_field:\r
117     LDRH R0, [R0]\r
118     AND.W R0, R0, R2\r
119     LSR.W R0, R0, R1\r
120     BX LR\r
121 \r
122 /*------------------------------------------------------------------------------\r
123  * R0:   addr_t reg_addr\r
124  * R1:   uint_fast8_t value\r
125  */\r
126 HW_set_8bit_reg:\r
127     STRB R1, [R0]\r
128     BX LR\r
129         \r
130 /*------------------------------------------------------------------------------\r
131  * R0:   addr_t reg_addr\r
132  */\r
133 HW_get_8bit_reg:\r
134     LDRB R0, [R0]\r
135     BX LR\r
136 \r
137 /*------------------------------------------------------------------------------\r
138  * R0:   addr_t reg_addr,\r
139  * R1:   int_fast8_t shift\r
140  * R2:   uint_fast8_t mask\r
141  * R3:   uint_fast8_t value\r
142  */\r
143 HW_set_8bit_reg_field:\r
144     PUSH {R1,R2,R3,LR}\r
145     LSL.W R3, R3, R1\r
146     AND.W R3, R3, R2\r
147     LDRB R1, [R0]\r
148     MVN.W R2, R2\r
149     AND.W R1, R1, R2\r
150     ORR.W R1, R1, R3\r
151     STRB R1, [R0]\r
152     POP {R1,R2,R3,PC}\r
153 \r
154 /*------------------------------------------------------------------------------\r
155  * R0:   addr_t reg_addr\r
156  * R1:   int_fast8_t shift\r
157  * R2:   uint_fast8_t mask\r
158  */\r
159 HW_get_8bit_reg_field:\r
160     LDRB R0, [R0]\r
161     AND.W R0, R0, R2\r
162     LSR.W R0, R0, R1\r
163     BX LR\r
164 \r
165 .end\r