⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 z228_usb_msc.cpp

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
      Sleep(25000);   
      while (TRUE) {    
     	     gpio.num = GPIO_num;	gpio.pin = GPIO_pin;	
	     gpio.code = GPIO_Read;  value = 0;	
	     gpio.value = &value;
	     KernelIoControl(HAL_IOCTL_GPIO , &gpio , sizeof(OEM_IOCTL_GPIO) , 0 , 0 , 0 );
            if(bCharge && value ==0) {
#ifdef DEBUG_TEXT
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "usb device check the usb cable pull out\r\n");
		fflush(fp);
	}
#else	
                     RETAILMSG(1, (_T("usb device check the usb cable pull out\r\n")));
#endif
                     bCharge = 0;
            }
	     if((value == 0) && (pContext->fAttached || pContext->hIST))  {
#ifdef DEBUG_TEXT
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "gpio = %d set event\r\n", value);
		fflush(fp);
	}
#else
	     	    	RETAILMSG(1, (_T("gpio = %d set event\r\n"), value));
#endif
	            	pContext->fExitIST = TRUE;	
		    	SetEvent(pContext->hevDevEvent);
		    	Sleep(1100);
	      }	
		else{
		  if( pContext->fFunction ==1 && pContext->fAttached == FALSE )   {			 	
		      	z228_Hw_Init();
		      	Sleep(1000);
		   }
		 }
	     Sleep(1200); 
      } 
      RETAILMSG(1, (_T("-ISTMain1\r\n")));
      return 0;
}


// z228 interrupt service routine.
static
DWORD
WINAPI
ISTMain(
    LPVOID lpParameter
    )
{
     PZ228_CONTEXT pContext = (PZ228_CONTEXT) lpParameter;
     DWORD Mode = -1;
    // int value = -1;
    // OEM_IOCTL_GPIO gpio;
     
     ValidateContext(pContext);
     RETAILMSG(USB_INIT, (_T("+ISTMain\r\n")));

     CeSetThreadPriority(pContext->hIST, pContext->dwISTPriority);
	
      // disable the out endpoint
      RETAILMSG(USB_DEBUG, (_T("before(2) = %x\r\n"),usb_read(UDC_TX_STATUS(2))));   
      usb_clear((1 << 2), UDC_ENDP_INTR_ENABLE); 
    
      // Force into full speed mode if required.   
      while (TRUE) {
            DWORD dwWait = WaitForSingleObject(pContext->hevIntrEvent, INFINITE);
            if (pContext->fExitIST)  {
                break;
            }		
            if (dwWait == WAIT_OBJECT_0)  {
            	  Mode = (usb_read(UHC_OTG_CSR)& OTG_MODE_DEVICE)? DEV_MODE : HOST_MODE;
            	  if(Mode == DEV_MODE)    {           	  
                		HandleUSBEvent(pContext); 
                		InterruptDone(29);
                }
//因为重复弹框,故去掉下面的代码 2007-2-12                
#if 0
                else if(Mode == HOST_MODE)   {
                	  pContext->fExitIST = TRUE;	
			        			SetEvent(pContext->hevDevEvent);
		               	Sleep(100);		
                }       
#endif                    
            }
            else {
                RETAILMSG(USB_DEBUG, (_T("ISTMain: WaitForSingleObject failed. Exiting IST.\r\n")));
                break;
            }
      } 

       // Send detach
       pContext->fSpeedReported = FALSE;
       //z228_suspend_intr(pContext);       
       if(pContext->fAttached == TRUE)	  {
                   pContext->pfnNotify(pContext->pvMddContext,UFN_MSG_BUS_EVENTS, UFN_DETACH);
                   pContext->fAttached = FALSE;
		     usb_set(UDC_BUSRESET_INTR, UDC_INTR_ENABLE); 
		     usb_clear(UDC_SUSPEND_INTR, UDC_INTR_ENABLE);
       }	       
       RETAILMSG(USB_INIT, (_T("-ISTMain\r\n")));
       return 0;
}


static
DWORD
WINAPI
MainThread(
        LPVOID lpParameter
        )
{

    FUNCTION_ENTER_MSG();
    PZ228_CONTEXT pContext = (PZ228_CONTEXT) lpParameter;
    DWORD dwID_Change = -1, dwMode = -1; 
    DWORD dwRet, dwWait ;
    BOOL fIntInitialized; 
    HCURSOR hCur;
    OEM_IOCTL_GPIO gpio;
    int value = 0;
    DWORD *pAddrGpio = NULL;
	
    RETAILMSG(USB_INIT, (_T("+MainThread \r\n")));
    pContext->fExitIST = false; 

#ifdef DEBUG_TEXT
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "++MainThread\n");
		fflush(fp);
	}
