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

Subversion Repositories gecko3

[/] [gecko3/] [trunk/] [GECKO3COM/] [gecko3com-fw/] [firmware/] [src/] [gecko3com_gpif.c] - Blame information for rev 29

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 nussgipfel
/* GECKO3COM
2
 *
3
 * Copyright (C) 2008 by
4
 *   ___    ____  _   _
5
 *  (  _`\ (  __)( ) ( )
6
 *  | (_) )| (_  | |_| |   Bern University of Applied Sciences
7
 *  |  _ <'|  _) |  _  |   School of Engineering and
8
 *  | (_) )| |   | | | |   Information Technology
9
 *  (____/'(_)   (_) (_)
10
 *
11
 *
12
 * This program is free software: you can redistribute it and/or modify
13
 * it under the terms of the GNU General Public License as published by
14
 * the Free Software Foundation, either version 3 of the License, or
15
 * (at your option) any later version.
16
 *
17
 * This program is distributed in the hope that it will be useful,
18
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20
 * GNU General Public License for more details.
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23
 */
24
 
25
/*********************************************************************/
26
/** \file     gecko3com_gpif.c
27
 *********************************************************************
28
 * \brief     project specific functions to handle the GPIF
29
 *
30
 *
31
 *
32
 * \author    GNUradio team, Christoph Zimmermann bfh.ch
33
 * \date      2009-4-16
34
 *
35
 * \note Comments from the original GNU radio source: \n
36
 * The GPIF Designer tool is kind of screwed up, in that it doesn't
37
 * configure some of the ports correctly.  We just use their tables and
38
 * handle the initialization ourselves.  They also declare that their
39
 * static initialized data is in xdata, which screws us too.
40
 *
41
*/
42
 
43
#include <stdint.h>
44
#include "gecko3com_gpif.h"
45
#include "gpif_data.h"
46
#include "isr.h"
47
#include "delay.h"
48
#include "fx2regs.h"
49
#include "gecko3com_regs.h"
50
#include "gecko3com_interfaces.h"
51
#include "syncdelay.h"
52
#include "debugprint.h"
53
 
54
 
55
/* These are the tables generated by the Cypress GPIF Designer */
56
 
57
/** \brief Waveform data generated by the Cypress GPIF Designer
58
 *
59
 *  this table is defined in the gpif_data.c file. provide the
60
 *  desired file for your board
61
 */
62
extern const char WaveData[128];
63
 
64
/** \brief Flowstate data generated by the Cypress GPIF Designer
65
 *
66
 *  this table is defined in the gpif_data.c file. provide the
67
 *  desired file for your board
68
 */
69
extern const char FlowStates[36];
70
 
71
/** \brief Init values generated by the Cypress GPIF Designer
72
 *  and the edit-gpif script
73
 *
74
 *  this table is defined in the gpif_data.h file. provide the
75
 *  desired file for your board
76
 */
77
extern const char InitData[7];
78
 
79
 
80 19 nussgipfel
//** private flag to signal, that the GPIF receives data from the FPGA */
81
//volatile static uint8_t flGPIF;
82 9 nussgipfel
 
83
 
84
 
85
/**
86 20 nussgipfel
 * \brief exectuted when the gpif waveform terminates
87 9 nussgipfel
 */
88
void
89
isr_gpif_done (void) interrupt
90
{
91
  ISR_DEBUG_PORT |= bmGPIF_DONE;
92
 
93 20 nussgipfel
  /* check if this is a end of a IN transfer */
94
  if((flGPIF & bmGPIF_READ_IN_PROGRESS) == bmGPIF_READ_IN_PROGRESS){
95
    INPKTEND = USB_TMC_EP_IN;
96
  }
97
 
98 21 nussgipfel
  //EA = 0;             /* disable all interrupts */
99 20 nussgipfel
  while(!(GPIFTRIG & bmGPIF_IDLE));
100 21 nussgipfel
  //EA = 1;             /* global interrupt enable */
101 20 nussgipfel
 
102 18 nussgipfel
  /* check if there is data available for an OUT transfer */
103 21 nussgipfel
  //if((flGPIF & bmGPIF_PENDING_DATA) == bmGPIF_PENDING_DATA) {
104 19 nussgipfel
    //if(!(EP2468STAT & bmEP2EMPTY)) {
105 21 nussgipfel
    //flGPIF &= ~bmGPIF_PENDING_DATA;
106
 
107
    //EA = 0;           /* disable all interrupts */
108
    //flGPIF &= ~bmGPIF_READ_IN_PROGRESS;
109
    //gpif_trigger_write();
110
    //EA = 1;           /* global interrupt enable */
111
  //}
112
  /*else*/ {
113
    EA = 0;              /* disable all interrupts */
114 28 nussgipfel
    clear_fifo_gpif_irq();
115 21 nussgipfel
    flGPIF |= bmGPIF_READ_IN_PROGRESS;
116 20 nussgipfel
    gpif_trigger_read();
117 21 nussgipfel
    EA = 1;             /* global interrupt enable */
118 9 nussgipfel
  }
119 19 nussgipfel
 
120 18 nussgipfel
 
121 28 nussgipfel
 
122 9 nussgipfel
  ISR_DEBUG_PORT &= ~bmGPIF_DONE;
123
}
124
 
