annotate packages/io/adc/current/src/adc.c @ 2512:be7755f32fd0

Add Generic ADC support. See Changelogs for details.
author nickg
date Fri, 08 Aug 2008 10:47:04 +0000
parents
children 74dbf4c3f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2512
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
1 /*==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
2 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
3 // adc.c
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
4 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
5 // Generic ADC driver layer
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
6 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
7 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
9 // -------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
11 // Copyright (C) 2008 eCosCentric Limited
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
12 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
14 // the terms of the GNU General Public License as published by the Free
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
16 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
20 // for more details.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
21 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
22 // You should have received a copy of the GNU General Public License along
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
25 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
27 // or inline functions from this file, or you compile this file and link it
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
28 // with other works to produce a work based on this file, this file does not
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
30 // License. However the source code for this file must still be made available
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
32 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
34 // this file might be covered by the GNU General Public License.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
35 // -------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
36 //####ECOSGPLCOPYRIGHTEND####
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
37 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
38 //#####DESCRIPTIONBEGIN####
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
39 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
40 // Author(s): nickg
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
41 // Date: 2008-03-31
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
42 // Description: Implements generic layer of ADC drivers.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
43 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
44 //####DESCRIPTIONEND####
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
45 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
46 //========================================================================*/
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
47
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
48 #include <cyg/io/adc.h>
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
49
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
50 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
51 // Diagnostic support
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
52 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
53 // Switch the #if to 1 to generate some diagnostic messages.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
54
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
55 #if 0
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
56
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
57 #include <cyg/infra/diag.h>
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
58
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
59 #define adc_diag( __fmt, ... ) diag_printf("ADC: %30s[%4d]: " __fmt, __FUNCTION__, __LINE__, ## __VA_ARGS__ );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
60 #define adc_dump_buf( __buf, __size ) diag_dump_buf( __buf, __size )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
61 #else
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
62 #define adc_diag( __fmt, ... )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
63 #define adc_dump_buf( __buf, __size )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
64 #endif
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
65
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
66 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
67 // Main device table entry functions
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
68
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
69 static Cyg_ErrNo adc_write(cyg_io_handle_t handle, const void *buf, cyg_uint32 *len);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
70 static Cyg_ErrNo adc_read(cyg_io_handle_t handle, void *buf, cyg_uint32 *len);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
71 static cyg_bool adc_select(cyg_io_handle_t handle, cyg_uint32 which, CYG_ADDRWORD info);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
72 static Cyg_ErrNo adc_get_config(cyg_io_handle_t handle, cyg_uint32 key, void *buf, cyg_uint32 *len);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
73 static Cyg_ErrNo adc_set_config(cyg_io_handle_t handle, cyg_uint32 key, const void *buf, cyg_uint32 *len);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
74
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
75 DEVIO_TABLE(cyg_io_adc_devio,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
76 adc_write,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
77 adc_read,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
78 adc_select,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
79 adc_get_config,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
80 adc_set_config
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
81 );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
82
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
83 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
84 // Device interface functions
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
85
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
86 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
87 // Device write
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
88 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
89 // Not supported
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
90
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
91 static Cyg_ErrNo adc_write(cyg_io_handle_t handle, const void *buf, cyg_uint32 *len)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
92 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
93 adc_diag("write not supported\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
94 return -EDEVNOSUPP;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
95 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
96
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
97 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
98 // Device Read
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
99 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
100 // Returns a whole number of samples from a channel
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
101
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
102 static Cyg_ErrNo adc_read(cyg_io_handle_t handle, void *abuf, cyg_uint32 *len)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
103 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
104 Cyg_ErrNo res = ENOERR;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
105 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
106 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
107 cyg_adc_device *dev = chan->device;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
108
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
109 cyg_adc_sample_t *buf = (cyg_adc_sample_t *)abuf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
110 cyg_uint32 size = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
111
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
112 adc_diag("chan %d buf %p len %u\n", chan->channel, abuf, *len);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
113
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
114 // Check that supplied buffer address is aligned to sample size.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
115 if( (((CYG_ADDRESS)buf) & (sizeof(cyg_adc_sample_t)-1)) != 0 )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
116 return -EIO;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
117
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
118 // Check that channel is enabled
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
119 if( !chan->enabled )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
120 return -EIO;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
121
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
122 cyg_drv_mutex_lock( &dev->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
123 cyg_drv_dsr_lock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
124 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
125 while( (*len-size) >= sizeof(cyg_adc_sample_t) )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
126 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
127 if( chan->put != chan->get )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
128 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
129 // A sample is available, transfer it to the buffer.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
130
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
131 int next = chan->get+1;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
132 cyg_drv_isr_lock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
133 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
134 *buf++ = chan->buf[chan->get];
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
135 if( next == chan->len )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
136 next = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
137 chan->get = next;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
138 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
139 cyg_drv_isr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
140 size += sizeof(cyg_adc_sample_t);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
141
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
142 adc_diag("chan %d sample %d -> %04x\n", chan->channel, size, buf[-1] );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
143 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
144 else
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
145 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
146 // If there is no data available, either wait or
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
147 // return EAGAIN.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
148
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
149 if( !chan->blocking )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
150 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
151 // If non-blocking, return what we have. If
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
152 // nothing, return EAGAIN.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
153 *len = size;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
154 if( size == 0 )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
155 res = -EAGAIN;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
156 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
157 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
158 // Otherwise, we must wait for data to arrive.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
159
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
160 adc_diag("wait for sample\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
161 chan->waiting = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
162 if( !cyg_drv_cond_wait( &chan->wait ) )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
163 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
164 // Abort the wait, return EINTR
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
165 adc_diag("abort\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
166 *len = size;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
167 res = -EINTR;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
168 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
169 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
170
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
171 adc_diag("wake up\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
172 // Loop back round to pick up any samples now
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
173 // available.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
174 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
175 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
176 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
177 cyg_drv_dsr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
178 cyg_drv_mutex_unlock( &dev->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
179
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
180 return res;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
181 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
182
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
183 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
184 // Select support
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
185 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
186 // If select support is enabled, check for pending samples.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
187
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
188 static cyg_bool adc_select(cyg_io_handle_t handle, cyg_uint32 which, CYG_ADDRWORD info)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
189 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
190 #ifdef CYGPKG_IO_ADC_SELECT_SUPPORT
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
191
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
192 cyg_bool res = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
193 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
194 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
195 cyg_adc_device *dev = chan->device;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
196
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
197 // Check that channel is enabled. If not, return false.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
198 if( !chan->enabled )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
199 return false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
200
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
201 // Only read select is supported
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
202 if( which == CYG_FREAD )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
203 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
204 cyg_drv_mutex_lock( &dev->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
205 cyg_drv_dsr_lock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
206 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
207 cyg_drv_isr_lock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
208 if( chan->put == chan->get )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
209 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
210 // There is no data in the buffer, register the select.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
211
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
212 cyg_selrecord( info, &chan->selinfo );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
213 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
214 else
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
215 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
216 res = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
217 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
218 cyg_drv_isr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
219 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
220 cyg_drv_dsr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
221 cyg_drv_mutex_unlock( &dev->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
222
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
223 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
224
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
225 return res;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
226
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
227 #else
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
228
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
229 return true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
230
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
231 #endif
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
232 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
233
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
234 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
235 // Get config
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
236 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
237 // Return various configuration options.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
238
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
239 static Cyg_ErrNo adc_get_config(cyg_io_handle_t handle, cyg_uint32 key, void *xbuf, cyg_uint32 *len)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
240 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
241 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
242 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
243 cyg_adc_info_t *buf = (cyg_adc_info_t *)xbuf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
244 Cyg_ErrNo res = ENOERR;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
245
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
246 adc_diag("chan %d\n", chan->channel );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
247 switch( key )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
248 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
249 case CYG_IO_GET_CONFIG_ADC_RATE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
250 *buf = chan->device->config;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
251 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
252
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
253 case CYG_IO_GET_CONFIG_READ_BLOCKING:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
254 if (*len < sizeof(cyg_uint32))
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
255 return -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
256 *(cyg_uint32*)xbuf = (chan->blocking) ? 1 : 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
257 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
258
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
259
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
260 default:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
261 res = -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
262 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
263
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
264 return res;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
265 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
266
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
267 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
268 // Set config
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
269 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
270 // Set configuration options.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
271
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
272 static Cyg_ErrNo adc_set_config(cyg_io_handle_t handle, cyg_uint32 key, const void *xbuf, cyg_uint32 *len)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
273 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
274
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
275 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
276 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
277 cyg_adc_info_t *buf = (cyg_adc_info_t *)xbuf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
278 Cyg_ErrNo res = ENOERR;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
279
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
280 adc_diag("chan %d\n", chan->channel );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
281
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
282 switch( key )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
283 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
284 case CYG_IO_SET_CONFIG_ADC_RATE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
285 chan->device->config = *buf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
286 chan->device->funs->set_rate( chan, buf->rate );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
287 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
288
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
289 case CYG_IO_SET_CONFIG_ADC_ENABLE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
290 chan->enabled = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
291 chan->device->funs->enable( chan );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
292 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
293
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
294 case CYG_IO_SET_CONFIG_ADC_DISABLE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
295 chan->enabled = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
296 chan->device->funs->disable( chan );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
297 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
298
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
299 case CYG_IO_SET_CONFIG_READ_BLOCKING:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
300 if (*len < sizeof(cyg_uint32))
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
301 return -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
302
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
303 chan->blocking = (1 == *(cyg_uint32*)xbuf) ? true : false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
304 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
305
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
306 default:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
307 res = -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
308 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
309
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
310 return res;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
311 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
312
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
313 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
314 // Callbacks from hardware driver to generic layer
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
315
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
316 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
317 // Initialize generic device structure
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
318
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
319 __externC void cyg_adc_device_init( cyg_adc_device *device )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
320 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
321 if( device->init )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
322 return;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
323
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
324 adc_diag("\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
325
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
326 device->init = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
327 cyg_drv_mutex_init( &device->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
328 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
329
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
330 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
331 // Initialize generic channel structure
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
332
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
333 __externC void cyg_adc_channel_init(cyg_adc_channel *chan)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
334 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
335 if( chan->init )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
336 return;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
337
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
338 adc_diag("chan %d\n", chan->channel );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
339
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
340 chan->init = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
341 cyg_drv_cond_init( &chan->wait, &chan->device->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
342 chan->enabled = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
343 chan->waiting = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
344 chan->wakeup = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
345 chan->blocking = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
346 chan->overflow = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
347
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
348 #ifdef CYGPKG_IO_ADC_SELECT_SUPPORT
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
349 cyg_selinit( &chan->selinfo );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
350 #endif
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
351
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
352 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
353
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
354 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
355 // Add a new sample to the buffer
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
356 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
357 // This function is called from the ISR to store a sample in the
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
358 // buffer.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
359
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
360 __externC cyg_uint32 cyg_adc_receive_sample(cyg_adc_channel *chan, cyg_adc_sample_t sample)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
361 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
362 cyg_uint32 res = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
363 int next = chan->put+1;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
364
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
365 adc_diag("chan %d sample %04x\n", chan->channel, sample );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
366
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
367 // Ignore this sample if the channel is not enabled.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
368 if( !chan->enabled )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
369 return 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
370
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
371 if( next == chan->len )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
372 next = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
373
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
374 if( next == chan->get )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
375 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
376 // The buffer is full. Record an overflow and arrange to
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
377 // replace the oldest sample with the new one.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
378
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
379 adc_diag("chan %d overflow\n", chan->channel);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
380 chan->overflow++;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
381
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
382 chan->get++;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
383 if( chan->get == chan->len )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
384 chan->get = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
385 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
386
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
387 // If this is the first sample into the buffer, wake any waiting
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
388 // selectors. Also do this if there are any threads waiting for
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
389 // data.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
390 if( chan->put == chan->get || chan->waiting )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
391 res |= CYG_ISR_CALL_DSR, chan->wakeup = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
392
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
393 // Store the new sample
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
394 chan->buf[chan->put] = sample;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
395 chan->put = next;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
396
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
397 return res;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
398 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
399
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
400 //--------------------------------------------------------------------------
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
401 // Wakeup a channel
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
402 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
403 // This function is called from the DSR if the channel wakeup field is
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
404 // set. It satisfies any select operations or any waiting readers.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
405
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
406 __externC void cyg_adc_wakeup(cyg_adc_channel *chan )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
407 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
408 adc_diag("chan %d\n", chan->channel );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
409
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
410 #ifdef CYGPKG_IO_ADC_SELECT_SUPPORT
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
411 cyg_selwakeup( &chan->selinfo );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
412 #endif
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
413
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
414 chan->waiting = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
415 cyg_drv_cond_signal( &chan->wait );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
416
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
417 chan->wakeup = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
418 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
419
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
420 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
421 // End of adc.c