搜索
bottom↓
回复: 0

68013的端点设置疑问

[复制链接]

出0入0汤圆

发表于 2014-10-25 10:16:51 | 显示全部楼层 |阅读模式
  1. //-----------------------------------------------------------------------------
  2. //   File:      bulkloop.c
  3. //   Contents:  Hooks required to implement USB peripheral function.
  4. //
  5. // $Archive: /USB/Examples/FX2LP/bulkloop/bulkloop.c $
  6. // $Date: 3/23/05 2:55p $
  7. // $Revision: 4 $
  8. //
  9. //
  10. //-----------------------------------------------------------------------------
  11. // Copyright 2003, Cypress Semiconductor Corporation
  12. //-----------------------------------------------------------------------------
  13. #pragma NOIV               // Do not generate interrupt vectors

  14. #include "fx2.h"
  15. #include "fx2regs.h"
  16. #include "syncdly.h"            // SYNCDELAY macro

  17. extern BOOL GotSUD;             // Received setup data flag
  18. extern BOOL Sleep;
  19. extern BOOL Rwuen;
  20. extern BOOL Selfpwr;

  21. BYTE Configuration;             // Current configuration
  22. BYTE AlternateSetting;          // Alternate settings

  23. #define VR_NAKALL_ON    0xD0
  24. #define VR_NAKALL_OFF   0xD1

  25. //-----------------------------------------------------------------------------
  26. // Task Dispatcher hooks
  27. //   The following hooks are called by the task dispatcher.
  28. //-----------------------------------------------------------------------------

  29. void TD_Init(void)             // Called once at startup
  30. {
  31.    // set the CPU clock to 48MHz
  32.    CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1) ;

  33.    // set the slave FIFO interface to 48MHz
  34.    IFCONFIG |= 0x40;

  35.   // Registers which require a synchronization delay, see section 15.14
  36.   // FIFORESET        FIFOPINPOLAR
  37.   // INPKTEND         OUTPKTEND
  38.   // EPxBCH:L         REVCTL
  39.   // GPIFTCB3         GPIFTCB2
  40.   // GPIFTCB1         GPIFTCB0
  41.   // EPxFIFOPFH:L     EPxAUTOINLENH:L
  42.   // EPxFIFOCFG       EPxGPIFFLGSEL
  43.   // PINFLAGSxx       EPxFIFOIRQ
  44.   // EPxFIFOIE        GPIFIRQ
  45.   // GPIFIE           GPIFADRH:L
  46.   // UDMACRCH:L       EPxGPIFTRIG
  47.   // GPIFTRIG
  48.   
  49.   // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well...
  50.   //      ...these have been replaced by GPIFTC[B3:B0] registers

  51.   // default: all endpoints have their VALID bit set
  52.   // default: TYPE1 = 1 and TYPE0 = 0 --> BULK  
  53.   // default: EP2 and EP4 DIR bits are 0 (OUT direction)
  54.   // default: EP6 and EP8 DIR bits are 1 (IN direction)
  55.   // default: EP2, EP4, EP6, and EP8 are double buffered

  56.   // we are just using the default values, yes this is not necessary...
  57.   EP1OUTCFG = 0xA0;
  58.   EP1INCFG = 0xA0;
  59.   SYNCDELAY;                    // see TRM section 15.14
  60.   EP2CFG = 0xA2;
  61.   SYNCDELAY;                    
  62.   EP4CFG = 0xA0;
  63.   SYNCDELAY;                    
  64.   EP6CFG = 0xE2;
  65.   SYNCDELAY;                    
  66.   EP8CFG = 0xE0;

  67.   // out endpoints do not come up armed
  68.   
  69.   // since the defaults are double buffered we must write dummy byte counts twice
  70.   SYNCDELAY;                    
  71.   EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
  72.   SYNCDELAY;                    
  73.   EP2BCL = 0x80;
  74.   SYNCDELAY;                    
  75.   EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.
  76.   SYNCDELAY;                    
  77.   EP4BCL = 0x80;   

  78.   // enable dual autopointer feature
  79.   AUTOPTRSETUP |= 0x01;

  80. }


  81. void TD_Poll(void)              // Called repeatedly while the device is idle
  82. {
  83.   WORD i;
  84.   WORD count;

  85.   if(!(EP2468STAT & bmEP2EMPTY))
  86.   { // check EP2 EMPTY(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is empty
  87.      if(!(EP2468STAT & bmEP6FULL))
  88.      {  // check EP6 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is full
  89.         APTR1H = MSB( &EP2FIFOBUF );
  90.         APTR1L = LSB( &EP2FIFOBUF );

  91.         AUTOPTRH2 = MSB( &EP6FIFOBUF );
  92.         AUTOPTRL2 = LSB( &EP6FIFOBUF );

  93.         count = (EP2BCH << 8) + EP2BCL;

  94.         // loop EP2OUT buffer data to EP6IN
  95.         for( i = 0x0000; i < count; i++ )
  96.         {
  97.            // setup to transfer EP2OUT buffer to EP6IN buffer using AUTOPOINTER(s)
  98.            EXTAUTODAT2 = EXTAUTODAT1;
  99.         }
  100.         EP6BCH = EP2BCH;  
  101.         SYNCDELAY;  
  102.         EP6BCL = EP2BCL;        // arm EP6IN
  103.         SYNCDELAY;                    
  104.         EP2BCL = 0x80;          // re(arm) EP2OUT
  105.      }
  106.   }

  107.   if(!(EP2468STAT & bmEP4EMPTY))
  108.   { // check EP4 EMPTY(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is empty
  109.      if(!(EP2468STAT & bmEP8FULL))
  110.      {  // check EP8 FULL(busy) bit in EP2468STAT (SFR), core set's this bit when FIFO is full
  111.         APTR1H = MSB( &EP4FIFOBUF );
  112.         APTR1L = LSB( &EP4FIFOBUF );

  113.         AUTOPTRH2 = MSB( &EP8FIFOBUF );
  114.         AUTOPTRL2 = LSB( &EP8FIFOBUF );

  115.         count = (EP4BCH << 8) + EP4BCL;

  116.         // loop EP4OUT buffer data to EP8IN
  117.         for( i = 0x0000; i < count; i++ )
  118.         {
  119.            // setup to transfer EP4OUT buffer to EP8IN buffer using AUTOPOINTER(s)
  120.            EXTAUTODAT2 = EXTAUTODAT1;
  121.         }
  122.         EP8BCH = EP4BCH;  
  123.         SYNCDELAY;  
  124.         EP8BCL = EP4BCL;        // arm EP8IN
  125.         SYNCDELAY;                    
  126.         EP4BCL = 0x80;          // re(arm) EP4OUT
  127.      }
  128.   }
  129. }

  130. BOOL TD_Suspend(void)          // Called before the device goes into suspend mode
  131. {
  132.    return(TRUE);
  133. }

  134. BOOL TD_Resume(void)          // Called after the device resumes
  135. {
  136.    return(TRUE);
  137. }

  138. //-----------------------------------------------------------------------------
  139. // Device Request hooks
  140. //   The following hooks are called by the end point 0 device request parser.
  141. //-----------------------------------------------------------------------------

  142. BOOL DR_GetDescriptor(void)
  143. {
  144.    return(TRUE);
  145. }

  146. BOOL DR_SetConfiguration(void)   // Called when a Set Configuration command is received
  147. {
  148.    Configuration = SETUPDAT[2];
  149.    return(TRUE);            // Handled by user code
  150. }

  151. BOOL DR_GetConfiguration(void)   // Called when a Get Configuration command is received
  152. {
  153.    EP0BUF[0] = Configuration;
  154.    EP0BCH = 0;
  155.    EP0BCL = 1;
  156.    return(TRUE);            // Handled by user code
  157. }

  158. BOOL DR_SetInterface(void)       // Called when a Set Interface command is received
  159. {
  160.    AlternateSetting = SETUPDAT[2];
  161.    return(TRUE);            // Handled by user code
  162. }

  163. BOOL DR_GetInterface(void)       // Called when a Set Interface command is received
  164. {
  165.    EP0BUF[0] = AlternateSetting;
  166.    EP0BCH = 0;
  167.    EP0BCL = 1;
  168.    return(TRUE);            // Handled by user code
  169. }

  170. BOOL DR_GetStatus(void)
  171. {
  172.    return(TRUE);
  173. }

  174. BOOL DR_ClearFeature(void)
  175. {
  176.    return(TRUE);
  177. }

  178. BOOL DR_SetFeature(void)
  179. {
  180.    return(TRUE);
  181. }

  182. BOOL DR_VendorCmnd(void)
  183. {
  184.   BYTE tmp;
  185.   
  186.   switch (SETUPDAT[1])
  187.   {
  188.      case VR_NAKALL_ON:
  189.         tmp = FIFORESET;
  190.         tmp |= bmNAKALL;      
  191.         SYNCDELAY;                    
  192.         FIFORESET = tmp;
  193.         break;
  194.      case VR_NAKALL_OFF:
  195.         tmp = FIFORESET;
  196.         tmp &= ~bmNAKALL;      
  197.         SYNCDELAY;                    
  198.         FIFORESET = tmp;
  199.         break;
  200.      default:
  201.         return(TRUE);
  202.   }

  203.   return(FALSE);
  204. }

  205. //-----------------------------------------------------------------------------
  206. // USB Interrupt Handlers
  207. //   The following functions are called by the USB interrupt jump table.
  208. //-----------------------------------------------------------------------------

  209. // Setup Data Available Interrupt Handler
  210. void ISR_Sudav(void) interrupt 0
  211. {
  212.    GotSUD = TRUE;            // Set flag
  213.    EZUSB_IRQ_CLEAR();
  214.    USBIRQ = bmSUDAV;         // Clear SUDAV IRQ
  215. }

  216. // Setup Token Interrupt Handler
  217. void ISR_Sutok(void) interrupt 0
  218. {
  219.    EZUSB_IRQ_CLEAR();
  220.    USBIRQ = bmSUTOK;         // Clear SUTOK IRQ
  221. }

  222. void ISR_Sof(void) interrupt 0
  223. {
  224.    EZUSB_IRQ_CLEAR();
  225.    USBIRQ = bmSOF;            // Clear SOF IRQ
  226. }

  227. void ISR_Ures(void) interrupt 0
  228. {
  229.    // whenever we get a USB reset, we should revert to full speed mode
  230.    pConfigDscr = pFullSpeedConfigDscr;
  231.    ((CONFIGDSCR xdata *) pConfigDscr)->type = CONFIG_DSCR;
  232.    pOtherConfigDscr = pHighSpeedConfigDscr;
  233.    ((CONFIGDSCR xdata *) pOtherConfigDscr)->type = OTHERSPEED_DSCR;

  234.    EZUSB_IRQ_CLEAR();
  235.    USBIRQ = bmURES;         // Clear URES IRQ
  236. }

  237. void ISR_Susp(void) interrupt 0
  238. {
  239.    Sleep = TRUE;
  240.    EZUSB_IRQ_CLEAR();
  241.    USBIRQ = bmSUSP;
  242. }

  243. void ISR_Highspeed(void) interrupt 0
  244. {
  245.    if (EZUSB_HIGHSPEED())
  246.    {
  247.       pConfigDscr = pHighSpeedConfigDscr;
  248.       ((CONFIGDSCR xdata *) pConfigDscr)->type = CONFIG_DSCR;
  249.       pOtherConfigDscr = pFullSpeedConfigDscr;
  250.       ((CONFIGDSCR xdata *) pOtherConfigDscr)->type = OTHERSPEED_DSCR;
  251.    }

  252.    EZUSB_IRQ_CLEAR();
  253.    USBIRQ = bmHSGRANT;
  254. }
  255. void ISR_Ep0ack(void) interrupt 0
  256. {
  257. }
  258. void ISR_Stub(void) interrupt 0
  259. {
  260. }
  261. void ISR_Ep0in(void) interrupt 0
  262. {
  263. }
  264. void ISR_Ep0out(void) interrupt 0
  265. {
  266. }
  267. void ISR_Ep1in(void) interrupt 0
  268. {
  269. }
  270. void ISR_Ep1out(void) interrupt 0
  271. {
  272. }
  273. void ISR_Ep2inout(void) interrupt 0
  274. {
  275. }
  276. void ISR_Ep4inout(void) interrupt 0
  277. {
  278. }
  279. void ISR_Ep6inout(void) interrupt 0
  280. {
  281. }
  282. void ISR_Ep8inout(void) interrupt 0
  283. {
  284. }
  285. void ISR_Ibn(void) interrupt 0
  286. {
  287. }
  288. void ISR_Ep0pingnak(void) interrupt 0
  289. {
  290. }
  291. void ISR_Ep1pingnak(void) interrupt 0
  292. {
  293. }
  294. void ISR_Ep2pingnak(void) interrupt 0
  295. {
  296. }
  297. void ISR_Ep4pingnak(void) interrupt 0
  298. {
  299. }
  300. void ISR_Ep6pingnak(void) interrupt 0
  301. {
  302. }
  303. void ISR_Ep8pingnak(void) interrupt 0
  304. {
  305. }
  306. void ISR_Errorlimit(void) interrupt 0
  307. {
  308. }
  309. void ISR_Ep2piderror(void) interrupt 0
  310. {
  311. }
  312. void ISR_Ep4piderror(void) interrupt 0
  313. {
  314. }
  315. void ISR_Ep6piderror(void) interrupt 0
  316. {
  317. }
  318. void ISR_Ep8piderror(void) interrupt 0
  319. {
  320. }
  321. void ISR_Ep2pflag(void) interrupt 0
  322. {
  323. }
  324. void ISR_Ep4pflag(void) interrupt 0
  325. {
  326. }
  327. void ISR_Ep6pflag(void) interrupt 0
  328. {
  329. }
  330. void ISR_Ep8pflag(void) interrupt 0
  331. {
  332. }
  333. void ISR_Ep2eflag(void) interrupt 0
  334. {
  335. }
  336. void ISR_Ep4eflag(void) interrupt 0
  337. {
  338. }
  339. void ISR_Ep6eflag(void) interrupt 0
  340. {
  341. }
  342. void ISR_Ep8eflag(void) interrupt 0
  343. {
  344. }
  345. void ISR_Ep2fflag(void) interrupt 0
  346. {
  347. }
  348. void ISR_Ep4fflag(void) interrupt 0
  349. {
  350. }
  351. void ISR_Ep6fflag(void) interrupt 0
  352. {
  353. }
  354. void ISR_Ep8fflag(void) interrupt 0
  355. {
  356. }
  357. void ISR_GpifComplete(void) interrupt 0
  358. {
  359. }
  360. void ISR_GpifWaveform(void) interrupt 0
  361. {
  362. }
