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

📄 ch7024.cpp

📁 基于AU1200平台的TVOUT芯片CH7024芯片的驱动
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -