summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/rk27xx/hm60x/button-hm60x.c25
-rw-r--r--firmware/target/arm/rk27xx/hm60x/button-target.h2
-rw-r--r--firmware/target/arm/rk27xx/hm801/button-hm801.c27
-rw-r--r--firmware/target/arm/rk27xx/hm801/button-target.h2
4 files changed, 55 insertions, 1 deletions
diff --git a/firmware/target/arm/rk27xx/hm60x/button-hm60x.c b/firmware/target/arm/rk27xx/hm60x/button-hm60x.c
index af31e78133..dfd209ceed 100644
--- a/firmware/target/arm/rk27xx/hm60x/button-hm60x.c
+++ b/firmware/target/arm/rk27xx/hm60x/button-hm60x.c
@@ -23,15 +23,40 @@
#include "system.h"
#include "button.h"
#include "adc.h"
+#include "backlight.h"
void button_init_device(void) {
/* setup button gpio as input */
GPIO_PCCON &= ~(POWEROFF_BUTTON);
+ GPIO_PACON &= ~(1);
+
+ /* setup button gpio as pulldown */
+ SCU_GPIOUPCON |= (1<<17) |
+ 1 ;
+}
+
+bool button_hold() {
+ return (GPIO_PADR & 1);
}
int button_read_device(void) {
int adc_val = adc_read(ADC_BUTTONS);
int gpio_btn = GPIO_PCDR & BUTTON_POWER;
+ static bool hold_button = false;
+ bool hold_button_old;
+
+ hold_button_old = hold_button;
+ hold_button = button_hold();
+
+#ifndef BOOTLOADER
+ if (hold_button != hold_button_old) {
+ backlight_hold_changed(hold_button);
+ }
+#endif
+
+ if (hold_button) {
+ return 0;
+ }
if (adc_val < 380) { /* 0 - 379 */
if (adc_val < 250) { /* 0 - 249 */
diff --git a/firmware/target/arm/rk27xx/hm60x/button-target.h b/firmware/target/arm/rk27xx/hm60x/button-target.h
index ff4c9423b3..b6950b52de 100644
--- a/firmware/target/arm/rk27xx/hm60x/button-target.h
+++ b/firmware/target/arm/rk27xx/hm60x/button-target.h
@@ -21,6 +21,8 @@
#ifndef _BUTTON_TARGET_H_
#define _BUTTON_TARGET_H_
+#define HAS_BUTTON_HOLD
+
#define BUTTON_UP 0x00000001
#define BUTTON_POWER 0x00000002
#define BUTTON_DOWN 0x00000004
diff --git a/firmware/target/arm/rk27xx/hm801/button-hm801.c b/firmware/target/arm/rk27xx/hm801/button-hm801.c
index d0323e6f4d..0ac1b3b0aa 100644
--- a/firmware/target/arm/rk27xx/hm801/button-hm801.c
+++ b/firmware/target/arm/rk27xx/hm801/button-hm801.c
@@ -23,6 +23,7 @@
#include "system.h"
#include "button.h"
#include "adc.h"
+#include "backlight.h"
enum keyboard_type_t {
KEYBOARD_V1,
@@ -34,6 +35,12 @@ static enum keyboard_type_t kbd_type;
void button_init_device(void) {
/* setup button gpio as input */
GPIO_PCCON &= ~(POWEROFF_BUTTON);
+ GPIO_PACON &= ~1;
+
+
+ /* setup button gpio as pulldown */
+ SCU_GPIOUPCON |= (1<<17) |
+ 1 ;
/* identify keyboard type */
SCU_IOMUXB_CON &= ~(1<<2);
@@ -45,6 +52,10 @@ void button_init_device(void) {
}
}
+bool button_hold() {
+ return (GPIO_PADR & 1);
+}
+
static int button_read_device_v1(void) {
int adc_val = adc_read(ADC_BUTTONS);
int button = 0;
@@ -125,7 +136,21 @@ static int button_read_device_v2(void) {
}
int button_read_device(void) {
- if (kbd_type == KEYBOARD_V1) {
+ static bool hold_button = false;
+ bool hold_button_old;
+
+ hold_button_old = hold_button;
+ hold_button = button_hold();
+
+#ifndef BOOTLOADER
+ if (hold_button != hold_button_old) {
+ backlight_hold_changed(hold_button);
+ }
+#endif
+
+ if (hold_button) {
+ return 0;
+ } else if (kbd_type == KEYBOARD_V1) {
return button_read_device_v1();
} else {
return button_read_device_v2();
diff --git a/firmware/target/arm/rk27xx/hm801/button-target.h b/firmware/target/arm/rk27xx/hm801/button-target.h
index 7754f867e5..29c31d0df6 100644
--- a/firmware/target/arm/rk27xx/hm801/button-target.h
+++ b/firmware/target/arm/rk27xx/hm801/button-target.h
@@ -21,6 +21,8 @@
#ifndef _BUTTON_TARGET_H_
#define _BUTTON_TARGET_H_
+#define HAS_BUTTON_HOLD
+
#define BUTTON_UP 0x00000001
#define BUTTON_POWER 0x00000002
#define BUTTON_DOWN 0x00000004