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

传真(Fax)编程

开发平台:

C/C++

  1. C51 COMPILER V7.02b   USB_UTILITIES                                                        11/30/2007 14:07:14 PAGE 1   
  2. C51 COMPILER V7.02b, COMPILATION OF MODULE USB_UTILITIES
  3. OBJECT MODULE PLACED IN USB_Utilities.OBJ
  4. COMPILER INVOKED BY: C:KeilC51BINc51.exe USB_Utilities.c DB OE
  5. stmt level    source
  6.    1          //-----------------------------------------------------------------------------
  7.    2          // USB_Utilities.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          
  33.   28          #include "Include_H.h"
  34.   29          
  35.   30          //-----------------------------------------------------------------------------
  36.   31          // HaltEndpoint
  37.   32          //-----------------------------------------------------------------------------
  38.   33          //
  39.   34          // Return Value : None
  40.   35          // Parameters   : 
  41.   36          // 1) UINT uEp
  42.   37          //
  43.   38          //-----------------------------------------------------------------------------
  44.   39          BYTE HaltEndpoint (UINT uEp)
  45.   40          {
  46.   41   1         BYTE bReturnState, bIndex;
  47.   42   1      
  48.   43   1         // Save current INDEX value and target selected endpoint
  49.   44   1         UREAD_BYTE (INDEX, bIndex);
  50.   45   1         UWRITE_BYTE (INDEX, (BYTE)uEp & 0x00EF);
  51.   46   1      
  52.   47   1         // Halt selected endpoint and update its status flag
  53.   48   1         switch (uEp)
  54.   49   1         {
  55.   50   2            case EP1_IN:
  56.   51   2               UWRITE_BYTE (EINCSRL, rbInSDSTL);
  57.   52   2               gEp1InStatus.bEpState = EP_HALTED;
  58.   53   2               bReturnState = EP_IDLE;          // Return success flag
  59.   54   2               break;
  60.   55   2            case EP2_OUT:
  61. C51 COMPILER V7.02b   USB_UTILITIES                                                        11/30/2007 14:07:14 PAGE 2   
  62.   56   2               UWRITE_BYTE (EOUTCSRL, rbOutSDSTL);
  63.   57   2               gEp2OutStatus.bEpState = EP_HALTED;
  64.   58   2               bReturnState = EP_IDLE;          // Return success flag
  65.   59   2               break;
  66.   60   2            default:
  67.   61   2               bReturnState = EP_ERROR;         // Return error flag
  68.   62   2                                                // if endpoint not found
  69.   63   2               break;
  70.   64   2         }
  71.   65   1      
  72.   66   1         UWRITE_BYTE (INDEX, bIndex);           // Restore saved INDEX
  73.   67   1         return bReturnState;
  74.   68   1      }
  75.   69          
  76.   70          //-----------------------------------------------------------------------------
  77.   71          // EnableEndpoint
  78.   72          //-----------------------------------------------------------------------------
  79.   73          //
  80.   74          // Return Value : None
  81.   75          // Parameters   : 
  82.   76          // 1) UINT uEp
  83.   77          //
  84.   78          //-----------------------------------------------------------------------------
  85.   79          BYTE EnableEndpoint (UINT uEp)
  86.   80          {
  87.   81   1         BYTE bReturnState, bIndex;
  88.   82   1      
  89.   83   1         // Save current INDEX value and target selected endpoint
  90.   84   1         UREAD_BYTE (INDEX, bIndex);
  91.   85   1         UWRITE_BYTE (INDEX, (BYTE)uEp & 0x00EF);
  92.   86   1      
  93.   87   1         // Flag selected endpoint has HALTED
  94.   88   1         switch (uEp)
  95.   89   1         {
  96.   90   2            case EP1_IN:
  97.   91   2               // Disable STALL condition and clear the data toggle
  98.   92   2               UWRITE_BYTE (EINCSRL, rbInCLRDT);
  99.   93   2               gEp1InStatus.bEpState = EP_IDLE; // Return success
  100.   94   2               bReturnState = EP_IDLE;
  101.   95   2               break;
  102.   96   2            case EP2_OUT:
  103.   97   2               // Disable STALL condition and clear the data toggle
  104.   98   2               UWRITE_BYTE (EOUTCSRL, rbOutCLRDT);
  105.   99   2               gEp2OutStatus.bEpState = EP_IDLE;// Return success
  106.  100   2               bReturnState = EP_IDLE;
  107.  101   2               break;
  108.  102   2            default:
  109.  103   2               bReturnState = EP_ERROR;         // Return error
  110.  104   2                                                // if no endpoint found
  111.  105   2               break;
  112.  106   2         }
  113.  107   1      
  114.  108   1         UWRITE_BYTE (INDEX, bIndex);           // Restore INDEX
  115.  109   1      
  116.  110   1         return bReturnState;
  117.  111   1      }
  118.  112          
  119.  113          //-----------------------------------------------------------------------------
  120.  114          // GetEpStatus
  121.  115          //-----------------------------------------------------------------------------
  122.  116          //
  123.  117          // Return Value : None
  124. C51 COMPILER V7.02b   USB_UTILITIES                                                        11/30/2007 14:07:14 PAGE 3   
  125.  118          // Parameters   : 
  126.  119          // 1) UINT uEp
  127.  120          //
  128.  121          //-----------------------------------------------------------------------------
  129.  122          BYTE GetEpStatus (UINT uEp)
  130.  123          {
  131.  124   1         BYTE bReturnState;
  132.  125   1      
  133.  126   1         // Get selected endpoint status
  134.  127   1         switch (uEp)
  135.  128   1         {
  136.  129   2            case EP1_IN:
  137.  130   2               bReturnState = gEp1InStatus.bEpState;
  138.  131   2               break;
  139.  132   2            case EP2_OUT:
  140.  133   2               bReturnState = gEp2OutStatus.bEpState;
  141.  134   2               break;
  142.  135   2            default:
  143.  136   2               bReturnState = EP_ERROR;
  144.  137   2               break;
  145.  138   2         }
  146.  139   1      
  147.  140   1         return bReturnState;
  148.  141   1      }
  149.  142          
  150.  143          //-----------------------------------------------------------------------------
  151.  144          // SetConfiguration
  152.  145          //-----------------------------------------------------------------------------
  153.  146          //
  154.  147          // Return Value : None
  155.  148          // Parameters   : 
  156.  149          // 1) BYTE SelectConfig
  157.  150          //
  158.  151          //-----------------------------------------------------------------------------
  159.  152          BYTE SetConfiguration(BYTE SelectConfig)
  160.  153          {
  161.  154   1         BYTE bReturnState = EP_IDLE;           // Endpoint state return value
  162.  155   1      
  163.  156   1         PIF_STATUS pIfStatus;                  // Pointer to interface status
  164.  157   1                                                // structure
  165.  158   1      
  166.  159   1         // Store address of selected config desc
  167.  160   1         gDeviceStatus.pConfig = &gDescriptorMap.bCfg1;
  168.  161   1      
  169.  162   1         // Confirm that this configuration descriptor matches the requested
  170.  163   1         // configuration value
  171.  164   1         if (gDeviceStatus.pConfig[cfg_bConfigurationValue] != SelectConfig)
  172.  165   1         {
  173.  166   2            bReturnState = EP_ERROR;
  174.  167   2         }
  175.  168   1      
  176.  169   1         else
  177.  170   1         {
  178.  171   2            // Store number of interfaces for this configuration
  179.  172   2            gDeviceStatus.bNumInterf = gDeviceStatus.pConfig[cfg_bNumInterfaces];
  180.  173   2      
  181.  174   2            // Store total number of interface descriptors for this configuration
  182.  175   2            gDeviceStatus.bTotalInterfDsc = MAX_IF;
  183.  176   2      
  184.  177   2            // Get pointer to the interface status structure
  185.  178   2            pIfStatus = (PIF_STATUS)&gDeviceStatus.IfStatus[0];
  186.  179   2      
  187. C51 COMPILER V7.02b   USB_UTILITIES                                                        11/30/2007 14:07:14 PAGE 4   
  188.  180   2            // Build Interface status structure for Interface0
  189.  181   2            pIfStatus->bIfNumber = 0;           // Set interface number
  190.  182   2            pIfStatus->bCurrentAlt = 0;         // Select alternate number zero
  191.  183   2            pIfStatus->bNumAlts = 0;            // No other alternates
  192.  184   2      
  193.  185   2            SetInterface(pIfStatus);            // Configure Interface0, Alternate0
  194.  186   2      
  195.  187   2            gDeviceStatus.bDevState = DEV_CONFIG;// Set device state to configured
  196.  188   2            gDeviceStatus.bCurrentConfig = SelectConfig;// Store current config
  197.  189   2         }
  198.  190   1      
  199.  191   1         return bReturnState;
  200.  192   1      }
  201.  193          
  202.  194          //-----------------------------------------------------------------------------
  203.  195          // SetInterface
  204.  196          //-----------------------------------------------------------------------------
  205.  197          //
  206.  198          // Return Value : None
  207.  199          // Parameters   : 
  208.  200          // 1) PIF_STATUS pIfStatus
  209.  201          //
  210.  202          //-----------------------------------------------------------------------------
  211.  203          BYTE SetInterface(PIF_STATUS pIfStatus)
  212.  204          {
  213.  205   1         BYTE bReturnState = EP_IDLE;
  214.  206   1         BYTE bIndex;
  215.  207   1      
  216.  208   1         // Save current INDEX value
  217.  209   1         UREAD_BYTE (INDEX, bIndex);
  218.  210   1      
  219.  211   1         // Add actions for each possible interface alternate selections
  220.  212   1         switch(pIfStatus->bIfNumber)
  221.  213   1         {
  222.  214   2            // Configure endpoints for interface0
  223.  215   2            case 0:
  224.  216   2               // Configure Endpoint1 IN
  225.  217   2               UWRITE_BYTE(INDEX, 1);           // Index to Endpoint1 registers
  226.  218   2      
  227.  219   2               // direction = IN ; Double-buffering enabled
  228.  220   2               UWRITE_BYTE(EINCSRH, (rbInDIRSEL | rbInDBIEN));      
  229.  221   2               gEp1InStatus.uNumBytes = 0;      // Reset byte counter
  230.  222   2               gEp1InStatus.uMaxP = EP1_IN_MAXP;// Set maximum packet size
  231.  223   2               gEp1InStatus.bEp = EP1_IN;       // Set endpoint address
  232.  224   2               gEp1InStatus.bEpState = EP_IDLE; // Set endpoint state
  233.  225   2      
  234.  226   2               // Endpoint2 OUT
  235.  227   2               UWRITE_BYTE(INDEX, 2);           // Index to Endpoint2 registers
  236.  228   2               // Double-buffering enabled ; direction = OUT
  237.  229   2               UWRITE_BYTE(EOUTCSRH, rbOutDBOEN);      
  238.  230   2               gEp2OutStatus.uNumBytes = 0;     // Reset byte counter
  239.  231   2               gEp2OutStatus.uMaxP = EP2_OUT_MAXP;// Set maximum packet size
  240.  232   2               gEp2OutStatus.bEp = EP2_OUT;     // Set endpoint number
  241.  233   2               gEp2OutStatus.bEpState = EP_IDLE;// Set endpoint state
  242.  234   2      
  243.  235   2               UWRITE_BYTE(INDEX, 0);           // Return to index 0
  244.  236   2      
  245.  237   2               break;
  246.  238   2      
  247.  239   2            // Configure endpoints for interface1
  248.  240   2            case 1:
  249.  241   2      
  250. C51 COMPILER V7.02b   USB_UTILITIES                                                        11/30/2007 14:07:14 PAGE 5   
  251.  242   2            // Configure endpoints for interface2
  252.  243   2            case 2:
  253.  244   2      
  254.  245   2            // Default (error)
  255.  246   2            default:
  256.  247   2               bReturnState = EP_ERROR;
  257.  248   2         }
  258.  249   1         UWRITE_BYTE (INDEX, bIndex);           // Restore INDEX
  259.  250   1      
  260.  251   1         return bReturnState;
  261.  252   1      }
  262.  253          
  263.  254          //-----------------------------------------------------------------------------
  264.  255          // SetInterface
  265.  256          //-----------------------------------------------------------------------------
  266.  257          //
  267.  258          // Return Value : None
  268.  259          // Parameters   : 
  269.  260          // 1) BYTE bEp
  270.  261          // 2) UINT uNumBytes
  271.  262          // 3) BYTE * pData
  272.  263          //
  273.  264          // Read from the selected endpoint FIFO
  274.  265          //
  275.  266          //-----------------------------------------------------------------------------
  276.  267          void FIFORead (BYTE bEp, UINT uNumBytes, BYTE * pData)
  277.  268          {
  278.  269   1         BYTE TargetReg;
  279.  270   1         UINT i;
  280.  271   1      
  281.  272   1         // If >0 bytes requested,
  282.  273   1         if (uNumBytes)
  283.  274   1         {
  284.  275   2            TargetReg = FIFO_EP0 + bEp;         // Find address for target
  285.  276   2                                                // endpoint FIFO
  286.  277   2      
  287.  278   2            USB0ADR = (TargetReg & 0x3F);       // Set address (mask out bits7-6)
  288.  279   2            USB0ADR |= 0xC0;                    // Set auto-read and initiate
  289.  280   2                                                // first read
  290.  281   2      
  291.  282   2            // Unload <NumBytes> from the selected FIFO
  292.  283   2      
  293.  284   2                //Read NumBytes-1
  294.  285   2            for(i=0;i<uNumBytes-1;i++)
  295.  286   2            {
  296.  287   3               while(USB0ADR & 0x80);           // Wait for BUSY->'0' (data ready)
  297.  288   3               pData[i] = USB0DAT;              // Copy data byte
  298.  289   3            }
  299.  290   2      
  300.  291   2            //Read the last byte
  301.  292   2            while(USB0ADR & 0x80);              // Wait for BUSY->'0' (data ready)
  302.  293   2            pData[i] = USB0DAT;                 // Copy data byte
  303.  294   2            USB0ADR = 0;                        // Clear auto-read
  304.  295   2         }
  305.  296   1      }
  306.  297          
  307.  298          //-----------------------------------------------------------------------------
  308.  299          // FIFOWrite
  309.  300          //-----------------------------------------------------------------------------
  310.  301          //
  311.  302          // Return Value : None
  312.  303          // Parameters   : 
  313. C51 COMPILER V7.02b   USB_UTILITIES                                                        11/30/2007 14:07:14 PAGE 6   
  314.  304          // 1) BYTE bEp
  315.  305          // 2) UINT uNumBytes
  316.  306          // 3) BYTE * pData
  317.  307          //
  318.  308          // Write to the selected endpoint FIFO
  319.  309          //
  320.  310          //-----------------------------------------------------------------------------
  321.  311          void FIFOWrite (BYTE bEp, UINT uNumBytes, BYTE * pData)
  322.  312          {
  323.  313   1         BYTE TargetReg;
  324.  314   1         UINT i;
  325.  315   1      
  326.  316   1         // If >0 bytes requested,
  327.  317   1         if (uNumBytes)
  328.  318   1         {
  329.  319   2            TargetReg = FIFO_EP0 + bEp;         // Find address for target //FIO_EP0==0X20
  330.  320   2                                                // endpoint FIFO
  331.  321   2      
  332.  322   2            while(USB0ADR & 0x80);              // Wait for BUSY->'0'
  333.  323   2                                                // (register available)
  334.  324   2            USB0ADR = (TargetReg & 0x3F);       // Set address (mask out bits7-6)
  335.  325   2      
  336.  326   2            // Write <NumBytes> to the selected FIFO
  337.  327   2            for(i=0;i<uNumBytes;i++)
  338.  328   2            {
  339.  329   3               USB0DAT = pData[i];
  340.  330   3               while(USB0ADR & 0x80);           // Wait for BUSY->'0' (data ready)
  341.  331   3            }
  342.  332   2         }
  343.  333   1      }
  344.  334          
  345.  335          //-----------------------------------------------------------------------------
  346.  336          // End Of File
  347.  337          //-----------------------------------------------------------------------------
  348. MODULE INFORMATION:   STATIC OVERLAYABLE
  349.    CODE SIZE        =    566    ----
  350.    CONSTANT SIZE    =   ----    ----
  351.    XDATA SIZE       =   ----    ----
  352.    PDATA SIZE       =   ----    ----
  353.    DATA SIZE        =   ----      12
  354.    IDATA SIZE       =   ----    ----
  355.    BIT SIZE         =   ----    ----
  356. END OF MODULE INFORMATION.
  357. C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)