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

📄 isr.lst

📁 固件源代码 C52驱动编程源码学习中
💻 LST
字号:
C51 COMPILER V7.01  ISR                                                                    09/27/2003 23:46:50 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN isr.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE isr.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //#include <reg51.h>                /* special function register declarations   */
   2          #include <stdio.h>
   3          #include <string.h>
   4          
   5          #include "Epphal.h"
   6          #include "d12ci.h"
   7          #include "mainloop.h"
   8          #include "USB100.h"
   9          
  10          void bus_reset(void);
  11          
  12          void ep0_txdone(void);
  13          void ep0_rxdone(void);
  14          void ep1_txdone(void);
  15          void ep1_rxdone(void);
  16          void main_txdone(void);
  17          void main_rxdone(void);
  18          
  19          void dma_eot(void);
  20          
  21          /*
  22          //*************************************************************************
  23          //  Public static data
  24          //*************************************************************************
  25          */
  26          EPPFLAGS bEPPflags;
  27          
  28          /* Control endpoint TX/RX buffers */
  29          extern CONTROL_XFER ControlData;
  30          
  31          /* ISR static vars */
  32          unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
  33          unsigned char idata EpBuf[EP2_PACKET_SIZE];
  34          IO_REQUEST idata ioRequest;
  35          unsigned char ioSize, ioCount;
  36          
  37          unsigned long ClockTicks = 0;
  38          unsigned char xdata MainEpBuf[256];
  39          
  40          extern BOOL bNoRAM;
  41          
  42          timer_isr() interrupt 1
  43          {
  44   1              DISABLE;
  45   1              ClockTicks++;
  46   1              bEPPflags.bits.timer = 1;
  47   1              ENABLE;
  48   1      }
  49          
  50          
  51          void fn_usb_isr()
  52          {
  53   1              unsigned int i_st;
  54   1      
  55   1              bEPPflags.bits.in_isr = 1;
C51 COMPILER V7.01  ISR                                                                    09/27/2003 23:46:50 PAGE 2   

  56   1              
  57   1      
  58   1              i_st = D12_ReadInterruptRegister();
  59   1              
  60   1              if(i_st != 0) {
  61   2                      if(i_st & D12_INT_BUSRESET) {
  62   3                              bus_reset();
  63   3                              bEPPflags.bits.bus_reset = 1;
  64   3                      }
  65   2      
  66   2                      if(i_st & D12_INT_EOT)
  67   2                              dma_eot();
  68   2      
  69   2                      if(i_st & D12_INT_SUSPENDCHANGE)
  70   2                              bEPPflags.bits.suspend = 1;
  71   2      
  72   2                      
  73   2                      if(i_st & D12_INT_ENDP0IN)
  74   2                              ep0_txdone();
  75   2                      if(i_st & D12_INT_ENDP0OUT)
  76   2                              ep0_rxdone();
  77   2                      if(i_st & D12_INT_ENDP1IN)
  78   2                              ep1_txdone();
  79   2                      if(i_st & D12_INT_ENDP1OUT)
  80   2                              ep1_rxdone();
  81   2                      if(i_st & D12_INT_ENDP2IN)
  82   2                              main_txdone();
  83   2                      if(i_st & D12_INT_ENDP2OUT)
  84   2                              main_rxdone();
  85   2                      
  86   2              }
  87   1              
  88   1              bEPPflags.bits.in_isr = 0;
  89   1              
  90   1      }
  91          
  92          usb_isr() interrupt 0
  93          {
  94   1              DISABLE;
  95   1              fn_usb_isr();
  96   1              ENABLE;
  97   1      }
  98          void bus_reset(void)
  99          {
 100   1      }
 101          void dma_eot(void)
 102          {
 103   1      }
 104          //---------------------------------
 105          void ep0_rxdone(void)
 106          {
 107   1              unsigned char ep_last, i;
 108   1      
 109   1              ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
 110   1              if (ep_last & D12_SETUPPACKET) {
 111   2      
 112   2                      ControlData.wLength = 0;
 113   2                      ControlData.wCount = 0;
 114   2              //判断端点是否满,如是,则取出
 115   2                      if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
 116   2                              (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
 117   3      
C51 COMPILER V7.01  ISR                                                                    09/27/2003 23:46:50 PAGE 3   

 118   3                              D12_SetEndpointStatus(0, 1);
 119   3                              D12_SetEndpointStatus(1, 1);
 120   3                              bEPPflags.bits.control_state = USB_IDLE;
 121   3                              
 122   3                              return;
 123   3                      }
 124   2      
 125   2                      ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
 126   2                      ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
 127   2                      ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
 128   2      
 129   2                      // Acknowledge setup here to unlock in/out endp
 130   2              //向控制输出端点发送应答建立命令以重新使能下一个建立阶段
 131   2                      D12_AcknowledgeEndpoint(0);
 132   2                      D12_AcknowledgeEndpoint(1);
 133   2      
 134   2                      ControlData.wLength = ControlData.DeviceRequest.wLength;
 135   2                      ControlData.wCount = 0;
 136   2              //需要证实控制传输是控制读还是写,如果是读:
 137   2              //如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
 138   2              //主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
 139   2              //模式即准备在主机发送请求时发送数据
 140   2      
 141   2                      if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
 142   3                              bEPPflags.bits.setup_packet = 1;
 143   3                              bEPPflags.bits.control_state = USB_IDLE;                /* get command */
 144   3                      }
 145   2              //如果是写
 146   2                      else {
 147   3                              if (ControlData.DeviceRequest.wLength == 0) {
 148   4                                      bEPPflags.bits.setup_packet = 1;
 149   4                                      bEPPflags.bits.control_state = USB_IDLE;                /* set command */
 150   4                              }
 151   3                              else {
 152   4                                      if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
 153   5                                              bEPPflags.bits.control_state = USB_IDLE;
 154   5                                              D12_SetEndpointStatus(0, 1);
 155   5                                              D12_SetEndpointStatus(1, 1);
 156   5                                      }
 157   4                                      else {
 158   5                                              bEPPflags.bits.control_state = USB_RECEIVE;     /* set command with OUT token */
 159   5                                      }
 160   4                              } // set command with data
 161   3                      } // else set command
 162   2              } // if setup packet
 163   1      
 164   1              else if (bEPPflags.bits.control_state == USB_RECEIVE) {
 165   2                      i =     D12_ReadEndpoint(0, EP0_PACKET_SIZE,
 166   2                              ControlData.dataBuffer + ControlData.wCount);
 167   2      
 168   2                      ControlData.wCount += i;
 169   2                      if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
 170   3                              bEPPflags.bits.setup_packet = 1;
 171   3                              bEPPflags.bits.control_state = USB_IDLE;
 172   3                      }
 173   2              }
 174   1      
 175   1              else {
 176   2                      bEPPflags.bits.control_state = USB_IDLE;
 177   2              }
 178   1      
 179   1      }
