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

📄 ch7024.cpp

📁 基于AU1200平台的TVOUT芯片CH7024芯片的驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:

    
  返 回 值:成功返回 OK 
            反之     NO

      
  说    明:JOIN (注释)         
			
		  
------------------------------------------------------------------------------*/
static BOOL Configure7024(PDEVICE_INSTANCE pDeviceInst, UCHAR item)
{
    LONG valueOut = 0;
	ULONG Tmp = 0 ;
	ULONG size = 10;
	SMBUS_TRANSFER* pValueIn = NULL;
    HANDLE hSmb = pDeviceInst->hSmbus;
	BOOL RetVal;
	ULONG i;
	

	pValueIn = (SMBUS_TRANSFER*) malloc(size);
	memset(pValueIn, 0, sizeof(*pValueIn));

	for (i = 0; ch7024Regs[item][i][0] != 0xFF ; i++ ) {
        pValueIn->Address = 0x76;
		pValueIn->Register = ch7024Regs[item][i][0];
		pValueIn->Data[0] = ch7024Regs[item][i][1];
		pValueIn->DataSize = 1;
		RetVal = DeviceIoControl(hSmb,
						        IOCTL_SMBUS_WRITEDATA,
						        (PUCHAR)pValueIn,
						        size,
						        &valueOut,
						        sizeof(valueOut),
						        &Tmp,
						        NULL);
        if(RetVal) {
		    //RETAILMSG(1,(TEXT("CvbsThread:write 0 is OK\r\n")));
		}
		else {
		    RETAILMSG(1,(TEXT("TVO:CvbsThread:0 is failed\r\n")));
		}
	}// for

	free(pValueIn);

	return RetVal;
}

/*-----------------------------------------------------------------------------

  功    能:
  
  参数说明:

    
  返 回 值:成功返回 OK 
            反之     NO

      
  说    明:JOIN (注释)         
			
		  
------------------------------------------------------------------------------*/
DWORD CvbsThread(PVOID pParam)
{
	ULONG size = 10;
	SMBUS_TRANSFER* pValueIn = NULL;
	BOOL RetVal = 0;
	PDEVICE_INSTANCE pDeviceInstance = (PDEVICE_INSTANCE)pParam;
	HANDLE hSmb = pDeviceInstance->hSmbus;
	UCHAR item;
	static BOOL isConfig = FALSE;
	BOOL isInsert;
	static BOOL isOldInsert;

	CeSetThreadPriority(GetCurrentThread(), 104);
	pValueIn = (SMBUS_TRANSFER*) malloc(size);
	memset(pValueIn, 0, sizeof(*pValueIn));

	//RetVal = DeviceIoControl(hSmb, IOCTL_SMBUS_FMRCV_INIT, (PUCHAR)pValueIn, NULL, NULL, NULL, NULL, NULL);
	
    free(pValueIn);
	
	item = GetCH7024RegsPos();
	if( item != 0xff) {
		while(1) {
			if(!isConfig) {
	            Configure7024(pDeviceInstance, item);
				isConfig = TRUE;
				SetEvent(pDeviceInstance->hCh7024Ready);
				isOldInsert = TRUE;
			}
			isInsert = IsInsertCVBS(pDeviceInstance, item);  //这里还是没办法检查到CVBS的插入,以后再实现它
			if(isInsert && !isOldInsert){
                 PoweOffCH7024(pDeviceInstance, FALSE, DAC0_BIT);  // power on DAC0
                 RETAILMSG(1,(TEXT("TVO:CvbsThread power on DAC0 \r\n")));  
				 isOldInsert = TRUE;
			}
			else if(!isInsert && isOldInsert){
                 PoweOffCH7024(pDeviceInstance, TRUE, DAC0_BIT);   // power off DAC0
                 RETAILMSG(1,(TEXT("TVO:CvbsThread power off DAC0 \r\n")));  
				 isOldInsert = FALSE;
			}
		    Sleep(10000000);  // check after 1s
		}
	}
	else {
        RETAILMSG(1,(TEXT("TVO:Curren panelNum don't output CVBS \r\n")));  
		// 让ch7024进入省电状态
		PoweOffCH7024(pDeviceInstance, TRUE, (GROBAL_POWER_BIT | DAC0_BIT | DAC1_BIT));  // power off ch7024, DAC0 and DAC1
	}
		
    RETAILMSG(1,(TEXT("TVO:Exit CvbsThread ! \r\n")));
    return TRUE ;

}

/*-----------------------------------------------------------------------------

  功    能:DLL入口函数
  
  参数说明:hModule					模块句柄
            ul_reason_for_call      调用方式
            lpReserved              预留参数
    
  返 回 值:返回 TRUE           
      
  说    明:join (注释) 2006-03-03           

		
		  
------------------------------------------------------------------------------*/
BOOL WINAPI TVO_DllEntry(HANDLE  hInstDll,
						  DWORD   dwReason,
						  LPVOID  lpvReserved)
{

    SYSTEMTIME  systime ;
    systime.wDay= 16 ;
    systime.wDayOfWeek=2;
    systime.wMonth=1;
    systime.wYear=2007;

    switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
		SetSystemTime(&systime);
		RETAILMSG(1, (TEXT("TVO_DllEntry - DLL_PROCESS_ATTACH\r\n")));
        break;
		
    case DLL_PROCESS_DETACH:
		RETAILMSG(1, (TEXT("TVO_DllEntry - DLL_PROCESS_DETACH\r\n")));
        break;
		
    default:
        break;
    }
	return TRUE;
}