125
 
126
/**
127
 * \brief exectuted when data is available in the OUT endpoint
128
 */
129
void
130
isr_endpoint_out_data (void) interrupt
131
{
132
  ISR_DEBUG_PORT |= bmFIFO_PF;
133
 
134 17 nussgipfel
  /* check if there is a active IN transfer */
135 20 nussgipfel
  if((GPIFREADYSTAT & bmWRX) == bmWRX) {
136 9 nussgipfel
    flGPIF |= bmGPIF_PENDING_DATA;
137
  }
138 20 nussgipfel
  else {
139 21 nussgipfel
    //EA = 0;           /* disable all interrupts */
140
    if((flGPIF & bmGPIF_READ_IN_PROGRESS) == bmGPIF_READ_IN_PROGRESS) {
141
      GPIFABORT = 0xFF;
142
      SYNCDELAY;
143
      flGPIF &= ~bmGPIF_READ_IN_PROGRESS;
144
    }
145
    //EA = 1;           /* global interrupt enable */
146
    //EA = 0;           /* disable all interrupts */
147 19 nussgipfel
    while(!(GPIFTRIG & bmGPIF_IDLE));
148 21 nussgipfel
    //EA = 1;           /* global interrupt enable */
149
    EA = 0;              /* disable all interrupts */
150 20 nussgipfel
    flGPIF &= ~bmGPIF_READ_IN_PROGRESS;
151 21 nussgipfel
    gpif_trigger_write();
152
    EA = 1;             /* global interrupt enable */
153 9 nussgipfel
  }
154
 
155 19 nussgipfel
  clear_fifo_gpif_irq();
156
 
157 9 nussgipfel
  ISR_DEBUG_PORT &= ~bmFIFO_PF;
158
}
159
 
160
 
161
/** \brief initialize GPIF system */
162
void init_gpif (void)
163
{
164
  uint8_t i;
165
 
166
#ifdef GECKO3MAIN
167 19 nussgipfel
  /* IFCLK is generated internally and runs at 30 MHz; GPIF "master mode" */
168
  //IFCONFIG = bmIFCLKSRC | bm3048MHZ | bmIFCLKOE | bmGSTATE | bmIFGPIF;
169
  IFCONFIG = bmIFCLKSRC | bmIFCLKOE | bmGSTATE | bmIFGPIF;
170 9 nussgipfel
  SYNCDELAY;
171
 
172 29 nussgipfel
  /* we have to commit the currently processed packet BEFORE we switch
173
   *to auto out mode */
174 9 nussgipfel
  OUTPKTEND = bmSKIP | USB_TMC_EP_OUT;
175
 
176 29 nussgipfel
    /* reset FIFOs */
177 17 nussgipfel
 
178 29 nussgipfel
  FIFORESET = bmNAKALL;                                 SYNCDELAY;
179
  FIFORESET = 6;                                        SYNCDELAY;
180
  FIFORESET = 0;                                 SYNCDELAY;
181
 
182 9 nussgipfel
  /* enable autoout and autoin feature of the endpoints */
183
  EP2FIFOCFG |= bmAUTOOUT;
184
  SYNCDELAY;
185
  EP6FIFOCFG |= bmAUTOIN;
186
  SYNCDELAY;
187
 
188
  /* set endpoint 2 fifo (out) programmable flag to "higher or equal 3"
189 18 nussgipfel
   * we use the programmable flag as interrupt source to detect if data for the
190
   * FPGA is available and as GPIF flag to stop the flowstate, for this the
191
   * flag has to change one cycle before the FIFO is completly empty, else we
192
   * transfer one word too much */
193 9 nussgipfel
  EP2FIFOPFH = bmDECIS;
194 19 nussgipfel
  EP2FIFOPFL = 4;
195 9 nussgipfel
  SYNCDELAY;
196
 
197 19 nussgipfel
  EP2GPIFFLGSEL = bmFLAG_PROGRAMMABLE;
198
  //EP2GPIFFLGSEL = bmFLAG_EMPTY;
199 9 nussgipfel
  SYNCDELAY;
200 29 nussgipfel
 
201
  //EP6FIFOPFH = bmDECIS | 0x19;
202
  //EP6FIFOPFL = 0xFB;
203
  //SYNCDELAY;
204
 
205
  //EP6GPIFFLGSEL = bmFLAG_PROGRAMMABLE;
206 9 nussgipfel
  EP6GPIFFLGSEL = bmFLAG_FULL;
207
  SYNCDELAY;
208
 
209
  EP2GPIFPFSTOP = 0;
210
  EP6GPIFPFSTOP = 0;
211
 
212
#endif
213
 
214
  GPIFABORT = 0xFF;  /* abort any waveforms pending */
215
  SYNCDELAY;
216
 
217
  GPIFREADYCFG = InitData[ 0 ];
218
  GPIFCTLCFG = InitData[ 1 ];
219
  GPIFIDLECS = InitData[ 2 ];
220
  GPIFIDLECTL = InitData[ 3 ];
221
  /* Hmmm, what's InitData[ 4 ] ... */
222
  GPIFWFSELECT = InitData[ 5 ];
223 29 nussgipfel
  /* I think this register is read only... */
224
  /* GPIFREADYSTAT = InitData[ 6 ]; */
225 9 nussgipfel
 
226
  for (i = 0; i < 128; i++){
227
    GPIF_WAVE_DATA[i] = WaveData[i];
228
  }
229
 
230
  setup_flowstate_common();
231
 
232
  FLOWSTATE = 0;         /* ensure it's off */
233
 
234
  GPIFREADYCFG |= bmINTRDY; /* set the internal ready signal */
235
 
236
  /* unset gpif flags */
237
  flGPIF = 0;
238
 
239
 
240
  EA = 0;                /* disable all interrupts */
241
 
242
  /* hook gpif interupt services */
243
 
244
  /* due to big problems with the done interrupt, we use the WAVEFORM interrupt
245
     to signal the firmware that the GPIF is done */
246
  hook_fgv(FGV_GPIFWF,(unsigned short) isr_gpif_done);
247
  hook_fgv(FGV_EP2PF,(unsigned short) isr_endpoint_out_data);
248
 
249
  EP2FIFOIE = bmFIFO_PF;
250
  GPIFIE = bmGPIFWF;
251
 
252
  EA = 1;               /* global interrupt enable */
253
 
254
 
255
  /* start gpif read, default state of the gpif to wait for fpga data */
256 21 nussgipfel
  flGPIF |= bmGPIF_READ_IN_PROGRESS;
257 9 nussgipfel
  gpif_trigger_read();
258
 
259
}
260
 
