diff options
author | Amaury Pouly <pamaury@rockbox.org> | 2011-11-14 21:05:10 +0000 |
---|---|---|
committer | Amaury Pouly <pamaury@rockbox.org> | 2011-11-14 21:05:10 +0000 |
commit | a9d56ac5de93611b80fa46992390428719782f79 (patch) | |
tree | 7d29e190379858be3a4730d42144ad8f18da2bf9 /firmware/target | |
parent | 9a4213c8f32fb9f1bc94bbe623f5635f24e8d1b3 (diff) | |
download | rockbox-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/target')
-rw-r--r-- | firmware/target/arm/imx233/lradc-imx233.c | 112 | ||||
-rw-r--r-- | firmware/target/arm/imx233/lradc-imx233.h | 9 |
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 | ||
25 | static struct semaphore free_bm_sema; | 25 | struct channel_arbiter_t |
26 | static struct mutex free_bm_mutex; | 26 | { |
27 | static unsigned free_bm; | 27 | struct semaphore sema; |
28 | struct mutex mutex; | ||
29 | unsigned free_bm; | ||
30 | int count; | ||
31 | }; | ||
32 | |||
33 | static 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 ! | ||
42 | static 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 | |||
52 | static 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 | |||
66 | static 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 */ | ||
75 | struct channel_arbiter_t channel_arbiter; | ||
76 | /* delay channels */ | ||
77 | struct channel_arbiter_t delay_arbiter; | ||
28 | 78 | ||
29 | void imx233_lradc_setup_channel(int channel, bool div2, bool acc, int nr_samples, int src) | 79 | void 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 | ||
80 | int imx233_lradc_acquire_channel(int timeout) | 130 | int 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 | ||
94 | void imx233_lradc_release_channel(int chan) | 135 | void 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 | ||
102 | void imx233_lradc_reserve_channel(int channel) | 140 | void 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); | 145 | int imx233_lradc_acquire_delay(int timeout) |
146 | { | ||
147 | return arbiter_acquire(&delay_arbiter, timeout); | ||
148 | } | ||
149 | |||
150 | void imx233_lradc_release_delay(int chan) | ||
151 | { | ||
152 | return arbiter_release(&delay_arbiter, chan); | ||
153 | } | ||
154 | |||
155 | void imx233_lradc_reserve_delay(int channel) | ||
156 | { | ||
157 | return arbiter_reserve(&delay_arbiter, channel); | ||
108 | } | 158 | } |
109 | 159 | ||
110 | int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan) | 160 | int 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 | ||
180 | void 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 | |||
188 | int imx233_lradc_read_battery_voltage(void) | ||
189 | { | ||
190 | return __XTRACT(HW_LRADC_CONVERSION, SCALED_BATT_VOLTAGE); | ||
191 | } | ||
192 | |||
130 | void imx233_lradc_init(void) | 193 | void 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! |
122 | void imx233_lradc_reserve_channel(int channel); | 122 | void imx233_lradc_reserve_channel(int channel); |
123 | 123 | ||
124 | int imx233_lradc_acquire_delay(int timeout); | ||
125 | // doesn't check that delay channel is in use! | ||
126 | void imx233_lradc_reserve_delay(int dchannel); | ||
127 | void 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 */ |
126 | int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan); | 131 | int imx233_lradc_sense_die_temperature(int nmos_chan, int pmos_chan); |
127 | 132 | ||
133 | void imx233_lradc_setup_battery_conversion(bool automatic, int scale_factor); | ||
134 | // read scaled voltage, only available after proper setup | ||
135 | int imx233_lradc_read_battery_voltage(void); | ||
136 | |||
128 | #endif /* __lradc_imx233__ */ | 137 | #endif /* __lradc_imx233__ */ |