diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2012-05-19 13:36:23 +0200 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2012-05-19 16:10:52 +0200 |
commit | 55e01b8de46555929f62a9eb762d7791786ccc58 (patch) | |
tree | 71c657f38d4d5c461803caf8bda362728284fa01 /firmware/target/arm/imx233 | |
parent | 01216c5ad3f2996d16cd7279387d2df859ec019b (diff) | |
download | rockbox-55e01b8de46555929f62a9eb762d7791786ccc58.tar.gz rockbox-55e01b8de46555929f62a9eb762d7791786ccc58.zip |
imx233: enhance lradc driver with touchscreen specific stuff
Change-Id: I83759a00257274c0cbde5a78306256abd2c83800
Diffstat (limited to 'firmware/target/arm/imx233')
-rw-r--r-- | firmware/target/arm/imx233/lradc-imx233.c | 80 | ||||
-rw-r--r-- | firmware/target/arm/imx233/lradc-imx233.h | 29 |
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 */ |
27 | static struct channel_arbiter_t channel_arbiter; | 28 | static 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 */ |
31 | static int battery_chan; | 32 | static int battery_chan; |
32 | static int battery_delay_chan; | 33 | static int battery_delay_chan; |
34 | /* irq callbacks */ | ||
35 | static 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 | |||
43 | void INT_LRADC_CH(int chan) | ||
44 | { | ||
45 | if(irq_cb[chan]) | ||
46 | irq_cb[chan](chan); | ||
47 | } | ||
48 | |||
49 | define_cb(0) | ||
50 | define_cb(1) | ||
51 | define_cb(2) | ||
52 | define_cb(3) | ||
53 | define_cb(4) | ||
54 | define_cb(5) | ||
55 | define_cb(6) | ||
56 | define_cb(7) | ||
57 | |||
58 | void imx233_lradc_set_channel_irq_callback(int channel, lradc_irq_fn_t cb) | ||
59 | { | ||
60 | irq_cb[channel] = cb; | ||
61 | } | ||
33 | 62 | ||
34 | void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src) | 63 | void 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 | ||
57 | void imx233_lradc_kick_channel(int channel) | 86 | void 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 | |||
91 | bool imx233_lradc_read_channel_irq(int channel) | ||
92 | { | ||
93 | return HW_LRADC_CTRL1 & HW_LRADC_CTRL1__LRADCx_IRQ(channel); | ||
94 | } | ||
95 | |||
96 | void 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 | |||
105 | void 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) | |||
68 | void imx233_lradc_wait_channel(int channel) | 116 | void 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 | ||
191 | void imx233_lradc_setup_battery_conversion(bool automatic, unsigned long scale_factor) | 239 | void 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 | ||
254 | void 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 | |||
264 | void 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 | |||
270 | void imx233_lradc_clear_touch_detect_irq(void) | ||
271 | { | ||
272 | __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__TOUCH_DETECT_IRQ; | ||
273 | } | ||
274 | |||
275 | bool imx233_lradc_read_touch_detect(void) | ||
276 | { | ||
277 | return HW_LRADC_STATUS & HW_LRADC_STATUS__TOUCH_DETECT_RAW; | ||
278 | } | ||
279 | |||
206 | void imx233_lradc_init(void) | 280 | void 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 | ||
127 | typedef void (*lradc_irq_fn_t)(int chan); | ||
128 | |||
115 | void imx233_lradc_init(void); | 129 | void imx233_lradc_init(void); |
116 | void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src); | 130 | void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src); |
117 | void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays, | 131 | void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays, |
118 | int loop_count, int delay); | 132 | int loop_count, int delay); |
133 | void imx233_lradc_clear_channel_irq(int channel); | ||
134 | bool imx233_lradc_read_channel_irq(int channel); | ||
135 | void imx233_lradc_enable_channel_irq(int channel, bool enable); | ||
136 | void imx233_lradc_set_channel_irq_callback(int channel, lradc_irq_fn_t cb); | ||
119 | void imx233_lradc_kick_channel(int channel); | 137 | void imx233_lradc_kick_channel(int channel); |
120 | void imx233_lradc_kick_delay(int dchan); | 138 | void imx233_lradc_kick_delay(int dchan); |
121 | void imx233_lradc_wait_channel(int channel); | 139 | void imx233_lradc_wait_channel(int channel); |
@@ -132,6 +150,13 @@ int imx233_lradc_acquire_delay(int timeout); | |||
132 | void imx233_lradc_reserve_delay(int dchannel); | 150 | void imx233_lradc_reserve_delay(int dchannel); |
133 | void imx233_lradc_release_delay(int dchan); | 151 | void imx233_lradc_release_delay(int dchan); |
134 | 152 | ||
153 | /* Setup touch x/yminus pull donws and x/yplus pull ups */ | ||
154 | void imx233_lradc_setup_touch(bool xminus_enable, bool yminus_enable, | ||
155 | bool xplus_enable, bool yplus_enable, bool touch_detect); | ||
156 | void imx233_lradc_enable_touch_detect_irq(bool enable); | ||
157 | void imx233_lradc_clear_touch_detect_irq(void); | ||
158 | bool 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 */ |
137 | int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan); | 162 | int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan); |