windows-nt/Source/XPSP1/NT/drivers/video/ms/ati/mini/ddc50.c
2020-09-26 16:20:57 +08:00

283 lines
6.2 KiB
C

//
// Module: DDC50.C
// Date: Jun 29, 1997
//
// Copyright (c) 1997 by ATI Technologies Inc.
//
/********************** PolyTron RCS Utilities
$Revision: 1.1 $
$Date: 30 Jun 1997 11:36:28 $
$Author: MACIESOW $
$Log: V:\source\wnt\ms11\miniport\archive\ddc50.c_v $
*
* Rev 1.1 30 Jun 1997 11:36:28 MACIESOW
* Initial revision.
End of PolyTron RCS section *****************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <math.h>
#include "dderror.h"
#include "miniport.h"
#include "ntddvdeo.h"
#include "video.h" /* for VP_STATUS definition */
#include "stdtyp.h"
#include "amachcx.h"
#include "amach1.h"
#include "atimp.h"
#include "atint.h"
#include "cvtvdif.h"
#include "cvtvga.h"
#include "dynainit.h"
#include "dynatime.h"
#include "services.h"
#include "vdptocrt.h"
#define INCLUDE_CVTDDC
#include "cvtddc.h"
#if (TARGET_BUILD >= 500)
VOID WriteClockLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData);
VOID WriteDataLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData);
BOOLEAN ReadClockLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension);
BOOLEAN ReadDataLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension);
VOID WaitForVsyncActiveDAC(PHW_DEVICE_EXTENSION HwDeviceExtension);
VOID WriteClockLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData);
VOID WriteDataLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData);
BOOLEAN ReadClockLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension);
BOOLEAN ReadDataLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension);
VOID WaitForVsyncActiveGP(PHW_DEVICE_EXTENSION HwDeviceExtension);
/****************************************************************
; DDC register
;
; High Byte, High Word
;
; ... 5 4 3 2 1 0 SCW = CLK Write
; --------|---|---|---|---|---|---| SDW = DATA Write
; ...|SCW|SDW| |SCR|SDR| | SCR = CLK Read
; --------------------------------- SDR = DATA Read
;
;****************************************************************/
VOID WriteClockLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData)
{
UCHAR Scratch;
//
// Value is inverted.
//
ucData = (ucData + 1) & 0x01;
//
// Write to the SCL line.
//
Scratch = (INP_HBHW(DAC_CNTL) & 0xE8) | (ucData << 5);
OUTP_HBHW(DAC_CNTL, Scratch);
}
VOID WriteDataLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData)
{
UCHAR Scratch;
//
// Value is inverted.
//
ucData = (ucData + 1) & 0x01;
//
// Write to the SDA line.
//
Scratch = (INP_HBHW(DAC_CNTL) & 0xD8) | (ucData << 4);
OUTP_HBHW(DAC_CNTL, Scratch);
}
BOOLEAN ReadClockLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension)
{
return ((INP_HBHW(DAC_CNTL) & 0x04) >> 2);
}
BOOLEAN ReadDataLineDAC(PHW_DEVICE_EXTENSION phwDeviceExtension)
{
return ((INP_HBHW(DAC_CNTL) & 0x02) >> 1);
}
VOID WaitForVsyncActiveDAC(PHW_DEVICE_EXTENSION HwDeviceExtension)
{
//
// BUGBUG
//
delay(30);
}
/****************************************************************
; DDC register
;
; High Byte, Low Word
;
; ... 5 4 3 2 1 0
; --------|---|---|---|---|---|---|
; ...|SCR|SDR| | | | | SCR = CLK Read
; --------------------------------- SDR = DATA Read
;
; High Byte, High Word
;
; ... 5 4 3 2 1 0 SCW = CLK Write
; --------|---|---|---|---|---|---| SDW = DATA Write
; ...|SCW|SDW| | | | |
; ---------------------------------
;
;****************************************************************/
VOID WriteClockLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData)
{
UCHAR Scratch;
//
// Value is inverted.
//
ucData = (ucData + 1) & 0x01;
//
// Write to the SCL line.
//
Scratch = (INP_HBHW(GP_IO) & 0xDF) | (ucData << 5);
OUTP_HBHW(GP_IO, Scratch);
}
VOID WriteDataLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension, UCHAR ucData)
{
UCHAR Scratch;
//
// Value is inverted.
//
ucData = (ucData + 1) & 0x01;
//
// Write to the SDA line.
//
Scratch = (INP_HBHW(GP_IO) & 0xEF) | (ucData << 4);
OUTP_HBHW(GP_IO, Scratch);
}
BOOLEAN ReadClockLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension)
{
return ((INP_HBLW(GP_IO) & 0x20) >> 5);
}
BOOLEAN ReadDataLineGP(PHW_DEVICE_EXTENSION phwDeviceExtension)
{
return ((INP_HBLW(GP_IO) & 0x10) >> 4);
}
VOID WaitForVsyncActiveGP(PHW_DEVICE_EXTENSION HwDeviceExtension)
{
//
// BUGBUG
//
delay(30);
}
BOOLEAN
DDC2Query50(
PHW_DEVICE_EXTENSION phwDeviceExtension,
PUCHAR QueryBuffer,
ULONG BufferSize)
//
// DESCRIPTION:
// Reads the basic EDID structure from the monitor using DDC2.
//
// PARAMETERS:
// phwDeviceExtension Points to per-adapter device extension.
// QueryBuffer Buffer where information will be stored.
// BufferSize Size of the buffer to fill.
//
// RETURN VALUE:
// Whether the call succeeded or not.
//
{
struct query_structure * Query;
I2C_FNC_TABLE i2c;
ULONG Checksum;
ULONG i;
//
// Get a formatted pointer into the query section of HW_DEVICE_EXTENSION.
//
Query = (struct query_structure *)phwDeviceExtension->CardInfo;
//
// Determine which class of hardware we are dealing with, since
// different cards use different registers to control the SCL
// and SDA lines. Don't worry about cards which don't support
// DDC2, since the check for DDC support will have rejected
// any of these cards so we won't reach this point in the code.
//
{
i2c.WriteClockLine = WriteClockLineDAC;
i2c.WriteDataLine = WriteDataLineDAC;
i2c.ReadClockLine = ReadClockLineDAC;
i2c.ReadDataLine = ReadDataLineDAC;
i2c.WaitVsync = WaitForVsyncActiveDAC;
VideoDebugPrint((DEBUG_NORMAL, "DAC DDC control"));
}
i2c.Size = sizeof(I2C_FNC_TABLE);
if (!VideoPortDDCMonitorHelper(phwDeviceExtension,
&i2c,
QueryBuffer,
BufferSize))
{
VideoDebugPrint((DEBUG_NORMAL, "DDC Query Failed\n"));
return FALSE;
}
return TRUE;
}
#endif