OpenCores
URL https://opencores.org/ocsvn/usb_fpga_1_11/usb_fpga_1_11/trunk

Subversion Repositories usb_fpga_1_11

[/] [usb_fpga_1_11/] [trunk/] [include/] [ztex-eeprom.h] - Blame information for rev 5

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
/*!
2 5 ZTEX
   ZTEX Firmware Kit for EZ-USB FX2 Microcontrollers
3
   Copyright (C) 2009-2011 ZTEX GmbH.
4 2 ZTEX
   http://www.ztex.de
5
 
6
   This program is free software; you can redistribute it and/or modify
7
   it under the terms of the GNU General Public License version 3 as
8
   published by the Free Software Foundation.
9
 
10
   This program is distributed in the hope that it will be useful, but
11
   WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
   General Public License for more details.
14
 
15
   You should have received a copy of the GNU General Public License
16
   along with this program; if not, see http://www.gnu.org/licenses/.
17
!*/
18
 
19
/*
20
    EEPROM support an some I2C helper routines
21
*/
22
 
23
#ifndef[ZTEX_EEPROM_H]
24
#define[ZTEX_EEPROM_H]
25
 
26
#define[@CAPABILITY_EEPROM;]
27
#define[EEPROM_ADDR][0xA2]
28
 
29
/* *********************************************************************
30
   ***** global variables **********************************************
31
   ********************************************************************* */
32 5 ZTEX
__xdata WORD eeprom_addr;
33
__xdata WORD eeprom_write_bytes;
34
__xdata BYTE eeprom_write_checksum;
35 2 ZTEX
 
36
 
37
/* *********************************************************************
38
   ***** i2c_waitWrite *************************************************
39
   ********************************************************************* */
40
/* Do the necessary steps after writing I2DAT register. Returns 1 on error. */
41
BYTE i2c_waitWrite()
42
{
43
    unsigned char i2csbuf,toc;
44
    for ( toc=0; toc<255 && !(I2CS & bmBIT0); toc++ );
45
    i2csbuf = I2CS;
46
    if ( (i2csbuf & bmBIT2) || (!(i2csbuf & bmBIT1)) ) {
47
        I2CS |= bmBIT6;
48
        return 1;
49
    }
50
    return 0;
51
}
52
 
53
/* *********************************************************************
54
   ***** i2c_waitRead **************************************************
55
   ********************************************************************* */
56
/* Do the necessary steps after reading I2DAT register. Returns 1 on error. */
57
BYTE i2c_waitRead(void)
58
{
59
    unsigned char i2csbuf, toc;
60
    for ( toc=0; toc<255 && !(I2CS & bmBIT0); toc++ );
61
    i2csbuf = I2CS;
62
    if (i2csbuf & bmBIT2) {
63
        I2CS |= bmBIT6;
64
        return 1;
65
    }
66
    return 0;
67
}
68
 
69
/* *********************************************************************
70
   ***** i2c_waitStart *************************************************
71
   ********************************************************************* */
72
/* Do the necessary steps after start bit. Returns 1 on error. */
73
BYTE i2c_waitStart()
74
{
75
    BYTE toc;
76
    for ( toc=0; toc<255; toc++ ) {
77
        if ( ! (I2CS & bmBIT2) )
78
            return 0;
79
    }
80
    return 1;
81
}
82
 
83
/* *********************************************************************
84
   ***** i2c_waitStop **************************************************
85
   ********************************************************************* */
86
/* Do the necessary steps after stop bit. Returns 1 on error. */
87
BYTE i2c_waitStop()
88
{
89
    BYTE toc;
90
    for ( toc=0; toc<255; toc++ ) {
91
        if ( ! (I2CS & bmBIT6) )
92
            return 0;
93
    }
94
    return 1;
95
}
96
 
97
/* *********************************************************************
98
   ***** eeprom_select *************************************************
99
   ********************************************************************* */
