4 * @brief ME-4000 analog input subdevice instance.
5 * @note Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de)
6 * @author Guenter Gebhardt
7 * @author Krzysztof Gantzke (k.gantzke@meilhaus.de)
11 * Copyright (C) 2007 Meilhaus Electronic GmbH (support@meilhaus.de)
13 * This file is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
35 #include <linux/module.h>
37 #include <linux/slab.h>
38 #include <linux/spinlock.h>
40 #include <linux/uaccess.h>
41 #include <linux/types.h>
42 #include <linux/interrupt.h>
43 #include <linux/delay.h>
45 #include "medefines.h"
46 #include "meinternal.h"
51 #include "me4600_reg.h"
52 #include "me4600_ai_reg.h"
53 #include "me4600_ai.h"
56 * Declarations (local)
59 static void me4600_ai_destructor(struct me_subdevice *subdevice);
60 static int me4600_ai_io_reset_subdevice(me_subdevice_t *subdevice,
61 struct file *filep, int flags);
63 static int me4600_ai_io_single_config(me_subdevice_t *subdevice,
69 int trig_type, int trig_edge, int flags);
71 static int me4600_ai_io_single_read(me_subdevice_t *subdevice,
74 int *value, int time_out, int flags);
76 static int me4600_ai_io_stream_config(me_subdevice_t *subdevice,
78 meIOStreamConfig_t *config_list,
80 meIOStreamTrigger_t *trigger,
81 int fifo_irq_threshold, int flags);
82 static int me4600_ai_io_stream_read(me_subdevice_t *subdevice,
85 int *values, int *count, int flags);
86 static int me4600_ai_io_stream_new_values(me_subdevice_t *subdevice,
88 int time_out, int *count, int flags);
89 static inline int me4600_ai_io_stream_read_get_value(me4600_ai_subdevice_t *
90 instance, int *values,
94 static int me4600_ai_io_stream_start(me_subdevice_t *subdevice,
96 int start_mode, int time_out, int flags);
97 static int me4600_ai_io_stream_stop(me_subdevice_t *subdevice,
99 int stop_mode, int flags);
100 static int me4600_ai_io_stream_status(me_subdevice_t *subdevice,
103 int *status, int *values, int flags);
105 static int me4600_ai_query_range_by_min_max(me_subdevice_t *subdevice,
108 int *max, int *maxdata, int *range);
109 static int me4600_ai_query_number_ranges(me_subdevice_t *subdevice,
110 int unit, int *count);
111 static int me4600_ai_query_range_info(me_subdevice_t *subdevice,
114 int *min, int *max, int *maxdata);
115 static int me4600_ai_query_timer(me_subdevice_t *subdevice,
118 long long *min_ticks, long long *max_ticks);
119 static int me4600_ai_query_number_channels(me_subdevice_t *subdevice,
121 static int me4600_ai_query_subdevice_type(me_subdevice_t *subdevice,
122 int *type, int *subtype);
123 static int me4600_ai_query_subdevice_caps(me_subdevice_t *subdevice,
125 static int me4600_ai_query_subdevice_caps_args(struct me_subdevice *subdevice,
126 int cap, int *args, int count);
128 static irqreturn_t me4600_ai_isr(int irq, void *dev_id);
130 static int ai_mux_toggler(me4600_ai_subdevice_t *subdevice);
133 * Reset all IRQ's sources. (block laches)
136 static int ai_stop_immediately(me4600_ai_subdevice_t *instance);
139 * Reset all IRQ's sources. (block laches)
142 inline void ai_stop_isr(me4600_ai_subdevice_t *instance);
144 /** Interrupt logics.
148 void ai_limited_isr(me4600_ai_subdevice_t *instance, const uint32_t irq_status,
149 const uint32_t ctrl_status);
150 void ai_infinite_isr(me4600_ai_subdevice_t *instance,
151 const uint32_t irq_status, const uint32_t ctrl_status);
153 /** Last chunck of datas. We must reschedule sample counter.
154 * Leaving SC_RELOAD doesn't do any harm, but in some bad case can make extra interrupts.
155 * When threshold is wrongly set some IRQ are lost.(!!!)
157 inline void ai_reschedule_SC(me4600_ai_subdevice_t *instance);
159 /** Read datas from FIFO and copy them to buffer */
160 static inline int ai_read_data(me4600_ai_subdevice_t *instance,
163 /** Copy rest of data from fifo to circular buffer.*/
164 static inline int ai_read_data_pooling(me4600_ai_subdevice_t *instance);
166 /** Set ISM to next state for infinite data aqusation mode*/
167 inline void ai_infinite_ISM(me4600_ai_subdevice_t *instance);
169 /** Set ISM to next state for define amount of data aqusation mode*/
170 inline void ai_limited_ISM(me4600_ai_subdevice_t *instance,
171 uint32_t irq_status);
173 /** Set ISM to next stage for limited mode */
174 inline void ai_data_acquisition_logic(me4600_ai_subdevice_t *instance);
176 static void me4600_ai_work_control_task(struct work_struct *work);
181 me4600_ai_subdevice_t *me4600_ai_constructor(uint32_t reg_base,
182 unsigned int channels,
187 spinlock_t *ctrl_reg_lock,
188 struct workqueue_struct *me4600_wq)
190 me4600_ai_subdevice_t *subdevice;
194 PDEBUG("executed. idx=0\n");
196 // Allocate memory for subdevice instance.
197 subdevice = kmalloc(sizeof(me4600_ai_subdevice_t), GFP_KERNEL);
200 PERROR("Cannot get memory for subdevice instance.\n");
204 memset(subdevice, 0, sizeof(me4600_ai_subdevice_t));
206 // Initialize subdevice base class.
207 err = me_subdevice_init(&subdevice->base);
210 PERROR("Cannot initialize subdevice base class instance.\n");
214 // Initialize spin locks.
215 spin_lock_init(&subdevice->subdevice_lock);
217 subdevice->ctrl_reg_lock = ctrl_reg_lock;
219 // Initialize circular buffer.
220 subdevice->circ_buf.mask = ME4600_AI_CIRC_BUF_COUNT - 1;
222 subdevice->circ_buf.buf =
223 (void *)__get_free_pages(GFP_KERNEL, ME4600_AI_CIRC_BUF_SIZE_ORDER);
224 PDEBUG("circ_buf = %p size=%ld\n", subdevice->circ_buf.buf,
225 ME4600_AI_CIRC_BUF_SIZE);
227 if (!subdevice->circ_buf.buf) {
228 PERROR("Cannot get circular buffer.\n");
229 me_subdevice_deinit((me_subdevice_t *) subdevice);
234 memset(subdevice->circ_buf.buf, 0, ME4600_AI_CIRC_BUF_SIZE);
235 subdevice->circ_buf.head = 0;
236 subdevice->circ_buf.tail = 0;
237 subdevice->status = ai_status_none;
239 // Initialize wait queue.
240 init_waitqueue_head(&subdevice->wait_queue);
242 // Save the number of channels.
243 subdevice->channels = channels;
245 /* Initialize the single config entries to reset values */
246 for (i = 0; i < channels; i++) {
247 subdevice->single_config[i].status = ME_SINGLE_CHANNEL_NOT_CONFIGURED; //not configured
250 // Save if isolated device.
251 subdevice->isolated = isolated;
253 // Save if sample and hold is available.
256 // Set stream config to not configured state.
257 subdevice->fifo_irq_threshold = 0;
258 subdevice->data_required = 0;
259 subdevice->chan_list_len = 0;
261 // Initialize registers addresses.
262 subdevice->ctrl_reg = reg_base + ME4600_AI_CTRL_REG;
263 subdevice->status_reg = reg_base + ME4600_AI_STATUS_REG;
264 subdevice->channel_list_reg = reg_base + ME4600_AI_CHANNEL_LIST_REG;
265 subdevice->data_reg = reg_base + ME4600_AI_DATA_REG;
266 subdevice->chan_timer_reg = reg_base + ME4600_AI_CHAN_TIMER_REG;
267 subdevice->chan_pre_timer_reg = reg_base + ME4600_AI_CHAN_PRE_TIMER_REG;
268 subdevice->scan_timer_low_reg = reg_base + ME4600_AI_SCAN_TIMER_LOW_REG;
269 subdevice->scan_timer_high_reg =
270 reg_base + ME4600_AI_SCAN_TIMER_HIGH_REG;
271 subdevice->scan_pre_timer_low_reg =
272 reg_base + ME4600_AI_SCAN_PRE_TIMER_LOW_REG;
273 subdevice->scan_pre_timer_high_reg =
274 reg_base + ME4600_AI_SCAN_PRE_TIMER_HIGH_REG;
275 subdevice->start_reg = reg_base + ME4600_AI_START_REG;
276 subdevice->irq_status_reg = reg_base + ME4600_IRQ_STATUS_REG;
277 subdevice->sample_counter_reg = reg_base + ME4600_AI_SAMPLE_COUNTER_REG;
278 #ifdef MEDEBUG_DEBUG_REG
279 subdevice->reg_base = reg_base;
282 // Initialize ranges.
283 subdevice->ranges_len = ranges;
284 subdevice->ranges[0].min = -10E6;
285 subdevice->ranges[0].max = 9999694;
287 subdevice->ranges[1].min = 0;
288 subdevice->ranges[1].max = 9999847;
290 subdevice->ranges[2].min = -25E5;
291 subdevice->ranges[2].max = 2499923;
293 subdevice->ranges[3].min = 0;
294 subdevice->ranges[3].max = 2499961;
296 // We have to switch the mux in order to get it work correctly.
297 ai_mux_toggler(subdevice);
299 // Register interrupt service routine.
300 subdevice->irq = irq;
301 if (request_irq(subdevice->irq, me4600_ai_isr,
303 IRQF_DISABLED | IRQF_SHARED,
305 SA_INTERRUPT | SA_SHIRQ,
307 ME4600_NAME, subdevice)) {
308 PERROR("Cannot register interrupt service routine.\n");
309 me_subdevice_deinit((me_subdevice_t *) subdevice);
310 free_pages((unsigned long)subdevice->circ_buf.buf,
311 ME4600_AI_CIRC_BUF_SIZE_ORDER);
312 subdevice->circ_buf.buf = NULL;
316 PINFO("Registered irq=%d.\n", subdevice->irq);
318 // Override base class methods.
319 subdevice->base.me_subdevice_destructor = me4600_ai_destructor;
320 subdevice->base.me_subdevice_io_reset_subdevice =
321 me4600_ai_io_reset_subdevice;
322 subdevice->base.me_subdevice_io_single_config =
323 me4600_ai_io_single_config;
324 subdevice->base.me_subdevice_io_single_read = me4600_ai_io_single_read;
325 subdevice->base.me_subdevice_io_stream_config =
326 me4600_ai_io_stream_config;
327 subdevice->base.me_subdevice_io_stream_new_values =
328 me4600_ai_io_stream_new_values;
329 subdevice->base.me_subdevice_io_stream_read = me4600_ai_io_stream_read;
330 subdevice->base.me_subdevice_io_stream_start =
331 me4600_ai_io_stream_start;
332 subdevice->base.me_subdevice_io_stream_status =
333 me4600_ai_io_stream_status;
334 subdevice->base.me_subdevice_io_stream_stop = me4600_ai_io_stream_stop;
335 subdevice->base.me_subdevice_query_number_channels =
336 me4600_ai_query_number_channels;
337 subdevice->base.me_subdevice_query_subdevice_type =
338 me4600_ai_query_subdevice_type;
339 subdevice->base.me_subdevice_query_subdevice_caps =
340 me4600_ai_query_subdevice_caps;
341 subdevice->base.me_subdevice_query_subdevice_caps_args =
342 me4600_ai_query_subdevice_caps_args;
343 subdevice->base.me_subdevice_query_range_by_min_max =
344 me4600_ai_query_range_by_min_max;
345 subdevice->base.me_subdevice_query_number_ranges =
346 me4600_ai_query_number_ranges;
347 subdevice->base.me_subdevice_query_range_info =
348 me4600_ai_query_range_info;
349 subdevice->base.me_subdevice_query_timer = me4600_ai_query_timer;
351 // Prepare work queue.
352 subdevice->me4600_workqueue = me4600_wq;
354 /* workqueue API changed in kernel 2.6.20 */
355 INIT_DELAYED_WORK(&subdevice->ai_control_task,
356 me4600_ai_work_control_task);
361 static void me4600_ai_destructor(struct me_subdevice *subdevice)
363 me4600_ai_subdevice_t *instance;
365 instance = (me4600_ai_subdevice_t *) subdevice;
367 PDEBUG("executed. idx=0\n");
369 instance->ai_control_task_flag = 0;
370 // Reset subdevice to asure clean exit.
371 me4600_ai_io_reset_subdevice(subdevice, NULL,
372 ME_IO_RESET_SUBDEVICE_NO_FLAGS);
374 // Remove any tasks from work queue. This is paranoic because it was done allready in reset().
375 if (!cancel_delayed_work(&instance->ai_control_task)) { //Wait 2 ticks to be sure that control task is removed from queue.
376 set_current_state(TASK_INTERRUPTIBLE);
380 free_irq(instance->irq, instance);
381 free_pages((unsigned long)instance->circ_buf.buf,
382 ME4600_AI_CIRC_BUF_SIZE_ORDER);
383 me_subdevice_deinit(&instance->base);
387 static int me4600_ai_io_reset_subdevice(me_subdevice_t *subdevice,
388 struct file *filep, int flags)
390 me4600_ai_subdevice_t *instance;
391 int err = ME_ERRNO_SUCCESS;
392 volatile uint32_t ctrl;
393 unsigned long status;
394 const int timeout = HZ / 10; //100ms
397 PDEBUG("executed. idx=0\n");
400 PERROR("Invalid flag specified.\n");
401 return ME_ERRNO_INVALID_FLAGS;
404 instance = (me4600_ai_subdevice_t *) subdevice;
408 instance->ai_control_task_flag = 0;
409 instance->status = ai_status_none;
411 for (i = 0; i <= timeout; i++) {
412 spin_lock_irqsave(instance->ctrl_reg_lock, status);
413 ctrl = inl(instance->ctrl_reg);
415 ctrl &= ~ME4600_AI_CTRL_RPCI_FIFO;
416 // Stop all actions. No conditions!
417 ctrl &= ~ME4600_AI_CTRL_BIT_STOP;
418 ctrl |= ME4600_AI_CTRL_BIT_IMMEDIATE_STOP;
420 outl(ctrl, instance->ctrl_reg);
421 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
423 instance->ctrl_reg - instance->reg_base, ctrl);
424 spin_unlock_irqrestore(instance->ctrl_reg_lock, status);
426 if (!(inl(instance->status_reg) & ME4600_AI_STATUS_BIT_FSM))
429 set_current_state(TASK_INTERRUPTIBLE);
434 PERROR("FSM is still busy.\n");
436 return ME_ERRNO_INTERNAL;
439 spin_lock_irqsave(instance->ctrl_reg_lock, status);
440 ctrl = inl(instance->ctrl_reg);
441 // Clear all features. Dissable interrupts.
442 ctrl &= ~(ME4600_AI_CTRL_BIT_STOP
443 | ME4600_AI_CTRL_BIT_LE_IRQ
444 | ME4600_AI_CTRL_BIT_HF_IRQ | ME4600_AI_CTRL_BIT_SC_IRQ);
445 ctrl |= (ME4600_AI_CTRL_BIT_IMMEDIATE_STOP
446 | ME4600_AI_CTRL_BIT_LE_IRQ_RESET
447 | ME4600_AI_CTRL_BIT_HF_IRQ_RESET
448 | ME4600_AI_CTRL_BIT_SC_IRQ_RESET);
450 outl(ctrl, instance->ctrl_reg);
451 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
452 instance->ctrl_reg - instance->reg_base, ctrl);
453 spin_unlock_irqrestore(instance->ctrl_reg_lock, status);
455 outl(ME4600_AI_MIN_CHAN_TICKS - 1, instance->chan_timer_reg);
456 PDEBUG_REG("chan_timer_reg outl(0x%lX+0x%lX)=0x%llx\n",
458 instance->chan_timer_reg - instance->reg_base,
459 ME4600_AI_MIN_CHAN_TICKS);
460 outl(ME4600_AI_MIN_ACQ_TICKS - 1, instance->chan_pre_timer_reg);
461 PDEBUG_REG("chan_pre_timer_reg outl(0x%lX+0x%lX)=0x%llx\n",
463 instance->chan_pre_timer_reg - instance->reg_base,
464 ME4600_AI_MIN_ACQ_TICKS);
465 outl(0, instance->scan_timer_low_reg);
466 PDEBUG_REG("scan_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
468 instance->scan_timer_low_reg - instance->reg_base, 0);
469 outl(0, instance->scan_timer_high_reg);
470 PDEBUG_REG("scan_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
472 instance->scan_timer_high_reg - instance->reg_base, 0);
473 outl(0, instance->scan_pre_timer_low_reg);
474 PDEBUG_REG("scan_pre_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
476 instance->scan_pre_timer_low_reg - instance->reg_base, 0);
477 outl(0, instance->scan_pre_timer_high_reg);
478 PDEBUG_REG("scan_pre_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
480 instance->scan_pre_timer_high_reg - instance->reg_base, 0);
481 outl(0xEFFFFFFF, instance->sample_counter_reg);
482 PDEBUG_REG("sample_counter_reg outl(0x%lX+0x%lX)=0x%x\n",
484 instance->sample_counter_reg - instance->reg_base,
487 instance->circ_buf.head = 0;
488 instance->circ_buf.tail = 0;
490 instance->fifo_irq_threshold = 0;
491 instance->data_required = 0;
492 instance->chan_list_len = 0;
494 // Initialize the single config entries to reset values.
495 for (i = 0; i < instance->channels; i++) {
496 instance->single_config[i].status =
497 ME_SINGLE_CHANNEL_NOT_CONFIGURED;
499 instance->status = ai_status_none;
501 //Signal reset if user is on wait.
502 wake_up_interruptible_all(&instance->wait_queue);
509 static int me4600_ai_io_single_config(me_subdevice_t *subdevice,
515 int trig_type, int trig_edge, int flags)
517 me4600_ai_subdevice_t *instance;
518 int err = ME_ERRNO_SUCCESS;
519 unsigned long cpu_flags;
522 instance = (me4600_ai_subdevice_t *) subdevice;
524 PDEBUG("executed. idx=0\n");
526 if (flags & ~ME_IO_SINGLE_CONFIG_CONTINUE) {
527 PERROR("Invalid flag specified.\n");
528 return ME_ERRNO_INVALID_FLAGS;
532 case ME_TRIG_TYPE_SW:
533 if (trig_edge != ME_TRIG_EDGE_NONE) {
535 ("Invalid trigger edge. Software trigger has not edge.\n");
536 return ME_ERRNO_INVALID_TRIG_EDGE;
540 case ME_TRIG_TYPE_EXT_ANALOG:
541 if (instance->channels <= 16) //Only versions with 32 channels have analog trigger (4670 and 4680)
543 PERROR("Invalid trigger type specified.\n");
544 return ME_ERRNO_INVALID_TRIG_TYPE;
547 case ME_TRIG_TYPE_EXT_DIGITAL:
548 if ((trig_edge != ME_TRIG_EDGE_ANY)
549 && (trig_edge != ME_TRIG_EDGE_RISING)
550 && (trig_edge != ME_TRIG_EDGE_FALLING)) {
551 PERROR("Invalid trigger edge specified.\n");
552 return ME_ERRNO_INVALID_TRIG_EDGE;
557 PERROR("Invalid trigger type specified.\n");
558 return ME_ERRNO_INVALID_TRIG_TYPE;
561 if (trig_chan != ME_TRIG_CHAN_DEFAULT) {
562 PERROR("Invalid trigger channel specified.\n");
563 return ME_ERRNO_INVALID_TRIG_CHAN;
566 if ((single_config < 0) || (single_config >= instance->ranges_len)) {
567 PERROR("Invalid single config specified.\n");
568 return ME_ERRNO_INVALID_SINGLE_CONFIG;
571 if ((ref != ME_REF_AI_GROUND) && (ref != ME_REF_AI_DIFFERENTIAL)) {
572 PERROR("Invalid analog reference specified.\n");
573 return ME_ERRNO_INVALID_REF;
576 if ((single_config % 2) && (ref != ME_REF_AI_GROUND)) {
577 PERROR("Invalid analog reference specified.\n");
578 return ME_ERRNO_INVALID_REF;
581 if ((ref == ME_REF_AI_DIFFERENTIAL)
582 && ((instance->channels == 16) || (channel >= 16))) {
583 PERROR("Invalid analog reference specified.\n");
584 return ME_ERRNO_INVALID_REF;
588 PERROR("Invalid channel number specified.\n");
589 return ME_ERRNO_INVALID_CHANNEL;
592 if (channel >= instance->channels) {
593 PERROR("Invalid channel number specified.\n");
594 return ME_ERRNO_INVALID_CHANNEL;
599 spin_lock_irqsave(&instance->subdevice_lock, cpu_flags);
600 //Prepare data entry.
601 // Common for all modes.
602 instance->single_config[channel].entry =
603 channel | ME4600_AI_LIST_LAST_ENTRY;
605 if (ref == ME_REF_AI_DIFFERENTIAL) { // ME_REF_AI_DIFFERENTIAL
606 instance->single_config[channel].entry |=
607 ME4600_AI_LIST_INPUT_DIFFERENTIAL;
610 // ME4600_AI_LIST_INPUT_SINGLE_ENDED = 0x0000
611 // 'entry |= ME4600_AI_LIST_INPUT_SINGLE_ENDED' <== Do nothing. Removed.
614 instance->single_config[channel].entry |= ME4600_AI_LIST_INPUT_SINGLE_ENDED;
617 switch (single_config) {
620 // ME4600_AI_LIST_RANGE_BIPOLAR_10 = 0x0000
621 // 'entry |= ME4600_AI_LIST_RANGE_BIPOLAR_10' <== Do nothing. Removed.
622 instance->single_config[channel].entry |= ME4600_AI_LIST_RANGE_BIPOLAR_10;
626 instance->single_config[channel].entry |=
627 ME4600_AI_LIST_RANGE_UNIPOLAR_10;
630 case 2: //-2.5V..2.5V
631 instance->single_config[channel].entry |=
632 ME4600_AI_LIST_RANGE_BIPOLAR_2_5;
636 instance->single_config[channel].entry |=
637 ME4600_AI_LIST_RANGE_UNIPOLAR_2_5;
641 // Prepare control register.
642 // Common for all modes.
643 instance->single_config[channel].ctrl =
644 ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO;
647 case ME_TRIG_TYPE_SW:
651 case ME_TRIG_TYPE_EXT_ANALOG:
652 instance->single_config[channel].ctrl |=
653 ME4600_AI_CTRL_BIT_EX_TRIG_ANALOG;
655 case ME_TRIG_TYPE_EXT_DIGITAL:
656 instance->single_config[channel].ctrl |=
657 ME4600_AI_CTRL_BIT_EX_TRIG;
662 case ME_TRIG_EDGE_RISING:
666 case ME_TRIG_EDGE_ANY:
667 instance->single_config[channel].ctrl |=
668 ME4600_AI_CTRL_BIT_EX_TRIG_BOTH;
670 case ME_TRIG_EDGE_FALLING:
671 instance->single_config[channel].ctrl |=
672 ME4600_AI_CTRL_BIT_EX_TRIG_FALLING;
676 // Enable this channel
677 instance->single_config[channel].status = ME_SINGLE_CHANNEL_CONFIGURED;
679 // Copy this settings to other outputs.
680 if (flags == ME_IO_SINGLE_CONFIG_CONTINUE) {
681 for (i = channel + 1; i < instance->channels; i++) {
682 instance->single_config[i].ctrl =
683 instance->single_config[channel].ctrl;
684 instance->single_config[i].entry =
685 instance->single_config[channel].entry;
686 instance->single_config[i].status =
687 ME_SINGLE_CHANNEL_CONFIGURED;
691 instance->status = ai_status_single_configured;
692 spin_unlock_irqrestore(&instance->subdevice_lock, cpu_flags);
699 static int me4600_ai_io_single_read(me_subdevice_t *subdevice,
702 int *value, int time_out, int flags)
704 me4600_ai_subdevice_t *instance;
705 volatile uint32_t tmp;
706 volatile uint32_t val;
707 unsigned long cpu_flags;
708 int err = ME_ERRNO_SUCCESS;
711 unsigned long delay = 0;
713 PDEBUG("executed. idx=0\n");
715 instance = (me4600_ai_subdevice_t *) subdevice;
718 PERROR("Invalid flag specified.\n");
719 return ME_ERRNO_INVALID_FLAGS;
722 if (instance->status != ai_status_single_configured) {
723 PERROR("Subdevice not configured to work in single mode!\n");
724 return ME_ERRNO_PREVIOUS_CONFIG;
727 if ((channel > instance->channels) || (channel < 0)) {
728 PERROR("Invalid channel specified.\n");
729 return ME_ERRNO_INVALID_CHANNEL;
733 PERROR("Invalid timeout specified.\n");
734 return ME_ERRNO_INVALID_TIMEOUT;
737 if (instance->single_config[channel].status !=
738 ME_SINGLE_CHANNEL_CONFIGURED) {
739 PERROR("Channel is not configured to work in single mode!\n");
740 return ME_ERRNO_PREVIOUS_CONFIG;
743 if (inl(instance->status_reg) & ME4600_AI_STATUS_BIT_FSM) {
744 PERROR("Subdevice is busy.\n");
745 return ME_ERRNO_SUBDEVICE_BUSY;
750 // Cancel control task
751 PDEBUG("Cancel control task.\n");
752 instance->ai_control_task_flag = 0;
753 cancel_delayed_work(&instance->ai_control_task);
756 delay = (time_out * HZ) / 1000;
762 spin_lock_irqsave(&instance->subdevice_lock, cpu_flags);
764 // Mark that StreamConfig is removed.
765 instance->chan_list_len = 0;
767 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
768 /// @note Imprtant: Preserve EXT IRQ settings.
769 tmp = inl(instance->ctrl_reg);
770 // Clear FIFOs and dissable interrupts
772 ~(ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO);
775 ~(ME4600_AI_CTRL_BIT_SC_IRQ | ME4600_AI_CTRL_BIT_HF_IRQ |
776 ME4600_AI_CTRL_BIT_LE_IRQ);
778 ME4600_AI_CTRL_BIT_SC_IRQ_RESET | ME4600_AI_CTRL_BIT_HF_IRQ_RESET |
779 ME4600_AI_CTRL_BIT_LE_IRQ_RESET;
781 tmp |= ME4600_AI_CTRL_BIT_IMMEDIATE_STOP;
782 outl(tmp, instance->ctrl_reg);
783 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
784 instance->ctrl_reg - instance->reg_base, tmp);
786 outl(0, instance->scan_pre_timer_low_reg);
787 PDEBUG_REG("scan_pre_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
789 instance->scan_pre_timer_low_reg - instance->reg_base, 0);
790 outl(0, instance->scan_pre_timer_high_reg);
791 PDEBUG_REG("scan_pre_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
793 instance->scan_pre_timer_high_reg - instance->reg_base, 0);
794 outl(0, instance->scan_timer_low_reg);
795 PDEBUG_REG("scan_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
797 instance->scan_timer_low_reg - instance->reg_base, 0);
798 outl(0, instance->scan_timer_high_reg);
799 PDEBUG_REG("scan_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
801 instance->scan_timer_high_reg - instance->reg_base, 0);
802 outl(65, instance->chan_timer_reg);
803 PDEBUG_REG("chan_timer_reg outl(0x%lX+0x%lX)=0x%x\n",
805 instance->chan_timer_reg - instance->reg_base, 65);
806 outl(65, instance->chan_pre_timer_reg);
807 PDEBUG_REG("chan_pre_timer_reg outl(0x%lX+0x%lX)=0x%x\n",
809 instance->chan_pre_timer_reg - instance->reg_base, 65);
811 //Reactive FIFOs. Enable work.
812 tmp |= ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO;
813 outl(tmp, instance->ctrl_reg);
814 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
815 instance->ctrl_reg - instance->reg_base, tmp);
817 outl(instance->single_config[channel].entry,
818 instance->channel_list_reg);
819 PDEBUG_REG("channel_list_reg outl(0x%lX+0x%lX)=0x%x\n",
821 instance->channel_list_reg - instance->reg_base,
822 instance->single_config[channel].entry);
824 // Preserve EXT IRQ settings.
825 tmp &= (ME4600_AI_CTRL_BIT_EX_IRQ | ME4600_AI_CTRL_BIT_EX_IRQ_RESET);
826 outl(instance->single_config[channel].ctrl | tmp, instance->ctrl_reg);
827 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
828 instance->ctrl_reg - instance->reg_base,
829 instance->single_config[channel].ctrl | tmp);
831 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
833 if (!(instance->single_config[channel].ctrl & ME4600_AI_CTRL_BIT_EX_TRIG)) { // Software start
834 inl(instance->start_reg);
835 PDEBUG_REG("start_reg inl(0x%lX+0x%lX)\n", instance->reg_base,
836 instance->start_reg - instance->reg_base);
843 while (!(inl(instance->status_reg) & ME4600_AI_STATUS_BIT_EF_DATA)) {
844 if (delay && ((jiffies - j) >= delay)) {
845 if (!(instance->single_config[channel].ctrl & ME4600_AI_CTRL_BIT_EX_TRIG)) { // Software start.
846 PERROR("Value not available after wait.\n");
847 err = ME_ERRNO_INTERNAL;
848 } else { // External start.
849 PERROR("Timeout reached.\n");
850 err = ME_ERRNO_TIMEOUT;
855 set_current_state(TASK_INTERRUPTIBLE);
858 if (signal_pending(current)) {
860 ("Wait on external trigger interrupted by signal.\n");
861 err = ME_ERRNO_SIGNAL;
865 if (instance->status != ai_status_single_configured) {
866 PERROR("Wait interrupted by reset.\n");
867 err = ME_ERRNO_CANCELLED;
874 val = inl(instance->data_reg) ^ 0x8000;
875 PDEBUG_REG("data_reg inl(0x%lX+0x%lX)=0x%x\n",
877 instance->data_reg - instance->reg_base, val);
878 *value = val & ME4600_AI_MAX_DATA;
884 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
885 tmp = inl(instance->ctrl_reg);
886 // Clear FIFOs and dissable interrupts.
888 ~(ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO);
889 tmp |= ME4600_AI_CTRL_BIT_SC_IRQ | ME4600_AI_CTRL_BIT_HF_IRQ;
891 ME4600_AI_CTRL_BIT_SC_IRQ_RESET | ME4600_AI_CTRL_BIT_HF_IRQ_RESET |
892 ME4600_AI_CTRL_BIT_LE_IRQ_RESET | ME4600_AI_CTRL_BIT_IMMEDIATE_STOP;
893 outl(tmp, instance->ctrl_reg);
894 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
895 instance->ctrl_reg - instance->reg_base, tmp);
896 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
898 spin_unlock_irqrestore(&instance->subdevice_lock, cpu_flags);
905 static int me4600_ai_io_stream_config(me_subdevice_t *subdevice,
907 meIOStreamConfig_t *config_list,
909 meIOStreamTrigger_t *trigger,
910 int fifo_irq_threshold, int flags)
912 me4600_ai_subdevice_t *instance;
913 int err = ME_ERRNO_SUCCESS;
914 int i; // internal multipurpose variable
915 unsigned long long data_required;
917 volatile uint32_t entry;
918 volatile uint32_t ctrl = ME4600_AI_CTRL_BIT_IMMEDIATE_STOP;
919 volatile uint32_t tmp; // use when current copy of register's value needed
920 unsigned long cpu_flags;
925 unsigned int acq_start_ticks_low = trigger->iAcqStartTicksLow;
926 unsigned int acq_start_ticks_high = trigger->iAcqStartTicksHigh;
927 unsigned int scan_start_ticks_low = trigger->iScanStartTicksLow;
928 unsigned int scan_start_ticks_high = trigger->iScanStartTicksHigh;
929 unsigned int conv_start_ticks_low = trigger->iConvStartTicksLow;
930 unsigned int conv_start_ticks_high = trigger->iConvStartTicksHigh;
932 PDEBUG("executed. idx=0\n");
934 instance = (me4600_ai_subdevice_t *) subdevice;
937 PERROR("Invalid flag specified.\n");
938 return ME_ERRNO_INVALID_FLAGS;
942 // Convert ticks to 64 bit long values
944 (uint64_t) acq_start_ticks_low +
945 ((uint64_t) acq_start_ticks_high << 32);
947 (uint64_t) scan_start_ticks_low +
948 ((uint64_t) scan_start_ticks_high << 32);
950 (uint64_t) conv_start_ticks_low +
951 ((uint64_t) conv_start_ticks_high << 32);
953 // Check settings - begin
954 switch (trigger->iAcqStartTrigType) {
955 case ME_TRIG_TYPE_SW:
956 case ME_TRIG_TYPE_EXT_DIGITAL:
957 case ME_TRIG_TYPE_EXT_ANALOG:
961 PERROR("Invalid acquisition start trigger type specified.\n");
962 err = ME_ERRNO_INVALID_ACQ_START_TRIG_TYPE;
967 if ((trigger->iAcqStartTrigType == ME_TRIG_TYPE_SW)
968 && (trigger->iAcqStartTrigEdge != ME_TRIG_EDGE_NONE)) {
969 PERROR("Invalid acquisition start trigger edge specified.\n");
970 err = ME_ERRNO_INVALID_ACQ_START_TRIG_EDGE;
974 if (trigger->iAcqStartTrigType != ME_TRIG_TYPE_SW) {
975 switch (trigger->iAcqStartTrigEdge) {
976 case ME_TRIG_EDGE_RISING:
977 case ME_TRIG_EDGE_FALLING:
978 case ME_TRIG_EDGE_ANY:
983 ("Invalid acquisition start trigger edge specified.\n");
984 err = ME_ERRNO_INVALID_ACQ_START_TRIG_EDGE;
990 if (trigger->iAcqStartTrigChan != ME_TRIG_CHAN_DEFAULT) {
992 ("Invalid acquisition start trigger channel specified.\n");
993 err = ME_ERRNO_INVALID_ACQ_START_TRIG_CHAN;
997 if ((acq_ticks < ME4600_AI_MIN_ACQ_TICKS)
998 || (acq_ticks > ME4600_AI_MAX_ACQ_TICKS)) {
1000 ("Invalid acquisition start trigger argument specified.\n");
1001 err = ME_ERRNO_INVALID_ACQ_START_ARG;
1005 switch (trigger->iScanStartTrigType) {
1007 case ME_TRIG_TYPE_TIMER:
1008 if ((scan_ticks < ME4600_AI_MIN_SCAN_TICKS)
1009 || (scan_ticks > ME4600_AI_MAX_SCAN_TICKS)
1010 || (scan_ticks < count * conv_ticks)
1012 PERROR("Invalid scan start argument specified.\n");
1013 err = ME_ERRNO_INVALID_SCAN_START_ARG;
1018 case ME_TRIG_TYPE_EXT_DIGITAL:
1019 if (trigger->iAcqStartTrigType != ME_TRIG_TYPE_EXT_DIGITAL) {
1021 ("Invalid scan start trigger type specified (Acq is HW digital)\n");
1022 err = ME_ERRNO_INVALID_SCAN_START_TRIG_TYPE;
1027 case ME_TRIG_TYPE_EXT_ANALOG:
1028 if (trigger->iAcqStartTrigType != ME_TRIG_TYPE_EXT_ANALOG) {
1030 ("Invalid scan start trigger type specified (Acq is HW analog)\n");
1031 err = ME_ERRNO_INVALID_SCAN_START_TRIG_TYPE;
1036 case ME_TRIG_TYPE_FOLLOW:
1040 PERROR("Invalid scan start trigger type specified.\n");
1041 err = ME_ERRNO_INVALID_SCAN_START_TRIG_TYPE;
1046 switch (trigger->iConvStartTrigType) {
1048 case ME_TRIG_TYPE_TIMER:
1049 if ((conv_ticks < ME4600_AI_MIN_CHAN_TICKS)
1050 || (conv_ticks > ME4600_AI_MAX_CHAN_TICKS)) {
1052 ("Invalid conv start trigger argument specified.\n");
1053 err = ME_ERRNO_INVALID_CONV_START_ARG;
1058 case ME_TRIG_TYPE_EXT_DIGITAL:
1059 if ((trigger->iScanStartTrigType != ME_TRIG_TYPE_FOLLOW)
1060 || (trigger->iAcqStartTrigType !=
1061 ME_TRIG_TYPE_EXT_DIGITAL)) {
1062 PERROR("Invalid conv start trigger type specified.\n");
1063 err = ME_ERRNO_INVALID_CONV_START_TRIG_TYPE;
1068 case ME_TRIG_TYPE_EXT_ANALOG:
1069 if ((trigger->iScanStartTrigType != ME_TRIG_TYPE_FOLLOW)
1070 || (trigger->iAcqStartTrigType !=
1071 ME_TRIG_TYPE_EXT_ANALOG)) {
1072 PERROR("Invalid conv start trigger type specified.\n");
1073 err = ME_ERRNO_INVALID_CONV_START_TRIG_TYPE;
1079 PERROR("Invalid conv start trigger type specified.\n");
1080 err = ME_ERRNO_INVALID_CONV_START_TRIG_TYPE;
1086 * Aceptable settings:
1087 * iScanStopTrigType : iAcqStopTrigType
1089 * ME_TRIG_TYPE_NONE : ME_TRIG_TYPE_NONE -> infinite count with manual stop
1090 * ME_TRIG_TYPE_NONE : ME_TRIG_TYPE_COUNT -> stop after getting iScanStopCount list of values (iScanStopCount * count)
1091 * ME_TRIG_TYPE_COUNT : ME_TRIG_TYPE_FOLLOW -> stop after getting iAcqStopCount values (it can stops in midle of the list)
1093 switch (trigger->iScanStopTrigType) {
1095 case ME_TRIG_TYPE_NONE:
1098 case ME_TRIG_TYPE_COUNT:
1099 if (trigger->iScanStopCount <= 0) {
1100 PERROR("Invalid scan stop argument specified.\n");
1101 err = ME_ERRNO_INVALID_SCAN_STOP_ARG;
1107 PERROR("Invalid scan stop trigger type specified.\n");
1108 err = ME_ERRNO_INVALID_SCAN_STOP_TRIG_TYPE;
1113 switch (trigger->iAcqStopTrigType) {
1115 case ME_TRIG_TYPE_NONE:
1116 if (trigger->iScanStopTrigType != ME_TRIG_TYPE_NONE) {
1117 PERROR("Invalid acq stop trigger type specified.\n");
1118 err = ME_ERRNO_INVALID_ACQ_STOP_TRIG_TYPE;
1123 case ME_TRIG_TYPE_FOLLOW:
1124 if (trigger->iScanStopTrigType != ME_TRIG_TYPE_COUNT) {
1125 PERROR("Invalid acq stop trigger type specified.\n");
1126 err = ME_ERRNO_INVALID_ACQ_STOP_TRIG_TYPE;
1131 case ME_TRIG_TYPE_COUNT:
1132 if (trigger->iScanStopTrigType != ME_TRIG_TYPE_NONE) {
1133 PERROR("Invalid acq stop trigger type specified.\n");
1134 err = ME_ERRNO_INVALID_ACQ_STOP_TRIG_TYPE;
1138 if (trigger->iAcqStopCount <= 0) {
1140 ("Invalid acquisition or scan stop argument specified.\n");
1141 err = ME_ERRNO_INVALID_ACQ_STOP_ARG;
1147 PERROR("Invalid acq stop trigger type specified.\n");
1148 err = ME_ERRNO_INVALID_ACQ_STOP_TRIG_TYPE;
1153 if ((count <= 0) || (count > ME4600_AI_LIST_COUNT)) {
1154 PERROR("Invalid channel list count specified.\n");
1155 err = ME_ERRNO_INVALID_CONFIG_LIST_COUNT;
1158 ///This is general limitation
1159 // if (fifo_irq_threshold < 0 || fifo_irq_threshold >= ME4600_AI_CIRC_BUF_COUNT)
1160 ///This is limitation from Windows. I use it for compatibility.
1161 if (fifo_irq_threshold < 0
1162 || fifo_irq_threshold >= ME4600_AI_FIFO_COUNT) {
1163 PERROR("Invalid fifo irq threshold specified.\n");
1164 err = ME_ERRNO_INVALID_FIFO_IRQ_THRESHOLD;
1168 if ((config_list[0].iRef == ME_REF_AI_DIFFERENTIAL)
1169 && (instance->channels == 16)) {
1171 ("Differential reference is not available on this subdevice.\n");
1172 err = ME_ERRNO_INVALID_REF;
1176 if (flags & ME_IO_STREAM_CONFIG_SAMPLE_AND_HOLD) {
1177 if (!instance->sh) {
1179 ("Sample and hold is not available for this board.\n");
1180 err = ME_ERRNO_INVALID_FLAGS;
1183 if (config_list[0].iRef == ME_REF_AI_DIFFERENTIAL) {
1185 ("Sample and hold is not available in differential mode.\n");
1186 err = ME_ERRNO_INVALID_FLAGS;
1191 for (i = 0; i < count; i++) {
1192 if ((config_list[i].iStreamConfig < 0)
1193 || (config_list[i].iStreamConfig >= instance->ranges_len)) {
1194 PERROR("Invalid stream config specified.\n");
1195 err = ME_ERRNO_INVALID_STREAM_CONFIG;
1199 if ((config_list[i].iRef != ME_REF_AI_GROUND)
1200 && (config_list[i].iRef != ME_REF_AI_DIFFERENTIAL)) {
1201 PERROR("Invalid references in the list. Ref=0x%x\n",
1202 config_list[i].iRef);
1203 err = ME_ERRNO_INVALID_REF;
1207 if (config_list[i].iStreamConfig % 2) { // StreamConfig: 1 or 3
1208 if (config_list[i].iRef == ME_REF_AI_DIFFERENTIAL) {
1210 ("Only bipolar modes support differential measurement.\n");
1211 err = ME_ERRNO_INVALID_REF;
1216 if (config_list[i].iRef != config_list[0].iRef) {
1218 ("Not all references in the configuration list are equal. Ref[0]=0x%x Ref[%d]=0x%x\n",
1219 config_list[0].iRef, i, config_list[i].iRef);
1220 err = ME_ERRNO_INVALID_REF;
1224 if ((config_list[i].iRef == ME_REF_AI_DIFFERENTIAL)
1225 && (config_list[i].iChannel >= 16)) {
1226 PERROR("Channel not available in differential mode.\n");
1227 err = ME_ERRNO_INVALID_CHANNEL;
1231 if ((config_list[i].iChannel < 0)
1232 || (config_list[i].iChannel >= instance->channels)) {
1233 PERROR("Invalid channel number specified.\n");
1234 err = ME_ERRNO_INVALID_CHANNEL;
1239 // Check settings - end
1241 //Cancel control task
1242 PDEBUG("Cancel control task.\n");
1243 instance->ai_control_task_flag = 0;
1244 cancel_delayed_work(&instance->ai_control_task);
1246 // Work around from Keith Hartley - begin
1247 if (trigger->iScanStartTrigType == ME_TRIG_TYPE_TIMER) {
1249 // The hardware does not work properly with a non-zero scan time
1250 // if there is only ONE channel in the channel list. In this case
1251 // we must set the scan time to zero and use the channel time.
1253 conv_ticks = scan_ticks;
1254 trigger->iScanStartTrigType = ME_TRIG_TYPE_FOLLOW;
1255 } else if (scan_ticks == count * conv_ticks) {
1256 // Another hardware problem. If the number of scan ticks is
1257 // exactly equal to the number of channel ticks multiplied by
1258 // the number of channels then the sampling rate is reduced
1260 trigger->iScanStartTrigType = ME_TRIG_TYPE_FOLLOW;
1263 // Work around from Keith Hartley - end
1265 spin_lock_irqsave(&instance->subdevice_lock, cpu_flags);
1267 if (inl(instance->status_reg) & ME4600_AI_STATUS_BIT_FSM) {
1268 PERROR("Subdevice is busy.\n");
1269 spin_unlock_irqrestore(&instance->subdevice_lock, cpu_flags);
1271 return ME_ERRNO_SUBDEVICE_BUSY;
1274 instance->status = ai_status_none;
1275 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
1276 // Stop all actions. Block all interrupts. Clear (disable) FIFOs.
1278 ME4600_AI_CTRL_BIT_LE_IRQ_RESET | ME4600_AI_CTRL_BIT_HF_IRQ_RESET |
1279 ME4600_AI_CTRL_BIT_SC_IRQ_RESET;
1281 tmp = inl(instance->ctrl_reg);
1282 // Preserve EXT IRQ and OFFSET settings. Clean other bits.
1284 (ME4600_AI_CTRL_BIT_EX_IRQ | ME4600_AI_CTRL_BIT_EX_IRQ_RESET |
1285 ME4600_AI_CTRL_BIT_FULLSCALE | ME4600_AI_CTRL_BIT_OFFSET);
1287 // Send it to register.
1288 outl(tmp | ctrl, instance->ctrl_reg);
1289 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
1290 instance->ctrl_reg - instance->reg_base, tmp | ctrl);
1292 // Enable channel fifo -> data fifo in stream_start().
1293 ctrl |= ME4600_AI_CTRL_BIT_CHANNEL_FIFO;
1294 outl(tmp | ctrl, instance->ctrl_reg);
1295 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
1296 instance->ctrl_reg - instance->reg_base, tmp | ctrl);
1297 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
1299 // Write the channel list
1300 for (i = 0; i < count; i++) {
1301 entry = config_list[i].iChannel;
1303 switch (config_list[i].iStreamConfig) {
1304 case 0: //BIPOLAR 10V
1306 // ME4600_AI_LIST_RANGE_BIPOLAR_10 = 0x0000
1307 // 'entry |= ME4600_AI_LIST_RANGE_BIPOLAR_10' <== Do nothing. Removed.
1308 entry |= ME4600_AI_LIST_RANGE_BIPOLAR_10;
1311 case 1: //UNIPOLAR 10V
1312 entry |= ME4600_AI_LIST_RANGE_UNIPOLAR_10;
1314 case 2: //BIPOLAR 2.5V
1315 entry |= ME4600_AI_LIST_RANGE_BIPOLAR_2_5;
1317 case 3: //UNIPOLAR 2.5V
1318 entry |= ME4600_AI_LIST_RANGE_UNIPOLAR_2_5;
1321 PERROR_CRITICAL("UNCHECK ERROR in config_list!\n");
1323 ("WRONG range\nPosition:%d Range:0x%04X\n", i,
1324 config_list[i].iStreamConfig);
1329 switch (config_list[i].iRef) {
1330 case ME_REF_AI_GROUND: //SINGLE ENDED
1332 // ME4600_AI_LIST_INPUT_SINGLE_ENDED = 0x0000
1333 // 'entry |= ME4600_AI_LIST_INPUT_SINGLE_ENDED' ==> Do nothing. Removed.
1334 entry |= ME4600_AI_LIST_INPUT_SINGLE_ENDED;
1336 case ME_REF_AI_DIFFERENTIAL: //DIFFERENTIAL
1337 entry |= ME4600_AI_LIST_INPUT_DIFFERENTIAL;
1340 PERROR_CRITICAL("UNCHECK ERROR in config_list!\n");
1342 ("WRONG reference\nPosition:%d Reference:0x%04X\n",
1343 i, config_list[i].iRef);
1348 //Add last entry flag
1349 if (i == (count - 1)) {
1350 entry |= ME4600_AI_LIST_LAST_ENTRY;
1353 outl(entry, instance->channel_list_reg);
1354 PDEBUG_REG("channel_list_reg outl(0x%lX+0x%lX)=0x%x\n",
1356 instance->channel_list_reg - instance->reg_base,
1360 // Set triggering registers
1362 outl(acq_ticks, instance->chan_pre_timer_reg);
1363 PDEBUG_REG("chan_pre_timer_reg outl(0x%lX+0x%lX)=0x%llX\n",
1365 instance->chan_pre_timer_reg - instance->reg_base,
1367 outl(acq_ticks, instance->scan_pre_timer_low_reg);
1368 PDEBUG_REG("scan_pre_timer_low_reg outl(0x%lX+0x%lX)=0x%llX\n",
1370 instance->scan_pre_timer_low_reg - instance->reg_base,
1371 acq_ticks & 0xFFFFFFFF);
1372 outl((acq_ticks >> 32), instance->scan_pre_timer_high_reg);
1373 PDEBUG_REG("scan_pre_timer_high_reg outl(0x%lX+0x%lX)=0x%llX\n",
1375 instance->scan_pre_timer_high_reg - instance->reg_base,
1376 (acq_ticks >> 32) & 0xFFFFFFFF);
1379 switch (trigger->iAcqStartTrigType) {
1381 case ME_TRIG_TYPE_SW:
1386 case ME_TRIG_TYPE_EXT_ANALOG:
1387 ctrl |= ME4600_AI_CTRL_BIT_EX_TRIG_ANALOG;
1388 case ME_TRIG_TYPE_EXT_DIGITAL:
1389 ctrl |= ME4600_AI_CTRL_BIT_EX_TRIG;
1391 // External trigger needs edge's definition
1392 switch (trigger->iAcqStartTrigEdge) {
1393 case ME_TRIG_EDGE_RISING:
1397 case ME_TRIG_EDGE_FALLING:
1398 ctrl |= ME4600_AI_CTRL_BIT_EX_TRIG_FALLING;
1401 case ME_TRIG_EDGE_ANY:
1403 ME4600_AI_CTRL_BIT_EX_TRIG_FALLING |
1404 ME4600_AI_CTRL_BIT_EX_TRIG_BOTH;
1409 ("UNCHECK TRIGGER EDGE in triggers structure!\n");
1411 ("WRONG acquisition start trigger:0x%04X.\n",
1412 trigger->iAcqStartTrigEdge);
1413 err = ME_ERRNO_INVALID_ACQ_START_TRIG_EDGE;
1420 PERROR_CRITICAL("UNCHECK TRIGGER in triggers structure!\n");
1421 PERROR_CRITICAL("WRONG acquisition start trigger:0x%04X.\n",
1422 trigger->iAcqStartTrigType);
1423 err = ME_ERRNO_INVALID_ACQ_START_TRIG_TYPE;
1428 switch (trigger->iScanStartTrigType) {
1429 case ME_TRIG_TYPE_TIMER:
1431 outl(scan_ticks, instance->scan_timer_low_reg);
1432 PDEBUG_REG("scan_timer_low_reg outl(0x%lX+0x%lX)=0x%llX\n",
1434 instance->scan_timer_low_reg - instance->reg_base,
1435 scan_ticks & 0xFFFFFFFF);
1436 outl((scan_ticks >> 32), instance->scan_timer_high_reg);
1437 PDEBUG_REG("scan_timer_high_reg outl(0x%lX+0x%lX)=0x%llX\n",
1439 instance->scan_timer_high_reg - instance->reg_base,
1440 (scan_ticks >> 32) & 0xFFFFFFFF);
1442 if (trigger->iAcqStartTrigType == ME_TRIG_TYPE_SW) {
1443 ctrl |= ME4600_AI_CTRL_BIT_MODE_0;
1445 ctrl |= ME4600_AI_CTRL_BIT_MODE_1;
1449 case ME_TRIG_TYPE_EXT_DIGITAL:
1450 case ME_TRIG_TYPE_EXT_ANALOG:
1451 outl(0, instance->scan_timer_low_reg);
1452 PDEBUG_REG("scan_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
1454 instance->scan_timer_low_reg - instance->reg_base,
1456 outl(0, instance->scan_timer_high_reg);
1457 PDEBUG_REG("scan_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
1459 instance->scan_timer_high_reg - instance->reg_base,
1461 ctrl |= ME4600_AI_CTRL_BIT_MODE_2;
1464 case ME_TRIG_TYPE_FOLLOW:
1465 outl(0, instance->scan_timer_low_reg);
1466 PDEBUG_REG("scan_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
1468 instance->scan_timer_low_reg - instance->reg_base,
1470 outl(0, instance->scan_timer_high_reg);
1471 PDEBUG_REG("scan_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
1473 instance->scan_timer_high_reg - instance->reg_base,
1476 if (trigger->iAcqStartTrigType == ME_TRIG_TYPE_SW) {
1477 ctrl |= ME4600_AI_CTRL_BIT_MODE_0;
1479 ctrl |= ME4600_AI_CTRL_BIT_MODE_1;
1484 PERROR_CRITICAL("UNCHECK TRIGGER in triggers structure!\n");
1485 PERROR_CRITICAL("WRONG scan start trigger:0x%04X.\n",
1486 trigger->iScanStartTrigType);
1487 err = ME_ERRNO_INVALID_SCAN_START_TRIG_TYPE;
1492 switch (trigger->iConvStartTrigType) {
1494 case ME_TRIG_TYPE_TIMER:
1496 outl(conv_ticks, instance->chan_timer_reg);
1497 PDEBUG_REG("chan_timer_reg outl(0x%lX+0x%lX)=0x%llX\n",
1499 instance->chan_timer_reg - instance->reg_base,
1503 case ME_TRIG_TYPE_EXT_DIGITAL:
1504 case ME_TRIG_TYPE_EXT_ANALOG:
1505 outl(0, instance->chan_timer_reg);
1506 PDEBUG_REG("chan_timer_reg outl(0x%lX+0x%lX)=0x%x\n",
1508 instance->chan_timer_reg - instance->reg_base, 0);
1509 ctrl |= ME4600_AI_CTRL_BIT_MODE_0 | ME4600_AI_CTRL_BIT_MODE_1;
1513 PERROR_CRITICAL("UNCHECK TRIGGER in triggers structure!\n");
1514 PERROR_CRITICAL("WRONG conv start trigger:0x%04X.\n",
1515 trigger->iConvStartTrigType);
1516 err = ME_ERRNO_INVALID_CONV_START_TRIG_TYPE;
1522 //Sample & Hold feature
1523 if (flags & ME_IO_STREAM_CONFIG_SAMPLE_AND_HOLD) {
1525 ctrl |= ME4600_AI_CTRL_BIT_SAMPLE_HOLD;
1527 PERROR_CRITICAL("UNCHECK S&H feature!\n");
1528 err = ME_ERRNO_INVALID_FLAGS;
1532 //Enable IRQs sources but leave latches blocked.
1533 ctrl |= (ME4600_AI_CTRL_BIT_HF_IRQ | ME4600_AI_CTRL_BIT_SC_IRQ | ME4600_AI_CTRL_BIT_LE_IRQ); //The last IRQ source (ME4600_AI_CTRL_BIT_LE_IRQ) is unused!
1535 //Everything is good. Finalize
1536 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
1537 tmp = inl(instance->ctrl_reg);
1539 //Preserve EXT IRQ and OFFSET settings. Clean other bits.
1541 (ME4600_AI_CTRL_BIT_EX_IRQ | ME4600_AI_CTRL_BIT_EX_IRQ_RESET |
1542 ME4600_AI_CTRL_BIT_FULLSCALE | ME4600_AI_CTRL_BIT_OFFSET);
1544 // write the control word
1545 outl(ctrl | tmp, instance->ctrl_reg);
1546 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
1547 instance->ctrl_reg - instance->reg_base, ctrl | tmp);
1548 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
1550 //Set the global parameters end exit.
1551 instance->chan_list_len = count;
1552 instance->fifo_irq_threshold = fifo_irq_threshold;
1554 if (trigger->iAcqStopTrigType == ME_TRIG_TYPE_COUNT) {
1556 (unsigned long long)trigger->iAcqStopCount *
1557 (unsigned long long)count;
1558 if (data_required > UINT_MAX)
1559 data_required = UINT_MAX;
1560 instance->data_required = (unsigned int)data_required;
1561 } else if (trigger->iScanStopTrigType == ME_TRIG_TYPE_COUNT)
1562 instance->data_required =
1563 (unsigned long long)trigger->iScanStopCount;
1565 instance->data_required = 0;
1567 // Mark subdevice as configured to work in stream mode.
1568 instance->status = ai_status_stream_configured;
1570 // Deinit single config. Set all entries to NOT_CONFIGURED.
1571 for (i = 0; i < instance->channels; i++) {
1572 instance->single_config[i].status =
1573 ME_SINGLE_CHANNEL_NOT_CONFIGURED;
1576 VERIFY_ERROR: // Error in code. Wrong setting check. This should never ever happend!
1577 spin_unlock_irqrestore(&instance->subdevice_lock, cpu_flags);
1578 ERROR: // Error in settings.
1584 static int me4600_ai_io_stream_new_values(me_subdevice_t *subdevice,
1586 int time_out, int *count, int flags)
1588 me4600_ai_subdevice_t *instance;
1589 int err = ME_ERRNO_SUCCESS;
1594 PDEBUG("executed. idx=0\n");
1597 PERROR("Invalid flag specified.\n");
1598 return ME_ERRNO_INVALID_FLAGS;
1602 PERROR("Invalid time_out specified.\n");
1603 return ME_ERRNO_INVALID_TIMEOUT;
1607 t = (time_out * HZ) / 1000;
1611 } else { // Max time.
1615 instance = (me4600_ai_subdevice_t *) subdevice;
1622 // Only runing device can generate break.
1623 head = instance->circ_buf.head;
1624 wait_event_interruptible_timeout(instance->wait_queue,
1626 instance->circ_buf.head)
1628 ((instance->status <=
1629 ai_status_stream_run_wait)
1630 && (instance->status >=
1631 ai_status_stream_end_wait))),
1634 if (head != instance->circ_buf.head) { // New data in buffer.
1636 } else if (instance->status == ai_status_stream_end) { // End of work.
1638 } else if (instance->status == ai_status_stream_fifo_error) {
1639 err = ME_ERRNO_FIFO_BUFFER_OVERFLOW;
1641 } else if (instance->status == ai_status_stream_buffer_error) {
1642 err = ME_ERRNO_RING_BUFFER_OVERFLOW;
1644 } else if (instance->status == ai_status_stream_error) {
1645 err = ME_ERRNO_INTERNAL;
1647 } else if ((jiffies - j) >= t) {
1648 PERROR("Wait on values timed out.\n");
1649 err = ME_ERRNO_TIMEOUT;
1651 } else if (signal_pending(current)) {
1652 PERROR("Wait on values interrupted from signal.\n");
1653 err = ME_ERRNO_SIGNAL;
1660 *count = me_circ_buf_values(&instance->circ_buf);
1667 static inline int me4600_ai_io_stream_read_get_value(me4600_ai_subdevice_t *
1668 instance, int *values,
1676 ///Checking how many datas can be copied.
1677 n = me_circ_buf_values(&instance->circ_buf);
1684 if (flags & ME_IO_STREAM_READ_FRAMES) {
1685 if (n < instance->chan_list_len) //Not enough data!
1687 n -= n % instance->chan_list_len;
1690 for (i = 0; i < n; i++) {
1691 value = *(instance->circ_buf.buf + instance->circ_buf.tail);
1692 if (put_user(value, values + i)) {
1693 PERROR("Cannot copy new values to user.\n");
1694 return -ME_ERRNO_INTERNAL;
1696 instance->circ_buf.tail++;
1697 instance->circ_buf.tail &= instance->circ_buf.mask;
1702 static int me4600_ai_io_stream_read(me_subdevice_t *subdevice,
1705 int *values, int *count, int flags)
1707 me4600_ai_subdevice_t *instance;
1708 int err = ME_ERRNO_SUCCESS;
1714 PDEBUG("executed. idx=0\n");
1716 if (flags & ~ME_IO_STREAM_READ_FRAMES) {
1717 PERROR("Invalid flag specified.\n");
1718 return ME_ERRNO_INVALID_FLAGS;
1721 if (!values || !count) {
1722 PERROR("Request has invalid pointer.\n");
1723 return ME_ERRNO_INVALID_POINTER;
1727 PERROR("Request has invalid value's counter.\n");
1728 return ME_ERRNO_INVALID_VALUE_COUNT;
1731 if ((read_mode != ME_READ_MODE_BLOCKING)
1732 && (read_mode != ME_READ_MODE_NONBLOCKING)) {
1733 PERROR("Invalid read mode specified.\n");
1734 return ME_ERRNO_INVALID_READ_MODE;
1737 if (c == 0) { //You get what you want! Nothing more or less.
1738 return ME_ERRNO_SUCCESS;
1741 instance = (me4600_ai_subdevice_t *) subdevice;
1744 //Check if subdevice is configured.
1745 if (instance->chan_list_len <= 0) {
1746 PERROR("Subdevice wasn't configured.\n");
1748 return ME_ERRNO_PREVIOUS_CONFIG;
1751 if (flags & ME_IO_STREAM_READ_FRAMES) {
1752 if (c < instance->chan_list_len) { //Not enough data requested.
1754 ("When using FRAME_READ mode minimal size is defined by channel list.\n");
1756 return ME_ERRNO_INVALID_VALUE_COUNT;
1760 if (c > (ME4600_AI_CIRC_BUF_COUNT - instance->chan_list_len)) { // To return acceptable amount of data when user pass too big value.
1761 min = ME4600_AI_CIRC_BUF_COUNT - instance->chan_list_len;
1764 if (flags & ME_IO_STREAM_READ_FRAMES) {
1765 //Wait for whole list.
1766 if (read_mode == ME_READ_MODE_BLOCKING) {
1767 min = c - (c % instance->chan_list_len);
1770 if (read_mode == ME_READ_MODE_NONBLOCKING) {
1771 min = instance->chan_list_len;
1775 if ((inl(instance->status_reg) & ME4600_AI_STATUS_BIT_FSM)) { //Working
1776 //If blocking mode -> wait for data.
1777 if ((me_circ_buf_values(&instance->circ_buf) < min)
1778 && (read_mode == ME_READ_MODE_BLOCKING)) {
1779 wait_event_interruptible(instance->wait_queue,
1780 ((me_circ_buf_values
1781 (&instance->circ_buf) >= min)
1782 || !(inl(instance->status_reg)
1784 ME4600_AI_STATUS_BIT_FSM)));
1786 if (signal_pending(current)) {
1788 ("Wait on values interrupted from signal.\n");
1789 err = ME_ERRNO_SIGNAL;
1794 ret = me4600_ai_io_stream_read_get_value(instance, values, c, flags);
1798 } else if (ret == 0) {
1800 if (instance->status == ai_status_stream_fifo_error) {
1801 err = ME_ERRNO_FIFO_BUFFER_OVERFLOW;
1802 instance->status = ai_status_stream_end;
1803 } else if (instance->status == ai_status_stream_buffer_error) {
1804 err = ME_ERRNO_RING_BUFFER_OVERFLOW;
1805 instance->status = ai_status_stream_end;
1806 } else if (instance->status == ai_status_stream_end) {
1807 err = ME_ERRNO_SUBDEVICE_NOT_RUNNING;
1808 } else if (instance->status == ai_status_stream_error) {
1809 err = ME_ERRNO_INTERNAL;
1810 } else if (instance->status == ai_status_none) {
1811 PDEBUG("Stream canceled.\n");
1812 err = ME_ERRNO_INTERNAL;
1823 /** @brief Stop aqusation. Preserve FIFOs.
1825 * @param instance The subdevice instance (pointer).
1828 static int ai_stop_immediately(me4600_ai_subdevice_t *instance)
1830 unsigned long cpu_flags = 0;
1831 volatile uint32_t ctrl;
1832 const int timeout = HZ / 10; //100ms
1835 for (i = 0; i <= timeout; i++) {
1836 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
1837 ctrl = inl(instance->ctrl_reg);
1838 ctrl &= ~ME4600_AI_CTRL_BIT_STOP;
1840 (ME4600_AI_CTRL_BIT_IMMEDIATE_STOP |
1841 ME4600_AI_CTRL_BIT_HF_IRQ_RESET |
1842 ME4600_AI_CTRL_BIT_SC_IRQ_RESET);
1843 outl(ctrl, instance->ctrl_reg);
1844 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
1846 instance->ctrl_reg - instance->reg_base, ctrl);
1847 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
1849 if (!(inl(instance->status_reg) & ME4600_AI_STATUS_BIT_FSM)) { // Exit.
1853 PINFO("Wait for stop: %d\n", i + 1);
1855 set_current_state(TASK_INTERRUPTIBLE);
1856 schedule_timeout(1);
1860 PERROR_CRITICAL("FSM IS BUSY!\n");
1861 return ME_ERRNO_INTERNAL;
1864 return ME_ERRNO_SUCCESS;
1867 static int me4600_ai_io_stream_start(me_subdevice_t *subdevice,
1869 int start_mode, int time_out, int flags)
1871 me4600_ai_subdevice_t *instance;
1872 int err = ME_ERRNO_SUCCESS;
1873 unsigned long cpu_flags = 0;
1875 unsigned long delay = 0;
1877 volatile uint32_t tmp;
1879 PDEBUG("executed. idx=0\n");
1881 instance = (me4600_ai_subdevice_t *) subdevice;
1884 PERROR("Invalid flag specified.\n");
1885 return ME_ERRNO_INVALID_FLAGS;
1888 if ((start_mode != ME_START_MODE_BLOCKING)
1889 && (start_mode != ME_START_MODE_NONBLOCKING)) {
1890 PERROR("Invalid start mode specified.\n");
1891 return ME_ERRNO_INVALID_START_MODE;
1895 PERROR("Invalid timeout specified.\n");
1896 return ME_ERRNO_INVALID_TIMEOUT;
1900 delay = (time_out * HZ) / 1000;
1907 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
1909 tmp = inl(instance->ctrl_reg);
1911 if ((tmp & ME4600_AI_STATUS_BIT_FSM)) {
1912 PERROR("Conversion is already running.\n");
1913 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
1914 err = ME_ERRNO_SUBDEVICE_BUSY;
1918 if (instance->chan_list_len == 0) { //Not configured!
1919 PERROR("Subdevice is not configured to work in stream mode!\n");
1920 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
1921 err = ME_ERRNO_PREVIOUS_CONFIG;
1925 if (!(tmp & (ME4600_AI_CTRL_BIT_MODE_0 | ME4600_AI_CTRL_BIT_MODE_1 | ME4600_AI_CTRL_BIT_MODE_2))) { //Mode 0 = single work => no stream config
1926 PERROR("Subdevice is configured to work in single mode.\n");
1927 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
1928 err = ME_ERRNO_PREVIOUS_CONFIG;
1932 tmp |= ME4600_AI_CTRL_BIT_IMMEDIATE_STOP | ME4600_AI_CTRL_BIT_STOP;
1933 outl(tmp, instance->ctrl_reg);
1934 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
1935 instance->ctrl_reg - instance->reg_base, tmp);
1937 //Start datas' FIFO.
1938 tmp |= ME4600_AI_CTRL_BIT_DATA_FIFO;
1940 tmp &= ~(ME4600_AI_CTRL_BIT_IMMEDIATE_STOP | ME4600_AI_CTRL_BIT_STOP);
1941 outl(tmp, instance->ctrl_reg);
1942 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
1943 instance->ctrl_reg - instance->reg_base, tmp);
1944 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
1946 //Cancel control task
1947 PDEBUG("Cancel control task.\n");
1948 instance->ai_control_task_flag = 0;
1949 cancel_delayed_work(&instance->ai_control_task);
1951 //Set the starting values.
1952 instance->ISM.global_read = 0;
1953 instance->ISM.read = 0;
1954 //Clear circular buffer
1955 instance->circ_buf.head = 0;
1956 instance->circ_buf.tail = 0;
1959 ai_data_acquisition_logic(instance);
1961 //Set status to 'wait for start'
1962 instance->status = ai_status_stream_run_wait;
1964 // Set control task's timeout
1965 instance->timeout.delay = delay;
1966 instance->timeout.start_time = jiffies;
1968 //Lets go! Start work
1969 inl(instance->start_reg);
1970 PDEBUG_REG("start_reg inl(0x%lX+0x%lX)\n", instance->reg_base,
1971 instance->start_reg - instance->reg_base);
1973 // Schedule control task
1974 instance->ai_control_task_flag = 1;
1975 queue_delayed_work(instance->me4600_workqueue,
1976 &instance->ai_control_task, 1);
1978 PDEVELOP("Delay:%ld\n", delay);
1980 if (start_mode == ME_START_MODE_BLOCKING) { //Wait for start.
1982 //Only runing process will interrupt this call. Events are signaled when status change. Extra timeout add for safe reason.
1983 wait_event_interruptible_timeout(instance->wait_queue,
1984 (instance->status !=
1985 ai_status_stream_run_wait),
1989 if ((instance->status != ai_status_stream_run)
1990 && (instance->status != ai_status_stream_end)) {
1991 PDEBUG("Starting stream canceled. %d\n",
1993 err = ME_ERRNO_CANCELLED;
1996 if (signal_pending(current)) {
1997 PERROR("Wait on start of state machine interrupted.\n");
1998 instance->status = ai_status_none;
1999 ai_stop_isr(instance);
2000 err = ME_ERRNO_SIGNAL;
2001 } else if ((delay) && ((jiffies - ref) > delay)) {
2002 if (instance->status != ai_status_stream_run) {
2003 if (instance->status == ai_status_stream_end) {
2004 PDEBUG("Timeout reached.\n");
2005 } else if ((jiffies - ref) > delay + 1) {
2007 ("Timeout reached. Not handled by control task!\n");
2008 ai_stop_isr(instance);
2010 ai_status_stream_error;
2013 ("Timeout reached. Signal come but status is strange: %d\n",
2015 ai_stop_isr(instance);
2017 ai_status_stream_error;
2020 instance->ai_control_task_flag = 0;
2021 cancel_delayed_work(&instance->ai_control_task);
2022 err = ME_ERRNO_TIMEOUT;
2027 tmp = inl(instance->ctrl_reg);
2028 PDEBUG_REG("ctrl_reg inl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
2029 instance->ctrl_reg - instance->reg_base, tmp);
2031 PINFO("STATUS_BIT_FSM=%s.\n",
2032 (tmp & ME4600_AI_STATUS_BIT_FSM) ? "on" : "off");
2033 PINFO("CTRL_BIT_HF_IRQ=%s.\n",
2034 (tmp & ME4600_AI_CTRL_BIT_HF_IRQ) ? "enable" : "disable");
2035 PINFO("CTRL_BIT_HF_IRQ_RESET=%s.\n",
2036 (tmp & ME4600_AI_CTRL_BIT_HF_IRQ_RESET) ? "reset" : "work");
2037 PINFO("CTRL_BIT_SC_IRQ=%s.\n",
2038 (tmp & ME4600_AI_CTRL_BIT_SC_IRQ) ? "enable" : "disable");
2039 PINFO("CTRL_BIT_SC_RELOAD=%s.\n",
2040 (tmp & ME4600_AI_CTRL_BIT_SC_RELOAD) ? "on" : "off");
2041 PINFO("CTRL_BIT_SC_IRQ_RESET=%s.\n",
2042 (tmp & ME4600_AI_CTRL_BIT_SC_IRQ_RESET) ? "reset" : "work");
2051 static int me4600_ai_io_stream_status(me_subdevice_t *subdevice,
2054 int *status, int *values, int flags)
2056 me4600_ai_subdevice_t *instance;
2057 int err = ME_ERRNO_SUCCESS;
2059 PDEBUG("executed. idx=0\n");
2061 instance = (me4600_ai_subdevice_t *) subdevice;
2064 PERROR("Invalid flag specified.\n");
2065 return ME_ERRNO_INVALID_FLAGS;
2070 switch (instance->status) {
2071 case ai_status_single_configured:
2072 case ai_status_stream_configured:
2073 case ai_status_stream_end:
2074 case ai_status_stream_fifo_error:
2075 case ai_status_stream_buffer_error:
2076 case ai_status_stream_error:
2077 *status = ME_STATUS_IDLE;
2080 case ai_status_stream_run_wait:
2081 case ai_status_stream_run:
2082 case ai_status_stream_end_wait:
2083 *status = ME_STATUS_BUSY;
2086 case ai_status_none:
2089 (inl(instance->status_reg) & ME4600_AI_STATUS_BIT_FSM) ?
2090 ME_STATUS_BUSY : ME_STATUS_IDLE;
2094 if ((wait == ME_WAIT_IDLE) && (*status == ME_STATUS_BUSY)) {
2095 // Only runing process will interrupt this call. Events are signaled when status change. Extra timeout add for safe reason.
2096 wait_event_interruptible_timeout(instance->wait_queue,
2097 ((instance->status !=
2098 ai_status_stream_run_wait)
2099 && (instance->status !=
2100 ai_status_stream_run)
2101 && (instance->status !=
2102 ai_status_stream_end_wait)),
2105 if (instance->status != ai_status_stream_end) {
2106 PDEBUG("Wait for IDLE canceled. %d\n",
2108 err = ME_ERRNO_CANCELLED;
2111 if (signal_pending(current)) {
2112 PERROR("Wait for IDLE interrupted.\n");
2113 instance->status = ai_status_none;
2114 ai_stop_isr(instance);
2115 err = ME_ERRNO_SIGNAL;
2118 *status = ME_STATUS_IDLE;
2121 *values = me_circ_buf_values(&instance->circ_buf);
2122 PDEBUG("me_circ_buf_values(&instance->circ_buf)=%d.\n", *values);
2129 static int me4600_ai_io_stream_stop(me_subdevice_t *subdevice,
2131 int stop_mode, int flags)
2134 @note Stop is implemented only in blocking mode.
2135 @note Function return when state machine is stoped.
2137 me4600_ai_subdevice_t *instance;
2138 unsigned long cpu_flags;
2142 PDEBUG("executed. idx=0\n");
2145 PERROR("Invalid flag specified.\n");
2146 return ME_ERRNO_INVALID_FLAGS;
2149 if ((stop_mode != ME_STOP_MODE_IMMEDIATE)
2150 && (stop_mode != ME_STOP_MODE_LAST_VALUE)) {
2151 PERROR("Invalid stop mode specified.\n");
2152 return ME_ERRNO_INVALID_STOP_MODE;
2155 instance = (me4600_ai_subdevice_t *) subdevice;
2159 // Mark as stopping. => Software stop.
2160 instance->status = ai_status_stream_end_wait;
2162 if (stop_mode == ME_STOP_MODE_IMMEDIATE) {
2163 ret = ai_stop_immediately(instance);
2166 PERROR("FSM is still busy.\n");
2168 return ME_ERRNO_SUBDEVICE_BUSY;
2170 instance->ai_control_task_flag = 0;
2172 } else if (stop_mode == ME_STOP_MODE_LAST_VALUE) {
2173 // Set stop bit in registry.
2174 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
2175 ctrl = inl(instance->ctrl_reg);
2176 ctrl |= ME4600_AI_CTRL_BIT_STOP;
2177 outl(ctrl, instance->ctrl_reg);
2178 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
2180 instance->ctrl_reg - instance->reg_base, ctrl);
2181 spin_unlock_irqrestore(instance->ctrl_reg_lock, cpu_flags);
2183 // Only runing process will interrupt this call. Events are signaled when status change.
2184 wait_event_interruptible_timeout(instance->wait_queue,
2185 (instance->status !=
2186 ai_status_stream_end_wait),
2189 if (instance->status != ai_status_stream_end) {
2190 PDEBUG("Stopping stream canceled.\n");
2191 ret = ME_ERRNO_CANCELLED;
2194 if (signal_pending(current)) {
2195 PERROR("Stopping stream interrupted.\n");
2196 instance->status = ai_status_none;
2197 ret = ME_ERRNO_SIGNAL;
2200 ai_stop_immediately(instance);
2204 ret = ai_read_data_pooling(instance);
2205 if (ret > 0) { // Everything fine. More datas put to software buffer.
2206 instance->status = ai_status_stream_end;
2207 ret = ME_ERRNO_SUCCESS;
2208 // Signal that we put last data to software buffer.
2209 wake_up_interruptible_all(&instance->wait_queue);
2210 } else if (ret == 0) { // Everything fine. No more datas in FIFO.
2211 instance->status = ai_status_stream_end;
2212 ret = ME_ERRNO_SUCCESS;
2213 } else if (ret == -ME_ERRNO_RING_BUFFER_OVERFLOW) { // Stop is unsuccessful, buffer is overflow.
2214 instance->status = ai_status_stream_buffer_error;
2215 ret = ME_ERRNO_SUCCESS;
2216 } else { // Stop is unsuccessful
2217 instance->status = ai_status_stream_end;
2226 static int me4600_ai_query_range_by_min_max(me_subdevice_t *subdevice,
2229 int *max, int *maxdata, int *range)
2231 me4600_ai_subdevice_t *instance;
2236 PDEBUG("executed. idx=0\n");
2238 instance = (me4600_ai_subdevice_t *) subdevice;
2240 if ((*max - *min) < 0) {
2241 PERROR("Invalid minimum and maximum values specified.\n");
2242 return ME_ERRNO_INVALID_MIN_MAX;
2245 if ((unit == ME_UNIT_VOLT) || (unit == ME_UNIT_ANY)) {
2246 for (i = 0; i < instance->ranges_len; i++) {
2247 if ((instance->ranges[i].min <= *min)
2248 && ((instance->ranges[i].max + 1000) >= *max)) {
2249 if ((instance->ranges[i].max -
2250 instance->ranges[i].min) - (*max - *min) <
2254 (instance->ranges[i].max -
2255 instance->ranges[i].min) - (*max -
2262 PERROR("No matching range found.\n");
2263 return ME_ERRNO_NO_RANGE;
2265 *min = instance->ranges[r].min;
2266 *max = instance->ranges[r].max;
2267 *maxdata = ME4600_AI_MAX_DATA;
2271 PERROR("Invalid physical unit specified.\n");
2272 return ME_ERRNO_INVALID_UNIT;
2275 return ME_ERRNO_SUCCESS;
2278 static int me4600_ai_query_number_ranges(me_subdevice_t *subdevice,
2279 int unit, int *count)
2281 me4600_ai_subdevice_t *instance;
2283 PDEBUG("executed. idx=0\n");
2285 instance = (me4600_ai_subdevice_t *) subdevice;
2287 if ((unit == ME_UNIT_VOLT) || (unit == ME_UNIT_ANY)) {
2288 *count = instance->ranges_len;
2293 return ME_ERRNO_SUCCESS;
2296 static int me4600_ai_query_range_info(me_subdevice_t *subdevice,
2299 int *min, int *max, int *maxdata)
2301 me4600_ai_subdevice_t *instance;
2303 PDEBUG("executed. idx=0\n");
2305 instance = (me4600_ai_subdevice_t *) subdevice;
2307 if ((range < instance->ranges_len) && (range >= 0)) {
2308 *unit = ME_UNIT_VOLT;
2309 *min = instance->ranges[range].min;
2310 *max = instance->ranges[range].max;
2311 *maxdata = ME4600_AI_MAX_DATA;
2313 PERROR("Invalid range number specified.\n");
2314 return ME_ERRNO_INVALID_RANGE;
2317 return ME_ERRNO_SUCCESS;
2320 static int me4600_ai_query_timer(me_subdevice_t *subdevice,
2322 int *base_frequency,
2323 long long *min_ticks, long long *max_ticks)
2325 me4600_ai_subdevice_t *instance;
2327 PDEBUG("executed. idx=0\n");
2329 instance = (me4600_ai_subdevice_t *) subdevice;
2333 case ME_TIMER_ACQ_START:
2334 *base_frequency = ME4600_AI_BASE_FREQUENCY;
2335 *min_ticks = ME4600_AI_MIN_ACQ_TICKS;
2336 *max_ticks = ME4600_AI_MAX_ACQ_TICKS;
2339 case ME_TIMER_SCAN_START:
2340 *base_frequency = ME4600_AI_BASE_FREQUENCY;
2341 *min_ticks = ME4600_AI_MIN_SCAN_TICKS;
2342 *max_ticks = ME4600_AI_MAX_SCAN_TICKS;
2345 case ME_TIMER_CONV_START:
2346 *base_frequency = ME4600_AI_BASE_FREQUENCY;
2347 *min_ticks = ME4600_AI_MIN_CHAN_TICKS;
2348 *max_ticks = ME4600_AI_MAX_CHAN_TICKS;
2352 PERROR("Invalid timer specified.(0x%04x)\n", timer);
2354 return ME_ERRNO_INVALID_TIMER;
2357 return ME_ERRNO_SUCCESS;
2360 static int me4600_ai_query_number_channels(me_subdevice_t *subdevice,
2363 me4600_ai_subdevice_t *instance;
2365 PDEBUG("executed. idx=0\n");
2367 instance = (me4600_ai_subdevice_t *) subdevice;
2368 *number = instance->channels;
2370 return ME_ERRNO_SUCCESS;
2373 static int me4600_ai_query_subdevice_type(me_subdevice_t *subdevice,
2374 int *type, int *subtype)
2376 PDEBUG("executed. idx=0\n");
2379 *subtype = ME_SUBTYPE_STREAMING;
2381 return ME_ERRNO_SUCCESS;
2384 static int me4600_ai_query_subdevice_caps(me_subdevice_t *subdevice, int *caps)
2386 PDEBUG("executed. idx=0\n");
2389 ME_CAPS_AI_TRIG_SYNCHRONOUS | ME_CAPS_AI_FIFO |
2390 ME_CAPS_AI_FIFO_THRESHOLD;
2392 return ME_ERRNO_SUCCESS;
2395 static int me4600_ai_query_subdevice_caps_args(struct me_subdevice *subdevice,
2396 int cap, int *args, int count)
2398 me4600_ai_subdevice_t *instance;
2399 int err = ME_ERRNO_SUCCESS;
2401 instance = (me4600_ai_subdevice_t *) subdevice;
2403 PDEBUG("executed. idx=0\n");
2406 PERROR("Invalid capability argument count.\n");
2407 return ME_ERRNO_INVALID_CAP_ARG_COUNT;
2411 case ME_CAP_AI_FIFO_SIZE:
2412 args[0] = ME4600_AI_FIFO_COUNT;
2415 case ME_CAP_AI_BUFFER_SIZE:
2417 (instance->circ_buf.buf) ? ME4600_AI_CIRC_BUF_COUNT : 0;
2421 PERROR("Invalid capability.\n");
2422 err = ME_ERRNO_INVALID_CAP;
2429 void ai_limited_isr(me4600_ai_subdevice_t *instance, const uint32_t irq_status,
2430 const uint32_t ctrl_status)
2434 if (!instance->fifo_irq_threshold) { //No threshold provided. SC ends work. HF need reseting.
2435 if (irq_status & ME4600_IRQ_STATUS_BIT_SC) {
2436 if (ai_read_data(instance, instance->ISM.next) != instance->ISM.next) { //ERROR!
2438 ("Limited amounts aqusition with TH=0: Circular buffer full!\n");
2440 ai_status_stream_buffer_error;
2442 instance->status = ai_status_stream_end;
2445 ai_stop_isr(instance);
2446 } else if (irq_status & ME4600_IRQ_STATUS_BIT_AI_HF) {
2447 instance->ISM.global_read += ME4600_AI_FIFO_HALF;
2449 if (ai_read_data(instance, ME4600_AI_FIFO_HALF) != ME4600_AI_FIFO_HALF) { //ERROR!
2451 ("Limited amounts aqusition with TH = 0: Circular buffer full!\n");
2453 ai_stop_isr(instance);
2455 ai_status_stream_buffer_error;
2458 ai_limited_ISM(instance, irq_status);
2462 wake_up_interruptible_all(&instance->wait_queue);
2463 } else //if(instance->fifo_irq_threshold)
2465 if (irq_status & ME4600_IRQ_STATUS_BIT_SC) {
2466 instance->ISM.read = 0;
2467 if ((instance->fifo_irq_threshold < ME4600_AI_FIFO_HALF)
2468 && (!(ctrl_status & ME4600_AI_STATUS_BIT_HF_DATA)))
2471 ME4600_AI_FIFO_HALF -
2472 (ME4600_AI_FIFO_HALF %
2473 instance->fifo_irq_threshold);
2475 ("Limited amounts aqusition with TH != 0: Not fast enough data aqusition! correction=%d\n",
2478 to_read = instance->ISM.next;
2480 instance->ISM.global_read += to_read;
2482 ai_reschedule_SC(instance);
2484 if (ai_read_data(instance, to_read) != to_read) { //ERROR!
2486 ("Limited amounts aqusition with TH != 0: Circular buffer full!\n");
2488 ai_stop_isr(instance);
2490 ai_status_stream_buffer_error;
2493 ai_limited_ISM(instance, irq_status);
2497 wake_up_interruptible_all(&instance->wait_queue);
2498 } else if (irq_status & ME4600_IRQ_STATUS_BIT_AI_HF) {
2499 instance->ISM.read += ME4600_AI_FIFO_HALF;
2500 instance->ISM.global_read += ME4600_AI_FIFO_HALF;
2502 if (ai_read_data(instance, ME4600_AI_FIFO_HALF) != ME4600_AI_FIFO_HALF) { //ERROR!
2504 ("Limited amounts aqusition with TH != 0: Circular buffer full!\n");
2505 ai_stop_isr(instance);
2508 ai_status_stream_buffer_error;
2510 wake_up_interruptible_all(&instance->
2514 ai_limited_ISM(instance, irq_status);
2518 if (instance->ISM.global_read >= instance->data_required) { //End of work. Next paranoid pice of code: '>=' instead od '==' only to be sure.
2519 ai_stop_isr(instance);
2520 if (instance->status < ai_status_stream_end) {
2521 instance->status = ai_status_stream_end;
2523 #ifdef MEDEBUG_ERROR
2524 if (instance->ISM.global_read > instance->data_required) { //This is security check case. This should never ever happend!
2526 ("Limited amounts aqusition: Read more data than necessary! data_required=%d < read=%d\n",
2527 instance->data_required,
2528 instance->ISM.global_read);
2529 //Signal error (warning??).
2530 instance->status = ai_status_stream_error;
2537 void ai_infinite_isr(me4600_ai_subdevice_t *instance,
2538 const uint32_t irq_status, const uint32_t ctrl_status)
2542 if (irq_status & ME4600_IRQ_STATUS_BIT_SC) { //next chunck of data -> read fifo
2543 //Set new state in ISM.
2544 if ((instance->fifo_irq_threshold < ME4600_AI_FIFO_HALF) && (!(ctrl_status & ME4600_AI_STATUS_BIT_HF_DATA))) { //There is more data than we ecpected. Propably we aren't fast enough. Read as many as possible.
2545 if (instance->fifo_irq_threshold) {
2547 ME4600_AI_FIFO_HALF -
2548 (ME4600_AI_FIFO_HALF %
2549 instance->fifo_irq_threshold);
2550 if (to_read > instance->fifo_irq_threshold) {
2552 ("Infinite aqusition: Not fast enough data aqusition! TH != 0: correction=%d\n",
2555 } else { //No threshold specified.
2556 to_read = ME4600_AI_FIFO_HALF;
2559 to_read = instance->ISM.next;
2562 instance->ISM.read += to_read;
2565 if (ai_read_data(instance, to_read) != to_read) { //ERROR!
2566 PERROR("Infinite aqusition: Circular buffer full!\n");
2567 ai_stop_isr(instance);
2568 instance->status = ai_status_stream_buffer_error;
2570 ai_infinite_ISM(instance);
2571 instance->ISM.global_read += instance->ISM.read;
2572 instance->ISM.read = 0;
2575 //Signal data to user
2576 wake_up_interruptible_all(&instance->wait_queue);
2577 } else if (irq_status & ME4600_IRQ_STATUS_BIT_AI_HF) { //fifo is half full -> read fifo Large blocks only!
2578 instance->ISM.read += ME4600_AI_FIFO_HALF;
2580 if (ai_read_data(instance, ME4600_AI_FIFO_HALF) != ME4600_AI_FIFO_HALF) { //ERROR!
2581 PERROR("Infinite aqusition: Circular buffer full!\n");
2582 ai_stop_isr(instance);
2583 instance->status = ai_status_stream_buffer_error;
2586 wake_up_interruptible_all(&instance->wait_queue);
2588 ai_infinite_ISM(instance);
2593 static irqreturn_t me4600_ai_isr(int irq, void *dev_id)
2594 { /// @note This is time critical function!
2595 uint32_t irq_status;
2596 uint32_t ctrl_status;
2597 me4600_ai_subdevice_t *instance = dev_id;
2600 PDEBUG("executed. idx=0\n");
2602 if (irq != instance->irq) {
2603 PERROR("Incorrect interrupt num: %d.\n", irq);
2607 irq_status = inl(instance->irq_status_reg);
2610 (ME4600_IRQ_STATUS_BIT_AI_HF | ME4600_IRQ_STATUS_BIT_SC))) {
2612 if ((irq_status & (ME4600_IRQ_STATUS_BIT_AI_HF | ME4600_IRQ_STATUS_BIT_SC | ME4600_IRQ_STATUS_BIT_LE)) == ME4600_IRQ_STATUS_BIT_LE) { //This is security check case. LE is unused. This should never ever happend.
2614 ("%ld Shared interrupt. %s(): irq_status_reg=LE_IRQ\n",
2618 ("%ld Shared interrupt. %s(): irq_status_reg=0x%04X\n",
2619 jiffies, __func__, irq_status);
2625 if (!instance->circ_buf.buf) { //Security check.
2626 PERROR_CRITICAL("CIRCULAR BUFFER NOT EXISTS!\n");
2627 ai_stop_isr(instance);
2630 //Get the status register.
2631 ctrl_status = inl(instance->status_reg);
2634 if (irq_status & ME4600_IRQ_STATUS_BIT_AI_HF)
2635 PINFO("HF interrupt active\n");
2636 if (irq_status & ME4600_IRQ_STATUS_BIT_SC)
2637 PINFO("SC interrupt active\n");
2638 if (irq_status & ME4600_IRQ_STATUS_BIT_LE)
2639 PINFO("LE interrupt active\n");
2642 //This is safety check!
2643 if ((irq_status & ME4600_IRQ_STATUS_BIT_AI_HF)
2644 && (ctrl_status & ME4600_AI_STATUS_BIT_HF_DATA)) {
2645 PDEBUG("HF interrupt active but FIFO under half\n");
2646 //Reset HF interrupt latch.
2647 spin_lock(instance->ctrl_reg_lock);
2648 outl(ctrl_status | ME4600_AI_CTRL_BIT_HF_IRQ_RESET,
2649 instance->ctrl_reg);
2650 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
2652 instance->ctrl_reg - instance->reg_base,
2654 outl(ctrl_status, instance->ctrl_reg);
2655 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
2657 instance->ctrl_reg - instance->reg_base,
2659 spin_unlock(instance->ctrl_reg_lock);
2663 PINFO("STATUS_BIT_FSM=%s.\n",
2664 (ctrl_status & ME4600_AI_STATUS_BIT_FSM) ? "on" : "off");
2666 PINFO("STATUS_BIT_EF_CHANNEL=%s.\n",
2667 (ctrl_status & ME4600_AI_STATUS_BIT_EF_CHANNEL) ? "not empty" :
2669 PINFO("STATUS_BIT_HF_CHANNEL=%s.\n",
2670 (ctrl_status & ME4600_AI_STATUS_BIT_HF_CHANNEL) ? " < HF" :
2672 PINFO("STATUS_BIT_FF_CHANNEL=%s.\n",
2673 (ctrl_status & ME4600_AI_STATUS_BIT_FF_CHANNEL) ? "not full" :
2676 PINFO("STATUS_BIT_EF_DATA=%s.\n",
2677 (ctrl_status & ME4600_AI_STATUS_BIT_EF_DATA) ? "not empty" :
2679 PINFO("STATUS_BIT_HF_DATA=%s.\n",
2680 (ctrl_status & ME4600_AI_STATUS_BIT_HF_DATA) ? " < HF" : " > HF");
2681 PINFO("STATUS_BIT_FF_DATA=%s.\n",
2682 (ctrl_status & ME4600_AI_STATUS_BIT_FF_DATA) ? "not full" :
2685 PINFO("CTRL_BIT_HF_IRQ=%s.\n",
2686 (ctrl_status & ME4600_AI_CTRL_BIT_HF_IRQ) ? "enable" : "disable");
2687 PINFO("CTRL_BIT_HF_IRQ_RESET=%s.\n",
2688 (ctrl_status & ME4600_AI_CTRL_BIT_HF_IRQ_RESET) ? "reset" :
2690 PINFO("CTRL_BIT_SC_IRQ=%s.\n",
2691 (ctrl_status & ME4600_AI_CTRL_BIT_SC_IRQ) ? "enable" : "disable");
2692 PINFO("CTRL_BIT_SC_RELOAD=%s.\n",
2693 (ctrl_status & ME4600_AI_CTRL_BIT_SC_RELOAD) ? "on" : "off");
2694 PINFO("CTRL_BIT_SC_IRQ_RESET=%s.\n",
2695 (ctrl_status & ME4600_AI_CTRL_BIT_SC_IRQ_RESET) ? "reset" :
2699 //Look for overflow error.
2700 if (!(ctrl_status & ME4600_AI_STATUS_BIT_FF_DATA)) {
2701 //FIFO is full. Read datas and reset all settings.
2702 PERROR("FIFO overflow.\n");
2703 ai_read_data(instance, ME4600_AI_FIFO_COUNT);
2704 ai_stop_isr(instance);
2706 instance->status = ai_status_stream_fifo_error;
2708 wake_up_interruptible_all(&instance->wait_queue);
2713 if (!instance->data_required) { //This is infinite aqusition.
2714 #ifdef MEDEBUG_ERROR
2716 (ME4600_IRQ_STATUS_BIT_AI_HF | ME4600_IRQ_STATUS_BIT_SC))
2718 (ME4600_IRQ_STATUS_BIT_AI_HF | ME4600_IRQ_STATUS_BIT_SC)) {
2719 ///In infinite mode only one interrupt source should be reported!
2721 ("Error in ISM! Infinite aqusition: HF and SC interrupts active! threshold=%d next=%d ctrl=0x%04X irq_status_reg=0x%04X",
2722 instance->fifo_irq_threshold, instance->ISM.next,
2723 ctrl_status, irq_status);
2727 ai_infinite_isr(instance, irq_status, ctrl_status);
2730 ctrl_status = inl(instance->ctrl_reg);
2734 ai_limited_isr(instance, irq_status, ctrl_status);
2735 ctrl_status = inl(instance->status_reg);
2736 if (!(ctrl_status & (ME4600_AI_STATUS_BIT_HF_DATA | ME4600_AI_CTRL_BIT_HF_IRQ_RESET))) { //HF active, but we have more than half already => HF will never come
2738 ("MISSED HF. data_required=%d ISM.read=%d ISM.global=%d ISM.next=%d\n",
2739 instance->data_required, instance->ISM.read,
2740 instance->ISM.global_read, instance->ISM.next);
2741 ai_limited_isr(instance, ME4600_IRQ_STATUS_BIT_AI_HF,
2747 PINFO("STATUS_BIT_FSM=%s.\n",
2748 (ctrl_status & ME4600_AI_STATUS_BIT_FSM) ? "on" : "off");
2750 PINFO("STATUS_BIT_EF_CHANNEL=%s.\n",
2751 (ctrl_status & ME4600_AI_STATUS_BIT_EF_CHANNEL) ? "not empty" :
2753 PINFO("STATUS_BIT_HF_CHANNEL=%s.\n",
2754 (ctrl_status & ME4600_AI_STATUS_BIT_HF_CHANNEL) ? " < HF" :
2756 PINFO("STATUS_BIT_FF_CHANNEL=%s.\n",
2757 (ctrl_status & ME4600_AI_STATUS_BIT_FF_CHANNEL) ? "not full" :
2760 PINFO("STATUS_BIT_EF_DATA=%s.\n",
2761 (ctrl_status & ME4600_AI_STATUS_BIT_EF_DATA) ? "not empty" :
2763 PINFO("STATUS_BIT_HF_DATA=%s.\n",
2764 (ctrl_status & ME4600_AI_STATUS_BIT_HF_DATA) ? " < HF" : " > HF");
2765 PINFO("STATUS_BIT_FF_DATA=%s.\n",
2766 (ctrl_status & ME4600_AI_STATUS_BIT_FF_DATA) ? "not full" :
2769 PINFO("CTRL_BIT_HF_IRQ_RESET=%s.\n",
2770 (ctrl_status & ME4600_AI_CTRL_BIT_HF_IRQ_RESET) ? "reset" :
2772 PINFO("CTRL_BIT_SC_IRQ=%s.\n",
2773 (ctrl_status & ME4600_AI_CTRL_BIT_SC_IRQ) ? "enable" : "disable");
2774 PINFO("CTRL_BIT_SC_RELOAD=%s.\n",
2775 (ctrl_status & ME4600_AI_CTRL_BIT_SC_RELOAD) ? "on" : "off");
2776 PINFO("CTRL_BIT_SC_IRQ_RESET=%s.\n",
2777 (ctrl_status & ME4600_AI_CTRL_BIT_SC_IRQ_RESET) ? "reset" :
2779 PINFO("%ld END\n", jiffies);
2785 /** @brief Stop aqusation of data. Reset interrupts' laches. Clear data's FIFO.
2787 * @param instance The subdevice instance (pointer).
2789 inline void ai_stop_isr(me4600_ai_subdevice_t *instance)
2790 { /// @note This is soft time critical function!
2791 register uint32_t tmp;
2793 spin_lock(instance->ctrl_reg_lock);
2794 //Stop all. Reset interrupt laches. Reset data FIFO.
2795 tmp = inl(instance->ctrl_reg);
2797 (ME4600_AI_CTRL_BIT_IMMEDIATE_STOP | ME4600_AI_CTRL_BIT_HF_IRQ_RESET
2798 | ME4600_AI_CTRL_BIT_LE_IRQ_RESET |
2799 ME4600_AI_CTRL_BIT_SC_IRQ_RESET);
2800 tmp &= ~ME4600_AI_CTRL_BIT_DATA_FIFO;
2801 outl(tmp, instance->ctrl_reg);
2802 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
2803 instance->ctrl_reg - instance->reg_base, tmp);
2804 spin_unlock(instance->ctrl_reg_lock);
2807 /** @brief Copy data from fifo to circular buffer.
2809 * @param instance The subdevice instance (pointer).
2810 * @param count The number of requested data.
2812 * @return On success: Number of copied values.
2813 * @return On error: -ME_ERRNO_RING_BUFFER_OVERFLOW.
2815 static inline int ai_read_data(me4600_ai_subdevice_t *instance,
2817 { /// @note This is time critical function!
2823 empty_space = me_circ_buf_space_to_end(&instance->circ_buf);
2824 if (empty_space <= 0) {
2825 PDEBUG("Circular buffer full.\n");
2826 return -ME_ERRNO_RING_BUFFER_OVERFLOW;
2829 if (empty_space < c) { //Copy first part. Max to end of buffer.
2831 ("Try to copy %d values from FIFO to circular buffer (pass 1).\n",
2833 for (i = 0; i < empty_space; i++) {
2834 *(instance->circ_buf.buf + instance->circ_buf.head) =
2835 (inw(instance->data_reg) ^ 0x8000);
2836 instance->circ_buf.head++;
2838 instance->circ_buf.head &= instance->circ_buf.mask;
2840 copied = empty_space;
2842 empty_space = me_circ_buf_space_to_end(&instance->circ_buf);
2845 if (empty_space > 0) {
2846 j = (empty_space < c) ? empty_space : c;
2848 ("Try to copy %d values from FIFO to circular buffer (pass 2).\n",
2850 for (i = 0; i < j; i++) {
2851 *(instance->circ_buf.buf + instance->circ_buf.head) =
2852 (inw(instance->data_reg) ^ 0x8000);
2853 instance->circ_buf.head++;
2855 instance->circ_buf.head &= instance->circ_buf.mask;
2861 inline void ai_infinite_ISM(me4600_ai_subdevice_t *instance)
2862 { /// @note This is time critical function!
2863 register volatile uint32_t ctrl_set, ctrl_reset, tmp;
2865 if (instance->fifo_irq_threshold < ME4600_AI_FIFO_MAX_SC) { // Only sample counter with reloadnig is working. Reset it.
2867 ("Only sample counter with reloadnig is working. Reset it.\n");
2868 ctrl_set = ME4600_AI_CTRL_BIT_SC_IRQ_RESET;
2869 ctrl_reset = ~ME4600_AI_CTRL_BIT_SC_IRQ_RESET;
2870 } else if (instance->fifo_irq_threshold == instance->ISM.read) { //This is SC interrupt for large block. The whole section is done. Reset SC_IRQ an HF_IRQ and start everything again from beginning.
2872 ("This is SC interrupt for large block. The whole section is done. Reset SC_IRQ an HF_IRQ and start everything again from beginning.\n");
2874 ME4600_AI_CTRL_BIT_SC_IRQ_RESET |
2875 ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2877 ~(ME4600_AI_CTRL_BIT_SC_IRQ_RESET |
2878 ME4600_AI_CTRL_BIT_HF_IRQ_RESET);
2879 } else if (instance->fifo_irq_threshold >= (ME4600_AI_FIFO_MAX_SC + instance->ISM.read)) { //This is HF interrupt for large block.The next interrupt should be from HF, also. Reset HF.
2881 ("This is HF interrupt for large block.The next interrupt should be from HF, also. Reset HF.\n");
2882 ctrl_set = ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2883 ctrl_reset = ~ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2884 } else { //This is HF interrupt for large block.The next interrupt should be from SC. Don't reset HF!
2886 ("This is HF interrupt for large block.The next interrupt should be from SC. Don't reset HF!\n");
2887 ctrl_set = ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2888 ctrl_reset = 0xFFFFFFFF;
2891 //Reset interrupt latch.
2892 spin_lock(instance->ctrl_reg_lock);
2893 tmp = inl(instance->ctrl_reg);
2894 PINFO("ctrl=0x%x ctrl_set=0x%x ctrl_reset=0x%x\n", tmp, ctrl_set,
2897 outl(tmp, instance->ctrl_reg);
2898 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
2899 instance->ctrl_reg - instance->reg_base, tmp);
2900 if (ctrl_reset != 0xFFFFFFFF) {
2901 outl(tmp & ctrl_reset, instance->ctrl_reg);
2902 PDEBUG_REG("ctrl_reset outl(0x%lX+0x%lX)=0x%x\n",
2904 instance->ctrl_reg - instance->reg_base,
2907 spin_unlock(instance->ctrl_reg_lock);
2911 inline void ai_limited_ISM(me4600_ai_subdevice_t *instance,
2912 uint32_t irq_status)
2913 { /// @note This is time critical function!
2914 register volatile uint32_t ctrl_set, ctrl_reset = 0xFFFFFFFF, tmp;
2916 if (!instance->fifo_irq_threshold) { //No threshold provided. SC ends work.
2917 PINFO("No threshold provided. SC ends work.\n");
2918 ctrl_set = ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2919 if (instance->data_required > (ME4600_AI_FIFO_COUNT - 1 + instance->ISM.global_read)) { //HF need reseting.
2920 ctrl_reset &= ~ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2922 } else //if(instance->fifo_irq_threshold)
2924 if (irq_status & ME4600_IRQ_STATUS_BIT_AI_HF) {
2925 PINFO("Threshold provided. Clear HF latch.\n");
2926 ctrl_set = ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2928 if (instance->fifo_irq_threshold >= (ME4600_AI_FIFO_MAX_SC + instance->ISM.read)) { //This is not the last one. HF need reseting.
2930 ("The next interrupt is HF. HF need be activating.\n");
2931 ctrl_reset = ~ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2935 if (irq_status & ME4600_IRQ_STATUS_BIT_SC) {
2936 PINFO("Threshold provided. Restart SC.\n");
2937 ctrl_set = ME4600_AI_CTRL_BIT_SC_IRQ_RESET;
2938 ctrl_reset &= ~ME4600_AI_CTRL_BIT_SC_IRQ_RESET;
2940 if (instance->fifo_irq_threshold >= ME4600_AI_FIFO_MAX_SC) { //This is not the last one. HF need to be activating.
2942 ("The next interrupt is HF. HF need to be activating.\n");
2943 ctrl_reset &= ~ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
2948 //Reset interrupt latch.
2949 spin_lock(instance->ctrl_reg_lock);
2950 tmp = inl(instance->ctrl_reg);
2952 outl(tmp, instance->ctrl_reg);
2953 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
2954 instance->ctrl_reg - instance->reg_base, tmp);
2956 if (ctrl_reset != 0xFFFFFFFF) {
2957 outl(tmp & ctrl_reset, instance->ctrl_reg);
2958 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
2960 instance->ctrl_reg - instance->reg_base,
2963 spin_unlock(instance->ctrl_reg_lock);
2967 /** @brief Last chunck of datas. We must reschedule sample counter.
2968 * @note Last chunck.
2969 * Leaving SC_RELOAD doesn't do any harm, but in some bad case can make extra interrupts.
2970 * @warning When threshold is wrongly set some IRQ are lost.(!!!)
2972 inline void ai_reschedule_SC(me4600_ai_subdevice_t *instance)
2974 register uint32_t rest;
2976 if (instance->data_required <= instance->ISM.global_read)
2979 rest = instance->data_required - instance->ISM.global_read;
2980 if (rest < instance->fifo_irq_threshold) { //End of work soon ....
2981 PDEBUG("Rescheduling SC from %d to %d.\n",
2982 instance->fifo_irq_threshold, rest);
2983 /// @note Write new value to SC <== DANGER! This is not safe solution! We can miss some inputs.
2984 outl(rest, instance->sample_counter_reg);
2985 PDEBUG_REG("sample_counter_reg outl(0x%lX+0x%lX)=0x%x\n",
2987 instance->sample_counter_reg - instance->reg_base,
2989 instance->fifo_irq_threshold = rest;
2991 if (rest < ME4600_AI_FIFO_MAX_SC) {
2992 instance->ISM.next = rest;
2994 instance->ISM.next = rest % ME4600_AI_FIFO_HALF;
2995 if (instance->ISM.next + ME4600_AI_FIFO_HALF <
2996 ME4600_AI_FIFO_MAX_SC) {
2997 instance->ISM.next += ME4600_AI_FIFO_HALF;
3003 /** Start the ISM. All must be reseted before enter to this function. */
3004 inline void ai_data_acquisition_logic(me4600_ai_subdevice_t *instance)
3006 register uint32_t tmp;
3008 if (!instance->data_required) { //This is infinite aqusition.
3009 if (!instance->fifo_irq_threshold) { //No threshold provided. Set SC to 0.5*FIFO. Clear the SC's latch.
3010 //Set the sample counter
3011 outl(ME4600_AI_FIFO_HALF, instance->sample_counter_reg);
3013 ("sample_counter_reg outl(0x%lX+0x%lX)=0x%x\n",
3015 instance->sample_counter_reg - instance->reg_base,
3016 ME4600_AI_FIFO_HALF);
3017 } else { //Threshold provided. Set SC to treshold. Clear the SC's latch.
3018 //Set the sample counter
3019 outl(instance->fifo_irq_threshold,
3020 instance->sample_counter_reg);
3022 ("sample_counter_reg outl(0x%lX+0x%lX)=0x%x\n",
3024 instance->sample_counter_reg - instance->reg_base,
3025 instance->fifo_irq_threshold);
3028 if (instance->fifo_irq_threshold < ME4600_AI_FIFO_MAX_SC) { //Enable only sample counter's interrupt. Set reload bit. Clear the SC's latch.
3029 spin_lock(instance->ctrl_reg_lock);
3030 tmp = inl(instance->ctrl_reg);
3031 tmp |= ME4600_AI_CTRL_BIT_SC_RELOAD;
3032 tmp &= ~ME4600_AI_CTRL_BIT_SC_IRQ_RESET;
3033 outl(tmp, instance->ctrl_reg);
3034 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
3036 instance->ctrl_reg - instance->reg_base,
3038 spin_unlock(instance->ctrl_reg_lock);
3039 if (!instance->fifo_irq_threshold) { //No threshold provided. Set ISM.next to 0.5*FIFO.
3040 instance->ISM.next = ME4600_AI_FIFO_HALF;
3041 } else { //Threshold provided. Set ISM.next to treshold.
3042 instance->ISM.next =
3043 instance->fifo_irq_threshold;
3045 } else { //Enable sample counter's and HF's interrupts.
3046 spin_lock(instance->ctrl_reg_lock);
3047 tmp = inl(instance->ctrl_reg);
3048 tmp |= ME4600_AI_CTRL_BIT_SC_RELOAD;
3050 ~(ME4600_AI_CTRL_BIT_SC_IRQ_RESET |
3051 ME4600_AI_CTRL_BIT_HF_IRQ_RESET);
3052 outl(tmp, instance->ctrl_reg);
3053 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
3055 instance->ctrl_reg - instance->reg_base,
3057 spin_unlock(instance->ctrl_reg_lock);
3059 instance->ISM.next =
3060 instance->fifo_irq_threshold % ME4600_AI_FIFO_HALF;
3061 if (instance->ISM.next + ME4600_AI_FIFO_HALF <
3062 ME4600_AI_FIFO_MAX_SC) {
3063 instance->ISM.next += ME4600_AI_FIFO_HALF;
3066 } else { //This aqusition is limited to set number of data.
3067 if (instance->fifo_irq_threshold >= instance->data_required) { //Stupid situation.
3068 instance->fifo_irq_threshold = 0;
3070 ("Stupid situation: data_required(%d) < threshold(%d).\n",
3071 instance->fifo_irq_threshold,
3072 instance->data_required);
3075 if (!instance->fifo_irq_threshold) { //No threshold provided. Easy case: HF=read and SC=end.
3076 //Set the sample counter to data_required.
3077 outl(instance->data_required,
3078 instance->sample_counter_reg);
3080 ("sample_counter_reg outl(0x%lX+0x%lX)=0x%x\n",
3082 instance->sample_counter_reg - instance->reg_base,
3083 instance->data_required);
3085 //Reset the latches of sample counter and HF (if SC>FIFO).
3087 spin_lock(instance->ctrl_reg_lock);
3088 tmp = inl(instance->ctrl_reg);
3090 ~(ME4600_AI_CTRL_BIT_SC_IRQ_RESET |
3091 ME4600_AI_CTRL_BIT_SC_RELOAD);
3092 if (instance->data_required >
3093 (ME4600_AI_FIFO_COUNT - 1)) {
3094 tmp &= ~ME4600_AI_CTRL_BIT_HF_IRQ_RESET;
3095 instance->ISM.next =
3096 instance->data_required %
3097 ME4600_AI_FIFO_HALF;
3098 instance->ISM.next += ME4600_AI_FIFO_HALF;
3101 instance->ISM.next = instance->data_required;
3103 outl(tmp, instance->ctrl_reg);
3104 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
3106 instance->ctrl_reg - instance->reg_base,
3108 spin_unlock(instance->ctrl_reg_lock);
3110 } else { //The most general case. We have concret numbe of required data and threshold. SC=TH
3111 //Set the sample counter to threshold.
3112 outl(instance->fifo_irq_threshold,
3113 instance->sample_counter_reg);
3115 ("sample_counter_reg outl(0x%lX+0x%lX)=0x%x\n",
3117 instance->sample_counter_reg - instance->reg_base,
3118 instance->fifo_irq_threshold);
3120 spin_lock(instance->ctrl_reg_lock);
3121 tmp = inl(instance->ctrl_reg);
3122 //In this moment we are sure that SC will come more than once.
3123 tmp |= ME4600_AI_CTRL_BIT_SC_RELOAD;
3125 if (instance->fifo_irq_threshold < ME4600_AI_FIFO_MAX_SC) { //The threshold is so small that we do need HF.
3126 tmp &= ~ME4600_AI_CTRL_BIT_SC_IRQ_RESET;
3127 instance->ISM.next =
3128 instance->fifo_irq_threshold;
3129 } else { //The threshold is large. The HF must be use.
3131 ~(ME4600_AI_CTRL_BIT_SC_IRQ_RESET |
3132 ME4600_AI_CTRL_BIT_HF_IRQ_RESET);
3133 instance->ISM.next =
3134 instance->fifo_irq_threshold %
3135 ME4600_AI_FIFO_HALF;
3136 if (instance->ISM.next + ME4600_AI_FIFO_HALF <
3137 ME4600_AI_FIFO_MAX_SC) {
3138 instance->ISM.next +=
3139 ME4600_AI_FIFO_HALF;
3142 outl(tmp, instance->ctrl_reg);
3143 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
3145 instance->ctrl_reg - instance->reg_base,
3147 spin_unlock(instance->ctrl_reg_lock);
3152 static int ai_mux_toggler(me4600_ai_subdevice_t *instance)
3156 PDEBUG("executed. idx=0\n");
3158 outl(0, instance->scan_pre_timer_low_reg);
3159 PDEBUG_REG("scan_pre_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
3161 instance->scan_pre_timer_low_reg - instance->reg_base, 0);
3162 outl(0, instance->scan_pre_timer_high_reg);
3163 PDEBUG_REG("scan_pre_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
3165 instance->scan_pre_timer_high_reg - instance->reg_base, 0);
3166 outl(0, instance->scan_timer_low_reg);
3167 PDEBUG_REG("scan_timer_low_reg outl(0x%lX+0x%lX)=0x%x\n",
3169 instance->scan_timer_low_reg - instance->reg_base, 0);
3170 outl(0, instance->scan_timer_high_reg);
3171 PDEBUG_REG("scan_timer_high_reg outl(0x%lX+0x%lX)=0x%x\n",
3173 instance->scan_timer_high_reg - instance->reg_base, 0);
3174 outl(65, instance->chan_timer_reg);
3175 PDEBUG_REG("chan_timer_reg outl(0x%lX+0x%lX)=0x%x\n",
3177 instance->chan_timer_reg - instance->reg_base, 65);
3178 outl(65, instance->chan_pre_timer_reg);
3179 PDEBUG_REG("chan_pre_timer_reg outl(0x%lX+0x%lX)=0x%x\n",
3181 instance->chan_pre_timer_reg - instance->reg_base, 65);
3183 // Turn on internal reference.
3184 tmp = inl(instance->ctrl_reg);
3185 tmp |= ME4600_AI_CTRL_BIT_FULLSCALE;
3186 outl(tmp, instance->ctrl_reg);
3187 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
3188 instance->ctrl_reg - instance->reg_base, tmp);
3190 // Clear data and channel fifo.
3192 ~(ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO);
3193 outl(tmp, instance->ctrl_reg);
3194 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
3195 instance->ctrl_reg - instance->reg_base, tmp);
3196 tmp |= ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO;
3197 outl(tmp, instance->ctrl_reg);
3198 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
3199 instance->ctrl_reg - instance->reg_base, tmp);
3201 // Write channel entry.
3202 outl(ME4600_AI_LIST_INPUT_DIFFERENTIAL |
3203 ME4600_AI_LIST_RANGE_UNIPOLAR_2_5 | 31,
3204 instance->channel_list_reg);
3205 PDEBUG_REG("channel_list_reg outl(0x%lX+0x%lX)=0x%x\n",
3207 instance->channel_list_reg - instance->reg_base,
3208 ME4600_AI_LIST_INPUT_DIFFERENTIAL |
3209 ME4600_AI_LIST_RANGE_UNIPOLAR_2_5 | 31);
3211 // Start conversion.
3212 inl(instance->start_reg);
3213 PDEBUG_REG("start_reg inl(0x%lX+0x%lX)\n", instance->reg_base,
3214 instance->start_reg - instance->reg_base);
3217 // Clear data and channel fifo.
3219 ~(ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO);
3220 outl(tmp, instance->ctrl_reg);
3221 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
3222 instance->ctrl_reg - instance->reg_base, tmp);
3223 tmp |= ME4600_AI_CTRL_BIT_CHANNEL_FIFO | ME4600_AI_CTRL_BIT_DATA_FIFO;
3224 outl(tmp, instance->ctrl_reg);
3225 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
3226 instance->ctrl_reg - instance->reg_base, tmp);
3228 // Write channel entry.
3229 // ME4600_AI_LIST_INPUT_SINGLE_ENDED | ME4600_AI_LIST_RANGE_BIPOLAR_10 <= 0x0000
3230 outl(ME4600_AI_LIST_INPUT_SINGLE_ENDED |
3231 ME4600_AI_LIST_RANGE_BIPOLAR_10, instance->channel_list_reg);
3232 PDEBUG_REG("channel_list_reg outl(0x%lX+0x%lX)=0x%x\n",
3234 instance->channel_list_reg - instance->reg_base,
3235 ME4600_AI_LIST_INPUT_SINGLE_ENDED |
3236 ME4600_AI_LIST_RANGE_BIPOLAR_10);
3238 // Start conversion.
3239 inl(instance->start_reg);
3240 PDEBUG_REG("start_reg inl(0x%lX+0x%lX)\n", instance->reg_base,
3241 instance->start_reg - instance->reg_base);
3244 // Clear control register.
3245 tmp &= (ME4600_AI_CTRL_BIT_EX_IRQ | ME4600_AI_CTRL_BIT_EX_IRQ_RESET);
3246 outl(tmp, instance->ctrl_reg);
3247 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
3248 instance->ctrl_reg - instance->reg_base, tmp);
3250 return ME_ERRNO_SUCCESS;
3253 /** @brief Copy rest of data from fifo to circular buffer.
3254 * @note Helper for STOP command. After FSM is stopped.
3255 * @note This is slow function that copy all remainig data from FIFO to buffer.
3257 * @param instance The subdevice instance (pointer).
3259 * @return On success: Number of copied values.
3260 * @return On error: Negative error code -ME_ERRNO_RING_BUFFER_OVERFLOW.
3262 static inline int ai_read_data_pooling(me4600_ai_subdevice_t *instance)
3263 { /// @note This is time critical function!
3266 int status = ME_ERRNO_SUCCESS;
3268 PDEBUG("Space left in circular buffer = %d.\n",
3269 me_circ_buf_space(&instance->circ_buf));
3271 while ((empty_space = me_circ_buf_space(&instance->circ_buf))) {
3272 if (!(status = inl(instance->status_reg) & ME4600_AI_STATUS_BIT_EF_DATA)) { //No more data. status = ME_ERRNO_SUCCESS = 0
3275 *(instance->circ_buf.buf + instance->circ_buf.head) =
3276 (inw(instance->data_reg) ^ 0x8000);
3277 instance->circ_buf.head++;
3278 instance->circ_buf.head &= instance->circ_buf.mask;
3281 #ifdef MEDEBUG_ERROR
3284 ("Copied all remaining datas (%d) from FIFO to circular buffer.\n",
3287 PDEBUG("No more empty space in buffer.\n");
3288 PDEBUG("Copied %d datas from FIFO to circular buffer.\n",
3290 PDEBUG("FIFO still not empty.\n");
3293 return (!status) ? copied : -ME_ERRNO_RING_BUFFER_OVERFLOW;
3296 static void me4600_ai_work_control_task(struct work_struct *work)
3298 me4600_ai_subdevice_t *instance;
3301 unsigned long cpu_flags = 0;
3306 container_of((void *)work, me4600_ai_subdevice_t, ai_control_task);
3307 PINFO("<%s: %ld> executed.\n", __func__, jiffies);
3309 status = inl(instance->status_reg);
3310 PDEBUG_REG("status_reg inl(0x%lX+0x%lX)=0x%x\n", instance->reg_base,
3311 instance->status_reg - instance->reg_base, status);
3313 switch (instance->status) { // Checking actual mode.
3314 // Not configured for work.
3315 case ai_status_none:
3318 //This are stable modes. No need to do anything. (?)
3319 case ai_status_single_configured:
3320 case ai_status_stream_configured:
3321 case ai_status_stream_fifo_error:
3322 case ai_status_stream_buffer_error:
3323 case ai_status_stream_error:
3324 PERROR("Shouldn't be running!.\n");
3328 case ai_status_stream_run_wait:
3329 if (status & ME4600_AI_STATUS_BIT_FSM) { // ISM started..
3330 instance->status = ai_status_stream_run;
3331 // Signal the end of wait for start.
3333 // Wait now for stop.
3338 if ((instance->timeout.delay) && ((jiffies - instance->timeout.start_time) >= instance->timeout.delay)) { // Timeout
3339 PDEBUG("Timeout reached.\n");
3340 // Stop all actions. No conditions! Block interrupts. Reset FIFO => Too late!
3341 ai_stop_isr(instance);
3343 instance->status = ai_status_stream_end;
3351 case ai_status_stream_run:
3352 // Wait for stop ISM.
3356 case ai_status_stream_end_wait:
3357 if (!(status & ME4600_AI_STATUS_BIT_FSM)) { // ISM stoped. Overwrite ISR.
3358 instance->status = ai_status_stream_end;
3359 // Signal the end of wait for stop.
3362 // Wait for stop ISM.
3367 case ai_status_stream_end:
3369 if (status & ME4600_AI_STATUS_BIT_FSM) { // Still working? Stop it!
3371 ("Status is 'ai_status_stream_end' but hardware is still working!\n");
3372 spin_lock_irqsave(instance->ctrl_reg_lock, cpu_flags);
3373 ctrl = inl(instance->ctrl_reg);
3375 (ME4600_AI_CTRL_BIT_IMMEDIATE_STOP |
3376 ME4600_AI_CTRL_BIT_HF_IRQ_RESET |
3377 ME4600_AI_CTRL_BIT_SC_IRQ_RESET);
3378 outl(ctrl, instance->ctrl_reg);
3379 PDEBUG_REG("ctrl_reg outl(0x%lX+0x%lX)=0x%x\n",
3381 instance->ctrl_reg - instance->reg_base,
3383 spin_unlock_irqrestore(instance->ctrl_reg_lock,
3389 PERROR_CRITICAL("Status is in wrong state (%d)!\n",
3391 instance->status = ai_status_stream_error;
3398 if (signaling) { //Signal it.
3399 wake_up_interruptible_all(&instance->wait_queue);
3402 if (instance->ai_control_task_flag && reschedule) { // Reschedule task
3403 queue_delayed_work(instance->me4600_workqueue,
3404 &instance->ai_control_task, 1);
3406 PINFO("<%s> Ending control task.\n", __func__);