addi_common.h revision 6a770eca8a679741dbe32207858638bb0ca71e38
1/*
2 *  Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
3 *
4 *	ADDI-DATA GmbH
5 *	Dieselstrasse 3
6 *	D-77833 Ottersweier
7 *	Tel: +19(0)7223/9493-0
8 *	Fax: +49(0)7223/9493-92
9 *	http://www.addi-data-com
10 *	info@addi-data.com
11 *
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the Free
14 * Software Foundation; either version 2 of the License, or (at your option)
15 * any later version.
16 */
17
18#include <linux/kernel.h>
19#include <linux/module.h>
20#include <linux/sched.h>
21#include <linux/mm.h>
22#include <linux/slab.h>
23#include <linux/errno.h>
24#include <linux/ioport.h>
25#include <linux/delay.h>
26#include <linux/interrupt.h>
27#include <linux/timex.h>
28#include <linux/timer.h>
29#include <linux/pci.h>
30#include <linux/io.h>
31#include <linux/kmod.h>
32#include <linux/uaccess.h>
33#include "../../comedidev.h"
34#include "addi_amcc_s5933.h"
35
36#define ERROR	-1
37#define SUCCESS	1
38
39#define LOBYTE(W)	(unsigned char)((W) & 0xFF)
40#define HIBYTE(W)	(unsigned char)(((W) >> 8) & 0xFF)
41#define MAKEWORD(H, L)	(unsigned short)((L) | ((H) << 8))
42#define LOWORD(W)	(unsigned short)((W) & 0xFFFF)
43#define HIWORD(W)	(unsigned short)(((W) >> 16) & 0xFFFF)
44#define MAKEDWORD(H, L)	(unsigned int)((L) | ((H) << 16))
45
46#define ADDI_ENABLE		1
47#define ADDI_DISABLE		0
48#define APCI1710_SAVE_INTERRUPT	1
49
50#define ADDIDATA_EEPROM		1
51#define ADDIDATA_NO_EEPROM	0
52#define ADDIDATA_93C76		"93C76"
53#define ADDIDATA_S5920		"S5920"
54#define ADDIDATA_S5933		"S5933"
55#define ADDIDATA_9054		"9054"
56
57/* ADDIDATA Enable Disable */
58#define ADDIDATA_ENABLE		1
59#define ADDIDATA_DISABLE	0
60
61/* Structures */
62
63/* structure for the boardtype */
64struct addi_board {
65	const char *pc_DriverName;	// driver name
66	int i_VendorId;		//PCI vendor a device ID of card
67	int i_DeviceId;
68	int i_IorangeBase0;
69	int i_IorangeBase1;
70	int i_IorangeBase2;	//  base 2 range
71	int i_IorangeBase3;	//  base 3 range
72	int i_PCIEeprom;	// eeprom present or not
73	char *pc_EepromChip;	// type of chip
74	int i_NbrAiChannel;	// num of A/D chans
75	int i_NbrAiChannelDiff;	// num of A/D chans in diff mode
76	int i_AiChannelList;	// len of chanlist
77	int i_NbrAoChannel;	// num of D/A chans
78	int i_AiMaxdata;	// resolution of A/D
79	int i_AoMaxdata;	// resolution of D/A
80        const struct comedi_lrange *pr_AiRangelist;	/* rangelist for A/D */
81        const struct comedi_lrange *pr_AoRangelist;	/* rangelist for D/A */
82
83	int i_NbrDiChannel;	// Number of DI channels
84	int i_NbrDoChannel;	// Number of DO channels
85	int i_DoMaxdata;	// data to set all chanels high
86
87	int i_NbrTTLChannel;	// Number of TTL channels
88	const struct comedi_lrange *pr_TTLRangelist;	/* rangelist for TTL */
89
90	int i_Dma;		// dma present or not
91	int i_Timer;		//   timer subdevice present or not
92	unsigned char b_AvailableConvertUnit;
93	unsigned int ui_MinAcquisitiontimeNs;	// Minimum Acquisition in Nano secs
94	unsigned int ui_MinDelaytimeNs;	// Minimum Delay in Nano secs
95
96	/* interrupt and reset */
97	void (*v_hwdrv_Interrupt)(int irq, void *d);
98	int (*i_hwdrv_Reset)(struct comedi_device *dev);
99
100	/* Subdevice functions */
101
102	/* ANALOG INPUT */
103	int (*i_hwdrv_InsnConfigAnalogInput)(struct comedi_device *dev,
104					     struct comedi_subdevice *s,
105					     struct comedi_insn *insn,
106					     unsigned int *data);
107	int (*i_hwdrv_InsnReadAnalogInput)(struct comedi_device *dev,
108					    struct comedi_subdevice *s,
109					    struct comedi_insn *insn,
110					    unsigned int *data);
111	int (*i_hwdrv_InsnWriteAnalogInput)(struct comedi_device *dev,
112					    struct comedi_subdevice *s,
113					    struct comedi_insn *insn,
114					    unsigned int *data);
115	int (*i_hwdrv_InsnBitsAnalogInput)(struct comedi_device *dev,
116					   struct comedi_subdevice *s,
117					   struct comedi_insn *insn,
118					   unsigned int *data);
119	int (*i_hwdrv_CommandTestAnalogInput)(struct comedi_device *dev,
120					      struct comedi_subdevice *s,
121					      struct comedi_cmd *cmd);
122	int (*i_hwdrv_CommandAnalogInput)(struct comedi_device *dev,
123					  struct comedi_subdevice *s);
124	int (*i_hwdrv_CancelAnalogInput)(struct comedi_device *dev,
125					 struct comedi_subdevice *s);
126
127	/* Analog Output */
128	int (*i_hwdrv_InsnConfigAnalogOutput)(struct comedi_device *dev,
129					      struct comedi_subdevice *s,
130					      struct comedi_insn *insn,
131					      unsigned int *data);
132	int (*i_hwdrv_InsnWriteAnalogOutput)(struct comedi_device *dev,
133					     struct comedi_subdevice *s,
134					     struct comedi_insn *insn,
135					     unsigned int *data);
136	int (*i_hwdrv_InsnBitsAnalogOutput)(struct comedi_device *dev,
137					    struct comedi_subdevice *s,
138					    struct comedi_insn *insn,
139					    unsigned int *data);
140
141	/* Digital Input */
142	int (*i_hwdrv_InsnConfigDigitalInput) (struct comedi_device *dev,
143					       struct comedi_subdevice *s,
144					       struct comedi_insn *insn,
145					       unsigned int *data);
146	int (*i_hwdrv_InsnReadDigitalInput) (struct comedi_device *dev,
147					     struct comedi_subdevice *s,
148					     struct comedi_insn *insn,
149					     unsigned int *data);
150	int (*i_hwdrv_InsnWriteDigitalInput) (struct comedi_device *dev,
151					      struct comedi_subdevice *s,
152					      struct comedi_insn *insn,
153					      unsigned int *data);
154	int (*i_hwdrv_InsnBitsDigitalInput) (struct comedi_device *dev,
155					     struct comedi_subdevice *s,
156					     struct comedi_insn *insn,
157					     unsigned int *data);
158
159	/* Digital Output */
160	int (*i_hwdrv_InsnConfigDigitalOutput)(struct comedi_device *dev,
161					       struct comedi_subdevice *s,
162					       struct comedi_insn *insn,
163					       unsigned int *data);
164	int (*i_hwdrv_InsnWriteDigitalOutput)(struct comedi_device *dev,
165					      struct comedi_subdevice *s,
166					      struct comedi_insn *insn,
167					      unsigned int *data);
168	int (*i_hwdrv_InsnBitsDigitalOutput)(struct comedi_device *dev,
169					     struct comedi_subdevice *s,
170					     struct comedi_insn *insn,
171					     unsigned int *data);
172	int (*i_hwdrv_InsnReadDigitalOutput)(struct comedi_device *dev,
173					     struct comedi_subdevice *s,
174					     struct comedi_insn *insn,
175					     unsigned int *data);
176
177	/* TIMER */
178	int (*i_hwdrv_InsnConfigTimer)(struct comedi_device *dev,
179				       struct comedi_subdevice *s,
180				       struct comedi_insn *insn, unsigned int *data);
181	int (*i_hwdrv_InsnWriteTimer)(struct comedi_device *dev,
182				      struct comedi_subdevice *s, struct comedi_insn *insn,
183				      unsigned int *data);
184	int (*i_hwdrv_InsnReadTimer)(struct comedi_device *dev, struct comedi_subdevice *s,
185				     struct comedi_insn *insn, unsigned int *data);
186	int (*i_hwdrv_InsnBitsTimer)(struct comedi_device *dev, struct comedi_subdevice *s,
187				     struct comedi_insn *insn, unsigned int *data);
188
189	/* TTL IO */
190	int (*i_hwdr_ConfigInitTTLIO)(struct comedi_device *dev,
191				      struct comedi_subdevice *s, struct comedi_insn *insn,
192				      unsigned int *data);
193	int (*i_hwdr_ReadTTLIOBits)(struct comedi_device *dev, struct comedi_subdevice *s,
194				    struct comedi_insn *insn, unsigned int *data);
195	int (*i_hwdr_ReadTTLIOAllPortValue)(struct comedi_device *dev,
196					    struct comedi_subdevice *s,
197					    struct comedi_insn *insn,
198					    unsigned int *data);
199	int (*i_hwdr_WriteTTLIOChlOnOff)(struct comedi_device *dev,
200					 struct comedi_subdevice *s,
201					 struct comedi_insn *insn, unsigned int *data);
202};
203
204//MODULE INFO STRUCTURE
205
206typedef union {
207	/* Incremental counter infos */
208	struct {
209		union {
210			struct {
211				unsigned char b_ModeRegister1;
212				unsigned char b_ModeRegister2;
213				unsigned char b_ModeRegister3;
214				unsigned char b_ModeRegister4;
215			} s_ByteModeRegister;
216			unsigned int dw_ModeRegister1_2_3_4;
217		} s_ModeRegister;
218
219		struct {
220			unsigned int b_IndexInit:1;
221			unsigned int b_CounterInit:1;
222			unsigned int b_ReferenceInit:1;
223			unsigned int b_IndexInterruptOccur:1;
224			unsigned int b_CompareLogicInit:1;
225			unsigned int b_FrequencyMeasurementInit:1;
226			unsigned int b_FrequencyMeasurementEnable:1;
227		} s_InitFlag;
228
229	} s_SiemensCounterInfo;
230
231	/* SSI infos */
232	struct {
233		unsigned char b_SSIProfile;
234		unsigned char b_PositionTurnLength;
235		unsigned char b_TurnCptLength;
236		unsigned char b_SSIInit;
237	} s_SSICounterInfo;
238
239	/* TTL I/O infos */
240	struct {
241		unsigned char b_TTLInit;
242		unsigned char b_PortConfiguration[4];
243	} s_TTLIOInfo;
244
245	/* Digital I/O infos */
246	struct {
247		unsigned char b_DigitalInit;
248		unsigned char b_ChannelAMode;
249		unsigned char b_ChannelBMode;
250		unsigned char b_OutputMemoryEnabled;
251		unsigned int dw_OutputMemory;
252	} s_DigitalIOInfo;
253
254      /*********************/
255	/* 82X54 timer infos */
256      /*********************/
257
258	struct {
259		struct {
260			unsigned char b_82X54Init;
261			unsigned char b_InputClockSelection;
262			unsigned char b_InputClockLevel;
263			unsigned char b_OutputLevel;
264			unsigned char b_HardwareGateLevel;
265			unsigned int dw_ConfigurationWord;
266		} s_82X54TimerInfo[3];
267		unsigned char b_InterruptMask;
268	} s_82X54ModuleInfo;
269
270      /*********************/
271	/* Chronometer infos */
272      /*********************/
273
274	struct {
275		unsigned char b_ChronoInit;
276		unsigned char b_InterruptMask;
277		unsigned char b_PCIInputClock;
278		unsigned char b_TimingUnit;
279		unsigned char b_CycleMode;
280		double d_TimingInterval;
281		unsigned int dw_ConfigReg;
282	} s_ChronoModuleInfo;
283
284      /***********************/
285	/* Pulse encoder infos */
286      /***********************/
287
288	struct {
289		struct {
290			unsigned char b_PulseEncoderInit;
291		} s_PulseEncoderInfo[4];
292		unsigned int dw_SetRegister;
293		unsigned int dw_ControlRegister;
294		unsigned int dw_StatusRegister;
295	} s_PulseEncoderModuleInfo;
296
297	/* Tor conter infos */
298	struct {
299		struct {
300			unsigned char b_TorCounterInit;
301			unsigned char b_TimingUnit;
302			unsigned char b_InterruptEnable;
303			double d_TimingInterval;
304			unsigned int ul_RealTimingInterval;
305		} s_TorCounterInfo[2];
306		unsigned char b_PCIInputClock;
307	} s_TorCounterModuleInfo;
308
309	/* PWM infos */
310	struct {
311		struct {
312			unsigned char b_PWMInit;
313			unsigned char b_TimingUnit;
314			unsigned char b_InterruptEnable;
315			double d_LowTiming;
316			double d_HighTiming;
317			unsigned int ul_RealLowTiming;
318			unsigned int ul_RealHighTiming;
319		} s_PWMInfo[2];
320		unsigned char b_ClockSelection;
321	} s_PWMModuleInfo;
322
323	/* ETM infos */
324	struct {
325		struct {
326			unsigned char b_ETMEnable;
327			unsigned char b_ETMInterrupt;
328		} s_ETMInfo[2];
329		unsigned char b_ETMInit;
330		unsigned char b_TimingUnit;
331		unsigned char b_ClockSelection;
332		double d_TimingInterval;
333		unsigned int ul_Timing;
334	} s_ETMModuleInfo;
335
336	/* CDA infos */
337	struct {
338		unsigned char b_CDAEnable;
339		unsigned char b_CDAInterrupt;
340		unsigned char b_CDAInit;
341		unsigned char b_FctSelection;
342		unsigned char b_CDAReadFIFOOverflow;
343	} s_CDAModuleInfo;
344
345} str_ModuleInfo;
346
347/* Private structure for the addi_apci3120 driver */
348typedef struct {
349
350	int iobase;
351	int i_IobaseAmcc;	// base+size for AMCC chip
352	int i_IobaseAddon;	//addon base address
353	int i_IobaseReserved;
354	unsigned long dw_AiBase;
355	struct pcilst_struct *amcc;	// ptr too AMCC data
356	unsigned char allocated;		// we have blocked card
357	unsigned char b_ValidDriver;	// driver is ok
358	unsigned char b_AiContinuous;	// we do unlimited AI
359	unsigned char b_AiInitialisation;
360	unsigned int ui_AiActualScan;	//how many scans we finished
361	unsigned int ui_AiBufferPtr;	// data buffer ptr in samples
362	unsigned int ui_AiNbrofChannels;	// how many channels is measured
363	unsigned int ui_AiScanLength;	// Length of actual scanlist
364	unsigned int ui_AiActualScanPosition;	// position in actual scan
365	unsigned int * pui_AiChannelList;	// actual chanlist
366	unsigned int ui_AiChannelList[32];	// actual chanlist
367	unsigned char b_AiChannelConfiguration[32];	// actual chanlist
368	unsigned int ui_AiReadData[32];
369	unsigned int dw_AiInitialised;
370	unsigned int ui_AiTimer0;	//Timer Constant for Timer0
371	unsigned int ui_AiTimer1;	//Timer constant for Timer1
372	unsigned int ui_AiFlags;
373	unsigned int ui_AiDataLength;
374	short *AiData;	// Pointer to sample data
375	unsigned int ui_AiNbrofScans;	// number of scans to do
376	unsigned short us_UseDma;	// To use Dma or not
377	unsigned char b_DmaDoubleBuffer;	// we can use double buffering
378	unsigned int ui_DmaActualBuffer;	// which buffer is used now
379	/* UPDATE-0.7.57->0.7.68 */
380	/* unsigned int               ul_DmaBufferVirtual[2]; pointers to begin of DMA buffer */
381	short *ul_DmaBufferVirtual[2];	// pointers to begin of DMA buffer
382	unsigned int ul_DmaBufferHw[2];	// hw address of DMA buff
383	unsigned int ui_DmaBufferSize[2];	// size of dma buffer in bytes
384	unsigned int ui_DmaBufferUsesize[2];	// which size we may now used for transfer
385	unsigned int ui_DmaBufferSamples[2];	// size in samples
386	unsigned int ui_DmaBufferPages[2];	// number of pages in buffer
387	unsigned char b_DigitalOutputRegister;	// Digital Output Register
388	unsigned char b_OutputMemoryStatus;
389	unsigned char b_AnalogInputChannelNbr;	// Analog input channel Nbr
390	unsigned char b_AnalogOutputChannelNbr;	// Analog input Output  Nbr
391	unsigned char b_TimerSelectMode;	// Contain data written at iobase + 0C
392	unsigned char b_ModeSelectRegister;	// Contain data written at iobase + 0E
393	unsigned short us_OutputRegister;	// Contain data written at iobase + 0
394	unsigned char b_InterruptState;
395	unsigned char b_TimerInit;	// Specify if InitTimerWatchdog was load
396	unsigned char b_TimerStarted;	// Specify if timer 2 is running or not
397	unsigned char b_Timer2Mode;	// Specify the timer 2 mode
398	unsigned char b_Timer2Interrupt;	//Timer2  interrupt enable or disable
399	unsigned char b_AiCyclicAcquisition;	// indicate cyclic acquisition
400	unsigned char b_InterruptMode;	// eoc eos or dma
401	unsigned char b_EocEosInterrupt;	// Enable disable eoc eos interrupt
402	unsigned int ui_EocEosConversionTime;
403	unsigned char b_EocEosConversionTimeBase;
404	unsigned char b_SingelDiff;
405	unsigned char b_ExttrigEnable;	/* To enable or disable external trigger */
406
407	/* Pointer to the current process */
408	struct task_struct *tsk_Current;
409	struct addi_board *ps_BoardInfo;
410
411	/* Hardware board infos for 1710 */
412	struct {
413		unsigned int ui_Address;	/* Board address */
414		unsigned int ui_FlashAddress;
415		unsigned char b_InterruptNbr;	/* Board interrupt number */
416		unsigned char b_SlotNumber;	/* PCI slot number */
417		unsigned char b_BoardVersion;
418		unsigned int dw_MolduleConfiguration[4];	/* Module config */
419	} s_BoardInfos;
420
421	/* Interrupt infos */
422	struct {
423		unsigned int ul_InterruptOccur;	/* 0   : No interrupt occur */
424						/* > 0 : Interrupt occur */
425		unsigned int ui_Read;	/* Read FIFO */
426		unsigned int ui_Write;	/* Write FIFO */
427		struct {
428			unsigned char b_OldModuleMask;
429			unsigned int ul_OldInterruptMask;	/* Interrupt mask */
430			unsigned int ul_OldCounterLatchValue;	/* Interrupt counter value */
431		} s_FIFOInterruptParameters[APCI1710_SAVE_INTERRUPT];
432	} s_InterruptParameters;
433
434	str_ModuleInfo s_ModuleInfo[4];
435	unsigned int ul_TTLPortConfiguration[10];
436
437} addi_private;
438
439static unsigned short pci_list_builded;	/* set to 1 when list of card is known */
440
441/* Function declarations */
442static int i_ADDI_Attach(struct comedi_device *dev, struct comedi_devconfig *it);
443static int i_ADDI_Detach(struct comedi_device *dev);
444static int i_ADDI_Reset(struct comedi_device *dev);
445
446static irqreturn_t v_ADDI_Interrupt(int irq, void *d PT_REGS_ARG);
447static int i_ADDIDATA_InsnReadEeprom(struct comedi_device *dev, struct comedi_subdevice *s,
448				     struct comedi_insn *insn, unsigned int *data);
449