100
/* Select the EEPROM device, i.e. send the control Byte.
101
   <to> specifies the time to wait in 0.1ms steps if the EEPROM is busy (during a write cycle).
102
   if <stop>=0 no sop bit is sent. Returns 1 on error or if EEPROM is busy. */
103 5 ZTEX
BYTE eeprom_select (BYTE addr, BYTE to, BYTE stop ) {
104 2 ZTEX
    BYTE toc = 0;
105
eeprom_select_start:
106
    I2CS |= bmBIT7;             // start bit
107
    i2c_waitStart();
108 5 ZTEX
    I2DAT = addr;               // select device for writing
109 2 ZTEX
    if ( ! i2c_waitWrite() ) {
110
        if ( stop ) {
111
            I2CS |= bmBIT6;
112
            i2c_waitStop();
113
        }
114
        return 0;
115
    }
116
    else if (toc<to) {
117
        uwait(10);
118
        goto eeprom_select_start;
119
    }
120
    if ( stop ) {
121
        I2CS |= bmBIT6;
122
    }
123
    return 1;
124
}
125
 
126
/* *********************************************************************
127
   ***** eeprom_read ***************************************************
128
   ********************************************************************* */
129
/* Reads <length> bytes from EEPROM address <addr> and write them to buf.
130
   Returns the number of bytes read. This number is 0 during a write cycle. */
131
BYTE eeprom_read ( __xdata BYTE *buf, WORD addr, BYTE length ) {
132
    BYTE bytes = 0,i;
133
 
134 3 ZTEX
    if ( length == 0 )
135
        return 0;
136
 
137 5 ZTEX
    if ( eeprom_select(EEPROM_ADDR, 100,0) )
138 2 ZTEX
        goto eeprom_read_end;
139
 
140
    I2DAT = HI(addr);           // write address
141
    if ( i2c_waitWrite() ) goto eeprom_read_end;
142
    I2DAT = LO(addr);           // write address
143
    if ( i2c_waitWrite() ) goto eeprom_read_end;
144
    I2CS |= bmBIT6;
145
    i2c_waitStop();
146
 
147
    I2CS |= bmBIT7;             // start bit
148
    i2c_waitStart();
149
    I2DAT = EEPROM_ADDR | 1;    // select device for reading
150
    if ( i2c_waitWrite() ) goto eeprom_read_end;
151
 
152
    *buf = I2DAT;               // dummy read
153
    if ( i2c_waitRead()) goto eeprom_read_end;
154
    for (; bytes<length; bytes++ ) {
155
        *buf = I2DAT;           // read data
156
        buf++;
157
        if ( i2c_waitRead()) goto eeprom_read_end;
158
    }
159
 
160
    I2CS |= bmBIT5;             // no ACK
161
    i = I2DAT;                  // dummy read
162
    if ( i2c_waitRead()) goto eeprom_read_end;
163
 
164
    I2CS |= bmBIT6;             // stop bit
165
    i = I2DAT;                  // dummy read
166
    i2c_waitStop();
167
 
168
eeprom_read_end:
169
    return bytes;
170
}
171
 
172
/* *********************************************************************
173
   ***** eeprom_write **************************************************
174
   ********************************************************************* */
175 5 ZTEX
/* Writes <length> bytes from buf to EEPROM address <addr>.
176
   <length> must be smaller or equal than 8. Returns the number of bytes
177 2 ZTEX
   read. This number is 0 during a write cycle. */
178
BYTE eeprom_write ( __xdata BYTE *buf, WORD addr, BYTE length ) {
179
    BYTE bytes = 0;
180
 
181 5 ZTEX
    if ( eeprom_select(EEPROM_ADDR, 100,0) )
182 2 ZTEX
        goto eeprom_write_end;
183
 
184
    I2DAT = HI(addr);           // write address
185
    if ( i2c_waitWrite() ) goto eeprom_write_end;
186
    I2DAT = LO(addr);           // write address
187
    if ( i2c_waitWrite() ) goto eeprom_write_end;
188
 
189
    for (; bytes<length; bytes++ ) {
190
        I2DAT = *buf;           // write data 
191
        eeprom_write_checksum += *buf;
192
        buf++;
193
        eeprom_write_bytes+=1;
194
        if ( i2c_waitWrite() ) goto eeprom_write_end;
195
    }
196
    I2CS |= bmBIT6;             // stop bit
197
    i2c_waitStop();
198
 
199
eeprom_write_end:
200
    return bytes;
201
}
202
 
