summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
authorAmaury Pouly <pamaury@rockbox.org>2011-11-14 21:05:10 +0000
committerAmaury Pouly <pamaury@rockbox.org>2011-11-14 21:05:10 +0000
commita9d56ac5de93611b80fa46992390428719782f79 (patch)
tree7d29e190379858be3a4730d42144ad8f18da2bf9 /firmware
parent9a4213c8f32fb9f1bc94bbe623f5635f24e8d1b3 (diff)
downloadrockbox-a9d56ac5de93611b80fa46992390428719782f79.tar.gz
rockbox-a9d56ac5de93611b80fa46992390428719782f79.zip
imx233: use generic code for both channels and delays arbiter code
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30981 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/imx233/lradc-imx233.c112
-rw-r--r--firmware/target/arm/imx233/lradc-imx233.h9
2 files changed, 96 insertions, 25 deletions
diff --git a/firmware/target/arm/imx233/lradc-imx233.c b/firmware/target/arm/imx233/lradc-imx233.c
index 7da58c64b3..1101e3d32d 100644
--- a/firmware/target/arm/imx233/lradc-imx233.c
+++ b/firmware/target/arm/imx233/lradc-imx233.c
@@ -22,13 +22,63 @@
22#include "system-target.h" 22#include "system-target.h"
23#include "lradc-imx233.h" 23#include "lradc-imx233.h"
24 24
25static struct semaphore free_bm_sema; 25struct channel_arbiter_t
26static struct mutex free_bm_mutex; 26{
27static unsigned free_bm; 27 struct semaphore sema;
28 struct mutex mutex;
29 unsigned free_bm;
30 int count;
31};
32
33static void arbiter_init(struct channel_arbiter_t *a, unsigned count)
34{
35 mutex_init(&a->mutex);
36 semaphore_init(&a->sema, count, count);
37 a->free_bm = (1 << count) - 1;
38 a->count = count;
39}
40
41// doesn't check in use !
42static void arbiter_reserve(struct channel_arbiter_t *a, unsigned channel)
43{
44 // assume semaphore has a free slot immediately
45 if(semaphore_wait(&a->sema, TIMEOUT_NOBLOCK) != OBJ_WAIT_SUCCEEDED)
46 panicf("arbiter_reserve failed on semaphore_wait !");
47 mutex_lock(&a->mutex);
48 a->free_bm &= ~(1 << channel);
49 mutex_unlock(&a->mutex);
50}
51
52static int arbiter_acquire(struct channel_arbiter_t *a, int timeout)
53{
54 int w = semaphore_wait(&a->sema, timeout);
55 if(w == OBJ_WAIT_TIMEDOUT)
56 return w;
57 mutex_lock(&a->mutex);
58 int chan = find_first_set_bit(a->free_bm);
59 if(chan >= a->count)
60 panicf("arbiter_acquire cannot find a free channel !");
61 a->free_bm &= ~(1 << chan);
62 mutex_unlock(&a->mutex);
63 return chan;
64}
65
66static void arbiter_release(struct channel_arbiter_t *a, int channel)
67{
68 mutex_lock(&a->mutex);
69 a->free_bm |= 1 << channel;
70 mutex_unlock(&a->mutex);
71 semaphore_release(&a->sema);
72}
73
74/* channels */
75struct channel_arbiter_t channel_arbiter;
76/* delay channels */
77struct channel_arbiter_t delay_arbiter;
28 78
29void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src) 79void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src)
30{ 80{
31 __REG_CLR(HW_LRADC_CHx(channel)) =HW_LRADC_CHx__NUM_SAMPLES_BM | HW_LRADC_CHx__ACCUMULATE; 81 __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 | 82 __REG_SET(HW_LRADC_CHx(channel)) = nr_samples << HW_LRADC_CHx__NUM_SAMPLES_BP |
33 acc << HW_LRADC_CHx__ACCUMULATE; 83 acc << HW_LRADC_CHx__ACCUMULATE;
34 if(div2) 84 if(div2)
@@ -79,32 +129,32 @@ void imx233_lradc_clear_channel(int channel)
79 129
80int imx233_lradc_acquire_channel(int timeout) 130int imx233_lradc_acquire_channel(int timeout)
81{ 131{
82 int w = semaphore_wait(&free_bm_sema, timeout); 132 return arbiter_acquire(&channel_arbiter, 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} 133}
93 134
94void imx233_lradc_release_channel(int chan) 135void imx233_lradc_release_channel(int chan)
95{ 136{
96 mutex_lock(&free_bm_mutex); 137 return arbiter_release(&channel_arbiter, chan);
97 free_bm |= 1 << chan;
98 mutex_unlock(&free_bm_mutex);
99 semaphore_release(&free_bm_sema);
100} 138}
101 139
102void imx233_lradc_reserve_channel(int channel) 140void imx233_lradc_reserve_channel(int channel)
103{ 141{
104 semaphore_wait(&free_bm_sema, TIMEOUT_NOBLOCK); 142 return arbiter_reserve(&channel_arbiter, channel);
105 mutex_lock(&free_bm_mutex); 143}
106 free_bm &= ~(1 << channel); 144
107 mutex_unlock(&free_bm_mutex); 145int imx233_lradc_acquire_delay(int timeout)
146{
147 return arbiter_acquire(&delay_arbiter, timeout);
148}
149
150void imx233_lradc_release_delay(int chan)
151{
152 return arbiter_release(&delay_arbiter, chan);
153}
154
155void imx233_lradc_reserve_delay(int channel)
156{
157 return arbiter_reserve(&delay_arbiter, channel);
108} 158}
109 159
110int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan) 160int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan)
@@ -127,11 +177,23 @@ int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan)
127 return (diff * 1012) / 4000; 177 return (diff * 1012) / 4000;
128} 178}
129 179
180void imx233_lradc_setup_battery_conversion(bool automatic, int scale_factor)
181{
182 __REG_CLR(HW_LRADC_CONVERSION) = HW_LRADC_CONVERSION__AUTOMATIC |
183 HW_LRADC_CONVERSION__SCALE_FACTOR_BM;
184 __REG_SET(HW_LRADC_CONVERSION) = scale_factor |
185 automatic ? HW_LRADC_CONVERSION__AUTOMATIC : 0;
186}
187
188int imx233_lradc_read_battery_voltage(void)
189{
190 return __XTRACT(HW_LRADC_CONVERSION, SCALED_BATT_VOLTAGE);
191}
192
130void imx233_lradc_init(void) 193void imx233_lradc_init(void)
131{ 194{
132 mutex_init(&free_bm_mutex); 195 arbiter_init(&channel_arbiter, HW_LRADC_NUM_CHANNELS);
133 semaphore_init(&free_bm_sema, HW_LRADC_NUM_CHANNELS, HW_LRADC_NUM_CHANNELS); 196 arbiter_init(&delay_arbiter, HW_LRADC_NUM_DELAYS);
134 free_bm = (1 << HW_LRADC_NUM_CHANNELS) - 1;
135 // enable block 197 // enable block
136 imx233_reset_block(&HW_LRADC_CTRL0); 198 imx233_reset_block(&HW_LRADC_CTRL0);
137 // disable ground ref 199 // disable ground ref
diff --git a/firmware/target/arm/imx233/lradc-imx233.h b/firmware/target/arm/imx233/lradc-imx233.h
index a72916054a..fb0085fc74 100644
--- a/firmware/target/arm/imx233/lradc-imx233.h
+++ b/firmware/target/arm/imx233/lradc-imx233.h
@@ -121,8 +121,17 @@ void imx233_lradc_release_channel(int chan);
121// doesn't check that channel is in use! 121// doesn't check that channel is in use!
122void imx233_lradc_reserve_channel(int channel); 122void imx233_lradc_reserve_channel(int channel);
123 123
124int imx233_lradc_acquire_delay(int timeout);
125// doesn't check that delay channel is in use!
126void imx233_lradc_reserve_delay(int dchannel);
127void imx233_lradc_release_delay(int dchan);
128
124/* enable sensing and return temperature in kelvin, 129/* enable sensing and return temperature in kelvin,
125 * channels must already be configured as nmos and pmos */ 130 * channels must already be configured as nmos and pmos */
126int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan); 131int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan);
127 132
133void imx233_lradc_setup_battery_conversion(bool automatic, int scale_factor);
134// read scaled voltage, only available after proper setup
135int imx233_lradc_read_battery_voltage(void);
136
128#endif /* __lradc_imx233__ */ 137#endif /* __lradc_imx233__ */