283 lines
6.2 KiB
C
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
|