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

Subversion Repositories usb_fpga_1_2

[/] [usb_fpga_1_2/] [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
   ZTEX Firmware Kit for EZ-USB Microcontrollers
3 4 ZTEX
   Copyright (C) 2009-2010 ZTEX e.K.
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
xdata WORD eeprom_addr;
33
xdata WORD eeprom_write_bytes;
34
xdata BYTE eeprom_write_checksum;
35
 
36 3 ZTEX
 
37 2 ZTEX
/* *********************************************************************
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
BYTE eeprom_select ( BYTE to, BYTE stop ) {
104
    BYTE toc = 0;
105
eeprom_select_start:
106
    I2CS |= bmBIT7;             // start bit
107
    i2c_waitStart();
108
    I2DAT = EEPROM_ADDR;        // select device for writing
109
    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 5 ZTEX
    if ( length == 0 )
135
        return 0;
136
 
137 2 ZTEX
    if ( eeprom_select(100,0) )
138
        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
/* Writes <length> bytes from buf to and write them EEPROM address <addr>.
176
   <length> must be smaller or equal than 64. Returns the number of bytes
177
   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
    if ( eeprom_select(100,0) )
182
        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 3 ZTEX
    b = ep0_payload_transfer;
209 2 ZTEX
    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
    EP0BUF[3] = eeprom_select(0,1);                      // 1 means busy or error
248
    EP0BCH = 0;
249
    EP0BCL = 4;
250
,,));;
251
 
252
 
253
#endif  /*ZTEX_EEPROM_H*/

powered by: WebSVN 2.1.0

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