📄 ch7024.cpp
字号:
// This is a Sample Driver
#include <windows.h>
#include <CEDDK.h>
#include <nkintr.h>
#include <platform.h>
#include <bceddk.h>
#include "ldrarg.h"
#include "CH7024.h"
#include "argon.h"
//
// Structure for storing device instance data. There is one of these per
// instance of a device. We could have 2 devices in the system, in which case
// there would be two of these structures.
//
typedef struct _DEVICE_INSTANCE {
ULONG SysIntr;
HANDLE hSmbus;
HANDLE hIsrEvent;
HANDLE hCvbsThread;
HANDLE hCh7024Ready;
} DEVICE_INSTANCE, *PDEVICE_INSTANCE;
#pragma pack(1)
typedef struct {
UCHAR Address;
UCHAR Register;
ULONG DataSize;
UCHAR Data[1];
} SMBUS_TRANSFER;
#pragma pack()
//
// IOCTLS used to access the driver
//
enum {
IOCTL_SMBUS_FMRCV_INIT = 0x80012000, // some arbirary base
IOCTL_SMBUS_FMRCV_DEINIT,
IOCTL_SMBUS_READDATA, // some arbirary base
IOCTL_SMBUS_WRITEDATA
};
UCHAR ch7024Regs[][64][2] = {
{ // 480*272 master total 487*322 9.4MHz (V 4, 2, 1) (H 45, 2, 3)
{0x04, 0x0c}, // 1 Set FPD=0 to power up CH7024, power dowm DAC0, DAC1
{0x0A, 0x10}, // 2 Set TV_BP=1
{0x0B, 0x03}, // 4 Set crystal 12MHz
{0x0C, 0x00}, // DUCVBS singal CVBS
{0x0D, 0x00}, // 9 set input data format RGB 565
{0x0E, 0x80}, // 10 set sync control bits,DES,VPO,HPO,SYO, Set POUTEN to select clock master/slave, we are slave
{0x0F, 0x00}, // 5 set XCH=0
{0x11, 0x80}, // 11 set input timing achieving method,HVAUTO = 1, by this way the graphic controller only needs to send H sync V sync
{0x1C, 0x90}, // 7 ACIV, select sub-carrier generation, DOTCRB(bit0) enables TV Dot Crawl reduction when set to '1'
{0x24, 0x03}, // A
{0x25, 0x22},
{0x26, 0x22},
{0x27, 0x22},
{0x28, 0x0f}, // P
{0x29, 0x67},
{0x2A, 0xa0},
{0x2B, 0x1b}, // N
{0x2C, 0x7e},
{0x2D, 0x48},
{0x2E, 0x2c}, // T
{0x2F, 0x0a}, // PLL
{0x30, 0x12},
{0x31, 0x13},
{0x34, 0x01}, // SCFREQ
{0x35, 0x31},
{0x36, 0x74},
{0x37, 0xae},
{0x63, 0xc0}, // 5 double termination(both 75ohm on PCB and TV side)
{0x21, 0x81}, // VP bit[9:2]
{0x20, 0x03}, // VP bit[1:0] adjust moved 7 pixels upward
{0x06, 0x20}, // saturation
{0x23, 0x7a}, // HP bit[9:2] moved 8 pixels left
{0x22, 0x00}, // HP bit[1:0]
{0x06, 0x1b}, // saturation
{0x08, 0x6d}, // brightness
{0x1E, 0x04}, // horizontal scaling bit[10:8]
{0x1F, 0xFE}, // horizontal scaling bit[7:0]
{0x04, 0x08}, // power up DAC0
{0xFF, 0x00}, // Over flag
},
{ //640*480 master total 705*568 24MHz P-clock
{0x04, 0x0c}, // 1 Set FPD=0 to power up CH7024, power dowm DAC0, DAC1
{0x0A, 0x10}, // 2 Set TV_BP=1
{0x0B, 0x03}, // 4 Set crystal 12MHz
{0x0C, 0x00}, // DUCVBS singal CVBS
{0x0D, 0x00}, // 9 set input data format RGB 565
{0x0E, 0x80}, // 10 set sync control bits,DES,VPO,HPO,SYO, Set POUTEN to select clock master/slave, we are slave
{0x0F, 0x00}, // 5 set XCH=0
{0x1C, 0x90}, // 7 ACIV, select sub-carrier generation
{0x24, 0x04}, // A
{0x25, 0x00},
{0x26, 0x00},
{0x27, 0x00},
{0x28, 0x31}, // P
{0x29, 0x30},
{0x2A, 0x80},
{0x2B, 0x36}, // N
{0x2C, 0xfc},
{0x2D, 0x90},
{0x2E, 0x38}, // T
{0x2F, 0x02}, // PLL
{0x30, 0x1b},
{0x31, 0x12},
{0x34, 0x01}, // SCFREQ
{0x35, 0x31},
{0x36, 0x74},
{0x37, 0xae},
{0x63, 0xc0}, // 5 double termination(both 75ohm on PCB and TV side)
{0x11, 0x80}, // 11 set input timing achieving method,HVAUTO = 1, by this way the graphic controller only needs to send H sync V sync
{0x21, 0x7F}, // VP bit[9:2]
{0x20, 0x00}, // VP bit[1:0] adjust moved 7 pixels downward
{0x06, 0x20}, // saturation
{0x23, 0x7a}, // HP bit[9:2] moved 8 pixels left
{0x22, 0x00}, // HP bit[1:0]
{0x06, 0x1b}, // saturation
{0x08, 0x6d}, // brightness
{0x1E, 0x04}, // horizontal scaling bit[10:8]
{0x1F, 0xFE}, // horizontal scaling bit[7:0]
{0x04, 0x08}, // power up DAC0
{0xFF, 0x00}, // Over flag
},
};
/*-----------------------------------------------------------------------------
功 能:让CH7024进入power off 状态
参数说明:
返 回 值:成功返回 表的位置
反之 0xff
说 明:JOIN (注释)
------------------------------------------------------------------------------*/
static BOOL PoweOffCH7024(PDEVICE_INSTANCE pDeviceInst, BOOL bPoweDown, UCHAR pwrState)
{
BOOL bRel = TRUE;
ULONG size = 10;
ULONG Tmp = 0 ;
LONG valueOut = 0;
SMBUS_TRANSFER* pValueIn = NULL;
HANDLE hSmb = pDeviceInst->hSmbus;
UCHAR initState;
RETAILMSG(1, (TEXT("--TVO:PoweOffCH7024 aaaa\r\n")));
pValueIn = (SMBUS_TRANSFER*) malloc(size);
memset(pValueIn, 0, sizeof(*pValueIn));
RETAILMSG(1, (TEXT("--TVO:PoweOffCH7024 bbbb\r\n")));
pValueIn->Address = 0x76;
pValueIn->Register = 0x04;
pValueIn->Data[0] = 0x00;
pValueIn->DataSize = 1;
RETAILMSG(1, (TEXT("--TVO:PoweOffCH7024 cccc\r\n")));
bRel = DeviceIoControl(hSmb, IOCTL_SMBUS_READDATA, (PUCHAR)pValueIn, size, &initState, sizeof(initState), &Tmp, NULL);
RETAILMSG(1, (TEXT("--TVO:PoweOffCH7024 dddd\r\n")));
if(!bRel) { // 如果读失败再试一次
bRel = DeviceIoControl(hSmb, IOCTL_SMBUS_READDATA, (PUCHAR)pValueIn, size, &initState, sizeof(initState), &Tmp, NULL);
}
RETAILMSG(1, (TEXT("--TVO:PoweOffCH7024 eeee\r\n")));
if(bPoweDown) {
// Set FPD = 0 bit[0] to power up ch7024
pValueIn->Address = 0x76;
pValueIn->Register = 0x04;
pValueIn->Data[0] = (pwrState | initState); // power down ch7024 ,DAC0 and DAC1
pValueIn->DataSize = 1;
bRel = DeviceIoControl(hSmb,
IOCTL_SMBUS_WRITEDATA,
(PUCHAR)pValueIn,
size,
&valueOut,
sizeof(valueOut),
&Tmp,
NULL);
}
else {
pValueIn->Address = 0x76;
pValueIn->Register = 0x04;
pValueIn->Data[0] = (~pwrState & initState); // power up ch7024 and DAC0
pValueIn->DataSize = 1;
bRel = DeviceIoControl(hSmb,
IOCTL_SMBUS_WRITEDATA,
(PUCHAR)pValueIn,
size,
&valueOut,
sizeof(valueOut),
&Tmp,
NULL);
}
if(pValueIn) {
free(pValueIn);
}
RETAILMSG(1, (TEXT("--TVO:PoweOffCH7024\r\n")));
return bRel;
}
/*-----------------------------------------------------------------------------
功 能:取当前显示驱动的参数在ch7024Regs表的位置
参数说明:
返 回 值:成功返回 表的位置
反之 0xff
说 明:JOIN (注释)
------------------------------------------------------------------------------*/
static UCHAR GetCH7024RegsPos(void)
{
BOOT_ARGS *pBootArgs = (BOOT_ARGS*)(BOOT_ARG_PTR + KSEG1_OFFSET);
UCHAR panelNum = pBootArgs->lcdArg[1].panelNum; // Current panel setlect;
UCHAR item = 0xff;
if(panelNum == 0x0d) {
item = 0;
}
else if(panelNum == 0x0f) {
item = 1;
}
else {
item = 0xff;
}
return item;
}
/*-----------------------------------------------------------------------------
功 能:检查CVBS输出线是否插入CVBS输出口
参数说明:
返 回 值:成功返回 OK
反之 NO
说 明:JOIN (注释)
------------------------------------------------------------------------------*/
static BOOL IsInsertCVBS(PDEVICE_INSTANCE pDeviceInst, UCHAR item)
{
#if 0
LONG valueOut = 0;
ULONG Tmp = 0 ;
ULONG size = 10;
SMBUS_TRANSFER* pValueIn = NULL;
HANDLE hSmb = pDeviceInst->hSmbus;
BOOL RetVal = FALSE;
pValueIn = (SMBUS_TRANSFER*) malloc(size);
memset(pValueIn, 0, sizeof(*pValueIn));
/*pValueIn->Address = 0x76;
pValueIn->Register = 0x04;
pValueIn->Data[0] = 0x00; // Set FPD = 0 bit[0] to power up ch7024
pValueIn->DataSize = 1;
RetVal = DeviceIoControl(hSmb,
IOCTL_SMBUS_WRITEDATA,
(PUCHAR)pValueIn,
size,
&valueOut,
sizeof(valueOut),
&Tmp,
NULL);*/
pValueIn->Address = 0x76;
pValueIn->Register = 0x63;
pValueIn->Data[0] = 0x02; // Set Single termination(no 75ohm On PCB) bit[1]
pValueIn->DataSize = 1;
RetVal = DeviceIoControl(hSmb,
IOCTL_SMBUS_WRITEDATA,
(PUCHAR)pValueIn,
size,
&valueOut,
sizeof(valueOut),
&Tmp,
NULL);
pValueIn->Address = 0x76;
pValueIn->Register = 0x62;
pValueIn->Data[0] = 0x80; // Set SESEEN to 1 bit[7]
pValueIn->DataSize = 1;
RetVal = DeviceIoControl(hSmb,
IOCTL_SMBUS_WRITEDATA,
(PUCHAR)pValueIn,
size,
&valueOut,
sizeof(valueOut),
&Tmp,
NULL);
pValueIn->Address = 0x76;
pValueIn->Register = 0x7E;
pValueIn->Data[0] = 0x00;
pValueIn->DataSize = 1;
RetVal = DeviceIoControl(hSmb,
IOCTL_SMBUS_READDATA,
(PUCHAR)pValueIn,
size,
&valueOut,
sizeof(valueOut),
&Tmp,
NULL);
RETAILMSG(1,(TEXT("IsInsertCVBS:7024 reg 0x7E = 0x%x\r\n"), valueOut));
free(pValueIn);
if( ((UCHAR)valueOut & 0x03) == 0x01) { //single composite output is connected
return TRUE;
}
else {
return FALSE;
}
#endif
return TRUE;
}
/*-----------------------------------------------------------------------------
功 能:通过Smbus总线配置7024
参数说明:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -