diff options
author | Amaury Pouly <pamaury@rockbox.org> | 2011-09-13 23:40:09 +0000 |
---|---|---|
committer | Amaury Pouly <pamaury@rockbox.org> | 2011-09-13 23:40:09 +0000 |
commit | 696b9d146b69b36fc309233f62d43f4f57f26823 (patch) | |
tree | 1bd143562b773bedd4ce29314b066f746e0527fb /firmware/target/arm/imx233/lradc-imx233.c | |
parent | 45537a4e87c8696629cbda8efcd721b74f084ff1 (diff) | |
download | rockbox-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.c | 146 |
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 | |||
25 | static struct semaphore free_bm_sema; | ||
26 | static struct mutex free_bm_mutex; | ||
27 | static unsigned free_bm; | ||
28 | |||
29 | void 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 | |||
42 | void 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 | |||
52 | void 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 | |||
58 | void imx233_lradc_kick_delay(int dchan) | ||
59 | { | ||
60 | __REG_SET(HW_LRADC_DELAYx(dchan)) = HW_LRADC_DELAYx__KICK; | ||
61 | } | ||
62 | |||
63 | void 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 | |||
70 | int imx233_lradc_read_channel(int channel) | ||
71 | { | ||
72 | return __XTRACT_EX(HW_LRADC_CHx(channel), HW_LRADC_CHx__VALUE); | ||
73 | } | ||
74 | |||
75 | void imx233_lradc_clear_channel(int channel) | ||
76 | { | ||
77 | __REG_CLR(HW_LRADC_CHx(channel)) = HW_LRADC_CHx__VALUE_BM; | ||
78 | } | ||
79 | |||
80 | int 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 | |||
94 | void 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 | |||
102 | void 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 | |||
110 | int 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 | |||
130 | void 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 | } | ||