summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/SOURCES1
-rw-r--r--firmware/target/arm/imx233/creative-zen/button-target.h17
-rw-r--r--firmware/target/arm/imx233/creative-zen/button-zen.c216
3 files changed, 105 insertions, 129 deletions
diff --git a/firmware/SOURCES b/firmware/SOURCES
index aec0884c0c..89052fe53d 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -1203,7 +1203,6 @@ target/arm/imx233/creative-zen/button-zen.c
1203target/arm/imx233/creative-zen/debug-zen.c 1203target/arm/imx233/creative-zen/debug-zen.c
1204target/arm/imx233/creative-zen/power-zen.c 1204target/arm/imx233/creative-zen/power-zen.c
1205target/arm/imx233/creative-zen/powermgmt-zen.c 1205target/arm/imx233/creative-zen/powermgmt-zen.c
1206target/arm/imx233/button-lradc-imx233.c
1207#endif 1206#endif
1208 1207
1209#ifdef CREATIVE_ZENXFI2 1208#ifdef CREATIVE_ZENXFI2
diff --git a/firmware/target/arm/imx233/creative-zen/button-target.h b/firmware/target/arm/imx233/creative-zen/button-target.h
index e9a3ac5ab7..eb4f45ccf7 100644
--- a/firmware/target/arm/imx233/creative-zen/button-target.h
+++ b/firmware/target/arm/imx233/creative-zen/button-target.h
@@ -28,23 +28,6 @@ bool button_debug_screen(void);
28/* HOLD button */ 28/* HOLD button */
29#if !defined(CREATIVE_ZENXFISTYLE) 29#if !defined(CREATIVE_ZENXFISTYLE)
30#define HAS_BUTTON_HOLD 30#define HAS_BUTTON_HOLD
31#define IMX233_BUTTON_LRADC_HOLD_DET BLH_ADC
32#endif
33
34/* VDDIO value */
35#if defined(CREATIVE_ZENXFISTYLE)
36#define IMX233_BUTTON_LRADC_VDDIO 3660
37#elif defined(CREATIVE_ZEN)
38#define IMX233_BUTTON_LRADC_VDDIO 3480
39#elif defined(CREATIVE_ZENXFI)
40#define IMX233_BUTTON_LRADC_VDDIO 3500
41#endif
42
43/* LRADC channel */
44#if defined(CREATIVE_ZENXFISTYLE)
45#define IMX233_BUTTON_LRADC_CHANNEL 2
46#else
47#define IMX233_BUTTON_LRADC_CHANNEL 0
48#endif 31#endif
49 32
50/* Main unit's buttons */ 33/* Main unit's buttons */
diff --git a/firmware/target/arm/imx233/creative-zen/button-zen.c b/firmware/target/arm/imx233/creative-zen/button-zen.c
index fa01e9370e..ed54d42eb8 100644
--- a/firmware/target/arm/imx233/creative-zen/button-zen.c
+++ b/firmware/target/arm/imx233/creative-zen/button-zen.c
@@ -23,137 +23,131 @@
23#include "system-target.h" 23#include "system-target.h"
24#include "pinctrl-imx233.h" 24#include "pinctrl-imx233.h"
25#include "power-imx233.h" 25#include "power-imx233.h"
26#include "button-lradc-imx233.h" 26#include "button-imx233.h"
27 27
28#if defined(CREATIVE_ZENXFI) || defined(CREATIVE_ZENMOZAIC) 28#if defined(CREATIVE_ZENXFISTYLE)
29#define JACK_DET_BANK 2 29#define CHAN 2
30#define JACK_DET_PIN 8 30#define I_VDDIO 0 /* index in the table */
31#define JACK_DET_INVERTED 31
32#elif defined(CREATIVE_ZENXFISTYLE) 32struct imx233_button_map_t imx233_button_map[] =
33#define JACK_DET_BANK 2 33{
34#define JACK_DET_PIN 7 34 [I_VDDIO] = IMX233_BUTTON_(VDDIO, VDDIO(3660), "vddio"), /* we need VDDIO for relative */
35#endif 35 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 230, I_VDDIO), "menu"),
36 IMX233_BUTTON(SHORTCUT, LRADC_REL(CHAN, 480, I_VDDIO), "shortcut"),
37 IMX233_BUTTON(UP, LRADC_REL(CHAN, 690, I_VDDIO), "up"),
38 IMX233_BUTTON(LEFT, LRADC_REL(CHAN, 920, I_VDDIO), "left"),
39 IMX233_BUTTON(RIGHT, LRADC_REL(CHAN, 1120, I_VDDIO), "right"),
40 IMX233_BUTTON(DOWN, LRADC_REL(CHAN, 1335, I_VDDIO), "down"),
41 IMX233_BUTTON(SELECT, LRADC_REL(CHAN, 1565, I_VDDIO), "select"),
42 IMX233_BUTTON(BACK, LRADC_REL(CHAN, 2850, I_VDDIO), "back"),
43 IMX233_BUTTON(PLAYPAUSE, LRADC_REL(CHAN, 3110, I_VDDIO), "play"),
44 IMX233_BUTTON_(JACK, GPIO(2, 7), "jack"),
45 IMX233_BUTTON(POWER, GPIO(0, 11), "power", INVERTED),
46 IMX233_BUTTON_(END, END(), "")
47};
48#elif defined(CREATIVE_ZEN)
49#define CHAN 0
50#define I_VDDIO 0 /* index in the table */
36 51
37struct imx233_button_lradc_mapping_t imx233_button_lradc_mapping[] = 52struct imx233_button_map_t imx233_button_map[] =
38{ 53{
39#if defined(CREATIVE_ZEN) 54 [I_VDDIO] = IMX233_BUTTON_(VDDIO, VDDIO(3480), "vddio"), /* we need VDDIO for relative */
40 {200, IMX233_BUTTON_LRADC_HOLD}, 55 IMX233_BUTTON_(HOLD, LRADC_REL(CHAN, 200, I_VDDIO), "hold"),
41 {250, BUTTON_MENU}, 56 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 250, I_VDDIO), "menu"),
42 {520, BUTTON_SHORTCUT}, 57 IMX233_BUTTON(SHORTCUT, LRADC_REL(CHAN, 520, I_VDDIO), "shortcut"),
43 {1490, BUTTON_UP}, 58 IMX233_BUTTON(UP, LRADC_REL(CHAN, 1490, I_VDDIO), "up"),
44 {1740, BUTTON_SELECT}, 59 IMX233_BUTTON(SELECT, LRADC_REL(CHAN, 1740, I_VDDIO), "select"),
45 {2015, BUTTON_LEFT}, 60 IMX233_BUTTON(LEFT, LRADC_REL(CHAN, 2015, I_VDDIO), "left"),
46 {2255, BUTTON_RIGHT}, 61 IMX233_BUTTON(RIGHT, LRADC_REL(CHAN, 2255, I_VDDIO), "right"),
47 {2485, BUTTON_DOWN}, 62 IMX233_BUTTON(DOWN, LRADC_REL(CHAN, 2485, I_VDDIO), "down"),
48 {2700, BUTTON_BACK}, 63 IMX233_BUTTON(BACK, LRADC_REL(CHAN, 2700, I_VDDIO), "back"),
49 {2945, BUTTON_PLAYPAUSE}, 64 IMX233_BUTTON(PLAYPAUSE, LRADC_REL(CHAN, 2945, I_VDDIO), "play"),
50 {3400, 0}, 65 IMX233_BUTTON(POWER, PSWITCH(1), "power"),
51 {0, IMX233_BUTTON_LRADC_END}, 66 IMX233_BUTTON_(END, END(), "")
67};
52#elif defined(CREATIVE_ZENXFI) 68#elif defined(CREATIVE_ZENXFI)
53 {0, IMX233_BUTTON_LRADC_HOLD}, 69#define CHAN 0
54 {200, BUTTON_MENU}, 70#define I_VDDIO 0 /* index in the table */
55 {445, BUTTON_SHORTCUT}, 71
56 {645, BUTTON_UP}, 72struct imx233_button_map_t imx233_button_map[] =
57 {860, BUTTON_LEFT}, 73{
58 {1060, BUTTON_RIGHT}, 74 [I_VDDIO] = IMX233_BUTTON_(VDDIO, VDDIO(3500), "vddio"), /* we need VDDIO for relative */
59 {1260, BUTTON_DOWN}, 75 IMX233_BUTTON_(HOLD, LRADC_REL(CHAN, 0, I_VDDIO), "hold"),
60 {1480, BUTTON_SELECT}, 76 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 200, I_VDDIO), "menu"),
61 {1700, BUTTON_TOPRIGHT}, 77 IMX233_BUTTON(SHORTCUT, LRADC_REL(CHAN, 445, I_VDDIO), "shortcut"),
62 {1920, BUTTON_BOTTOMLEFT}, 78 IMX233_BUTTON(UP, LRADC_REL(CHAN, 645, I_VDDIO), "up"),
63 {2145, BUTTON_TOPLEFT}, 79 IMX233_BUTTON(LEFT, LRADC_REL(CHAN, 860, I_VDDIO), "left"),
64 {2460, BUTTON_BOTTOMRIGHT}, 80 IMX233_BUTTON(RIGHT, LRADC_REL(CHAN, 1060, I_VDDIO), "right"),
65 {2700, BUTTON_BACK}, 81 IMX233_BUTTON(DOWN, LRADC_REL(CHAN, 1260, I_VDDIO), "down"),
66 {2945, BUTTON_PLAYPAUSE}, 82 IMX233_BUTTON(SELECT, LRADC_REL(CHAN, 1480, I_VDDIO), "select"),
67 {3400, 0}, 83 IMX233_BUTTON(TOPRIGHT, LRADC_REL(CHAN, 1700, I_VDDIO), "topright"),
68 {0, IMX233_BUTTON_LRADC_END}, 84 IMX233_BUTTON(BOTTOMLEFT, LRADC_REL(CHAN, 1920, I_VDDIO), "bottomleft"),
69#elif defined(CREATIVE_ZENV) 85 IMX233_BUTTON(TOPLEFT, LRADC_REL(CHAN, 2145, I_VDDIO), "topleft"),
70 {190, IMX233_BUTTON_LRADC_HOLD}, 86 IMX233_BUTTON(BOTTOMRIGHT, LRADC_REL(CHAN, 2460, I_VDDIO), "bottomright"),
71 {250, BUTTON_PLAYPAUSE}, 87 IMX233_BUTTON(BACK, LRADC_REL(CHAN, 2700, I_VDDIO), "back"),
72 {530, BUTTON_BACK}, 88 IMX233_BUTTON(PLAYPAUSE, LRADC_REL(CHAN, 2945, I_VDDIO), "play"),
73 {785, BUTTON_VOL_UP}, 89 IMX233_BUTTON(POWER, PSWITCH(1), "power"),
74 {1040, BUTTON_VOL_DOWN}, 90 IMX233_BUTTON_(JACK, GPIO(2, 8), "jack", INVERTED),
75 {1295, BUTTON_MENU}, 91 IMX233_BUTTON_(END, END(), "")
76 {1540, BUTTON_UP},
77 {1800, BUTTON_SELECT},
78 {2070, BUTTON_LEFT},
79 {2315, BUTTON_RIGHT},
80 {2550, BUTTON_DOWN},
81 {3450, 0},
82 {0, IMX233_BUTTON_LRADC_END},
83#elif defined(CREATIVE_ZENMOZAIC)
84 {0, IMX233_BUTTON_LRADC_HOLD},
85 {200, BUTTON_MENU},
86 {445, BUTTON_SHORTCUT},
87 {645, BUTTON_UP},
88 {860, BUTTON_LEFT},
89 {1060, BUTTON_RIGHT},
90 {1260, BUTTON_DOWN},
91 {1480, BUTTON_SELECT},
92 {2700, BUTTON_BACK},
93 {2945, BUTTON_PLAYPAUSE},
94 {3400, 0},
95 {0, IMX233_BUTTON_LRADC_END},
96#elif defined(CREATIVE_ZENXFISTYLE)
97 {230, BUTTON_MENU},
98 {480, BUTTON_SHORTCUT},
99 {690, BUTTON_UP},
100 {920, BUTTON_LEFT},
101 {1120, BUTTON_RIGHT},
102 {1335, BUTTON_DOWN},
103 {1565, BUTTON_SELECT},
104 {2850, BUTTON_BACK},
105 {3110, BUTTON_PLAYPAUSE},
106 {3620, 0},
107 {0, IMX233_BUTTON_LRADC_END},
108#else
109#error wrong target
110#endif
111}; 92};
93#elif defined(CREATIVE_ZENMOZAIC)
94#define CHAN 0
95#define I_VDDIO 0 /* index in the table */
112 96
113void button_init_device(void) 97struct imx233_button_map_t imx233_button_map[] =
114{ 98{
115 imx233_button_lradc_init(); 99 [I_VDDIO] = IMX233_BUTTON_(VDDIO, VDDIO(3500), "vddio"), /* we need VDDIO for relative */
116#ifdef HAVE_HEADPHONE_DETECTION 100 IMX233_BUTTON_(HOLD, LRADC_REL(CHAN, 0, I_VDDIO), "hold"),
117 imx233_pinctrl_acquire(JACK_DET_BANK, JACK_DET_PIN, "jack_detect"); 101 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 200, I_VDDIO), "menu"),
118 imx233_pinctrl_set_function(JACK_DET_BANK, JACK_DET_PIN, PINCTRL_FUNCTION_GPIO); 102 IMX233_BUTTON(SHORTCUT, LRADC_REL(CHAN, 445, I_VDDIO), "shortcut"),
119 imx233_pinctrl_enable_gpio(JACK_DET_BANK, JACK_DET_PIN, false); 103 IMX233_BUTTON(UP, LRADC_REL(CHAN, 645, I_VDDIO), "up"),
120#endif 104 IMX233_BUTTON(LEFT, LRADC_REL(CHAN, 860, I_VDDIO), "left"),
121#ifdef CREATIVE_ZENXFISTYLE 105 IMX233_BUTTON(RIGHT, LRADC_REL(CHAN, 1060, I_VDDIO), "right"),
122 imx233_pinctrl_acquire(0, 11, "power_detect"); 106 IMX233_BUTTON(DOWN, LRADC_REL(CHAN, 1260, I_VDDIO), "down"),
123 imx233_pinctrl_set_function(0, 11, PINCTRL_FUNCTION_GPIO); 107 IMX233_BUTTON(SELECT, LRADC_REL(CHAN, 1480, I_VDDIO), "select"),
124 imx233_pinctrl_enable_gpio(0, 11, false); 108 IMX233_BUTTON(BACK, LRADC_REL(CHAN, 2700, I_VDDIO), "back"),
125#endif 109 IMX233_BUTTON(PLAYPAUSE, LRADC_REL(CHAN, 2945, I_VDDIO), "play"),
126} 110 IMX233_BUTTON(POWER, PSWITCH(1), "power"),
111 IMX233_BUTTON_(JACK, GPIO(2, 8), "jack"),
112 IMX233_BUTTON_(END, END(), "")
113};
114#elif defined(CREATIVE_ZENV)
115#define CHAN 0
116#define I_VDDIO 0 /* index in the table */
127 117
128#ifdef HAS_BUTTON_HOLD 118struct imx233_button_map_t imx233_button_map[] =
129bool button_hold(void)
130{ 119{
131 return imx233_button_lradc_hold(); 120 [I_VDDIO] = IMX233_BUTTON_(VDDIO, VDDIO(3500), "vddio"), /* we need VDDIO for relative */
132} 121 IMX233_BUTTON_(HOLD, LRADC_REL(CHAN, 190, I_VDDIO), "hold"),
122 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 250, I_VDDIO), "play"),
123 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 530, I_VDDIO), "back"),
124 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 785, I_VDDIO), "vol_up"),
125 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 1040, I_VDDIO), "vol_down"),
126 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 1295, I_VDDIO), "menu"),
127 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 1540, I_VDDIO), "up"),
128 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 1800, I_VDDIO), "select"),
129 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 2070, I_VDDIO), "left"),
130 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 2315, I_VDDIO), "right"),
131 IMX233_BUTTON(MENU, LRADC_REL(CHAN, 2550, I_VDDIO), "down"),
132 IMX233_BUTTON(POWER, PSWITCH(1), "power"),
133 IMX233_BUTTON_(END, END(), "")
134};
135#else
136#error wrong target
133#endif 137#endif
134 138
135#ifdef HAVE_HEADPHONE_DETECTION 139void button_init_device(void)
136bool headphones_inserted(void)
137{ 140{
138 bool det = imx233_pinctrl_get_gpio(JACK_DET_BANK, JACK_DET_PIN); 141 imx233_button_init();
139#ifdef JACK_DET_INVERTED
140 det = !det;
141#endif
142 return det;
143} 142}
144#endif
145 143
146int button_read_device(void) 144int button_read_device(void)
147{ 145{
148 int btn = 0; 146 int btn = 0;
149#ifdef CREATIVE_ZENXFISTYLE 147#ifdef CREATIVE_ZENXFISTYLE
150 /* The ZEN X-Fi Style uses a GPIO because both select and power are wired
151 * to PSWITCH resulting in slow and unreliable readings */
152 if(!imx233_pinctrl_get_gpio(0, 11))
153 btn |= BUTTON_POWER;
154#else 148#else
155 if(imx233_power_read_pswitch() == 1) 149 if(imx233_power_read_pswitch() == 1)
156 btn |= BUTTON_POWER; 150 btn |= BUTTON_POWER;
157#endif 151#endif
158 return imx233_button_lradc_read(btn); 152 return imx233_button_read(btn);
159} 153}