• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file mesubdevice.h
3  *
4  * @brief Provides the subdevice base class.
5  * @note Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de)
6  * @author Guenter Gebhardt
7  */
8 
9 #ifndef _MESUBDEVICE_H_
10 #define _MESUBDEVICE_H_
11 
12 #include <linux/list.h>
13 
14 #include "metypes.h"
15 #include "meioctl.h"
16 #include "meslock.h"
17 
18 # include <linux/workqueue.h>
19 
20 #ifdef __KERNEL__
21 
22 /**
23  * @brief Macro used to enter a subdevice.
24  */
25 #define ME_SUBDEVICE_ENTER	\
26 { \
27 	int err; \
28 	err = me_slock_enter(&instance->base.lock, filep); \
29 	if(err){ \
30 		PERROR("Cannot enter subdevice.\n"); \
31 		return err; \
32 	} \
33 }
34 
35 /**
36  * @brief Macro used to exit a subdevice.
37  */
38 #define ME_SUBDEVICE_EXIT	\
39 {\
40 	int err; \
41 	err = me_slock_exit(&instance->base.lock, filep); \
42 	if(err){ \
43 		PERROR("Cannot exit subdevice.\n"); \
44 		return err; \
45 	} \
46 }
47 
48 /**
49  * @brief The subdevice base class.
50  */
51 typedef struct me_subdevice {
52 	/* Attributes */
53 	struct list_head list;		/**< Enables the subdevice to be added to a dynamic list. */
54 	me_slock_t lock;		/**< Used by user application in order to lock the subdevice for exclusive usage. */
55 
56 	/* Methods */
57 	int (*me_subdevice_io_irq_start) (struct me_subdevice * subdevice,
58 					  struct file * filep,
59 					  int channel,
60 					  int irq_source,
61 					  int irq_edge, int irq_arg, int flags);
62 
63 	int (*me_subdevice_io_irq_wait) (struct me_subdevice * subdevice,
64 					 struct file * filep,
65 					 int channel,
66 					 int *irq_count,
67 					 int *value, int time_out, int flags);
68 
69 	int (*me_subdevice_io_irq_stop) (struct me_subdevice * subdevice,
70 					 struct file * filep,
71 					 int channel, int flags);
72 
73 	int (*me_subdevice_io_reset_subdevice) (struct me_subdevice * subdevice,
74 						struct file * filep, int flags);
75 
76 	int (*me_subdevice_io_single_config) (struct me_subdevice * subdevice,
77 					      struct file * filep,
78 					      int channel,
79 					      int single_config,
80 					      int ref,
81 					      int trig_chan,
82 					      int trig_type,
83 					      int trig_edge, int flags);
84 
85 	int (*me_subdevice_io_single_read) (struct me_subdevice * subdevice,
86 					    struct file * filep,
87 					    int channel,
88 					    int *value,
89 					    int time_out, int flags);
90 
91 	int (*me_subdevice_io_single_write) (struct me_subdevice * subdevice,
92 					     struct file * filep,
93 					     int channel,
94 					     int value,
95 					     int time_out, int flags);
96 
97 	int (*me_subdevice_io_stream_config) (struct me_subdevice * subdevice,
98 					      struct file * filep,
99 					      meIOStreamConfig_t * config_list,
100 					      int count,
101 					      meIOStreamTrigger_t * trigger,
102 					      int fifo_irq_threshold,
103 					      int flags);
104 
105 	int (*me_subdevice_io_stream_new_values) (struct me_subdevice *
106 						  subdevice,
107 						  struct file * filep,
108 						  int time_out, int *count,
109 						  int flags);
110 
111 	int (*me_subdevice_io_stream_read) (struct me_subdevice * subdevice,
112 					    struct file * filep,
113 					    int read_mode,
114 					    int *values, int *count, int flags);
115 
116 	int (*me_subdevice_io_stream_start) (struct me_subdevice * subdevice,
117 					     struct file * filep,
118 					     int start_mode,
119 					     int time_out, int flags);
120 
121 	int (*me_subdevice_io_stream_status) (struct me_subdevice * subdevice,
122 					      struct file * filep,
123 					      int wait,
124 					      int *status,
125 					      int *count, int flags);
126 
127 	int (*me_subdevice_io_stream_stop) (struct me_subdevice * subdevice,
128 					    struct file * filep,
129 					    int stop_mode, int flags);
130 
131 	int (*me_subdevice_io_stream_write) (struct me_subdevice * subdevice,
132 					     struct file * filep,
133 					     int write_mode,
134 					     int *values,
135 					     int *count, int flags);
136 
137 	int (*me_subdevice_lock_subdevice) (struct me_subdevice * subdevice,
138 					    struct file * filep,
139 					    int lock, int flags);
140 
141 	int (*me_subdevice_query_number_channels) (struct me_subdevice *
142 						   subdevice, int *number);
143 
144 	int (*me_subdevice_query_number_ranges) (struct me_subdevice *
145 						 subdevice, int unit,
146 						 int *count);
147 
148 	int (*me_subdevice_query_range_by_min_max) (struct me_subdevice *
149 						    subdevice, int unit,
150 						    int *min, int *max,
151 						    int *maxdata, int *range);
152 
153 	int (*me_subdevice_query_range_info) (struct me_subdevice * subdevice,
154 					      int range,
155 					      int *unit,
156 					      int *min, int *max, int *maxdata);
157 
158 	int (*me_subdevice_query_subdevice_type) (struct me_subdevice *
159 						  subdevice, int *type,
160 						  int *subtype);
161 
162 	int (*me_subdevice_query_subdevice_caps) (struct me_subdevice *
163 						  subdevice, int *caps);
164 
165 	int (*me_subdevice_query_subdevice_caps_args) (struct me_subdevice *
166 						       subdevice, int cap,
167 						       int *args, int count);
168 
169 	int (*me_subdevice_query_timer) (struct me_subdevice * subdevice,
170 					 int timer,
171 					 int *base_frequency,
172 					 long long *min_ticks,
173 					 long long *max_ticks);
174 
175 	int (*me_subdevice_config_load) (struct me_subdevice * subdevice,
176 					 me_cfg_device_entry_t * config);
177 
178 	void (*me_subdevice_destructor) (struct me_subdevice * subdevice);
179 } me_subdevice_t;
180 
181 /**
182  * @brief Initializes a subdevice structure.
183  *
184  * @param subdevice The subdevice structure to initialize.
185  * @return 0 on success.
186  */
187 int me_subdevice_init(me_subdevice_t * subdevice);
188 
189 /**
190  * @brief Deinitializes a subdevice structure.
191  *
192  * @param subdevice The subdevice structure to initialize.
193  */
194 void me_subdevice_deinit(me_subdevice_t * subdevice);
195 
196 #endif
197 #endif
198