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

📄 serialcsr.cpp

📁 关于S3C2442平台蓝牙模块驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		if(gpfnCOM_Seek)
			lResult = gpfnCOM_Seek(pHead, Position, Type);
	}
	
	return lResult;
}

/////////////////////////////////////////////////////////////////////
// COM_PowerUp Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
//   Powerup is flagged to ensure PS update is performed on next
//   access.
//
BOOL
WINAPI
CSR_PowerUp(HANDLE pContext)
{
	BOOL bResult = NULL;
	HANDLE hPort = NULL;
	RETAILMSG(SC_DBG,(TEXT("CSR_PowerUp:enter !!!!\r\n")));	
	if(ghLibInst)
	{
		if(gpfnCOM_PowerUp)
			bResult = gpfnCOM_PowerUp(pContext);
	}
	RETAILMSG(SC_DBG,(TEXT("CSR_PowerUp:Finish")));
	return bResult;
}

/////////////////////////////////////////////////////////////////////
// COM_PowerDown Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
//   PowerDown is flagged to ensure PS update is performed on next
//   access.  Even though
//
BOOL
WINAPI
CSR_PowerDown(HANDLE pContext)
{
	BOOL bResult = NULL;
   	
     	RETAILMSG(SC_DBG,(TEXT("CSR_PowerDown:enter\r\n")));
	if(ghLibInst)
	{
		if(gpfnCOM_PowerDown)
			bResult = gpfnCOM_PowerDown(pContext);
	}
	BTEnable(FALSE);
	RETAILMSG(SC_DBG,(TEXT("CSR_PowerDown:leave\r\n")));
	return bResult;
}

/////////////////////////////////////////////////////////////////////
// COM_IOControl Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
BOOL
WINAPI
CSR_IOControl(DWORD dwOpenData, DWORD dwCode, PBYTE pBufIn, 
	      DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, 
	      PDWORD pdwActualOut)
{
  BOOL bResult = FALSE;
  PHW_OPEN_INFO     pOpenData  = (PHW_OPEN_INFO)dwOpenData;
  pSkey.pSerialHead = (PHW_INDEP_INFO)pOpenData->pSerialHead;
  RETAILMSG(SC_DBG,(TEXT("CSR_IOControl:enter\r\n")));
  switch ( dwCode ) 
  {
      case IOCTL_BT_TESTMOD:
      {
      	
      	bTestMode = TRUE;
      	BTEnable(TRUE);
      	UpdatePersistentStore(hBTTest);
      	Sleep(100);
      	UpdatePersistentStore(hBTTest);
        SetTestModeCMD(hBTTest);
        
        bResult = TRUE;
      }
      break;
 
      case IOCTL_POWER_CAPABILITIES:
  	   if (pBufOut && dwLenOut >= sizeof (POWER_CAPABILITIES) && pdwActualOut)
  	   {
                PPOWER_CAPABILITIES PowerCaps = (PPOWER_CAPABILITIES)pBufOut;
	        memset(PowerCaps, 0, sizeof (*PowerCaps));
		PowerCaps->DeviceDx = 0x11;	//support D0 and D4
		*pdwActualOut = sizeof (*PowerCaps);
		bResult = TRUE;
  	   }
      break;

      case IOCTL_POWER_SET :
   	   {
	        WCHAR		state[1024] = {0};
	        LPWSTR 	pState = &state[0];
	        DWORD		dwBufChars = (sizeof(state) / sizeof(state[0]));
	        DWORD		dwStateFlags = 0;
	        DWORD		dwErr;         			
   			
    	        CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE)pBufOut;
		RETAILMSG(1, (TEXT("CSR: IOCTL_POWER_SET NewDx=%d\r\n"), NewDx));

		dwErr = GetSystemPowerState(pState, dwBufChars, &dwStateFlags);
		if (ERROR_SUCCESS != dwErr) 
		{
			RETAILMSG(TRUE,(TEXT("CSR: GetSystemPowerState:ERROR:%d\r\n"), dwErr));
		} 
		else 
		{
			RETAILMSG(SC_DBG,(TEXT("CSR: System Power state is '%s', flags 0x%08x\r\n"), state, dwStateFlags));
		}
										 	    
    	       switch(NewDx)
               {
                  case D0:	//On, backlightOff, ScreenOff, Unattended
                  //case D1:	//None
                  //case D2:	//Resuming, UserIdle
                  //To-Do: Must check why is "resuming" state after suspend!!! 
                  RETAILMSG(SC_DBG,(TEXT("CSR: IOCTL_POWER_SET--D0\r\n")));
                      
	          BTEnable(TRUE);
	          if(ghLibInst)
	          {
	             if(gpfnCOM_PowerUp)
	             	pSkey.bBTPowerControl = gpfnCOM_PowerUp(pSkey.pSerialHead);
	          }
	          
	          RETAILMSG(SC_DBG,(TEXT("CSR: bBTPowerControl_gpfnCOM_PowerUp:%d\r\n"), pSkey.bBTPowerControl));
	          			
	          SetEvent(pSkey.PSKeyEvent);
		    							
                  break;
                  
                  default:	//D3: Suspend
                  		//D4:	ColdReboot, Reboot, ShutDown,  
                  RETAILMSG(SC_DBG,(TEXT("CSR: IOCTL_POWER_SET--D4\r\n")));
                  
	          
	          if(ghLibInst)
	          {
	          	if(gpfnCOM_PowerDown)
	          	   pSkey.bBTPowerControl = gpfnCOM_PowerDown(pSkey.pSerialHead);
	          }
	  
	          RETAILMSG(SC_DBG,(TEXT("CSR: bBTPowerControl_gpfnCOM_PowerDown:%d\r\n"), pSkey.bBTPowerControl));
                
                  break;
                }
   	    }
   	 
   	 bResult = TRUE;
      break;   

     default:
      RETAILMSG(SC_DBG,(TEXT("CSR: IOCTL Default\r\n")));
      if(ghLibInst)
      {
        if(gpfnCOM_IOControl)
        	bResult = gpfnCOM_IOControl(dwOpenData, dwCode, pBufIn, dwLenIn, pBufOut, dwLenOut, pdwActualOut);
      }       
     break;
  }
  RETAILMSG(SC_DBG,(TEXT("CSR: CSR_IOControl :leave:bResult:%d\r\n"), bResult));
  return bResult;
}

