repo2/firmware_eclairexl/clkgen/pll2.c
646 | markw | #include "pll2.h"
|
|
#include "Si5351A-RevB-Registers.h"
|
|||
#include "regs.h"
|
|||
971 | markw | #include "pll.h"
|
|
646 | markw | #include "integer.h"
|
|
971 | markw | #include "spibase.h"
|
|
646 | markw | ||
void set_pll2()
|
|||
{
|
|||
//wait_us(5000000);
|
|||
int i;
|
|||
unsigned int slave = 0x60;
|
|||
unsigned int read = 0x1;
|
|||
unsigned int write = 0x0;
|
|||
662 | markw | ||
if (1==*zpu_board)
|
|||
return;
|
|||
646 | markw | 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
|
|||
}
|
|||
}
|
|||
971 | markw | 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
|
|||
*/
|
|||
}
|