Project

General

Profile

#include "vidi2c.h"
#include "regs.h"
#include "integer.h"

void set_vidi2c()
{
//wait_us(5000000);
int i;
unsigned int slave = 0x70;
unsigned int read = 0x1;
unsigned int write = 0x0;

// write this to the control reg to change which channel is selected, then stop...
unsigned int channel0 = 0x4; //VGA
unsigned int channel1 = 0x5; //HDMI

unsigned int anotherslave = 0x50;

// *zpu_i2c_1 = (slave<<9) | write<<8 | channel0; // select channel 0
// while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
//
// *zpu_i2c_1 = (anotherslave<<9) | write<<8 | 0xaa;
// while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
//
// *zpu_i2c_1 = (slave<<9) | read<<8; // read control reg
// while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
//
// *zpu_i2c_1 = (slave<<9) | write<<8 | channel1; // select channel 1
// while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
//
// *zpu_i2c_1 = (anotherslave<<9) | write<<8 | 0xf0;
// while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
//
// *zpu_i2c_1 = (slave<<9) | read<<8; // read control reg
// while ((*zpu_i2c_1)&0x100); // wait until busy not asserted

// From here we can either decode or write a function just to say 'VGA connected'/'HDMI connected'
// If we decode then we can set the timings from here then program clock chip for the pixel clock (TODO)

// Read DDC from HDMI
*zpu_i2c_1 = (slave<<9) | write<<8 | channel0; // select channel 0
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted

*zpu_i2c_1 = (anotherslave<<9) | write<<8; // starting from addr 0
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
for (i=0;i!=128;++i)
{
*zpu_i2c_1 = (anotherslave<<9) | read<<8;
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
}

*zpu_i2c_1 = (slave<<9) | read<<8; // read control reg
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted

// Read DDC from VGA
*zpu_i2c_1 = (slave<<9) | write<<8 | channel1; // select channel 1
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted

*zpu_i2c_1 = (anotherslave<<9) | write<<8; // starting from addr 0
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
for (i=0;i!=128;++i)
{
*zpu_i2c_1 = (anotherslave<<9) | read<<8;
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
}

*zpu_i2c_1 = (slave<<9) | read<<8; // read control reg
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
}

void readDDC(int channel, uint8_t * buffer, int maxLen)
{
int i=0;
unsigned int slave = 0x70;
unsigned int read = 0x1;
unsigned int write = 0x0;

unsigned int anotherslave = 0x50;

if (1==*zpu_board)
return;

*zpu_i2c_1 = (slave<<9) | write<<8 | channel; // select channel 0
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted

*zpu_i2c_1 = (anotherslave<<9) | write<<8; // starting from addr 0
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
for (i=0;i!=maxLen;++i)
{
*zpu_i2c_1 = (anotherslave<<9) | read<<8;
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
buffer[i] = (*zpu_i2c_1)&0xff;
}

*zpu_i2c_1 = (slave<<9) | write<<8; // deselect channel 0
while ((*zpu_i2c_1)&0x100); // wait until busy not asserted
}

int isVideoConnected(int channel)
{
int res = 0;
uint8_t buffer[5];

readDDC(channel,&buffer[0],5);

res = (buffer[0]==0x00 && buffer[1]==0xff && buffer[2]==0xff);
return res;
}

int isHDMIConnected()
{
return isVideoConnected(0x5);
}

int isVGAConnected()
{
return isVideoConnected(0x4);
}

(1-1/2)