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-isr.h] - Diff between revs 2 and 3

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 2 Rev 3
Line 21... Line 21...
*/
*/
 
 
#ifndef[ZTEX_ISR_H]
#ifndef[ZTEX_ISR_H]
#define[ZTEX_ISR_H]
#define[ZTEX_ISR_H]
 
 
xdata BYTE prevSetupRequest = 0xff;
xdata BYTE ep0_prev_setup_request = 0xff;
 
xdata BYTE ep0_vendor_cmd_setup = 0;
 
 
xdata WORD ISOFRAME_COUNTER[4] = {0, 0, 0, 0};      // counters for iso frames automatically reset by sync frame request
xdata WORD ISOFRAME_COUNTER[4] = {0, 0, 0, 0};      // counters for iso frames automatically reset by sync frame request
 
 
/* *********************************************************************
/* *********************************************************************
   ***** toggleData ****************************************************
   ***** toggleData ****************************************************
Line 84... Line 85...
    EP0BUF[1] = 3;
    EP0BUF[1] = 3;
    EP0BCH = 0;
    EP0BCH = 0;
    EP0BCL = i;
    EP0BCL = i;
}
}
 
 
 
/* *********************************************************************
 
   ***** ep0_payload_update ********************************************
 
   ********************************************************************* */
 
static void ep0_payload_update() {
 
    ep0_payload_transfer = ( ep0_payload_remaining > 64 ) ? 64 : ep0_payload_remaining;
 
    ep0_payload_remaining -= ep0_payload_transfer;
 
}
 
 
 
 
 
/* *********************************************************************
 
   ***** ep0_vendor_cmd_su **********************************************
 
   ********************************************************************* */
 
static void ep0_vendor_cmd_su() {
 
    switch ( ep0_prev_setup_request ) {
 
        EP0_VENDOR_COMMANDS_SU;
 
        default:
 
            EP0CS |= 0x01;                      // set stall, unknown request
 
    }
 
}
 
 
/* *********************************************************************
/* *********************************************************************
   ***** SUDAV_ISR *****************************************************
   ***** SUDAV_ISR *****************************************************
   ********************************************************************* */
   ********************************************************************* */
static void SUDAV_ISR () interrupt
static void SUDAV_ISR () interrupt
{
{
    BYTE a;
    BYTE a;
    prevSetupRequest = bRequest;
    ep0_prev_setup_request = bRequest;
    SUDPTRCTL = 1;
    SUDPTRCTL = 1;
 
 
    // standard USB requests
    // standard USB requests
    switch ( bRequest ) {
    switch ( bRequest ) {
        case 0x00:      // get status 
        case 0x00:      // get status 
            switch(SETUPDAT[0]) {
            switch(SETUPDAT[0]) {
                case 0x80:              // self powered and remote 
                case 0x80:              // self powered and remote 
Line 259... Line 280...
    }
    }
 
 
    // vendor request and commands
    // vendor request and commands
    switch ( bmRequestType ) {
    switch ( bmRequestType ) {
        case 0xc0:                                      // vendor request 
        case 0xc0:                                      // vendor request 
 
            ep0_payload_remaining = (SETUPDAT[7] << 8) | SETUPDAT[6];
 
            ep0_payload_update();
 
 
            switch ( bRequest ) {
            switch ( bRequest ) {
                case 0x22:                              // get ZTEX descriptor
                case 0x22:                              // get ZTEX descriptor
                    SUDPTRCTL = 0;
                    SUDPTRCTL = 0;
                    EP0BCH = 0;
                    EP0BCH = 0;
                    EP0BCL = ZTEX_DESCRIPTOR_LEN;
                    EP0BCL = ZTEX_DESCRIPTOR_LEN;
Line 273... Line 297...
                default:
                default:
                    EP0CS |= 0x01;                      // set stall, unknown request
                    EP0CS |= 0x01;                      // set stall, unknown request
            }
            }
            break;
            break;
        case 0x40:                                      // vendor command
        case 0x40:                                      // vendor command
            switch ( bRequest ) {
            /* vendor commands may overlap if they are send without pause. To avoid
                EP0_VENDOR_COMMANDS_SU;
               synchronization problems the setup sequences are executed in EP0OUT_ISR, i.e.
                default:
               after the first packet of payload date received. */
                    EP0CS |= 0x01;                      // set stall, unknown request
            if ( SETUPDAT[7]!=0 || SETUPDAT[6]!=0 ) {
 
                ep0_vendor_cmd_setup = 1;
 
                EP0BCL = 0;
 
                EXIF &= ~bmBIT4;                        // clear main USB interrupt flag
 
                USBIRQ = bmBIT0;                        // clear SUADV IRQ
 
                return;                                 // don't clear HSNAK bit. This is done after the command has completed
            }
            }
 
            ep0_vendor_cmd_su();                        // setup sequences of vendor command with no payload ara executed immediately
 
            EP0BCL = 0;
            break;
            break;
    }
    }
 
 
    EP0CS |= 0x80;
    EXIF &= ~bmBIT4;                                    // clear main USB interrupt flag
    EXIF &= ~bmBIT4;
    USBIRQ = bmBIT0;                                    // clear SUADV IRQ
    USBIRQ = bmBIT0;
    EP0CS |= 0x80;                                      // clear the HSNAK bit
}
}
 
 
/* *********************************************************************
/* *********************************************************************
   ***** SOF_ISR *******************************************************
   ***** SOF_ISR *******************************************************
   ********************************************************************* */
   ********************************************************************* */
Line 332... Line 363...
        EXIF &= ~bmBIT4;
        EXIF &= ~bmBIT4;
        USBIRQ = bmBIT5;
        USBIRQ = bmBIT5;
}
}
 
 
/* *********************************************************************
/* *********************************************************************
   ***** AP0ACK_ISR ****************************************************
   ***** EP0ACK_ISR ****************************************************
   ********************************************************************* */
   ********************************************************************* */