/////////////////////////////////////////////////////////////////////
// SerialGetDroppedByteNumber Wrapper
//
// The CSR implementation of this function is a simple passthrough
//
//SERIALCSR_API ULONG SerialGetDroppedByteNumber(HANDLE pHead)
ULONG SerialGetDroppedByteNumber(HANDLE pHead)
{
	ULONG lResult = NULL;

	if(ghLibInst)
	{
		if(gpfnSerialGetDroppedByteNumber)
			lResult = gpfnSerialGetDroppedByteNumber(pHead);
	}
	return lResult;
}

/////////////////////////////////////////////////////////////////////
// UpdatePersistentStore
//
// Sets DCB and updates persistent store on chip
//
// Check that this does not interfere with any previous DCB settings
//
BOOL UpdatePersistentStore(HANDLE hPort)
{
	BOOL               bRet                   = FALSE;
	BOOL               bRestoreSettings       = FALSE;
	DWORD*             dwLen                  = 0;
	DCB                dcbOrigConfig;
        COMMTIMEOUTS       ctoTimeouts;
	SERIAL_QUEUE_SIZE  sqsQueue;
	
        RETAILMSG(SC_DBG,(TEXT("UpdatePersistentStore:enter\r\n")));
	
 	// Store current DCB settings
	memset(&dcbOrigConfig, 0, sizeof (dcbOrigConfig));
	dcbOrigConfig.DCBlength     = sizeof(DCB); 
	bRestoreSettings = CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_GET_DCB, 0, 0, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), dwLen);

        // *** WARNING - IOCTL_SERIAL_GET_DCB fails with Widcomm bluetooth driver.  No fix completed as this is for MS + out of time

	// Setup DCB
	DCB dcbConfig;
	memset(&dcbConfig, 0, sizeof (dcbConfig));
	dcbConfig.DCBlength         = sizeof(DCB); 
	dcbConfig.BaudRate          = DEFAULTBAUD;
	dcbConfig.Parity            = EVENPARITY;        
	dcbConfig.ByteSize          = 8;                 
	dcbConfig.StopBits          = ONESTOPBIT;   
	if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (PBYTE)&dcbConfig, sizeof(dcbConfig), 0, 0, 0))
		return FALSE;

        // Setup the com port timeouts
	ctoTimeouts.ReadIntervalTimeout         = MAXDWORD;
	ctoTimeouts.ReadTotalTimeoutConstant    = 0;
	ctoTimeouts.ReadTotalTimeoutMultiplier  = 0;
	ctoTimeouts.WriteTotalTimeoutConstant   = 0;
	ctoTimeouts.WriteTotalTimeoutMultiplier = 0;
	if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_TIMEOUTS, (PBYTE)&ctoTimeouts, sizeof(ctoTimeouts), 0, 0, 0))
		return FALSE;

        // Queues
	sqsQueue.InSize  = 16;
	sqsQueue.OutSize = 16;
	if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_QUEUE_SIZE, (PBYTE)&sqsQueue, sizeof(sqsQueue), 0, 0, 0))
		return FALSE;

	// Call uBCSP update routine
	if(hPort)
		bRet = PSConfig(hPort);

	// Reapply stored settings
        if(bRestoreSettings)
		CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), 0, 0, 0);
        
        
        RETAILMSG(SC_DBG,(TEXT("UpdatePersistentStore:leave\r\n")));
	return bRet;
}



