comedi_fc.c revision a9f23e00c17567cc4b7ce50cd07226f7bfb70da6
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 31static void increment_scan_progress(comedi_subdevice * subd, 32 unsigned int num_bytes) 33{ 34 comedi_async *async = subd->async; 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 */ 45unsigned int cfc_write_array_to_buffer(comedi_subdevice * subd, void *data, 46 unsigned int num_bytes) 47{ 48 comedi_async *async = subd->async; 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) { 56 rt_printk("comedi: buffer overrun\n"); 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} 68 69unsigned int cfc_read_array_from_buffer(comedi_subdevice * subd, void *data, 70 unsigned int num_bytes) 71{ 72 comedi_async *async = subd->async; 73 74 if (num_bytes == 0) 75 return 0; 76 77 num_bytes = comedi_buf_read_alloc(async, num_bytes); 78 comedi_buf_memcpy_from(async, 0, data, num_bytes); 79 comedi_buf_read_free(async, num_bytes); 80 increment_scan_progress(subd, num_bytes); 81 async->events |= COMEDI_CB_BLOCK; 82 83 return num_bytes; 84} 85 86unsigned int cfc_handle_events(comedi_device * dev, comedi_subdevice * subd) 87{ 88 unsigned int events = subd->async->events; 89 90 if (events == 0) 91 return events; 92 93 if (events & (COMEDI_CB_EOA | COMEDI_CB_ERROR | COMEDI_CB_OVERFLOW)) 94 subd->cancel(dev, subd); 95 96 comedi_event(dev, subd); 97 98 return events; 99} 100 101MODULE_AUTHOR("Frank Mori Hess <fmhess@users.sourceforge.net>"); 102MODULE_DESCRIPTION("Shared functions for Comedi low-level drivers"); 103MODULE_LICENSE("GPL"); 104 105static int __init comedi_fc_init_module(void) 106{ 107 return 0; 108} 109static void __exit comedi_fc_cleanup_module(void) 110{ 111} 112 113module_init(comedi_fc_init_module); 114module_exit(comedi_fc_cleanup_module); 115 116EXPORT_SYMBOL(cfc_write_array_to_buffer); 117EXPORT_SYMBOL(cfc_read_array_from_buffer); 118EXPORT_SYMBOL(cfc_handle_events); 119