annotate packages/io/adc/current/src/adc.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

Update all copyright banners to reflect FSF ownership; fix and improve licence text.
author jlarmour
date Thu, 29 Jan 2009 17:47:46 +0000
parents be7755f32fd0
children 1edd8eb593c9
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 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
11 // Copyright (C) 2008 Free Software Foundation, Inc.
2512
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
16 // version.
2512
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
21 // for more details.
2512
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2512
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
33 // General Public License v2.
2512
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2512
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
2512
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 //#####DESCRIPTIONBEGIN####
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
41 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
42 // Author(s): nickg
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
43 // Date: 2008-03-31
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
44 // Description: Implements generic layer of ADC drivers.
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 //####DESCRIPTIONEND####
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 //========================================================================*/
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 #include <cyg/io/adc.h>
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
51
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 // Diagnostic support
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 // Switch the #if to 1 to generate some diagnostic messages.
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 #if 0
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 #include <cyg/infra/diag.h>
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
60
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
61 #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
62 #define adc_dump_buf( __buf, __size ) diag_dump_buf( __buf, __size )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
63 #else
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
64 #define adc_diag( __fmt, ... )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
65 #define adc_dump_buf( __buf, __size )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
66 #endif
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
67
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 // Main device table entry functions
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
70
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
71 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
72 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
73 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
74 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
75 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
76
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
77 DEVIO_TABLE(cyg_io_adc_devio,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
78 adc_write,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
79 adc_read,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
80 adc_select,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
81 adc_get_config,
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
82 adc_set_config
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
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 // Device interface functions
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
87
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 // Device write
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 // Not supported
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 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
94 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
95 adc_diag("write not supported\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
96 return -EDEVNOSUPP;
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
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 // Device Read
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 // Returns a whole number of samples from a channel
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 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
105 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
106 Cyg_ErrNo res = ENOERR;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
107 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
108 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
109 cyg_adc_device *dev = chan->device;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
110
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
111 cyg_adc_sample_t *buf = (cyg_adc_sample_t *)abuf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
112 cyg_uint32 size = 0;
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 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
115
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
116 // Check that supplied buffer address is aligned to sample size.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
117 if( (((CYG_ADDRESS)buf) & (sizeof(cyg_adc_sample_t)-1)) != 0 )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
118 return -EIO;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
119
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
120 // Check that channel is enabled
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
121 if( !chan->enabled )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
122 return -EIO;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
123
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
124 cyg_drv_mutex_lock( &dev->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
125 cyg_drv_dsr_lock();
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 while( (*len-size) >= sizeof(cyg_adc_sample_t) )
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 if( chan->put != chan->get )
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 // A sample is available, transfer it to the buffer.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
132
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
133 int next = chan->get+1;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
134 cyg_drv_isr_lock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
135 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
136 *buf++ = chan->buf[chan->get];
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
137 if( next == chan->len )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
138 next = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
139 chan->get = next;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
140 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
141 cyg_drv_isr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
142 size += sizeof(cyg_adc_sample_t);
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 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
145 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
146 else
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
147 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
148 // If there is no data available, either wait or
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
149 // return EAGAIN.
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( !chan->blocking )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
152 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
153 // If non-blocking, return what we have. If
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
154 // nothing, return EAGAIN.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
155 *len = size;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
156 if( size == 0 )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
157 res = -EAGAIN;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
158 break;
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 // Otherwise, we must wait for data to arrive.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
161
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
162 adc_diag("wait for sample\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
163 chan->waiting = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
164 if( !cyg_drv_cond_wait( &chan->wait ) )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
165 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
166 // Abort the wait, return EINTR
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
167 adc_diag("abort\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
168 *len = size;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
169 res = -EINTR;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
170 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
171 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
172
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
173 adc_diag("wake up\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
174 // Loop back round to pick up any samples now
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
175 // available.
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 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
178 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
179 cyg_drv_dsr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
180 cyg_drv_mutex_unlock( &dev->lock );
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 return res;
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
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 // Select support
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 // If select support is enabled, check for pending samples.
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 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
191 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
192 #ifdef CYGPKG_IO_ADC_SELECT_SUPPORT
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
193
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
194 cyg_bool res = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
195 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
196 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
197 cyg_adc_device *dev = chan->device;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
198
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
199 // Check that channel is enabled. If not, return false.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
200 if( !chan->enabled )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
201 return false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
202
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
203 // Only read select is supported
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
204 if( which == CYG_FREAD )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
205 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
206 cyg_drv_mutex_lock( &dev->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
207 cyg_drv_dsr_lock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
208 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
209 cyg_drv_isr_lock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
210 if( chan->put == chan->get )
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 // There is no data in the buffer, register the select.
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 cyg_selrecord( info, &chan->selinfo );
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 else
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 res = true;
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_isr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
221 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
222 cyg_drv_dsr_unlock();
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
223 cyg_drv_mutex_unlock( &dev->lock );
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 }
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 return res;
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 #else
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 return true;
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 #endif
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
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 // Get config
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 // Return various configuration options.
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 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
242 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
243 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
244 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
245 cyg_adc_info_t *buf = (cyg_adc_info_t *)xbuf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
246 Cyg_ErrNo res = ENOERR;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
247
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
248 adc_diag("chan %d\n", chan->channel );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
249 switch( key )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
250 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
251 case CYG_IO_GET_CONFIG_ADC_RATE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
252 *buf = chan->device->config;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
253 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
254
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
255 case CYG_IO_GET_CONFIG_READ_BLOCKING:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
256 if (*len < sizeof(cyg_uint32))
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
257 return -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
258 *(cyg_uint32*)xbuf = (chan->blocking) ? 1 : 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
259 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
260
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
261
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
262 default:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
263 res = -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
264 }
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 return res;
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
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 config
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 // Set configuration options.
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 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
275 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
276
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
277 cyg_devtab_entry_t *t = (cyg_devtab_entry_t *)handle;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
278 cyg_adc_channel *chan = (cyg_adc_channel *)t->priv;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
279 cyg_adc_info_t *buf = (cyg_adc_info_t *)xbuf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
280 Cyg_ErrNo res = ENOERR;
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 adc_diag("chan %d\n", chan->channel );
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 switch( key )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
285 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
286 case CYG_IO_SET_CONFIG_ADC_RATE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
287 chan->device->config = *buf;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
288 chan->device->funs->set_rate( chan, buf->rate );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
289 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
290
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
291 case CYG_IO_SET_CONFIG_ADC_ENABLE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
292 chan->enabled = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
293 chan->device->funs->enable( chan );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
294 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
295
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
296 case CYG_IO_SET_CONFIG_ADC_DISABLE:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
297 chan->enabled = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
298 chan->device->funs->disable( chan );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
299 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
300
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
301 case CYG_IO_SET_CONFIG_READ_BLOCKING:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
302 if (*len < sizeof(cyg_uint32))
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
303 return -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
304
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
305 chan->blocking = (1 == *(cyg_uint32*)xbuf) ? true : false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
306 break;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
307
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
308 default:
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
309 res = -EINVAL;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
310 }
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 return res;
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
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 // Callbacks from hardware driver to generic layer
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
317
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 // Initialize generic device structure
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 __externC void cyg_adc_device_init( cyg_adc_device *device )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
322 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
323 if( device->init )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
324 return;
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 adc_diag("\n");
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
327
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
328 device->init = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
329 cyg_drv_mutex_init( &device->lock );
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
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 // Initialize generic channel structure
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 __externC void cyg_adc_channel_init(cyg_adc_channel *chan)
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
336 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
337 if( chan->init )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
338 return;
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 adc_diag("chan %d\n", chan->channel );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
341
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
342 chan->init = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
343 cyg_drv_cond_init( &chan->wait, &chan->device->lock );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
344 chan->enabled = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
345 chan->waiting = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
346 chan->wakeup = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
347 chan->blocking = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
348 chan->overflow = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
349
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
350 #ifdef CYGPKG_IO_ADC_SELECT_SUPPORT
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
351 cyg_selinit( &chan->selinfo );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
352 #endif
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
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 // Add a new sample to the buffer
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
358 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
359 // 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
360 // buffer.
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 __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
363 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
364 cyg_uint32 res = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
365 int next = chan->put+1;
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 adc_diag("chan %d sample %04x\n", chan->channel, sample );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
368
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
369 // Ignore this sample if the channel is not enabled.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
370 if( !chan->enabled )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
371 return 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
372
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
373 if( next == chan->len )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
374 next = 0;
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 if( next == chan->get )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
377 {
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
378 // The buffer is full. Record an overflow and arrange to
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
379 // replace the oldest sample with the new one.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
380
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
381 adc_diag("chan %d overflow\n", chan->channel);
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
382 chan->overflow++;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
383
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
384 chan->get++;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
385 if( chan->get == chan->len )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
386 chan->get = 0;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
387 }
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
388
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
389 // 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
390 // selectors. Also do this if there are any threads waiting for
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
391 // data.
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
392 if( chan->put == chan->get || chan->waiting )
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
393 res |= CYG_ISR_CALL_DSR, chan->wakeup = true;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
394
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
395 // Store the new sample
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
396 chan->buf[chan->put] = sample;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
397 chan->put = next;
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 return res;
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
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 // Wakeup a channel
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
404 //
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
405 // 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
406 // set. It satisfies any select operations or any waiting readers.
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 __externC void cyg_adc_wakeup(cyg_adc_channel *chan )
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 adc_diag("chan %d\n", chan->channel );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
411
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
412 #ifdef CYGPKG_IO_ADC_SELECT_SUPPORT
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
413 cyg_selwakeup( &chan->selinfo );
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
414 #endif
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
415
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
416 chan->waiting = false;
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
417 cyg_drv_cond_signal( &chan->wait );
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 chan->wakeup = false;
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
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
422 //==========================================================================
be7755f32fd0 Add Generic ADC support. See Changelogs for details.
nickg
parents:
diff changeset
423 // End of adc.c