aboutsummaryrefslogtreecommitdiff
path: root/tmk_core/common/util.c
diff options
context:
space:
mode:
authortmk <hasu@tmk-kbd.com>2015-04-10 01:32:04 +0900
committertmk <hasu@tmk-kbd.com>2015-04-10 01:32:04 +0900
commit1a02ebcc612e9a9c0d87e02295c7258de3a70ccc (patch)
treee517f3c70bb2d542797e57d13e9023c84af230fb /tmk_core/common/util.c
parent6746e37088ce8ba03529c1226bd216705edb2b1f (diff)
parenta074364c3731d66b56d988c8a6c960a83ea0e0a1 (diff)
downloadqmk_firmware-1a02ebcc612e9a9c0d87e02295c7258de3a70ccc.tar.gz
qmk_firmware-1a02ebcc612e9a9c0d87e02295c7258de3a70ccc.zip
Merge commit 'a074364c3731d66b56d988c8a6c960a83ea0e0a1' as 'tmk_core'
Diffstat (limited to 'tmk_core/common/util.c')
-rw-r--r--tmk_core/common/util.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/tmk_core/common/util.c b/tmk_core/common/util.c
new file mode 100644
index 000000000..7e0d54299
--- /dev/null
+++ b/tmk_core/common/util.c
@@ -0,0 +1,101 @@
1/*
2Copyright 2011 Jun Wako <wakojun@gmail.com>
3
4This program is free software: you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation, either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/
17
18#include "util.h"
19
20// bit population - return number of on-bit
21uint8_t bitpop(uint8_t bits)
22{
23 uint8_t c;
24 for (c = 0; bits; c++)
25 bits &= bits - 1;
26 return c;
27/*
28 const uint8_t bit_count[] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
29 return bit_count[bits>>4] + bit_count[bits&0x0F]
30*/
31}
32
33uint8_t bitpop16(uint16_t bits)
34{
35 uint8_t c;
36 for (c = 0; bits; c++)
37 bits &= bits - 1;
38 return c;
39}
40
41uint8_t bitpop32(uint32_t bits)
42{
43 uint8_t c;
44 for (c = 0; bits; c++)
45 bits &= bits - 1;
46 return c;
47}
48
49// most significant on-bit - return highest location of on-bit
50// NOTE: return 0 when bit0 is on or all bits are off
51uint8_t biton(uint8_t bits)
52{
53 uint8_t n = 0;
54 if (bits >> 4) { bits >>= 4; n += 4;}
55 if (bits >> 2) { bits >>= 2; n += 2;}
56 if (bits >> 1) { bits >>= 1; n += 1;}
57 return n;
58}
59
60uint8_t biton16(uint16_t bits)
61{
62 uint8_t n = 0;
63 if (bits >> 8) { bits >>= 8; n += 8;}
64 if (bits >> 4) { bits >>= 4; n += 4;}
65 if (bits >> 2) { bits >>= 2; n += 2;}
66 if (bits >> 1) { bits >>= 1; n += 1;}
67 return n;
68}
69
70uint8_t biton32(uint32_t bits)
71{
72 uint8_t n = 0;
73 if (bits >>16) { bits >>=16; n +=16;}
74 if (bits >> 8) { bits >>= 8; n += 8;}
75 if (bits >> 4) { bits >>= 4; n += 4;}
76 if (bits >> 2) { bits >>= 2; n += 2;}
77 if (bits >> 1) { bits >>= 1; n += 1;}
78 return n;
79}
80
81
82
83uint8_t bitrev(uint8_t bits)
84{
85 bits = (bits & 0x0f)<<4 | (bits & 0xf0)>>4;
86 bits = (bits & 0b00110011)<<2 | (bits & 0b11001100)>>2;
87 bits = (bits & 0b01010101)<<1 | (bits & 0b10101010)>>1;
88 return bits;
89}
90
91uint16_t bitrev16(uint16_t bits)
92{
93 bits = bitrev(bits & 0x00ff)<<8 | bitrev((bits & 0xff00)>>8);
94 return bits;
95}
96
97uint32_t bitrev32(uint32_t bits)
98{
99 bits = (uint32_t)bitrev16(bits & 0x0000ffff)<<16 | bitrev16((bits & 0xffff0000)>>16);
100 return bits;
101}