From: David Schleef Date: Mon, 13 Nov 2000 10:22:37 +0000 (+0000) Subject: moved from comedi/comedi_module.h X-Git-Tag: r0_7_51~28 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=1d72f6e8b2be4595a9490155ac94dc7d9d91e35f;p=comedi.git moved from comedi/comedi_module.h --- diff --git a/include/linux/comedidev.h b/include/linux/comedidev.h new file mode 100644 index 00000000..378af7b8 --- /dev/null +++ b/include/linux/comedidev.h @@ -0,0 +1,292 @@ +/* + include/linux/comedidev.h + header file for kernel-only structures, variables, and constants + + COMEDI - Linux Control and Measurement Device Interface + Copyright (C) 1997-2000 David A. Schleef + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef _COMEDIDEV_H +#define _COMEDIDEV_H + +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "kern_compat.h" + +#ifdef CONFIG_COMEDI_RT +#include +#endif + +#ifdef CONFIG_COMEDI_DEBUG +#define DPRINTK(format, args...) printk("comedi: " format , ## args ) +#else +#define DPRINTK(format, args...) /* */ +#endif + +#ifndef COMEDI_VERSION_CODE +#define COMEDI_VERSION_CODE 0x10000 +#define COMEDI_VERSION "1.0.0" +#endif + +#ifdef MODULE +#define COMEDI_INITCLEANUP(x) \ + int init_module(void){comedi_driver_register(&(x));return 0;} \ + void cleanup_module(void){comedi_driver_unregister(&(x));} +#else +#define COMEDI_INITCLEANUP(x) +#endif +typedef struct comedi_device_struct comedi_device; +typedef struct comedi_subdevice_struct comedi_subdevice; +typedef struct comedi_driver_struct comedi_driver; +typedef struct comedi_lrange_struct comedi_lrange; + + +struct comedi_subdevice_struct{ + int type; + int n_chan; + int subdev_flags; + int len_chanlist; /* length of channel/gain list, if available */ + + void *private; + + void *prealloc_buf; /* pre-allocated buffer */ + unsigned int prealloc_bufsz; /* buffer size, in bytes */ + + void *lock; + void *busy; + unsigned int runflags; + + int io_bits; + + lsampl_t maxdata; /* if maxdata==0, use list */ + lsampl_t *maxdata_list; /* list is channel specific */ + + unsigned int flags; + unsigned int *flaglist; + + comedi_lrange *range_table; + comedi_lrange **range_table_list; + + unsigned int *chanlist; /* driver-owned chanlist (not used) */ + +#ifdef CONFIG_COMEDI_MODE_CORE + comedi_trig cur_trig; /* current trig structure */ +#endif + comedi_cmd cmd; + + volatile unsigned int buf_int_ptr; /* buffer marker for interrupt */ + unsigned int buf_user_ptr; /* buffer marker for read() and write() */ + volatile unsigned int buf_int_count; /* byte count for interrupt */ + unsigned int buf_user_count; /* byte count for read() and write() */ + unsigned int cur_chan; /* useless channel marker for interrupt */ + unsigned int cur_chanlist_len; + +#ifdef CONFIG_COMEDI_MODE_CORE + int (*trig[5])(comedi_device *,comedi_subdevice *,comedi_trig *); +#endif + + int (*insn_read)(comedi_device *,comedi_subdevice *,comedi_insn *,lsampl_t *); + int (*insn_write)(comedi_device *,comedi_subdevice *,comedi_insn *,lsampl_t *); + int (*insn_bits)(comedi_device *,comedi_subdevice *,comedi_insn *,lsampl_t *); + int (*insn_config)(comedi_device *,comedi_subdevice *,comedi_insn *,lsampl_t *); + + int (*do_cmd)(comedi_device *,comedi_subdevice *); + int (*do_cmdtest)(comedi_device *,comedi_subdevice *,comedi_cmd *); + int (*poll)(comedi_device *,comedi_subdevice *); + int (*cancel)(comedi_device *,comedi_subdevice *); + int (*do_lock)(comedi_device *,comedi_subdevice *); + int (*do_unlock)(comedi_device *,comedi_subdevice *); + + unsigned int cb_mask; + int (*cb_func)(unsigned int flags,void *); + void *cb_arg; + + unsigned int state; +}; + +struct comedi_driver_struct{ + struct comedi_driver_struct *next; + + char *driver_name; + struct module *module; + int (*attach)(comedi_device *,comedi_devconfig *); + int (*detach)(comedi_device *); + int (*recognize)(char *name); +}; + +struct comedi_device_struct{ + int use_count; + comedi_driver *driver; + void *private; + kdev_t minor; + char *board_name; + int board; + void *board_ptr; + int attached; + + int n_subdevices; + comedi_subdevice *subdevices; + int options[COMEDI_NDEVCONFOPTS]; + + /* dumb */ + int iobase; + int iosize; + int irq; + + unsigned int read_subdev; + wait_queue_head_t read_wait; + + unsigned int write_subdev; + wait_queue_head_t write_wait; +}; + + + +extern comedi_device *comedi_devices; + +/* + * function prototypes + */ + +void comedi_error(comedi_device *dev,const char *s); +void comedi_done(comedi_device *dev,comedi_subdevice *s); +void comedi_error_done(comedi_device *dev,comedi_subdevice *s); +void comedi_eos(comedi_device *dev,comedi_subdevice *s); +void comedi_eobuf(comedi_device *dev,comedi_subdevice *s); +void comedi_bufcheck(comedi_device *dev,comedi_subdevice *s); + +comedi_device * comedi_get_device_by_minor(kdev_t minor); + +extern inline comedi_device * comedi_get_device_by_minor(kdev_t minor) +{ + return comedi_devices+minor; +} + +int comedi_device_detach(comedi_device *dev); +int comedi_device_attach(comedi_device *dev,comedi_devconfig *it); +int comedi_driver_register(comedi_driver *); +int comedi_driver_unregister(comedi_driver *); + +comedi_device *comedi_allocate_dev(comedi_driver *); +void comedi_deallocate_dev(comedi_device *); + +void init_polling(void); +void cleanup_polling(void); +void start_polling(comedi_device *); +void stop_polling(comedi_device *); + +void comedi_proc_init(void); +void comedi_proc_cleanup(void); + +#ifdef CONFIG_COMEDI_MODE_CORE +int di_unpack(unsigned int bits,comedi_trig *it); +int do_pack(unsigned int *bits,comedi_trig *it); +#endif + +#ifndef CONFIG_COMEDI_RT + +#define rt_printk(format,args...) printk(format,##args) +#define rt_printk_init() +#define rt_printk_cleanup() + +#define comedi_request_irq request_irq +#define comedi_change_irq_flags(a,b,c) /* */ +#define comedi_free_irq free_irq + +#endif + + +#define SRF_USER 0x00000001 +#define SRF_RT 0x00000002 + + +/* + various internal comedi functions + */ + +int do_rangeinfo_ioctl(comedi_device *dev,comedi_rangeinfo *arg); +int check_chanlist(comedi_subdevice *s,int n,unsigned int *chanlist); + +extern volatile int rtcomedi_lock_semaphore; + +/* range stuff */ + + +#define RANGE(a,b) {(a)*1e6,(b)*1e6,0} +#define RANGE_ext(a,b) {(a)*1e6,(b)*1e6,RF_EXTERNAL} +#define RANGE_unitless(a,b) {(a)*1e6,(b)*1e6,0} /* XXX */ +#define BIP_RANGE(a) {-(a)*1e6,(a)*1e6,0} +#define UNI_RANGE(a) {0,(a)*1e6,0} + +extern comedi_lrange range_bipolar10; +extern comedi_lrange range_bipolar5; +extern comedi_lrange range_bipolar2_5; +extern comedi_lrange range_unipolar10; +extern comedi_lrange range_unipolar5; +extern comedi_lrange range_unknown; + +#define range_digital range_unipolar5 + +struct comedi_lrange_struct{ + int length; + comedi_krange range[0]; +}; + + + +/* some silly little inline functions */ + +static inline int alloc_subdevices(comedi_device *dev) +{ + int size=sizeof(comedi_subdevice)*dev->n_subdevices; + + dev->subdevices=kmalloc(size,GFP_KERNEL); + if(!dev->subdevices) + return -ENOMEM; + memset(dev->subdevices,0,size); + return 0; +} + +static inline int alloc_private(comedi_device *dev,int size) +{ + dev->private=kmalloc(size,GFP_KERNEL); + if(!dev->private) + return -ENOMEM; + memset(dev->private,0,size); + return 0; +} + + +#ifdef LINUX_V20 +extern struct symbol_table comedi_syms; +#endif + + +#endif /* _COMEDI_MODULE_H */ + + + +