/*-----------------------------------------------------------------------------

  功    能
  
  参数说明:
            
    
  返 回 值:返回 TRUE           
      
  说    明:join (注释) 2006-03-3            
		
		  
------------------------------------------------------------------------------*/
BOOL TVO_Deinit( DWORD hDeviceContext )
{
	PDEVICE_INSTANCE pDeviceInstance;
	pDeviceInstance = (PDEVICE_INSTANCE)hDeviceContext;
	
	//
    // Finally, the device instance itself can be freed.
    //
    if(pDeviceInstance) {
		if(pDeviceInstance->hSmbus) {
			CloseHandle(pDeviceInstance->hSmbus);
		}
        LocalFree(pDeviceInstance);
    }

    DEBUGMSG(ZONE_INIT, (TEXT("TVO_Deinit: returning TRUE.\r\n")));

    return TRUE;
}


/*-----------------------------------------------------------------------------

  功    能:
  
  参数说明:
            
    
  返 回 值:返回 TRUE           
      
  说    明:join (注释) 2006-03-3            
		
		  
------------------------------------------------------------------------------*/
DWORD TVO_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{
   PDEVICE_INSTANCE pDeviceInstance = NULL;
   BOOLEAN bRoutineSuccess = TRUE;
   CPLD * pCpld = (CPLD *)CPLD_KSEG1_ADDR; 

    //
    // Allocate a structure to hold the state for this instance.  This value
    // is used as a handle and is returned by this routine.  When SPI_Open or
    // SPI_Close is called, this handle will be passed in as a parameter.
    //
    pDeviceInstance = (PDEVICE_INSTANCE)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, sizeof(*pDeviceInstance));

    if (pDeviceInstance == NULL) {
        DEBUGMSG(ZONE_INIT, (TEXT("TVO_Init: Failed to allocate device instance.\r\n")));
		bRoutineSuccess = FALSE;
        goto ErrorReturn;
    }
	memset(pDeviceInstance, 0, sizeof(*pDeviceInstance));

	//Reset CH7024
	pCpld->ioBClr = CP_BIO_CH7024_RST_01;
	StallExecution(50); // wait 50us
	pCpld->ioBSet = CP_BIO_CH7024_RST_01;

	//creat a event synchronize lcd driver
	pDeviceInstance->hCh7024Ready = CreateEvent(NULL, FALSE, FALSE , CH7024_READY);  //not signalled
   
	pDeviceInstance->hSmbus = CreateFile(TEXT("SMB1:"), 0, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if( pDeviceInstance->hSmbus==INVALID_HANDLE_VALUE ) {
		RETAILMSG(1, (_T("TVO_Init:CreateFile(SMB1) GetLastError %d\r\n"), GetLastError()));
		bRoutineSuccess = FALSE;	
		goto ErrorReturn;
	}
	else{
        RETAILMSG(1, (TEXT("TVO_Init:CreateFile(SMB1) OK!!\r\n")));
	}
				
	pDeviceInstance->hCvbsThread = CreateThread(NULL, 0, CvbsThread, (PVOID)pDeviceInstance, 0, NULL);
	if( !pDeviceInstance->hCvbsThread ){
		RETAILMSG(1,(TEXT("TVO_Init:CreateThread(CvbsThread) failure!\r\n")));
		bRoutineSuccess = FALSE; 
		goto ErrorReturn;
	}
	CloseHandle(pDeviceInstance->hCvbsThread);

ErrorReturn:
    //
    // If the initialization failed, clean up and return a NULL to signal
    // failure.
    //
    if (bRoutineSuccess == FALSE) {

        TVO_Deinit((ULONG)pDeviceInstance);
        pDeviceInstance = NULL;
    }
	
   return (ULONG)pDeviceInstance;
}


/*-----------------------------------------------------------------------------

  功    能: 设备打开函数
  
  参数说明:
            
    
  返 回 值:返回 TRUE           
      
  说    明:join (注释) 2006-03-3            
		
		  
------------------------------------------------------------------------------*/

DWORD TVO_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode )
{
    return (1);
}

BOOL TVO_Close( DWORD hOpenContext )
{
    return (TRUE);
}
BOOL TVO_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut )
{
  return TRUE;
}
BOOL TVO_PowerUp( DWORD hDeviceContext )
{
   PDEVICE_INSTANCE pDeviceInstance = (PDEVICE_INSTANCE)hDeviceContext;
   UCHAR item;
   SMBUS_TRANSFER* pValueIn = NULL;
   HANDLE hSmb = pDeviceInstance->hSmbus;

   RETAILMSG(1, (TEXT("+TVO_PowerUp\r\n")));

   //不明白为什么一定要再初始化,因为ch7024没有被复位,但是这个动作不做不行
   item = GetCH7024RegsPos();
   if( item != 0xff) {
       //Configure7024(pDeviceInstance, item);
       PoweOffCH7024(pDeviceInstance, FALSE, (GROBAL_POWER_BIT | DAC0_BIT) );  // power on ch7024 and DAC0
   }

   RETAILMSG(1, (TEXT("-TVO_PowerUp\r\n")));
  
   return (TRUE);
}

BOOL TVO_PowerDown( DWORD hDeviceContext )
{
     PDEVICE_INSTANCE pDeviceInstance = (PDEVICE_INSTANCE)hDeviceContext;
	 
     RETAILMSG(1, (TEXT("TVO_PowerDown\r\n")));
     // 不管显示是否用到CH7024,一定要让CH7024 to sleep
	 //PoweOffCH7024(pDeviceInstance, TRUE, (GROBAL_POWER_BIT | DAC0_BIT | DAC1_BIT));  // power off ch7024 , DAC0 and DAC1

	 return (TRUE);
}

DWORD TVO_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
  return 1 ;
  
}

DWORD TVO_Write( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count )
{
   return 1;
}

DWORD TVO_Seek( DWORD hOpenContext, long Amount, WORD Type )
{
   return 1;
   
}


⌨️ 快捷键说明

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