summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx233/lradc-imx233.c
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2011-09-13 23:40:09 +0000
committerAmaury Pouly <pamaury@rockbox.org>2011-09-13 23:40:09 +0000
commit696b9d146b69b36fc309233f62d43f4f57f26823 (patch)
tree1bd143562b773bedd4ce29314b066f746e0527fb /firmware/target/arm/imx233/lradc-imx233.c
parent45537a4e87c8696629cbda8efcd721b74f084ff1 (diff)
downloadrockbox-696b9d146b69b36fc309233f62d43f4f57f26823.tar.gz
rockbox-696b9d146b69b36fc309233f62d43f4f57f26823.zip
imx233/fuze+: implement lradc function and adc on top of it
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30534 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/imx233/lradc-imx233.c')
-rw-r--r--firmware/target/arm/imx233/lradc-imx233.c146
1 files changed, 146 insertions, 0 deletions
diff --git a/firmware/target/arm/imx233/lradc-imx233.c b/firmware/target/arm/imx233/lradc-imx233.c
new file mode 100644
index 0000000000..7da58c64b3
--- /dev/null
+++ b/firmware/target/arm/imx233/lradc-imx233.c
@@ -0,0 +1,146 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2011 by Amaury Pouly
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21#include "system.h"
22#include "system-target.h"
23#include "lradc-imx233.h"
24
25static struct semaphore free_bm_sema;
26static struct mutex free_bm_mutex;
27static unsigned free_bm;
28
29void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src)
30{
31 __REG_CLR(HW_LRADC_CHx(channel)) =HW_LRADC_CHx__NUM_SAMPLES_BM | HW_LRADC_CHx__ACCUMULATE;
32 __REG_SET(HW_LRADC_CHx(channel)) = nr_samples << HW_LRADC_CHx__NUM_SAMPLES_BP |
33 acc << HW_LRADC_CHx__ACCUMULATE;
34 if(div2)
35 __REG_SET(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__DIVIDE_BY_TWO(channel);
36 else
37 __REG_CLR(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__DIVIDE_BY_TWO(channel);
38 __REG_CLR(HW_LRADC_CTRL4) = HW_LRADC_CTRL4__LRADCxSELECT_BM(channel);
39 __REG_SET(HW_LRADC_CTRL4) = src << HW_LRADC_CTRL4__LRADCxSELECT_BP(channel);
40}
41
42void imx233_lradc_setup_delay(int dchan, int trigger_lradc, int trigger_delays,
43 int loop_count, int delay)
44{
45 HW_LRADC_DELAYx(dchan) =
46 trigger_lradc << HW_LRADC_DELAYx__TRIGGER_LRADCS_BP |
47 trigger_delays << HW_LRADC_DELAYx__TRIGGER_DELAYS_BP |
48 loop_count << HW_LRADC_DELAYx__LOOP_COUNT_BP |
49 delay << HW_LRADC_DELAYx__DELAY_BP;
50}
51
52void imx233_lradc_kick_channel(int channel)
53{
54 __REG_CLR(HW_LRADC_CTRL1) = HW_LRADC_CTRL1__LRADCx_IRQ(channel);
55 __REG_SET(HW_LRADC_CTRL0) = HW_LRADC_CTRL0__SCHEDULE(channel);
56}
57
58void imx233_lradc_kick_delay(int dchan)
59{
60 __REG_SET(HW_LRADC_DELAYx(dchan)) = HW_LRADC_DELAYx__KICK;
61}
62
63void imx233_lradc_wait_channel(int channel)
64{
65 /* wait for completion */
66 while(!(HW_LRADC_CTRL1 & HW_LRADC_CTRL1__LRADCx_IRQ(channel)))
67 yield();
68}
69
70int imx233_lradc_read_channel(int channel)
71{
72 return __XTRACT_EX(HW_LRADC_CHx(channel), HW_LRADC_CHx__VALUE);
73}
74
75void imx233_lradc_clear_channel(int channel)
76{
77 __REG_CLR(HW_LRADC_CHx(channel)) = HW_LRADC_CHx__VALUE_BM;
78}
79
80int imx233_lradc_acquire_channel(int timeout)
81{
82 int w = semaphore_wait(&free_bm_sema, timeout);
83 if(w == OBJ_WAIT_TIMEDOUT)
84 return w;
85 mutex_lock(&free_bm_mutex);
86 int chan = find_first_set_bit(free_bm);
87 if(chan >= HW_LRADC_NUM_CHANNELS)
88 panicf("imx233_lradc_acquire_channel cannot find a free channel !");
89 free_bm &= ~(1 << chan);
90 mutex_unlock(&free_bm_mutex);
91 return chan;
92}
93
94void imx233_lradc_release_channel(int chan)
95{
96 mutex_lock(&free_bm_mutex);
97 free_bm |= 1 << chan;
98 mutex_unlock(&free_bm_mutex);
99 semaphore_release(&free_bm_sema);
100}
101
102void imx233_lradc_reserve_channel(int channel)
103{
104 semaphore_wait(&free_bm_sema, TIMEOUT_NOBLOCK);
105 mutex_lock(&free_bm_mutex);
106 free_bm &= ~(1 << channel);
107 mutex_unlock(&free_bm_mutex);
108}
109
110int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan)
111{
112 // mux sensors
113 __REG_CLR(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD;
114 imx233_lradc_clear_channel(nmos_chan);
115 imx233_lradc_clear_channel(pmos_chan);
116 // schedule both channels
117 imx233_lradc_kick_channel(nmos_chan);
118 imx233_lradc_kick_channel(pmos_chan);
119 // wait completion
120 imx233_lradc_wait_channel(nmos_chan);
121 imx233_lradc_wait_channel(pmos_chan);
122 // mux sensors
123 __REG_SET(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD;
124 // do the computation
125 int diff = imx233_lradc_read_channel(nmos_chan) - imx233_lradc_read_channel(pmos_chan);
126 // return diff * 1.012 / 4
127 return (diff * 1012) / 4000;
128}
129
130void imx233_lradc_init(void)
131{
132 mutex_init(&free_bm_mutex);
133 semaphore_init(&free_bm_sema, HW_LRADC_NUM_CHANNELS, HW_LRADC_NUM_CHANNELS);
134 free_bm = (1 << HW_LRADC_NUM_CHANNELS) - 1;
135 // enable block
136 imx233_reset_block(&HW_LRADC_CTRL0);
137 // disable ground ref
138 __REG_CLR(HW_LRADC_CTRL0) = HW_LRADC_CTRL0__ONCHIP_GROUNDREF;
139 // disable temperature sensors
140 __REG_CLR(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMP_SENSOR_IENABLE0 |
141 HW_LRADC_CTRL2__TEMP_SENSOR_IENABLE1;
142 __REG_SET(HW_LRADC_CTRL2) = HW_LRADC_CTRL2__TEMPSENSE_PWD;
143 // set frequency
144 __REG_CLR(HW_LRADC_CTRL3) = HW_LRADC_CTRL3__CYCLE_TIME_BM;
145 __REG_SET(HW_LRADC_CTRL3) = HW_LRADC_CTRL3__CYCLE_TIME__6MHz;
146}