addi_amcc_S5920.c revision da91b2692e0939b307f9047192d2b9fe07793e7a
1/**
2@verbatim
3
4Copyright (C) 2004,2005  ADDI-DATA GmbH for the source code of this module.
5
6        ADDI-DATA GmbH
7        Dieselstrasse 3
8        D-77833 Ottersweier
9        Tel: +19(0)7223/9493-0
10        Fax: +49(0)7223/9493-92
11        http://www.addi-data-com
12        info@addi-data.com
13
14This 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.
15
16This 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.
17
18You 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
19
20You shoud also find the complete GPL in the COPYING file accompanying this source code.
21
22@endverbatim
23*/
24/*
25  +-----------------------------------------------------------------------+
26  | (C) ADDI-DATA GmbH          Dieselstraße 3       D-77833 Ottersweier  |
27  +-----------------------------------------------------------------------+
28  | Tel : +49 (0) 7223/9493-0     | email    : info@addi-data.com         |
29  | Fax : +49 (0) 7223/9493-92    | Internet : http://www.addi-data.com   |
30  +-------------------------------+---------------------------------------+
31  | Project : ADDI HEADER READ WRITER |     Compiler   : Visual C++       |
32  | Module name : S5920.cpp           |     Version    : 6.0              |
33  +-------------------------------+---------------------------------------+
34  | Author : E. LIBS                      Date : 02/05/2002               |
35  +-----------------------------------------------------------------------+
36  | Description   : DLL with the S5920 PCI Controller functions           |
37  +-----------------------------------------------------------------------+
38  |                             UPDATE'S                                  |
39  +-----------------------------------------------------------------------+
40  |   Date   |   Author  |          Description of updates                |
41  +----------+-----------+------------------------------------------------+
42  | 28/08/02 | LIBS Eric | Add return codes each time a function of the   |
43  |          |           | Addi Library is called                         |
44  +-----------------------------------------------------------------------+
45  | 31/07/03 | KRAUTH J. | Changes for the MSX-Box                        |
46  +-----------------------------------------------------------------------+
47*/
48
49#include "addi_amcc_S5920.h"
50
51/*+----------------------------------------------------------------------------+*/
52/*| Function   Name   : int i_AddiHeaderRW_ReadEeprom                          |*/
53/*|                               (int    i_NbOfWordsToRead,                   |*/
54/*|                                unsigned int dw_PCIBoardEepromAddress,             |*/
55/*|                                unsigned short   w_EepromStartAddress,                |*/
56/*|                                unsigned short * pw_DataRead)                          |*/
57/*+----------------------------------------------------------------------------+*/
58/*| Task              : Read word from the 5920 eeprom.                        |*/
59/*+----------------------------------------------------------------------------+*/
60/*| Input Parameters  : int    i_NbOfWordsToRead : Nbr. of word to read        |*/
61/*|                     unsigned int dw_PCIBoardEepromAddress : Address of the eeprom |*/
62/*|                     unsigned short   w_EepromStartAddress : Eeprom strat address     |*/
63/*+----------------------------------------------------------------------------+*/
64/*| Output Parameters : unsigned short * pw_DataRead : Read data                          |*/
65/*+----------------------------------------------------------------------------+*/
66/*| Return Value      : -                                                      |*/
67/*+----------------------------------------------------------------------------+*/
68
69int i_AddiHeaderRW_ReadEeprom(int i_NbOfWordsToRead,
70	unsigned int dw_PCIBoardEepromAddress,
71	unsigned short w_EepromStartAddress, unsigned short *pw_DataRead)
72{
73	unsigned int dw_eeprom_busy = 0;
74	int i_Counter = 0;
75	int i_WordCounter;
76	int i;
77	unsigned char pb_ReadByte[1];
78	unsigned char b_ReadLowByte = 0;
79	unsigned char b_ReadHighByte = 0;
80	unsigned char b_SelectedAddressLow = 0;
81	unsigned char b_SelectedAddressHigh = 0;
82	unsigned short w_ReadWord = 0;
83
84	for (i_WordCounter = 0; i_WordCounter < i_NbOfWordsToRead;
85		i_WordCounter++) {
86		do {
87			dw_eeprom_busy =
88				inl(dw_PCIBoardEepromAddress +
89				AMCC_OP_REG_MCSR);
90			dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
91		}
92		while (dw_eeprom_busy == EEPROM_BUSY);
93
94		for (i_Counter = 0; i_Counter < 2; i_Counter++) {
95			b_SelectedAddressLow = (w_EepromStartAddress + i_Counter) % 256;	/* Read the low 8 bit part */
96			b_SelectedAddressHigh = (w_EepromStartAddress + i_Counter) / 256;	/* Read the high 8 bit part */
97
98			/* Select the load low address mode */
99			outb(NVCMD_LOAD_LOW,
100				dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
101				3);
102
103			/* Wait on busy */
104			do {
105				dw_eeprom_busy =
106					inl(dw_PCIBoardEepromAddress +
107					AMCC_OP_REG_MCSR);
108				dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
109			}
110			while (dw_eeprom_busy == EEPROM_BUSY);
111
112			/* Load the low address */
113			outb(b_SelectedAddressLow,
114				dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
115				2);
116
117			/* Wait on busy */
118			do {
119				dw_eeprom_busy =
120					inl(dw_PCIBoardEepromAddress +
121					AMCC_OP_REG_MCSR);
122				dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
123			}
124			while (dw_eeprom_busy == EEPROM_BUSY);
125
126			/* Select the load high address mode */
127			outb(NVCMD_LOAD_HIGH,
128				dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
129				3);
130
131			/* Wait on busy */
132			do {
133				dw_eeprom_busy =
134					inl(dw_PCIBoardEepromAddress +
135					AMCC_OP_REG_MCSR);
136				dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
137			}
138			while (dw_eeprom_busy == EEPROM_BUSY);
139
140			/* Load the high address */
141			outb(b_SelectedAddressHigh,
142				dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
143				2);
144
145			/* Wait on busy */
146			do {
147				dw_eeprom_busy =
148					inl(dw_PCIBoardEepromAddress +
149					AMCC_OP_REG_MCSR);
150				dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
151			}
152			while (dw_eeprom_busy == EEPROM_BUSY);
153
154			/* Select the READ mode */
155			outb(NVCMD_BEGIN_READ,
156				dw_PCIBoardEepromAddress + AMCC_OP_REG_MCSR +
157				3);
158
159			/* Wait on busy */
160			do {
161				dw_eeprom_busy =
162					inl(dw_PCIBoardEepromAddress +
163					AMCC_OP_REG_MCSR);
164				dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
165			}
166			while (dw_eeprom_busy == EEPROM_BUSY);
167
168			/* Read data into the EEPROM */
169			*pb_ReadByte =
170				inb(dw_PCIBoardEepromAddress +
171				AMCC_OP_REG_MCSR + 2);
172
173			/* Wait on busy */
174			do {
175				dw_eeprom_busy =
176					inl(dw_PCIBoardEepromAddress +
177					AMCC_OP_REG_MCSR);
178				dw_eeprom_busy = dw_eeprom_busy & EEPROM_BUSY;
179			}
180			while (dw_eeprom_busy == EEPROM_BUSY);
181
182			/* Select the upper address part */
183			if (i_Counter == 0) {
184				b_ReadLowByte = pb_ReadByte[0];
185			} else {
186				b_ReadHighByte = pb_ReadByte[0];
187			}
188
189			/* Sleep */
190			for (i = 0; i < 10000; i++) ;
191
192		}
193		w_ReadWord =
194			(b_ReadLowByte | (((unsigned short)b_ReadHighByte) *
195				256));
196
197		pw_DataRead[i_WordCounter] = w_ReadWord;
198
199		w_EepromStartAddress += 2;	/*  to read the next word */
200
201	}			/*  for (...) i_NbOfWordsToRead */
202	return (0);
203}
204