新闻  |   论坛  |   博客  |   在线研讨会
gpiflongxfr.c
baba | 2008-11-17 10:45:50    阅读:5595   发布文章

  1. 来源:http://read.pudn.com/downloads32/sourcecode/comm/usb/103733/ad/gpiflongxfr.c__.htm
  2. #pragma NOIV                    // Do not generate interrupt vectors    
  3. //-----------------------------------------------------------------------------    
  4. //   File:      gpiflongxfr.c    
  5. //    
  6. //   Contents:  Hooks required to implement USB peripheral function.    
  7. //              Code written for EZUSB FX2 128-pin REVE...    
  8. //              Firmware tested on EZUSB FX2 128-pin (CY3681 DK)    
  9. //   Copyright (c) 2001 Cypress Semiconductor All rights reserved    
  10. //-----------------------------------------------------------------------------    
  11. #include "fx2.h"    
  12. #include "fx2regs.h"    
  13. #include "fx2sdly.h"            // SYNCDELAY macro    
  14.    
  15. extern BOOL GotSUD;             // Received setup data flag    
  16. extern BOOL Sleep;   
  17. extern BOOL Rwuen;   
  18. extern BOOL Selfpwr;   
  19.    
  20. BYTE Configuration;             // Current configuration    
  21. BYTE AlternateSetting;          // Alternate settings    
  22.    
  23.    
  24. BOOL xfrvia_TD_Poll = 0;    // Event flg for execution in TD_Poll( );    
  25. BOOL in_token_event = 0;    // Event flg for GPIF FIFO Read trigger    
  26.    
  27.    
  28.    
  29.    
  30. // proto's from "gpif.c"    
  31. void GpifInit( void );   
  32.    
  33.    
  34.   // it may be worth noting here that the default monitor loads at 0xC000    
  35.    
  36.   // use this global variable when (de)asserting debug LEDs...    
  37.    
  38. // 512 for high speed, 64 for full speed    
  39. static WORD enum_pkt_size = 0x0000;       
  40.    
  41. // when set firmware running in TD_Poll( ); handles data transfers    
  42. BOOL td_poll_handles_transfers = 0;   
  43.    
  44. // when set cpu is out of the data path    
  45. BOOL endp_auto_mode_enabled = 0;   
  46.    
  47. /////////////////////////////////////////////////////////////////////////    
  48. #define VX_A2 0xA2    // testing, GPIF single byte read waveform    
  49. #define VX_A3 0xA3    // testing, GPIF single byte write waveform    
  50. #define VX_A7 0xA7    // setup peripheral for high speed FIFO xfr(s), TC=8    
  51. #define VX_A8 0xA8    // do a FIFO Rd transaction w/TC=8 into EP8    
  52. #define VX_AC 0xAC    // manually commit IN data to host... INPKTEND    
  53.    
  54. #define VX_C5 0xC5              // for test purpose    
  55.    
  56. #define VX_D0 0xD0              // read GPIFTCx registers    
  57. #define VX_D1 0xD1    // let TD_Poll( ); firmware handle data xfr's...    
  58. #define VX_D2 0xD2    // handle data xfr's via vendor specific cmds...    
  59.    
  60. #define VX_EE 0xEE    //reset address bus    
  61.    
  62. /////////////////////////////////////////fiber manufaction command //////    
  63. #define VX_E0 0xE0              //握手     
  64. #define VX_E1 0xE1              //电子开关    
  65. #define VX_E2 0xE2              //电机行进    
  66. #define VX_E3 0xE3              //长周期光栅    
  67. #define VX_E4 0xE4              //电子开关,按存储器中延时数据制作布拉格光栅    
  68. #define VX_E5 0xE5              //数据传输初始化    
  69. //////////////////////////////////////////////////////////////////////////    
  70. //////////////////////////////////////define port    
  71. sbit O_STEP = IOA ^ 0;//PA.0电机步进脉冲    
  72. sbit O_DIR = IOA ^ 1;//PA.1电机方向    
  73. sbit O_ENABLE = IOA ^ 2;//PA.2电机使能(高->允许,低->禁止)    
  74. sbit O_SWITCH = IOA ^ 3;//PA.3电子开关(高->关闭,低->打开)    
  75.    
  76. //////////////////////////////////////define variable    
  77. static WORD HighAddr;//高位地址    
  78. BYTE R_SPEED;//延时的机器周期数    
  79. BYTE R_STEP1;//电机行进步数高8位    
  80. BYTE R_STEP2;//电机行进步数250对应5um    
  81. BYTE R_STEP3;//电机行进步数200对应200*5um=1mm    
  82. BYTE R_LENGTH;//光栅长度,为光栅周期倍数    
  83. BYTE R_TIME1;//曝光时间高8位    
  84. BYTE R_TIME2;//曝光时间低8位    
  85. BYTE R_COEF;//写BRAG光栅时的倍数    
  86. BYTE R_SETTING;//命令    
  87. BOOL S_SWITCH;//电子开关设定    
  88. ////////////////////////////////////////////////////////    
  89.    
  90. //-----------------------------------------------------------------------------    
  91. // Task Dispatcher hooks    
  92. //   The following hooks are called by the task dispatcher.    
  93. //-----------------------------------------------------------------------------    
  94. void TD_Init( void )   
  95. { // Called once at startup    
  96.    
  97.    
  98.   CPUCS = 0x02;                 // CLKSPD[1:0]=10, for 48MHz operation///10    
  99.  // CPUCS = 0x12;                              // CLKOE=0, don't drive CLKOUT    
  100.    
  101.   GpifInit( );                  // init GPIF engine via GPIFTool output file    
  102.      
  103.   SYNCDELAY;                    // see TRM section 15.14    
  104.   REVCTL = 0x02;                // REVCTL.1=1; use "dynamic OUT automaticity"    
  105.      
  106.   // EP2 512 BULK OUT 4x    
  107.   SYNCDELAY;                    // see TRM section 15.14    
  108.   EP2CFG = 0xA0;                // BUF[1:0]=00 for 4x buffering    
  109.      
  110.   // EP6 512 BULK IN 4x    
  111.   SYNCDELAY;                    //     
  112.   EP6CFG = 0xE0;                // BUF[1:0]=00 for 4x buffering    
  113.    
  114.   // EP4 and EP8 are not used in this implementation...    
  115.   SYNCDELAY;                    //     
  116.   EP4CFG = 0x20;                // clear valid bit    
  117.   SYNCDELAY;                    //     
  118.   EP8CFG = 0x60;                // clear valid bit    
  119.    
  120.   SYNCDELAY;                    //     
  121.   FIFORESET = 0x80;             // activate NAK-ALL to avoid race conditions    
  122.   SYNCDELAY;                    //     
  123.   FIFORESET = 0x02;             // reset, FIFO 2    
  124.   SYNCDELAY;                    //     
  125.   FIFORESET = 0x04;             // reset, FIFO 4    
  126.   SYNCDELAY;                    //     
  127.   FIFORESET = 0x06;             // reset, FIFO 6    
  128.   SYNCDELAY;                    //     
  129.   FIFORESET = 0x08;             // reset, FIFO 8    
  130.   SYNCDELAY;                    //     
  131.   FIFORESET = 0x00;             // deactivate NAK-ALL    
  132.    
  133.   // 8-bit bus (WORDWIDE=0)...    
  134.   SYNCDELAY;                    //     
  135.   EP2FIFOCFG = 0x00;   
  136.   SYNCDELAY;                    //     
  137.   EP6FIFOCFG = 0x04;   
  138.      
  139.   SYNCDELAY;                    //     
  140.   EP2BCL = 0x80;                // arm first buffer    
  141.   SYNCDELAY;                    //     
  142.   EP2BCL = 0x80;                // arm second buffer    
  143.   SYNCDELAY;                    //     
  144.   EP2BCL = 0x80;                // arm third buffer    
  145.   SYNCDELAY;                    //     
  146.   EP2BCL = 0x80;                // arm fourth buffer    
  147.   SYNCDELAY;                    //     
  148.      
  149.   // Note: had we choosen to use AUTOOUT=1 initially, then...    
  150.   //   (1)...when REVCTL.1=0, the core must see MANUAL-AUTO switch of AUTO bit    
  151.   //      ...to properly "arm" OUT buffers...    
  152.   //    
  153.   //         SYNCDELAY;             
  154.   //         EP2FIFOCFG = 0x00; // AUTOOUT=0 (manual OUT mode)    
  155.   //         SYNCDELAY;             
  156.   //         EP6FIFOCFG = 0x04;    
  157.   //    then,    
  158.   //         SYNCDELAY;             
  159.   //         EP2FIFOCFG = 0x10; // AUTOOUT=1 (auto OUT mode)    
  160.   //         SYNCDELAY;             
  161.   //         EP6FIFOCFG = 0x04;    
  162.   //    
  163.   //      ...this might not be obvious because the default is AUTOOUT=0    
  164.   //      ...power static back to back firmware downloads may be subject to     
  165.   //      ...the above scheme.when the application's last status was AUTOOUT=1    
  166.   //    
  167.   //   (2)...when REVCTL.1=1, core blocks auto arming of OUT endp's    
  168.   //      ...see above EPxBCL/OUTPKTEND sequence(s)    
  169.   //      ...sequence is as follows:    
  170.   //      ...(a) REVCTL.1=1    
  171.   //      ...(b) FIFORESET (as above)    
  172.   //      ...(c) EPxBCL/OUTPKTEND (as above)    
  173.   //      ...(d) AUTOOUT=1    
  174.      
  175.      
  176.   // IN endp's come up in the cpu/peripheral domain    
  177.      
  178.      
  179.   // setup INT4 as internal source for GPIF interrupts    
  180.   // using INT4CLR (SFR), automatically enabled    
  181.   INTSETUP |= 0x03;   // Enable INT4 FIFO/GPIF Autovectoring    
  182.   SYNCDELAY;          // used here as "delay"    
  183.     EXIF &=  ~0x40;     // just in case one was pending...    
  184.   SYNCDELAY;          // used here as "delay"    
  185.   GPIFIRQ = 0x02;   
  186.   SYNCDELAY;          //     
  187.   GPIFIE = 0x02;      // Enable GPIFWF interrupt    
  188.   SYNCDELAY;          //     
  189.   EIE |= 0x04;        // Enable INT4 ISR, EIE.2(EIEX4=1)    
  190.      
  191.   SYNCDELAY;    
  192.   GPIFIDLECTL=0xFc;   
  193.   SYNCDELAY;    
  194.      
  195.    
  196. }   
  197.    
  198. #define GPIFTRIGWR 0    
  199. #define GPIFTRIGRD 4    
  200.    
  201. #define GPIF_EP2 0    
  202. #define GPIF_EP4 1    
  203. #define GPIF_EP6 2    
  204. #define GPIF_EP8 3    
  205.    
  206.    
  207.    
  208. void TD_Poll( void )   
  209. { // Called repeatedly while the device is idle    
  210.   static WORD xFIFOTC_OUT = 0x0000;   
  211.   if(xfrvia_TD_Poll )              // Set to TRUE vendor command 0xD1...    
  212.   {        
  213.     if( !( EP2468STAT & 0x01 ) )    // Is the host busy sending data    
  214.     {                               // ...EP2E=0, when endp FIFO not  ...empty, host sent pkt.    
  215.       //  Since the host sent data, a slave FIFO buffer was available         
  216.                                     // ... GO on with GPIF write       
  217.       if( GPIFTRIG & 0x80 )         // if GPIF done then check slave status    
  218.       {     
  219.           xFIFOTC_OUT = ((EP2BCH<<8) + EP2BCL);   
  220.           if( xFIFOTC_OUT )         // pkt is not zerolen, xfr the data    
  221.           {    
  222.             EP2GPIFTCH = EP2BCH;    // Setup transaction count    
  223.             EP2GPIFTCL = EP2BCL;    // Set EP2GPIFTC = EP2BC    
  224.             EP2BCL = 0x00;          // AUTOOUT=0, so "pass-on" pkt. to master (GPIF)    
  225.                                     // Skip bit is 0 +>  pass on packet to master    
  226.             // Once master xfr's OUT pkt, it "auto" (re)arms               
  227.             GPIFTRIG = GPIF_EP2;    // Trigger FIFO write transaction(s), using SFR    
  228.                                     // R/W=0, EP[1:0]=FIFO_EpNum for EPx write(s)     
  229.                while( !( GPIFTRIG & 0x80 ) )        // poll GPIFTRIG.7 Done bit    
  230.                {   
  231.                }   
  232. //////////////////////////////////////////////////////////////更新高位的地址线/////////    
  233.             if(LSB(xFIFOTC_OUT))//如果传输了64字节    
  234.                 {   
  235.                 HighAddr+=1;   
  236.                 }   
  237.             else   
  238.                 {   
  239.                 HighAddr+=8;   
  240.                 }   
  241.             IOD=LSB(HighAddr>>3);   
  242.             IOE=MSB(HighAddr>>3);   
  243. ///////////////////////////////////////////////////////////////////////////////////////    
  244.           }   
  245.           else                      // Handle host sending zero length pkt.    
  246.           {    
  247.             EP2BCL = 0x80;          // AUTOOUT=0, so "skip" zerolen pkt and manually commit packet to the master    
  248.           }   
  249.       }   
  250.       else                             
  251.       {   // GPIF is busy    
  252.       }         
  253.     }   
  254.     else                            // Host is "not" sending data and the     
  255.     {                               // ...slave has taken all data and        
  256.     }                               // ...nothing  in the buffer        
  257.     // Does the slave have data for us...     
  258.     if( GPIFTRIG & 0x80 )           // If GPIF done then check slave status    
  259.     {    
  260.         if( in_token_event )        // Set via vendor command 0xE0     
  261.         {     
  262.             if( !( EP2468STAT & 0x20 ) )// if EP6F=0, buffer is available    
  263.             {    
  264.                 // Trigger FIFO read transaction(s), using SFR    
  265.                 // R/W=1, EP[1:0]=FIFO_EpNum for EPx read(s)    
  266.                 EP6GPIFTCH = 0x00;                  // setup transaction count    
  267.                 EP6GPIFTCL = 0x40;                  // set EP8GPIFTC = 8    
  268.                 if( !( EP2468STAT & 0x20 ) )   
  269.           {                                 // EP8FF=0, when buffer is available...    
  270.                                             // trigger FIFO read transaction(s), using SFR    
  271.             while( !( GPIFTRIG & 0x80 ) )   // Poll GPIFTRIG.7 Done bit    
  272.             {   
  273.             }   
  274.             GPIFTRIG = GPIFTRIGRD | GPIF_EP6; // R/W=1, EP[1:0]=FIFO_EpNum for EPx read(s)    
  275.             *EP0BUF = 0xA8;                 // return that there was a buffer available    
  276.           }   
  277.           else   
  278.           {                                 // If EP busy then host is behind...two buffers containing data     
  279.           }   
  280.                 while( !( GPIFTRIG & 0x80 ) )       // poll GPIFTRIG.7 Done bit    
  281.                 {   
  282.                 }   
  283.                 INPKTEND = 0x06;    // AUTOIN=0, so 8051 must "pass-on" pkt to host    
  284.                 HighAddr+=1;   
  285.             IOD=LSB(HighAddr>>3);   
  286.             IOE=MSB(HighAddr>>3);   
  287.             }                       // ....to the INPKTEND register     
  288.             else                    // If EP busy then host is behind (slow) and we     
  289.             {                       // ...still have two buffers containing data       
  290.             }                               
  291.         }   
  292.         else                        // in_token_event not asserted by vendor request    
  293.         {   
  294.         }   
  295.     }   
  296.     else                            // GPIF is busy    
  297.     {        
  298.     }   
  299.   }    
  300.   else    
  301.   {   
  302.   }   
  303. }   
  304.    
  305. BOOL TD_Suspend( void )             
  306. { // Called before the device goes into suspend mode    
  307.    return( TRUE );   
  308. }   
  309.    
  310. BOOL TD_Resume( void )             
  311. { // Called after the device resumes    
  312.    return( TRUE );   
  313. }   
  314.    
  315. //-----------------------------------------------------------------------------    
  316. // Device Request hooks    
  317. //   The following hooks are called by the end point 0 device request parser.    
  318. //-----------------------------------------------------------------------------    
  319. BOOL DR_GetDescriptor( void )   
  320. {   
  321.    return( TRUE );   
  322. }   
  323.    
  324. BOOL DR_SetConfiguration( void )      
  325. { // Called when a Set Configuration command is received    
  326.      
  327.   if( EZUSB_HIGHSPEED( ) )   
  328.   { // ...FX2 in high speed mode    
  329.     SYNCDELAY;                  //     
  330.     EP6AUTOINLENH = 0x02;       // set core AUTO commit len = 512 bytes    
  331.     SYNCDELAY;                  //     
  332.     EP6AUTOINLENL = 0x00;   
  333.     SYNCDELAY;                  //     
  334.     enum_pkt_size = 512;        // max. pkt. size = 512 bytes    
  335.   }   
  336.   else   
  337.   { // ...FX2 in full speed mode    
  338.     SYNCDELAY;                  //     
  339.     EP6AUTOINLENH = 0x00;       // set core AUTO commit len = 64 bytes    
  340.     SYNCDELAY;                  //     
  341.     EP6AUTOINLENL = 0x40;   
  342.     SYNCDELAY;                  //     
  343.     enum_pkt_size = 64;         // max. pkt. size = 64 bytes    
  344.   }   
  345.          
  346.   Configuration = SETUPDAT[ 2 ];   
  347.   return( TRUE );        // Handled by user code    
  348. }   
  349.    
  350. BOOL DR_GetConfiguration( void )      
  351. { // Called when a Get Configuration command is received    
  352.    EP0BUF[ 0 ] = Configuration;   
  353.    EP0BCH = 0;   
  354.    EP0BCL = 1;   
  355.    return(TRUE);          // Handled by user code    
  356. }   
  357.    
  358. BOOL DR_SetInterface( void )          
  359. { // Called when a Set Interface command is received    
  360.    AlternateSetting = SETUPDAT[ 2 ];   
  361.    return( TRUE );        // Handled by user code    
  362. }   
  363.    
  364. BOOL DR_GetInterface( void )          
  365. { // Called when a Set Interface command is received    
  366.    EP0BUF[ 0 ] = AlternateSetting;   
  367.    EP0BCH = 0;   
  368.    EP0BCL = 1;   
  369.    return( TRUE );        // Handled by user code    
  370. }   
  371.    
  372. BOOL DR_GetStatus( void )   
  373. {   
  374.    return( TRUE );   
  375. }   
  376.    
  377. BOOL DR_ClearFeature( void )   
  378. {   
  379.    return( TRUE );   
  380. }   
  381.    
  382. BOOL DR_SetFeature( void )   
  383. {   
  384.    return( TRUE );   
  385. }   
  386.    
  387.    
  388.    
  389.    
  390. ///////////////////////////////////////////////////////////子函数/////////////    
  391. void SUB_SETTING(void)   
  392. {   
  393.     if(R_SETTING&0x01)//设置O_DIR    
  394.         IOA|=0x02;   
  395.     else   
  396.         IOA&=0xFD;   
  397.    
  398.     if(R_SETTING&0x02)//设置S_SWITCH    
  399.         S_SWITCH=1;   
  400.     else   
  401.         S_SWITCH=0;   
  402. }   
  403.    
  404. void SUB_STEPIN(void)   
  405. {   
  406. BYTE i,j,k,l;   
  407.     if(S_SWITCH)//根据电子开关设定决定是否打开电子开关    
  408.         IOA&=0xF7;//clear O_SWITCH    
  409.    
  410.     for(i=R_STEP1;i>0;i--)   
  411.         for(j=R_STEP3;j>0;j--)   
  412.             for(k=R_STEP2;k>0;k--)   
  413.             {   
  414.             IOA^=0x01;//CPL IOA.0(O_STEP)    
  415.             for(l=R_SPEED;l>0;l--);   
  416.             IOA^=0x01;//CPL IOA.0(O_STEP)    
  417.             for(l=R_SPEED;l>0;l--);   
  418.             }   
  419.     IOA|=0x08;//SETB O_SWITCH    
  420. }   
  421.    
  422. void SUB_F1(void)   
  423. {   
  424. BYTE i,j,k,l;   
  425.     for(i=R_LENGTH;i>0;i--)   
  426.     {   
  427.         IOA&=0xF7;//CLR O_SWITCH    
  428.         for(j=R_TIME1;j>0;j--)   
  429.         {   
  430.             for(l=100;l>0;l--)   
  431.             {   
  432.                 for(k=R_TIME2;k>0;k--);   
  433.                 for(k=R_TIME2;k>0;k--);   
  434.             }   
  435.         }   
  436.          if(!S_SWITCH)//根据S_SWITCH标志决定是否关闭电子开关    
  437.          {   
  438.             IOA|=0x08;//SETB O_SWITCH    
  439.          }   
  440.          for(j=R_STEP1;j>0;j--)   
  441.          {   
  442.             for(k=R_STEP2;k>0;k--)   
  443.             {   
  444.             IOA^=0x01;//CPL O_STEP(IOA.0)    
  445.             for(l=R_SPEED;l>0;l--);   
  446.             IOA^=0x01;//CPL O_STEP(IOA.0)    
  447.             for(l=R_SPEED;l>0;l--);   
  448.             //没有STOP中断    
  449.             }   
  450.           }   
  451.      }   
  452.     IOA|=0x08;//SETB O_SWITCH       
  453. }   
  454. //////////////////////////////////////////////////////////////////////////////    
  455.    
  456. BOOL DR_VendorCmnd( void )   
  457. {   
  458.     switch( SETUPDAT[ 1 ] )   
  459.     {   
  460.     case VX_A2:   
  461.         { // Get status of peripheral function, by doing a GPIF single read transaction    
  462.           // using register(s) in XDATA space, dummy read    
  463.               SYNCDELAY;    
  464.             GPIFIDLECTL=0xFD;   
  465.             SYNCDELAY;    
  466.           while( !( GPIFTRIG & 0x80 ) )     // poll GPIFTRIG.7 Done bit    
  467.           {   
  468.           }   
  469.           *EP0BUF = XGPIFSGLDATLX;          // trigger GPIF single byte read transaction    
  470.           while( !( GPIFTRIG & 0x80 ) )     // poll GPIFTRIG.7 Done bit    
  471.           {   
  472.           }   
  473.         //  EP0BUF[0]=XGPIFSGLDATH;    
  474.           EP0BUF[0] = XGPIFSGLDATLNOX;      // ...GPIF reads byte from PERIPHERAL    
  475.           EP0BCH = 0;   
  476.           EP0BCL = 1;                       // Arm endpoint with # bytes to transfer    
  477.           EP0CS |= bmHSNAK;                 // Acknowledge handshake phase of device request    
  478.       return( FALSE );    
  479.           break;   
  480.       }   
  481.       case VX_A3:   
  482.       { // Tell peripheral we're going into HS mode, by doing a GPIF single write transaction    
  483.           while( !( GPIFTRIG & 0x80 ) )     // Poll GPIFTRIG.7 Done bit    
  484.           {   
  485.           }   
  486.           XGPIFSGLDATLX = 0xA3;             // Trigger GPIF     
  487.           *EP0BUF = 0xA3;   
  488.           EP0BCH = 0;   
  489.           EP0BCL = 1;                       // Arm endpoint with # bytes to transfer    
  490.           EP0CS |= bmHSNAK;                 // Acknowledge handshake phase of device request    
  491.           break;   
  492.       }   
  493.       case VX_A7:   
  494.       {   // Setup peripheral for high speed FIFO xfr(s), TC=8 bytes    
  495.           EP6GPIFTCH = 0x00;                // setup transaction count    
  496.           EP6GPIFTCL = 0x40;                // set EP8GPIFTC = 8    
  497.           *EP0BUF = 0xA7;   
  498.           EP0BCH = 0;   
  499.           EP0BCL = 1;                       // Arm endpoint with # bytes to transfer    
  500.           EP0CS |= bmHSNAK;                 // Acknowledge handshake phase of device request    
  501.           break;   
  502.       }   
  503.       case VX_A8:   
  504.       {                                     // Do a FIFO Rd transaction w/TC=8 into EP8    
  505.           if( !( EP2468STAT & 0x20 ) )   
  506.           {                                 // EP8FF=0, when buffer is available...    
  507.          &n

    *博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
gpiflongxfr.c
2008-11-17 10:45:50
68013A程序
2008-11-17 09:54:37
FPUSB.C
2008-11-17 09:49:28
推荐文章
最近访客