Commit | Line | Data |
---|---|---|
a9f23e00 DS |
1 | /* |
2 | comedi/drivers/comedi_fc.c | |
3 | ||
4 | This is a place for code driver writers wish to share between | |
5 | two or more drivers. fc is short | |
6 | for frank-common. | |
7 | ||
8 | Author: Frank Mori Hess <fmhess@users.sourceforge.net> | |
9 | Copyright (C) 2002 Frank Mori Hess | |
10 | ||
11 | This program is free software; you can redistribute it and/or modify | |
12 | it under the terms of the GNU General Public License as published by | |
13 | the Free Software Foundation; either version 2 of the License, or | |
14 | (at your option) any later version. | |
15 | ||
16 | This program is distributed in the hope that it will be useful, | |
17 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 | GNU General Public License for more details. | |
20 | ||
21 | You should have received a copy of the GNU General Public License | |
22 | along with this program; if not, write to the Free Software | |
23 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
24 | ||
25 | ************************************************************************/ | |
26 | ||
27 | #include "../comedidev.h" | |
28 | ||
29 | #include "comedi_fc.h" | |
30 | ||
34c43922 | 31 | static void increment_scan_progress(struct comedi_subdevice *subd, |
4e85a13b | 32 | unsigned int num_bytes) |
a9f23e00 | 33 | { |
d163679c | 34 | struct comedi_async *async = subd->async; |
a9f23e00 DS |
35 | unsigned int scan_length = cfc_bytes_per_scan(subd); |
36 | ||
37 | async->scan_progress += num_bytes; | |
38 | if (async->scan_progress >= scan_length) { | |
39 | async->scan_progress %= scan_length; | |
40 | async->events |= COMEDI_CB_EOS; | |
41 | } | |
42 | } | |
43 | ||
44 | /* Writes an array of data points to comedi's buffer */ | |
0a85b6f0 MT |
45 | unsigned int cfc_write_array_to_buffer(struct comedi_subdevice *subd, |
46 | void *data, unsigned int num_bytes) | |
a9f23e00 | 47 | { |
d163679c | 48 | struct comedi_async *async = subd->async; |
a9f23e00 DS |
49 | unsigned int retval; |
50 | ||
51 | if (num_bytes == 0) | |
52 | return 0; | |
53 | ||
54 | retval = comedi_buf_write_alloc(async, num_bytes); | |
55 | if (retval != num_bytes) { | |
d62a01d8 | 56 | printk(KERN_WARNING "comedi: buffer overrun\n"); |
a9f23e00 DS |
57 | async->events |= COMEDI_CB_OVERFLOW; |
58 | return 0; | |
59 | } | |
60 | ||
61 | comedi_buf_memcpy_to(async, 0, data, num_bytes); | |
62 | comedi_buf_write_free(async, num_bytes); | |
63 | increment_scan_progress(subd, num_bytes); | |
64 | async->events |= COMEDI_CB_BLOCK; | |
65 | ||
66 | return num_bytes; | |
67 | } | |
4e85a13b | 68 | EXPORT_SYMBOL(cfc_write_array_to_buffer); |
a9f23e00 | 69 | |
0a85b6f0 MT |
70 | unsigned int cfc_read_array_from_buffer(struct comedi_subdevice *subd, |
71 | void *data, unsigned int num_bytes) | |
a9f23e00 | 72 | { |
d163679c | 73 | struct comedi_async *async = subd->async; |
a9f23e00 DS |
74 | |
75 | if (num_bytes == 0) | |
76 | return 0; | |
77 | ||
78 | num_bytes = comedi_buf_read_alloc(async, num_bytes); | |
79 | comedi_buf_memcpy_from(async, 0, data, num_bytes); | |
80 | comedi_buf_read_free(async, num_bytes); | |
81 | increment_scan_progress(subd, num_bytes); | |
82 | async->events |= COMEDI_CB_BLOCK; | |
83 | ||
84 | return num_bytes; | |
85 | } | |
4e85a13b | 86 | EXPORT_SYMBOL(cfc_read_array_from_buffer); |
a9f23e00 | 87 | |
0a85b6f0 MT |
88 | unsigned int cfc_handle_events(struct comedi_device *dev, |
89 | struct comedi_subdevice *subd) | |
a9f23e00 DS |
90 | { |
91 | unsigned int events = subd->async->events; | |
92 | ||
93 | if (events == 0) | |
94 | return events; | |
95 | ||
96 | if (events & (COMEDI_CB_EOA | COMEDI_CB_ERROR | COMEDI_CB_OVERFLOW)) | |
97 | subd->cancel(dev, subd); | |
98 | ||
99 | comedi_event(dev, subd); | |
100 | ||
101 | return events; | |
102 | } | |
4e85a13b | 103 | EXPORT_SYMBOL(cfc_handle_events); |
a9f23e00 DS |
104 | |
105 | MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>"); | |
106 | MODULE_DESCRIPTION("Shared functions for Comedi low-level drivers"); | |
107 | MODULE_LICENSE("GPL"); | |
108 | ||
109 | static int __init comedi_fc_init_module(void) | |
110 | { | |
111 | return 0; | |
112 | } | |
4e85a13b | 113 | |
a9f23e00 DS |
114 | static void __exit comedi_fc_cleanup_module(void) |
115 | { | |
116 | } | |
117 | ||
118 | module_init(comedi_fc_init_module); | |
119 | module_exit(comedi_fc_cleanup_module); |