summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2012-05-19 13:36:23 +0200
committerAmaury Pouly <amaury.pouly@gmail.com>2012-05-19 16:10:52 +0200
commit55e01b8de46555929f62a9eb762d7791786ccc58 (patch)
tree71c657f38d4d5c461803caf8bda362728284fa01
parent01216c5ad3f2996d16cd7279387d2df859ec019b (diff)
downloadrockbox-55e01b8de46555929f62a9eb762d7791786ccc58.tar.gz
rockbox-55e01b8de46555929f62a9eb762d7791786ccc58.zip
imx233: enhance lradc driver with touchscreen specific stuff
Change-Id: I83759a00257274c0cbde5a78306256abd2c83800
-rw-r--r--firmware/target/arm/imx233/lradc-imx233.c80
-rw-r--r--firmware/target/arm/imx233/lradc-imx233.h29
2 files changed, 104 insertions, 5 deletions
diff --git a/firmware/target/arm/imx233/lradc-imx233.c b/firmware/target/arm/imx233/lradc-imx233.c
index 4d309b0875..e6a3738b9c 100644
--- a/firmware/target/arm/imx233/lradc-imx233.c
+++ b/firmware/target/arm/imx233/lradc-imx233.c
@@ -22,6 +22,7 @@
22#include "system-target.h" 22#include "system-target.h"
23#include "lradc-imx233.h" 23#include "lradc-imx233.h"
24#include "kernel-imx233.h" 24#include "kernel-imx233.h"
25#include "stdlib.h"
25 26
26/* channels */ 27/* channels */
27static struct channel_arbiter_t channel_arbiter; 28static struct channel_arbiter_t channel_arbiter;
@@ -30,6 +31,34 @@ static struct channel_arbiter_t delay_arbiter;
30/* battery is very special, dedicate a channel and a delay to it */ 31/* battery is very special, dedicate a channel and a delay to it */
31static int battery_chan; 32static int battery_chan;
32static int battery_delay_chan; 33static int battery_delay_chan;
34/* irq callbacks */
35static lradc_irq_fn_t irq_cb[HW_LRADC_NUM_CHANNELS];
36
37#define define_cb(x) \
38 void INT_LRADC_CH##x(void) \
39 { \
40 INT_LRADC_CH(x); \
41 }
42
43void INT_LRADC_CH(int chan)
44{
45 if(irq_cb[chan])
46 irq_cb[chan](chan);
47}
48
49define_cb(0)
50define_cb(1)
51define_cb(2)
52define_cb(3)
53define_cb(4)
54define_cb(5)
55define_cb(6)
56define_cb(7)
57
58void imx233_lradc_set_channel_irq_callback(int channel, lradc_irq_fn_t cb)
59{
60 irq_cb[channel] = cb;
61}
33 62
34void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src) 63void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src)
35{ 64{
@@ -54,9 +83,28 @@ void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays,
54 delay << HW_LRADC_DELAYx__DELAY_BP; 83 delay << HW_LRADC_DELAYx__DELAY_BP;
55} 84}
56 85
57void imx233_lradc_kick_channel(int channel) 86void imx233_lradc_clear_channel_irq(int channel)
58{ 87{
59 __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ(channel); 88 __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ(channel);
89}
90
91bool imx233_lradc_read_channel_irq(int channel)
92{
93 return HW_LRADC_CTRL1 & HW_LRADC_CTRL1__LRADCx_IRQ(channel);
94}
95
96void imx233_lradc_enable_channel_irq(int channel, bool enable)
97{
98 if(enable)
99 __REG_SET(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ_EN(channel);
100 else
101 __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ_EN(channel);
102 imx233_lradc_clear_channel_irq(channel);
103}
104
105void imx233_lradc_kick_channel(int channel)
106{
107 imx233_lradc_clear_channel_irq(channel);
60 __REG_SET(HW_LRADC_CTRL0) = HW_LRADC_CTRL0__SCHEDULE(channel); 108 __REG_SET(HW_LRADC_CTRL0) = HW_LRADC_CTRL0__SCHEDULE(channel);
61} 109}
62 110
@@ -68,7 +116,7 @@ void imx233_lradc_kick_delay(int dchan)
68void imx233_lradc_wait_channel(int channel) 116void imx233_lradc_wait_channel(int channel)
69{ 117{
70 /* wait for completion */ 118 /* wait for completion */
71 while(!(HW_LRADC_CTRL1 & HW_LRADC_CTRL1__LRADCx_IRQ(channel))) 119 while(!imx233_lradc_read_channel_irq(channel))
72 yield(); 120 yield();
73} 121}
74 122
@@ -185,7 +233,7 @@ int imx233_lradc_sense_ext_temperature(int chan, int sensor)
185 /* disable sensor current */ 233 /* disable sensor current */
186 imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__0uA); 234 imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__0uA);
187 235
188 return (b - a) / EXT_TEMP_ACC_COUNT; 236 return (abs(b - a) / EXT_TEMP_ACC_COUNT) * 1104 / 1000;
189} 237}
190 238
191void imx233_lradc_setup_battery_conversion(bool automatic, unsigned long scale_factor) 239void imx233_lradc_setup_battery_conversion(bool automatic, unsigned long scale_factor)
@@ -203,6 +251,32 @@ int imx233_lradc_read_battery_voltage(void)
203 return __XTRACT(HW_LRADC_CONVERSION, SCALED_BATT_VOLTAGE); 251 return __XTRACT(HW_LRADC_CONVERSION, SCALED_BATT_VOLTAGE);
204} 252}
205 253
254void imx233_lradc_setup_touch(bool xminus_enable, bool yminus_enable,
255 bool xplus_enable, bool yplus_enable, bool touch_detect)
256{
257 __FIELD_SET_CLR(HW_LRADC_CTRL0, XMINUS_ENABLE, xminus_enable);
258 __FIELD_SET_CLR(HW_LRADC_CTRL0, YMINUS_ENABLE, yminus_enable);
259 __FIELD_SET_CLR(HW_LRADC_CTRL0, XPLUS_ENABLE, xplus_enable);
260 __FIELD_SET_CLR(HW_LRADC_CTRL0, YPLUS_ENABLE, yplus_enable);
261 __FIELD_SET_CLR(HW_LRADC_CTRL0, TOUCH_DETECT_ENABLE, touch_detect);
262}
263
264void imx233_lradc_enable_touch_detect_irq(bool enable)
265{
266 __FIELD_SET_CLR(HW_LRADC_CTRL1, TOUCH_DETECT_IRQ_EN, enable);
267 imx233_lradc_clear_touch_detect_irq();
268}
269
270void imx233_lradc_clear_touch_detect_irq(void)
271{
272 __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__TOUCH_DETECT_IRQ;
273}
274
275bool imx233_lradc_read_touch_detect(void)
276{
277 return HW_LRADC_STATUS & HW_LRADC_STATUS__TOUCH_DETECT_RAW;
278}
279
206void imx233_lradc_init(void) 280void imx233_lradc_init(void)
207{ 281{
208 arbiter_init(&channel_arbiter, HW_LRADC_NUM_CHANNELS); 282 arbiter_init(&channel_arbiter, HW_LRADC_NUM_CHANNELS);
diff --git a/firmware/target/arm/imx233/lradc-imx233.h b/firmware/target/arm/imx233/lradc-imx233.h
index b661fa8aa4..f71843b3db 100644
--- a/firmware/target/arm/imx233/lradc-imx233.h
+++ b/firmware/target/arm/imx233/lradc-imx233.h
@@ -31,12 +31,19 @@
31#define HW_LRADC_BASE 0x80050000 31#define HW_LRADC_BASE 0x80050000
32 32
33#define HW_LRADC_CTRL0 (*(volatile uint32_t *)(HW_LRADC_BASE + 0x0)) 33#define HW_LRADC_CTRL0 (*(volatile uint32_t *)(HW_LRADC_BASE + 0x0))
34#define HW_LRADC_CTRL0__XPLUS_ENABLE (1 << 16)
35#define HW_LRADC_CTRL0__YPLUS_ENABLE (1 << 17)
36#define HW_LRADC_CTRL0__XMINUS_ENABLE (1 << 18)
37#define HW_LRADC_CTRL0__YMINUS_ENABLE (1 << 19)
38#define HW_LRADC_CTRL0__TOUCH_DETECT_ENABLE (1 << 20)
34#define HW_LRADC_CTRL0__ONCHIP_GROUNDREF (1 << 21) 39#define HW_LRADC_CTRL0__ONCHIP_GROUNDREF (1 << 21)
35#define HW_LRADC_CTRL0__SCHEDULE(x) (1 << (x)) 40#define HW_LRADC_CTRL0__SCHEDULE(x) (1 << (x))
36 41
37#define HW_LRADC_CTRL1 (*(volatile uint32_t *)(HW_LRADC_BASE + 0x10)) 42#define HW_LRADC_CTRL1 (*(volatile uint32_t *)(HW_LRADC_BASE + 0x10))
38#define HW_LRADC_CTRL1__LRADCx_IRQ(x) (1 << (x)) 43#define HW_LRADC_CTRL1__LRADCx_IRQ(x) (1 << (x))
39#define HW_LRADC_CTRL1__LRADCx_IRQ_EN(x) (1 << ((x) + 16)) 44#define HW_LRADC_CTRL1__TOUCH_DETECT_IRQ (1 << 8)
45#define HW_LRADC_CTRL1__LRADCx_IRQ_EN(x) (1 << ((x) + 16))
46#define HW_LRADC_CTRL1__TOUCH_DETECT_IRQ_EN (1 << 24)
40 47
41#define HW_LRADC_CTRL2 (*(volatile uint32_t *)(HW_LRADC_BASE + 0x20)) 48#define HW_LRADC_CTRL2 (*(volatile uint32_t *)(HW_LRADC_BASE + 0x20))
42#define HW_LRADC_CTRL2__TEMP_ISRC1_BP 4 49#define HW_LRADC_CTRL2__TEMP_ISRC1_BP 4
@@ -63,6 +70,7 @@
63#define HW_LRADC_CTRL3__CYCLE_TIME__2MHz (3 << 8) 70#define HW_LRADC_CTRL3__CYCLE_TIME__2MHz (3 << 8)
64 71
65#define HW_LRADC_STATUS (*(volatile uint32_t *)(HW_LRADC_BASE + 0x40)) 72#define HW_LRADC_STATUS (*(volatile uint32_t *)(HW_LRADC_BASE + 0x40))
73#define HW_LRADC_STATUS__TOUCH_DETECT_RAW (1 << 0)
66 74
67#define HW_LRADC_CHx(x) (*(volatile uint32_t *)(HW_LRADC_BASE + 0x50 + (x) * 0x10)) 75#define HW_LRADC_CHx(x) (*(volatile uint32_t *)(HW_LRADC_BASE + 0x50 + (x) * 0x10))
68#define HW_LRADC_CHx__NUM_SAMPLES_BM (0x1f << 24) 76#define HW_LRADC_CHx__NUM_SAMPLES_BM (0x1f << 24)
@@ -100,6 +108,10 @@
100#define HW_LRADC_NUM_DELAYS 4 108#define HW_LRADC_NUM_DELAYS 4
101 109
102#define HW_LRADC_CHANNEL(x) (x) 110#define HW_LRADC_CHANNEL(x) (x)
111#define HW_LRADC_CHANNEL_XPLUS HW_LRADC_CHANNEL(2)
112#define HW_LRADC_CHANNEL_YPLUS HW_LRADC_CHANNEL(3)
113#define HW_LRADC_CHANNEL_XMINUS HW_LRADC_CHANNEL(4)
114#define HW_LRADC_CHANNEL_YMINUS HW_LRADC_CHANNEL(5)
103#define HW_LRADC_CHANNEL_VDDIO HW_LRADC_CHANNEL(6) 115#define HW_LRADC_CHANNEL_VDDIO HW_LRADC_CHANNEL(6)
104#define HW_LRADC_CHANNEL_BATTERY HW_LRADC_CHANNEL(7) 116#define HW_LRADC_CHANNEL_BATTERY HW_LRADC_CHANNEL(7)
105#define HW_LRADC_CHANNEL_PMOS_THIN HW_LRADC_CHANNEL(8) 117#define HW_LRADC_CHANNEL_PMOS_THIN HW_LRADC_CHANNEL(8)
@@ -112,10 +124,16 @@
112#define HW_LRADC_CHANNEL_VBG HW_LRADC_CHANNEL(14) 124#define HW_LRADC_CHANNEL_VBG HW_LRADC_CHANNEL(14)
113#define HW_LRADC_CHANNEL_5V HW_LRADC_CHANNEL(15) 125#define HW_LRADC_CHANNEL_5V HW_LRADC_CHANNEL(15)
114 126
127typedef void (*lradc_irq_fn_t)(int chan);
128
115void imx233_lradc_init(void); 129void imx233_lradc_init(void);
116void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src); 130void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src);
117void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays, 131void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays,
118 int loop_count, int delay); 132 int loop_count, int delay);
133void imx233_lradc_clear_channel_irq(int channel);
134bool imx233_lradc_read_channel_irq(int channel);
135void imx233_lradc_enable_channel_irq(int channel, bool enable);
136void imx233_lradc_set_channel_irq_callback(int channel, lradc_irq_fn_t cb);
119void imx233_lradc_kick_channel(int channel); 137void imx233_lradc_kick_channel(int channel);
120void imx233_lradc_kick_delay(int dchan); 138void imx233_lradc_kick_delay(int dchan);
121void imx233_lradc_wait_channel(int channel); 139void imx233_lradc_wait_channel(int channel);
@@ -132,6 +150,13 @@ int imx233_lradc_acquire_delay(int timeout);
132void imx233_lradc_reserve_delay(int dchannel); 150void imx233_lradc_reserve_delay(int dchannel);
133void imx233_lradc_release_delay(int dchan); 151void imx233_lradc_release_delay(int dchan);
134 152
153/* Setup touch x/yminus pull donws and x/yplus pull ups */
154void imx233_lradc_setup_touch(bool xminus_enable, bool yminus_enable,
155 bool xplus_enable, bool yplus_enable, bool touch_detect);
156void imx233_lradc_enable_touch_detect_irq(bool enable);
157void imx233_lradc_clear_touch_detect_irq(void);
158bool imx233_lradc_read_touch_detect(void);
159
135/* enable sensing and return temperature in kelvin, 160/* enable sensing and return temperature in kelvin,
136 * channels needs not to be configured */ 161 * channels needs not to be configured */
137int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan); 162int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan);