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

Subversion Repositories usb_fpga_2_13

[/] [usb_fpga_2_13/] [trunk/] [include/] [ztex-isr.h] - 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 FX2 Microcontrollers
3
   Copyright (C) 2009-2014 ZTEX GmbH.
4
   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
   Interrupt routines
21
*/
22
 
23
#ifndef[ZTEX_ISR_H]
24
#define[ZTEX_ISR_H]
25
 
26
__xdata BYTE ep0_prev_setup_request = 0xff;
27
__xdata BYTE ep0_vendor_cmd_setup = 0;
28
 
29
__xdata WORD ISOFRAME_COUNTER[4] = {0, 0, 0, 0};    // counters for iso frames automatically reset by sync frame request
30
 
31
/* *********************************************************************
32
   ***** toggleData ****************************************************
33
   ********************************************************************* */
34
static void resetToggleData () {
35
#define[RESET_TOGGLE_DATA_EP(][);][
36
#ifeq[EP$0_DIR][OUT]
37
    TOGCTL = $0;                         // EP$0 out
38
    TOGCTL = $0 | bmBIT5;
39
#endif    
40
#ifeq[EP$0_DIR][IN]
41
    TOGCTL = bmBIT4 | $0;                        // EP$0 in
42
    TOGCTL = bmBIT4 | $0 | bmBIT5;
43
#endif]
44
 
45
    TOGCTL = 0;                          // EP0 out
46
    TOGCTL = 0 | bmBIT5;
47
    TOGCTL = 0x10;                      // EP0 in
48
    TOGCTL = 0x10 | bmBIT5;
49
#ifeq[EP1OUT_DIR][OUT]
50
    TOGCTL = 1;                         // EP1 out
51
    TOGCTL = 1 | bmBIT5;
52
#endif    
53
#ifeq[EP1IN_DIR][IN]
54
    TOGCTL = 0x11;                      // EP1 in
55
    TOGCTL = 0x11 | bmBIT5;
56
#endif    
57
    RESET_TOGGLE_DATA_EP(2);
58
    RESET_TOGGLE_DATA_EP(4);
59
    RESET_TOGGLE_DATA_EP(6);
60
    RESET_TOGGLE_DATA_EP(8);
61
}
62
 
63
/* *********************************************************************
64
   ***** getStringDescriptor *******************************************
65
   ********************************************************************* */
66
#define[SEND_STRING_DESCRIPTOR(][);][sendStringDescriptor(LSB($0), MSB($0), sizeof($0) );]
67
 
68
static void sendStringDescriptor (BYTE loAddr, BYTE hiAddr, BYTE size)
69
{
70
    BYTE i;
71
    if ( size > 31) size = 31;
72
    if (SETUPDAT[7] == 0 && SETUPDAT[6]<size ) size = SETUPDAT[6];
73
    AUTOPTRSETUP = 7;
74
    AUTOPTRL1 = loAddr;
75
    AUTOPTRH1 = hiAddr;
76
    AUTOPTRL2 = (BYTE)(((unsigned short)(&EP0BUF))+1);
77
    AUTOPTRH2 = (BYTE)((((unsigned short)(&EP0BUF))+1) >> 8);
78
    XAUTODAT2 = 3;
79
    for (i=0; i<size; i++) {
80
        XAUTODAT2 = XAUTODAT1;
81
        XAUTODAT2 = 0;
82
    }
83
    i = (size+1) << 1;
84
    EP0BUF[0] = i;
85
    EP0BUF[1] = 3;
86
    EP0BCH = 0;
87
    EP0BCL = i;
88
}
89
 
90
/* *********************************************************************
91
   ***** ep0_payload_update ********************************************
92
   ********************************************************************* */
93
static void ep0_payload_update() {
94
    ep0_payload_transfer = ( ep0_payload_remaining > 64 ) ? 64 : ep0_payload_remaining;
95
    ep0_payload_remaining -= ep0_payload_transfer;
96
}
97
 
98
 
99
/* *********************************************************************
100
   ***** ep0_vendor_cmd_su **********************************************
101
   ********************************************************************* */
102
static void ep0_vendor_cmd_su() {
103
    switch ( ep0_prev_setup_request ) {
104
        EP0_VENDOR_COMMANDS_SU;
105
        default:
106
            EP0CS |= 0x01;                      // set stall, unknown request
107
    }
108
}
109
 
110
/* *********************************************************************
111
   ***** SUDAV_ISR *****************************************************
112
   ********************************************************************* */