void EP0ACK_ISR() interrupt
void EP0ACK_ISR() interrupt
{
{
        EXIF &= ~bmBIT4;
        EXIF &= ~bmBIT4;        // clear USB interrupt flag
        USBIRQ = bmBIT6;
        USBIRQ = bmBIT6;        // clear EP0ACK IRQ
}
}
 
 
/* *********************************************************************
/* *********************************************************************
   ***** EP0IN_ISR *****************************************************
   ***** EP0IN_ISR *****************************************************
   ********************************************************************* */
   ********************************************************************* */
static void EP0IN_ISR () interrupt
static void EP0IN_ISR () interrupt
{
{
    switch ( prevSetupRequest ) {
    EUSB = 0;                    // block all USB interrupts
 
    ep0_payload_update();
 
    switch ( ep0_prev_setup_request ) {
        EP0_VENDOR_REQUESTS_DAT;
        EP0_VENDOR_REQUESTS_DAT;
        default:
        default:
            EP0BCH = 0;
            EP0BCH = 0;
            EP0BCL = 0;
            EP0BCL = 0;
    }
    }
    EP0CS |= 0x80;
    EXIF &= ~bmBIT4;            // clear USB interrupt flag
    EXIF &= ~bmBIT4;
    EPIRQ = bmBIT0;             // clear EP0IN IRQ
    EPIRQ = bmBIT0;
    EUSB = 1;
}
}
 
 
/* *********************************************************************
/* *********************************************************************
   ***** EP0OUT_ISR ****************************************************
   ***** EP0OUT_ISR ****************************************************
   ********************************************************************* */
   ********************************************************************* */
static void EP0OUT_ISR () interrupt
static void EP0OUT_ISR () interrupt
{
{
    switch ( prevSetupRequest ) {
    EUSB = 0;                    // block all USB interrupts
 
    if ( ep0_vendor_cmd_setup ) {
 
        ep0_vendor_cmd_setup = 0;
 
        ep0_payload_remaining = (SETUPDAT[7] << 8) | SETUPDAT[6];
 
        ep0_vendor_cmd_su();
 
    }
 
 
 
    ep0_payload_update();
 
 
 
    switch ( ep0_prev_setup_request ) {
        EP0_VENDOR_COMMANDS_DAT;
        EP0_VENDOR_COMMANDS_DAT;
    }
    }
 
 
    EP0BCL = 1;
    EP0BCL = 0;
 
 
    EXIF &= ~bmBIT4;
    EXIF &= ~bmBIT4;            // clear main USB interrupt flag
    EPIRQ = bmBIT1;
    EPIRQ = bmBIT1;             // clear EP0OUT IRQ
 
    if ( ep0_payload_remaining == 0 ) {
 
        EP0CS |= 0x80;          // clear the HSNAK bit
 
    }
 
    EUSB = 1;
}
}
 
 
 
 
/* *********************************************************************
/* *********************************************************************
   ***** EP1IN_ISR *****************************************************
   ***** EP1IN_ISR *****************************************************

powered by: WebSVN 2.1.0

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