PVOID VirtualAllocCopyPhysical(unsigned size, char *str, PVOID pPhysicalAddress)
{
    	PVOID ptr;
    	unsigned offset;
 
    	offset = (unsigned)pPhysicalAddress & ALIGNMENT_MASK;
 
    	size +=offset ? PAGE_SIZE : 0;
    	ptr = VirtualAlloc(0, size, MEM_RESERVE, PAGE_NOACCESS);
 
    	if (ptr == NULL)
    	{
        	RETAILMSG(TRUE,(TEXT("VirtualAllocCopyPhysical failed! %s : size=0x%x,\r\n"),str,size));
        	return(0);
    	}
 
    	if (!VirtualCopy((PVOID)ptr, (PVOID)(((unsigned)pPhysicalAddress - offset) >> 8), size, PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
    	{
        	RETAILMSG(TRUE,(TEXT("VirtualCopyCopyPhysical failed! %s : addr=0x%x, offset=0x%x\r\n"),str,(unsigned)pPhysicalAddress,offset));
        	return(0);
    	}
    	return((PVOID)((PBYTE)ptr+offset));
}



static DWORD PSKeyUpdate(PPSKEY_UPDATE _pSkey)
{
	DWORD we;
	HANDLE hPort = NULL;
	
	RETAILMSG(SC_DBG, (TEXT("PSKeyUpdate:enter\r\n")));
	
	if (!_pSkey)
	{
	RETAILMSG(1, (TEXT("pskey invalid\r\n")));	
        return ERROR_INVALID_PARAMETER;
	}
	RETAILMSG(1, (TEXT("pskey valid\r\n")));
	while (1) 
	{
	     __try {
		  RETAILMSG(1, (TEXT("before PSKeyUpdate Start\r\n")));
	         we = WaitForSingleObject(_pSkey->PSKeyEvent, INFINITE);
	         RETAILMSG(1, (TEXT("PSKeyUpdate Start\r\n")));
              
		 // Update persistent store
		 if(ghSerialHead && gbUpdatePS)
		 {  
		 	//evan_note--->
		    if(gpfnCOM_Open)
		    {  
		    	// Reset update flag
		    	gbUpdatePS = FALSE;
		       
		    	// Get port handle
		    	hPort = gpfnCOM_Open(ghSerialHead, GENERIC_READ | GENERIC_WRITE, CREATE_NEW);
                 
			UpdatePersistentStore(hPort);
			
		    	gpfnCOM_Close((DWORD)hPort);
				
		    }
		    //<----
		 }
	   
	     } _except(EXCEPTION_EXECUTE_HANDLER) {
	         RETAILMSG(SC_DBG,(TEXT("!!! PSKey EXCEPTION: 0x%X !!!\r\n"), GetExceptionCode() ));
              RETAILMSG(1,(TEXT("!!! PSKey EXCEPTION:  !!!\r\n") ));
		 }
		RETAILMSG(1,(TEXT("!!! PSKey EXCEPTION:  !!!\r\n") ));
	}
	
}



BOOL SetTestModeCMD(HANDLE hPort)
{
	BOOL               bRet                   = FALSE;
	BOOL               bRestoreSettings       = FALSE;
	DWORD*             dwLen                  = 0;
	DCB                dcbOrigConfig;
        COMMTIMEOUTS       ctoTimeouts;
	SERIAL_QUEUE_SIZE  sqsQueue;
	
        RETAILMSG(SC_DBG,(TEXT("SetTestModeCMD Start\r\n")));
 	// Store current DCB settings
	memset(&dcbOrigConfig, 0, sizeof (dcbOrigConfig));
	dcbOrigConfig.DCBlength     = sizeof(DCB); 
	bRestoreSettings = CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_GET_DCB, 0, 0, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), dwLen);
  
        // *** WARNING - IOCTL_SERIAL_GET_DCB fails with Widcomm bluetooth driver.  No fix completed as this is for MS + out of time

	// Setup DCB
	DCB dcbConfig;
	memset(&dcbConfig, 0, sizeof (dcbConfig));
	dcbConfig.DCBlength         = sizeof(DCB); 
	dcbConfig.BaudRate          = DEFAULTBAUD;
	dcbConfig.Parity            = EVENPARITY;        
	dcbConfig.ByteSize          = 8;                 
	dcbConfig.StopBits          = ONESTOPBIT;   
	if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (PBYTE)&dcbConfig, sizeof(dcbConfig), 0, 0, 0))
		return FALSE;

        // Setup the com port timeouts
	ctoTimeouts.ReadIntervalTimeout         = MAXDWORD;
	ctoTimeouts.ReadTotalTimeoutConstant    = 0;
	ctoTimeouts.ReadTotalTimeoutMultiplier  = 0;
	ctoTimeouts.WriteTotalTimeoutConstant   = 0;
	ctoTimeouts.WriteTotalTimeoutMultiplier = 0;
	if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_TIMEOUTS, (PBYTE)&ctoTimeouts, sizeof(ctoTimeouts), 0, 0, 0))
		return FALSE;

        // Queues
	sqsQueue.InSize  = 16;
	sqsQueue.OutSize = 16;
	if(!CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_QUEUE_SIZE, (PBYTE)&sqsQueue, sizeof(sqsQueue), 0, 0, 0))
		return FALSE;

	
	//Jonathan_test start
	if(hPort)
		bRet = TESTMode(hPort);
	//Jonathan_test end

	// Reapply stored settings
        if(bRestoreSettings)
		CSR_IOControl((DWORD)hPort, IOCTL_SERIAL_SET_DCB, (unsigned char*)&dcbOrigConfig, sizeof(dcbOrigConfig), 0, 0, 0);
        
        
        RETAILMSG(1,(TEXT("SetTestModeCMD Finish\r\n")));
	return bRet;
}

