Project

General

Profile

#include "pll2.h"
#include "Si5351A-RevB-Registers.h"
#include "regs.h"
#include "pll.h"
#include "integer.h"
#include "spibase.h"

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

if (1==*zpu_board)
return;

for (i=0;i!=SI5351A_REVB_REG_CONFIG_NUM_REGS;++i)
{
unsigned int addr = si5351a_revb_registers[i].address;
unsigned int value = si5351a_revb_registers[i].value;

*zpu_i2c_0 = (slave<<9) | write<<8 | addr; // write addr (blocks until accepted)
*zpu_i2c_0 = (slave<<9) | write<<8 | value; // write data (blocks until accepted)

while ((*zpu_i2c_0)&0x100); // wait until busy not asserted
}
}

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
*/
}

(2-2/3)