usbmain.c
上传用户:hank9955
上传日期:2022-08-05
资源大小:14k
文件大小:3k
源码类别:

USB编程

开发平台:

C/C++

  1. /****************************************************************
  2.  NAME: usbmain.c
  3.  DESC: endpoint interrupt handler
  4.        USB init jobs
  5.  HISTORY:
  6.  Mar.25.2002:purnnamu: ported for S3C2410X.
  7.  Mar.27.2002:purnnamu: DMA is enabled.
  8.  ****************************************************************/
  9. #include <string.h>
  10. #include <stdarg.h>
  11. #include "option.h"
  12. #include "2410addr.h"
  13. #include "2410lib.h"
  14. #include "def.h"
  15. #include "2410usb.h"
  16. #include "usbmain.h"
  17. #include "usblib.h"
  18. #include "usbsetup.h"
  19. #include "usbout.h"
  20. #include "usbin.h"
  21. /**************************
  22.     Some PrepareEp1Fifo() should be deleted
  23.  **************************/   
  24. void UsbdMain(void)
  25. {
  26.     int i;
  27.     U8 tmp1;
  28.     U8 oldTmp1=0xff;
  29.     
  30.     //ChangeUPllValue(0x48,0x3,0x2);  //UCLK=48Mhz     
  31.     //ChangeUPllValue(40,1,2);  //UCLK=48Mhz  setting in init.s
  32.     InitDescriptorTable();
  33.     //ResetUsbd();
  34.     
  35.     ConfigUsbd(); 
  36.     //DetectVbus(); //not used in S3C2400X
  37.  
  38. #if 0   
  39.     while(1)
  40.     {
  41.      if(DbgPrintfLoop())continue;
  42.     
  43.      Delay(5000);
  44.      if((i++%2)==0)Led_Display(0x8);
  45.      else Led_Display(0x0);
  46.     }
  47. #endif    
  48. }
  49. void __irq IsrUsbd(void)
  50. {
  51.     U8 usbdIntpnd,epIntpnd;
  52.     U8 saveIndexReg=rINDEX_REG;
  53.     usbdIntpnd=rUSB_INT_REG;
  54.     epIntpnd=rEP_INT_REG;
  55.     //DbgPrintf( "[INT:EP_I=%x,USBI=%x]",epIntpnd,usbIntpnd );
  56.     if(usbdIntpnd&SUSPEND_INT)
  57.     {
  58.      rUSB_INT_REG=SUSPEND_INT;
  59.      DbgPrintf( "<SUS]");
  60.     }
  61.     if(usbdIntpnd&RESUME_INT)
  62.     {
  63.      rUSB_INT_REG=RESUME_INT;
  64.      DbgPrintf("<RSM]");
  65.     }
  66.     if(usbdIntpnd&RESET_INT)
  67.     {
  68.      DbgPrintf( "<RST]");  
  69.     
  70.      //ResetUsbd();
  71.      ReconfigUsbd();
  72.      rUSB_INT_REG=RESET_INT;  //RESET_INT should be cleared after ResetUsbd().   
  73.     }
  74.     if(epIntpnd&EP0_INT)
  75.     {
  76. rEP_INT_REG=EP0_INT;  
  77.      Ep0Handler();
  78.     }
  79.     if(epIntpnd&EP1_INT)
  80.     {
  81.      rEP_INT_REG=EP1_INT;  
  82.      Ep1Handler();
  83.     }
  84.     if(epIntpnd&EP2_INT)
  85.     {
  86.      rEP_INT_REG=EP2_INT;  
  87.      DbgPrintf("<2:TBD]");   //not implemented yet
  88.      //Ep2Handler();
  89.     }
  90.     if(epIntpnd&EP3_INT)
  91.     {
  92.      rEP_INT_REG=EP3_INT;
  93.      Ep3Handler();
  94.     }
  95.     if(epIntpnd&EP4_INT)
  96.     {
  97.      rEP_INT_REG=EP4_INT;
  98.      DbgPrintf("<4:TBD]");   //not implemented yet
  99.      //Ep4Handler();
  100.     }
  101.     ClearPending(BIT_USBD);  
  102.     
  103.     rINDEX_REG=saveIndexReg;
  104. }
  105. /******************* Consol printf for debug *********************/
  106. #define DBGSTR_LENGTH (0x1000)
  107. U8 dbgStrFifo[DBGSTR_LENGTH];
  108. volatile U32 dbgStrRdPt=0;
  109. volatile U32 dbgStrWrPt=0;
  110. void _WrDbgStrFifo(U8 c)
  111. {
  112.     dbgStrFifo[dbgStrWrPt++]=c;
  113.     if(dbgStrWrPt==DBGSTR_LENGTH)dbgStrWrPt=0;
  114. }
  115. int DbgPrintfLoop(void)
  116. {
  117.     if(dbgStrRdPt==dbgStrWrPt)return 0;
  118.     Uart_SendByte(dbgStrFifo[dbgStrRdPt++]);
  119.     if(dbgStrRdPt==DBGSTR_LENGTH)dbgStrRdPt=0;
  120.     return 1;
  121. }
  122. #if 0
  123. void DbgPrintf(char *fmt,...)
  124. {
  125.     int i,slen;
  126.     va_list ap;
  127.     char string[256];
  128.     va_start(ap,fmt);
  129.     vsprintf(string,fmt,ap);
  130.     
  131.     slen=strlen(string);
  132.     
  133.     for(i=0;i<slen;i++)
  134.      _WrDbgStrFifo(string[i]);
  135.     
  136.     va_end(ap);
  137. }
  138. #else
  139. void DbgPrintf(char *fmt,...)
  140. {
  141. }
  142. #endif