C51 COMPILER V7.01  ISR                                                                    09/27/2003 23:46:50 PAGE 4   

 180          //----------------------------------
 181          void ep0_txdone(void)
 182          {
 183   1              short i = ControlData.wLength - ControlData.wCount;
 184   1      
 185   1              D12_ReadLastTransactionStatus(1); // Clear interrupt flag
 186   1      
 187   1              if (bEPPflags.bits.control_state != USB_TRANSMIT) 
 188   1                      return;
 189   1              //-------------------------
 190   1              if( i >= EP0_PACKET_SIZE) {
 191   2                      D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
 192   2                      ControlData.wCount += EP0_PACKET_SIZE;
 193   2      
 194   2                      bEPPflags.bits.control_state = USB_TRANSMIT;
 195   2              }
 196   1              else if( i != 0) {
 197   2                      D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
 198   2                      ControlData.wCount += i;
 199   2      
 200   2                      bEPPflags.bits.control_state = USB_IDLE;
 201   2              }
 202   1              else if (i == 0){
 203   2                      D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
 204   2      
 205   2                      bEPPflags.bits.control_state = USB_IDLE;
 206   2              }
 207   1      
 208   1      }
 209          //----------------------------------
 210          void ep1_txdone(void)
 211          {
 212   1              D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
 213   1      }
 214          
 215          void ep1_rxdone(void)
 216          {
 217   1              unsigned char len;
 218   1      
 219   1              D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
 220   1      
 221   1              len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);
 222   1      
 223   1              if(len != 0)
 224   1                      bEPPflags.bits.ep1_rxdone = 1;
 225   1      }
 226          //---------------------------------
 227          void main_txdone(void)
 228          {
 229   1              unsigned char len;
 230   1      
 231   1              D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
 232   1      
 233   1              len = ioSize - ioCount;
 234   1              if(len == 0) {
 235   2                      if(bEPPflags.bits.dma_state == DMA_PENDING)
 236   2                              bEPPflags.bits.setup_dma ++;
 237   2                      else
 238   2                              bEPPflags.bits.dma_state = DMA_IDLE;
 239   2              }
 240   1              else {
 241   2                      if(len > 64)
C51 COMPILER V7.01  ISR                                                                    09/27/2003 23:46:50 PAGE 5   

 242   2                              len = 64;
 243   2                      if(bNoRAM)
 244   2                              len = D12_WriteEndpoint(5, len, EpBuf + ioCount);
 245   2                      else
 246   2                              len = D12_WriteEndpoint(5, len, MainEpBuf + ioCount);
 247   2                      ioCount += len;
 248   2              }
 249   1      }
 250          
 251          void main_rxdone(void)
 252          {
 253   1              unsigned char len;
 254   1      
 255   1              D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
 256   1      
 257   1              if(bNoRAM)
 258   1                      len = D12_ReadEndpoint(4, 64, EpBuf + ioCount);
 259   1              else
 260   1                      len = D12_ReadEndpoint(4, 64, MainEpBuf + ioCount);
 261   1              ioCount += len;
 262   1              if(bNoRAM)
 263   1                      len = D12_ReadEndpoint(4, 64, EpBuf + ioCount);
 264   1              else
 265   1                      len = D12_ReadEndpoint(4, 64, MainEpBuf + ioCount);
 266   1              ioCount += len;
 267   1              if(ioCount >= ioSize) {
 268   2                      if(bEPPflags.bits.dma_state == DMA_PENDING)
 269   2                              bEPPflags.bits.setup_dma ++;
 270   2                      else
 271   2                              bEPPflags.bits.dma_state = DMA_IDLE;
 272   2              }
 273   1              
 274   1      }
 275          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    873    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    256    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       5
   IDATA SIZE       =     74    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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