113
static void SUDAV_ISR () __interrupt
114
{
115
    BYTE a;
116
    ep0_prev_setup_request = bRequest;
117
    SUDPTRCTL = 1;
118
 
119
    // standard USB requests
120
    switch ( bRequest ) {
121
        case 0x00:      // get status 
122
            switch(SETUPDAT[0]) {
123
                case 0x80:              // self powered and remote 
124
                    EP0BUF[0] = 0;        // not self-powered, no remote wakeup
125
                    EP0BUF[1] = 0;
126
                    EP0BCH = 0;
127
                    EP0BCL = 2;
128
                    break;
129
                case 0x81:              // interface (reserved)
130
                    EP0BUF[0] = 0;        // always return zeros
131
                    EP0BUF[1] = 0;
132
                    EP0BCH = 0;
133
                    EP0BCL = 2;
134
                    break;
135
                case 0x82:
136
                    switch ( SETUPDAT[4] ) {
137
                        case 0x00 :
138
                        case 0x80 :
139
                            EP0BUF[0] = EP0CS & bmBIT0;
140
                            break;
141
                        case 0x01 :
142
                            EP0BUF[0] = EP1OUTCS & bmBIT0;
143
                            break;
144
                        case 0x81 :
145
                            EP0BUF[0] = EP1INCS & bmBIT0;
146
                            break;
147
                        default:
148
                            EP0BUF[0] = EPXCS[ ((SETUPDAT[4] >> 1)-1) & 3 ] & bmBIT0;
149
                            break;
150
                        }
151
                    EP0BUF[1] = 0;
152
                    EP0BCH = 0;
153
                    EP0BCL = 2;
154
                    break;
155
            }
156
            break;
157
        case 0x01:      // disable feature, e.g. remote wake, stall bit
158
            if ( SETUPDAT[0] == 2 && SETUPDAT[2] == 0 ) {
159
                switch ( SETUPDAT[4] ) {
160
                    case 0x00 :
161
                    case 0x80 :
162
                        EP0CS &= ~bmBIT0;
163
                        break;
164
                    case 0x01 :
165
                        EP1OUTCS &= ~bmBIT0;
166
                        break;
167
                    case 0x81 :
168
                         EP1INCS &= ~bmBIT0;
169
                        break;
170
                    default:
171
                         EPXCS[ ((SETUPDAT[4] >> 1)-1) & 3 ] &= ~bmBIT0;
172
                        break;
173
                }
174
            }
175
            break;
176
        case 0x03:      // enable feature, e.g. remote wake, test mode, stall bit
177
            if ( SETUPDAT[0] == 2 && SETUPDAT[2] == 0 ) {
178
                switch ( SETUPDAT[4] ) {
179
                    case 0x00 :
180
                    case 0x80 :
181
                        EP0CS |= bmBIT0;
182
                        break;
183
                    case 0x01 :
184
                        EP1OUTCS |= bmBIT0;
185
                        break;
186
                    case 0x81 :
187
                         EP1INCS |= bmBIT0;
188
                        break;
189
                    default:
190
                         EPXCS[ ((SETUPDAT[4] >> 1)-1) & 3 ] |= ~bmBIT0;
191
                        break;
192
                }
193
                a = ( (SETUPDAT[4] & 0x80) >> 3 ) | (SETUPDAT[4] & 0x0f);
194
                TOGCTL = a;
195
                TOGCTL = a | bmBIT5;
196
            }
197
            break;
198
        case 0x06:                      // get descriptor
199
            switch(SETUPDAT[3]) {
200
                case 0x01:              // device
201
                    SUDPTRH = MSB(&DeviceDescriptor);
202
                    SUDPTRL = LSB(&DeviceDescriptor);
203
                    break;
204
                case 0x02:              // configuration
205
                    if (USBCS & bmBIT7) {
206
                        SUDPTRH = MSB(&HighSpeedConfigDescriptor);
207
                        SUDPTRL = LSB(&HighSpeedConfigDescriptor);
208
                    }
209
                    else {
210
                        SUDPTRH = MSB(&FullSpeedConfigDescriptor);
211
                        SUDPTRL = LSB(&FullSpeedConfigDescriptor);
212
                    }
213
                    break;
214
                case 0x03:              // strings
215
                    switch (SETUPDAT[2]) {
216
                        case 1:
217
                            SEND_STRING_DESCRIPTOR(manufacturerString);
218
                            break;
219
                        case 2:
220
                            SEND_STRING_DESCRIPTOR(productString);
221
                            break;
222
                        case 3:
223
                            SEND_STRING_DESCRIPTOR(SN_STRING);
224
                            break;
225
                        case 4:
226
                            SEND_STRING_DESCRIPTOR(configurationString);
227
                            break;
228
                        default:
229
                            SUDPTRH = MSB(&EmptyStringDescriptor);
230
                            SUDPTRL = LSB(&EmptyStringDescriptor);
231
                            break;
232
                        }
233
                    break;
234
                case 0x06:              // device qualifier
235
                    SUDPTRH = MSB(&DeviceQualifierDescriptor);
236
                    SUDPTRL = LSB(&DeviceQualifierDescriptor);
237
                    break;
238
                case 0x07:              // other speed configuration
239
                    if (USBCS & bmBIT7) {
240
                        SUDPTRH = MSB(&FullSpeedConfigDescriptor);
241
                        SUDPTRL = LSB(&FullSpeedConfigDescriptor);
242
                    }
243
                    else {
244
                        SUDPTRH = MSB(&HighSpeedConfigDescriptor);
245
                        SUDPTRL = LSB(&HighSpeedConfigDescriptor);
246
                    }
247
                    break;
248
                default:
249
                    EP0CS |= 0x01;      // set stall, unknown descriptor
250
            }
251
            break;
252
        case 0x07:                      // set descriptor
253
            break;
254
        case 0x08:                      // get configuration
255
            EP0BUF[0] = 0;                // only one configuration
256
            EP0BCH = 0;
257
            EP0BCL = 1;
258
            break;
259
        case 0x09:                      // set configuration
260
            resetToggleData();
261
            break;                      // do nothing since we have only one configuration
262
        case 0x0a:                      // get alternate setting for an interface
263
            EP0BUF[0] = 0;                // only one alternate setting
264
            EP0BCH = 0;
265
            EP0BCL = 1;
266
            break;
267
        case 0x0b:                      // set alternate setting for an interface
268
            resetToggleData();
269
            break;                      // do nothing since we have only on alternate setting
270
        case 0x0c:                      // sync frame
271
            if ( SETUPDAT[0] == 0x82 ) {
272
                ISOFRAME_COUNTER[ ((SETUPDAT[4] >> 1)-1) & 3 ] = 0;
273
                EP0BUF[0] = USBFRAMEL;   // use current frame as sync frame, i hope that works
274
                EP0BUF[1] = USBFRAMEH;
275
                EP0BCH = 0;
276
                EP0BCL = 2;
277
            }
278
            break;                      // do nothing since we have only on alternate setting
279
 
280
    }
281
 
282
    // vendor request and commands
283
    switch ( bmRequestType ) {
284
        case 0xc0:                                      // vendor request 
285
            ep0_payload_remaining = (SETUPDAT[7] << 8) | SETUPDAT[6];
286
            ep0_payload_update();
287
 
288
            switch ( bRequest ) {
289
                case 0x22:                              // get ZTEX descriptor
290
                    SUDPTRCTL = 0;
291
                    EP0BCH = 0;
292
                    EP0BCL = ZTEX_DESCRIPTOR_LEN;
293
                    SUDPTRH = MSB(ZTEX_DESCRIPTOR_OFFS);
294
                    SUDPTRL = LSB(ZTEX_DESCRIPTOR_OFFS);
295
                    break;
296
                EP0_VENDOR_REQUESTS_SU;
297
                default:
298
                    EP0CS |= 0x01;                      // set stall, unknown request
299
            }
300
            break;
301
        case 0x40:                                      // vendor command
302
            /* vendor commands may overlap if they are send without pause. To avoid
303
               synchronization problems the setup sequences are executed in EP0OUT_ISR, i.e.
304
               after the first packet of payload data received. */
305
            if ( SETUPDAT[7]!=0 || SETUPDAT[6]!=0 ) {
306
                ep0_vendor_cmd_setup = 1;
307
                EP0BCL = 0;
308
                EXIF &= ~bmBIT4;                        // clear main USB interrupt flag
309
                USBIRQ = bmBIT0;                        // clear SUADV IRQ
310
                return;                                 // don't clear HSNAK bit. This is done after the command has completed
311
            }
312
            ep0_vendor_cmd_su();                        // setup sequences of vendor command with no payload ara executed immediately
313
            EP0BCL = 0;
314
            break;
315
    }
316
 
317
    EXIF &= ~bmBIT4;                                    // clear main USB interrupt flag
318
    USBIRQ = bmBIT0;                                    // clear SUADV IRQ
319
    EP0CS |= 0x80;                                      // clear the HSNAK bit
320
}
321
 
