📄 ch7024.cpp
字号:
返 回 值:成功返回 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 + -