5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
28 if (~KEYS_GPIO_REG_PGUP
& KEYS_GPIO_PIN_PGUP
)
29 result
|= 1 << KEY_PGUP
;
31 if (~KEYS_GPIO_REG_PGDN
& KEYS_GPIO_PIN_PGDN
)
32 result
|= 1 << KEY_PGDN
;
33 if (~KEYS_GPIO_REG_ENTER
& KEYS_GPIO_PIN_ENTER
)
34 result
|= 1 << KEY_ENTER
;
35 if (~KEYS_GPIO_REG_UP
& KEYS_GPIO_PIN_UP
)
36 result
|= 1 << KEY_MODEL
;
37 if (~KEYS_GPIO_REG_DOWN
& KEYS_GPIO_PIN_DOWN
)
38 result
|= 1 << KEY_EXIT
;
39 if (~KEYS_GPIO_REG_RIGHT
& KEYS_GPIO_PIN_RIGHT
)
40 result
|= 1 << KEY_TELEM
;
41 if (~KEYS_GPIO_REG_LEFT
& KEYS_GPIO_PIN_LEFT
)
42 result
|= 1 << KEY_RADIO
;
44 // TRACE("readKeys(): %x", result);
53 if (~TRIMS_GPIO_REG_LHL
& TRIMS_GPIO_PIN_LHL
)
55 if (~TRIMS_GPIO_REG_LHR
& TRIMS_GPIO_PIN_LHR
)
57 if (~TRIMS_GPIO_REG_LVD
& TRIMS_GPIO_PIN_LVD
)
59 if (~TRIMS_GPIO_REG_LVU
& TRIMS_GPIO_PIN_LVU
)
61 if (~TRIMS_GPIO_REG_RVD
& TRIMS_GPIO_PIN_RVD
)
63 if (~TRIMS_GPIO_REG_RVU
& TRIMS_GPIO_PIN_RVU
)
65 if (~TRIMS_GPIO_REG_RHL
& TRIMS_GPIO_PIN_RHL
)
67 if (~TRIMS_GPIO_REG_RHR
& TRIMS_GPIO_PIN_RHR
)
69 if (~TRIMS_GPIO_REG_LSD
& TRIMS_GPIO_PIN_LSD
)
71 if (~TRIMS_GPIO_REG_LSU
& TRIMS_GPIO_PIN_LSU
)
73 if (~TRIMS_GPIO_REG_RSD
& TRIMS_GPIO_PIN_RSD
)
75 if (~TRIMS_GPIO_REG_RSU
& TRIMS_GPIO_PIN_RSU
)
77 // TRACE("readTrims(): result=0x%04x", result);
82 bool trimDown(uint8_t idx
)
84 return readTrims() & ((uint32_t)1 << idx
);
89 return readKeys() || readTrims();
92 /* TODO common to ARM */
93 void readKeysAndTrims()
98 uint32_t keys_input
= readKeys();
99 for (i
= 0; i
< TRM_BASE
; i
++) {
100 keys
[index
++].input(keys_input
& (1 << i
));
103 uint32_t trims_input
= readTrims();
104 for (i
= 1; i
<= 1 << (TRM_LAST
-TRM_BASE
); i
<<= 1) {
105 keys
[index
++].input(trims_input
& i
);
108 if ((keys_input
|| trims_input
) && (g_eeGeneral
.backlightMode
& e_backlight_mode_keys
)) {
109 // on keypress turn the light on
114 #define ADD_2POS_CASE(x) \
115 case SW_S ## x ## 0: \
116 xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
118 case SW_S ## x ## 2: \
119 xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
121 #define ADD_INV_2POS_CASE(x) \
122 case SW_S ## x ## 2: \
123 xxx = SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
125 case SW_S ## x ## 0: \
126 xxx = ~SWITCHES_GPIO_REG_ ## x & SWITCHES_GPIO_PIN_ ## x ; \
128 #define ADD_3POS_CASE(x, i) \
129 case SW_S ## x ## 0: \
130 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
132 xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
135 case SW_S ## x ## 1: \
136 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
138 case SW_S ## x ## 2: \
139 xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
141 xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
144 #define ADD_INV_3POS_CASE(x, i) \
145 case SW_S ## x ## 2: \
146 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
148 xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
151 case SW_S ## x ## 1: \
152 xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H) && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
154 case SW_S ## x ## 0: \
155 xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \
157 xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \
162 uint32_t switchState(uint8_t index
)
173 ADD_INV_2POS_CASE(F
);
180 ADD_INV_3POS_CASE(B
, 1);
182 ADD_INV_3POS_CASE(D
, 3);
183 ADD_INV_3POS_CASE(E
, 4);
194 // TRACE("switch %d => %d", index, xxx);
201 GPIO_InitTypeDef GPIO_InitStructure
;
202 GPIO_InitStructure
.GPIO_Speed
= GPIO_Speed_2MHz
;
203 GPIO_InitStructure
.GPIO_OType
= GPIO_OType_PP
;
204 GPIO_InitStructure
.GPIO_PuPd
= GPIO_PuPd_UP
;
205 GPIO_InitStructure
.GPIO_Mode
= GPIO_Mode_IN
;
207 INIT_KEYS_PINS(GPIOB
);
209 #if defined(KEYS_GPIOC_PINS)
210 INIT_KEYS_PINS(GPIOC
);
213 INIT_KEYS_PINS(GPIOD
);
214 INIT_KEYS_PINS(GPIOE
);
215 INIT_KEYS_PINS(GPIOG
);
216 INIT_KEYS_PINS(GPIOH
);
217 INIT_KEYS_PINS(GPIOI
);
218 INIT_KEYS_PINS(GPIOJ
);