322
/* *********************************************************************
323
   ***** SOF_ISR *******************************************************
324
   ********************************************************************* */
325
void SOF_ISR() __interrupt
326
{
327
        EXIF &= ~bmBIT4;
328
        USBIRQ = bmBIT1;
329
}
330
 
331
/* *********************************************************************
332
   ***** SUTOK_ISR *****************************************************
333
   ********************************************************************* */
334
void SUTOK_ISR() __interrupt
335
{
336
        EXIF &= ~bmBIT4;
337
        USBIRQ = bmBIT2;
338
}
339
 
340
/* *********************************************************************
341
   ***** SUSP_ISR ******************************************************
342
   ********************************************************************* */
343
void SUSP_ISR() __interrupt
344
{
345
        EXIF &= ~bmBIT4;
346
        USBIRQ = bmBIT3;
347
}
348
 
349
/* *********************************************************************
350
   ***** URES_ISR ******************************************************
351
   ********************************************************************* */
352
void URES_ISR() __interrupt
353
{
354
        EXIF &= ~bmBIT4;
355
        USBIRQ = bmBIT4;
356
}
357
 
358
/* *********************************************************************
359
   ***** HSGRANT_ISR ***************************************************
360
   ********************************************************************* */
361
void HSGRANT_ISR() __interrupt
362
{
363
        EXIF &= ~bmBIT4;
364
//        while ( USBIRQ & bmBIT5 )
365
            USBIRQ = bmBIT5;
366
}
367
 