#endif

   // Create Z228 Dev notify event
    pContext->hevDevEvent = CreateEvent(0, FALSE, FALSE, _T("DevNotifyEvent"));   
    if (pContext->hevDevEvent == NULL) {
        dwRet = GetLastError();
        RETAILMSG(USB_ERROR, (_T("%s Error creating Z228 DevNotifyEvent. Error = %d\r\n"), 
            pszFname, dwRet));
	      goto EXIT;	
    }
	
    pContext->hevDevDoneEvent = CreateEvent(0, FALSE, FALSE, _T("DevNotifyDoneEvent"));
    if (pContext->hevDevDoneEvent == NULL) {
        dwRet = GetLastError();
        RETAILMSG(USB_ERROR, (_T("%s Error creating z228 DevNotifyDoneEvent. Error = %d\r\n"), 
            pszFname, dwRet));
	  goto EXIT;
    }

   // Create Z228 Host notify event
    pContext->hevHostEvent= CreateEvent(0, FALSE, FALSE, _T("HostNotifyEvent"));
    if (pContext->hevHostEvent == NULL) {
        dwRet = GetLastError();
        RETAILMSG(USB_ERROR, (_T("%s Error creating Z228 HostNotifyEvent. Error = %d\r\n"), 
            pszFname, dwRet));
        goto EXIT;
    }

    pContext->hevHostDoneEvent = CreateEvent(0, FALSE, FALSE, _T("HostNotifyDoneEvent"));
    if (pContext->hevHostDoneEvent== NULL) {
        dwRet = GetLastError();
        RETAILMSG(USB_ERROR, (_T("%s Error creating z228 HostNotifyDoneEvent. Error = %d\r\n"), 
            pszFname, dwRet));
        goto EXIT;
    }
	
    while(TRUE){
	   Sleep(100);
          dwWait = WaitForSingleObject(pContext->hevDevEvent, INFINITE);
           if (dwWait != WAIT_OBJECT_0) {
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Dev ERROR EVENT\r\n");
		fflush(fp);
	}
}
#else
                  RETAILMSG(USB_ERROR, (_T("Dev ERROR EVENT\r\n")));
#endif
		    continue;
	   }
		  RETAILMSG(USB_DEBUG, (_T("Device Rx ID change!charge = %d\r\n"), bCharge));
          if(pContext->fExitIST)  {
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "++MainThread\n");
		fflush(fp);
	}
}
#else		  	
		  RETAILMSG(1, (_T("Exit ISTMain! %d\r\n"), bCharge));
#endif
		  if(pContext->hIST)  {
		  	  SetEvent(pContext->hevIntrEvent);
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Stop Dev IST ...\r\n");
		fflush(fp);
	}
}
#else				  
		  	  RETAILMSG(1, (_T("Stop Dev IST ...\r\n")));
#endif
			  dwWait = WaitForSingleObject(pContext->hIST, 2000);
			  if ( dwWait != WAIT_OBJECT_0 ) {
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Stop Dev IST Forcely ...\r\n");
		fflush(fp);
	}
}
#else				  	
                            RETAILMSG(USB_ERROR, (_T("Stop Dev IST Forcely ...\r\n")));
#endif
                            TerminateThread(pContext->hIST , DWORD(-1));
                       } 
                       CloseHandle(pContext->hIST);
                       if(pContext->fAttached == TRUE)	  {
                   pContext->pfnNotify(pContext->pvMddContext,UFN_MSG_BUS_EVENTS, UFN_DETACH);
                   pContext->fAttached = FALSE;		     
	  }
                       pContext->hIST = NULL;
			  pContext->fExitIST =  FALSE;
		  }
		 pContext->fFunction = FALSE;
		 Sleep(50);
		 InterruptDone(29);
		 InterruptDisable(29);
		 if(pContext->hevIntrEvent) {
			  	 CloseHandle(pContext->hevIntrEvent);
				 pContext->hevIntrEvent = NULL;
		  }
		  usb_set(UDC_BUSRESET_INTR |UDC_SUSPEND_INTR,  UDC_INTR);

                if(bCharge)  {
                        gpio.num = GPIO_num;	gpio.pin = GPIO_pin;	
	                 gpio.code = GPIO_Read;  value = 0;	
	                 gpio.value = &value;            
	                 KernelIoControl(HAL_IOCTL_GPIO , &gpio , sizeof(OEM_IOCTL_GPIO) , 0 , 0 , 0 );
                        bCharge = (value>0);
                        if(!bCharge)
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Stop Dev IST Forcely ...\r\n");
		fflush(fp);
	}
}
#else								
                        RETAILMSG(1, (TEXT("Dev Gpio value = 0x%x  0x%x\n"), bCharge, value));
