USB_Standard_Requests.#1
上传用户:gxz1972
上传日期:2019-09-13
资源大小:323k
文件大小:14k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. //-----------------------------------------------------------------------------
  2. // USB_Standard_Requests.c
  3. //-----------------------------------------------------------------------------
  4. // Copyright 2007 Vson Technology, Inc.
  5. // http://www.usbmcu.com
  6. //
  7. // Program Description:
  8. //
  9. //
  10. //
  11. //
  12. //
  13. // MCU:            C8051F347
  14. // Tool chain:     Keil C51 7.50 / Keil EVAL C51
  15. //                 Silicon Laboratories IDE version 2.6
  16. // Command Line:   
  17. // Project Name:   TR1000
  18. //
  19. //
  20. // Release 1.0
  21. //    -All changes by Brian Cai
  22. //    -24 JUL 2007
  23. //
  24. //
  25. //-----------------------------------------------------------------------------
  26. // Includes
  27. //-----------------------------------------------------------------------------
  28. #include "Include_H.h"
  29. //-----------------------------------------------------------------------------
  30. // USB_Standard_Requests.c Global Variables
  31. //-----------------------------------------------------------------------------
  32. BYTE        bEpState;
  33. UINT        uNumBytes;
  34. PIF_STATUS  pIfStatus;
  35. //------------------------------------------------------------------------
  36. //  Standard Request Routines
  37. //------------------------------------------------------------------------
  38. //
  39. // These functions should be called when an endpoint0 command has
  40. // been received with a corresponding "bRequest" field.
  41. //
  42. // - Each routine performs all command field checking, and
  43. //   modifies fields of the Ep0Status structure accordingly
  44. //
  45. // After a call to a standard request routine, the calling routine
  46. // should check Ep0Status.bEpState to determine the required action
  47. // (i.e., send a STALL for EP_ERROR, load the FIFO for EP_TX).
  48. // For transmit status, the data pointer (Ep0Status.pData),
  49. // and data length (Ep0Status.uNumBytes) are prepared before the
  50. // standard request routine returns. The calling routine must write
  51. // the data to the FIFO and handle all data transfer
  52. //-----------------------------------------------------------------------------
  53. // SetAddressRequest
  54. //-----------------------------------------------------------------------------
  55. //
  56. // Return Value : None
  57. // Parameters   : None
  58. //
  59. //-----------------------------------------------------------------------------
  60. void SetAddressRequest ()
  61. {
  62.    // Index and Length fields must be zero
  63.    // Device state must be default or addressed
  64.    if ((gEp0Command.wIndex.i) || (gEp0Command.wLength.i) ||
  65.    (gDeviceStatus.bDevState == DEV_CONFIG))
  66.    {
  67.       bEpState = EP_ERROR;
  68.    }
  69.    else
  70.    {
  71.       // Assign new function address
  72.       UWRITE_BYTE(FADDR, gEp0Command.wValue.c[1]);
  73.       if (gDeviceStatus.bDevState == DEV_DEFAULT &&
  74.       gEp0Command.wValue.c[1] != 0)
  75.       {
  76.          gDeviceStatus.bDevState = DEV_ADDRESS;
  77.       }
  78.       if (gDeviceStatus.bDevState == DEV_ADDRESS &&
  79.       gEp0Command.wValue.c[1] == 0)
  80.       {
  81.          gDeviceStatus.bDevState = DEV_ADDRESS;
  82.       }
  83.       bEpState = EP_IDLE;
  84.    }
  85.    gEp0Status.bEpState = bEpState;
  86. }
  87. //-----------------------------------------------------------------------------
  88. // SetFeatureRequest
  89. //-----------------------------------------------------------------------------
  90. //
  91. // Return Value : None
  92. // Parameters   : None
  93. //
  94. //-----------------------------------------------------------------------------
  95. void SetFeatureRequest ()
  96. {
  97.    // Length field must be zero
  98.    // Device state must be configured, or addressed with Command Index
  99.    // field == 0
  100.    if ((gEp0Command.wLength.i != 0) ||
  101.    (gDeviceStatus.bDevState == DEV_DEFAULT) ||
  102.    (gDeviceStatus.bDevState == DEV_ADDRESS && gEp0Command.wIndex.i != 0))
  103.    {
  104.       bEpState = EP_ERROR;
  105.    }
  106.    // Handle based on recipient
  107.    switch(gEp0Command.bmRequestType & CMD_MASK_RECIP)
  108.    {
  109.       // Device Request - Return error as remote wakeup is not supported
  110.       case CMD_RECIP_DEV:
  111.          bEpState = EP_ERROR;
  112.          break;
  113.       // Endpoint Request
  114.       case CMD_RECIP_EP:
  115.          if (gEp0Command.wValue.i == ENDPOINT_HALT)
  116.          {
  117.             bEpState = HaltEndpoint(gEp0Command.wIndex.i);
  118.             break;
  119.          }
  120.          else
  121.          {
  122.             bEpState = EP_ERROR;
  123.             break;
  124.          }
  125.       default:
  126.          bEpState = EP_ERROR;
  127.          break;
  128.    }
  129.    gEp0Status.bEpState = bEpState;
  130. }
  131. //-----------------------------------------------------------------------------
  132. // ClearFeatureRequest
  133. //-----------------------------------------------------------------------------
  134. //
  135. // Return Value : None
  136. // Parameters   : None
  137. //
  138. //-----------------------------------------------------------------------------
  139. void ClearFeatureRequest ()
  140. {
  141.    // Length field must be zero
  142.    // Device state must be configured, or addressed with Command Index
  143.    // field == 0
  144.    if ((gEp0Command.wLength.i != 0) || (gDeviceStatus.bDevState == DEV_DEFAULT) ||
  145.    (gDeviceStatus.bDevState == DEV_ADDRESS && gEp0Command.wIndex.i != 0))
  146.    {
  147.       bEpState = EP_ERROR;
  148.    }
  149.    // Handle based on recipient
  150.    switch(gEp0Command.bmRequestType & CMD_MASK_RECIP)
  151.    {
  152.       // Device Request
  153.       case CMD_RECIP_DEV:
  154.          // Remote wakeup not supported
  155.          bEpState = EP_ERROR;
  156.          break;
  157.       // Endpoint Request
  158.       case CMD_RECIP_EP:
  159.          if (gEp0Command.wValue.i == ENDPOINT_HALT)
  160.          {
  161.             // Enable the selected endpoint.
  162.             bEpState = EnableEndpoint(gEp0Command.wIndex.i);
  163.             break;
  164.          }
  165.          else
  166.          {
  167.            bEpState = EP_ERROR;
  168.            break;
  169.          }
  170.       default:
  171.          bEpState = EP_ERROR;
  172.          break;
  173.    }
  174.    gEp0Status.bEpState = bEpState;
  175. }
  176. //-----------------------------------------------------------------------------
  177. // SetConfigurationRequest
  178. //-----------------------------------------------------------------------------
  179. //
  180. // Return Value : None
  181. // Parameters   : None
  182. //
  183. //-----------------------------------------------------------------------------
  184. void SetConfigurationRequest ()
  185. {
  186.    // Index and Length fields must be zero
  187.    // Device state must be addressed or configured
  188.    if ((gEp0Command.wIndex.i) || (gEp0Command.wLength.i) ||
  189.    (gDeviceStatus.bDevState == DEV_DEFAULT))
  190.    {
  191.       bEpState = EP_ERROR;
  192.    }
  193.    else
  194.    {
  195.       // Make sure assigned configuration exists
  196.       if (gEp0Command.wValue.c[1] >
  197.       gDescriptorMap.bStdDevDsc[std_bNumConfigurations])
  198.       {
  199.          bEpState = EP_ERROR;
  200.       }
  201.       // Handle zero configuration assignment
  202.       else if  (gEp0Command.wValue.c[1] == 0)
  203.          gDeviceStatus.bDevState = DEV_ADDRESS;
  204.       // Select the assigned configuration
  205.       else
  206.          bEpState = SetConfiguration(gEp0Command.wValue.c[1]);
  207.    }
  208.    gEp0Status.bEpState = bEpState; 
  209. }
  210. //-----------------------------------------------------------------------------
  211. // SetInterfaceRequest
  212. //-----------------------------------------------------------------------------
  213. //
  214. // Return Value : None
  215. // Parameters   : None
  216. //
  217. //-----------------------------------------------------------------------------
  218. void SetInterfaceRequest()
  219. {
  220.    /*
  221.    // Length field must be zero
  222.    if ((gEp0Command.wLength.i) || (gDeviceStatus.bDevState != DEV_CONFIG))
  223.       bEpState = EP_ERROR;
  224.    else
  225.    {
  226.       // Check that target interface exists for this configuration
  227.       if(gEp0Command.wIndex.i > gDeviceStatus.bNumInterf - 1)
  228.          bEpState = EP_ERROR;
  229.       else
  230.       {
  231.          // Get pointer to interface status structure
  232.          pIfStatus = (PIF_STATUS)&gDeviceStatus.IfStatus;
  233.          // Check that alternate setting exists for the interface
  234.          if (gEp0Command.wValue.i > pIfStatus->bNumAlts)
  235.             bEpState = EP_ERROR;
  236.          // Assign alternate setting
  237.          else
  238.          {
  239.             pIfStatus->bCurrentAlt = gEp0Command.wValue.i;
  240.             bEpState = SetInterface(pIfStatus);
  241.          }
  242.       }
  243.    }
  244.    gEp0Status.bEpState = bEpState;
  245.    */
  246. }
  247. //-----------------------------------------------------------------------------
  248. // GetStatusRequest
  249. //-----------------------------------------------------------------------------
  250. //
  251. // Return Value : None
  252. // Parameters   : None
  253. //
  254. //-----------------------------------------------------------------------------
  255. void GetStatusRequest ()
  256. {
  257.    // Value field must be zero; Length field must be 2
  258.    if ((gEp0Command.wValue.i != 0) || (gEp0Command.wLength.i != 0x02) ||
  259.    (gDeviceStatus.bDevState == DEV_DEFAULT) ||
  260.    (gDeviceStatus.bDevState == DEV_ADDRESS && gEp0Command.wIndex.i != 0))
  261.    {
  262.       bEpState = EP_ERROR;
  263.    }
  264.    else
  265.    {
  266.       // Check for desired status (device, interface, endpoint)
  267.       switch (gEp0Command.bmRequestType & CMD_MASK_RECIP)
  268.       {
  269.          // Device
  270.          case CMD_RECIP_DEV:
  271.             // Index must be zero for a Device status request
  272.             if (gEp0Command.wIndex.i != 0)
  273.                bEpState = EP_ERROR;
  274.             else
  275.             {
  276.                // Prepare data_out for transmission
  277.                gEp0Status.wData.c[1] = 0;
  278.                gEp0Status.wData.c[0] = gDeviceStatus.bRemoteWakeupStatus;
  279.                gEp0Status.wData.c[0] |= gDeviceStatus.bSelfPoweredStatus;
  280.             }
  281.             break;
  282.          // Interface
  283.          case CMD_RECIP_IF:
  284.             // Prepare data_out for transmission
  285.             gEp0Status.wData.i = 0;
  286.             break;
  287.          // Endpoint
  288.          case CMD_RECIP_EP:
  289.             // Prepare data_out for transmission
  290.             gEp0Status.wData.i = 0;
  291.             if (GetEpStatus(gEp0Command.wIndex.i) == EP_HALTED)
  292.                gEp0Status.wData.c[0] |= 0x01;
  293.             break;
  294.          // Other cases unsupported
  295.          default:
  296.             bEpState = EP_ERROR;
  297.             break;
  298.       }
  299.       // Endpoint0 state assignment
  300.       bEpState = EP_TX;
  301.       // Point ep0 data pointer to transmit data_out
  302.       gEp0Status.pData = (BYTE *)&gEp0Status.wData.i;
  303.       gEp0Status.uNumBytes = 2;
  304.    }
  305.    gEp0Status.bEpState = bEpState;
  306. }
  307. //-----------------------------------------------------------------------------
  308. // GetDescriptorRequest
  309. //-----------------------------------------------------------------------------
  310. //
  311. // Return Value : None
  312. // Parameters   : None
  313. //
  314. //-----------------------------------------------------------------------------
  315. void GetDescriptorRequest ()
  316. {
  317.    WORD wTempInt;
  318.    // This request is valid in all device states
  319.    // Switch on requested descriptor (Value field)
  320.    switch (gEp0Command.wValue.c[0])
  321.    {
  322.       // Device Descriptor Request
  323.       case DSC_DEVICE:
  324.          // Get size of the requested descriptor
  325.          uNumBytes = STD_DSC_SIZE;
  326.          // Prep to send the requested length
  327.          if (uNumBytes > gEp0Command.wLength.i)
  328.          {
  329.             uNumBytes = gEp0Command.wLength.i;
  330.          }
  331.          // Point data pointer to the requested descriptor
  332.          gEp0Status.pData = (void*)&gDescriptorMap.bStdDevDsc;
  333.          bEpState = EP_TX;
  334.          break;
  335.       // Configuration Descriptor Request
  336.       case DSC_CONFIG:
  337.          // Make sure requested descriptor exists
  338.          if (gEp0Command.wValue.c[1] >
  339.          gDescriptorMap.bStdDevDsc[std_bNumConfigurations])
  340.          {
  341.             bEpState = EP_ERROR;
  342.          }
  343.          else
  344.          {
  345.             // Get total length of this configuration descriptor
  346.             // (includes all associated interface and endpoints)
  347.             wTempInt.c[1] = gDescriptorMap.bCfg1[cfg_wTotalLength_lsb];
  348.             wTempInt.c[0] = gDescriptorMap.bCfg1[cfg_wTotalLength_msb];
  349.             uNumBytes = wTempInt.i;
  350.             // Prep to transmit the requested length
  351.             if (uNumBytes > gEp0Command.wLength.i)
  352.             {
  353.                uNumBytes = gEp0Command.wLength.i;
  354.             }
  355.             // Point data pointer to requested descriptor
  356.             gEp0Status.pData = &gDescriptorMap.bCfg1;
  357.             bEpState = EP_TX;
  358.          }
  359.          break;
  360.    }
  361.    gEp0Status.uNumBytes = uNumBytes;
  362.    gEp0Status.bEpState = bEpState;
  363. }
  364. //-----------------------------------------------------------------------------
  365. // GetConfigurationRequest
  366. //-----------------------------------------------------------------------------
  367. //
  368. // Return Value : None
  369. // Parameters   : None
  370. //
  371. //-----------------------------------------------------------------------------
  372. void GetConfigurationRequest ()
  373. {
  374.    // Length field must be 1; Index field must be 0;
  375.    // Value field must be 0
  376.    if ((gEp0Command.wLength.i != 1) || (gEp0Command.wIndex.i) ||
  377.    (gEp0Command.wValue.i) || (gDeviceStatus.bDevState == DEV_DEFAULT))
  378.    {
  379.       bEpState = EP_ERROR;
  380.    }
  381.    else if (gDeviceStatus.bDevState == DEV_ADDRESS)
  382.    {
  383.       // Prepare data_out for transmission
  384.       gEp0Status.wData.i = 0;
  385.       // Point ep0 data pointer to transmit data_out
  386.       gEp0Status.pData = (BYTE *)&gEp0Status.wData.i;
  387.       // ep0 state assignment
  388.       bEpState = EP_TX;
  389.    }
  390.    else
  391.    {
  392.       // Index to desired field
  393.       gEp0Status.pData = (void *)&gDescriptorMap.bCfg1[cfg_bConfigurationValue];
  394.       // ep0 state assignment
  395.       bEpState = EP_TX;
  396.    }
  397.    gEp0Status.uNumBytes = 1;
  398.    gEp0Status.bEpState = bEpState;
  399. }
  400. //-----------------------------------------------------------------------------
  401. // GetInterfaceRequest
  402. //-----------------------------------------------------------------------------
  403. //
  404. // Return Value : None
  405. // Parameters   : None
  406. //
  407. //-----------------------------------------------------------------------------
  408. void GetInterfaceRequest ()
  409. {
  410.    // Value field must be 0; Length field must be 1
  411.    if ((gEp0Command.wValue.i) || (gEp0Command.wLength.i != 1) ||
  412.    (gDeviceStatus.bDevState != DEV_CONFIG))
  413.    {
  414.       bEpState = EP_ERROR;
  415.    }
  416.    else
  417.    {
  418.       // Make sure requested interface exists
  419.       if (gEp0Command.wIndex.i > gDeviceStatus.bNumInterf - 1)
  420.          bEpState = EP_ERROR;
  421.       else
  422.       {
  423.          // Get current interface setting
  424.          gEp0Status.pData = (void *)&gDeviceStatus.IfStatus->bCurrentAlt;
  425.          // Length must be 1
  426.          gEp0Status.uNumBytes = 1;
  427.          bEpState = EP_TX;
  428.       }
  429.    }
  430.    gEp0Status.bEpState = bEpState;
  431. }
  432. //-----------------------------------------------------------------------------
  433. // End Of File
  434. //-----------------------------------------------------------------------------