368
/* *********************************************************************
369
   ***** EP0ACK_ISR ****************************************************
370
   ********************************************************************* */
371
void EP0ACK_ISR() __interrupt
372
{
373
        EXIF &= ~bmBIT4;        // clear USB interrupt flag
374
        USBIRQ = bmBIT6;        // clear EP0ACK IRQ
375
}
376
 
377
/* *********************************************************************
378
   ***** EP0IN_ISR *****************************************************
379
   ********************************************************************* */
380
static void EP0IN_ISR () __interrupt
381
{
382
    EUSB = 0;                    // block all USB interrupts
383
    ep0_payload_update();
384
    switch ( ep0_prev_setup_request ) {
385
        EP0_VENDOR_REQUESTS_DAT;
386
        default:
387
            EP0BCH = 0;
388
            EP0BCL = 0;
389
    }
390
    EXIF &= ~bmBIT4;            // clear USB interrupt flag
391
    EPIRQ = bmBIT0;             // clear EP0IN IRQ
392
    EUSB = 1;
393
}
394
 
395
/* *********************************************************************
396
   ***** EP0OUT_ISR ****************************************************
397
   ********************************************************************* */
398
static void EP0OUT_ISR () __interrupt
399
{
400
    EUSB = 0;                    // block all USB interrupts
401
    if ( ep0_vendor_cmd_setup ) {
402
        ep0_vendor_cmd_setup = 0;
403
        ep0_payload_remaining = (SETUPDAT[7] << 8) | SETUPDAT[6];
404
        ep0_vendor_cmd_su();
405
    }
406
 
407
    ep0_payload_update();
408
 
409
    switch ( ep0_prev_setup_request ) {
410
        EP0_VENDOR_COMMANDS_DAT;
411
    }
412
 
413
    EP0BCL = 0;
414
 
415
    EXIF &= ~bmBIT4;            // clear main USB interrupt flag
416
    EPIRQ = bmBIT1;             // clear EP0OUT IRQ
417
    if ( ep0_payload_remaining == 0 ) {
418
        EP0CS |= 0x80;          // clear the HSNAK bit
419
    }
420
    EUSB = 1;
421
}
422
 
423
 
424
/* *********************************************************************
425
   ***** EP1IN_ISR *****************************************************
426
   ********************************************************************* */
427
void EP1IN_ISR() __interrupt
428
{
429
    EXIF &= ~bmBIT4;
430
    EPIRQ = bmBIT2;
431
 
432
}
433
 
434
/* *********************************************************************
435
   ***** EP1OUT_ISR ****************************************************
436
   ********************************************************************* */
437
void EP1OUT_ISR() __interrupt
438
{
439
    EXIF &= ~bmBIT4;
440
    EPIRQ = bmBIT3;
441
}
442
 
443
/* *********************************************************************
444
   ***** EP2_ISR *******************************************************
445
   ********************************************************************* */
446
void EP2_ISR() __interrupt
447
{
448
    EXIF &= ~bmBIT4;
449
    EPIRQ = bmBIT4;
450
}
451
 
452
/* *********************************************************************
453
   ***** EP4_ISR *******************************************************
454
   ********************************************************************* */
455
void EP4_ISR() __interrupt
456
{
457
    EXIF &= ~bmBIT4;
458
    EPIRQ = bmBIT5;
459
}
460
 
461
/* *********************************************************************
462
   ***** EP6_ISR *******************************************************
463
   ********************************************************************* */
464
void EP6_ISR() __interrupt
465
{
466
    EXIF &= ~bmBIT4;
467
    EPIRQ = bmBIT6;
468
}
469
 
470
/* *********************************************************************
471
   ***** EP8_ISR *******************************************************
472
   ********************************************************************* */
473
void EP8_ISR() __interrupt
474
{
475
    EXIF &= ~bmBIT4;
476
    EPIRQ = bmBIT7;
477
}
478
 
479
#endif   /* ZTEX_ISR_H */

powered by: WebSVN 2.1.0

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