4
Copyright (C) 2004,2005 ADDI-DATA GmbH for the source code of this module.
10
Fax: +49(0)7223/9493-92
11
http://www.addi-data-com
14
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
16
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
18
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
You should also find the complete GPL in the COPYING file accompanying this source code.
26
+-----------------------------------------------------------------------+
27
| (C) ADDI-DATA GmbH Dieselstrasse 3 D-77833 Ottersweier |
28
+-----------------------------------------------------------------------+
29
| Tel : +49 (0) 7223/9493-0 | email : info@addi-data.com |
30
| Fax : +49 (0) 7223/9493-92 | Internet : http://www.addi-data.com |
31
+-----------------------------------------------------------------------+
32
| Project : ADDI DATA | Compiler : GCC |
33
| Modulname : addi_eeprom.c | Version : 2.96 |
34
+-------------------------------+---------------------------------------+
35
| Project manager: Eric Stolz | Date : 02/12/2002 |
36
+-----------------------------------------------------------------------+
37
| Description : ADDI EEPROM Module |
38
+-----------------------------------------------------------------------+
40
+-----------------------------------------------------------------------+
41
| Date | Author | Description of updates |
42
+----------+-----------+------------------------------------------------+
45
+----------+-----------+------------------------------------------------+
48
#define NVCMD_BEGIN_READ (0x7 << 5) /* nvRam begin read command */
49
#define NVCMD_LOAD_LOW (0x4 << 5) /* nvRam load low command */
50
#define NVCMD_LOAD_HIGH (0x5 << 5) /* nvRam load high command */
51
#define EE76_CMD_LEN 13 /* bits in instructions */
52
#define EE_READ 0x0180 /* 01 1000 0000 read instruction */
54
#define EEPROM_DIGITALINPUT 0
55
#define EEPROM_DIGITALOUTPUT 1
56
#define EEPROM_ANALOGINPUT 2
57
#define EEPROM_ANALOGOUTPUT 3
58
#define EEPROM_TIMER 4
59
#define EEPROM_WATCHDOG 5
60
#define EEPROM_TIMER_WATCHDOG_COUNTER 10
62
struct str_Functionality {
64
unsigned short w_Address;
67
struct str_MainHeader {
68
unsigned short w_HeaderSize;
69
unsigned char b_Nfunctions;
70
struct str_Functionality s_Functions[7];
73
struct str_DigitalInputHeader {
74
unsigned short w_Nchannel;
75
unsigned char b_Interruptible;
76
unsigned short w_NinterruptLogic;
79
struct str_DigitalOutputHeader {
81
unsigned short w_Nchannel;
85
/* used for timer as well as watchdog */
87
struct str_TimerDetails {
89
unsigned short w_HeaderSize;
90
unsigned char b_Resolution;
91
unsigned char b_Mode; /* in case of Watchdog it is functionality */
92
unsigned short w_MinTiming;
93
unsigned char b_TimeBase;
96
struct str_TimerMainHeader {
99
unsigned short w_Ntimer;
100
struct str_TimerDetails s_TimerDetails[4]; /* supports 4 timers */
105
unsigned short w_Nchannel;
106
unsigned char b_Resolution;
107
} str_AnalogOutputHeader;
109
struct str_AnalogInputHeader {
110
unsigned short w_Nchannel;
111
unsigned short w_MinConvertTiming;
112
unsigned short w_MinDelayTiming;
113
unsigned char b_HasDma;
114
unsigned char b_Resolution;
118
/*****************************************/
119
/* Read Header Functions */
120
/*****************************************/
122
int i_EepromReadMainHeader(unsigned short w_PCIBoardEepromAddress,
123
char *pc_PCIChipInformation, struct comedi_device *dev);
125
int i_EepromReadDigitalInputHeader(unsigned short w_PCIBoardEepromAddress,
126
char *pc_PCIChipInformation, unsigned short w_Address,
127
struct str_DigitalInputHeader *s_Header);
129
int i_EepromReadDigitalOutputHeader(unsigned short w_PCIBoardEepromAddress,
130
char *pc_PCIChipInformation, unsigned short w_Address,
131
struct str_DigitalOutputHeader *s_Header);
133
int i_EepromReadTimerHeader(unsigned short w_PCIBoardEepromAddress,
134
char *pc_PCIChipInformation, unsigned short w_Address,
135
struct str_TimerMainHeader *s_Header);
137
int i_EepromReadAnlogOutputHeader(unsigned short w_PCIBoardEepromAddress,
138
char *pc_PCIChipInformation, unsigned short w_Address,
139
str_AnalogOutputHeader *s_Header);
141
int i_EepromReadAnlogInputHeader(unsigned short w_PCIBoardEepromAddress,
142
char *pc_PCIChipInformation, unsigned short w_Address,
143
struct str_AnalogInputHeader *s_Header);
145
/******************************************/
146
/* Eeprom Specific Functions */
147
/******************************************/
148
unsigned short w_EepromReadWord(unsigned short w_PCIBoardEepromAddress, char *pc_PCIChipInformation,
149
unsigned short w_EepromStartAddress);
150
void v_EepromWaitBusy(unsigned short w_PCIBoardEepromAddress);
151
void v_EepromClock76(unsigned int dw_Address, unsigned int dw_RegisterValue);
152
void v_EepromWaitBusy(unsigned short w_PCIBoardEepromAddress);
153
void v_EepromSendCommand76(unsigned int dw_Address, unsigned int dw_EepromCommand,
154
unsigned char b_DataLengthInBits);
155
void v_EepromCs76Read(unsigned int dw_Address, unsigned short w_offset, unsigned short *pw_Value);
158
+----------------------------------------------------------------------------+
159
| Function Name : unsigned short w_EepromReadWord |
160
| (unsigned short w_PCIBoardEepromAddress, |
161
| char * pc_PCIChipInformation, |
162
| unsigned short w_EepromStartAddress) |
163
+----------------------------------------------------------------------------+
164
| Task : Read from eepromn a word |
165
+----------------------------------------------------------------------------+
166
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom address |
168
| char *pc_PCIChipInformation : PCI Chip Type. |
170
| unsigned short w_EepromStartAddress : Selected eeprom address |
171
+----------------------------------------------------------------------------+
172
| Output Parameters : - |
173
+----------------------------------------------------------------------------+
174
| Return Value : Read word value from eeprom |
175
+----------------------------------------------------------------------------+
178
unsigned short w_EepromReadWord(unsigned short w_PCIBoardEepromAddress, char *pc_PCIChipInformation,
179
unsigned short w_EepromStartAddress)
182
unsigned char b_Counter = 0;
184
unsigned char b_ReadByte = 0;
186
unsigned char b_ReadLowByte = 0;
188
unsigned char b_ReadHighByte = 0;
190
unsigned char b_SelectedAddressLow = 0;
192
unsigned char b_SelectedAddressHigh = 0;
194
unsigned short w_ReadWord = 0;
196
/**************************/
198
/* Test the PCI chip type */
200
/**************************/
202
if ((!strcmp(pc_PCIChipInformation, "S5920")) ||
203
(!strcmp(pc_PCIChipInformation, "S5933")))
206
for (b_Counter = 0; b_Counter < 2; b_Counter++)
209
b_SelectedAddressLow = (w_EepromStartAddress + b_Counter) % 256; /* Read the low 8 bit part */
211
b_SelectedAddressHigh = (w_EepromStartAddress + b_Counter) / 256; /* Read the high 8 bit part */
213
/************************************/
215
/* Select the load low address mode */
217
/************************************/
219
outb(NVCMD_LOAD_LOW, w_PCIBoardEepromAddress + 0x3F);
227
v_EepromWaitBusy(w_PCIBoardEepromAddress);
229
/************************/
231
/* Load the low address */
233
/************************/
235
outb(b_SelectedAddressLow,
236
w_PCIBoardEepromAddress + 0x3E);
244
v_EepromWaitBusy(w_PCIBoardEepromAddress);
246
/*************************************/
248
/* Select the load high address mode */
250
/*************************************/
252
outb(NVCMD_LOAD_HIGH, w_PCIBoardEepromAddress + 0x3F);
260
v_EepromWaitBusy(w_PCIBoardEepromAddress);
262
/*************************/
264
/* Load the high address */
266
/*************************/
268
outb(b_SelectedAddressHigh,
269
w_PCIBoardEepromAddress + 0x3E);
277
v_EepromWaitBusy(w_PCIBoardEepromAddress);
279
/************************/
281
/* Select the READ mode */
283
/************************/
285
outb(NVCMD_BEGIN_READ, w_PCIBoardEepromAddress + 0x3F);
293
v_EepromWaitBusy(w_PCIBoardEepromAddress);
295
/*****************************/
297
/* Read data into the EEPROM */
299
/*****************************/
301
b_ReadByte = inb(w_PCIBoardEepromAddress + 0x3E);
309
v_EepromWaitBusy(w_PCIBoardEepromAddress);
311
/*********************************/
313
/* Select the upper address part */
315
/*********************************/
320
b_ReadLowByte = b_ReadByte;
322
} /* if(b_Counter==0) */
327
b_ReadHighByte = b_ReadByte;
329
} /* if(b_Counter==0) */
331
} /* for (b_Counter=0; b_Counter<2; b_Counter++) */
333
w_ReadWord = (b_ReadLowByte | (((unsigned short) b_ReadHighByte) * 256));
335
} /* end of if ((!strcmp(pc_PCIChipInformation, "S5920")) || (!strcmp(pc_PCIChipInformation, "S5933"))) */
337
if (!strcmp(pc_PCIChipInformation, "93C76"))
340
/*************************************/
342
/* Read 16 bit from the EEPROM 93C76 */
344
/*************************************/
346
v_EepromCs76Read(w_PCIBoardEepromAddress, w_EepromStartAddress,
357
+----------------------------------------------------------------------------+
359
| Function Name : void v_EepromWaitBusy |
361
| (unsigned short w_PCIBoardEepromAddress) |
363
+----------------------------------------------------------------------------+
365
| Task : Wait the busy flag from PCI controller |
367
+----------------------------------------------------------------------------+
369
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom base address |
371
+----------------------------------------------------------------------------+
373
| Output Parameters : - |
375
+----------------------------------------------------------------------------+
379
+----------------------------------------------------------------------------+
383
void v_EepromWaitBusy(unsigned short w_PCIBoardEepromAddress)
386
unsigned char b_EepromBusy = 0;
397
/************************************************************************/
399
/* An error has been written in the AMCC 5933 book at the page B-13 */
401
/* Ex: if you read a byte and look for the busy statusEEPROM=0x80 and */
403
/* the operator register is AMCC_OP_REG_MCSR+3 */
405
/* unsigned short read EEPROM=0x8000 andAMCC_OP_REG_MCSR+2 */
407
/* unsigned int read EEPROM=0x80000000 and AMCC_OP_REG_MCSR */
409
/************************************************************************/
411
b_EepromBusy = inb(w_PCIBoardEepromAddress + 0x3F);
412
b_EepromBusy = b_EepromBusy & 0x80;
414
} while (b_EepromBusy == 0x80);
420
+---------------------------------------------------------------------------------+
422
| Function Name : void v_EepromClock76(unsigned int dw_Address, |
424
| unsigned int dw_RegisterValue) |
426
+---------------------------------------------------------------------------------+
428
| Task : This function sends the clocking sequence to the EEPROM. |
430
+---------------------------------------------------------------------------------+
432
| Input Parameters : unsigned int dw_Address : PCI eeprom base address |
434
| unsigned int dw_RegisterValue : PCI eeprom register value to write.|
436
+---------------------------------------------------------------------------------+
438
| Output Parameters : - |
440
+---------------------------------------------------------------------------------+
444
+---------------------------------------------------------------------------------+
448
void v_EepromClock76(unsigned int dw_Address, unsigned int dw_RegisterValue)
451
/************************/
453
/* Set EEPROM clock Low */
455
/************************/
457
outl(dw_RegisterValue & 0x6, dw_Address);
467
/*************************/
469
/* Set EEPROM clock High */
471
/*************************/
473
outl(dw_RegisterValue | 0x1, dw_Address);
487
+---------------------------------------------------------------------------------+
489
| Function Name : void v_EepromSendCommand76(unsigned int dw_Address, |
491
| unsigned int dw_EepromCommand, |
493
| unsigned char b_DataLengthInBits) |
495
+---------------------------------------------------------------------------------+
497
| Task : This function sends a Command to the EEPROM 93C76. |
499
+---------------------------------------------------------------------------------+
501
| Input Parameters : unsigned int dw_Address : PCI eeprom base address |
503
| unsigned int dw_EepromCommand : PCI eeprom command to write. |
505
| unsigned char b_DataLengthInBits : PCI eeprom command data length. |
507
+---------------------------------------------------------------------------------+
509
| Output Parameters : - |
511
+---------------------------------------------------------------------------------+
515
+---------------------------------------------------------------------------------+
519
void v_EepromSendCommand76(unsigned int dw_Address, unsigned int dw_EepromCommand,
520
unsigned char b_DataLengthInBits)
525
unsigned int dw_RegisterValue = 0;
527
/*****************************/
529
/* Enable EEPROM Chip Select */
531
/*****************************/
533
dw_RegisterValue = 0x2;
535
/********************************************************************/
537
/* Toggle EEPROM's Chip select to get it out of Shift Register Mode */
539
/********************************************************************/
541
outl(dw_RegisterValue, dw_Address);
551
/*******************************************/
553
/* Send EEPROM command - one bit at a time */
555
/*******************************************/
557
for (c_BitPos = (b_DataLengthInBits - 1); c_BitPos >= 0; c_BitPos--)
560
/**********************************/
562
/* Check if current bit is 0 or 1 */
564
/**********************************/
566
if (dw_EepromCommand & (1 << c_BitPos))
575
dw_RegisterValue = dw_RegisterValue | 0x4;
588
dw_RegisterValue = dw_RegisterValue & 0x3;
592
/*********************/
594
/* Write the command */
596
/*********************/
598
outl(dw_RegisterValue, dw_Address);
608
/****************************/
610
/* Trigger the EEPROM clock */
612
/****************************/
614
v_EepromClock76(dw_Address, dw_RegisterValue);
622
+---------------------------------------------------------------------------------+
624
| Function Name : void v_EepromCs76Read(unsigned int dw_Address, |
626
| unsigned short w_offset, |
628
| unsigned short * pw_Value) |
630
+---------------------------------------------------------------------------------+
632
| Task : This function read a value from the EEPROM 93C76. |
634
+---------------------------------------------------------------------------------+
636
| Input Parameters : unsigned int dw_Address : PCI eeprom base address |
638
| unsigned short w_offset : Offset of the adress to read |
640
| unsigned short * pw_Value : PCI eeprom 16 bit read value. |
642
+---------------------------------------------------------------------------------+
644
| Output Parameters : - |
646
+---------------------------------------------------------------------------------+
650
+---------------------------------------------------------------------------------+
654
void v_EepromCs76Read(unsigned int dw_Address, unsigned short w_offset, unsigned short *pw_Value)
659
unsigned int dw_RegisterValue = 0;
661
unsigned int dw_RegisterValueRead = 0;
663
/*************************************************/
665
/* Send EEPROM read command and offset to EEPROM */
667
/*************************************************/
669
v_EepromSendCommand76(dw_Address, (EE_READ << 4) | (w_offset / 2),
672
/*******************************/
674
/* Get the last register value */
676
/*******************************/
678
dw_RegisterValue = (((w_offset / 2) & 0x1) << 2) | 0x2;
680
/*****************************/
682
/* Set the 16-bit value of 0 */
684
/*****************************/
688
/************************/
690
/* Get the 16-bit value */
692
/************************/
694
for (c_BitPos = 0; c_BitPos < 16; c_BitPos++)
697
/****************************/
699
/* Trigger the EEPROM clock */
701
/****************************/
703
v_EepromClock76(dw_Address, dw_RegisterValue);
705
/**********************/
707
/* Get the result bit */
709
/**********************/
711
dw_RegisterValueRead = inl(dw_Address);
721
/***************************************/
723
/* Get bit value and shift into result */
725
/***************************************/
727
if (dw_RegisterValueRead & 0x8)
736
*pw_Value = (*pw_Value << 1) | 0x1;
749
*pw_Value = (*pw_Value << 1);
755
/*************************/
757
/* Clear all EEPROM bits */
759
/*************************/
761
dw_RegisterValue = 0x0;
763
/********************************************************************/
765
/* Toggle EEPROM's Chip select to get it out of Shift Register Mode */
767
/********************************************************************/
769
outl(dw_RegisterValue, dw_Address);
781
/******************************************/
782
/* EEPROM HEADER READ FUNCTIONS */
783
/******************************************/
786
+----------------------------------------------------------------------------+
787
| Function Name : int i_EepromReadMainHeader(unsigned short w_PCIBoardEepromAddress, |
788
| char * pc_PCIChipInformation,struct comedi_device *dev) |
789
+----------------------------------------------------------------------------+
790
| Task : Read from eeprom Main Header |
791
+----------------------------------------------------------------------------+
792
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom address |
794
| char *pc_PCIChipInformation : PCI Chip Type. |
796
| struct comedi_device *dev : comedi device structure |
798
+----------------------------------------------------------------------------+
799
| Output Parameters : - |
800
+----------------------------------------------------------------------------+
802
+----------------------------------------------------------------------------+
805
int i_EepromReadMainHeader(unsigned short w_PCIBoardEepromAddress,
806
char *pc_PCIChipInformation, struct comedi_device *dev)
808
unsigned short w_Temp, i, w_Count = 0;
809
unsigned int ui_Temp;
810
struct str_MainHeader s_MainHeader;
811
struct str_DigitalInputHeader s_DigitalInputHeader;
812
struct str_DigitalOutputHeader s_DigitalOutputHeader;
813
/* struct str_TimerMainHeader s_TimerMainHeader,s_WatchdogMainHeader; */
814
str_AnalogOutputHeader s_AnalogOutputHeader;
815
struct str_AnalogInputHeader s_AnalogInputHeader;
818
s_MainHeader.w_HeaderSize =
819
w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation,
822
/* Read nbr of functionality */
823
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
824
pc_PCIChipInformation, 0x100 + 10);
825
s_MainHeader.b_Nfunctions = (unsigned char) w_Temp & 0x00FF;
827
/* Read functionality details */
828
for (i = 0; i < s_MainHeader.b_Nfunctions; i++) {
830
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
831
pc_PCIChipInformation, 0x100 + 12 + w_Count);
832
s_MainHeader.s_Functions[i].b_Type = (unsigned char) w_Temp & 0x3F;
833
w_Count = w_Count + 2;
835
s_MainHeader.s_Functions[i].w_Address =
836
w_EepromReadWord(w_PCIBoardEepromAddress,
837
pc_PCIChipInformation, 0x100 + 12 + w_Count);
838
w_Count = w_Count + 2;
841
/* Display main header info */
842
for (i = 0; i < s_MainHeader.b_Nfunctions; i++) {
844
switch (s_MainHeader.s_Functions[i].b_Type) {
845
case EEPROM_DIGITALINPUT:
846
i_EepromReadDigitalInputHeader(w_PCIBoardEepromAddress,
847
pc_PCIChipInformation,
848
s_MainHeader.s_Functions[i].w_Address,
849
&s_DigitalInputHeader);
850
this_board->i_NbrDiChannel =
851
s_DigitalInputHeader.w_Nchannel;
854
case EEPROM_DIGITALOUTPUT:
855
i_EepromReadDigitalOutputHeader(w_PCIBoardEepromAddress,
856
pc_PCIChipInformation,
857
s_MainHeader.s_Functions[i].w_Address,
858
&s_DigitalOutputHeader);
859
this_board->i_NbrDoChannel =
860
s_DigitalOutputHeader.w_Nchannel;
861
ui_Temp = 0xffffffff;
862
this_board->i_DoMaxdata =
863
ui_Temp >> (32 - this_board->i_NbrDoChannel);
866
case EEPROM_ANALOGINPUT:
867
i_EepromReadAnlogInputHeader(w_PCIBoardEepromAddress,
868
pc_PCIChipInformation,
869
s_MainHeader.s_Functions[i].w_Address,
870
&s_AnalogInputHeader);
871
if (!(strcmp(this_board->pc_DriverName, "apci3200")))
872
this_board->i_NbrAiChannel =
873
s_AnalogInputHeader.w_Nchannel * 4;
875
this_board->i_NbrAiChannel =
876
s_AnalogInputHeader.w_Nchannel;
877
this_board->i_Dma = s_AnalogInputHeader.b_HasDma;
878
this_board->ui_MinAcquisitiontimeNs =
879
(unsigned int) s_AnalogInputHeader.w_MinConvertTiming *
881
this_board->ui_MinDelaytimeNs =
882
(unsigned int) s_AnalogInputHeader.w_MinDelayTiming *
885
this_board->i_AiMaxdata =
887
s_AnalogInputHeader.b_Resolution);
890
case EEPROM_ANALOGOUTPUT:
891
i_EepromReadAnlogOutputHeader(w_PCIBoardEepromAddress,
892
pc_PCIChipInformation,
893
s_MainHeader.s_Functions[i].w_Address,
894
&s_AnalogOutputHeader);
895
this_board->i_NbrAoChannel =
896
s_AnalogOutputHeader.w_Nchannel;
898
this_board->i_AoMaxdata =
900
s_AnalogOutputHeader.b_Resolution);
904
this_board->i_Timer = 1; /* Timer subdevice present */
907
case EEPROM_WATCHDOG:
908
this_board->i_Timer = 1; /* Timer subdevice present */
911
case EEPROM_TIMER_WATCHDOG_COUNTER:
912
this_board->i_Timer = 1; /* Timer subdevice present */
920
+----------------------------------------------------------------------------+
921
| Function Name : int i_EepromReadDigitalInputHeader(unsigned short |
922
| w_PCIBoardEepromAddress,char *pc_PCIChipInformation, |
923
| unsigned short w_Address,struct str_DigitalInputHeader *s_Header) |
925
+----------------------------------------------------------------------------+
926
| Task : Read Digital Input Header |
927
+----------------------------------------------------------------------------+
928
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom address |
930
| char *pc_PCIChipInformation : PCI Chip Type. |
932
| struct str_DigitalInputHeader *s_Header: Digita Input Header |
934
+----------------------------------------------------------------------------+
935
| Output Parameters : - |
936
+----------------------------------------------------------------------------+
938
+----------------------------------------------------------------------------+
940
int i_EepromReadDigitalInputHeader(unsigned short w_PCIBoardEepromAddress,
941
char *pc_PCIChipInformation, unsigned short w_Address,
942
struct str_DigitalInputHeader *s_Header)
944
unsigned short w_Temp;
946
/* read nbr of channels */
947
s_Header->w_Nchannel =
948
w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation,
949
0x100 + w_Address + 6);
951
/* interruptible or not */
952
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
953
pc_PCIChipInformation, 0x100 + w_Address + 8);
954
s_Header->b_Interruptible = (unsigned char) (w_Temp >> 7) & 0x01;
956
/* How many interruptible logic */
957
s_Header->w_NinterruptLogic =
958
w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation,
959
0x100 + w_Address + 10);
965
+----------------------------------------------------------------------------+
966
| Function Name : int i_EepromReadDigitalOutputHeader(unsigned short |
967
| w_PCIBoardEepromAddress,char *pc_PCIChipInformation, |
968
| unsigned short w_Address,struct str_DigitalOutputHeader *s_Header) |
970
+----------------------------------------------------------------------------+
971
| Task : Read Digital Output Header |
972
+----------------------------------------------------------------------------+
973
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom address |
975
| char *pc_PCIChipInformation : PCI Chip Type. |
977
| struct str_DigitalOutputHeader *s_Header: Digital Output Header|
979
+----------------------------------------------------------------------------+
980
| Output Parameters : - |
981
+----------------------------------------------------------------------------+
983
+----------------------------------------------------------------------------+
985
int i_EepromReadDigitalOutputHeader(unsigned short w_PCIBoardEepromAddress,
986
char *pc_PCIChipInformation, unsigned short w_Address,
987
struct str_DigitalOutputHeader *s_Header)
989
/* Read Nbr channels */
990
s_Header->w_Nchannel =
991
w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation,
992
0x100 + w_Address + 6);
997
+----------------------------------------------------------------------------+
998
| Function Name : int i_EepromReadTimerHeader(unsigned short w_PCIBoardEepromAddress, |
999
| char *pc_PCIChipInformation,WORD w_Address, |
1000
| struct str_TimerMainHeader *s_Header) |
1001
+----------------------------------------------------------------------------+
1002
| Task : Read Timer or Watchdog Header |
1003
+----------------------------------------------------------------------------+
1004
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom address |
1006
| char *pc_PCIChipInformation : PCI Chip Type. |
1008
| struct str_TimerMainHeader *s_Header: Timer Header |
1010
+----------------------------------------------------------------------------+
1011
| Output Parameters : - |
1012
+----------------------------------------------------------------------------+
1013
| Return Value : 0 |
1014
+----------------------------------------------------------------------------+
1016
int i_EepromReadTimerHeader(unsigned short w_PCIBoardEepromAddress,
1017
char *pc_PCIChipInformation, unsigned short w_Address,
1018
struct str_TimerMainHeader *s_Header)
1021
unsigned short i, w_Size = 0, w_Temp;
1023
/* Read No of Timer */
1024
s_Header->w_Ntimer =
1025
w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation,
1026
0x100 + w_Address + 6);
1027
/* Read header size */
1029
for (i = 0; i < s_Header->w_Ntimer; i++) {
1030
s_Header->s_TimerDetails[i].w_HeaderSize =
1031
w_EepromReadWord(w_PCIBoardEepromAddress,
1032
pc_PCIChipInformation,
1033
0x100 + w_Address + 8 + w_Size + 0);
1034
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
1035
pc_PCIChipInformation,
1036
0x100 + w_Address + 8 + w_Size + 2);
1038
/* Read Resolution */
1039
s_Header->s_TimerDetails[i].b_Resolution =
1040
(unsigned char) (w_Temp >> 10) & 0x3F;
1043
s_Header->s_TimerDetails[i].b_Mode =
1044
(unsigned char) (w_Temp >> 4) & 0x3F;
1046
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
1047
pc_PCIChipInformation,
1048
0x100 + w_Address + 8 + w_Size + 4);
1050
/* Read MinTiming */
1051
s_Header->s_TimerDetails[i].w_MinTiming = (w_Temp >> 6) & 0x3FF;
1054
s_Header->s_TimerDetails[i].b_TimeBase = (unsigned char) (w_Temp) & 0x3F;
1055
w_Size += s_Header->s_TimerDetails[i].w_HeaderSize;
1062
+----------------------------------------------------------------------------+
1063
| Function Name : int i_EepromReadAnlogOutputHeader(unsigned short |
1064
| w_PCIBoardEepromAddress,char *pc_PCIChipInformation, |
1065
| unsigned short w_Address,str_AnalogOutputHeader *s_Header) |
1066
+----------------------------------------------------------------------------+
1067
| Task : Read Nalog Output Header |
1068
+----------------------------------------------------------------------------+
1069
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom address |
1071
| char *pc_PCIChipInformation : PCI Chip Type. |
1073
| str_AnalogOutputHeader *s_Header:Anlog Output Header |
1075
+----------------------------------------------------------------------------+
1076
| Output Parameters : - |
1077
+----------------------------------------------------------------------------+
1078
| Return Value : 0 |
1079
+----------------------------------------------------------------------------+
1082
int i_EepromReadAnlogOutputHeader(unsigned short w_PCIBoardEepromAddress,
1083
char *pc_PCIChipInformation, unsigned short w_Address,
1084
str_AnalogOutputHeader *s_Header)
1086
unsigned short w_Temp;
1087
/* No of channels for 1st hard component */
1088
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
1089
pc_PCIChipInformation, 0x100 + w_Address + 10);
1090
s_Header->w_Nchannel = (w_Temp >> 4) & 0x03FF;
1091
/* Resolution for 1st hard component */
1092
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
1093
pc_PCIChipInformation, 0x100 + w_Address + 16);
1094
s_Header->b_Resolution = (unsigned char) (w_Temp >> 8) & 0xFF;
1099
+----------------------------------------------------------------------------+
1100
| Function Name : int i_EepromReadAnlogInputHeader(unsigned short |
1101
| w_PCIBoardEepromAddress,char *pc_PCIChipInformation, |
1102
| unsigned short w_Address,struct str_AnalogInputHeader *s_Header) |
1103
+----------------------------------------------------------------------------+
1104
| Task : Read Nalog Output Header |
1105
+----------------------------------------------------------------------------+
1106
| Input Parameters : unsigned short w_PCIBoardEepromAddress : PCI eeprom address |
1108
| char *pc_PCIChipInformation : PCI Chip Type. |
1110
| struct str_AnalogInputHeader *s_Header:Anlog Input Header |
1112
+----------------------------------------------------------------------------+
1113
| Output Parameters : - |
1114
+----------------------------------------------------------------------------+
1115
| Return Value : 0 |
1116
+----------------------------------------------------------------------------+
1119
/* Reads only for ONE hardware component */
1120
int i_EepromReadAnlogInputHeader(unsigned short w_PCIBoardEepromAddress,
1121
char *pc_PCIChipInformation, unsigned short w_Address,
1122
struct str_AnalogInputHeader *s_Header)
1124
unsigned short w_Temp, w_Offset;
1125
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
1126
pc_PCIChipInformation, 0x100 + w_Address + 10);
1127
s_Header->w_Nchannel = (w_Temp >> 4) & 0x03FF;
1128
s_Header->w_MinConvertTiming =
1129
w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation,
1130
0x100 + w_Address + 16);
1131
s_Header->w_MinDelayTiming =
1132
w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation,
1133
0x100 + w_Address + 30);
1134
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
1135
pc_PCIChipInformation, 0x100 + w_Address + 20);
1136
s_Header->b_HasDma = (w_Temp >> 13) & 0x01; /* whether dma present or not */
1138
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress, pc_PCIChipInformation, 0x100 + w_Address + 72); /* reading Y */
1139
w_Temp = w_Temp & 0x00FF;
1140
if (w_Temp) /* Y>0 */
1142
w_Offset = 74 + (2 * w_Temp) + (10 * (1 + (w_Temp / 16))); /* offset of first analog input single header */
1143
w_Offset = w_Offset + 2; /* resolution */
1147
w_Offset = w_Offset + 2; /* resolution */
1150
/* read Resolution */
1151
w_Temp = w_EepromReadWord(w_PCIBoardEepromAddress,
1152
pc_PCIChipInformation, 0x100 + w_Address + w_Offset);
1153
s_Header->b_Resolution = w_Temp & 0x001F; /* last 5 bits */