1 #include "../comedidev.h"
2 #include "pcm_common.h"
5 * 'do_cmdtest' function for an 'INTERRUPT' subdevice. This is for
8 int comedi_pcm_cmdtest(struct comedi_device *dev,
9 struct comedi_subdevice *s, struct comedi_cmd *cmd)
14 /* step 1: make sure trigger sources are trivially valid */
17 cmd->start_src &= (TRIG_NOW | TRIG_INT);
18 if (!cmd->start_src || tmp != cmd->start_src)
21 tmp = cmd->scan_begin_src;
22 cmd->scan_begin_src &= TRIG_EXT;
23 if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src)
26 tmp = cmd->convert_src;
27 cmd->convert_src &= TRIG_NOW;
28 if (!cmd->convert_src || tmp != cmd->convert_src)
31 tmp = cmd->scan_end_src;
32 cmd->scan_end_src &= TRIG_COUNT;
33 if (!cmd->scan_end_src || tmp != cmd->scan_end_src)
37 cmd->stop_src &= (TRIG_COUNT | TRIG_NONE);
38 if (!cmd->stop_src || tmp != cmd->stop_src)
44 /* step 2: make sure trigger sources are unique and mutually compatible */
46 /* these tests are true if more than one _src bit is set */
47 if ((cmd->start_src & (cmd->start_src - 1)) != 0)
49 if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0)
51 if ((cmd->convert_src & (cmd->convert_src - 1)) != 0)
53 if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0)
55 if ((cmd->stop_src & (cmd->stop_src - 1)) != 0)
61 /* step 3: make sure arguments are trivially compatible */
63 /* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */
64 if (cmd->start_arg != 0) {
69 /* cmd->scan_begin_src == TRIG_EXT */
70 if (cmd->scan_begin_arg != 0) {
71 cmd->scan_begin_arg = 0;
75 /* cmd->convert_src == TRIG_NOW */
76 if (cmd->convert_arg != 0) {
81 /* cmd->scan_end_src == TRIG_COUNT */
82 if (cmd->scan_end_arg != cmd->chanlist_len) {
83 cmd->scan_end_arg = cmd->chanlist_len;
87 switch (cmd->stop_src) {
89 /* any count allowed */
92 if (cmd->stop_arg != 0) {
104 /* step 4: fix up any arguments */
106 /* if (err) return 4; */
111 EXPORT_SYMBOL(comedi_pcm_cmdtest);