77d65455fb5a473b279b9c7a43d09e1d3a65e255
[kugel-rb.git] / firmware / target / arm / adc-as3514.c
blob77d65455fb5a473b279b9c7a43d09e1d3a65e255
1 /***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
10 * Copyright (C) 2006 by Barry Wardell
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.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
21 #include "adc.h"
22 #include "kernel.h"
23 #include "ascodec.h"
24 #include "as3514.h"
26 /* Read 10-bit channel data */
27 unsigned short adc_read(int channel)
29 unsigned short data = 0;
31 if ((unsigned)channel < NUM_ADC_CHANNELS)
33 ascodec_lock();
35 /* Select channel */
36 if (ascodec_write(AS3514_ADC_0, (channel << 4)) >= 0)
38 unsigned char buf[2];
41 * The AS3514 ADC will trigger an interrupt when the conversion
42 * is finished, if the corresponding enable bit in IRQ_ENRD2
43 * is set.
44 * Previously the code did not wait and this apparently did
45 * not pose any problems, but this should be more correct.
46 * Without the wait the data read back may be completely or
47 * partially (first one of the two bytes) stale.
49 ascodec_wait_adc_finished();
52 /* Read data */
53 if (ascodec_readbytes(AS3514_ADC_0, 2, buf) >= 0)
55 data = (((buf[0] & 0x3) << 8) | buf[1]);
59 ascodec_unlock();
62 return data;
65 void adc_init(void)