复制代码


上面的68013的官方examples里面的代码,对端点设置有个疑问,其中如下:
  1.   // we are just using the default values, yes this is not necessary...
  2.   EP1OUTCFG = 0xA0;
  3.   EP1INCFG = 0xA0;
  4.   SYNCDELAY;                    // see TRM section 15.14
  5.   EP2CFG = 0xA2;
  6.   SYNCDELAY;                    
  7.   EP4CFG = 0xA0;
  8.   SYNCDELAY;                    
  9.   EP6CFG = 0xE2;
  10.   SYNCDELAY;                    
  11.   EP8CFG = 0xE0;

  12.   // out endpoints do not come up armed
  13.   
  14.   // since the defaults are double buffered we must write dummy byte counts twice
  15.   SYNCDELAY;                    
  16.   EP2BCL = 0x80;                // arm EP2OUT by writing byte count w/skip.
  17.   SYNCDELAY;                    
  18.   EP2BCL = 0x80;
  19.   SYNCDELAY;                    
  20.   EP4BCL = 0x80;                // arm EP4OUT by writing byte count w/skip.
  21.   SYNCDELAY;                    
  22.   EP4BCL = 0x80;
复制代码


这里已经将EP2设置为双缓冲区了,每个缓冲区为512Byte,那为什么下面在设置EP2BC的时候只设置了EP2BCL=0x80,而没有设置EP2BCH呢,按我的理解应该是设置两遍EP2BCH=0x02,EP2BCL=0x00这样才对呀?我在哪里理解错了吗?哪位给斧正一下,谢了。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-17 16:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表