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

Subversion Repositories usb_fpga_2_14

[/] [usb_fpga_2_14/] [trunk/] [fx3/] [ztex-lsi.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 ZTEX
/*%
2
   ZTEX Firmware Kit for EZ-USB FX3 Microcontrollers
3
   Copyright (C) 2009-2017 ZTEX GmbH.
4
   http://www.ztex.de
5
 
6
   This Source Code Form is subject to the terms of the Mozilla Public
7
   License, v. 2.0. If a copy of the MPL was not distributed with this file,
8
   You can obtain one at http://mozilla.org/MPL/2.0/.
9
 
10
   Alternatively, the contents of this file may be used under the terms
11
   of the GNU General Public License Version 3, as described below:
12
 
13
   This program is free software; you can redistribute it and/or modify
14
   it under the terms of the GNU General Public License version 3 as
15
   published by the Free Software Foundation.
16
 
17
   This program is distributed in the hope that it will be useful, but
18
   WITHOUT ANY WARRANTY; without even the implied warranty of
19
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20
   General Public License for more details.
21
 
22
   You should have received a copy of the GNU General Public License
23
   along with this program; if not, see http://www.gnu.org/licenses/.
24
%*/
25
/*
26
    Implements the low speed interface of default firmware.
27
*/
28
 
29
/*
30
    The following macros (containing GPIO numbers) must be defined:
31
        GPIO_RESET
32
        GPIO_GPIO0
33
        GPIO_GPIO1
34
        GPIO_GPIO2
35
        GPIO_GPIO3
36
        GPIO_CLK
37
        GPIO_DATA
38
        GPIO_STOP
39
 
40
    This macros (containing Endpoint numbers) may be defined:
41
        OUT_ENDPOINT
42
        IN_ENDPOINT
43
*/
44
 
45
#ifndef _ZTEX_LSI_
46
#define _ZTEX_LSI_
47
#endif // _ZTEX_LSI_
48
 
49
#ifdef _ZTEX_INCLUDE_2_
50
#ifndef _ZTEX_LSI_2_
51
#define _ZTEX_LSI_2_
52
 
53
#ifndef OUT_ENDPOINT
54
#define OUT_ENDPOINT 255
55
#endif
56
 
57
#ifndef IN_NDPOINT
58
#define IN_NDPOINT 255
59
#endif
60
 
61
#define LSI_VERSION 1
62
#define LSI_SUB_VERSION 4
63
 
64
CyBool_t next_clk;
65
#define LSI_CLOCK { ztex_gpio_set(GPIO_CLK, next_clk); next_clk=!next_clk; }
66
 
67
// VC 0x60
68
// value != 0: reset signal is left active 
69
uint8_t vc_default_reset(uint16_t value, uint16_t index, uint16_t length ) {
70
    if ( length>0 ) {
71
        CyU3PUsbGetEP0Data (length, ztex_ep0buf, NULL);  // there should be no data
72
    } else {
73
        CyU3PUsbAckSetup();
74
    }
75
    ztex_gpio_set(GPIO_RESET, CyTrue);
76
 
77
    if ( value ) return 0;
78
    CyU3PThreadSleep(1);
79
    ztex_gpio_set(GPIO_RESET, CyFalse);
80
    return 0;
81
}
82
 
83
// VR 0x61
84
// index: mask
85
// value: value
86
uint8_t vr_default_gpio_ctl(uint16_t value, uint16_t index, uint16_t length ) {
87
    if (index & 1) ztex_gpio_set(GPIO_GPIO0, (value & 1) == 0);
88
    if (index & 2) ztex_gpio_set(GPIO_GPIO1, (value & 2) == 0);
89
    if (index & 4) ztex_gpio_set(GPIO_GPIO2, (value & 4) == 0);
90
    if (index & 8) ztex_gpio_set(GPIO_GPIO3, (value & 8) == 0);
91
    ztex_ep0buf[0] = ~(0xf0 | (ztex_gpio_get(GPIO_GPIO3)<<3) | (ztex_gpio_get(GPIO_GPIO2)<<2) | (ztex_gpio_get(GPIO_GPIO1)<<1) | ztex_gpio_get(GPIO_GPIO0) );
92
    ZTEX_REC_RET ( CyU3PUsbSendEP0Data( length, ztex_ep0buf ) );
93
    return 0;
94
}
95
 
96
// VC 0x62
97
// data format is 4 byte data (little endian) + 1 byte address
98
uint8_t vc_default_lsi_write(uint16_t value, uint16_t index, uint16_t length ) {
99
    ZTEX_REC_RET ( CyU3PUsbGetEP0Data (length, ztex_ep0buf, NULL) );
100
    LSI_CLOCK;
101
    for (int i=0; i+4<length; i+=5) {
102
        ztex_gpio_set(GPIO_STOP, CyFalse);
103
 
104
        for (int j=0; j<5; j++ ) {
105
            uint8_t b = ztex_ep0buf[i+j];
106
            for ( int k=0; k<8; k++ ) {
107
                ztex_gpio_set(GPIO_DATA, b & 1);
108
                LSI_CLOCK;
109
                b>>=1;
110
            }
111
        }
112
        ztex_gpio_set(GPIO_DATA, CyFalse);
113
        ztex_gpio_set(GPIO_STOP, CyTrue);
114
        LSI_CLOCK;
115
    }
116
    ztex_gpio_set(GPIO_STOP, CyFalse);
117
    return 0;
118
}
119
 
120
// VR 0x63
121
// data format is 4 byte data (little endian)
122
// FX3 and FPGA clock are asynchronous and there is no acknowledgment. For this reason 
123
// minimum recommended for the ZTEX LSI core is 20 MHz. For much slower clock this interface
124
// may be to fast.
125
uint8_t vr_default_lsi_read(uint16_t value, uint16_t index, uint16_t length ) {
126
    LSI_CLOCK;
127
    for (int i=0; i+3<length; i+=4) {
128
        ztex_gpio_set(GPIO_STOP, CyFalse);
129
 
130
        uint8_t b = index++;
131
        for (int k=0; k<8; k++) {
132
            ztex_gpio_set(GPIO_DATA, b & 1);
133
            LSI_CLOCK;
134
            b>>=1;
135
        }
136
 
137
        ztex_gpio_set(GPIO_DATA, CyTrue);
138
        ztex_gpio_set(GPIO_STOP, CyTrue);
139
        LSI_CLOCK;
140
        for (int j=0; j<64; j++ ) {}        // give FPGA some extra time to load data
141
 
142
        for (int j=0; j<4; j++ ) {
143
            b=0;
144
            for (int k=0; k<8; k++) {
145
                b = ( b >> 1 ) | ( ztex_gpio_get(GPIO_DATA) << 7);
146
                LSI_CLOCK;
147
            }
148
            ztex_ep0buf[i+j] = b;
149
        }
150
    }
151
    ztex_gpio_set(GPIO_STOP, CyFalse);
152
    ZTEX_REC_RET ( CyU3PUsbSendEP0Data( length, ztex_ep0buf ) );
153
    return 0;
154
}
155
 
156
// VR 0x64
157
uint8_t vr_default_info(uint16_t value, uint16_t index, uint16_t length ) {
158
    ztex_ep0buf[0] = LSI_VERSION;
159
    ztex_ep0buf[1] = OUT_ENDPOINT;      // OUT Endpoint
160
    ztex_ep0buf[2] = IN_ENDPOINT;       // IN Endpoint
161
    ztex_ep0buf[3] = LSI_SUB_VERSION;
162
    ztex_ep0buf[4] = 0;                  // reserved for future use
163
    ztex_ep0buf[5] = 0;                  // reserved for future use
164
    ztex_ep0buf[6] = 0;                  // reserved for future use
165
    ztex_ep0buf[7] = 0;                  // reserved for future use
166
    if (length>8) length = 8;
167
    ZTEX_REC_RET( CyU3PUsbSendEP0Data( length, ztex_ep0buf ) );
168
    return 0;
169
}
170
 
171
 
172
void ztex_lsi_init () {
173
    ztex_register_vendor_cmd(0x60, vc_default_reset);
174
    ztex_register_vendor_req(0x61, vr_default_gpio_ctl);
175
    ztex_register_vendor_cmd(0x62, vc_default_lsi_write);
176
    ztex_register_vendor_req(0x63, vr_default_lsi_read);
177
    ztex_register_vendor_req(0x64, vr_default_info);
178
}
179
 
180
 
181
// reset signal is left active 
182
void ztex_lsi_start() {
183
    ztex_gpio_set_output(GPIO_RESET, CyTrue);
184
 
185
    ztex_gpio_set_open_drain(GPIO_GPIO0, CyTrue);
186
    ztex_gpio_set_open_drain(GPIO_GPIO1, CyTrue);
187
    ztex_gpio_set_open_drain(GPIO_GPIO2, CyTrue);
188
    ztex_gpio_set_open_drain(GPIO_GPIO3, CyTrue);
189
 
190
    ztex_gpio_set_output(GPIO_CLK, CyFalse); next_clk=CyTrue;
191
    ztex_gpio_set_open_drain(GPIO_DATA, CyTrue);
192
    ztex_gpio_set_output(GPIO_STOP, CyFalse);
193
}
194
 
195
 
196
void ztex_lsi_stop() {
197
    ztex_gpio_set_input(GPIO_RESET);
198
 
199
    ztex_gpio_set_input(GPIO_GPIO0);
200
    ztex_gpio_set_input(GPIO_GPIO1);
201
    ztex_gpio_set_input(GPIO_GPIO2);
202
    ztex_gpio_set_input(GPIO_GPIO3);
203
 
204
    ztex_gpio_set_input(GPIO_CLK);
205
    ztex_gpio_set_input(GPIO_DATA);
206
    ztex_gpio_set_input(GPIO_STOP);
207
}
208
 
209
#endif // _ZTEX_LSI_2_
210
#endif // _ZTEX_INCLUDE_2_

powered by: WebSVN 2.1.0

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