Commit | Line | Data |
---|---|---|
0b8f754a BP |
1 | #include "../comedidev.h" |
2 | #include "pcm_common.h" | |
3 | ||
4 | /* | |
5 | * 'do_cmdtest' function for an 'INTERRUPT' subdevice. This is for | |
6 | * the PCM drivers. | |
7 | */ | |
8 | int comedi_pcm_cmdtest(struct comedi_device *dev, | |
9 | struct comedi_subdevice *s, struct comedi_cmd *cmd) | |
10 | { | |
11 | int err = 0; | |
12 | unsigned int tmp; | |
13 | ||
14 | /* step 1: make sure trigger sources are trivially valid */ | |
15 | ||
16 | tmp = cmd->start_src; | |
17 | cmd->start_src &= (TRIG_NOW | TRIG_INT); | |
18 | if (!cmd->start_src || tmp != cmd->start_src) | |
19 | err++; | |
20 | ||
21 | tmp = cmd->scan_begin_src; | |
22 | cmd->scan_begin_src &= TRIG_EXT; | |
23 | if (!cmd->scan_begin_src || tmp != cmd->scan_begin_src) | |
24 | err++; | |
25 | ||
26 | tmp = cmd->convert_src; | |
27 | cmd->convert_src &= TRIG_NOW; | |
28 | if (!cmd->convert_src || tmp != cmd->convert_src) | |
29 | err++; | |
30 | ||
31 | tmp = cmd->scan_end_src; | |
32 | cmd->scan_end_src &= TRIG_COUNT; | |
33 | if (!cmd->scan_end_src || tmp != cmd->scan_end_src) | |
34 | err++; | |
35 | ||
36 | tmp = cmd->stop_src; | |
37 | cmd->stop_src &= (TRIG_COUNT | TRIG_NONE); | |
38 | if (!cmd->stop_src || tmp != cmd->stop_src) | |
39 | err++; | |
40 | ||
41 | if (err) | |
42 | return 1; | |
43 | ||
22d89f4a DPJ |
44 | /* step 2: make sure trigger sources are unique and |
45 | * mutually compatible */ | |
0b8f754a BP |
46 | |
47 | /* these tests are true if more than one _src bit is set */ | |
48 | if ((cmd->start_src & (cmd->start_src - 1)) != 0) | |
49 | err++; | |
50 | if ((cmd->scan_begin_src & (cmd->scan_begin_src - 1)) != 0) | |
51 | err++; | |
52 | if ((cmd->convert_src & (cmd->convert_src - 1)) != 0) | |
53 | err++; | |
54 | if ((cmd->scan_end_src & (cmd->scan_end_src - 1)) != 0) | |
55 | err++; | |
56 | if ((cmd->stop_src & (cmd->stop_src - 1)) != 0) | |
57 | err++; | |
58 | ||
59 | if (err) | |
60 | return 2; | |
61 | ||
62 | /* step 3: make sure arguments are trivially compatible */ | |
63 | ||
64 | /* cmd->start_src == TRIG_NOW || cmd->start_src == TRIG_INT */ | |
65 | if (cmd->start_arg != 0) { | |
66 | cmd->start_arg = 0; | |
67 | err++; | |
68 | } | |
69 | ||
70 | /* cmd->scan_begin_src == TRIG_EXT */ | |
71 | if (cmd->scan_begin_arg != 0) { | |
72 | cmd->scan_begin_arg = 0; | |
73 | err++; | |
74 | } | |
75 | ||
76 | /* cmd->convert_src == TRIG_NOW */ | |
77 | if (cmd->convert_arg != 0) { | |
78 | cmd->convert_arg = 0; | |
79 | err++; | |
80 | } | |
81 | ||
82 | /* cmd->scan_end_src == TRIG_COUNT */ | |
83 | if (cmd->scan_end_arg != cmd->chanlist_len) { | |
84 | cmd->scan_end_arg = cmd->chanlist_len; | |
85 | err++; | |
86 | } | |
87 | ||
88 | switch (cmd->stop_src) { | |
89 | case TRIG_COUNT: | |
90 | /* any count allowed */ | |
91 | break; | |
92 | case TRIG_NONE: | |
93 | if (cmd->stop_arg != 0) { | |
94 | cmd->stop_arg = 0; | |
95 | err++; | |
96 | } | |
97 | break; | |
98 | default: | |
99 | break; | |
100 | } | |
101 | ||
102 | if (err) | |
103 | return 3; | |
104 | ||
105 | /* step 4: fix up any arguments */ | |
106 | ||
107 | /* if (err) return 4; */ | |
108 | ||
109 | return 0; | |
110 | } | |
0b8f754a | 111 | EXPORT_SYMBOL(comedi_pcm_cmdtest); |
90f703d3 AT |
112 | |
113 | MODULE_AUTHOR("Comedi http://www.comedi.org"); | |
114 | MODULE_DESCRIPTION("Comedi low-level driver"); | |
115 | MODULE_LICENSE("GPL"); |