203
/* *********************************************************************
204
   ***** EP0 vendor request 0x38 ***************************************
205
   ********************************************************************* */
206
BYTE eeprom_read_ep0 () {
207
    BYTE i, b;
208
    b = ep0_payload_transfer;
209
    i = eeprom_read(EP0BUF, eeprom_addr, b);
210
    eeprom_addr += b;
211
    return i;
212
}
213
 
214
ADD_EP0_VENDOR_REQUEST((0x38,,                          // read from EEPROM
215
    eeprom_addr =  (SETUPDAT[3] << 8) | SETUPDAT[2];    // Address
216
    EP0BCH = 0;
217
    EP0BCL = eeprom_read_ep0();
218
,,
219
    EP0BCH = 0;
220
    EP0BCL = eeprom_read_ep0();
221
));;
222
 
223
 
224
/* *********************************************************************
225
   ***** EP0 vendor command 0x39 ***************************************
226
   ********************************************************************* */
227
void eeprom_write_ep0 ( BYTE length ) {
228
    eeprom_write(EP0BUF, eeprom_addr, length);
229
    eeprom_addr += length;
230
}
231
 
232
ADD_EP0_VENDOR_COMMAND((0x39,,                          // write to EEPROM
233
    eeprom_write_checksum = 0;
234
    eeprom_write_bytes = 0;
235
    eeprom_addr =  ( SETUPDAT[3] << 8) | SETUPDAT[2];   // Address
236
,,
237
    eeprom_write_ep0(EP0BCL);
238
    ));;
239
 
240
/* *********************************************************************
241
   ***** EP0 vendor request 0x3A ***************************************
242
   ********************************************************************* */
243
ADD_EP0_VENDOR_REQUEST((0x3A,,                          // EEPROM state
244
    EP0BUF[0] = LSB(eeprom_write_bytes);
245
    EP0BUF[1] = MSB(eeprom_write_bytes);
246
    EP0BUF[2] = eeprom_write_checksum;
247 5 ZTEX
    EP0BUF[3] = eeprom_select(EEPROM_ADDR,0,1);          // 1 means busy or error
248 2 ZTEX
    EP0BCH = 0;
249
    EP0BCL = 4;
250
,,));;
251
 
252
 
253 5 ZTEX
#ifdef[MAC_EEPROM_ENABLED]
254
#define[EEPROM_MAC_ADDR][0xA6]
255
#define[@CAPABILITY_MAC_EEPROM;]
256
 
257
__xdata BYTE mac_eeprom_addr;
258
 
259
/* *********************************************************************
260
   ***** mac_eeprom_read ***********************************************
261
   ********************************************************************* */
262
/* Reads <length> bytes from EEPROM address <addr> and write them to buf.
263
   Returns the number of bytes read. This number is 0 during a write cycle. */