261
 
262
/** \brief aborts any gpif running gpif transaction  */
263
void abort_gpif(void) {
264
 
265
  EA = 0;                /* disable all interrupts */
266
 
267
  flGPIF = 0;
268
 
269 20 nussgipfel
  /* abort the current GPIF waveform */
270 9 nussgipfel
  GPIFABORT = 0xFF;
271
  SYNCDELAY;
272
  while(!(GPIFTRIG & bmGPIF_IDLE));
273
 
274
  EA = 1;               /* global interrupt enable */
275
 
276 20 nussgipfel
  //print_info("gpif aborted\n");
277 9 nussgipfel
 
278 20 nussgipfel
#ifdef GECKO3MAIN
279
  /* signal an abort condition to the FPGA (both WRU and RDYU high) */
280
  GPIFIDLECTL |= bmRDYU | bmWRU;
281
  udelay(10);
282
  GPIFIDLECTL = InitData[ 3 ]; /* restore original state */
283
#endif
284
 
285 9 nussgipfel
  gpif_trigger_read();
286 20 nussgipfel
  flGPIF |= bmGPIF_READ_IN_PROGRESS;
287 9 nussgipfel
}
288
 
289
 
290
/** \brief disables gpif system */
291
void deactivate_gpif(void) {
292
 
293 20 nussgipfel
  EA = 0;          /* disable all interrupts */
294 9 nussgipfel
 
295
  EP2FIFOIE = 0;  /* disable FIFO interrupt */
296
  SYNCDELAY;
297
  GPIFIE = 0;     /* disable all GPIF interrupts */
298
  SYNCDELAY;
299
 
300
  GPIFTCB0 = 0x00;
301
  EP2GPIFPFSTOP = 1;
302
  EP6GPIFPFSTOP = 1;
303
 
304
  GPIFABORT = 0xFF; /* abort pending GPIF transaction */
305
  SYNCDELAY;
306
 
307
  flGPIF = 0;  /* unset all internal GPIF flags */
308
 
309 20 nussgipfel
  EA = 1;               /* global interrupt enable */
310 17 nussgipfel
 
311 20 nussgipfel
  while(!(GPIFTRIG & bmGPIF_IDLE));
312
 
313 9 nussgipfel
#ifdef GECKO3MAIN
314 20 nussgipfel
  /* signal an abort condition to the FPGA (both WRU and RDYU high) */
315
  GPIFIDLECTL |= bmRDYU | bmWRU;
316
  udelay(10);
317
  GPIFIDLECTL = InitData[ 3 ]; /* restore original state */
318
 
319 9 nussgipfel
  EP2FIFOCFG &= ~bmAUTOOUT;  /* disable AutoOUT feature */
320
  SYNCDELAY;
321
  //EP6FIFOCFG &= ~bmINFM;
322
  EP6FIFOCFG &= ~bmAUTOIN;   /* disable AutoIN feature */
323
#endif
324
 
325 18 nussgipfel
  //print_info("gpif deactivated\n");
326 9 nussgipfel
}

powered by: WebSVN 2.1.0

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