⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isr.c

📁 Texas Instruments的TUSB3410芯片接键盘输入的固件程序源码和驱动程序源码。
💻 C
字号:
// (c)2002 by Texas Instruments Incorporated, All Rights Reserved.
/*----------------------------------------------------------------------------+
|                                                                             |
|                              Texas Instruments                              |
|                                                                             |
|                                     ISR                                     |
|                                                                             |
+-----------------------------------------------------------------------------+
|  Source: isr.c, v00.01 2002/04/24 10:45                                     |
|  Author: Ching-Hua Jim Chen Jim_Chen@ti.com                                 |
|                                                                             |
|  For more information, please contact                                       |
|                                                                             |
|  Jim Chen                                                                   |
|  Texas Instruments                                                          |
|  12500 TI Blvd, MS 8761                                                     |
|  Dallas, TX 75243                                                           |
|  USA                                                                        |
|                                                                             |
|  Tel 214-480-4656                                                           |
|  Fax 972-761-6043                                                           |
|                                                                             |
|  Release Notes:                                                             |
|                                                                             |
|  Logs:                                                                      |
|                                                                             |
|  WHO       WHEN         WHAT                                                |
|  ---       ----------   --------------------------------------------------  |
|  CJH       04/24/2002   born                                                |
|  CJH       06/11/2002   Added timer 0 interrupt for dealy routines          |
|                                                                             |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| Include files                                                               |
+----------------------------------------------------------------------------*/
#ifdef KEIL
#include <reg51.h>      // for KEIL compiler 8051 sfr definition
#else
#include <io51.h>       // for IAR compiler 8051 sfr definition
#endif
#include "types.h"      // Basic Type declarations
#include "tusb3410.h"
#include "watchdog.h"
#include "rs232dbg.h"
#include "sample.h"

/*----------------------------------------------------------------------------+
| External Function Prototype                                                 |
+----------------------------------------------------------------------------*/
extern VOID OEP0InterruptHandler(VOID);
extern VOID IEP0InterruptHandler(VOID);
extern VOID SetupPacketInterruptHandler(VOID);                            
extern VOID UsbReset(VOID);

// extra endpoint interrupt handlers defined here 
extern VOID IEP1InterruptHandler(VOID);

/*----------------------------------------------------------------------------+
| External Variables                                                          |
+----------------------------------------------------------------------------*/
extern idata BYTE bFunctionSuspended;

#ifdef KEIL
  extern xdata tEDB0 tEndPoint0DescriptorBlock;// _at_ 0xff80;

#else

#pragma memory = dataseg(TUSB3410_EP0_EDB_SEG)
extern tEDB0 tEndPoint0DescriptorBlock;
#pragma memory = default

#endif
/*----------------------------------------------------------------------------+
| Internal Type Definition & Macro                                            |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| Internal Constant Definition                                                |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| Internal Variables                                                          |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| Global Variables                                                            |
+----------------------------------------------------------------------------*/
BYTE gbqSec=0; // quarter second, decreased by timer interrupt 0
BYTE gbmSec=250; // mini second, decreased by timer interrupt 0
/*----------------------------------------------------------------------------+
| Hardware Related Structure Definition                                       |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| System Initialization Routines                                              |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| General Subroutines                                                         |
+----------------------------------------------------------------------------*/
#ifdef KEIL
VOID iUsbInterruptHandler(VOID) interrupt 0
#else
interrupt [0x03] VOID iUsbInterruptHandler(VOID)         // External Interrupt 0
#endif
{
    RESET_WATCHDOG;
    switch (bVECINT){                       // Identify Interrupt ID

        // below are user defined endpoint interrupt handler
        case VECINT_INPUT_ENDPOINT1:
            IEP1InterruptHandler();
            bVECINT = 0x00;        
            break;
        
        // above are user defined endpoint interrupt handler
        
        case VECINT_OUTPUT_ENDPOINT0:
            OEP0InterruptHandler();
            bVECINT = 0x00;
            break;

        case VECINT_INPUT_ENDPOINT0:
            IEP0InterruptHandler();
            bVECINT = 0x00;
            break;

        case VECINT_SETUP_PACKET_RECEIVED:
            SetupPacketInterruptHandler();
            // note:
            // if setup bit is not cleared, hardware will keep NAKing.
            // if setup bit is cleared, hardware will check endpoint
            // byte count and NAK if NAK bit is et.
            bUSBSTA = USBSTA_SETUP;
            bVECINT = 0x00;
            break;
                        
        case VECINT_RESR_INTERRUPT:
            bFunctionSuspended  = FALSE;
            bUSBSTA = USBSTA_RESR;
            bVECINT = 0x00;            
            break;        
            
        case VECINT_SUSR_INTERRUPT:
            bFunctionSuspended  = TRUE;
            bUSBSTA = USBSTA_SUSR;
            bVECINT = 0x00;
            break;        
            
        case VECINT_RSTR_INTERRUPT:
            bFunctionSuspended  = FALSE;
            UsbReset();
            // clear reset flag
            bUSBSTA = USBSTA_RSTR;
            bVECINT = 0x00;
            break;
            
        case VECINT_RWUP_INTERRUPT:
            bFunctionSuspended  = FALSE;
            bUSBSTA = USBSTA_WAKEUP;
            bVECINT = 0x00;
            bUSBCTL |= USBCTL_RWUP;            
            break;        
        
        default:                    // unknown interrupt ID
            bVECINT = 0xff;
    }
    RESET_WATCHDOG;
}

// configured as mini second timer interrupt
#ifdef KEIL
VOID iTimer0InterruptHandler(VOID) interrupt 1
#else
interrupt [0x0b] VOID iTimer0InterruptHandler(VOID)     // Timer 0 Interrupt
#endif
{

  RESET_WATCHDOG;
  
  // setup 1 mini second interval for timer 0, based on 24MHz clock
  TH0 = DELAY_1MS_12X_24MHz_H; // (65536-2000)>>8,   2000 means 1 mSec
  TL0 = DELAY_1MS_12X_24MHz_L; // (65536-2000)&0xff, 2000 means 1 mSec  

  if (gbqSec == 0) return;
  
  gbmSec--;
  if (gbmSec == 0) {
    gbmSec = 250; // quarter second interval
    gbqSec--;
//    PUTCHAR('@');
  }  
}

/*----------------------------------------------------------------------------+
| Interrupt Sub-routines                                                      |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| Interrupt Service Routines                                                  |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| Main Routine                                                                |
+----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------+
| End of source file                                                          |
+----------------------------------------------------------------------------*/
/*------------------------ Nothing Below This Line --------------------------*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -