diff options
Diffstat (limited to 'firmware/target/arm/imx233/lradc-imx233.c')
-rw-r--r-- | firmware/target/arm/imx233/lradc-imx233.c | 115 |
1 files changed, 57 insertions, 58 deletions
diff --git a/firmware/target/arm/imx233/lradc-imx233.c b/firmware/target/arm/imx233/lradc-imx233.c index e6a3738b9c..4fe05f36f7 100644 --- a/firmware/target/arm/imx233/lradc-imx233.c +++ b/firmware/target/arm/imx233/lradc-imx233.c | |||
@@ -32,7 +32,7 @@ static struct channel_arbiter_t delay_arbiter; | |||
32 | static int battery_chan; | 32 | static int battery_chan; |
33 | static int battery_delay_chan; | 33 | static int battery_delay_chan; |
34 | /* irq callbacks */ | 34 | /* irq callbacks */ |
35 | static lradc_irq_fn_t irq_cb[HW_LRADC_NUM_CHANNELS]; | 35 | static lradc_irq_fn_t irq_cb[LRADC_NUM_CHANNELS]; |
36 | 36 | ||
37 | #define define_cb(x) \ | 37 | #define define_cb(x) \ |
38 | void INT_LRADC_CH##x(void) \ | 38 | void INT_LRADC_CH##x(void) \ |
@@ -62,55 +62,51 @@ void imx233_lradc_set_channel_irq_callback(int channel, lradc_irq_fn_t cb) | |||
62 | 62 | ||
63 | 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) |
64 | { | 64 | { |
65 | __REG_CLR(HW_LRADC_CHx(channel)) = HW_LRADC_CHx__NUM_SAMPLES_BM | HW_LRADC_CHx__ACCUMULATE; | 65 | HW_LRADC_CHn_CLR(channel) = BM_OR2(LRADC_CHn, NUM_SAMPLES, ACCUMULATE); |
66 | __REG_SET(HW_LRADC_CHx(channel)) = nr_samples << HW_LRADC_CHx__NUM_SAMPLES_BP | | 66 | HW_LRADC_CHn_SET(channel) = BF_OR2(LRADC_CHn, NUM_SAMPLES(nr_samples), ACCUMULATE(acc)); |
67 | acc << HW_LRADC_CHx__ACCUMULATE; | ||
68 | if(div2) | 67 | if(div2) |
69 | __REG_SET(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__DIVIDE_BY_TWO(channel); | 68 | BF_SETV(LRADC_CTRL2, DIVIDE_BY_TWO, 1 << channel); |
70 | else | 69 | else |
71 | __REG_CLR(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__DIVIDE_BY_TWO(channel); | 70 | BF_CLRV(LRADC_CTRL2, DIVIDE_BY_TWO, 1 << channel); |
72 | __REG_CLR(HW_LRADC_CTRL4) = HW_LRADC_CTRL4__LRADCxSELECT_BM(channel); | 71 | HW_LRADC_CTRL4_CLR = BM_LRADC_CTRL4_LRADCxSELECT(channel); |
73 | __REG_SET(HW_LRADC_CTRL4) = src << HW_LRADC_CTRL4__LRADCxSELECT_BP(channel); | 72 | HW_LRADC_CTRL4_SET = src << BP_LRADC_CTRL4_LRADCxSELECT(channel); |
74 | } | 73 | } |
75 | 74 | ||
76 | void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays, | 75 | void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays, |
77 | int loop_count, int delay) | 76 | int loop_count, int delay) |
78 | { | 77 | { |
79 | HW_LRADC_DELAYx(dchan) = | 78 | HW_LRADC_DELAYn(dchan) = BF_OR4(LRADC_DELAYn, TRIGGER_LRADCS(trigger_lradc), |
80 | trigger_lradc << HW_LRADC_DELAYx__TRIGGER_LRADCS_BP | | 79 | TRIGGER_DELAYS(trigger_delays), LOOP_COUNT(loop_count), DELAY(delay)); |
81 | trigger_delays << HW_LRADC_DELAYx__TRIGGER_DELAYS_BP | | ||
82 | loop_count << HW_LRADC_DELAYx__LOOP_COUNT_BP | | ||
83 | delay << HW_LRADC_DELAYx__DELAY_BP; | ||
84 | } | 80 | } |
85 | 81 | ||
86 | void imx233_lradc_clear_channel_irq(int channel) | 82 | void imx233_lradc_clear_channel_irq(int channel) |
87 | { | 83 | { |
88 | __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ(channel); | 84 | BF_CLR(LRADC_CTRL1, LRADCx_IRQ(channel)); |
89 | } | 85 | } |
90 | 86 | ||
91 | bool imx233_lradc_read_channel_irq(int channel) | 87 | bool imx233_lradc_read_channel_irq(int channel) |
92 | { | 88 | { |
93 | return HW_LRADC_CTRL1 & HW_LRADC_CTRL1__LRADCx_IRQ(channel); | 89 | return BF_RD(LRADC_CTRL1, LRADCx_IRQ(channel)); |
94 | } | 90 | } |
95 | 91 | ||
96 | void imx233_lradc_enable_channel_irq(int channel, bool enable) | 92 | void imx233_lradc_enable_channel_irq(int channel, bool enable) |
97 | { | 93 | { |
98 | if(enable) | 94 | if(enable) |
99 | __REG_SET(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ_EN(channel); | 95 | BF_SET(LRADC_CTRL1, LRADCx_IRQ_EN(channel)); |
100 | else | 96 | else |
101 | __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ_EN(channel); | 97 | BF_CLR(LRADC_CTRL1, LRADCx_IRQ_EN(channel)); |
102 | imx233_lradc_clear_channel_irq(channel); | 98 | imx233_lradc_clear_channel_irq(channel); |
103 | } | 99 | } |
104 | 100 | ||
105 | void imx233_lradc_kick_channel(int channel) | 101 | void imx233_lradc_kick_channel(int channel) |
106 | { | 102 | { |
107 | imx233_lradc_clear_channel_irq(channel); | 103 | imx233_lradc_clear_channel_irq(channel); |
108 | __REG_SET(HW_LRADC_CTRL0) = HW_LRADC_CTRL0__SCHEDULE(channel); | 104 | BF_SETV(LRADC_CTRL0, SCHEDULE, 1 << channel); |
109 | } | 105 | } |
110 | 106 | ||
111 | void imx233_lradc_kick_delay(int dchan) | 107 | void imx233_lradc_kick_delay(int dchan) |
112 | { | 108 | { |
113 | __REG_SET(HW_LRADC_DELAYx(dchan)) = HW_LRADC_DELAYx__KICK; | 109 | BF_SETn(LRADC_DELAYn, dchan, KICK); |
114 | } | 110 | } |
115 | 111 | ||
116 | void imx233_lradc_wait_channel(int channel) | 112 | void imx233_lradc_wait_channel(int channel) |
@@ -122,12 +118,12 @@ void imx233_lradc_wait_channel(int channel) | |||
122 | 118 | ||
123 | int imx233_lradc_read_channel(int channel) | 119 | int imx233_lradc_read_channel(int channel) |
124 | { | 120 | { |
125 | return __XTRACT_EX(HW_LRADC_CHx(channel), HW_LRADC_CHx__VALUE); | 121 | return BF_RDn(LRADC_CHn, channel, VALUE); |
126 | } | 122 | } |
127 | 123 | ||
128 | void imx233_lradc_clear_channel(int channel) | 124 | void imx233_lradc_clear_channel(int channel) |
129 | { | 125 | { |
130 | __REG_CLR(HW_LRADC_CHx(channel)) = HW_LRADC_CHx__VALUE_BM; | 126 | BF_CLRn(LRADC_CHn, channel, VALUE); |
131 | } | 127 | } |
132 | 128 | ||
133 | int imx233_lradc_acquire_channel(int timeout) | 129 | int imx233_lradc_acquire_channel(int timeout) |
@@ -162,10 +158,10 @@ void imx233_lradc_reserve_delay(int channel) | |||
162 | 158 | ||
163 | int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan) | 159 | int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan) |
164 | { | 160 | { |
165 | imx233_lradc_setup_channel(nmos_chan, false, false, 0, HW_LRADC_CHANNEL_NMOS_THIN); | 161 | imx233_lradc_setup_channel(nmos_chan, false, false, 0, LRADC_SRC_NMOS_THIN); |
166 | imx233_lradc_setup_channel(pmos_chan, false, false, 0, HW_LRADC_CHANNEL_PMOS_THIN); | 162 | imx233_lradc_setup_channel(pmos_chan, false, false, 0, LRADC_SRC_PMOS_THIN); |
167 | // mux sensors | 163 | // mux sensors |
168 | __REG_CLR(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD; | 164 | BF_CLR(LRADC_CTRL2, TEMPSENSE_PWD); |
169 | imx233_lradc_clear_channel(nmos_chan); | 165 | imx233_lradc_clear_channel(nmos_chan); |
170 | imx233_lradc_clear_channel(pmos_chan); | 166 | imx233_lradc_clear_channel(pmos_chan); |
171 | // schedule both channels | 167 | // schedule both channels |
@@ -175,7 +171,7 @@ int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan) | |||
175 | imx233_lradc_wait_channel(nmos_chan); | 171 | imx233_lradc_wait_channel(nmos_chan); |
176 | imx233_lradc_wait_channel(pmos_chan); | 172 | imx233_lradc_wait_channel(pmos_chan); |
177 | // mux sensors | 173 | // mux sensors |
178 | __REG_SET(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD; | 174 | BF_SET(LRADC_CTRL2, TEMPSENSE_PWD); |
179 | // do the computation | 175 | // do the computation |
180 | int diff = imx233_lradc_read_channel(nmos_chan) - imx233_lradc_read_channel(pmos_chan); | 176 | int diff = imx233_lradc_read_channel(nmos_chan) - imx233_lradc_read_channel(pmos_chan); |
181 | // return diff * 1.012 / 4 | 177 | // return diff * 1.012 / 4 |
@@ -187,19 +183,19 @@ static void imx233_lradc_set_temp_isrc(int sensor, int value) | |||
187 | { | 183 | { |
188 | if(sensor < 0 || sensor > 1) | 184 | if(sensor < 0 || sensor > 1) |
189 | panicf("imx233_lradc_set_temp_isrc: invalid sensor"); | 185 | panicf("imx233_lradc_set_temp_isrc: invalid sensor"); |
190 | unsigned mask = HW_LRADC_CTRL2__TEMP_ISRCx_BM(sensor); | 186 | unsigned mask = sensor ? BM_LRADC_CTRL2_TEMP_ISRC0 : BM_LRADC_CTRL2_TEMP_ISRC1; |
191 | unsigned bp = HW_LRADC_CTRL2__TEMP_ISRCx_BP(sensor); | 187 | unsigned bp = sensor ? BP_LRADC_CTRL2_TEMP_ISRC0 : BP_LRADC_CTRL2_TEMP_ISRC1; |
192 | unsigned en = HW_LRADC_CTRL2__TEMP_SENSOR_IENABLEx(sensor); | 188 | unsigned en = sensor ? BM_LRADC_CTRL2_TEMP_SENSOR_IENABLE0 : BM_LRADC_CTRL2_TEMP_SENSOR_IENABLE1; |
193 | 189 | ||
194 | __REG_CLR(HW_LRADC_CTRL2) = mask; | 190 | HW_LRADC_CTRL2_CLR = mask; |
195 | __REG_SET(HW_LRADC_CTRL2) = value << bp; | 191 | HW_LRADC_CTRL2_SET = value << bp; |
196 | if(value != 0) | 192 | if(value != 0) |
197 | { | 193 | { |
198 | __REG_SET(HW_LRADC_CTRL2) = en; | 194 | HW_LRADC_CTRL2_SET = en; |
199 | udelay(100); | 195 | udelay(100); |
200 | } | 196 | } |
201 | else | 197 | else |
202 | __REG_CLR(HW_LRADC_CTRL2) = en; | 198 | HW_LRADC_CTRL2_CLR = en; |
203 | } | 199 | } |
204 | 200 | ||
205 | int imx233_lradc_sense_ext_temperature(int chan, int sensor) | 201 | int imx233_lradc_sense_ext_temperature(int chan, int sensor) |
@@ -208,7 +204,7 @@ int imx233_lradc_sense_ext_temperature(int chan, int sensor) | |||
208 | /* setup channel */ | 204 | /* setup channel */ |
209 | imx233_lradc_setup_channel(chan, false, false, 0, sensor); | 205 | imx233_lradc_setup_channel(chan, false, false, 0, sensor); |
210 | /* set current source to 300µA */ | 206 | /* set current source to 300µA */ |
211 | imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__300uA); | 207 | imx233_lradc_set_temp_isrc(sensor, BV_LRADC_CTRL2_TEMP_ISRC0__300); |
212 | /* read value and accumulate */ | 208 | /* read value and accumulate */ |
213 | int a = 0; | 209 | int a = 0; |
214 | for(int i = 0; i < EXT_TEMP_ACC_COUNT; i++) | 210 | for(int i = 0; i < EXT_TEMP_ACC_COUNT; i++) |
@@ -220,7 +216,7 @@ int imx233_lradc_sense_ext_temperature(int chan, int sensor) | |||
220 | } | 216 | } |
221 | /* setup channel for small accumulation */ | 217 | /* setup channel for small accumulation */ |
222 | /* set current source to 20µA */ | 218 | /* set current source to 20µA */ |
223 | imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__20uA); | 219 | imx233_lradc_set_temp_isrc(sensor, BV_LRADC_CTRL2_TEMP_ISRC0__20); |
224 | /* read value */ | 220 | /* read value */ |
225 | int b = 0; | 221 | int b = 0; |
226 | for(int i = 0; i < EXT_TEMP_ACC_COUNT; i++) | 222 | for(int i = 0; i < EXT_TEMP_ACC_COUNT; i++) |
@@ -231,72 +227,75 @@ int imx233_lradc_sense_ext_temperature(int chan, int sensor) | |||
231 | b += imx233_lradc_read_channel(chan); | 227 | b += imx233_lradc_read_channel(chan); |
232 | } | 228 | } |
233 | /* disable sensor current */ | 229 | /* disable sensor current */ |
234 | imx233_lradc_set_temp_isrc(sensor, HW_LRADC_CTRL2__TEMP_ISRC__0uA); | 230 | imx233_lradc_set_temp_isrc(sensor, BV_LRADC_CTRL2_TEMP_ISRC0__ZERO); |
235 | 231 | ||
236 | return (abs(b - a) / EXT_TEMP_ACC_COUNT) * 1104 / 1000; | 232 | return (abs(b - a) / EXT_TEMP_ACC_COUNT) * 1104 / 1000; |
237 | } | 233 | } |
238 | 234 | ||
239 | void imx233_lradc_setup_battery_conversion(bool automatic, unsigned long scale_factor) | 235 | void imx233_lradc_setup_battery_conversion(bool automatic, unsigned long scale_factor) |
240 | { | 236 | { |
241 | __REG_CLR(HW_LRADC_CONVERSION) = HW_LRADC_CONVERSION__SCALE_FACTOR_BM; | 237 | BF_CLR(LRADC_CONVERSION, SCALE_FACTOR); |
242 | __REG_SET(HW_LRADC_CONVERSION) = scale_factor; | 238 | BF_SETV(LRADC_CONVERSION, SCALE_FACTOR, scale_factor); |
243 | if(automatic) | 239 | if(automatic) |
244 | __REG_SET(HW_LRADC_CONVERSION) = HW_LRADC_CONVERSION__AUTOMATIC; | 240 | BF_SET(LRADC_CONVERSION, AUTOMATIC); |
245 | else | 241 | else |
246 | __REG_CLR(HW_LRADC_CONVERSION) = HW_LRADC_CONVERSION__AUTOMATIC; | 242 | BF_CLR(LRADC_CONVERSION, AUTOMATIC); |
247 | } | 243 | } |
248 | 244 | ||
249 | int imx233_lradc_read_battery_voltage(void) | 245 | int imx233_lradc_read_battery_voltage(void) |
250 | { | 246 | { |
251 | return __XTRACT(HW_LRADC_CONVERSION, SCALED_BATT_VOLTAGE); | 247 | return BF_RD(LRADC_CONVERSION, SCALED_BATT_VOLTAGE); |
252 | } | 248 | } |
253 | 249 | ||
254 | void imx233_lradc_setup_touch(bool xminus_enable, bool yminus_enable, | 250 | void imx233_lradc_setup_touch(bool xminus_enable, bool yminus_enable, |
255 | bool xplus_enable, bool yplus_enable, bool touch_detect) | 251 | bool xplus_enable, bool yplus_enable, bool touch_detect) |
256 | { | 252 | { |
257 | __FIELD_SET_CLR(HW_LRADC_CTRL0, XMINUS_ENABLE, xminus_enable); | 253 | HW_LRADC_CTRL0_CLR = BM_OR5(LRADC_CTRL0, XMINUS_ENABLE, YMINUS_ENABLE, |
258 | __FIELD_SET_CLR(HW_LRADC_CTRL0, YMINUS_ENABLE, yminus_enable); | 254 | XPLUS_ENABLE, YPLUS_ENABLE, TOUCH_DETECT_ENABLE); |
259 | __FIELD_SET_CLR(HW_LRADC_CTRL0, XPLUS_ENABLE, xplus_enable); | 255 | HW_LRADC_CTRL0_SET = BF_OR5(LRADC_CTRL0, XMINUS_ENABLE(xminus_enable), |
260 | __FIELD_SET_CLR(HW_LRADC_CTRL0, YPLUS_ENABLE, yplus_enable); | 256 | YMINUS_ENABLE(yminus_enable), XPLUS_ENABLE(xplus_enable), |
261 | __FIELD_SET_CLR(HW_LRADC_CTRL0, TOUCH_DETECT_ENABLE, touch_detect); | 257 | YPLUS_ENABLE(yplus_enable), TOUCH_DETECT_ENABLE(touch_detect)); |
262 | } | 258 | } |
263 | 259 | ||
264 | void imx233_lradc_enable_touch_detect_irq(bool enable) | 260 | void imx233_lradc_enable_touch_detect_irq(bool enable) |
265 | { | 261 | { |
266 | __FIELD_SET_CLR(HW_LRADC_CTRL1, TOUCH_DETECT_IRQ_EN, enable); | 262 | if(enable) |
263 | BF_SET(LRADC_CTRL1, TOUCH_DETECT_IRQ_EN); | ||
264 | else | ||
265 | BF_CLR(LRADC_CTRL1, TOUCH_DETECT_IRQ_EN); | ||
267 | imx233_lradc_clear_touch_detect_irq(); | 266 | imx233_lradc_clear_touch_detect_irq(); |
268 | } | 267 | } |
269 | 268 | ||
270 | void imx233_lradc_clear_touch_detect_irq(void) | 269 | void imx233_lradc_clear_touch_detect_irq(void) |
271 | { | 270 | { |
272 | __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__TOUCH_DETECT_IRQ; | 271 | BF_CLR(LRADC_CTRL1, TOUCH_DETECT_IRQ); |
273 | } | 272 | } |
274 | 273 | ||
275 | bool imx233_lradc_read_touch_detect(void) | 274 | bool imx233_lradc_read_touch_detect(void) |
276 | { | 275 | { |
277 | return HW_LRADC_STATUS & HW_LRADC_STATUS__TOUCH_DETECT_RAW; | 276 | return BF_RD(LRADC_STATUS, TOUCH_DETECT_RAW); |
278 | } | 277 | } |
279 | 278 | ||
280 | void imx233_lradc_init(void) | 279 | void imx233_lradc_init(void) |
281 | { | 280 | { |
282 | arbiter_init(&channel_arbiter, HW_LRADC_NUM_CHANNELS); | 281 | arbiter_init(&channel_arbiter, LRADC_NUM_CHANNELS); |
283 | arbiter_init(&delay_arbiter, HW_LRADC_NUM_DELAYS); | 282 | arbiter_init(&delay_arbiter, LRADC_NUM_DELAYS); |
284 | // enable block | 283 | // enable block |
285 | imx233_reset_block(&HW_LRADC_CTRL0); | 284 | imx233_reset_block(&HW_LRADC_CTRL0); |
286 | // disable ground ref | 285 | // disable ground ref |
287 | __REG_CLR(HW_LRADC_CTRL0) = HW_LRADC_CTRL0__ONCHIP_GROUNDREF; | 286 | BF_CLR(LRADC_CTRL0, ONCHIP_GROUNDREF); |
288 | // disable temperature sensors | 287 | // disable temperature sensors |
289 | __REG_CLR(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMP_SENSOR_IENABLE0 | | 288 | BF_CLR(LRADC_CTRL2, TEMP_SENSOR_IENABLE0); |
290 | HW_LRADC_CTRL2__TEMP_SENSOR_IENABLE1; | 289 | BF_CLR(LRADC_CTRL2, TEMP_SENSOR_IENABLE1); |
291 | __REG_SET(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD; | 290 | BF_SET(LRADC_CTRL2, TEMPSENSE_PWD); |
292 | // set frequency | 291 | // set frequency |
293 | __REG_CLR(HW_LRADC_CTRL3) = HW_LRADC_CTRL3__CYCLE_TIME_BM; | 292 | BF_CLR(LRADC_CTRL3, CYCLE_TIME); |
294 | __REG_SET(HW_LRADC_CTRL3) = HW_LRADC_CTRL3__CYCLE_TIME__6MHz; | 293 | BF_SETV(LRADC_CTRL3, CYCLE_TIME_V, 6MHZ); |
295 | // setup battery | 294 | // setup battery |
296 | battery_chan = 7; | 295 | battery_chan = 7; |
297 | imx233_lradc_reserve_channel(battery_chan); | 296 | imx233_lradc_reserve_channel(battery_chan); |
298 | /* setup them for the simplest use: no accumulation, no division*/ | 297 | /* setup them for the simplest use: no accumulation, no division*/ |
299 | imx233_lradc_setup_channel(battery_chan, false, false, 0, HW_LRADC_CHANNEL_BATTERY); | 298 | imx233_lradc_setup_channel(battery_chan, false, false, 0, LRADC_SRC_BATTERY); |
300 | /* setup delay channel for battery for automatic reading and scaling */ | 299 | /* setup delay channel for battery for automatic reading and scaling */ |
301 | battery_delay_chan = 0; | 300 | battery_delay_chan = 0; |
302 | imx233_lradc_reserve_delay(battery_delay_chan); | 301 | imx233_lradc_reserve_delay(battery_delay_chan); |
@@ -307,5 +306,5 @@ void imx233_lradc_init(void) | |||
307 | 1 << battery_delay_chan, 0, 200); | 306 | 1 << battery_delay_chan, 0, 200); |
308 | imx233_lradc_kick_delay(battery_delay_chan); | 307 | imx233_lradc_kick_delay(battery_delay_chan); |
309 | /* enable automatic conversion, use Li-Ion type battery */ | 308 | /* enable automatic conversion, use Li-Ion type battery */ |
310 | imx233_lradc_setup_battery_conversion(true, HW_LRADC_CONVERSION__SCALE_FACTOR__LI_ION); | 309 | imx233_lradc_setup_battery_conversion(true, BV_LRADC_CONVERSION_SCALE_FACTOR__LI_ION); |
311 | } | 310 | } |