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
|
/***************************************************************************
* __________ __ ___.
* 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.
*
****************************************************************************/
/***************************************************************************
* void bitmod32(volatile uint32_t *addr, uint32_t bits, uint32_t mask)
*/
.section .text, "ax", %progbits
.align 2
.global bitmod32
.type bitmod32, %function
bitmod32:
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
ldr r3, [r0]
and r1, r1, r2 @ Only allow mod of bits in 'mask'
bic r3, r3, r2 @ Clear mask bits
orr r3, r3, r1 @ Set according to 'bits'
str r3, [r0]
msr cpsr_c, r12
bx lr
.size bitmod32, .-bitmod32
/***************************************************************************
* void bitset32(volatile uint32_t *addr, uint32_t mask)
*/
.section .text, "ax", %progbits
.align 2
.global bitset32
.type bitset32, %function
bitset32:
mrs r12, cpsr
orr r2, r12, #0xc0
msr cpsr_c, r2
ldr r2, [r0]
orr r2, r2, r1
str r2, [r0]
msr cpsr_c, r12
bx lr
.size bitset32, .-bitset32
/***************************************************************************
* void bitclr32(volatile uint32_t *addr, uint32_t mask)
*/
.section .text, "ax", %progbits
.align 2
.global bitclr32
.type bitclr32, %function
bitclr32:
mrs r12, cpsr
orr r2, r12, #0xc0
msr cpsr_c, r2
ldr r2, [r0]
bic r2, r2, r1
str r2, [r0]
msr cpsr_c, r12
bx lr
.size bitclr32, .-bitclr32
/***************************************************************************
* void bitmod16(volatile uint16_t *addr, uint16_t bits, uint16_t mask)
*/
.section .text, "ax", %progbits
.align 2
.global bitmod16
.type bitmod16, %function
bitmod16:
mrs r12, cpsr
orr r3, r12, #0xc0
msr cpsr_c, r3
ldrh r3, [r0]
and r1, r1, r2 @ Only allow mod of bits in 'mask'
bic r3, r3, r2 @ Clear mask bits
orr r3, r3, r1 @ Set according to 'bits'
strh r3, [r0]
msr cpsr_c, r12
bx lr
.size bitmod16, .-bitmod16
/***************************************************************************
* void bitset16(volatile uint16_t *addr, uint16_t mask)
*/
.section .text, "ax", %progbits
.align 2
.global bitset16
.type bitset16, %function
bitset16:
mrs r12, cpsr
orr r2, r12, #0xc0
msr cpsr_c, r2
ldrh r2, [r0]
orr r2, r2, r1
strh r2, [r0]
msr cpsr_c, r12
bx lr
.size bitset16, .-bitset16
/***************************************************************************
* void bitclr16(volatile uint16_t *addr, uint16_t mask)
*/
.section .text, "ax", %progbits
.align 2
.global bitclr16
.type bitclr16, %function
bitclr16:
mrs r12, cpsr
orr r2, r12, #0xc0
msr cpsr_c, r2
ldrh r2, [r0]
bic r2, r2, r1
strh r2, [r0]
msr cpsr_c, r12
bx lr
.size bitclr16, .-bitclr16
|