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

传真(Fax)编程

开发平台:

C/C++

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