新闻  |   论坛  |   博客  |   在线研讨会
FPUSB.C
baba | 2008-11-17 09:49:28    阅读:3130   发布文章

  1. 来源:http://read.pudn.com/downloads64/sourcecode/embed/225373/68013-firmware/FPUSB.C__.htm
  2. #pragma NOIV               // Do not generate interrupt vectors    
  3.    
  4. #include "fx2.h"    
  5. #include "fx2regs.h"    
  6. #include "fx2sdly.h"            // SYNCDELAY macro    
  7.    
  8. extern BOOL GotSUD;             // Received setup data flag    
  9. extern BOOL Sleep;   
  10. extern BOOL Rwuen;   
  11. extern BOOL Selfpwr;   
  12.    
  13. BYTE Configuration;             // Current configuration    
  14. BYTE AlternateSetting;          // Alternate settings    
  15.    
  16. //-----------------------------------------------------------------------------    
  17. // Constants    
  18. //-----------------------------------------------------------------------------    
  19. #define VR_UPLOAD           0xc0    
  20. #define VR_DOWNLOAD         0x40    
  21.    
  22. #define VR_ANCHOR_DLD       0xa0 // handled by core    
  23. #define VR_SEND_COMMAND     0xa2 // Send Command    
  24. #define VR_RESET_FIFO       0xa3 // Get Image    
  25.    
  26. //-----------------------------------------------------------------------------    
  27. // Task Dispatcher hooks    
  28. //   The following hooks are called by the task dispatcher.    
  29. //-----------------------------------------------------------------------------    
  30.    
  31. sbit PA0 = IOA ^ 0;   
  32. sbit PA1 = IOA ^ 1;   
  33. sbit PA2 = IOA ^ 2;   
  34. sbit PA3 = IOA ^ 3;   
  35. sbit PA4 = IOA ^ 4;   
  36. sbit PA5 = IOA ^ 5;   
  37. sbit PA6 = IOA ^ 6;   
  38. sbit PA7 = IOA ^ 7;   
  39.    
  40. bit x;   
  41.    
  42. void TD_Init(void)              // Called once at startup    
  43. {   
  44.   // set the CPU clock to 48MHz    
  45.   CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;   
  46.        
  47.   // set the CPU clock to 24MHz    
  48.   // CPUCS = 0x0A ;    
  49.   // Registers which require a synchronization delay, see section 15.14    
  50.   // FIFORESET        FIFOPINPOLAR    
  51.   // INPKTEND         OUTPKTEND    
  52.   // EPxBCH:L         REVCTL    
  53.   // GPIFTCB3         GPIFTCB2    
  54.   // GPIFTCB1         GPIFTCB0    
  55.   // EPxFIFOPFH:L     EPxAUTOINLENH:L    
  56.   // EPxFIFOCFG       EPxGPIFFLGSEL    
  57.   // PINFLAGSxx       EPxFIFOIRQ    
  58.   // EPxFIFOIE        GPIFIRQ    
  59.   // GPIFIE           GPIFADRH:L    
  60.   // UDMACRCH:L       EPxGPIFTRIG    
  61.   // GPIFTRIG    
  62.      
  63.   // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well...    
  64.   //      ...these have been replaced by GPIFTC[B3:B0] registers    
  65.    
  66.   // default: all endpoints have their VALID bit set    
  67.   // default: TYPE1 = 1 and TYPE0 = 0 --> BULK      
  68.   // default: EP2 and EP4 DIR bits are 0 (OUT direction)    
  69.   // default: EP6 and EP8 DIR bits are 1 (IN direction)    
  70.   // default: EP2, EP4, EP6, and EP8 are double buffered    
  71.    
  72.   REVCTL = 0x03; // MUST set REVCTL.0 and REVCTL.1 to 1    
  73.   SYNCDELAY;   
  74.      
  75.      
  76.   // we are just using the default values, yes this is not necessary...    
  77.   EP1OUTCFG = 0xA0;   
  78.   EP1INCFG = 0xA0;   
  79.   SYNCDELAY;                    // see TRM section 15.14    
  80.   EP2CFG = 0xA2;   
  81.   SYNCDELAY;                    //     
  82.   EP4CFG = 0xA0;                //0xA0;    
  83.   SYNCDELAY;                    //     
  84.   EP6CFG = 0xE2;   
  85.   SYNCDELAY;                    //     
  86.   EP8CFG = 0xE0;   
  87.   SYNCDELAY;                    //     
  88.    
  89.   // out endpoints do not come up armed    
  90.      
  91.   // since the defaults are double buffered we must write dummy byte counts twice    
  92.   EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.    
  93.   SYNCDELAY;                    //     
  94.   EP4BCL = 0x80;       
  95.   SYNCDELAY;                    //     
  96.   EP2BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.    
  97.   SYNCDELAY;                    //     
  98.   EP4BCL = 0x80;       
  99.   SYNCDELAY;                    //     
  100.         
  101.    
  102.   FIFORESET = 0x80; // reset all FIFOs    
  103.   SYNCDELAY;   
  104.   FIFORESET = 0x02;   
  105.   SYNCDELAY;   
  106.   FIFORESET = 0x04;   
  107.   SYNCDELAY;   
  108.   FIFORESET = 0x06;   
  109.   SYNCDELAY;   
  110.   FIFORESET = 0x08;   
  111.   SYNCDELAY;   
  112.   FIFORESET = 0x00;   
  113.   SYNCDELAY;   
  114.    
  115.   IFCONFIG = 0xcb;   // this defines the external interface to be the following:    
  116.                      // use IFCLK pin driven by internal logic, clk frequency is 48MHz    
  117.                      // use slave FIFO interface pins driven async by external master    
  118.   SYNCDELAY;   
  119.    
  120. //-------------------------设置端点6\8为自动输入模式--------------------    
  121.    
  122.   EP6AUTOINLENH = 02;  // EP6 auto in length: 512  //512:02  64:00    
  123.   SYNCDELAY;   
  124.   EP6AUTOINLENL = 00;                            //512:00   64:64    
  125.   SYNCDELAY;   
  126.    
  127.   EP8AUTOINLENH = 02;  // EP8 auto in length: 512  //512:02  64:00    
  128.   SYNCDELAY;   
  129.   EP8AUTOINLENL = 00;                            //512:00   64:64    
  130.   SYNCDELAY;   
  131.    
  132.   //-----------------------设置端点4为CPU commit模式----------------------    
  133.   EP2FIFOCFG = 0x00; // this lets the EP4 auto=0 commit OUT packets,    
  134.                      // and sets the slave FIFO data interface to 8-bits    
  135.   SYNCDELAY;   
  136.      
  137.   EP4FIFOCFG = 0x00; // this lets the EP4 auto=0 commit OUT packets,    
  138.                      // and sets the slave FIFO data interface to 8-bits    
  139.   SYNCDELAY;   
  140.    
  141.   OUTPKTEND = 0x84; // Arm both EP4 buffers to “prime the pump”    
  142.   SYNCDELAY;   
  143.   OUTPKTEND = 0x84;   
  144.   SYNCDELAY;   
  145.    
  146.      
  147.    
  148.   EP6FIFOCFG = 0x08; // this lets the EP6 auto commit IN packets,    
  149.                      // and sets the slave FIFO data interface to 8-bits    
  150.   SYNCDELAY;   
  151.    
  152.   EP8FIFOCFG = 0x08; // this lets the EP8 auto commit IN packets,    
  153.                      // and sets the slave FIFO data interface to 8-bits    
  154.   SYNCDELAY;   
  155.    
  156.    
  157. //-----------------------------------------------------------------------------    
  158.    
  159.   PINFLAGSAB = 0x00; // defines FLAGA as prog-level flag, pointed to by FIFOADR[1:0]    
  160.                      // FLAGB as full flag, as pointed to by FIFOADR[1:0]    
  161.   SYNCDELAY;   
  162.    
  163.   PINFLAGSCD = 0x00; // FLAGC as empty flag, as pointed to by FIFOADR[1:0]    
  164.   SYNCDELAY;   
  165.    
  166.   PORTACFG = 0x00;   // used PA7/FLAGD  a PORTA pin  ,no as a FIFO flag SLCS    
  167.   SYNCDELAY;   
  168.    
  169.   FIFOPINPOLAR = 0x00; // set all slave FIFO interface pins as active low    
  170.   SYNCDELAY;   
  171.      
  172.    if (EZUSB_HIGHSPEED())   
  173.    {   
  174.       EP6AUTOINLENH = 02;  // EP6 auto in length: 512  //512:02  64:00    
  175.       SYNCDELAY;   
  176.       EP6AUTOINLENL = 00;                            //512:00   64:64    
  177.       SYNCDELAY;   
  178.    
  179.       EP8AUTOINLENH = 02;  // EP8 auto in length: 512  //512:02  64:00    
  180.       SYNCDELAY;   
  181.       EP8AUTOINLENL = 00;                            //512:00   64:64    
  182.       SYNCDELAY;   
  183.       PA7=0;   
  184.    }   
  185.    else   
  186.    {   
  187.       EP6AUTOINLENH = 00;  // EP6 auto in length:  64:00    
  188.       SYNCDELAY;   
  189.       EP6AUTOINLENL = 64;                            //64:64    
  190.       SYNCDELAY;   
  191.    
  192.       EP8AUTOINLENH = 00;  // EP8 auto in length:  //00    
  193.       SYNCDELAY;   
  194.       EP8AUTOINLENL = 64;                            //64    
  195.       SYNCDELAY;   
  196.       PA7=1;   
  197.    }   
  198.    
  199.    
  200.    
  201.   OEA = 0x8b;   
  202.   IOA &= 0x88;   
  203.   x=0;       
  204. }   
  205.    
  206. void TD_Poll(void)              // Called repeatedly while the device is idle    
  207. {   
  208.        
  209.     if( (!x)&& (EZUSB_HIGHSPEED()) )   
  210.      {EP6AUTOINLENH = 02;  // EP6 auto in length: 512  //512:02  64:00    
  211.       SYNCDELAY;   
  212.       EP6AUTOINLENL = 00;                            //512:00   64:64    
  213.       SYNCDELAY;   
  214.    
  215.       EP8AUTOINLENH = 02;  // EP8 auto in length: 512  //512:02  64:00    
  216.       SYNCDELAY;   
  217.       EP8AUTOINLENL = 00;                            //512:00   64:64    
  218.       SYNCDELAY;   
  219.       PA7=0;   
  220.       x=1;   
  221.      }   
  222.     if( (x)&& (!EZUSB_HIGHSPEED()) )   
  223.      {EP6AUTOINLENH = 00;  // EP6 auto in length: 512  //512:02  64:00    
  224.       SYNCDELAY;   
  225.       EP6AUTOINLENL = 64;                            //512:00   64:64    
  226.       SYNCDELAY;   
  227.    
  228.       EP8AUTOINLENH = 00;  // EP8 auto in length: 512  //512:02  64:00    
  229.       SYNCDELAY;   
  230.       EP8AUTOINLENL = 64;                            //512:00   64:64    
  231.       SYNCDELAY;   
  232.       PA7=1;   
  233.       x=0;   
  234.      }   
  235.    
  236.    
  237.     if( !( EP2468STAT & 0x04 ) )   
  238.          { // EP4EF=0 when FIFO NOT empty, host sent packet    
  239.              
  240.           OUTPKTEND = 0x04; // SKIP=0, pass buffer on to master    
  241.           SYNCDELAY;   
  242.              
  243.           PA7=!PA7;   
  244.          }   
  245.    
  246. }   
  247.    
  248. BOOL TD_Suspend(void)          // Called before the device goes into suspend mode    
  249. {     
  250.    return(TRUE);   
  251. }   
  252.    
  253. BOOL TD_Resume(void)          // Called after the device resumes    
  254. {   
  255.       
  256.     return(TRUE);   
  257. }   
  258.    
  259. //-----------------------------------------------------------------------------    
  260. // Device Request hooks    
  261. //   The following hooks are called by the end point 0 device request parser.    
  262. //-----------------------------------------------------------------------------    
  263.    
  264. BOOL DR_GetDescriptor(void)   
  265. {   
  266.    return(TRUE);   
  267. }   
  268.    
  269. BOOL DR_SetConfiguration(void)   // Called when a Set Configuration command is received    
  270. {   
  271.    Configuration = SETUPDAT[2];   
  272.    return(TRUE);            // Handled by user code    
  273. }   
  274.    
  275. BOOL DR_GetConfiguration(void)   // Called when a Get Configuration command is received    
  276. {   
  277.    EP0BUF[0] = Configuration;   
  278.    EP0BCH = 0;   
  279.    EP0BCL = 1;   
  280.    return(TRUE);            // Handled by user code    
  281. }   
  282.    
  283. BOOL DR_SetInterface(void)       // Called when a Set Interface command is received    
  284. {   
  285.    AlternateSetting = SETUPDAT[2];   
  286.    return(TRUE);            // Handled by user code    
  287. }   
  288.    
  289. BOOL DR_GetInterface(void)       // Called when a Set Interface command is received    
  290. {   
  291.    EP0BUF[0] = AlternateSetting;   
  292.    EP0BCH = 0;   
  293.    EP0BCL = 1;   
  294.    return(TRUE);            // Handled by user code    
  295. }   
  296.    
  297. BOOL DR_GetStatus(void)   
  298. {   
  299.    return(TRUE);   
  300. }   
  301.    
  302. BOOL DR_ClearFeature(void)   
  303. {   
  304.    return(TRUE);   
  305. }   
  306.    
  307. BOOL DR_SetFeature(void)   
  308. {   
  309.    return(TRUE);   
  310. }   
  311.    
  312. BOOL DR_VendorCmnd(void)   
  313. {   
  314.     switch(SETUPDAT[1])   
  315.     {   
  316.         case VR_SEND_COMMAND:   
  317.             PA0 = SETUPDAT[2] & 1;   
  318.             PA1 = (SETUPDAT[2] >> 1) & 1;   
  319.    
  320.             PA3 = 0;   
  321.             PA3 = 1;   
  322.    
  323.            break;   
  324.         case VR_RESET_FIFO:   
  325.                
  326.    
  327.             FIFORESET = 0x80; // reset all FIFOs    
  328.             SYNCDELAY;   
  329.             FIFORESET = 0x02;   
  330.             SYNCDELAY;   
  331.             FIFORESET = 0x04;   
  332.             SYNCDELAY;   
  333.             FIFORESET = 0x06;   
  334.             SYNCDELAY;   
  335.             FIFORESET = 0x08;   
  336.             SYNCDELAY;   
  337.             FIFORESET = 0x00;   
  338.             SYNCDELAY;   
  339.    
  340.             break;   
  341.     }   
  342.    
  343.     return(FALSE); // no error; command handled OK    
  344. }   
  345.    
  346. //-----------------------------------------------------------------------------    
  347. // USB Interrupt Handlers    
  348. //   The following functions are called by the USB interrupt jump table.    
  349. //-----------------------------------------------------------------------------    
  350.    
  351. // Setup Data Available Interrupt Handler    
  352. void ISR_Sudav(void) interrupt 0   
  353. {   
  354.    GotSUD = TRUE;            // Set flag    
  355.    EZUSB_IRQ_CLEAR();   
  356.    USBIRQ = bmSUDAV;         // Clear SUDAV IRQ    
  357. }   
  358.    
  359. // Setup Token Interrupt Handler    
  360. void ISR_Sutok(void) interrupt 0   
  361. {   
  362.    EZUSB_IRQ_CLEAR();   
  363.    USBIRQ = bmSUTOK;         // Clear SUTOK IRQ    
  364. }   
  365.    
  366. void ISR_Sof(void) interrupt 0   
  367. {   
  368.    EZUSB_IRQ_CLEAR();   
  369.    USBIRQ = bmSOF;            // Clear SOF IRQ    
  370. }   
  371.    
  372. void ISR_Ures(void) interrupt 0   
  373. {   
  374.    if (EZUSB_HIGHSPEED())   
  375.    {   
  376.       pConfigDscr = pHighSpeedConfigDscr;   
  377.       pOtherConfigDscr = pFullSpeedConfigDscr;   
  378.    }   
  379.    else   
  380.    {   
  381.       pConfigDscr = pFullSpeedConfigDscr;   
  382.       pOtherConfigDscr = pHighSpeedConfigDscr;   
  383.    }   
  384.       
  385.    EZUSB_IRQ_CLEAR();   
  386.    USBIRQ = bmURES;         // Clear URES IRQ    
  387. }   
  388.    
  389. void ISR_Susp(void) interrupt 0   
  390. {   
  391.    Sleep = TRUE;   
  392.    EZUSB_IRQ_CLEAR();   
  393.    USBIRQ = bmSUSP;   
  394.       
  395. }   
  396.    
  397. void ISR_Highspeed(void) interrupt 0   
  398. {   
  399.    if (EZUSB_HIGHSPEED())   
  400.    {   
  401.       pConfigDscr = pHighSpeedConfigDscr;   
  402.       pOtherConfigDscr = pFullSpeedConfigDscr;   
  403.    
  404.    }   
  405.    else   
  406.    {   
  407.       pConfigDscr = pFullSpeedConfigDscr;   
  408.       pOtherConfigDscr = pHighSpeedConfigDscr;   
  409.     
  410.     }   
  411.    
  412.    EZUSB_IRQ_CLEAR();   
  413.    USBIRQ = bmHSGRANT;   
  414.       
  415. }   
  416. void ISR_Ep0ack(void) interrupt 0   
  417. {   
  418. }   
  419. void ISR_Stub(void) interrupt 0   
  420. {   
  421. }   
  422. void ISR_Ep0in(void) interrupt 0   
  423. {   
  424. }   
  425. void ISR_Ep0out(void) interrupt 0   
  426. {   
  427. }   
  428. void ISR_Ep1in(void) interrupt 0   
  429. {   
  430. }   
  431. void ISR_Ep1out(void) interrupt 0   
  432. {   
  433. }   
  434. void ISR_Ep2inout(void) interrupt 0   
  435. {   
  436. }   
  437. void ISR_Ep4inout(void) interrupt 0   
  438. {   
  439. }   
  440. void ISR_Ep6inout(void) interrupt 0   
  441. {   
  442. }   
  443. void ISR_Ep8inout(void) interrupt 0   
  444. {   
  445. }   
  446. void ISR_Ibn(void) interrupt 0   
  447. {   
  448. }   
  449. void ISR_Ep0pingnak(void) interrupt 0   
  450. {   
  451. }   
  452. void ISR_Ep1pingnak(void) interrupt 0   
  453. {   
  454. }   
  455. void ISR_Ep2pingnak(void) interrupt 0   
  456. {   
  457. }   
  458. void ISR_Ep4pingnak(void) interrupt 0   
  459. {   
  460. }   
  461. void ISR_Ep6pingnak(void) interrupt 0   
  462. {   
  463. }   
  464. void ISR_Ep8pingnak(void) interrupt 0   
  465. {   
  466. }   
  467. void ISR_Errorlimit(void) interrupt 0   
  468. {   
  469. }   
  470. void ISR_Ep2piderror(void) interrupt 0   
  471. {   
  472. }   
  473. void ISR_Ep4piderror(void) interrupt 0   
  474. {   
  475. }   
  476. void ISR_Ep6piderror(void) interrupt 0   
  477. {   
  478. }   
  479. void ISR_Ep8piderror(void) interrupt 0   
  480. {   
  481. }   
  482. void ISR_Ep2pflag(void) interrupt 0   
  483. {   
  484. }   
  485. void ISR_Ep4pflag(void) interrupt 0   
  486. {   
  487. }   
  488. void ISR_Ep6pflag(void) interrupt 0   
  489. {   
  490. }   
  491. void ISR_Ep8pflag(void) interrupt 0   
  492. {   
  493. }   
  494. void ISR_Ep2eflag(void) interrupt 0   
  495. {   
  496. }   
  497. void ISR_Ep4eflag(void) interrupt 0   
  498. {   
  499. }   
  500. void ISR_Ep6eflag(void) interrupt 0   
  501. {   
  502. }   
  503. void ISR_Ep8eflag(void) interrupt 0   
  504. {   
  505. }   
  506. void ISR_Ep2fflag(void) interrupt 0   
  507. {   
  508. }   
  509. void ISR_Ep4fflag(void) interrupt 0   
  510. {   
  511. }   
  512. void ISR_Ep6fflag(void) interrupt 0   
  513. {   
  514. }   
  515. void ISR_Ep8fflag(void) interrupt 0   
  516. {   
  517. }   
  518. void ISR_GpifComplete(void) interrupt 0   
  519. {   
  520. }   
  521. void ISR_GpifWaveform(void) interrupt 0   
  522. {   

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

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