vb_i2c.c revision dfe64dd3
1dfe64dd3Smacallan/* Jong 03/12/2009; added for supporting Xorg 7.0 */ 2dfe64dd3Smacallan#ifdef HAVE_CONFIG_H 3dfe64dd3Smacallan#include "config.h" 4dfe64dd3Smacallan#endif 5dfe64dd3Smacallan 6dfe64dd3Smacallan#include "osdef.h" 7dfe64dd3Smacallan#include "vgatypes.h" 8dfe64dd3Smacallan/* #include "vb_util.h" */ /* Jong@08032009 */ 9dfe64dd3Smacallan#include "vb_def.h" 10dfe64dd3Smacallan 11dfe64dd3Smacallan#ifdef WIN2000 12dfe64dd3Smacallan#include <dderror.h> 13dfe64dd3Smacallan#include <devioctl.h> 14dfe64dd3Smacallan#include <miniport.h> 15dfe64dd3Smacallan#include <ntddvdeo.h> 16dfe64dd3Smacallan#include <video.h> 17dfe64dd3Smacallan#include "xgiv.h" 18dfe64dd3Smacallan#include "dd_i2c.h" 19dfe64dd3Smacallan#include "tools.h" 20dfe64dd3Smacallan#endif /* WIN2000 */ 21dfe64dd3Smacallan 22dfe64dd3Smacallan#ifdef LINUX_XF86 23dfe64dd3Smacallan#include "xf86.h" 24dfe64dd3Smacallan#include "xf86PciInfo.h" 25dfe64dd3Smacallan#include "xgi.h" 26dfe64dd3Smacallan#include "xgi_regs.h" 27dfe64dd3Smacallan#include "vb_i2c.h" 28dfe64dd3Smacallan#endif 29dfe64dd3Smacallan 30dfe64dd3Smacallan#ifdef LINUX_KERNEL 31dfe64dd3Smacallan#include <linux/version.h> 32dfe64dd3Smacallan#include <asm/io.h> 33dfe64dd3Smacallan#include <linux/types.h> 34dfe64dd3Smacallan#include "vb_i2c.h" 35dfe64dd3Smacallan 36dfe64dd3Smacallan/* Jong@08052009 */ 37dfe64dd3Smacallan/* #include <linux/delay.h> */ /* udelay */ 38dfe64dd3Smacallan 39dfe64dd3Smacallan#include "XGIfb.h" 40dfe64dd3Smacallan 41dfe64dd3Smacallan#endif 42dfe64dd3Smacallan 43dfe64dd3Smacallan 44dfe64dd3Smacallan 45dfe64dd3Smacallan/*char I2CAccessBuffer(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl I2CCntl, ULONG DevAddr, ULONG Offset, PUCHAR pBuffer, ULONG ulSize); */ 46dfe64dd3Smacallanchar vGetEDIDExtensionBlocks(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2C, PUCHAR pjBuffer, ULONG ulBufferSize); 47dfe64dd3Smacallanchar vGetEnhancedEDIDBlock(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2C, ULONG ulBlockID, ULONG ulBlockTag, PUCHAR pjBuffer, ULONG ulBufferSize); 48dfe64dd3Smacallan 49dfe64dd3Smacallanchar I2COpen (PXGI_HW_DEVICE_INFO pHWDE,ULONG ulI2CEnable, ULONG ulChannelID, PI2CControl pI2CControl); 50dfe64dd3Smacallanchar I2CAccess(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl); 51dfe64dd3SmacallanBOOLEAN I2CNull( PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl); 52dfe64dd3SmacallanBOOLEAN I2CRead(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl); 53dfe64dd3SmacallanBOOLEAN I2CWrite(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl); 54dfe64dd3SmacallanBOOLEAN ResetI2C(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl); 55dfe64dd3SmacallanBOOLEAN I2CRead(PXGI_HW_DEVICE_INFO pHWDE,PI2CControl pI2CControl); 56dfe64dd3SmacallanBOOLEAN I2CWrite(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl); 57dfe64dd3SmacallanBOOLEAN ResetI2C(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl); 58dfe64dd3SmacallanBOOLEAN Ack (PXGI_HW_DEVICE_INFO pHWDE, bool fPut); 59dfe64dd3SmacallanBOOLEAN NoAck(PXGI_HW_DEVICE_INFO pHWDE); 60dfe64dd3SmacallanBOOLEAN Start( PXGI_HW_DEVICE_INFO pHWDE); 61dfe64dd3SmacallanBOOLEAN Stop(PXGI_HW_DEVICE_INFO pHWDE); 62dfe64dd3SmacallanBOOLEAN WriteUCHARI2C(PXGI_HW_DEVICE_INFO pHWDE, UCHAR cData); 63dfe64dd3SmacallanBOOLEAN ReadUCHARI2C(PXGI_HW_DEVICE_INFO pHWDE, PUCHAR pBuffer); 64dfe64dd3SmacallanUCHAR ReverseUCHAR(UCHAR data); 65dfe64dd3Smacallan 66dfe64dd3SmacallanVOID vWriteClockLineDVI(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 67dfe64dd3SmacallanVOID vWriteDataLineDVI(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 68dfe64dd3SmacallanBOOLEAN bReadClockLineDVI(PXGI_HW_DEVICE_INFO pHWDE); 69dfe64dd3SmacallanBOOLEAN bReadDataLineDVI(PXGI_HW_DEVICE_INFO pHWDE); 70dfe64dd3Smacallan 71dfe64dd3SmacallanBOOLEAN bEDIDCheckSum(PUCHAR pjEDIDBuf,ULONG ulBufSize); 72dfe64dd3Smacallan 73dfe64dd3SmacallanVOID vWriteClockLineCRT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 74dfe64dd3SmacallanVOID vWriteDataLineCRT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 75dfe64dd3SmacallanBOOLEAN bReadClockLineCRT(PXGI_HW_DEVICE_INFO pHWDE); 76dfe64dd3SmacallanBOOLEAN bReadDataLineCRT(PXGI_HW_DEVICE_INFO pHWDE); 77dfe64dd3Smacallan 78dfe64dd3Smacallan/* Jong@08102009 */ 79dfe64dd3SmacallanVOID vWriteClockLineFCNT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 80dfe64dd3SmacallanVOID vWriteDataLineFCNT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 81dfe64dd3SmacallanBOOLEAN bReadClockLineFCNT(PXGI_HW_DEVICE_INFO pHWDE); 82dfe64dd3SmacallanBOOLEAN bReadDataLineFCNT(PXGI_HW_DEVICE_INFO pHWDE); 83dfe64dd3Smacallan 84dfe64dd3Smacallan/* #define CRT_I2C */ 85dfe64dd3SmacallanVOID vWriteClockLine(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 86dfe64dd3SmacallanVOID vWriteDataLine(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data); 87dfe64dd3SmacallanBOOLEAN bReadClockLine(PXGI_HW_DEVICE_INFO pHWDE); 88dfe64dd3SmacallanBOOLEAN bReadDataLine(PXGI_HW_DEVICE_INFO pHWDE); 89dfe64dd3Smacallan 90dfe64dd3Smacallan/* Jong@08052009 */ 91dfe64dd3Smacallanextern UCHAR XGI_GetRegByte(XGIIOADDRESS port); 92dfe64dd3Smacallan 93dfe64dd3Smacallan/* Jong@08052009 */ 94dfe64dd3Smacallanvoid I2C_DelayUS(ULONG MicroSeconds) 95dfe64dd3Smacallan{ 96dfe64dd3Smacallan ErrorF(""); 97dfe64dd3Smacallan /* udelay(MicroSeconds); */ 98dfe64dd3Smacallan} 99dfe64dd3Smacallan 100dfe64dd3Smacallan 101dfe64dd3Smacallantypedef enum _I2C_ACCESS_CMD 102dfe64dd3Smacallan{ 103dfe64dd3Smacallan I2C_WRITE = 0, 104dfe64dd3Smacallan I2C_READ 105dfe64dd3Smacallan/* Jong 08/18/2008; for XFree86 */ 106dfe64dd3Smacallan /* WRITE = 0, 107dfe64dd3Smacallan READ */ 108dfe64dd3Smacallan} I2C_ACCESS_CMD; 109dfe64dd3Smacallan 110dfe64dd3Smacallan/* For XG21 */ 111dfe64dd3Smacallan 112dfe64dd3Smacallan#define ENABLE_GPIOA 0x01 113dfe64dd3Smacallan#define ENABLE_GPIOB 0x02 114dfe64dd3Smacallan#define ENABLE_GPIOC 0x04 115dfe64dd3SmacallanVOID 116dfe64dd3SmacallanEnableGPIOA( 117dfe64dd3SmacallanPUCHAR pjIOPort, I2C_ACCESS_CMD CmdType) 118dfe64dd3Smacallan{ 119dfe64dd3Smacallan PDEBUGI2C(ErrorF("EnableGPIOA()-pjIOPort=0x%x...\n", pjIOPort)); 120dfe64dd3Smacallan 121dfe64dd3Smacallan UCHAR ujCR4A = XGI_GetReg(pjIOPort, IND_CR4A_GPIO_REG_III); 122dfe64dd3Smacallan 123dfe64dd3Smacallan if (CmdType == I2C_WRITE) 124dfe64dd3Smacallan { 125dfe64dd3Smacallan ujCR4A &= ~ENABLE_GPIOA; 126dfe64dd3Smacallan } 127dfe64dd3Smacallan else 128dfe64dd3Smacallan { 129dfe64dd3Smacallan ujCR4A |= ENABLE_GPIOA; 130dfe64dd3Smacallan } 131dfe64dd3Smacallan 132dfe64dd3Smacallan XGI_SetReg(pjIOPort, IND_CR4A_GPIO_REG_III, ujCR4A); 133dfe64dd3Smacallan} 134dfe64dd3Smacallan 135dfe64dd3SmacallanVOID 136dfe64dd3SmacallanEnableGPIOB( 137dfe64dd3SmacallanPUCHAR pjIOPort, I2C_ACCESS_CMD CmdType) 138dfe64dd3Smacallan{ 139dfe64dd3Smacallan UCHAR ujCR4A = XGI_GetReg(pjIOPort, IND_CR4A_GPIO_REG_III); 140dfe64dd3Smacallan 141dfe64dd3Smacallan if (CmdType == I2C_WRITE) 142dfe64dd3Smacallan { 143dfe64dd3Smacallan ujCR4A &= ~ENABLE_GPIOB; 144dfe64dd3Smacallan } 145dfe64dd3Smacallan else 146dfe64dd3Smacallan { 147dfe64dd3Smacallan ujCR4A |= ENABLE_GPIOB; 148dfe64dd3Smacallan } 149dfe64dd3Smacallan 150dfe64dd3Smacallan XGI_SetReg(pjIOPort, IND_CR4A_GPIO_REG_III, ujCR4A); 151dfe64dd3Smacallan} 152dfe64dd3Smacallan 153dfe64dd3SmacallanVOID 154dfe64dd3SmacallanEnableGPIOC( 155dfe64dd3SmacallanPUCHAR pjIOPort, I2C_ACCESS_CMD CmdType) 156dfe64dd3Smacallan{ 157dfe64dd3Smacallan UCHAR ujCR4A = XGI_GetReg(pjIOPort, IND_CR4A_GPIO_REG_III); 158dfe64dd3Smacallan 159dfe64dd3Smacallan if (CmdType == I2C_WRITE) 160dfe64dd3Smacallan { 161dfe64dd3Smacallan ujCR4A &= ~ENABLE_GPIOC; 162dfe64dd3Smacallan } 163dfe64dd3Smacallan else 164dfe64dd3Smacallan { 165dfe64dd3Smacallan ujCR4A |= ENABLE_GPIOC; 166dfe64dd3Smacallan } 167dfe64dd3Smacallan 168dfe64dd3Smacallan XGI_SetReg(pjIOPort, IND_CR4A_GPIO_REG_III, ujCR4A); 169dfe64dd3Smacallan} 170dfe64dd3Smacallan 171dfe64dd3Smacallan 172dfe64dd3Smacallan 173dfe64dd3Smacallan 174dfe64dd3Smacallan/** 175dfe64dd3Smacallan* Function: getGPIORWTranser() 176dfe64dd3Smacallan* 177dfe64dd3Smacallan* Description: This function is used based on Z9. Because of wrongly wired deployment by HW 178dfe64dd3Smacallan* the CR4A and CR48 for GPIO pins have reverse sequence. For example, 179dfe64dd3Smacallan* D[7:0] for read function is ordered as GPIOA to GPIOH, but D[7:0] for read 180dfe64dd3Smacallan* is as GPIOH~GPIOA 181dfe64dd3Smacallan*/ 182dfe64dd3SmacallanUCHAR 183dfe64dd3SmacallangetGPIORWTransfer( 184dfe64dd3SmacallanUCHAR ujDate) 185dfe64dd3Smacallan{ 186dfe64dd3Smacallan UCHAR ujRet = 0; 187dfe64dd3Smacallan UCHAR i = 0; 188dfe64dd3Smacallan 189dfe64dd3Smacallan for (i=0; i<8; i++) 190dfe64dd3Smacallan { 191dfe64dd3Smacallan ujRet = ujRet << 1; 192dfe64dd3Smacallan ujRet |= GETBITS(ujDate >> i, 0:0); 193dfe64dd3Smacallan } 194dfe64dd3Smacallan 195dfe64dd3Smacallan return ujRet; 196dfe64dd3Smacallan} 197dfe64dd3Smacallan 198dfe64dd3Smacallan 199dfe64dd3Smacallan 200dfe64dd3Smacallanchar I2CAccessBuffer(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl, ULONG ulDevAddr, 201dfe64dd3Smacallan ULONG ulOffset, PUCHAR pBuffer,ULONG ulSize) 202dfe64dd3Smacallan{ 203dfe64dd3Smacallan 204dfe64dd3Smacallan I2CControl I2C; 205dfe64dd3Smacallan ULONG i; 206dfe64dd3Smacallan 207dfe64dd3Smacallan if ((ulSize == 0) || (pBuffer == NULL)) { 208dfe64dd3Smacallan return -1; 209dfe64dd3Smacallan } 210dfe64dd3Smacallan if (ulDevAddr & 1) { 211dfe64dd3Smacallan return -1; 212dfe64dd3Smacallan } 213dfe64dd3Smacallan if ((ulDevAddr > 0xFF) || (ulOffset > 0xFF)) { 214dfe64dd3Smacallan return -1; 215dfe64dd3Smacallan } 216dfe64dd3Smacallan 217dfe64dd3Smacallan I2C.Command = pI2CControl->Command; 218dfe64dd3Smacallan I2C.dwCookie = pI2CControl->dwCookie; 219dfe64dd3Smacallan I2C.Data = pI2CControl->Data; 220dfe64dd3Smacallan I2C. Flags = pI2CControl->Flags; 221dfe64dd3Smacallan I2C.Status = pI2CControl->Status; 222dfe64dd3Smacallan I2C.ClockRate = pI2CControl->ClockRate; 223dfe64dd3Smacallan switch (pI2CControl->Command) { 224dfe64dd3Smacallan case I2C_COMMAND_READ: 225dfe64dd3Smacallan /* Reset I2C Bus */ 226dfe64dd3Smacallan I2C.Command = I2C_COMMAND_RESET; 227dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 228dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 229dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 230dfe64dd3Smacallan break; 231dfe64dd3Smacallan } 232dfe64dd3Smacallan 233dfe64dd3Smacallan /* Write Device Address */ 234dfe64dd3Smacallan I2C.Command = I2C_COMMAND_WRITE; 235dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_START | I2C_FLAGS_ACK; 236dfe64dd3Smacallan I2C.Data = (UCHAR)ulDevAddr; 237dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 238dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 239dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 240dfe64dd3Smacallan break; 241dfe64dd3Smacallan } 242dfe64dd3Smacallan 243dfe64dd3Smacallan /* Write Register Offset */ 244dfe64dd3Smacallan I2C.Command = I2C_COMMAND_WRITE; 245dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_ACK | I2C_FLAGS_STOP; 246dfe64dd3Smacallan I2C.Data = (UCHAR)ulOffset; 247dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 248dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 249dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 250dfe64dd3Smacallan break; 251dfe64dd3Smacallan } 252dfe64dd3Smacallan 253dfe64dd3Smacallan /* Write Device Read Address */ 254dfe64dd3Smacallan I2C.Command = I2C_COMMAND_WRITE; 255dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_START | I2C_FLAGS_ACK; 256dfe64dd3Smacallan I2C.Data = (UCHAR)ulDevAddr + 1; 257dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 258dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 259dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 260dfe64dd3Smacallan break; 261dfe64dd3Smacallan } 262dfe64dd3Smacallan 263dfe64dd3Smacallan /* Read Data */ 264dfe64dd3Smacallan for (i=0; i< ulSize; i++) { 265dfe64dd3Smacallan I2C.Command = I2C_COMMAND_READ; 266dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_ACK; 267dfe64dd3Smacallan if (i == ulSize - 1) { /* Read Last UCHAR */ 268dfe64dd3Smacallan I2C.Flags |= I2C_FLAGS_STOP; 269dfe64dd3Smacallan } 270dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 271dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 272dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 273dfe64dd3Smacallan break; 274dfe64dd3Smacallan } 275dfe64dd3Smacallan *pBuffer = I2C.Data; 276dfe64dd3Smacallan pBuffer++; 277dfe64dd3Smacallan } 278dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 279dfe64dd3Smacallan break; 280dfe64dd3Smacallan 281dfe64dd3Smacallan case I2C_COMMAND_WRITE: 282dfe64dd3Smacallan /* Reset I2C Bus */ 283dfe64dd3Smacallan I2C.Command = I2C_COMMAND_RESET; 284dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 285dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 286dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 287dfe64dd3Smacallan break; 288dfe64dd3Smacallan } 289dfe64dd3Smacallan 290dfe64dd3Smacallan /* Write Device Address */ 291dfe64dd3Smacallan I2C.Command = I2C_COMMAND_WRITE; 292dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_START | I2C_FLAGS_ACK; 293dfe64dd3Smacallan I2C.Data = (UCHAR)ulDevAddr; 294dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 295dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 296dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 297dfe64dd3Smacallan break; 298dfe64dd3Smacallan } 299dfe64dd3Smacallan 300dfe64dd3Smacallan /* Write Register Offset */ 301dfe64dd3Smacallan I2C.Command = I2C_COMMAND_WRITE; 302dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_ACK; 303dfe64dd3Smacallan I2C.Data = (UCHAR)ulOffset; 304dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 305dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 306dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 307dfe64dd3Smacallan break; 308dfe64dd3Smacallan } 309dfe64dd3Smacallan 310dfe64dd3Smacallan /* Write Data */ 311dfe64dd3Smacallan for (i=0; i< ulSize; i++) { 312dfe64dd3Smacallan I2C.Command = I2C_COMMAND_WRITE; 313dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_ACK; 314dfe64dd3Smacallan if (i == ulSize - 1) { /* Read Last UCHAR */ 315dfe64dd3Smacallan I2C.Flags |= I2C_FLAGS_STOP; 316dfe64dd3Smacallan } 317dfe64dd3Smacallan I2C.Data = *pBuffer; 318dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 319dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) { 320dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 321dfe64dd3Smacallan break; 322dfe64dd3Smacallan } 323dfe64dd3Smacallan pBuffer++; 324dfe64dd3Smacallan } 325dfe64dd3Smacallan pI2CControl->Status = I2C.Status; 326dfe64dd3Smacallan break; 327dfe64dd3Smacallan } 328dfe64dd3Smacallan 329dfe64dd3Smacallan if (pI2CControl->Status == I2C_STATUS_NOERROR) 330dfe64dd3Smacallan { 331dfe64dd3Smacallan return 0; 332dfe64dd3Smacallan } 333dfe64dd3Smacallan else 334dfe64dd3Smacallan { 335dfe64dd3Smacallan return -1; 336dfe64dd3Smacallan } 337dfe64dd3Smacallan} 338dfe64dd3Smacallan 339dfe64dd3Smacallan 340dfe64dd3Smacallan/************************************************************************* 341dfe64dd3Smacallan// char vGetEDIDExtensionBlocks 342dfe64dd3Smacallan// 343dfe64dd3Smacallan// Routine Description: 344dfe64dd3Smacallan// Reads the extension part behind a 128KB block of EDID which is in 1.3 345dfe64dd3Smacallan// format. The extension part can be distributed into 128KB-blocks. 346dfe64dd3Smacallan// 347dfe64dd3Smacallan// Arguments: 348dfe64dd3Smacallan// pHWDE - Hardware extension object pointer 349dfe64dd3Smacallan// pI2C - I2C pointer 350dfe64dd3Smacallan// pjBuffer - EDID Buffer 351dfe64dd3Smacallan// ulBufferSize - Buffer size 352dfe64dd3Smacallan// 353dfe64dd3Smacallan// 354dfe64dd3Smacallan// Return Value: 355dfe64dd3Smacallan// Status of returning EDID. 356dfe64dd3Smacallan// NO_ERROR - success 357dfe64dd3Smacallan// ERROR_INVALID_PARAMETER - failed 358dfe64dd3Smacallan// 359dfe64dd3Smacallan****************************************************************************/ 360dfe64dd3Smacallanchar vGetEDIDExtensionBlocks( 361dfe64dd3Smacallan PXGI_HW_DEVICE_INFO pHWDE, 362dfe64dd3Smacallan PI2CControl pI2C, 363dfe64dd3Smacallan PUCHAR pjBuffer, 364dfe64dd3Smacallan ULONG ulBufferSize) 365dfe64dd3Smacallan{ 366dfe64dd3Smacallan char status; 367dfe64dd3Smacallan ULONG ulBlockTag; 368dfe64dd3Smacallan ULONG i; 369dfe64dd3Smacallan PUCHAR pBlockMap; 370dfe64dd3Smacallan 371dfe64dd3Smacallan 372dfe64dd3Smacallan if ((ulBufferSize < 128) || (pjBuffer == NULL)) 373dfe64dd3Smacallan { 374dfe64dd3Smacallan return -1; 375dfe64dd3Smacallan } 376dfe64dd3Smacallan 377dfe64dd3Smacallan pI2C->Command = I2C_COMMAND_READ; 378dfe64dd3Smacallan status = I2CAccessBuffer(pHWDE, pI2C, 0xA0, 128, pjBuffer, 128); 379dfe64dd3Smacallan if ((status != 0) || (pI2C->Status != I2C_STATUS_NOERROR)) 380dfe64dd3Smacallan { 381dfe64dd3Smacallan return status; 382dfe64dd3Smacallan } 383dfe64dd3Smacallan 384dfe64dd3Smacallan if (bEDIDCheckSum(pjBuffer, 128) != 0) { 385dfe64dd3Smacallan return -1; 386dfe64dd3Smacallan } 387dfe64dd3Smacallan 388dfe64dd3Smacallan if (*pjBuffer == 0xF0) 389dfe64dd3Smacallan { /* A Block Map, we should read other extension blocks*/ 390dfe64dd3Smacallan pBlockMap = pjBuffer; 391dfe64dd3Smacallan for (i=1; i<=126; i++) 392dfe64dd3Smacallan { 393dfe64dd3Smacallan ulBlockTag = *(pBlockMap + i); 394dfe64dd3Smacallan if (ulBlockTag) 395dfe64dd3Smacallan { 396dfe64dd3Smacallan pjBuffer += 128; 397dfe64dd3Smacallan ulBufferSize -= 128; 398dfe64dd3Smacallan status = vGetEnhancedEDIDBlock(pHWDE, pI2C, i+1, ulBlockTag, pjBuffer, ulBufferSize); 399dfe64dd3Smacallan if ((status != 0) || (pI2C->Status != I2C_STATUS_NOERROR)) 400dfe64dd3Smacallan { 401dfe64dd3Smacallan return -1; 402dfe64dd3Smacallan } 403dfe64dd3Smacallan } 404dfe64dd3Smacallan else 405dfe64dd3Smacallan { 406dfe64dd3Smacallan if (i > 1) 407dfe64dd3Smacallan { 408dfe64dd3Smacallan return 0; /* All Extension blocks must be sequential, no holes allowed. (VESA E-EDID)*/ 409dfe64dd3Smacallan } 410dfe64dd3Smacallan else 411dfe64dd3Smacallan { 412dfe64dd3Smacallan return -1; 413dfe64dd3Smacallan } 414dfe64dd3Smacallan } 415dfe64dd3Smacallan } 416dfe64dd3Smacallan /* We should read block # 128 */ 417dfe64dd3Smacallan pjBuffer += 128; 418dfe64dd3Smacallan ulBufferSize -= 128; 419dfe64dd3Smacallan ulBlockTag = 0xF0; 420dfe64dd3Smacallan status = vGetEnhancedEDIDBlock(pHWDE, pI2C, 128, ulBlockTag, pjBuffer, ulBufferSize); 421dfe64dd3Smacallan if ((status != 0) || (pI2C->Status != I2C_STATUS_NOERROR)) 422dfe64dd3Smacallan { 423dfe64dd3Smacallan return 0; /* Monitor may has only 128 blocks (0~127) */ 424dfe64dd3Smacallan } 425dfe64dd3Smacallan 426dfe64dd3Smacallan pBlockMap = pjBuffer; 427dfe64dd3Smacallan for (i=1; i<=126; i++) 428dfe64dd3Smacallan { /* Read Block # 128 ~ 254 */ 429dfe64dd3Smacallan ulBlockTag = *(pBlockMap + i); 430dfe64dd3Smacallan if (ulBlockTag) 431dfe64dd3Smacallan { 432dfe64dd3Smacallan pjBuffer += 128; 433dfe64dd3Smacallan ulBufferSize -= 128; 434dfe64dd3Smacallan status = vGetEnhancedEDIDBlock(pHWDE, pI2C, i+128, ulBlockTag, pjBuffer, ulBufferSize); 435dfe64dd3Smacallan if ((status != 0) || (pI2C->Status != I2C_STATUS_NOERROR)) 436dfe64dd3Smacallan { 437dfe64dd3Smacallan return -1; 438dfe64dd3Smacallan } 439dfe64dd3Smacallan } 440dfe64dd3Smacallan else 441dfe64dd3Smacallan { 442dfe64dd3Smacallan if (i > 1) 443dfe64dd3Smacallan { 444dfe64dd3Smacallan return 0; /* All Extension blocks must be sequential, no holes allowed. (VESA E-EDID) */ 445dfe64dd3Smacallan } 446dfe64dd3Smacallan else 447dfe64dd3Smacallan { 448dfe64dd3Smacallan return -1; 449dfe64dd3Smacallan } 450dfe64dd3Smacallan } 451dfe64dd3Smacallan } 452dfe64dd3Smacallan } 453dfe64dd3Smacallan 454dfe64dd3Smacallan return 0; 455dfe64dd3Smacallan} 456dfe64dd3Smacallan 457dfe64dd3Smacallan/************************************************************************* 458dfe64dd3Smacallan// char vGetEnhancedEDIDBlock 459dfe64dd3Smacallan// 460dfe64dd3Smacallan// Routine Description: 461dfe64dd3Smacallan// Get the EDID which is in Enhanced-EDID format via I2C. The parse-in block 462dfe64dd3Smacallan// tag(ulBlockTag) and the first UCHAR of the retrieved buffer should be identical. 463dfe64dd3Smacallan// Returns error when they are not, otherwise return NO_ERROR. 464dfe64dd3Smacallan// 465dfe64dd3Smacallan// Arguments: 466dfe64dd3Smacallan// pHWDE - Hardware extension object pointer 467dfe64dd3Smacallan// pI2C - I2C pointer 468dfe64dd3Smacallan// ulBlockID - Block ID 469dfe64dd3Smacallan// ulBlockTag - Block Tag 470dfe64dd3Smacallan// pjBuffer - EDID Buffer 471dfe64dd3Smacallan// ulBufferSize - Buffer size 472dfe64dd3Smacallan// 473dfe64dd3Smacallan// 474dfe64dd3Smacallan// Return Value: 475dfe64dd3Smacallan// Status of returning EDID. 476dfe64dd3Smacallan// NO_ERROR - success 477dfe64dd3Smacallan// ERROR_INVALID_PARAMETER - failed 478dfe64dd3Smacallan// 479dfe64dd3Smacallan****************************************************************************/ 480dfe64dd3Smacallanchar vGetEnhancedEDIDBlock( 481dfe64dd3Smacallan PXGI_HW_DEVICE_INFO pHWDE, 482dfe64dd3Smacallan PI2CControl pI2C, 483dfe64dd3Smacallan ULONG ulBlockID, 484dfe64dd3Smacallan ULONG ulBlockTag, 485dfe64dd3Smacallan PUCHAR pjBuffer, 486dfe64dd3Smacallan ULONG ulBufferSize) 487dfe64dd3Smacallan{ 488dfe64dd3Smacallan ULONG ulOffset, SegmentID; 489dfe64dd3Smacallan char status; 490dfe64dd3Smacallan 491dfe64dd3Smacallan if ((ulBufferSize < 128) || (pjBuffer == NULL)) 492dfe64dd3Smacallan { 493dfe64dd3Smacallan return -1; 494dfe64dd3Smacallan } 495dfe64dd3Smacallan 496dfe64dd3Smacallan SegmentID = ulBlockID / 2; 497dfe64dd3Smacallan ulOffset = (ulBlockID % 2) * 128; 498dfe64dd3Smacallan 499dfe64dd3Smacallan pI2C->Command = I2C_COMMAND_WRITE; 500dfe64dd3Smacallan status = I2CAccessBuffer(pHWDE, pI2C, 0x60, 0, (PUCHAR)&SegmentID, 1); 501dfe64dd3Smacallan if ((status == NO_ERROR) && (pI2C->Status == I2C_STATUS_NOERROR)) 502dfe64dd3Smacallan { 503dfe64dd3Smacallan pI2C->Command = I2C_COMMAND_READ; 504dfe64dd3Smacallan status = I2CAccessBuffer(pHWDE, pI2C, 0xA0, ulOffset, pjBuffer, 128); 505dfe64dd3Smacallan if ((status == 0) && (pI2C->Status == I2C_STATUS_NOERROR)) 506dfe64dd3Smacallan { 507dfe64dd3Smacallan if (*pjBuffer != (UCHAR)ulBlockTag) 508dfe64dd3Smacallan { 509dfe64dd3Smacallan return -1; 510dfe64dd3Smacallan } 511dfe64dd3Smacallan 512dfe64dd3Smacallan if (bEDIDCheckSum(pjBuffer, 128) != 0) 513dfe64dd3Smacallan { 514dfe64dd3Smacallan return -1; 515dfe64dd3Smacallan } 516dfe64dd3Smacallan } 517dfe64dd3Smacallan else 518dfe64dd3Smacallan { 519dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 520dfe64dd3Smacallan } 521dfe64dd3Smacallan } 522dfe64dd3Smacallan else 523dfe64dd3Smacallan { 524dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 525dfe64dd3Smacallan } 526dfe64dd3Smacallan 527dfe64dd3Smacallan 528dfe64dd3Smacallan return NO_ERROR; 529dfe64dd3Smacallan} 530dfe64dd3Smacallanchar I2COpen (PXGI_HW_DEVICE_INFO pHWDE, ULONG ulI2CEnable, ULONG ulChannelID, PI2CControl pI2CControl) 531dfe64dd3Smacallan{ 532dfe64dd3Smacallan/* 533dfe64dd3Smacallan// printk("\nI2COpen(%d) : Channel ID = %d\n", ulI2CEnable, ulChannelID); 534dfe64dd3Smacallan // we need to determine the Context area for each command we receive 535dfe64dd3Smacallan // i.e. which hardware I2C bus is the command for. 536dfe64dd3Smacallan // this is unimplemented here! 537dfe64dd3Smacallan*/ 538dfe64dd3Smacallan if (ulChannelID >= MAX_I2C_CHANNEL) 539dfe64dd3Smacallan { 540dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 541dfe64dd3Smacallan } 542dfe64dd3Smacallan if (ulI2CEnable) /* Open I2C Port */ 543dfe64dd3Smacallan { 544dfe64dd3Smacallan/* // verify clock rate. If you cannot implement the given rate, 545dfe64dd3Smacallan // enable a lower clock rate closest to the request clock rate. 546dfe64dd3Smacallan // 547dfe64dd3Smacallan // put a better check here if your device can only do discrete 548dfe64dd3Smacallan // clock rate values. 549dfe64dd3Smacallan*/ 550dfe64dd3Smacallan if (pI2CControl->ClockRate > I2C_MAX_CLOCK_RATE) 551dfe64dd3Smacallan { 552dfe64dd3Smacallan pI2CControl->ClockRate = I2C_MAX_CLOCK_RATE; 553dfe64dd3Smacallan } 554dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_NOERROR; 555dfe64dd3Smacallan } 556dfe64dd3Smacallan else /* Close I2C Port*/ 557dfe64dd3Smacallan { 558dfe64dd3Smacallan /* Set Acquired state to FALSE */ 559dfe64dd3Smacallan 560dfe64dd3Smacallan pI2CControl->dwCookie = 0; 561dfe64dd3Smacallan /* Set status */ 562dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_NOERROR; 563dfe64dd3Smacallan } 564dfe64dd3Smacallan 565dfe64dd3Smacallan 566dfe64dd3Smacallan 567dfe64dd3Smacallan return 0; 568dfe64dd3Smacallan} 569dfe64dd3Smacallan/* end of I2COpen */ 570dfe64dd3Smacallanchar I2CAccess(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl) 571dfe64dd3Smacallan{ 572dfe64dd3Smacallan ULONG ulChannel = pI2CControl->dwCookie % MAX_I2C_CHANNEL; 573dfe64dd3Smacallan 574dfe64dd3Smacallan 575dfe64dd3Smacallan if (pI2CControl->ClockRate > I2C_MAX_CLOCK_RATE) 576dfe64dd3Smacallan { 577dfe64dd3Smacallan pI2CControl->ClockRate = I2C_MAX_CLOCK_RATE; 578dfe64dd3Smacallan } 579dfe64dd3Smacallan if (pI2CControl->ClockRate == 0) { 580dfe64dd3Smacallan pI2CControl->ClockRate = 20000; 581dfe64dd3Smacallan } 582dfe64dd3Smacallan 583dfe64dd3Smacallan pHWDE->I2CDelay = (1000000 / pI2CControl->ClockRate) * 10 * 2; /* in 100ns */ 584dfe64dd3Smacallan /* pHWDE->I2CDelay = (1000000 / pI2CControl->ClockRate) * 10; */ /* in 100ns */ 585dfe64dd3Smacallan /* pHWDE->I2CDelay = 100; */ 586dfe64dd3Smacallan /* PDEBUG(ErrorF("I2CAccess()-I2CDelay = %d...\n", pHWDE->I2CDelay)); */ 587dfe64dd3Smacallan 588dfe64dd3Smacallan /* pHWDE->I2CDelay = 100; */ /* Jong@08032009 */ 589dfe64dd3Smacallan 590dfe64dd3Smacallan switch (pI2CControl->Command) 591dfe64dd3Smacallan { 592dfe64dd3Smacallan /* Issue a STOP or START without a READ or WRITE Command */ 593dfe64dd3Smacallan case I2C_COMMAND_NULL: 594dfe64dd3Smacallan if (I2CNull(pHWDE, pI2CControl) == FALSE) break; 595dfe64dd3Smacallan/* if (pI2CControl->Flags & I2C_FLAGS_STOP) { 596dfe64dd3Smacallan pI2CContext->dwI2CPortAcquired = FALSE; 597dfe64dd3Smacallan } 598dfe64dd3Smacallan*/ break; 599dfe64dd3Smacallan 600dfe64dd3Smacallan /* READ or WRITE Command */ 601dfe64dd3Smacallan case I2C_COMMAND_READ: 602dfe64dd3Smacallan if (I2CRead(pHWDE, pI2CControl) == FALSE) break; 603dfe64dd3Smacallan/* if (pI2CControl->Flags & I2C_FLAGS_STOP) { 604dfe64dd3Smacallan pI2CContext->dwI2CPortAcquired = FALSE; 605dfe64dd3Smacallan } 606dfe64dd3Smacallan*/ break; 607dfe64dd3Smacallan 608dfe64dd3Smacallan case I2C_COMMAND_WRITE: 609dfe64dd3Smacallan if (I2CWrite(pHWDE, pI2CControl) == FALSE) break; 610dfe64dd3Smacallan/* if (pI2CControl->Flags & I2C_FLAGS_STOP) { 611dfe64dd3Smacallan pI2CContext->dwI2CPortAcquired = FALSE; 612dfe64dd3Smacallan } 613dfe64dd3Smacallan*/ break; 614dfe64dd3Smacallan 615dfe64dd3Smacallan case I2C_COMMAND_STATUS: 616dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_NOERROR; 617dfe64dd3Smacallan break; 618dfe64dd3Smacallan 619dfe64dd3Smacallan case I2C_COMMAND_RESET: 620dfe64dd3Smacallan /* Reset I2C bus */ 621dfe64dd3Smacallan if (ResetI2C(pHWDE, pI2CControl) == FALSE) break; 622dfe64dd3Smacallan break; 623dfe64dd3Smacallan 624dfe64dd3Smacallan default: 625dfe64dd3Smacallan /* Invalid Command */ 626dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 627dfe64dd3Smacallan } 628dfe64dd3Smacallan 629dfe64dd3Smacallan 630dfe64dd3Smacallan/* printk("\nI2CAccess(): I2C Cmd = 0x%X I2C Flags = 0x%X I2C Status = 0x%X I2C Data = 0x%X", pI2CControl->Command, pI2CControl->Flags, pI2CControl->Status, pI2CControl->Data); */ 631dfe64dd3Smacallan 632dfe64dd3Smacallan return NO_ERROR; 633dfe64dd3Smacallan} 634dfe64dd3Smacallan 635dfe64dd3Smacallan 636dfe64dd3Smacallan/*^^* 637dfe64dd3Smacallan * Function: I2CNull 638dfe64dd3Smacallan * 639dfe64dd3Smacallan * Purpose: To complete an I2C instruction. 640dfe64dd3Smacallan * 641dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated 642dfe64dd3Smacallan * with card being accessed 643dfe64dd3Smacallan * I2CCntl : PI2CControl, pointer to I2C control structure 644dfe64dd3Smacallan * 645dfe64dd3Smacallan * Outputs: void. 646dfe64dd3Smacallan *^^*/ 647dfe64dd3SmacallanBOOLEAN I2CNull( PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl) 648dfe64dd3Smacallan{ 649dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_ERROR; 650dfe64dd3Smacallan 651dfe64dd3Smacallan/*///// Issue STOP - START, if I2C_FLAGS_DATACHAINING ////////*/ 652dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_DATACHAINING) 653dfe64dd3Smacallan { 654dfe64dd3Smacallan if (Stop(pHWDE) == FALSE) return FALSE; 655dfe64dd3Smacallan if (Start(pHWDE) == FALSE) return FALSE; 656dfe64dd3Smacallan } 657dfe64dd3Smacallan 658dfe64dd3Smacallan/*///// Issue START ////////*/ 659dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_START) 660dfe64dd3Smacallan { 661dfe64dd3Smacallan if (Start(pHWDE) == FALSE) return FALSE; 662dfe64dd3Smacallan } 663dfe64dd3Smacallan 664dfe64dd3Smacallan/*////// Issue STOP /////////*/ 665dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_STOP) 666dfe64dd3Smacallan { 667dfe64dd3Smacallan if (Stop(pHWDE) == FALSE) return FALSE; 668dfe64dd3Smacallan } 669dfe64dd3Smacallan 670dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_NOERROR; 671dfe64dd3Smacallan return TRUE; 672dfe64dd3Smacallan}/* end of I2CNull()*/ 673dfe64dd3Smacallan 674dfe64dd3Smacallan/*^^* 675dfe64dd3Smacallan * Function: I2CRead 676dfe64dd3Smacallan * 677dfe64dd3Smacallan * Purpose: To complete an I2C instruction. 678dfe64dd3Smacallan * 679dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated 680dfe64dd3Smacallan * with card being accessed 681dfe64dd3Smacallan * I2CCntl : PI2CControl, pointer to I2C control structure 682dfe64dd3Smacallan * 683dfe64dd3Smacallan * Outputs: void. 684dfe64dd3Smacallan *^^*/ 685dfe64dd3SmacallanBOOLEAN I2CRead(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl) 686dfe64dd3Smacallan{ 687dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_ERROR; 688dfe64dd3Smacallan 689dfe64dd3Smacallan/*///// Issue STOP - START, if I2C_FLAGS_DATACHAINING ////////*/ 690dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_DATACHAINING) 691dfe64dd3Smacallan { 692dfe64dd3Smacallan if (Stop(pHWDE) == FALSE) return FALSE; 693dfe64dd3Smacallan if (Start(pHWDE) == FALSE) return FALSE; 694dfe64dd3Smacallan } 695dfe64dd3Smacallan 696dfe64dd3Smacallan/*///// Issue START ////////*/ 697dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_START) 698dfe64dd3Smacallan { 699dfe64dd3Smacallan if (Start(pHWDE) == FALSE) return FALSE; 700dfe64dd3Smacallan } 701dfe64dd3Smacallan 702dfe64dd3Smacallan/*///// Read Command ///////*/ 703dfe64dd3Smacallan if (ReadUCHARI2C(pHWDE, &pI2CControl->Data) == FALSE) 704dfe64dd3Smacallan return FALSE; 705dfe64dd3Smacallan 706dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_STOP) { 707dfe64dd3Smacallan if (NoAck(pHWDE) == FALSE) return FALSE; 708dfe64dd3Smacallan } 709dfe64dd3Smacallan else { /* Should we issue ACK*/ 710dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_ACK) { 711dfe64dd3Smacallan if (Ack(pHWDE, SEND_ACK) == FALSE) return FALSE; 712dfe64dd3Smacallan } 713dfe64dd3Smacallan } 714dfe64dd3Smacallan 715dfe64dd3Smacallan/*////// Issue STOP /////////*/ 716dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_STOP) 717dfe64dd3Smacallan { 718dfe64dd3Smacallan if (Stop(pHWDE) == FALSE) return FALSE; 719dfe64dd3Smacallan } 720dfe64dd3Smacallan 721dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_NOERROR; 722dfe64dd3Smacallan return TRUE; 723dfe64dd3Smacallan} /* end of I2CRead() */ 724dfe64dd3Smacallan 725dfe64dd3Smacallan/*^^* 726dfe64dd3Smacallan * Function: I2CWrite 727dfe64dd3Smacallan * 728dfe64dd3Smacallan * Purpose: To complete an I2C instruction. 729dfe64dd3Smacallan * 730dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated 731dfe64dd3Smacallan * with card being accessed 732dfe64dd3Smacallan * I2CCntl : PI2CControl, pointer to I2C control structure 733dfe64dd3Smacallan * 734dfe64dd3Smacallan * Outputs: void. 735dfe64dd3Smacallan *^^*/ 736dfe64dd3SmacallanBOOLEAN I2CWrite(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl) 737dfe64dd3Smacallan{ 738dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_ERROR; 739dfe64dd3Smacallan 740dfe64dd3Smacallan/*///// Issue STOP - START, if I2C_FLAGS_DATACHAINING ////////*/ 741dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_DATACHAINING) 742dfe64dd3Smacallan { 743dfe64dd3Smacallan if (Stop(pHWDE) == FALSE) 744dfe64dd3Smacallan { 745dfe64dd3Smacallan 746dfe64dd3Smacallan return FALSE; 747dfe64dd3Smacallan } 748dfe64dd3Smacallan if (Start(pHWDE) == FALSE) 749dfe64dd3Smacallan { 750dfe64dd3Smacallan 751dfe64dd3Smacallan 752dfe64dd3Smacallan return FALSE; 753dfe64dd3Smacallan } 754dfe64dd3Smacallan } 755dfe64dd3Smacallan 756dfe64dd3Smacallan/*///// Issue START ////////*/ 757dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_START) 758dfe64dd3Smacallan { 759dfe64dd3Smacallan if (Start(pHWDE) == FALSE) 760dfe64dd3Smacallan { 761dfe64dd3Smacallan return FALSE; 762dfe64dd3Smacallan } 763dfe64dd3Smacallan } 764dfe64dd3Smacallan 765dfe64dd3Smacallan/*///// Write Command ///////*/ 766dfe64dd3Smacallan if (WriteUCHARI2C(pHWDE, pI2CControl->Data) == FALSE) 767dfe64dd3Smacallan { 768dfe64dd3Smacallan 769dfe64dd3Smacallan return FALSE; 770dfe64dd3Smacallan } 771dfe64dd3Smacallan 772dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_ACK) { 773dfe64dd3Smacallan if (Ack(pHWDE, RECV_ACK) == FALSE) 774dfe64dd3Smacallan { 775dfe64dd3Smacallan return FALSE; 776dfe64dd3Smacallan } 777dfe64dd3Smacallan } 778dfe64dd3Smacallan 779dfe64dd3Smacallan/*////// Issue STOP /////////*/ 780dfe64dd3Smacallan if (pI2CControl->Flags & I2C_FLAGS_STOP) 781dfe64dd3Smacallan { 782dfe64dd3Smacallan if (Stop(pHWDE) == FALSE) 783dfe64dd3Smacallan { 784dfe64dd3Smacallan return FALSE; 785dfe64dd3Smacallan } 786dfe64dd3Smacallan } 787dfe64dd3Smacallan 788dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_NOERROR; 789dfe64dd3Smacallan return TRUE; 790dfe64dd3Smacallan} /* end of I2CWrite() */ 791dfe64dd3Smacallan 792dfe64dd3Smacallan/*^^* 793dfe64dd3Smacallan * Function: ResetI2C 794dfe64dd3Smacallan * 795dfe64dd3Smacallan * Purpose: To reset I2CBus 796dfe64dd3Smacallan * 797dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated with 798dfe64dd3Smacallan * lpI2C_ContextData being accessed 799dfe64dd3Smacallan * 800dfe64dd3Smacallan * Outputs: UCHAR, the data that was read. 801dfe64dd3Smacallan *^^*/ 802dfe64dd3SmacallanBOOLEAN ResetI2C(PXGI_HW_DEVICE_INFO pHWDE, PI2CControl pI2CControl) 803dfe64dd3Smacallan{ 804dfe64dd3Smacallan 805dfe64dd3Smacallan if (Stop(pHWDE) == TRUE) { 806dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_NOERROR; 807dfe64dd3Smacallan return TRUE; 808dfe64dd3Smacallan } 809dfe64dd3Smacallan else { 810dfe64dd3Smacallan pI2CControl->Status = I2C_STATUS_ERROR; 811dfe64dd3Smacallan return FALSE; 812dfe64dd3Smacallan } 813dfe64dd3Smacallan} /* ResetI2C() */ 814dfe64dd3Smacallan 815dfe64dd3Smacallan 816dfe64dd3Smacallan 817dfe64dd3Smacallan 818dfe64dd3Smacallan/*^^* 819dfe64dd3Smacallan * Function: Ack 820dfe64dd3Smacallan * 821dfe64dd3Smacallan * Purpose: To ask the I2C bus for an acknowledge. 822dfe64dd3Smacallan * 823dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated with 824dfe64dd3Smacallan * lpI2C_ContextData being accessed 825dfe64dd3Smacallan * 826dfe64dd3Smacallan * Outputs: char, ack status. 827dfe64dd3Smacallan *^^*/ 828dfe64dd3SmacallanBOOLEAN Ack (PXGI_HW_DEVICE_INFO pHWDE, bool fPut) 829dfe64dd3Smacallan{ 830dfe64dd3Smacallan BOOLEAN status = FALSE; 831dfe64dd3Smacallan ULONG i, delay, delay2; 832dfe64dd3Smacallan ULONG ack; 833dfe64dd3Smacallan 834dfe64dd3Smacallan delay = pHWDE->I2CDelay / 10 / 2; 835dfe64dd3Smacallan if (fPut == SEND_ACK) /* Send Ack into I2C bus */ 836dfe64dd3Smacallan { 837dfe64dd3Smacallan vWriteDataLine(pHWDE, LODAT); 838dfe64dd3Smacallan I2C_DelayUS(delay); 839dfe64dd3Smacallan 840dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 841dfe64dd3Smacallan I2C_DelayUS(delay); 842dfe64dd3Smacallan if (bReadClockLine(pHWDE) != HICLK) { 843dfe64dd3Smacallan i = 0; 844dfe64dd3Smacallan delay2 = delay * 2; 845dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 846dfe64dd3Smacallan do { 847dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 848dfe64dd3Smacallan I2C_DelayUS(delay2); 849dfe64dd3Smacallan if (bReadClockLine(pHWDE) == HICLK) break; 850dfe64dd3Smacallan i++; 851dfe64dd3Smacallan delay2 *= 2; 852dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 853dfe64dd3Smacallan } while (1); 854dfe64dd3Smacallan } 855dfe64dd3Smacallan 856dfe64dd3Smacallan 857dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 858dfe64dd3Smacallan vWriteClockLine(pHWDE, LOCLK); 859dfe64dd3Smacallan I2C_DelayUS(delay); 860dfe64dd3Smacallan 861dfe64dd3Smacallan return TRUE; 862dfe64dd3Smacallan } 863dfe64dd3Smacallan else 864dfe64dd3Smacallan { 865dfe64dd3Smacallan /* Receive Ack from I2C bus */ 866dfe64dd3Smacallan vWriteDataLine(pHWDE, HIDAT); 867dfe64dd3Smacallan I2C_DelayUS(delay); 868dfe64dd3Smacallan ack = bReadDataLine(pHWDE); 869dfe64dd3Smacallan 870dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 871dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 872dfe64dd3Smacallan I2C_DelayUS(delay); 873dfe64dd3Smacallan if (bReadClockLine(pHWDE) != HICLK) { 874dfe64dd3Smacallan i = 0; 875dfe64dd3Smacallan delay2 = delay * 2; 876dfe64dd3Smacallan do { 877dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 878dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 879dfe64dd3Smacallan I2C_DelayUS(delay2); 880dfe64dd3Smacallan if (bReadClockLine(pHWDE) == HICLK) break; 881dfe64dd3Smacallan i++; 882dfe64dd3Smacallan delay2 *= 2; 883dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 884dfe64dd3Smacallan } while (1); 885dfe64dd3Smacallan } 886dfe64dd3Smacallan 887dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 888dfe64dd3Smacallan status = bReadDataLine(pHWDE); 889dfe64dd3Smacallan 890dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 891dfe64dd3Smacallan vWriteClockLine(pHWDE, LOCLK); 892dfe64dd3Smacallan I2C_DelayUS(delay); 893dfe64dd3Smacallan 894dfe64dd3Smacallan if (status != LODAT) { 895dfe64dd3Smacallan if (ack == LODAT) { 896dfe64dd3Smacallan status = LODAT; 897dfe64dd3Smacallan } 898dfe64dd3Smacallan 899dfe64dd3Smacallan else { 900dfe64dd3Smacallan 901dfe64dd3Smacallan } 902dfe64dd3Smacallan 903dfe64dd3Smacallan } 904dfe64dd3Smacallan return (BOOLEAN)(status == LODAT); 905dfe64dd3Smacallan } 906dfe64dd3Smacallan}/* end of Ack() */ 907dfe64dd3Smacallan 908dfe64dd3Smacallan 909dfe64dd3SmacallanBOOLEAN NoAck(PXGI_HW_DEVICE_INFO pHWDE) 910dfe64dd3Smacallan{ 911dfe64dd3Smacallan ULONG i, delay, delay2; 912dfe64dd3Smacallan 913dfe64dd3Smacallan delay = pHWDE->I2CDelay / 10 / 2; 914dfe64dd3Smacallan 915dfe64dd3Smacallan vWriteDataLine(pHWDE, HIDAT); 916dfe64dd3Smacallan I2C_DelayUS(delay); 917dfe64dd3Smacallan 918dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 919dfe64dd3Smacallan I2C_DelayUS(delay); 920dfe64dd3Smacallan if (bReadClockLine(pHWDE) != HICLK) { 921dfe64dd3Smacallan delay2 = delay * 2; 922dfe64dd3Smacallan i = 0; 923dfe64dd3Smacallan do { 924dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 925dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 926dfe64dd3Smacallan I2C_DelayUS(delay2); 927dfe64dd3Smacallan if (bReadClockLine(pHWDE) == HICLK) break; 928dfe64dd3Smacallan i++; 929dfe64dd3Smacallan delay2 *= 2; 930dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 931dfe64dd3Smacallan } while (1); 932dfe64dd3Smacallan } 933dfe64dd3Smacallan 934dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 935dfe64dd3Smacallan vWriteClockLine(pHWDE, LOCLK); 936dfe64dd3Smacallan I2C_DelayUS(delay); 937dfe64dd3Smacallan 938dfe64dd3Smacallan return TRUE; 939dfe64dd3Smacallan} 940dfe64dd3Smacallan 941dfe64dd3Smacallan 942dfe64dd3Smacallan/*^^* 943dfe64dd3Smacallan * Function: Start 944dfe64dd3Smacallan * 945dfe64dd3Smacallan * Purpose: To start a transfer on the I2C bus. 946dfe64dd3Smacallan * 947dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated with 948dfe64dd3Smacallan * lpI2C_ContextData being accessed 949dfe64dd3Smacallan * 950dfe64dd3Smacallan * Outputs: void. 951dfe64dd3Smacallan *^^*/ 952dfe64dd3SmacallanBOOLEAN Start( PXGI_HW_DEVICE_INFO pHWDE) 953dfe64dd3Smacallan{ 954dfe64dd3Smacallan ULONG i, delay, delay2; 955dfe64dd3Smacallan 956dfe64dd3Smacallan delay = pHWDE->I2CDelay / 10 / 2; 957dfe64dd3Smacallan 958dfe64dd3Smacallan vWriteDataLine(pHWDE, HIDAT); 959dfe64dd3Smacallan I2C_DelayUS(delay); 960dfe64dd3Smacallan if (bReadDataLine(pHWDE) != HIDAT) { 961dfe64dd3Smacallan delay2 = delay * 2; 962dfe64dd3Smacallan i = 0; 963dfe64dd3Smacallan do { 964dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 965dfe64dd3Smacallan vWriteDataLine(pHWDE, HIDAT); 966dfe64dd3Smacallan I2C_DelayUS(delay2); 967dfe64dd3Smacallan if (bReadDataLine(pHWDE) == HIDAT) break; 968dfe64dd3Smacallan i++; 969dfe64dd3Smacallan delay2 *= 2; 970dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 971dfe64dd3Smacallan } while (1); 972dfe64dd3Smacallan } 973dfe64dd3Smacallan 974dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 975dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 976dfe64dd3Smacallan I2C_DelayUS(delay); 977dfe64dd3Smacallan if (bReadClockLine(pHWDE) != HICLK) { 978dfe64dd3Smacallan delay2 = delay * 2; 979dfe64dd3Smacallan i = 0; 980dfe64dd3Smacallan do { 981dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 982dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 983dfe64dd3Smacallan I2C_DelayUS(delay2); 984dfe64dd3Smacallan if (bReadClockLine(pHWDE) == HICLK) break; 985dfe64dd3Smacallan i++; 986dfe64dd3Smacallan delay2 *= 2; 987dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 988dfe64dd3Smacallan } while (1); 989dfe64dd3Smacallan } 990dfe64dd3Smacallan 991dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 992dfe64dd3Smacallan vWriteDataLine(pHWDE, LODAT); 993dfe64dd3Smacallan I2C_DelayUS(delay); 994dfe64dd3Smacallan 995dfe64dd3Smacallan vWriteClockLine(pHWDE, LOCLK); 996dfe64dd3Smacallan I2C_DelayUS(delay); 997dfe64dd3Smacallan 998dfe64dd3Smacallan return TRUE; 999dfe64dd3Smacallan}/* end of Start */ 1000dfe64dd3Smacallan 1001dfe64dd3Smacallan/*^^* 1002dfe64dd3Smacallan * Function: Stop 1003dfe64dd3Smacallan * 1004dfe64dd3Smacallan * Purpose: To stop a transfer on the I2C bus. 1005dfe64dd3Smacallan * 1006dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated with 1007dfe64dd3Smacallan * lpI2C_ContextData being accessed 1008dfe64dd3Smacallan * 1009dfe64dd3Smacallan * Outputs: void. 1010dfe64dd3Smacallan *^^*/ 1011dfe64dd3SmacallanBOOLEAN Stop(PXGI_HW_DEVICE_INFO pHWDE) 1012dfe64dd3Smacallan{ 1013dfe64dd3Smacallan ULONG i, delay, delay2; 1014dfe64dd3Smacallan 1015dfe64dd3Smacallan delay = pHWDE->I2CDelay / 10 / 2; 1016dfe64dd3Smacallan PDEBUGI2C(ErrorF("Stop()-begin-pHWDE->I2CDelay=%d, delay=%d...\n", pHWDE->I2CDelay, delay)); 1017dfe64dd3Smacallan 1018dfe64dd3Smacallan vWriteDataLine(pHWDE, LODAT); 1019dfe64dd3Smacallan I2C_DelayUS(delay); 1020dfe64dd3Smacallan 1021dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 1022dfe64dd3Smacallan I2C_DelayUS(delay); 1023dfe64dd3Smacallan if (bReadClockLine(pHWDE) != HICLK) { 1024dfe64dd3Smacallan i = 0; 1025dfe64dd3Smacallan delay2 = delay * 2; 1026dfe64dd3Smacallan do { 1027dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 1028dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 1029dfe64dd3Smacallan I2C_DelayUS(delay2); 1030dfe64dd3Smacallan if (bReadClockLine(pHWDE) == HICLK) break; 1031dfe64dd3Smacallan i++; 1032dfe64dd3Smacallan delay2 *= 2; 1033dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 1034dfe64dd3Smacallan } while (1); 1035dfe64dd3Smacallan } 1036dfe64dd3Smacallan 1037dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 1038dfe64dd3Smacallan vWriteDataLine(pHWDE, HIDAT); 1039dfe64dd3Smacallan I2C_DelayUS(delay); 1040dfe64dd3Smacallan 1041dfe64dd3Smacallan return (BOOLEAN)(bReadDataLine(pHWDE) == HIDAT); 1042dfe64dd3Smacallan}/* end of Stop*/ 1043dfe64dd3Smacallan 1044dfe64dd3Smacallan/*^^* 1045dfe64dd3Smacallan * Function: WriteUCHARI2C 1046dfe64dd3Smacallan * 1047dfe64dd3Smacallan * Purpose: To write a UCHAR of data to the I2C bus. 1048dfe64dd3Smacallan * 1049dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated with 1050dfe64dd3Smacallan * lpI2C_ContextData being accessed 1051dfe64dd3Smacallan * cData: UCHAR, the data to write 1052dfe64dd3Smacallan * 1053dfe64dd3Smacallan * Outputs: void. 1054dfe64dd3Smacallan *^^*/ 1055dfe64dd3SmacallanBOOLEAN WriteUCHARI2C(PXGI_HW_DEVICE_INFO pHWDE, UCHAR cData) 1056dfe64dd3Smacallan{ 1057dfe64dd3Smacallan ULONG i, j, delay, delay2; 1058dfe64dd3Smacallan 1059dfe64dd3Smacallan cData = ReverseUCHAR(cData); 1060dfe64dd3Smacallan 1061dfe64dd3Smacallan delay = pHWDE->I2CDelay / 10 / 2; 1062dfe64dd3Smacallan 1063dfe64dd3Smacallan for (j=0; j<8; j++, cData>>=1) 1064dfe64dd3Smacallan { 1065dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 1066dfe64dd3Smacallan vWriteDataLine(pHWDE, cData); 1067dfe64dd3Smacallan I2C_DelayUS(delay); 1068dfe64dd3Smacallan 1069dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 1070dfe64dd3Smacallan I2C_DelayUS(delay); 1071dfe64dd3Smacallan if (bReadClockLine(pHWDE) != HICLK) { 1072dfe64dd3Smacallan i = 0; 1073dfe64dd3Smacallan delay2 = delay * 2; 1074dfe64dd3Smacallan do { 1075dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 1076dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 1077dfe64dd3Smacallan I2C_DelayUS(delay2); 1078dfe64dd3Smacallan if (bReadClockLine(pHWDE) == HICLK) break; 1079dfe64dd3Smacallan i++; 1080dfe64dd3Smacallan delay2 *= 2; 1081dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 1082dfe64dd3Smacallan } while (1); 1083dfe64dd3Smacallan } 1084dfe64dd3Smacallan 1085dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 1086dfe64dd3Smacallan vWriteClockLine(pHWDE, LOCLK); 1087dfe64dd3Smacallan I2C_DelayUS(delay); 1088dfe64dd3Smacallan } 1089dfe64dd3Smacallan return TRUE; 1090dfe64dd3Smacallan}/* end of WriteUCHARI2C */ 1091dfe64dd3Smacallan 1092dfe64dd3Smacallan/*^^* 1093dfe64dd3Smacallan * Function: ReadUCHARI2C 1094dfe64dd3Smacallan * 1095dfe64dd3Smacallan * Purpose: To read a UCHAR of data from the I2C bus. 1096dfe64dd3Smacallan * 1097dfe64dd3Smacallan * Inputs: lpI2C_ContextData : PI2C_CONTEXT, pointer to data struct associated with 1098dfe64dd3Smacallan * lpI2C_ContextData being accessed 1099dfe64dd3Smacallan * 1100dfe64dd3Smacallan * Outputs: UCHAR, the data that was read. 1101dfe64dd3Smacallan *^^*/ 1102dfe64dd3SmacallanBOOLEAN ReadUCHARI2C(PXGI_HW_DEVICE_INFO pHWDE, PUCHAR pBuffer) 1103dfe64dd3Smacallan{ 1104dfe64dd3Smacallan ULONG ulReadData, data, i, j, delay, delay2; 1105dfe64dd3Smacallan 1106dfe64dd3Smacallan delay = pHWDE->I2CDelay / 10 / 2; 1107dfe64dd3Smacallan 1108dfe64dd3Smacallan vWriteDataLine(pHWDE, HIDAT); 1109dfe64dd3Smacallan I2C_DelayUS(delay); 1110dfe64dd3Smacallan 1111dfe64dd3Smacallan ulReadData = 0; 1112dfe64dd3Smacallan for (j = 0; j < 8; j++) 1113dfe64dd3Smacallan { 1114dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 1115dfe64dd3Smacallan I2C_DelayUS(delay); 1116dfe64dd3Smacallan if (bReadClockLine(pHWDE) != HICLK) { 1117dfe64dd3Smacallan i = 0; 1118dfe64dd3Smacallan delay2 = delay * 2; 1119dfe64dd3Smacallan do { 1120dfe64dd3Smacallan I2C_DelayUS(delay2); /* Jong@08052008 */ 1121dfe64dd3Smacallan vWriteClockLine(pHWDE, HICLK); 1122dfe64dd3Smacallan I2C_DelayUS(delay2); 1123dfe64dd3Smacallan if (bReadClockLine(pHWDE) == HICLK) break; 1124dfe64dd3Smacallan i++; 1125dfe64dd3Smacallan delay2 *= 2; 1126dfe64dd3Smacallan if (i >= I2C_RETRY_COUNT) return FALSE; 1127dfe64dd3Smacallan } while (1); 1128dfe64dd3Smacallan } 1129dfe64dd3Smacallan 1130dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 1131dfe64dd3Smacallan data = bReadDataLine(pHWDE); 1132dfe64dd3Smacallan ulReadData = (ulReadData << 1) | (data & 1); 1133dfe64dd3Smacallan 1134dfe64dd3Smacallan I2C_DelayUS(delay); /* Jong@08052008 */ 1135dfe64dd3Smacallan vWriteClockLine(pHWDE, LOCLK); 1136dfe64dd3Smacallan I2C_DelayUS(delay); 1137dfe64dd3Smacallan 1138dfe64dd3Smacallan vWriteDataLine(pHWDE, HIDAT); 1139dfe64dd3Smacallan I2C_DelayUS(delay); 1140dfe64dd3Smacallan } 1141dfe64dd3Smacallan 1142dfe64dd3Smacallan *pBuffer = (UCHAR) ulReadData; 1143dfe64dd3Smacallan return TRUE; 1144dfe64dd3Smacallan} 1145dfe64dd3Smacallan 1146dfe64dd3Smacallan 1147dfe64dd3SmacallanUCHAR ReverseUCHAR(UCHAR data) 1148dfe64dd3Smacallan{ 1149dfe64dd3Smacallan UCHAR rdata = 0; 1150dfe64dd3Smacallan int i; 1151dfe64dd3Smacallan 1152dfe64dd3Smacallan for (i=0; i<8; i++) 1153dfe64dd3Smacallan { 1154dfe64dd3Smacallan rdata <<= 1; 1155dfe64dd3Smacallan rdata |= (data & 1); 1156dfe64dd3Smacallan data >>= 1; 1157dfe64dd3Smacallan } 1158dfe64dd3Smacallan 1159dfe64dd3Smacallan return(rdata); 1160dfe64dd3Smacallan} 1161dfe64dd3Smacallan 1162dfe64dd3Smacallan/************************************************************************************ 1163dfe64dd3Smacallan For DVI I2C Interface 1164dfe64dd3Smacallan***************************************************************************************/ 1165dfe64dd3Smacallan 1166dfe64dd3Smacallan/************************************************************************* 1167dfe64dd3Smacallan// VOID vWriteClockLineDVI() 1168dfe64dd3Smacallan// IOReg xx14, index 0F is defined as follows: 1169dfe64dd3Smacallan// 1170dfe64dd3Smacallan// ... 1 0 1171dfe64dd3Smacallan// --------|------|-------| 1172dfe64dd3Smacallan// ...| Data | Clock | 1173dfe64dd3Smacallan// ------------------------ 1174dfe64dd3Smacallan*************************************************************************/ 1175dfe64dd3SmacallanVOID vWriteClockLineDVI(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1176dfe64dd3Smacallan{ 1177dfe64dd3Smacallan UCHAR temp; 1178dfe64dd3Smacallan PUCHAR pjI2cIOBase; 1179dfe64dd3Smacallan 1180dfe64dd3Smacallan PDEBUGI2C(ErrorF("vWriteClockLineDVI()...begin\n")); 1181dfe64dd3Smacallan 1182dfe64dd3Smacallan if ((pHWDE->jChipType < XG21)&&(pHWDE->jChipType != XG27)) 1183dfe64dd3Smacallan { 1184dfe64dd3Smacallan ErrorF("vWriteClockLineDVI()...0\n"); 1185dfe64dd3Smacallan } 1186dfe64dd3Smacallan else 1187dfe64dd3Smacallan { 1188dfe64dd3Smacallan PDEBUGI2C(ErrorF("vWriteClockLineDVI()...1\n")); 1189dfe64dd3Smacallan pjI2cIOBase = pHWDE->pjIOAddress + CRTC_ADDRESS_PORT_COLOR; 1190dfe64dd3Smacallan 1191dfe64dd3Smacallan /* Enable GPIOA Write */ 1192dfe64dd3Smacallan 1193dfe64dd3Smacallan EnableGPIOA(pjI2cIOBase, I2C_WRITE); 1194dfe64dd3Smacallan 1195dfe64dd3Smacallan PDEBUGI2C(ErrorF("*1 - pHWDE->ucI2cDVI = %d\n", pHWDE->ucI2cDVI)); 1196dfe64dd3Smacallan pHWDE->ucI2cDVI = (pHWDE->ucI2cDVI & MASK(1:1)) | SETBITS(data, 0:0); 1197dfe64dd3Smacallan PDEBUGI2C(ErrorF("*2 - pHWDE->ucI2cDVI = %d\n", pHWDE->ucI2cDVI)); 1198dfe64dd3Smacallan 1199dfe64dd3Smacallan temp = XGI_GetReg(pjI2cIOBase, IND_CR48_GPIO_REG_I); 1200dfe64dd3Smacallan PDEBUGI2C(ErrorF("IND_CR48_GPIO_REG_I = %d\n", temp)); 1201dfe64dd3Smacallan 1202dfe64dd3Smacallan { 1203dfe64dd3Smacallan UCHAR temp2 = getGPIORWTransfer(temp); 1204dfe64dd3Smacallan PDEBUGI2C(ErrorF("temp2 = %d\n", temp2)); 1205dfe64dd3Smacallan temp = temp2; 1206dfe64dd3Smacallan } 1207dfe64dd3Smacallan 1208dfe64dd3Smacallan temp = (temp & (~MASK(1:0))) | pHWDE->ucI2cDVI; 1209dfe64dd3Smacallan PDEBUGI2C(ErrorF("temp= %d\n", temp)); 1210dfe64dd3Smacallan XGI_SetReg(pjI2cIOBase,IND_CR48_GPIO_REG_I, temp); 1211dfe64dd3Smacallan } 1212dfe64dd3Smacallan 1213dfe64dd3Smacallan PDEBUGI2C(ErrorF("vWriteClockLineDVI()...end\n")); 1214dfe64dd3Smacallan} 1215dfe64dd3Smacallan 1216dfe64dd3Smacallan/************************************************************************* 1217dfe64dd3Smacallan// VOID vWriteDataLineDVI() 1218dfe64dd3Smacallan// IOReg xx14, index 0F is defined as follows: 1219dfe64dd3Smacallan// 1220dfe64dd3Smacallan// ... 1 0 1221dfe64dd3Smacallan// --------|------|-------| 1222dfe64dd3Smacallan// ...| Data | Clock | 1223dfe64dd3Smacallan// ------------------------ 1224dfe64dd3Smacallan*************************************************************************/ 1225dfe64dd3SmacallanVOID vWriteDataLineDVI(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1226dfe64dd3Smacallan{ 1227dfe64dd3Smacallan UCHAR temp; 1228dfe64dd3Smacallan PUCHAR pjI2cIOBase; 1229dfe64dd3Smacallan 1230dfe64dd3Smacallan PDEBUGI2C(ErrorF("vWriteDataLineDVI()...begin\n")); 1231dfe64dd3Smacallan 1232dfe64dd3Smacallan if ((pHWDE->jChipType < XG21)&&(pHWDE->jChipType != XG27)) 1233dfe64dd3Smacallan { 1234dfe64dd3Smacallan ErrorF("vWriteDataLineDVI()...0\n"); 1235dfe64dd3Smacallan } 1236dfe64dd3Smacallan else 1237dfe64dd3Smacallan { 1238dfe64dd3Smacallan PDEBUGI2C(ErrorF("vWriteDataLineDVI()...1\n")); 1239dfe64dd3Smacallan pjI2cIOBase = pHWDE->pjIOAddress + CRTC_ADDRESS_PORT_COLOR; 1240dfe64dd3Smacallan 1241dfe64dd3Smacallan 1242dfe64dd3Smacallan /* Enable GPIOB Write */ 1243dfe64dd3Smacallan 1244dfe64dd3Smacallan EnableGPIOB(pjI2cIOBase, I2C_WRITE); 1245dfe64dd3Smacallan 1246dfe64dd3Smacallan PDEBUGI2C(ErrorF("*1 - pHWDE->ucI2cDVI = %d\n", pHWDE->ucI2cDVI)); 1247dfe64dd3Smacallan pHWDE->ucI2cDVI = (pHWDE->ucI2cDVI & MASK(0:0)) | SETBITS(data, 1:1); 1248dfe64dd3Smacallan PDEBUGI2C(ErrorF("*2 - pHWDE->ucI2cDVI = %d\n", pHWDE->ucI2cDVI)); 1249dfe64dd3Smacallan 1250dfe64dd3Smacallan temp = XGI_GetReg(pjI2cIOBase, IND_CR48_GPIO_REG_I); 1251dfe64dd3Smacallan PDEBUGI2C(ErrorF("IND_CR48_GPIO_REG_I = %d\n", temp)); 1252dfe64dd3Smacallan 1253dfe64dd3Smacallan { 1254dfe64dd3Smacallan UCHAR temp2 = getGPIORWTransfer(temp); 1255dfe64dd3Smacallan PDEBUGI2C(ErrorF("temp2 = %d\n", temp2)); 1256dfe64dd3Smacallan 1257dfe64dd3Smacallan temp = temp2; 1258dfe64dd3Smacallan } 1259dfe64dd3Smacallan 1260dfe64dd3Smacallan temp = (temp & (~MASK(1:0))) | pHWDE->ucI2cDVI; 1261dfe64dd3Smacallan PDEBUGI2C(ErrorF("temp = %d\n", temp)); 1262dfe64dd3Smacallan 1263dfe64dd3Smacallan XGI_SetReg(pjI2cIOBase,IND_CR48_GPIO_REG_I, temp); 1264dfe64dd3Smacallan } 1265dfe64dd3Smacallan 1266dfe64dd3Smacallan PDEBUGI2C(ErrorF("vWriteDataLineDVI()...end\n")); 1267dfe64dd3Smacallan} 1268dfe64dd3Smacallan 1269dfe64dd3Smacallan/************************************************************************* 1270dfe64dd3Smacallan// BOOLEAN bReadClockLineDVI() 1271dfe64dd3Smacallan// IOReg xx14, index 0F is defined as follows: 1272dfe64dd3Smacallan// 1273dfe64dd3Smacallan// ... 1 0 1274dfe64dd3Smacallan// --------|------|-------| 1275dfe64dd3Smacallan// ...| Data | Clock | 1276dfe64dd3Smacallan// ------------------------ 1277dfe64dd3Smacallan*************************************************************************/ 1278dfe64dd3SmacallanBOOLEAN bReadClockLineDVI(PXGI_HW_DEVICE_INFO pHWDE) 1279dfe64dd3Smacallan{ 1280dfe64dd3Smacallan UCHAR cPortData; 1281dfe64dd3Smacallan PUCHAR pjI2cIOBase; 1282dfe64dd3Smacallan 1283dfe64dd3Smacallan PDEBUGI2C(ErrorF("bReadClockLineDVI()...begin\n")); 1284dfe64dd3Smacallan 1285dfe64dd3Smacallan if ((pHWDE->jChipType != XG21)&&(pHWDE->jChipType != XG27)) 1286dfe64dd3Smacallan { 1287dfe64dd3Smacallan ErrorF("bReadClockLineDVI()...0\n"); 1288dfe64dd3Smacallan } 1289dfe64dd3Smacallan else 1290dfe64dd3Smacallan { 1291dfe64dd3Smacallan PDEBUGI2C(ErrorF("bReadClockLineDVI()...1\n")); 1292dfe64dd3Smacallan pjI2cIOBase = pHWDE->pjIOAddress + CRTC_ADDRESS_PORT_COLOR; 1293dfe64dd3Smacallan 1294dfe64dd3Smacallan /* Enable GPIOA READ */ 1295dfe64dd3Smacallan 1296dfe64dd3Smacallan EnableGPIOA(pjI2cIOBase, I2C_READ); 1297dfe64dd3Smacallan 1298dfe64dd3Smacallan cPortData = XGI_GetReg(pjI2cIOBase, IND_CR48_GPIO_REG_I); 1299dfe64dd3Smacallan PDEBUGI2C(ErrorF("*1 - cPortData = %d...\n", cPortData)); 1300dfe64dd3Smacallan 1301dfe64dd3Smacallan cPortData = GETBITS(cPortData, 7:7); 1302dfe64dd3Smacallan PDEBUGI2C(ErrorF("*2 - cPortData = %d...\n", cPortData)); 1303dfe64dd3Smacallan } 1304dfe64dd3Smacallan 1305dfe64dd3Smacallan PDEBUGI2C(ErrorF("bReadClockLineDVI()...return(cPortData=%d)\n", cPortData)); 1306dfe64dd3Smacallan return cPortData; 1307dfe64dd3Smacallan} 1308dfe64dd3Smacallan 1309dfe64dd3Smacallan/************************************************************************* 1310dfe64dd3Smacallan// BOOLEAN bReadDataLineDVI() 1311dfe64dd3Smacallan// IOReg xx14, index 0F is defined as follows: 1312dfe64dd3Smacallan// 1313dfe64dd3Smacallan// ... 1 0 1314dfe64dd3Smacallan// --------|------|-------| 1315dfe64dd3Smacallan// ...| Data | Clock | 1316dfe64dd3Smacallan// ------------------------ 1317dfe64dd3Smacallan*************************************************************************/ 1318dfe64dd3SmacallanBOOLEAN bReadDataLineDVI(PXGI_HW_DEVICE_INFO pHWDE) 1319dfe64dd3Smacallan{ 1320dfe64dd3Smacallan UCHAR cPortData; 1321dfe64dd3Smacallan PUCHAR pjI2cIOBase; 1322dfe64dd3Smacallan 1323dfe64dd3Smacallan PDEBUGI2C(ErrorF("bReadDataLineDVI()...begin\n")); 1324dfe64dd3Smacallan 1325dfe64dd3Smacallan if ((pHWDE->jChipType != XG21)&&(pHWDE->jChipType != XG27)) 1326dfe64dd3Smacallan { 1327dfe64dd3Smacallan ErrorF("bReadDataLineDVI()...0\n"); 1328dfe64dd3Smacallan } 1329dfe64dd3Smacallan else 1330dfe64dd3Smacallan { 1331dfe64dd3Smacallan PDEBUGI2C(ErrorF("bReadDataLineDVI()...1\n")); 1332dfe64dd3Smacallan pjI2cIOBase = pHWDE->pjIOAddress + CRTC_ADDRESS_PORT_COLOR; 1333dfe64dd3Smacallan 1334dfe64dd3Smacallan 1335dfe64dd3Smacallan /* Enable GPIOB Write */ 1336dfe64dd3Smacallan 1337dfe64dd3Smacallan EnableGPIOB(pjI2cIOBase, I2C_READ); 1338dfe64dd3Smacallan 1339dfe64dd3Smacallan cPortData = XGI_GetReg(pjI2cIOBase, IND_CR48_GPIO_REG_I); 1340dfe64dd3Smacallan PDEBUGI2C(ErrorF("*1 - cPortData = %d...\n", cPortData)); 1341dfe64dd3Smacallan cPortData = GETBITS(cPortData, 6:6); 1342dfe64dd3Smacallan PDEBUGI2C(ErrorF("*2 - cPortData = %d...\n", cPortData)); 1343dfe64dd3Smacallan } 1344dfe64dd3Smacallan 1345dfe64dd3Smacallan 1346dfe64dd3Smacallan PDEBUGI2C(ErrorF("bReadDataLineDVI()...return(cPortData=%d)\n", cPortData)); 1347dfe64dd3Smacallan return cPortData; 1348dfe64dd3Smacallan} 1349dfe64dd3Smacallan 1350dfe64dd3Smacallan//*************************************************************************// 1351dfe64dd3Smacallan// VOID vWaitForCRT1VsyncActive() 1352dfe64dd3Smacallan// IoReg 3DA 1353dfe64dd3Smacallan// ... 3 ... 1354dfe64dd3Smacallan// --------|--------------|-------| 1355dfe64dd3Smacallan// ...| Vertical Sync| | 1356dfe64dd3Smacallan// -------------------------------- 1357dfe64dd3Smacallan//*************************************************************************// 1358dfe64dd3SmacallanVOID vWaitForCRT1HsyncActive(PXGI_HW_DEVICE_INFO pHWDE) 1359dfe64dd3Smacallan{ 1360dfe64dd3Smacallan PUCHAR pjPort = pHWDE->pjIOAddress + INPUT_STATUS_1_COLOR; 1361dfe64dd3Smacallan ULONG i; 1362dfe64dd3Smacallan 1363dfe64dd3Smacallan for (i = 0; i < 0x00FFFF; i++) 1364dfe64dd3Smacallan { 1365dfe64dd3Smacallan if ( (XGI_GetRegByte(pjPort) & 0x01) == 0) 1366dfe64dd3Smacallan { 1367dfe64dd3Smacallan // Inactive 1368dfe64dd3Smacallan break; 1369dfe64dd3Smacallan } //if 1370dfe64dd3Smacallan } //for-loop 1371dfe64dd3Smacallan 1372dfe64dd3Smacallan for (i = 0; i < 0x00FFFF; i++) 1373dfe64dd3Smacallan { 1374dfe64dd3Smacallan if ( (XGI_GetRegByte(pjPort) & 0x01) != 0) 1375dfe64dd3Smacallan { 1376dfe64dd3Smacallan // active 1377dfe64dd3Smacallan break; 1378dfe64dd3Smacallan } //if 1379dfe64dd3Smacallan } //for-loop 1380dfe64dd3Smacallan 1381dfe64dd3Smacallan} //vWaitForCRT1HsyncActive() 1382dfe64dd3Smacallan 1383dfe64dd3Smacallan//////////////////////////////////////////////////////////////////////////////////// 1384dfe64dd3Smacallan// 1385dfe64dd3Smacallan// For CRT I2C Interface 1386dfe64dd3Smacallan// 1387dfe64dd3Smacallan//////////////////////////////////////////////////////////////////////////////////// 1388dfe64dd3Smacallan 1389dfe64dd3Smacallan//*************************************************************************// 1390dfe64dd3Smacallan// VOID vWriteClockLineCRT() 1391dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1392dfe64dd3Smacallan// 1393dfe64dd3Smacallan// ... 1 0 1394dfe64dd3Smacallan// --------|------|-------| 1395dfe64dd3Smacallan// ...| Data | Clock | 1396dfe64dd3Smacallan// ------------------------ 1397dfe64dd3Smacallan//*************************************************************************// 1398dfe64dd3SmacallanVOID vWriteClockLineCRT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1399dfe64dd3Smacallan{ 1400dfe64dd3Smacallan UCHAR temp, ujSR1F; 1401dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1402dfe64dd3Smacallan 1403dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Write CRT clock = %x\n", data & 1)); 1404dfe64dd3Smacallan 1405dfe64dd3Smacallan ujSR1F = XGI_GetReg(pjI2cIOBase, IND_SR1F_POWER_MANAGEMENT); 1406dfe64dd3Smacallan 1407dfe64dd3Smacallan pHWDE->ucI2cCRT = (pHWDE->ucI2cCRT & MASK(1:1)) | SETBITS(data, 0:0); 1408dfe64dd3Smacallan 1409dfe64dd3Smacallan temp = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1410dfe64dd3Smacallan temp = (temp & (~MASK(1:0))) | pHWDE->ucI2cCRT; 1411dfe64dd3Smacallan 1412dfe64dd3Smacallan //wait for CRT1 retrace only when CRT1 is enabled! 1413dfe64dd3Smacallan /* if (pHWDE->bMonitorPoweredOn) */ /* jong@08042009; ignore here */ 1414dfe64dd3Smacallan { 1415dfe64dd3Smacallan if(!(data & 1) && ((ujSR1F & 0xC0)==0) ) 1416dfe64dd3Smacallan { 1417dfe64dd3Smacallan vWaitForCRT1HsyncActive(pHWDE); 1418dfe64dd3Smacallan } 1419dfe64dd3Smacallan } 1420dfe64dd3Smacallan 1421dfe64dd3Smacallan XGI_SetReg(pjI2cIOBase, IND_SR11_DDC_REG, temp); 1422dfe64dd3Smacallan} 1423dfe64dd3Smacallan 1424dfe64dd3Smacallan//*************************************************************************// 1425dfe64dd3Smacallan// VOID vWriteDataLineCRT() 1426dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1427dfe64dd3Smacallan// 1428dfe64dd3Smacallan// ... 1 0 1429dfe64dd3Smacallan// --------|------|-------| 1430dfe64dd3Smacallan// ...| Data | Clock | 1431dfe64dd3Smacallan// ------------------------ 1432dfe64dd3Smacallan//*************************************************************************// 1433dfe64dd3SmacallanVOID vWriteDataLineCRT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1434dfe64dd3Smacallan{ 1435dfe64dd3Smacallan UCHAR temp, ujSR1F; 1436dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1437dfe64dd3Smacallan 1438dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Write CRT data = %x\n", data & 1)); 1439dfe64dd3Smacallan 1440dfe64dd3Smacallan ujSR1F = XGI_GetReg(pHWDE->pjIOAddress + SEQ_ADDRESS_PORT, IND_SR1F_POWER_MANAGEMENT); 1441dfe64dd3Smacallan 1442dfe64dd3Smacallan pHWDE->ucI2cCRT = (pHWDE->ucI2cCRT & MASK(0:0)) | SETBITS(data, 1:1); 1443dfe64dd3Smacallan temp = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1444dfe64dd3Smacallan temp = (temp & (~MASK(1:0))) | pHWDE->ucI2cCRT; 1445dfe64dd3Smacallan 1446dfe64dd3Smacallan //wait for CRT1 retrace only when CRT1 is enabled! 1447dfe64dd3Smacallan /* if (pHWDE->bMonitorPoweredOn) */ /* Jong@08042009; ignore checking */ 1448dfe64dd3Smacallan { 1449dfe64dd3Smacallan if(!(data & 1) && ((ujSR1F & 0xC0)==0) ) 1450dfe64dd3Smacallan { 1451dfe64dd3Smacallan vWaitForCRT1HsyncActive(pHWDE); 1452dfe64dd3Smacallan } 1453dfe64dd3Smacallan } 1454dfe64dd3Smacallan 1455dfe64dd3Smacallan XGI_SetReg(pjI2cIOBase, IND_SR11_DDC_REG, temp); 1456dfe64dd3Smacallan} 1457dfe64dd3Smacallan 1458dfe64dd3Smacallan//*************************************************************************// 1459dfe64dd3Smacallan// BOOLEAN bReadClockLineCRT() 1460dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1461dfe64dd3Smacallan// 1462dfe64dd3Smacallan// ... 1 0 1463dfe64dd3Smacallan// --------|------|-------| 1464dfe64dd3Smacallan// ...| Data | Clock | 1465dfe64dd3Smacallan// ------------------------ 1466dfe64dd3Smacallan//*************************************************************************// 1467dfe64dd3SmacallanBOOLEAN bReadClockLineCRT(PXGI_HW_DEVICE_INFO pHWDE) 1468dfe64dd3Smacallan{ 1469dfe64dd3Smacallan UCHAR cPortData; 1470dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1471dfe64dd3Smacallan 1472dfe64dd3Smacallan cPortData = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1473dfe64dd3Smacallan cPortData = GETBITS(cPortData, 0:0); 1474dfe64dd3Smacallan 1475dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Read Channel CRT clock = %x\n", cPortData)); 1476dfe64dd3Smacallan 1477dfe64dd3Smacallan return cPortData; 1478dfe64dd3Smacallan} 1479dfe64dd3Smacallan 1480dfe64dd3Smacallan//*************************************************************************// 1481dfe64dd3Smacallan// BOOLEAN bReadDataLineCRT() 1482dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1483dfe64dd3Smacallan// 1484dfe64dd3Smacallan// ... 1 0 1485dfe64dd3Smacallan// --------|------|-------| 1486dfe64dd3Smacallan// ...| Data | Clock | 1487dfe64dd3Smacallan// ------------------------ 1488dfe64dd3Smacallan//*************************************************************************// 1489dfe64dd3SmacallanBOOLEAN bReadDataLineCRT(PXGI_HW_DEVICE_INFO pHWDE) 1490dfe64dd3Smacallan{ 1491dfe64dd3Smacallan UCHAR cPortData; 1492dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1493dfe64dd3Smacallan 1494dfe64dd3Smacallan cPortData = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1495dfe64dd3Smacallan cPortData = GETBITS(cPortData, 1:1); 1496dfe64dd3Smacallan 1497dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Read Channel CRT data = %x\n", cPortData)); 1498dfe64dd3Smacallan 1499dfe64dd3Smacallan return cPortData; 1500dfe64dd3Smacallan} 1501dfe64dd3Smacallan 1502dfe64dd3Smacallan//////////////////////////////////////////////////////////////////////////////////// 1503dfe64dd3Smacallan// 1504dfe64dd3Smacallan// For Feature Connector I2C Interface 1505dfe64dd3Smacallan// 1506dfe64dd3Smacallan//////////////////////////////////////////////////////////////////////////////////// 1507dfe64dd3Smacallan 1508dfe64dd3Smacallan//*************************************************************************// 1509dfe64dd3Smacallan// VOID vWriteClockLineFCNT() 1510dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1511dfe64dd3Smacallan// 1512dfe64dd3Smacallan// ... 3 2 ... 1513dfe64dd3Smacallan// --------|------|-------|-------| 1514dfe64dd3Smacallan// ...| Data | Clock | | 1515dfe64dd3Smacallan// -------------------------------- 1516dfe64dd3Smacallan//*************************************************************************// 1517dfe64dd3SmacallanVOID vWriteClockLineFCNT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1518dfe64dd3Smacallan{ 1519dfe64dd3Smacallan UCHAR temp; 1520dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1521dfe64dd3Smacallan 1522dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Write FCNT clock = %x\n", data & 1)); 1523dfe64dd3Smacallan 1524dfe64dd3Smacallan pHWDE->ucI2cFCNT = (pHWDE->ucI2cFCNT & MASK(3:3)) | SETBITS(data, 2:2); 1525dfe64dd3Smacallan 1526dfe64dd3Smacallan temp = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1527dfe64dd3Smacallan temp = (temp & (~MASK(3:2))) | pHWDE->ucI2cFCNT; 1528dfe64dd3Smacallan 1529dfe64dd3Smacallan XGI_SetReg(pjI2cIOBase, IND_SR11_DDC_REG, temp); 1530dfe64dd3Smacallan} 1531dfe64dd3Smacallan 1532dfe64dd3Smacallan//*************************************************************************// 1533dfe64dd3Smacallan// VOID vWriteDataLineFCNT() 1534dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1535dfe64dd3Smacallan// 1536dfe64dd3Smacallan// ... 3 2 ... 1537dfe64dd3Smacallan// --------|------|-------|-------| 1538dfe64dd3Smacallan// ...| Data | Clock | | 1539dfe64dd3Smacallan// -------------------------------- 1540dfe64dd3Smacallan//*************************************************************************// 1541dfe64dd3SmacallanVOID vWriteDataLineFCNT(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1542dfe64dd3Smacallan{ 1543dfe64dd3Smacallan UCHAR temp, temp2, temp3; 1544dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1545dfe64dd3Smacallan 1546dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Write FCNT data = %x\n", data & 1)); 1547dfe64dd3Smacallan 1548dfe64dd3Smacallan pHWDE->ucI2cFCNT = (pHWDE->ucI2cFCNT & MASK(2:2)) | SETBITS(data, 3:3); 1549dfe64dd3Smacallan 1550dfe64dd3Smacallan temp = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1551dfe64dd3Smacallan temp = (temp & (~MASK(3:2))) | pHWDE->ucI2cFCNT; 1552dfe64dd3Smacallan 1553dfe64dd3Smacallan XGI_SetReg(pjI2cIOBase, IND_SR11_DDC_REG, temp); 1554dfe64dd3Smacallan} 1555dfe64dd3Smacallan 1556dfe64dd3Smacallan//*************************************************************************// 1557dfe64dd3Smacallan// BOOLEAN bReadClockLineFCNT() 1558dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1559dfe64dd3Smacallan// 1560dfe64dd3Smacallan// ... 3 2 ... 1561dfe64dd3Smacallan// --------|------|-------|-------| 1562dfe64dd3Smacallan// ...| Data | Clock | | 1563dfe64dd3Smacallan// -------------------------------- 1564dfe64dd3Smacallan//*************************************************************************// 1565dfe64dd3SmacallanBOOLEAN bReadClockLineFCNT(PXGI_HW_DEVICE_INFO pHWDE) 1566dfe64dd3Smacallan{ 1567dfe64dd3Smacallan UCHAR cPortData; 1568dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1569dfe64dd3Smacallan 1570dfe64dd3Smacallan cPortData = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1571dfe64dd3Smacallan cPortData = GETBITS(cPortData, 2:2); 1572dfe64dd3Smacallan 1573dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Read Channel FCNT clock = %x\n", cPortData)); 1574dfe64dd3Smacallan 1575dfe64dd3Smacallan return cPortData; 1576dfe64dd3Smacallan} 1577dfe64dd3Smacallan 1578dfe64dd3Smacallan//*************************************************************************// 1579dfe64dd3Smacallan// BOOLEAN bReadDataLineFCNT() 1580dfe64dd3Smacallan// IOReg SR11 is defined as follows: 1581dfe64dd3Smacallan// 1582dfe64dd3Smacallan// ... 3 2 ... 1583dfe64dd3Smacallan// --------|------|-------|-------| 1584dfe64dd3Smacallan// ...| Data | Clock | | 1585dfe64dd3Smacallan// -------------------------------- 1586dfe64dd3Smacallan//*************************************************************************// 1587dfe64dd3SmacallanBOOLEAN bReadDataLineFCNT(PXGI_HW_DEVICE_INFO pHWDE) 1588dfe64dd3Smacallan{ 1589dfe64dd3Smacallan UCHAR cPortData; 1590dfe64dd3Smacallan PUCHAR pjI2cIOBase = pHWDE->pjIOAddress + SEQ_ADDRESS_PORT; 1591dfe64dd3Smacallan 1592dfe64dd3Smacallan cPortData = XGI_GetReg(pjI2cIOBase, IND_SR11_DDC_REG); 1593dfe64dd3Smacallan cPortData = GETBITS(cPortData, 3:3); 1594dfe64dd3Smacallan 1595dfe64dd3Smacallan PDEBUGI2C(ErrorF("I2C:Read Channel FCNT data = %x\n", cPortData)); 1596dfe64dd3Smacallan 1597dfe64dd3Smacallan return cPortData; 1598dfe64dd3Smacallan} 1599dfe64dd3Smacallan 1600dfe64dd3Smacallan/*=======================================================*/ 1601dfe64dd3SmacallanVOID vWriteClockLine(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1602dfe64dd3Smacallan{ 1603dfe64dd3Smacallan if(pHWDE->crtno == 0) 1604dfe64dd3Smacallan vWriteClockLineCRT(pHWDE, data); 1605dfe64dd3Smacallan else if(pHWDE->crtno == 1) 1606dfe64dd3Smacallan vWriteClockLineDVI(pHWDE, data); 1607dfe64dd3Smacallan else if(pHWDE->crtno == 2) 1608dfe64dd3Smacallan vWriteClockLineFCNT(pHWDE, data); 1609dfe64dd3Smacallan else 1610dfe64dd3Smacallan ErrorF("Error(XGI) : Unkonwn output device! \n"); 1611dfe64dd3Smacallan} 1612dfe64dd3Smacallan 1613dfe64dd3SmacallanVOID vWriteDataLine(PXGI_HW_DEVICE_INFO pHWDE, UCHAR data) 1614dfe64dd3Smacallan{ 1615dfe64dd3Smacallan if(pHWDE->crtno == 0) 1616dfe64dd3Smacallan vWriteDataLineCRT(pHWDE, data); 1617dfe64dd3Smacallan else if(pHWDE->crtno == 1) 1618dfe64dd3Smacallan vWriteDataLineDVI(pHWDE, data); 1619dfe64dd3Smacallan else if(pHWDE->crtno == 2) 1620dfe64dd3Smacallan vWriteDataLineFCNT(pHWDE, data); 1621dfe64dd3Smacallan else 1622dfe64dd3Smacallan ErrorF("Error(XGI) : Unkonwn output device! \n"); 1623dfe64dd3Smacallan} 1624dfe64dd3Smacallan 1625dfe64dd3SmacallanBOOLEAN bReadClockLine(PXGI_HW_DEVICE_INFO pHWDE) 1626dfe64dd3Smacallan{ 1627dfe64dd3Smacallan if(pHWDE->crtno == 0) 1628dfe64dd3Smacallan return(bReadClockLineCRT(pHWDE)); 1629dfe64dd3Smacallan else if(pHWDE->crtno == 1) 1630dfe64dd3Smacallan return(bReadClockLineDVI(pHWDE)); 1631dfe64dd3Smacallan else if(pHWDE->crtno == 2) 1632dfe64dd3Smacallan return(bReadClockLineFCNT(pHWDE)); 1633dfe64dd3Smacallan else 1634dfe64dd3Smacallan ErrorF("Error(XGI) : Unkonwn output device! \n"); 1635dfe64dd3Smacallan} 1636dfe64dd3Smacallan 1637dfe64dd3SmacallanBOOLEAN bReadDataLine(PXGI_HW_DEVICE_INFO pHWDE) 1638dfe64dd3Smacallan{ 1639dfe64dd3Smacallan if(pHWDE->crtno == 0) 1640dfe64dd3Smacallan return(bReadDataLineCRT(pHWDE)); 1641dfe64dd3Smacallan else if(pHWDE->crtno == 1) 1642dfe64dd3Smacallan return(bReadDataLineDVI(pHWDE)); 1643dfe64dd3Smacallan else if(pHWDE->crtno == 2) 1644dfe64dd3Smacallan return(bReadDataLineFCNT(pHWDE)); 1645dfe64dd3Smacallan else 1646dfe64dd3Smacallan ErrorF("Error(XGI) : Unkonwn output device! \n"); 1647dfe64dd3Smacallan} 1648dfe64dd3Smacallan 1649dfe64dd3SmacallanBOOLEAN bEDIDCheckSum(PUCHAR pjEDIDBuf,ULONG ulBufSize) 1650dfe64dd3Smacallan{ 1651dfe64dd3Smacallan ULONG i; 1652dfe64dd3Smacallan UCHAR ujSum = 0; 1653dfe64dd3Smacallan PUCHAR pujPtr; 1654dfe64dd3Smacallan 1655dfe64dd3Smacallan pujPtr = pjEDIDBuf; 1656dfe64dd3Smacallan 1657dfe64dd3Smacallan for (i = 0; i < ulBufSize; i++) 1658dfe64dd3Smacallan { 1659dfe64dd3Smacallan /* printk("pujPtr=%x, ",*pujPtr); */ 1660dfe64dd3Smacallan ujSum += *(pujPtr++); 1661dfe64dd3Smacallan } /*for-loop */ 1662dfe64dd3Smacallan 1663dfe64dd3Smacallan return(ujSum); 1664dfe64dd3Smacallan 1665dfe64dd3Smacallan} 1666dfe64dd3Smacallan 1667dfe64dd3Smacallan/* Jong 08/03/2009; Get EDID functions; ported from MS Windows */ 1668dfe64dd3Smacallan//*************************************************************************\\ 1669dfe64dd3Smacallan// VP_STATUS vGetEDID_1 1670dfe64dd3Smacallan// 1671dfe64dd3Smacallan// Routine Description: 1672dfe64dd3Smacallan// Get the EDID which is in version 1.x format via I2C. 1673dfe64dd3Smacallan// 1674dfe64dd3Smacallan// Arguments: 1675dfe64dd3Smacallan// pHWDE - Hardware extension object pointer 1676dfe64dd3Smacallan// pI2C - I2C pointer 1677dfe64dd3Smacallan// pjBuffer - EDID Buffer 1678dfe64dd3Smacallan// ulBufferSize - Buffer size 1679dfe64dd3Smacallan// 1680dfe64dd3Smacallan// 1681dfe64dd3Smacallan// Return Value: 1682dfe64dd3Smacallan// Status of returning EDID. 1683dfe64dd3Smacallan// NO_ERROR - success 1684dfe64dd3Smacallan// ERROR_INVALID_PARAMETER - failed 1685dfe64dd3Smacallan// 1686dfe64dd3Smacallan//**************************************************************************** 1687dfe64dd3SmacallanVP_STATUS vGetEDID_1( 1688dfe64dd3Smacallan PXGI_HW_DEVICE_INFO pHWDE, 1689dfe64dd3Smacallan PI2CControl pI2C, 1690dfe64dd3Smacallan PUCHAR pjBuffer, 1691dfe64dd3Smacallan ULONG ulBufferSize) 1692dfe64dd3Smacallan{ 1693dfe64dd3Smacallan VP_STATUS status; 1694dfe64dd3Smacallan 1695dfe64dd3Smacallan PDEBUGI2C(ErrorF("vGetEDID_1()\n")); 1696dfe64dd3Smacallan 1697dfe64dd3Smacallan if ((ulBufferSize < 128) || (pjBuffer == NULL)) { 1698dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 1699dfe64dd3Smacallan } 1700dfe64dd3Smacallan 1701dfe64dd3Smacallan // Set Segment Block ID as 0 if Monitor support Enhanced-EDID 1702dfe64dd3Smacallan /* 1703dfe64dd3Smacallan pI2C->Command = I2C_COMMAND_WRITE_SEGMENT; // to replace I2C_COMMAND_WRITE 1704dfe64dd3Smacallan pI2C->Data = 0; 1705dfe64dd3Smacallan I2CAccessBuffer(pHWDE, pI2C, 0x60, 0, &(pI2C->Data), 0); 1706dfe64dd3Smacallan */ 1707dfe64dd3Smacallan pI2C->Command = I2C_COMMAND_WRITE; 1708dfe64dd3Smacallan pI2C->Data = 0; 1709dfe64dd3Smacallan I2CAccessBuffer(pHWDE, pI2C, 0x60, 0, &(pI2C->Data), 0); 1710dfe64dd3Smacallan 1711dfe64dd3Smacallan pI2C->Command = I2C_COMMAND_READ; 1712dfe64dd3Smacallan status = I2CAccessBuffer(pHWDE, pI2C, 0xA0, 0, pjBuffer, 128); 1713dfe64dd3Smacallan if ((status == NO_ERROR) && (pI2C->Status == I2C_STATUS_NOERROR)) 1714dfe64dd3Smacallan { 1715dfe64dd3Smacallan // Check Block 0 EDID Header and its checksum 1716dfe64dd3Smacallan if ((*((PULONG)(pjBuffer )) != 0xFFFFFF00) || 1717dfe64dd3Smacallan (*((PULONG)(pjBuffer+4)) != 0x00FFFFFF)) 1718dfe64dd3Smacallan { 1719dfe64dd3Smacallan PDEBUGI2C(ErrorF("vGetEDID_1(): EDID Header Incorrect!!\n")); 1720dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 1721dfe64dd3Smacallan } 1722dfe64dd3Smacallan 1723dfe64dd3Smacallan if (bEDIDCheckSum(pjBuffer, 128) != 0) 1724dfe64dd3Smacallan { 1725dfe64dd3Smacallan if ((*((PULONG)(pjBuffer+0x60)) ==0x4d636e79)&& (*((PULONG)(pjBuffer+0x64)) ==0x65747361)) 1726dfe64dd3Smacallan { 1727dfe64dd3Smacallan return NO_ERROR; //To Fix SyncMaster Checksum error issue 1728dfe64dd3Smacallan } 1729dfe64dd3Smacallan 1730dfe64dd3Smacallan PDEBUGI2C(ErrorF("vGetEDID_1(): EDID Checksum Error!!\n")); 1731dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 1732dfe64dd3Smacallan } 1733dfe64dd3Smacallan 1734dfe64dd3Smacallan } 1735dfe64dd3Smacallan else 1736dfe64dd3Smacallan { 1737dfe64dd3Smacallan PDEBUGI2C(ErrorF("vGetEDID_1 : call I2CAccessBuffer(0xA0) fail !!!\n")); 1738dfe64dd3Smacallan return status; 1739dfe64dd3Smacallan } 1740dfe64dd3Smacallan 1741dfe64dd3Smacallan return NO_ERROR; 1742dfe64dd3Smacallan} 1743dfe64dd3Smacallan 1744dfe64dd3Smacallan//*************************************************************************\\ 1745dfe64dd3Smacallan// VP_STATUS vGetEDID_2 1746dfe64dd3Smacallan// 1747dfe64dd3Smacallan// Routine Description: 1748dfe64dd3Smacallan// Get the EDID which is in version 2.0 format via I2C. 1749dfe64dd3Smacallan// 1750dfe64dd3Smacallan// Arguments: 1751dfe64dd3Smacallan// pHWDE - Hardware extension object pointer 1752dfe64dd3Smacallan// pI2C - I2C pointer 1753dfe64dd3Smacallan// pjBuffer - EDID Buffer 1754dfe64dd3Smacallan// ulBufferSize - Buffer size 1755dfe64dd3Smacallan// 1756dfe64dd3Smacallan// 1757dfe64dd3Smacallan// Return Value: 1758dfe64dd3Smacallan// Status of returning EDID. 1759dfe64dd3Smacallan// NO_ERROR - success 1760dfe64dd3Smacallan// ERROR_INVALID_PARAMETER - failed 1761dfe64dd3Smacallan// 1762dfe64dd3Smacallan//**************************************************************************** 1763dfe64dd3SmacallanVP_STATUS vGetEDID_2( 1764dfe64dd3Smacallan PXGI_HW_DEVICE_INFO pHWDE, 1765dfe64dd3Smacallan PI2CControl pI2C, 1766dfe64dd3Smacallan PUCHAR pjBuffer, 1767dfe64dd3Smacallan ULONG ulBufferSize) 1768dfe64dd3Smacallan{ 1769dfe64dd3Smacallan VP_STATUS status; 1770dfe64dd3Smacallan 1771dfe64dd3Smacallan PDEBUGI2C(ErrorF("vGetEDID_2()\n")); 1772dfe64dd3Smacallan 1773dfe64dd3Smacallan if ((ulBufferSize < 256) || (pjBuffer == NULL)) { 1774dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 1775dfe64dd3Smacallan } 1776dfe64dd3Smacallan 1777dfe64dd3Smacallan pI2C->Command = I2C_COMMAND_READ; 1778dfe64dd3Smacallan status = I2CAccessBuffer(pHWDE, pI2C, 0xA2, 0, pjBuffer, 256); 1779dfe64dd3Smacallan if ((status != NO_ERROR) || (pI2C->Status != I2C_STATUS_NOERROR)) { 1780dfe64dd3Smacallan PDEBUGI2C(ErrorF("vGetEDID_2 : call I2CAccessBuffer(0xA2) fail !!!\n")); 1781dfe64dd3Smacallan usleep(5); 1782dfe64dd3Smacallan status = I2CAccessBuffer(pHWDE, pI2C, 0xA6, 0, pjBuffer, 256); 1783dfe64dd3Smacallan if ((status != NO_ERROR) || (pI2C->Status != I2C_STATUS_NOERROR)) { 1784dfe64dd3Smacallan PDEBUGI2C(ErrorF("vGetEDID_2 : call I2CAccessBuffer(0xA6) fail !!!\n")); 1785dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 1786dfe64dd3Smacallan } 1787dfe64dd3Smacallan } 1788dfe64dd3Smacallan 1789dfe64dd3Smacallan if (*pjBuffer != 0x20) 1790dfe64dd3Smacallan { 1791dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 1792dfe64dd3Smacallan } 1793dfe64dd3Smacallan 1794dfe64dd3Smacallan if (bEDIDCheckSum(pjBuffer, 256) != 0) 1795dfe64dd3Smacallan { 1796dfe64dd3Smacallan return ERROR_INVALID_PARAMETER; 1797dfe64dd3Smacallan } 1798dfe64dd3Smacallan 1799dfe64dd3Smacallan return NO_ERROR; 1800dfe64dd3Smacallan} 1801dfe64dd3Smacallan 1802dfe64dd3Smacallan//*************************************************************************\\ 1803dfe64dd3Smacallan// BOOLEAN bGetEDID 1804dfe64dd3Smacallan// 1805dfe64dd3Smacallan// Routine Description: 1806dfe64dd3Smacallan// For driver to get the monitor EDID through I2C. This function works similar 1807dfe64dd3Smacallan// with VideoPortDDCMonitorHelper() does. 1808dfe64dd3Smacallan// 1809dfe64dd3Smacallan// 1810dfe64dd3Smacallan// Arguments: 1811dfe64dd3Smacallan// pHWDE - Hardware extension object pointer 1812dfe64dd3Smacallan// ulChannelID - Channel ID 1813dfe64dd3Smacallan// pjEDIDBuffer - EDID Buffer 1814dfe64dd3Smacallan// ulBufferSize - Buffer size 1815dfe64dd3Smacallan// 1816dfe64dd3Smacallan// 1817dfe64dd3Smacallan// Return Value: 1818dfe64dd3Smacallan// Status of returning EDID. 1819dfe64dd3Smacallan// TRUE - success 1820dfe64dd3Smacallan// FALSE - failed 1821dfe64dd3Smacallan// 1822dfe64dd3Smacallan//**************************************************************************** 1823dfe64dd3SmacallanBOOLEAN bGetEDID( 1824dfe64dd3Smacallan PXGI_HW_DEVICE_INFO pHWDE, 1825dfe64dd3Smacallan ULONG ulChannelID, 1826dfe64dd3Smacallan PUCHAR pjEDIDBuffer, 1827dfe64dd3Smacallan ULONG ulBufferSize) 1828dfe64dd3Smacallan{ 1829dfe64dd3Smacallan I2CControl I2C; 1830dfe64dd3Smacallan VP_STATUS status; 1831dfe64dd3Smacallan 1832dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID() is called.\n")); 1833dfe64dd3Smacallan 1834dfe64dd3Smacallan if ((ulBufferSize != 0) && (pjEDIDBuffer != NULL)) 1835dfe64dd3Smacallan { 1836dfe64dd3Smacallan memset(pjEDIDBuffer, 0, ulBufferSize); 1837dfe64dd3Smacallan } 1838dfe64dd3Smacallan else 1839dfe64dd3Smacallan { 1840dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID()-(ulBufferSize == 0) || (pjEDIDBuffer == NULL)\n")); 1841dfe64dd3Smacallan return FALSE; 1842dfe64dd3Smacallan } 1843dfe64dd3Smacallan 1844dfe64dd3Smacallan if (I2COpen(pHWDE, I2C_OPEN, ulChannelID, &I2C) != NO_ERROR) 1845dfe64dd3Smacallan { 1846dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID()-I2COpen()-fail!\n")); 1847dfe64dd3Smacallan return FALSE; 1848dfe64dd3Smacallan } 1849dfe64dd3Smacallan 1850dfe64dd3Smacallan // Force Monitor using DDC2 protocal... 1851dfe64dd3Smacallan I2C.ClockRate = I2C_MAX_CLOCK_RATE; 1852dfe64dd3Smacallan I2C.Command = I2C_COMMAND_WRITE; 1853dfe64dd3Smacallan I2C.Flags = I2C_FLAGS_STOP; 1854dfe64dd3Smacallan I2C.Data = 0xFF; 1855dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 1856dfe64dd3Smacallan 1857dfe64dd3Smacallan // Reset I2C bus 1858dfe64dd3Smacallan I2C.Command = I2C_COMMAND_RESET; 1859dfe64dd3Smacallan I2CAccess(pHWDE, &I2C); 1860dfe64dd3Smacallan if (I2C.Status != I2C_STATUS_NOERROR) 1861dfe64dd3Smacallan { 1862dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID() fail: Reset I2C bus fail.\n")); 1863dfe64dd3Smacallan return FALSE; 1864dfe64dd3Smacallan } 1865dfe64dd3Smacallan 1866dfe64dd3Smacallan status = vGetEDID_2(pHWDE, &I2C, pjEDIDBuffer, ulBufferSize); 1867dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID()-vGetEDID_2-status=%d\n", status == NO_ERROR ? 1:0)); 1868dfe64dd3Smacallan 1869dfe64dd3Smacallan if (status != NO_ERROR) 1870dfe64dd3Smacallan { 1871dfe64dd3Smacallan usleep(5); 1872dfe64dd3Smacallan status = vGetEDID_1(pHWDE, &I2C, pjEDIDBuffer, ulBufferSize); 1873dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID()-vGetEDID_1-status=%d\n", status == NO_ERROR ? 1:0)); 1874dfe64dd3Smacallan 1875dfe64dd3Smacallan if (status == NO_ERROR) 1876dfe64dd3Smacallan { 1877dfe64dd3Smacallan if (*(pjEDIDBuffer+0x7E) != 0) 1878dfe64dd3Smacallan { 1879dfe64dd3Smacallan vGetEDIDExtensionBlocks(pHWDE, &I2C, pjEDIDBuffer+128, ulBufferSize-128); 1880dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID()-vGetEDIDExtensionBlocks()\n")); 1881dfe64dd3Smacallan } 1882dfe64dd3Smacallan } 1883dfe64dd3Smacallan else 1884dfe64dd3Smacallan { 1885dfe64dd3Smacallan ErrorF( "bGetEDID() fail !!\n"); 1886dfe64dd3Smacallan } 1887dfe64dd3Smacallan } 1888dfe64dd3Smacallan 1889dfe64dd3Smacallan I2COpen(pHWDE, I2C_CLOSE, ulChannelID, &I2C); 1890dfe64dd3Smacallan 1891dfe64dd3Smacallan PDEBUGI2C(ErrorF("bGetEDID()-return(%d)\n", status == NO_ERROR ? 1:0)); 1892dfe64dd3Smacallan return (status == NO_ERROR); 1893dfe64dd3Smacallan}