BOOL BTEnable(BOOL bIsOn)
{
    if (bIsOn)
    {
    //b	s2440IOP->GPCDAT &= ~(0x1<<9); 	 //Set GPC9/BT_PWR_EN as 0 for pown on
    //b 	s2440IOP->GPCDN |= (0x1<<9);    //the pull up function is disabled
     //b    s2440IOP->GPCCON &= ~(0x3<<18);
      //b   s2440IOP->GPCCON |=  (0x1<<18);  //Set Output
        s2440IOP->GPBDAT &= ~(0x1<<2); 	 //Set GPB2 as 0 for pown on,LOW ENABLE
   	 s2440IOP->GPBDN |= (0x1<<2);    //the pull up function is disabled
        s2440IOP->GPBCON &= ~(0x3<<4);
        s2440IOP->GPBCON |=  (0x1<<4);  //Set Output
        //Sleep(50); 
        
      //b   s2440IOP->GPGDAT |= (0x1<<5);	//Set GPG5/BT_RESET as 1 for reset BT
       //b  s2440IOP->GPGDN |= (0x1<<5);
      //b   s2440IOP->GPGCON &= ~(0x3<<10);
     //b    s2440IOP->GPGCON |= (0x1<<10);
          
      	  s2440IOP->GPDDAT |= (0x1<<0);	//Set GPD0/BT_RESET as 1 for reset BT
         s2440IOP->GPDDN |= (0x1<<0);
         s2440IOP->GPDCON &= ~(0x3<<0);
         s2440IOP->GPDCON |= (0x1<<0);
      	 Sleep(100);    
     
       	gbBTPower = TRUE;
       	
       	ShowIOPort();
       
    }
    else
    {
    	s2440IOP->GPCDAT &= ~(0x1<<9);
    	s2440IOP->GPCDN |= (0x1<<9);
        s2440IOP->GPCCON &= ~(0x3<<18);
        s2440IOP->GPCCON |=  (0x1<<18);
        
      
        s2440IOP->GPGDAT &= ~(0x1<<5);
        s2440IOP->GPGDN |= (0x1<<5);
        s2440IOP->GPGCON &= ~(0x3<<10);
        s2440IOP->GPGCON |= (0x1<<10);
        
        gbBTPower = FALSE;
        
        ShowIOPort();
        Sleep(100);  
	
    }
	return TRUE;
}

void ShowIOPort(void)
{
	RETAILMSG(SC_DBG,(TEXT("gbBTPower=%x\r\n"),gbBTPower));
	RETAILMSG(SC_DBG,(TEXT("gpBdat=%x \r\n"),s2440IOP->GPBDAT));
	RETAILMSG(SC_DBG,(TEXT("gpBup=%x \r\n"),s2440IOP->GPBDN));
	RETAILMSG(SC_DBG,(TEXT("gpBcon=%x \r\n"),s2440IOP->GPBCON));
	

	RETAILMSG(SC_DBG,(TEXT("gpDdat=%x \r\n"),s2440IOP->GPDDAT));
	RETAILMSG(SC_DBG,(TEXT("gpDup=%x \r\n"),s2440IOP->GPDDN));
	RETAILMSG(SC_DBG,(TEXT("gpDcon=%x \r\n"),s2440IOP->GPDCON));
}

⌨️ 快捷键说明

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