264
BYTE mac_eeprom_read ( __xdata BYTE *buf, BYTE addr, BYTE length ) {
265
    BYTE bytes = 0,i;
266
 
267
    if ( length == 0 )
268
        return 0;
269
 
270
    if ( eeprom_select(EEPROM_MAC_ADDR, 100,0) )
271
        goto mac_eeprom_read_end;
272
 
273
    I2DAT = addr;               // write address
274
    if ( i2c_waitWrite() ) goto mac_eeprom_read_end;
275
    I2CS |= bmBIT6;
276
    i2c_waitStop();
277
 
278
 
279
    I2CS |= bmBIT7;             // start bit
280
    i2c_waitStart();
281
    I2DAT = EEPROM_MAC_ADDR | 1;  // select device for reading
282
    if ( i2c_waitWrite() ) goto mac_eeprom_read_end;
283
 
284
    *buf = I2DAT;               // dummy read
285
    if ( i2c_waitRead()) goto mac_eeprom_read_end;
286
    for (; bytes<length; bytes++ ) {
287
        *buf = I2DAT;           // read data
288
        buf++;
289
        if ( i2c_waitRead()) goto mac_eeprom_read_end;
290
    }
291
 
292
    I2CS |= bmBIT5;             // no ACK
293
    i = I2DAT;                  // dummy read
294
    if ( i2c_waitRead()) goto mac_eeprom_read_end;
295
 
296
    I2CS |= bmBIT6;             // stop bit
297
    i = I2DAT;                  // dummy read
298
    i2c_waitStop();
299
 
300
mac_eeprom_read_end:
301
    return bytes;
302
}
303
 
304
/* *********************************************************************
305
   ***** mac_eeprom_write **********************************************
306
   ********************************************************************* */
307
/* Writes <length> bytes from buf to and write them EEPROM address <addr>.
308
   <length> must be smaller or equal than 8. Returns the number of bytes
309
   read. This number is 0 during a write cycle. */
310
BYTE mac_eeprom_write ( __xdata BYTE *buf, BYTE addr, BYTE length ) {
311
    BYTE bytes = 0;
312
 
313
    if ( eeprom_select(EEPROM_MAC_ADDR, 100,0) )
314
        goto mac_eeprom_write_end;
315
 
316
    I2DAT = addr;               // write address
317
    if ( i2c_waitWrite() ) goto mac_eeprom_write_end;
318
 
319
    for (; bytes<length; bytes++ ) {
320
        I2DAT = *buf;           // write data 
321
        buf++;
322
        if ( i2c_waitWrite() ) goto mac_eeprom_write_end;
323
    }
324
    I2CS |= bmBIT6;             // stop bit
325
    i2c_waitStop();
326
 
327
mac_eeprom_write_end:
328
    return bytes;
329
}
330
 
331
/* *********************************************************************
332
   ***** EP0 vendor request 0x3B ***************************************
333
   ********************************************************************* */
334
BYTE mac_eeprom_read_ep0 () {
335
    BYTE i, b;
336
    b = ep0_payload_transfer;
337
    i = mac_eeprom_read(EP0BUF, mac_eeprom_addr, b);
338
    return i;
339
}
340
 
341
ADD_EP0_VENDOR_REQUEST((0x3B,,                          // read from EEPROM
342
    mac_eeprom_addr =  SETUPDAT[2];                     // Address
343
    EP0BCH = 0;
344
    EP0BCL = mac_eeprom_read_ep0();
345
,,
346
    EP0BCH = 0;
347
    EP0BCL = mac_eeprom_read_ep0();
348
));;
349
 
350
 
351
/* *********************************************************************
352
   ***** EP0 vendor command 0x3C ***************************************
353
   ********************************************************************* */
354
ADD_EP0_VENDOR_COMMAND((0x3C,,                          // write to EEPROM
355
    mac_eeprom_addr =  SETUPDAT[2];                     // address
356
,,
357
    mac_eeprom_write(EP0BUF, mac_eeprom_addr, EP0BCL);
358
    ));;
359
 
360
/* *********************************************************************
361
   ***** EP0 vendor request 0x3D ***************************************
362
   ********************************************************************* */
363
ADD_EP0_VENDOR_REQUEST((0x3D,,                          // EEPROM state
364
    EP0BUF[0] = eeprom_select(EEPROM_MAC_ADDR,0,1);       // 1 means busy or error
365
    EP0BCH = 0;
366
    EP0BCL = 1;
367
,,));;
368
 
369
 
370
#endif // MAC_EEPROM_ENABLED
371
 
372 2 ZTEX
#endif  /*ZTEX_EEPROM_H*/

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.