#include "../comedidev.h" #include "pcm_common.h" /* * 'do_cmdtest' function for an 'INTERRUPT' subdevice. This is for * the PCM drivers. */ int comedi_pcm_cmdtest(struct comedi_device *dev, struct comedi_subdevice *s, struct comedi_cmd *cmd) { int err = 0; unsigned int tmp; /* step 1: make sure trigger sources are trivially valid */ tmp = cmd->start_src; cmd->start_src &= (TRIG_NOW | TRIG_INT); if (!cmd->start_src || tmp != cmd->start_src) err++; tmp = cmd->scan_begin_src; cmd->scan_begin_src &= TRIG_EXT; if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) err++; tmp = cmd->convert_src; cmd->convert_src &= TRIG_NOW; if (!cmd->convert_src || tmp != cmd->convert_src) err++; tmp = cmd->scan_end_src; cmd->scan_end_src &= TRIG_COUNT; if (!cmd->scan_end_src || tmp != cmd->scan_end_src) err++; tmp = cmd->stop_src; cmd->stop_src &= (TRIG_COUNT | TRIG_NONE); if (!cmd->stop_src || tmp != cmd->stop_src) err++; if (err) return 1; /* step 2: make sure trigger sources are unique and * mutually compatible */ /* these tests are true if more than one _src bit is set */ if ((cmd->start_src & (cmd->start_src - 1)) != 0) err++; if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0) err++; if ((cmd->convert_src & (cmd->convert_src - 1)) != 0) err++; if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0) err++; if ((cmd->stop_src & (cmd->stop_src - 1)) != 0) err++; if (err) return 2; /* step 3: make sure arguments are trivially compatible */ /* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */ if (cmd->start_arg != 0) { cmd->start_arg = 0; err++; } /* cmd->scan_begin_src == TRIG_EXT */ if (cmd->scan_begin_arg != 0) { cmd->scan_begin_arg = 0; err++; } /* cmd->convert_src == TRIG_NOW */ if (cmd->convert_arg != 0) { cmd->convert_arg = 0; err++; } /* cmd->scan_end_src == TRIG_COUNT */ if (cmd->scan_end_arg != cmd->chanlist_len) { cmd->scan_end_arg = cmd->chanlist_len; err++; } switch (cmd->stop_src) { case TRIG_COUNT: /* any count allowed */ break; case TRIG_NONE: if (cmd->stop_arg != 0) { cmd->stop_arg = 0; err++; } break; default: break; } if (err) return 3; /* step 4: fix up any arguments */ /* if (err) return 4; */ return 0; } EXPORT_SYMBOL(comedi_pcm_cmdtest); MODULE_AUTHOR("Comedi http://www.comedi.org"); MODULE_DESCRIPTION("Comedi low-level driver"); MODULE_LICENSE("GPL");