#endif
                 }
                
                //write the value to the register
                {
                    HKEY ActiveKey;
                    DWORD status;
                    const LPCTSTR pszKey = L"Drivers\\BuiltIn\\USB_MSC";
                    //DWORD dwValLen;

                    status = RegOpenKeyEx(
                                HKEY_LOCAL_MACHINE,
                                (LPCWSTR)pszKey,
                                0,
                                0,
                                &ActiveKey );
                   if(status !=  ERROR_SUCCESS){
                                RETAILMSG(USB_ERROR, (TEXT("500k debug: Failed to open active key \r\n")));
                   }
    
                   RETAILMSG(USB_DEBUG, (TEXT("set: Val = %d\r\n"), bCharge));

                   //set the registry 
                  status = RegSetValueEx(ActiveKey, L"MscExInfo", 0, REG_DWORD, (BYTE *)&bCharge, sizeof(DWORD));
                  if(status !=  ERROR_SUCCESS){     
                          RETAILMSG(USB_ERROR, (TEXT("Failed to set active key\r\n")));
	                   RegCloseKey(ActiveKey);
    
                 }
                 RegCloseKey(ActiveKey); 
                }                
		  SetEvent(pContext->hevHostEvent);
		  Sleep(50);
		  continue;
	   }
	   else { 
              bCharge = 1;
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Start Dev ISTMain! %d\r\n", bCharge);
		fflush(fp);
	}
}
#else					  
	   	RETAILMSG(1, (_T("Start Dev ISTMain! %d\r\n"), bCharge)); 
#endif
              Sleep(200);

		pContext->hevIntrEvent = CreateEvent(0, FALSE, FALSE, NULL);
              if(pContext->hevIntrEvent == NULL) {
                    DWORD dwRet = GetLastError();
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Error creating z228 IntrEvent. Error = %d\r\n", dwRet);
		fflush(fp);
	}
}
#else	
                    RETAILMSG(USB_ERROR, (_T("Error creating z228 IntrEvent. Error = %d\r\n"),dwRet));
#endif
                    continue;
              }	

            //enable intr	  
            fIntInitialized  = InterruptInitialize(29, pContext->hevIntrEvent , NULL, 0);
            if (fIntInitialized == FALSE) {
		  DWORD dwRet = GetLastError(); 
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Z228 USB Dev interrupt initialization failed! Error = %d\r\n", dwRet);
		fflush(fp);
	}
}
#else	
                RETAILMSG(USB_ERROR,  (_T(" Z228 USB Dev interrupt initialization failed! Error = %d\r\n"),dwRet));
#endif
                if(pContext->hevIntrEvent)   {
		      	CloseHandle(pContext->hevIntrEvent);
			pContext->hevIntrEvent = NULL;	
                }
		  continue;
            }
            Sleep(50); 
              
              // Disable cursor, and save old value
	       hCur = SetCursor(NULL);   

#if 0
	       {
			  		PROCESS_INFORMATION pi;
	       		HANDLE hEvents[2];

						hEvents[0] = CreateEvent(NULL, FALSE, FALSE, L"SelUsbEvent");
						hEvents[1] = CreateEvent(NULL, FALSE, FALSE, L"SelChargeEvent");
						
						if(!CreateProcess(L"\\windows\\UsbTip.exe",L".EXE",NULL,NULL,NULL,CREATE_NEW_CONSOLE,NULL,NULL,NULL,&pi))
						{
							RETAILMSG (1, (TEXT("open UsbTip.exe FAIL!\r\n")));
						}
						else
						{
							if( WaitForMultipleObjects(2, &hEvents[0], FALSE, INFINITE) == WAIT_OBJECT_0)
							{
								pContext->fFunction = TRUE;
							}
							else
							{
								pContext->fFunction = FALSE;
							}
						}
						
						if(hEvents[0])
						{
							CloseHandle(hEvents[0]);
						}
					
						if(hEvents[1])
						{
							CloseHandle(hEvents[1]);
						}
						
		      }
#else	      
			        pContext->fFunction = (MessageBox( NULL, MESSAGE_TITLE,TEXT("USB"), MB_YESNO |MB_DEFBUTTON2 |MB_TOPMOST|MB_ICONWARNING) == IDYES ) ? TRUE : FALSE;
#endif
              SetCursor(hCur);                
              

        // start intr ist
      if( pContext->hIST ) {
     	    RETAILMSG(USB_DEBUG, (_T("Stop Dev IST 2...\r\n")));
           pContext->fExitIST = TRUE;
	    SetEvent(pContext->hevIntrEvent);
	    RETAILMSG(USB_ERROR, (_T("Stop Dev IST ...\r\n")));
	    dwWait = WaitForSingleObject(pContext->hIST, 2000);
	    if ( dwWait != WAIT_OBJECT_0 ) {
                   RETAILMSG(USB_ERROR, (_T("Stop Dev IST Forcely ...\r\n")));
                   TerminateThread(pContext->hIST , DWORD(-1));
             } 
           CloseHandle(pContext->hIST);
	    pContext->fExitIST = FALSE;
           pContext->hIST = NULL;
       }		   
				  
	
       pContext->hIST = CreateThread(NULL, 0, ISTMain, pContext, 0, NULL);
       if (pContext->hIST == NULL) {
#ifdef DEBUG_TEXT
{
 	if(fp == NULL)
		fp = fopen("\\debug.txt", "a+");
	if(fp)  {
		fprintf(fp, "Dev IST creation failed\r\n");
		fflush(fp);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -