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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 by Michael Sevakis
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
/***************************************************************************
* uint32_t bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask)
*/
.section .text.bitmod32, "ax", %progbits
.align 2
.global bitmod32
.type bitmod32, %function
bitmod32:
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
mov r3, r0
ldr r0, [r3]
and r1, r1, r2 @ Only allow mod of bits in 'mask'
bic r2, r0, r2 @ Clear mask bits
orr r1, r2, r1 @ Set according to 'bits'
str r1, [r3]
msr cpsr_c, r12
bx lr
.size bitmod32, .-bitmod32
/***************************************************************************
* uint32_t bitset32(volatile uint32_t *addr, uint32_t mask)
*/
.section .text.bitset32, "ax", %progbits
.align 2
.global bitset32
.type bitset32, %function
bitset32:
mov r2, r0
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
ldr r0, [r2]
orr r1, r0, r1
str r1, [r2]
msr cpsr_c, r12
bx lr
.size bitset32, .-bitset32
/***************************************************************************
* uint32_t bitclr32(volatile uint32_t *addr, uint32_t mask)
*/
.section .text.bitclr32, "ax", %progbits
.align 2
.global bitclr32
.type bitclr32, %function
bitclr32:
mov r2, r0
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
ldr r0, [r2]
bic r1, r0, r1
str r1, [r2]
msr cpsr_c, r12
bx lr
.size bitclr32, .-bitclr32
/***************************************************************************
* uint16_t bitmod16(volatile uint16_t *addr, uint16_t bits, uint16_t mask)
*/
.section .text.bitmod16, "ax", %progbits
.align 2
.global bitmod16
.type bitmod16, %function
bitmod16:
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
mov r3, r0
ldrh r0, [r3]
and r1, r1, r2 @ Only allow mod of bits in 'mask'
bic r2, r0, r2 @ Clear mask bits
orr r1, r2, r1 @ Set according to 'bits'
strh r1, [r3]
msr cpsr_c, r12
bx lr
.size bitmod16, .-bitmod16
/***************************************************************************
* uint16_t bitset16(volatile uint16_t *addr, uint16_t mask)
*/
.section .text.bitset16, "ax", %progbits
.align 2
.global bitset16
.type bitset16, %function
bitset16:
mov r2, r0
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
ldrh r0, [r2]
orr r1, r0, r1
strh r1, [r2]
msr cpsr_c, r12
bx lr
.size bitset16, .-bitset16
/***************************************************************************
* uint16_t bitclr16(volatile uint16_t *addr, uint16_t mask)
*/
.section .text.bitclr16, "ax", %progbits
.align 2
.global bitclr16
.type bitclr16, %function
bitclr16:
mov r2, r0
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
ldrh r0, [r2]
bic r1, r0, r1
strh r1, [r2]
msr cpsr_c, r12
bx lr
.size bitclr16, .-bitclr16
|