USB_ISR.LST
上传用户:gxz1972
上传日期:2019-09-13
资源大小:323k
文件大小:26k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 1   
  2. C51 COMPILER V7.02b, COMPILATION OF MODULE USB_ISR
  3. OBJECT MODULE PLACED IN USB_ISR.OBJ
  4. COMPILER INVOKED BY: C:KeilC51BINc51.exe USB_ISR.c DB OE
  5. stmt level    source
  6.    1          //-----------------------------------------------------------------------------
  7.    2          // USB_ISR.c
  8.    3          //-----------------------------------------------------------------------------
  9.    4          // Copyright 2007 Vson Technology, Inc.
  10.    5          // http://www.usbmcu.com
  11.    6          //
  12.    7          // Program Description:
  13.    8          //
  14.    9          //
  15.   10          //
  16.   11          //
  17.   12          //
  18.   13          // MCU:            C8051F347
  19.   14          // Tool chain:     Keil C51 7.50 / Keil EVAL C51
  20.   15          //                 Silicon Laboratories IDE version 2.6
  21.   16          // Command Line:   
  22.   17          // Project Name:   TR1000
  23.   18          //
  24.   19          //
  25.   20          // Release 1.0
  26.   21          //    -All changes by Brin Cai
  27.   22          //    -24 JUL 2007
  28.   23          //
  29.   24          //
  30.   25          
  31.   26          //-----------------------------------------------------------------------------
  32.   27          // Includes
  33.   28          //-----------------------------------------------------------------------------
  34.   29          
  35.   30          #include "Include_H.h"
  36.   31          
  37.   32          typedef struct {            //  Structure definition of a block of data
  38.   33              BYTE Piece[MAX_BLOCK_SIZE];
  39.   34          }   BLOCK;
  40.   35          
  41.   36          typedef struct {            //  Structure definition of a flash memory page
  42.   37              BYTE FlashPage[FLASH_PAGE_SIZE];
  43.   38          }   PAGE;
  44.   39          
  45.   40          //xdata   BLOCK   TempStorage[BLOCKS_PR_PAGE];    // Temporary storage of between 
  46.   41                                                          // flash writes
  47.   42          
  48.   43          
  49.   44          code    BYTE    Pg0 _at_    0x1400;
  50.   45          code    BYTE    Pg1 _at_    0x1600;
  51.   46          code    BYTE    Pg2 _at_    0x1800;
  52.   47          code    BYTE    Pg3 _at_    0x1A00;
  53.   48          code    BYTE    Pg4 _at_    0x1C00;
  54.   49          code    BYTE    Pg5 _at_    0x1E00;
  55.   50          code    BYTE    Pg6 _at_    0x2000;
  56.   51          code    BYTE    Pg7 _at_    0x2200;
  57.   52          code    BYTE    Pg8 _at_    0x2400;
  58.   53          code    BYTE    Pg9 _at_    0x2600;
  59.   54          
  60.   55          code    BYTE    Pg10    _at_    0x2800;
  61. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 2   
  62.   56          code    BYTE    Pg11    _at_    0x2A00;
  63.   57          code    BYTE    Pg12    _at_    0x2C00;
  64.   58          code    BYTE    Pg13    _at_    0x2E00;
  65.   59          code    BYTE    Pg14    _at_    0x3000;
  66.   60          code    BYTE    Pg15    _at_    0x3200;
  67.   61          code    BYTE    Pg16    _at_    0x3400;
  68.   62          code    BYTE    Pg17    _at_    0x3600;
  69.   63          code    BYTE    Pg18    _at_    0x3800;
  70.   64          code    BYTE    Pg19    _at_    0x3A00;
  71.   65          
  72.   66          data bit bitInterruptFlag = 0;
  73.   67          //idata unsigned char gaucTxData2HostBuffer[64];
  74.   68          /*
  75.   69          idata   BYTE*   PageIndices[20] =   {&Pg0,  &Pg1,   &Pg2,   &Pg3,   &Pg4,   
  76.   70                                               &Pg5,  &Pg6,   &Pg7,   &Pg8,   &Pg9,
  77.   71                                               &Pg10, &Pg11,  &Pg12,  &Pg13,  &Pg14,  
  78.   72                                                                                   &Pg15,  &Pg16,  &Pg17,  &Pg18,  &Pg19};
  79.   73          */
  80.   74          
  81.   75          data    UINT    BytesToWrite;   //  Total number of bytes to write to the host
  82.   76          //data    UINT    BytesToRead;    //  Total number of bytes to read from host
  83.   77          data    BYTE    Buffer[3];      //  Buffer for Setup messages
  84.   78          data    BYTE    NumBlocks;      //  Number of Blocks for this transfer
  85.   79          //data    BYTE    M_State;        //  Current Machine State
  86.   80          data    BYTE    BlockIndex;     //  Index of Current Block in Page
  87.   81          data    BYTE    PageIndex;      //  Index of Current Page in File
  88.   82          data    BYTE    BlocksRead;     //  Total Number of Blocks Read
  89.   83          data    BYTE    BlocksWrote;    //  Total Number of Blocks Written
  90.   84          data    BYTE*   ReadIndex;
  91.   85          
  92.   86          
  93.   87          // code const   BYTE    Serial1[0x0A] = {0x0A,0x03,'A',0,'B',0,'C',0,'D',0};
  94.   88          // Serial Number Defintion
  95.   89          
  96.   90          code    BYTE    LengthFile[3]   _at_    0x1200;
  97.   91          //  {Length(Low Byte), Length(High Byte), Number of Blocks}
  98.   92          
  99.   93          
  100.   94                  
  101.   95          
  102.   96          //-----------------------------------------------------------------------------
  103.   97          // Interrupt Service Routines
  104.   98          //-----------------------------------------------------------------------------
  105.   99          
  106.  100          //-----------------------------------------------------------------------------
  107.  101          // USB_ISR
  108.  102          //-----------------------------------------------------------------------------
  109.  103          //
  110.  104          //
  111.  105          // This is the top level USB ISR. All endpoint interrupt/request
  112.  106          // handlers are called from this function.
  113.  107          //
  114.  108          // Handler routines for any configured interrupts should be
  115.  109          // added in the appropriate endpoint handler call slots.
  116.  110          //
  117.  111          //-----------------------------------------------------------------------------
  118.  112          void USB_ISR () interrupt 8
  119.  113          {
  120.  114   1         BYTE bCommonInt, bInInt, bOutInt;
  121.  115   1      
  122.  116   1         // Read interrupt registers
  123.  117   1         UREAD_BYTE(CMINT, bCommonInt);
  124. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 3   
  125.  118   1         UREAD_BYTE(IN1INT, bInInt);
  126.  119   1         UREAD_BYTE(OUT1INT, bOutInt);
  127.  120   1      
  128.  121   1         
  129.  122   1         // Check for reset interrupt
  130.  123   1         if (bCommonInt & rbRSTINT)
  131.  124   1         {
  132.  125   2            // Call reset handler
  133.  126   2            M_State = USB_RESET_STATUS;
  134.  127   2      
  135.  128   2                //USBReset();
  136.  129   2            //M_State = WAIT_OPEN_DEVICE_STATUS;
  137.  130   2      
  138.  131   2            
  139.  132   2         }
  140.  133   1      
  141.  134   1         // Check for Endpoint0 interrupt
  142.  135   1         if (bInInt & rbEP0)
  143.  136   1         {
  144.  137   2            // Call Endpoint0 handler
  145.  138   2                M_State = EP0_HANDLER_STATUS;
  146.  139   2            //Endpoint0();
  147.  140   2         }
  148.  141   1      
  149.  142   1         // Endpoint1 IN
  150.  143   1         if (bInInt & rbIN1)
  151.  144   1         {
  152.  145   2               bitInterruptFlag = 1;
  153.  146   2               //sbitLED = 1;
  154.  147   2               /*
  155.  148   2               switch (M_State)
  156.  149   2           {
  157.  150   2      
  158.  151   2            case
  159.  152   2               TX_CONFIG_RESPONSE_TO_HOST_STATUS:                  // Stay in Wait State
  160.  153   2               M_State = TX_KEY_DATA_TO_HOST_STATUS;
  161.  154   2                       break;
  162.  155   2      
  163.  156   2            case
  164.  157   2               TX_KEY_DATA_TO_HOST_STATUS:                  // Stay in Idle State
  165.  158   2               M_State = TX_TOUCHPAD_DATA_TO_HOST_STATUS;
  166.  159   2                       break;
  167.  160   2            case
  168.  161   2               TX_TOUCHPAD_DATA_TO_HOST_STATUS:   // Response Host After receive the Config Data
  169.  162   2               M_State = TX_CONFIG_RESPONSE_TO_HOST_STATUS;//ST_TX_KEY_DATA_TO_HOST;
  170.  163   2               break;
  171.  164   2           
  172.  165   2      
  173.  166   2            default:
  174.  167   2               M_State = DEVICE_IDLE_STATUS;           // Unknown State, stay in Error State
  175.  168   2               break;
  176.  169   2            }//switch
  177.  170   2                */
  178.  171   2         }//if
  179.  172   1      
  180.  173   1         // Endpoint2 OUT
  181.  174   1         if (bOutInt & rbOUT2)
  182.  175   1         {
  183.  176   2            bitInterruptFlag = 1;
  184.  177   2                M_State = RX_CONFIG_DATA_FROM_HOST_STATUS;
  185.  178   2         }
  186.  179   1      
  187. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 4   
  188.  180   1         //State_Machine();
  189.  181   1      }
  190.  182          
  191.  183          //-----------------------------------------------------------------------------
  192.  184          // Support Subroutines
  193.  185          //-----------------------------------------------------------------------------
  194.  186          
  195.  187          //-----------------------------------------------------------------------------
  196.  188          // USBReset
  197.  189          //-----------------------------------------------------------------------------
  198.  190          //
  199.  191          // Return Value : None
  200.  192          // Parameters   : None
  201.  193          //
  202.  194          // - Initialize the global Device Status structure (all zeros)
  203.  195          // - Resets all endpoints
  204.  196          //-----------------------------------------------------------------------------
  205.  197          void USBReset ()
  206.  198          {
  207.  199   1         BYTE i, bPower = 0;
  208.  200   1         BYTE * pDevStatus;
  209.  201   1      
  210.  202   1        // Reset device status structure to all zeros (undefined)
  211.  203   1         pDevStatus = (BYTE *)&gDeviceStatus;
  212.  204   1         for (i=0;i<sizeof(DEVICE_STATUS);i++)
  213.  205   1         {
  214.  206   2            *pDevStatus++ = 0x00;
  215.  207   2         }
  216.  208   1      
  217.  209   1         // Set device state to default
  218.  210   1         gDeviceStatus.bDevState = DEV_DEFAULT;
  219.  211   1      
  220.  212   1         // REMOTE_WAKEUP_SUPPORT and SELF_POWERED_SUPPORT
  221.  213   1         // defined in file "usb_desc.h"
  222.  214   1         gDeviceStatus.bRemoteWakeupSupport = REMOTE_WAKEUP_SUPPORT;
  223.  215   1         gDeviceStatus.bSelfPoweredStatus = SELF_POWERED_SUPPORT;
  224.  216   1      
  225.  217   1         // Reset all endpoints
  226.  218   1      
  227.  219   1         // Reset Endpoint0
  228.  220   1         gEp0Status.bEpState = EP_IDLE;         // Reset Endpoint0 state
  229.  221   1         gEp0Status.bEp = 0;                    // Set endpoint number
  230.  222   1         gEp0Status.uMaxP = EP0_MAXP;           // Set maximum packet size
  231.  223   1      
  232.  224   1         // Reset Endpoint1 IN
  233.  225   1         gEp1InStatus.bEpState = EP_HALTED;     // Reset state
  234.  226   1         gEp1InStatus.uNumBytes = 0;            // Reset byte counter
  235.  227   1      
  236.  228   1         // Reset Endpoint2 OUT
  237.  229   1         gEp2OutStatus.bEpState = EP_HALTED;    // Reset state
  238.  230   1         gEp2OutStatus.uNumBytes = 0;           // Reset byte counter
  239.  231   1      
  240.  232   1         // Get Suspend enable/disable status. If enabled, prepare temporary
  241.  233   1         // variable bPower.
  242.  234   1         if (SUSPEND_ENABLE)
  243.  235   1         {
  244.  236   2            bPower = 0x01;                      // Set bit0 (Suspend Enable)
  245.  237   2         }
  246.  238   1      
  247.  239   1         // Get ISO Update enable/disable status. If enabled, prepare temporary
  248.  240   1         // variable bPower.
  249.  241   1         if (ISO_UPDATE_ENABLE)
  250. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 5   
  251.  242   1         {
  252.  243   2            bPower |= 0x80;                     // Set bit7 (ISO Update Enable)
  253.  244   2         }
  254.  245   1      
  255.  246   1         UWRITE_BYTE(POWER, bPower);
  256.  247   1      }
  257.  248          
  258.  249          
  259.  250          
  260.  251          
  261.  252          //-----------------------------------------------------------------------------
  262.  253          // Endpoint0
  263.  254          //-----------------------------------------------------------------------------
  264.  255          //
  265.  256          // Return Value : None
  266.  257          // Parameters   : None
  267.  258          //
  268.  259          //-----------------------------------------------------------------------------
  269.  260          void Endpoint0 ()
  270.  261          {
  271.  262   1         BYTE bTemp = 0;
  272.  263   1         BYTE bCsr1, uTxBytes;
  273.  264   1      
  274.  265   1         UWRITE_BYTE(INDEX, 0);                 // Target ep0
  275.  266   1         UREAD_BYTE(E0CSR, bCsr1);
  276.  267   1      
  277.  268   1         // Handle Setup End
  278.  269   1         if (bCsr1 & rbSUEND)                   // Check for setup end
  279.  270   1         {                                      // Indicate setup end serviced
  280.  271   2            UWRITE_BYTE(E0CSR, rbSSUEND);
  281.  272   2            gEp0Status.bEpState = EP_IDLE;      // ep0 state to idle
  282.  273   2            M_State = DEVICE_IDLE_STATUS;              // ported from usb_file.c
  283.  274   2         }
  284.  275   1      
  285.  276   1         // Handle sent stall
  286.  277   1         if (bCsr1 & rbSTSTL)                   // If last state requested a stall
  287.  278   1         {                                      // Clear Sent Stall bit (STSTL)
  288.  279   2            UWRITE_BYTE(E0CSR, 0);
  289.  280   2            gEp0Status.bEpState = EP_IDLE;      // ep0 state to idle
  290.  281   2            M_State = DEVICE_IDLE_STATUS;              // ported from usb_file.c
  291.  282   2         }
  292.  283   1      
  293.  284   1         // Handle incoming packet
  294.  285   1         if (bCsr1 & rbOPRDY)
  295.  286   1         {
  296.  287   2            // Read the 8-byte command from Endpoint0 FIFO
  297.  288   2            FIFORead(0, 8, (BYTE*)&gEp0Command);
  298.  289   2      
  299.  290   2            // Byte-swap the wIndex field
  300.  291   2            bTemp = gEp0Command.wIndex.c[1];
  301.  292   2            gEp0Command.wIndex.c[1] = gEp0Command.wIndex.c[0];
  302.  293   2            gEp0Command.wIndex.c[0] = bTemp;
  303.  294   2      
  304.  295   2            // Byte-swap the wValue field
  305.  296   2            bTemp = gEp0Command.wValue.c[1];
  306.  297   2            gEp0Command.wValue.c[1] = gEp0Command.wValue.c[0];
  307.  298   2            gEp0Command.wValue.c[0] = bTemp;
  308.  299   2      
  309.  300   2            // Byte-swap the wLength field
  310.  301   2            bTemp = gEp0Command.wLength.c[1];
  311.  302   2            gEp0Command.wLength.c[1] = gEp0Command.wLength.c[0];
  312.  303   2            gEp0Command.wLength.c[0] = bTemp;
  313. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 6   
  314.  304   2      
  315.  305   2            // Decode received command
  316.  306   2            switch (gEp0Command.bmRequestType & CMD_MASK_COMMON)
  317.  307   2            {
  318.  308   3               case  CMD_STD_DEV_OUT:           // Standard device requests
  319.  309   3                  // Decode standard OUT request
  320.  310   3                  switch (gEp0Command.bRequest)
  321.  311   3                  {
  322.  312   4                     case SET_ADDRESS:
  323.  313   4                        SetAddressRequest();
  324.  314   4                        break;
  325.  315   4                     case SET_FEATURE:
  326.  316   4                        SetFeatureRequest();
  327.  317   4                        break;
  328.  318   4                     case CLEAR_FEATURE:
  329.  319   4                        ClearFeatureRequest();
  330.  320   4                        break;
  331.  321   4                     case SET_CONFIGURATION:
  332.  322   4                        SetConfigurationRequest();
  333.  323   4                        break;
  334.  324   4                     case SET_INTERFACE:
  335.  325   4                        SetInterfaceRequest();
  336.  326   4                        break;
  337.  327   4                     // All other OUT requests not supported
  338.  328   4                     case SET_DESCRIPTOR:
  339.  329   4                     default:
  340.  330   4                        gEp0Status.bEpState = EP_ERROR;
  341.  331   4                        break;
  342.  332   4                  }
  343.  333   3                  break;
  344.  334   3      
  345.  335   3               // Decode standard IN request
  346.  336   3               case CMD_STD_DEV_IN:
  347.  337   3                  switch (gEp0Command.bRequest)
  348.  338   3                  {
  349.  339   4                     case GET_STATUS:
  350.  340   4                        GetStatusRequest();
  351.  341   4                        break;
  352.  342   4                     case GET_DESCRIPTOR:
  353.  343   4                        GetDescriptorRequest();
  354.  344   4                        break;
  355.  345   4                     case GET_CONFIGURATION:
  356.  346   4                        GetConfigurationRequest();
  357.  347   4                        break;
  358.  348   4                     case GET_INTERFACE:
  359.  349   4                        GetInterfaceRequest();
  360.  350   4                        break;
  361.  351   4                     // All other IN requests not supported
  362.  352   4                     case SYNCH_FRAME:
  363.  353   4                                    break;//add at Aug.3, 2007
  364.  354   4                     default:
  365.  355   4                        gEp0Status.bEpState = EP_ERROR;
  366.  356   4                        break;
  367.  357   4                  }
  368.  358   3                  break;
  369.  359   3               // All other requests not supported
  370.  360   3               default:
  371.  361   3                  gEp0Status.bEpState = EP_ERROR;
  372.  362   3            }
  373.  363   2      
  374.  364   2            // Write E0CSR according to the result of the serviced out packet
  375.  365   2            bTemp = rbSOPRDY;
  376. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 7   
  377.  366   2            if (gEp0Status.bEpState == EP_ERROR)
  378.  367   2            {
  379.  368   3               bTemp |= rbSDSTL;                // Error condition handled
  380.  369   3                                                // with STALL
  381.  370   3               gEp0Status.bEpState = EP_IDLE;   // Reset state to idle
  382.  371   3            }
  383.  372   2      
  384.  373   2            UWRITE_BYTE(E0CSR, bTemp);
  385.  374   2         }
  386.  375   1      
  387.  376   1         bTemp = 0;                             // Reset temporary variable
  388.  377   1      
  389.  378   1         // If state is transmit, call transmit routine
  390.  379   1         if (gEp0Status.bEpState == EP_TX)
  391.  380   1         {
  392.  381   2            // Check the number of bytes ready for transmit
  393.  382   2            // If less than the maximum packet size, packet will
  394.  383   2            // not be of the maximum size
  395.  384   2            if (gEp0Status.uNumBytes <= EP0_MAXP)
  396.  385   2            {
  397.  386   3               uTxBytes = gEp0Status.uNumBytes;
  398.  387   3               gEp0Status.uNumBytes = 0;        // update byte counter
  399.  388   3               bTemp |= rbDATAEND;              // This will be the last
  400.  389   3                                                // packet for this transfer
  401.  390   3               gEp0Status.bEpState = EP_IDLE;   // Reset endpoint state
  402.  391   3            }
  403.  392   2      
  404.  393   2            // Otherwise, transmit maximum-length packet
  405.  394   2            else
  406.  395   2            {
  407.  396   3               uTxBytes = EP0_MAXP;
  408.  397   3               gEp0Status.uNumBytes -= EP0_MAXP;// update byte counter
  409.  398   3            }
  410.  399   2      
  411.  400   2            // Load FIFO
  412.  401   2            FIFOWrite(0, uTxBytes, (BYTE*)gEp0Status.pData);
  413.  402   2      
  414.  403   2            // Update data pointer
  415.  404   2            gEp0Status.pData = (BYTE*)gEp0Status.pData + uTxBytes;
  416.  405   2      
  417.  406   2            // Update Endpoint0 Control/Status register
  418.  407   2            bTemp |= rbINPRDY;                  // Always transmit a packet
  419.  408   2                                                // when this routine is called
  420.  409   2                                                // (may be zero-length)
  421.  410   2      
  422.  411   2            UWRITE_BYTE(E0CSR, bTemp);          // Write to Endpoint0 Control/Status
  423.  412   2         }
  424.  413   1      
  425.  414   1      }
  426.  415          
  427.  416          
  428.  417          
  429.  418          //-----------------------------------------------------------------------------
  430.  419          // BulkOrInterruptOut
  431.  420          //-----------------------------------------------------------------------------
  432.  421          //
  433.  422          // Return Value : None
  434.  423          // Parameters   :
  435.  424          // 1) PEP_STATUS pEpOutStatus
  436.  425          //
  437.  426          //-----------------------------------------------------------------------------
  438.  427          void BulkOrInterruptOut(PEP_STATUS pEpOutStatus)
  439. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 8   
  440.  428          {
  441.  429   1         UINT uBytes;
  442.  430   1         BYTE bTemp = 0;
  443.  431   1         BYTE bCsrL, bCsrH;
  444.  432   1      
  445.  433   1         UWRITE_BYTE(INDEX, pEpOutStatus->bEp); // Index to current endpoint
  446.  434   1         UREAD_BYTE(EOUTCSRL, bCsrL);
  447.  435   1         UREAD_BYTE(EOUTCSRH, bCsrH);
  448.  436   1      
  449.  437   1         // Make sure this endpoint is not halted
  450.  438   1         if (pEpOutStatus->bEpState != EP_HALTED)
  451.  439   1         {
  452.  440   2            // Handle STALL condition sent
  453.  441   2            if (bCsrL & rbOutSTSTL)
  454.  442   2            {
  455.  443   3               // Clear Send Stall, Sent Stall, and data toggle
  456.  444   3               UWRITE_BYTE(EOUTCSRL, rbOutCLRDT);
  457.  445   3            }
  458.  446   2      
  459.  447   2            // Read received packet
  460.  448   2            if(bCsrL & rbOutOPRDY)
  461.  449   2            {
  462.  450   3               // Get packet length
  463.  451   3               UREAD_BYTE(EOUTCNTL, bTemp);     // Low byte
  464.  452   3               uBytes = (UINT)bTemp & 0x00FF;
  465.  453   3      
  466.  454   3               UREAD_BYTE(EOUTCNTH, bTemp);     // High byte
  467.  455   3               uBytes |= (UINT)bTemp << 8;
  468.  456   3      
  469.  457   3               if (M_State == DEVICE_IDLE_STATUS) 
  470.  458   3               {
  471.  459   4                  FIFORead(0x02, uBytes, &Buffer);
  472.  460   4               }                       
  473.  461   3               else
  474.  462   3               {
  475.  463   4                  FIFORead(0x02, uBytes, (BYTE*)(&gaucTempStorage[BlockIndex]));
  476.  464   4               }
  477.  465   3      
  478.  466   3               // Clear out-packet-ready
  479.  467   3               UWRITE_BYTE(INDEX, pEpOutStatus->bEp);
  480.  468   3               UWRITE_BYTE(EOUTCSRL, 0);
  481.  469   3      
  482.  470   3               // Read updated status register
  483.  471   3               //UWRITE_BYTE(INDEX, pEpOutStatus->bEp); // Index to current endpoint
  484.  472   3               //UREAD_BYTE(EOUTCSRL, bCsrL);
  485.  473   3            }
  486.  474   2         }
  487.  475   1      }
  488.  476          
  489.  477          //-----------------------------------------------------------------------------
  490.  478          // BulkOrInterruptIn
  491.  479          //-----------------------------------------------------------------------------
  492.  480          //
  493.  481          // Return Value : None
  494.  482          // Parameters   :
  495.  483          // 1) PEP_STATUS pEpOutStatus
  496.  484          // 2) BYTE * DataToWrite
  497.  485          // 3) UINT NumBytes
  498.  486          //
  499.  487          // - Places DataToWrite on the IN FIFO
  500.  488          // - Sets Packet Ready Bit
  501.  489          //-----------------------------------------------------------------------------
  502. C51 COMPILER V7.02b   USB_ISR                                                              11/30/2007 14:07:13 PAGE 9   
  503.  490          void BulkOrInterruptIn (PEP_STATUS pEpInStatus, BYTE * DataToWrite,
  504.  491                                  UINT NumBytes)
  505.  492          {
  506.  493   1         BYTE bCsrL, bCsrH;
  507.  494   1      
  508.  495   1         UWRITE_BYTE(INDEX, pEpInStatus->bEp);  // Index to current endpoint
  509.  496   1         UREAD_BYTE(EINCSRL, bCsrL);
  510.  497   1         UREAD_BYTE(EINCSRH, bCsrH);
  511.  498   1      
  512.  499   1         // Make sure this endpoint is not halted
  513.  500   1         if (pEpInStatus->bEpState != EP_HALTED)
  514.  501   1         {
  515.  502   2            // Handle STALL condition sent
  516.  503   2            if (bCsrL & rbInSTSTL)
  517.  504   2            {
  518.  505   3               UWRITE_BYTE(EINCSRL, rbInCLRDT); // Clear Send Stall and Sent Stall,
  519.  506   3                                                // and clear data toggle
  520.  507   3            }
  521.  508   2      
  522.  509   2            // If a FIFO slot is open, write a new packet to the IN FIFO
  523.  510   2            if (!(bCsrL & rbInINPRDY))
  524.  511   2            {
  525.  512   3               pEpInStatus->uNumBytes = NumBytes;
  526.  513   3               pEpInStatus->pData = (BYTE*)DataToWrite;
  527.  514   3      
  528.  515   3               // Write <uNumBytes> bytes to the <bEp> FIFO
  529.  516   3               FIFOWrite(pEpInStatus->bEp, pEpInStatus->uNumBytes,
  530.  517   3                  (BYTE*)pEpInStatus->pData);
  531.  518   3      
  532.  519   3               BytesToWrite -= NumBytes;
  533.  520   3               ReadIndex += NumBytes;
  534.  521   3               BlocksWrote++;
  535.  522   3      
  536.  523   3               // Set Packet Ready bit (INPRDY)
  537.  524   3               UWRITE_BYTE(EINCSRL, rbInINPRDY);
  538.  525   3      
  539.  526   3               // Check updated endopint status
  540.  527   3               //UREAD_BYTE(EINCSRL, bCsrL);
  541.  528   3      
  542.  529   3            }
  543.  530   2         }
  544.  531   1      }
  545.  532          
  546.  533          //-----------------------------------------------------------------------------
  547.  534          // End Of File
  548.  535          //-----------------------------------------------------------------------------
  549. MODULE INFORMATION:   STATIC OVERLAYABLE
  550.    CODE SIZE        =    857    ----
  551.    CONSTANT SIZE    =   ----    ----
  552.    XDATA SIZE       =   ----    ----
  553.    PDATA SIZE       =   ----    ----
  554.    DATA SIZE        =     13      20
  555.    IDATA SIZE       =   ----    ----
  556.    BIT SIZE         =      1    ----
  557. END OF MODULE INFORMATION.
  558. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)