Project

General

Profile

« Previous | Next » 

Revision 971

Added by markw almost 6 years ago

Add support for 480i/576i,720p and 1080i

View differences:

pll2.c
#include "pll2.h"
#include "Si5351A-RevB-Registers.h"
#include "regs.h"
#include "pll.h"
#include "integer.h"
#include "spibase.h"
void set_pll2()
{
......
}
}
void program_i2c_lh(unsigned int slave, int reg, uint8_t l, uint8_t h)
{
unsigned int write = 0x0;
*zpu_i2c_0 = (slave<<9) | write<<8 | 0xf0 | reg; // write addr (blocks until accepted)
*zpu_i2c_0 = (slave<<9) | write<<8 | l; // write data (blocks until accepted)
*zpu_i2c_0 = (slave<<9) | write<<8 | h; // write data (blocks until accepted)
while ((*zpu_i2c_0)&0x100); // wait until busy not asserted
}
void read16(uint16_t const * addr, uint8_t * l, uint8_t * h)
{
uint8_t const * addr8 = (uint8_t const *)addr;
*l = addr8[1];
*h = addr8[0];
}
void program_i2c_videomode(unsigned int slave, uint16_t const * regs, unsigned int from, unsigned int noRegs)
{
int i;
for (i=from;i!=noRegs;++i)
{
uint8_t l,h;
read16(regs+i,&l,&h);
program_i2c_lh(slave, i, l, h);
}
}
void set_crtc(uint16_t const * crtc_regs)
{
program_i2c_lh(2,12,0,0); // disable576p
uint8_t l,h;
read16(crtc_regs+11,&l,&h);
program_i2c_lh(2,11,l,h); // set the clock!
program_i2c_lh(2,11,l,h); // set the clock again (looks like this transaction is lost after a clock change)
program_i2c_videomode(2,crtc_regs,0,10);
//program_i2c_lh(2,10,crtc_regs[10]); // set scaler and mode*/
int scal = get_scaler();
read16(crtc_regs+10,&l,&h);
program_i2c_lh(2,10,l,scal); // set scaler and mode*/
program_i2c_lh(2,12,1,0); // enable
}
void set_scale(uint16_t const * scale_regs)
{
program_i2c_videomode(1,scale_regs,0,6);
program_i2c_videomode(3,scale_regs+6,0,3);
}
void set_scaler_mode(int mode)
{
readFlash(romstart+0x30000,2048,SCRATCH_MEM);
uint8_t * addr = SCRATCH_MEM;
addr = addr + (mode<<8);
set_pll((video_pll_mode)*(addr+192));
set_crtc(addr+64);
set_scale(addr+128);
/* mode layout
* 0 :name
64 :crtc
128:scaler
192:freq
*/
}

Also available in: Unified diff