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