Commit 993e6bc2 authored by Grzegorz Daniluk's avatar Grzegorz Daniluk

Merge branch 'v3-switch-for-wrpc-tom' into v3-switch_for_wrpc

Conflicts:
	Makefile
	dev/softpll_ng.c
	wrc_main.c
parents 0f22c9b5 bbd88426
...@@ -30,14 +30,14 @@ static int autoneg_enabled; ...@@ -30,14 +30,14 @@ static int autoneg_enabled;
static volatile struct EP_WB *EP = (volatile struct EP_WB *) BASE_EP; static volatile struct EP_WB *EP = (volatile struct EP_WB *) BASE_EP;
/* functions for accessing PCS (MDIO) registers */ /* functions for accessing PCS (MDIO) registers */
static uint16_t pcs_read(int location) uint16_t pcs_read(int location)
{ {
EP->MDIO_CR = EP_MDIO_CR_ADDR_W(location >> 2); EP->MDIO_CR = EP_MDIO_CR_ADDR_W(location >> 2);
while ((EP->MDIO_ASR & EP_MDIO_ASR_READY) == 0); while ((EP->MDIO_ASR & EP_MDIO_ASR_READY) == 0);
return EP_MDIO_ASR_RDATA_R(EP->MDIO_ASR) & 0xffff; return EP_MDIO_ASR_RDATA_R(EP->MDIO_ASR) & 0xffff;
} }
static void pcs_write(int location, int value) void pcs_write(int location, int value)
{ {
EP->MDIO_CR = EP_MDIO_CR_ADDR_W(location >> 2) EP->MDIO_CR = EP_MDIO_CR_ADDR_W(location >> 2)
| EP_MDIO_CR_DATA_W(value) | EP_MDIO_CR_DATA_W(value)
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#define RX_DESC_HAS_OOB(d) ((d) & (1<<29) ? 1 : 0) #define RX_DESC_HAS_OOB(d) ((d) & (1<<29) ? 1 : 0)
#define RX_DESC_SIZE(d) (((d) & (1<<0) ? -1 : 0) + (d & 0xffe)) #define RX_DESC_SIZE(d) (((d) & (1<<0) ? -1 : 0) + (d & 0xffe))
#define RXOOB_TS_INCORRECT (1<<11)
#define TX_DESC_VALID (1<<31) #define TX_DESC_VALID (1<<31)
#define TX_DESC_WITH_OOB (1<<30) #define TX_DESC_WITH_OOB (1<<30)
#define TX_DESC_HAS_OWN_MAC (1<<28) #define TX_DESC_HAS_OWN_MAC (1<<28)
...@@ -140,10 +142,13 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_ ...@@ -140,10 +142,13 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_
uint32_t raw_ts; uint32_t raw_ts;
uint32_t rx_addr_cur; uint32_t rx_addr_cur;
int n_recvd; int n_recvd;
// mprintf("erxf\n");
if(! (minic_readl(MINIC_REG_EIC_ISR) & MINIC_EIC_ISR_RX)) if(! (minic_readl(MINIC_REG_EIC_ISR) & MINIC_EIC_ISR_RX))
return 0; return 0;
//TRACE_DEV("minic: got sthx \n");
desc_hdr = *minic.rx_head; desc_hdr = *minic.rx_head;
if(!RX_DESC_VALID(desc_hdr)) /* invalid descriptor? Weird, the RX_ADDR seems to be saying something different. Ignore the packet and purge the RX buffer. */ if(!RX_DESC_VALID(desc_hdr)) /* invalid descriptor? Weird, the RX_ADDR seems to be saying something different. Ignore the packet and purge the RX buffer. */
...@@ -165,11 +170,12 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_ ...@@ -165,11 +170,12 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_
{ {
uint32_t counter_r, counter_f, counter_ppsg, utc; uint32_t counter_r, counter_f, counter_ppsg, utc;
int cntr_diff; int cntr_diff;
uint16_t dhdr;
payload_size -= RX_OOB_SIZE; payload_size -= RX_OOB_SIZE;
memcpy(&raw_ts, (uint8_t *)minic.rx_head + payload_size + 6, 4); /* fixme: ugly way of doing unaligned read */ memcpy(&raw_ts, (uint8_t *)minic.rx_head + payload_size + 6, 4); /* fixme: ugly way of doing unaligned read */
memcpy(&dhdr, (uint8_t *)minic.rx_head + payload_size + 4, 2);
EXPLODE_WR_TIMESTAMP(raw_ts, counter_r, counter_f); EXPLODE_WR_TIMESTAMP(raw_ts, counter_r, counter_f);
pps_gen_get_time(&utc, &counter_ppsg); pps_gen_get_time(&utc, &counter_ppsg);
...@@ -187,6 +193,7 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_ ...@@ -187,6 +193,7 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_
hwts->ahead = 0; hwts->ahead = 0;
hwts->nsec = counter_r * 8; hwts->nsec = counter_r * 8;
hwts->valid = (dhdr & RXOOB_TS_INCORRECT) ? 0 : 1;
} }
n_recvd = (buf_size < payload_size ? buf_size : payload_size); n_recvd = (buf_size < payload_size ? buf_size : payload_size);
...@@ -211,7 +218,7 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_ ...@@ -211,7 +218,7 @@ int minic_rx_frame(uint8_t *hdr, uint8_t *payload, uint32_t buf_size, struct hw_
minic_writel(MINIC_REG_EIC_ISR, MINIC_EIC_ISR_RX); minic_writel(MINIC_REG_EIC_ISR, MINIC_EIC_ISR_RX);
} }
// mprintf("minic: num_rx %d\n", n_recvd); // TRACE_DEV("minic: num_rx %d\n", n_recvd);
return n_recvd; return n_recvd;
} }
...@@ -225,7 +232,7 @@ int minic_tx_frame(uint8_t *hdr, uint8_t *payload, uint32_t size, struct hw_time ...@@ -225,7 +232,7 @@ int minic_tx_frame(uint8_t *hdr, uint8_t *payload, uint32_t size, struct hw_time
minic_new_tx_buffer(); minic_new_tx_buffer();
TRACE_DEV("minic_tx_frame: head %x size %d\n", minic.tx_head, size); // TRACE_DEV("minic_tx_frame: head %x size %d\n", minic.tx_head, size);
memset(minic.tx_head, 0x0, size + 16); memset(minic.tx_head, 0x0, size + 16);
memset((void*)minic.tx_head + 4, 0, size < 60 ? 60 : size); memset((void*)minic.tx_head + 4, 0, size < 60 ? 60 : size);
memcpy((void*)minic.tx_head + 4, hdr, ETH_HEADER_SIZE); memcpy((void*)minic.tx_head + 4, hdr, ETH_HEADER_SIZE);
...@@ -281,7 +288,7 @@ int minic_tx_frame(uint8_t *hdr, uint8_t *payload, uint32_t size, struct hw_time ...@@ -281,7 +288,7 @@ int minic_tx_frame(uint8_t *hdr, uint8_t *payload, uint32_t size, struct hw_time
hwts->ahead = 0; hwts->ahead = 0;
hwts->nsec = counter_r * 8; hwts->nsec = counter_r * 8;
TRACE_DEV("minic_tx_frame [%d bytes] TS: %d.%d\n", size, hwts->utc, hwts->nsec); // TRACE_DEV("minic_tx_frame [%d bytes] TS: %d.%d valid %d\n", size, hwts->utc, hwts->nsec, hwts->valid);
minic.tx_count++; minic.tx_count++;
} }
......
This diff is collapsed.
...@@ -40,16 +40,30 @@ static volatile struct PPSG_WB *PPSG = (volatile struct PPSG_WB *) BASE_PPS_GEN; ...@@ -40,16 +40,30 @@ static volatile struct PPSG_WB *PPSG = (volatile struct PPSG_WB *) BASE_PPS_GEN;
#define SEQ_CLEAR_DACS 9 #define SEQ_CLEAR_DACS 9
#define SEQ_WAIT_CLEAR_DACS 10 #define SEQ_WAIT_CLEAR_DACS 10
#define AUX_DISABLED 1
#define AUX_LOCK_PLL 2
#define AUX_ALIGN_PHASE 3
#define AUX_READY 4
struct spll_aux_state {
int state;
int32_t phase_target;
};
struct softpll_state { struct softpll_state {
int mode; int mode;
int seq_state; int seq_state;
int helper_locked; int helper_locked;
int dac_timeout; int dac_timeout;
int default_dac_main; int default_dac_main;
int delock_count;
int32_t mpll_shift_ps;
struct spll_helper_state helper; struct spll_helper_state helper;
struct spll_external_state ext; struct spll_external_state ext;
struct spll_main_state mpll; struct spll_main_state mpll;
struct spll_main_state aux[MAX_CHAN_AUX]; struct spll_main_state aux[MAX_CHAN_AUX];
struct spll_aux_state aux_fsm[MAX_CHAN_AUX];
struct spll_ptracker_state ptrackers[MAX_PTRACKERS]; struct spll_ptracker_state ptrackers[MAX_PTRACKERS];
}; };
...@@ -67,7 +81,7 @@ void _irq_entry() ...@@ -67,7 +81,7 @@ void _irq_entry()
// softpll.seq_state = SEQ_WAIT_CLEAR_DACS; // softpll.seq_state = SEQ_WAIT_CLEAR_DACS;
if(! (SPLL->TRR_CSR & SPLL_TRR_CSR_EMPTY)) while(! (SPLL->TRR_CSR & SPLL_TRR_CSR_EMPTY))
{ {
trr = SPLL->TRR_R0; trr = SPLL->TRR_R0;
src = SPLL_TRR_R0_CHAN_ID_R(trr); src = SPLL_TRR_R0_CHAN_ID_R(trr);
...@@ -147,15 +161,18 @@ void _irq_entry() ...@@ -147,15 +161,18 @@ void _irq_entry()
// SPLL->OCER = 0; // SPLL->OCER = 0;
// SPLL->RCER = 0; // SPLL->RCER = 0;
softpll.seq_state = SEQ_CLEAR_DACS; softpll.seq_state = SEQ_CLEAR_DACS;
softpll.delock_count++;
} else if (softpll.mode == SPLL_MODE_GRAND_MASTER && !external_locked((struct spll_external_state *) &s->ext)) } else if (softpll.mode == SPLL_MODE_GRAND_MASTER && !external_locked((struct spll_external_state *) &s->ext))
{ {
// SPLL->OCER = 0; // SPLL->OCER = 0;
// SPLL->RCER = 0; // SPLL->RCER = 0;
// SPLL->ECCR = 0; // SPLL->ECCR = 0;
softpll.seq_state = SEQ_START_EXT; softpll.seq_state = SEQ_START_EXT;
softpll.delock_count++;
} else if (softpll.mode == SPLL_MODE_SLAVE && !softpll.mpll.ld.locked) } else if (softpll.mode == SPLL_MODE_SLAVE && !softpll.mpll.ld.locked)
{ {
softpll.seq_state = SEQ_CLEAR_DACS; softpll.seq_state = SEQ_CLEAR_DACS;
softpll.delock_count++;
}; };
break; break;
}; };
...@@ -185,6 +202,9 @@ void _irq_entry() ...@@ -185,6 +202,9 @@ void _irq_entry()
for(i=0;i<n_chan_ref; i++) for(i=0;i<n_chan_ref; i++)
if(ptracker_mask & (1<<i)) if(ptracker_mask & (1<<i))
ptracker_update((struct spll_ptracker_state *) &s->ptrackers[i], tag, src); ptracker_update((struct spll_ptracker_state *) &s->ptrackers[i], tag, src);
for(i=0;i<n_chan_out-1;i++)
mpll_update(&softpll.aux[i], tag, src);
break; break;
...@@ -219,6 +239,8 @@ void spll_init(int mode, int slave_ref_channel, int align_pps) ...@@ -219,6 +239,8 @@ void spll_init(int mode, int slave_ref_channel, int align_pps)
softpll.helper_locked = 0; softpll.helper_locked = 0;
softpll.mode = mode; softpll.mode = mode;
softpll.default_dac_main = 0; softpll.default_dac_main = 0;
softpll.delock_count = 0;
// softpll.occr_prev = 0;
SPLL->DAC_HPLL = 0; SPLL->DAC_HPLL = 0;
SPLL->DAC_MAIN = 0; SPLL->DAC_MAIN = 0;
...@@ -231,6 +253,8 @@ void spll_init(int mode, int slave_ref_channel, int align_pps) ...@@ -231,6 +253,8 @@ void spll_init(int mode, int slave_ref_channel, int align_pps)
SPLL->ECCR = 0; SPLL->ECCR = 0;
SPLL->RCGER = 0; SPLL->RCGER = 0;
SPLL->DCCR = 0; SPLL->DCCR = 0;
SPLL->OCCR = 0;
SPLL->DEGLITCH_THR = 1000; SPLL->DEGLITCH_THR = 1000;
PPSG->ESCR = 0; PPSG->ESCR = 0;
...@@ -254,7 +278,10 @@ void spll_init(int mode, int slave_ref_channel, int align_pps) ...@@ -254,7 +278,10 @@ void spll_init(int mode, int slave_ref_channel, int align_pps)
mpll_init(&softpll.mpll, slave_ref_channel, n_chan_ref); mpll_init(&softpll.mpll, slave_ref_channel, n_chan_ref);
for(i=0;i<n_chan_out-1;i++) for(i=0;i<n_chan_out-1;i++)
{
mpll_init(&softpll.aux[i], slave_ref_channel, n_chan_ref + i + 1); mpll_init(&softpll.aux[i], slave_ref_channel, n_chan_ref + i + 1);
softpll.aux_fsm[i].state = AUX_DISABLED;
}
break; break;
case SPLL_MODE_FREE_RUNNING_MASTER: case SPLL_MODE_FREE_RUNNING_MASTER:
...@@ -267,7 +294,10 @@ void spll_init(int mode, int slave_ref_channel, int align_pps) ...@@ -267,7 +294,10 @@ void spll_init(int mode, int slave_ref_channel, int align_pps)
mpll_init(&softpll.mpll, slave_ref_channel, n_chan_ref); mpll_init(&softpll.mpll, slave_ref_channel, n_chan_ref);
for(i=0;i<n_chan_out-1;i++) for(i=0;i<n_chan_out-1;i++)
{
mpll_init(&softpll.aux[i], slave_ref_channel, n_chan_ref + i + 1); mpll_init(&softpll.aux[i], slave_ref_channel, n_chan_ref + i + 1);
softpll.aux_fsm[i].state = AUX_DISABLED;
}
PPSG->ESCR = PPSG_ESCR_PPS_VALID | PPSG_ESCR_TM_VALID; PPSG->ESCR = PPSG_ESCR_PPS_VALID | PPSG_ESCR_TM_VALID;
break; break;
...@@ -280,7 +310,11 @@ void spll_init(int mode, int slave_ref_channel, int align_pps) ...@@ -280,7 +310,11 @@ void spll_init(int mode, int slave_ref_channel, int align_pps)
mpll_init(&softpll.mpll, slave_ref_channel, n_chan_ref); mpll_init(&softpll.mpll, slave_ref_channel, n_chan_ref);
for(i=0;i<n_chan_out-1;i++) for(i=0;i<n_chan_out-1;i++)
{
mpll_init(&softpll.aux[i], slave_ref_channel, n_chan_ref + i + 1); mpll_init(&softpll.aux[i], slave_ref_channel, n_chan_ref + i + 1);
softpll.aux_fsm[i].state = AUX_DISABLED;
}
// PPSG->ESCR = PPSG_ESCR_PPS_VALID | PPSG_ESCR_TM_VALID; // PPSG->ESCR = PPSG_ESCR_PPS_VALID | PPSG_ESCR_TM_VALID;
...@@ -298,17 +332,7 @@ void spll_init(int mode, int slave_ref_channel, int align_pps) ...@@ -298,17 +332,7 @@ void spll_init(int mode, int slave_ref_channel, int align_pps)
dummy = SPLL->PER_HPLL; dummy = SPLL->PER_HPLL;
SPLL->EIC_IER = 1; SPLL->EIC_IER = 1;
SPLL->OCER |= 1;
// _irq_entry();
SPLL->OCER |= 1;
// SPLL->RCER |= 1;
/* for(;;)
{
TRACE_DEV("OCER %x TRR_CSR %x %x\n", SPLL->OCER, SPLL->TRR_CSR, SPLL->TRR_R0);
}*/
enable_irq(); enable_irq();
...@@ -337,8 +361,10 @@ void spll_shutdown() ...@@ -337,8 +361,10 @@ void spll_shutdown()
void spll_start_channel(int channel) void spll_start_channel(int channel)
{ {
if (softpll.seq_state != SEQ_READY || !channel) if (softpll.seq_state != SEQ_READY || !channel)
{
TRACE("Can't start channel %d, the PLL is not ready\n", channel);
return; return;
}
mpll_start(&softpll.aux[channel-1]); mpll_start(&softpll.aux[channel-1]);
} }
...@@ -369,17 +395,33 @@ static int32_t to_picos(int32_t units) ...@@ -369,17 +395,33 @@ static int32_t to_picos(int32_t units)
} }
/* Channel 0 = local PLL reference, 1...N = aux oscillators */ /* Channel 0 = local PLL reference, 1...N = aux oscillators */
void spll_set_phase_shift(int channel, int32_t value_picoseconds) static void set_phase_shift(int channel, int32_t value_picoseconds)
{ {
volatile struct spll_main_state *st = (!channel ? &softpll.mpll : &softpll.aux[channel-1]); volatile struct spll_main_state *st = (!channel ? &softpll.mpll : &softpll.aux[channel-1]);
mpll_set_phase_shift(st, from_picos(value_picoseconds)); int div = (DIVIDE_DMTD_CLOCKS_BY_2 ? 2: 1);
mpll_set_phase_shift(st, from_picos(value_picoseconds) / div);
softpll.mpll_shift_ps = value_picoseconds;
}
void spll_set_phase_shift(int channel, int32_t value_picoseconds)
{
int i;
if(channel == SPLL_ALL_CHANNELS)
{
spll_set_phase_shift(0, value_picoseconds);
for(i=0;i<n_chan_out-1;i++)
if(softpll.aux_fsm[i].state == AUX_READY)
set_phase_shift(i+1, value_picoseconds);
} else
set_phase_shift(channel, value_picoseconds);
} }
void spll_get_phase_shift(int channel, int32_t *current, int32_t *target) void spll_get_phase_shift(int channel, int32_t *current, int32_t *target)
{ {
volatile struct spll_main_state *st = (!channel ? &softpll.mpll : &softpll.aux[channel-1]); volatile struct spll_main_state *st = (!channel ? &softpll.mpll : &softpll.aux[channel-1]);
if(current) *current = to_picos(st->phase_shift_current); int div = (DIVIDE_DMTD_CLOCKS_BY_2 ? 2: 1);
if(target) *target = to_picos(st->phase_shift_target); if(current) *current = to_picos(st->phase_shift_current * div);
if(target) *target = to_picos(st->phase_shift_target * div);
} }
int spll_read_ptracker(int channel, int32_t *phase_ps, int *enabled) int spll_read_ptracker(int channel, int32_t *phase_ps, int *enabled)
...@@ -388,7 +430,13 @@ int spll_read_ptracker(int channel, int32_t *phase_ps, int *enabled) ...@@ -388,7 +430,13 @@ int spll_read_ptracker(int channel, int32_t *phase_ps, int *enabled)
int phase = st->phase_val; int phase = st->phase_val;
if(phase < 0) phase += (1<<HPLL_N); if(phase < 0) phase += (1<<HPLL_N);
else if (phase >= (1<<HPLL_N)) phase -= (1<<HPLL_N); else if (phase >= (1<<HPLL_N)) phase -= (1<<HPLL_N);
if(DIVIDE_DMTD_CLOCKS_BY_2)
{
phase <<= 1;
phase &= (1<<HPLL_N)-1;
}
*phase_ps = to_picos(phase); *phase_ps = to_picos(phase);
if(enabled) if(enabled)
*enabled = ptracker_mask & (1<<st->id_b) ? 1 : 0; *enabled = ptracker_mask & (1<<st->id_b) ? 1 : 0;
...@@ -404,10 +452,10 @@ void spll_get_num_channels(int *n_ref, int *n_out) ...@@ -404,10 +452,10 @@ void spll_get_num_channels(int *n_ref, int *n_out)
void spll_show_stats() void spll_show_stats()
{ {
if(softpll.mode > 0) if(softpll.mode > 0)
TRACE("Irq_count %d Sequencer_state %d mode %d Alignment_state %d HL%d EL%d ML%d HY=%d MY=%d\n", TRACE("Irq_count %d Sequencer_state %d mode %d Alignment_state %d HL%d EL%d ML%d HY=%d MY=%d DelCnt=%d\n",
irq_count, softpll.seq_state, softpll.mode, softpll.ext.realign_state, irq_count, softpll.seq_state, softpll.mode, softpll.ext.realign_state,
softpll.helper.ld.locked, softpll.ext.ld.locked, softpll.mpll.ld.locked, softpll.helper.ld.locked, softpll.ext.ld.locked, softpll.mpll.ld.locked,
softpll.helper.pi.y, softpll.mpll.pi.y); softpll.helper.pi.y, softpll.mpll.pi.y, softpll.delock_count);
} }
...@@ -435,3 +483,77 @@ void spll_enable_ptracker(int ref_channel, int enable) ...@@ -435,3 +483,77 @@ void spll_enable_ptracker(int ref_channel, int enable)
} }
} }
int spll_get_delock_count()
{
return softpll.delock_count;
}
int spll_update_aux_clocks()
{
uint32_t occr_aux_en = SPLL_OCCR_OUT_EN_R(SPLL->OCCR);
int i;
for(i=0;i<n_chan_out-1;i++)
{
struct spll_aux_state *s = &softpll.aux_fsm[i];
if((! (occr_aux_en & (1<<(i+1))) && s->state != AUX_DISABLED))
{
TRACE("[aux] disabled channel %d\n", i);
spll_stop_channel(i+1);
SPLL->OCCR &= ~ (SPLL_OCCR_OUT_LOCK_W((1<<(i+1))));
s->state = AUX_DISABLED;
} else switch(s->state)
{
case AUX_DISABLED:
if(occr_aux_en & (1<<(i+1)) && softpll.mpll.ld.locked)
{
TRACE("[aux] enabled channel %d\n", i);
s->state = AUX_LOCK_PLL;
spll_start_channel(i+1);
}
break;
case AUX_LOCK_PLL:
if(softpll.aux[i].ld.locked)
{
TRACE("[aux] channel %d locked [aligning @ %d ps]\n", i, softpll.mpll_shift_ps);
set_phase_shift(i+1, softpll.mpll_shift_ps);
s->state = AUX_ALIGN_PHASE;
}
break;
case AUX_ALIGN_PHASE:
if(!mpll_shifter_busy(&softpll.aux[i]))
{
TRACE("[aux] channel %d phase aligned\n", i);
SPLL->OCCR |= SPLL_OCCR_OUT_LOCK_W((1<<(i+1)));
s->state = AUX_READY;
}
break;
case AUX_READY:
if(!softpll.mpll.ld.locked)
{
SPLL->OCCR &= ~ (SPLL_OCCR_OUT_LOCK_W((1<<(i+1))));
s->state = AUX_DISABLED;
}
break;
}
}
}
int spll_get_aux_status(int channel)
{
int rval = 0;
if(softpll.aux_fsm[channel].state != AUX_DISABLED)
rval |= SPLL_AUX_ENABLED;
if(softpll.aux_fsm[channel].state == AUX_READY)
rval |= SPLL_AUX_LOCKED;
return rval;
}
...@@ -8,10 +8,11 @@ struct s_i2c_if i2c_if[2] = { {SYSC_GPSR_FMC_SCL, SYSC_GPSR_FMC_SDA}, ...@@ -8,10 +8,11 @@ struct s_i2c_if i2c_if[2] = { {SYSC_GPSR_FMC_SCL, SYSC_GPSR_FMC_SDA},
***************************/ ***************************/
void timer_init(uint32_t enable) void timer_init(uint32_t enable)
{ {
mprintf("MEMSIZE %x\n", syscon->HWFR & 0xf);
if(enable) if(enable)
syscon->TCR |= SYSC_TCR_ENABLE; syscon->TCR |= SYSC_TCR_ENABLE;
else else
syscon->TCR &= !SYSC_TCR_ENABLE; syscon->TCR &= ~SYSC_TCR_ENABLE;
} }
uint32_t timer_get_tics() uint32_t timer_get_tics()
...@@ -23,7 +24,7 @@ void timer_delay(uint32_t how_long) ...@@ -23,7 +24,7 @@ void timer_delay(uint32_t how_long)
{ {
uint32_t t_start; uint32_t t_start;
timer_init(1); // timer_init(1);
do do
{ {
t_start = timer_get_tics(); t_start = timer_get_tics();
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#define DMTD_AVG_SAMPLES 256 #define DMTD_AVG_SAMPLES 256
#define DMTD_MAX_PHASE 16384 #define DMTD_MAX_PHASE 16384
#include <stdint.h>
typedef enum { typedef enum {
AND=0, AND=0,
NAND=4, NAND=4,
...@@ -18,7 +20,7 @@ NOT=7 ...@@ -18,7 +20,7 @@ NOT=7
void ep_init(uint8_t mac_addr[]); void ep_init(uint8_t mac_addr[]);
void get_mac_addr(uint8_t dev_addr[]); void get_mac_addr(uint8_t dev_addr[]);
int ep_enable(int enabled, int autoneg); int ep_enable(int enabled, int autoneg);
int ep_link_up(); int ep_link_up(uint16_t *lpa);
int ep_get_deltas(uint32_t *delta_tx, uint32_t *delta_rx); int ep_get_deltas(uint32_t *delta_tx, uint32_t *delta_rx);
int ep_get_psval(int32_t *psval); int ep_get_psval(int32_t *psval);
int ep_cal_pattern_enable(); int ep_cal_pattern_enable();
...@@ -33,4 +35,7 @@ static void pfilter_logic3(int rd, int ra, pfilter_op_t op, int rb, pfilter_op_t ...@@ -33,4 +35,7 @@ static void pfilter_logic3(int rd, int ra, pfilter_op_t op, int rb, pfilter_op_t
void pfilter_load(); void pfilter_load();
void pfilter_init_default(); void pfilter_init_default();
uint16_t pcs_read(int location);
void pcs_write(int location, int value);
#endif #endif
#ifndef __SOFTPLL_H
#define __SOFTPLL_H
#define SOFTPLL_AUX_ENABLED 1
#define SOFTPLL_AUX_LOCKED 2
void softpll_enable();
int softpll_check_lock();
void softpll_disable();
int softpll_busy();
void softpll_set_phase(int ps);
int softpll_get_setpoint();
int softpll_get_aux_status();
#endif
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
#define SPLL_MODE_SLAVE 3 #define SPLL_MODE_SLAVE 3
#define SPLL_MODE_DISABLED 4 #define SPLL_MODE_DISABLED 4
#define SPLL_ALL_CHANNELS 0xffff
#define SPLL_AUX_ENABLED (1<<0)
#define SPLL_AUX_LOCKED (1<<1)
void spll_init(int mode, int slave_ref_channel, int align_pps); void spll_init(int mode, int slave_ref_channel, int align_pps);
void spll_shutdown(); void spll_shutdown();
...@@ -21,6 +25,9 @@ void spll_get_phase_shift(int channel, int32_t *current, int32_t *target); ...@@ -21,6 +25,9 @@ void spll_get_phase_shift(int channel, int32_t *current, int32_t *target);
int spll_read_ptracker(int channel, int32_t *phase_ps, int *enabled); int spll_read_ptracker(int channel, int32_t *phase_ps, int *enabled);
void spll_get_num_channels(int *n_ref, int *n_out); void spll_get_num_channels(int *n_ref, int *n_out);
int spll_shifter_busy(int channel); int spll_shifter_busy(int channel);
int spll_get_delock_count();
int spll_update_aux_clocks();
int spll_get_aux_status(int channel);
#endif #endif
...@@ -15,6 +15,11 @@ WARNING: These parameters must be in sync with the generics of the HDL instantia ...@@ -15,6 +15,11 @@ WARNING: These parameters must be in sync with the generics of the HDL instantia
/* Reference clock period, in picoseconds */ /* Reference clock period, in picoseconds */
#define CLOCK_PERIOD_PICOSECONDS 8000 #define CLOCK_PERIOD_PICOSECONDS 8000
/* optional DMTD clock division to improve FPGA timing closure by avoiding
clock nets directly driving FD inputs. Must be consistent with the
g_divide_inputs_by_2 generic. */
#define DIVIDE_DMTD_CLOCKS_BY_2 1
/* Number of bits in phase tags generated by the DMTDs. Used to sign-extend the tags. /* Number of bits in phase tags generated by the DMTDs. Used to sign-extend the tags.
Corresponding VHDL generic: g_tag_bits. */ Corresponding VHDL generic: g_tag_bits. */
#define TAG_BITS 22 #define TAG_BITS 22
......
...@@ -17,6 +17,7 @@ struct spll_helper_state { ...@@ -17,6 +17,7 @@ struct spll_helper_state {
int p_setpoint, tag_d0; int p_setpoint, tag_d0;
int ref_src; int ref_src;
int sample_n; int sample_n;
int delock_count;
spll_pi_t pi; spll_pi_t pi;
spll_lock_det_t ld; spll_lock_det_t ld;
}; };
...@@ -27,16 +28,17 @@ static void helper_init(struct spll_helper_state *s, int ref_channel) ...@@ -27,16 +28,17 @@ static void helper_init(struct spll_helper_state *s, int ref_channel)
/* Phase branch PI controller */ /* Phase branch PI controller */
s->pi.y_min = 5; s->pi.y_min = 5;
s->pi.y_max = (1 << DAC_BITS) - 5; s->pi.y_max = (1 << DAC_BITS) - 5;
s->pi.kp = (int)(0.3 * 32.0 * 16.0); s->pi.kp = (int)(0.3 * 32.0 * 16.0);// / 2;
s->pi.ki = (int)(0.03 * 32.0 * 3.0); s->pi.ki = (int)(0.03 * 32.0 * 3.0);// / 2;
s->pi.anti_windup = 1; s->pi.anti_windup = 1;
/* Phase branch lock detection */ /* Phase branch lock detection */
s->ld.threshold = 200; s->ld.threshold = 200;
s->ld.lock_samples = 1000; s->ld.lock_samples = 10000;
s->ld.delock_samples = 900; s->ld.delock_samples = 100;
s->ref_src = ref_channel; s->ref_src = ref_channel;
s->delock_count = 0;
} }
static int helper_update(struct spll_helper_state *s, int tag, int source) static int helper_update(struct spll_helper_state *s, int tag, int source)
......
...@@ -25,6 +25,8 @@ struct spll_main_state { ...@@ -25,6 +25,8 @@ struct spll_main_state {
int phase_shift_current; int phase_shift_current;
int id_ref, id_out; /* IDs of the reference and the output channel */ int id_ref, id_out; /* IDs of the reference and the output channel */
int sample_n; int sample_n;
int delock_count;
int dac_index;
}; };
...@@ -35,15 +37,19 @@ static void mpll_init(struct spll_main_state *s, int id_ref, int id_out) ...@@ -35,15 +37,19 @@ static void mpll_init(struct spll_main_state *s, int id_ref, int id_out)
s->pi.y_max = 65530; s->pi.y_max = 65530;
s->pi.anti_windup = 1; s->pi.anti_windup = 1;
s->pi.bias = 65000; s->pi.bias = 65000;
s->pi.kp = 1100; s->pi.kp = 1100;// / 2;
s->pi.ki = 30; s->pi.ki = 30;// / 2;
s->delock_count = 0;
/* Freqency branch lock detection */ /* Freqency branch lock detection */
s->ld.threshold = 120; s->ld.threshold = 1200;
s->ld.lock_samples = 400; s->ld.lock_samples = 1000;
s->ld.delock_samples = 390; s->ld.delock_samples = 100;
s->id_ref = id_ref; s->id_ref = id_ref;
s->id_out = id_out; s->id_out = id_out;
s->dac_index = id_out - n_chan_ref;
mprintf("DACindex : %d\n", s->dac_index);
pi_init(&s->pi); pi_init(&s->pi);
ld_init(&s->ld); ld_init(&s->ld);
...@@ -167,7 +173,7 @@ static int mpll_update(struct spll_main_state *s, int tag, int source) ...@@ -167,7 +173,7 @@ static int mpll_update(struct spll_main_state *s, int tag, int source)
#endif #endif
y = pi_update(&s->pi, err); y = pi_update(&s->pi, err);
SPLL->DAC_MAIN = SPLL_DAC_MAIN_VALUE_W(y) | SPLL_DAC_MAIN_DAC_SEL_W(s->id_out); SPLL->DAC_MAIN = SPLL_DAC_MAIN_VALUE_W(y) | SPLL_DAC_MAIN_DAC_SEL_W(s->dac_index);
spll_debug(DBG_MAIN | DBG_REF, s->tag_ref + s->adder_ref, 0); spll_debug(DBG_MAIN | DBG_REF, s->tag_ref + s->adder_ref, 0);
spll_debug(DBG_MAIN | DBG_TAG, s->tag_out + s->adder_out, 0); spll_debug(DBG_MAIN | DBG_TAG, s->tag_out + s->adder_out, 0);
......
...@@ -76,13 +76,14 @@ int wrc_mon_gui(void) ...@@ -76,13 +76,14 @@ int wrc_mon_gui(void)
m_cprintf(C_GREY, "Synchronization source: "); m_cprintf(C_WHITE, "%s\n", cur_servo_state.sync_source); m_cprintf(C_GREY, "Synchronization source: "); m_cprintf(C_WHITE, "%s\n", cur_servo_state.sync_source);
m_cprintf(C_GREY, "Aux clock status: "); m_cprintf(C_GREY, "Aux clock status: ");
//aux_stat = spll_check_lock(1); //GGDD softpll_get_aux_status();
//if(aux_stat & SOFTPLL_AUX_ENABLED) aux_stat = spll_get_aux_status(0);
// m_cprintf(C_GREEN,"enabled");
//if(aux_stat & SOFTPLL_AUX_LOCKED) if(aux_stat & SPLL_AUX_ENABLED)
// m_cprintf(C_GREEN,", locked"); m_cprintf(C_GREEN,"enabled");
if(aux_stat & SPLL_AUX_LOCKED)
m_cprintf(C_GREEN,", locked");
mprintf("\n"); mprintf("\n");
m_cprintf(C_BLUE, "\nTiming parameters:\n\n"); m_cprintf(C_BLUE, "\nTiming parameters:\n\n");
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
RunTimeOpts rtOpts = { RunTimeOpts rtOpts = {
.ifaceName = { "wr0" },
.announceInterval = DEFAULT_ANNOUNCE_INTERVAL, .announceInterval = DEFAULT_ANNOUNCE_INTERVAL,
.syncInterval = DEFAULT_SYNC_INTERVAL, .syncInterval = DEFAULT_SYNC_INTERVAL,
.clockQuality.clockAccuracy = DEFAULT_CLOCK_ACCURACY, .clockQuality.clockAccuracy = DEFAULT_CLOCK_ACCURACY,
...@@ -43,6 +44,9 @@ RunTimeOpts rtOpts = { ...@@ -43,6 +44,9 @@ RunTimeOpts rtOpts = {
.E2E_mode = TRUE, .E2E_mode = TRUE,
.wrStateRetry = WR_DEFAULT_STATE_REPEAT, .wrStateRetry = WR_DEFAULT_STATE_REPEAT,
.wrStateTimeout= WR_DEFAULT_STATE_TIMEOUT_MS, .wrStateTimeout= WR_DEFAULT_STATE_TIMEOUT_MS,
.phyCalibrationRequired = FALSE,
.disableFallbackIfWRFails = TRUE,
/*SLAVE only or MASTER only*/ /*SLAVE only or MASTER only*/
#ifdef WRPC_SLAVE #ifdef WRPC_SLAVE
.primarySource = FALSE, .primarySource = FALSE,
...@@ -202,8 +206,8 @@ void wrc_initialize() ...@@ -202,8 +206,8 @@ void wrc_initialize()
uart_init(); uart_init();
uart_write_string(__FILE__ " is up (compiled on " // uart_write_string(__FILE__ " is up (compiled on "
__DATE__ " " __TIME__ ")\n"); // __DATE__ " " __TIME__ ")\n");
mprintf("wr_core: starting up (press G to launch the GUI and D for extra debug messages)....\n"); mprintf("wr_core: starting up (press G to launch the GUI and D for extra debug messages)....\n");
...@@ -281,9 +285,9 @@ void wrc_initialize() ...@@ -281,9 +285,9 @@ void wrc_initialize()
int wrc_check_link() int wrc_check_link()
{ {
static int prev_link_state = -1; static int prev_link_state = -1;
int link_state = ep_link_up(); int link_state = ep_link_up(NULL);
int rv = 0; int rv = 0;
if(!prev_link_state && link_state) if(!prev_link_state && link_state)
{ {
...@@ -342,7 +346,7 @@ void wrc_handle_input() ...@@ -342,7 +346,7 @@ void wrc_handle_input()
case 'd': case 'd':
wrc_extra_debug = 1 - wrc_extra_debug; wrc_extra_debug = 1 - wrc_extra_debug;
wrc_debug_printf(0,"Verbose debug %s.\n", wrc_extra_debug ? "enabled" : "disabled"); // wrc_debug_printf(0,"Verbose debug %s.\n", wrc_extra_debug ? "enabled" : "disabled");
break; break;
...@@ -359,9 +363,6 @@ void wrc_handle_input() ...@@ -359,9 +363,6 @@ void wrc_handle_input()
// wrc_debug_printf(0,"Manual phase adjust: %d\n", wrc_man_phase); // wrc_debug_printf(0,"Manual phase adjust: %d\n", wrc_man_phase);
wr_servo_man_adjust_phase(wrc_man_phase); wr_servo_man_adjust_phase(wrc_man_phase);
break; break;
} }
} }
} }
...@@ -371,32 +372,22 @@ extern volatile int irq_cnt; ...@@ -371,32 +372,22 @@ extern volatile int irq_cnt;
int main(void) int main(void)
{ {
wrc_initialize();
//for(;;)
//{
// //mprintf("%d\n", timer_get_tics());
// spll_show_stats();
//}
//test_transition();
//wr_servo_rollover_test(1);
for(;;)
{
wrc_handle_input();
if(wrc_gui_mode)
wrc_mon_gui();
#if 1 wrc_initialize();
spll_init(SPLL_MODE_FREE_RUNNING_MASTER, 0, 1);
for(;;)
{
wrc_handle_input();
if(wrc_gui_mode)
wrc_mon_gui();
int l_status = wrc_check_link(); int l_status = wrc_check_link();
switch (l_status) switch (l_status)
{ {
case LINK_WENT_UP:
break;
case LINK_UP: case LINK_UP:
// softpll_check_lock();
update_rx_queues(); update_rx_queues();
break; break;
...@@ -405,12 +396,11 @@ int main(void) ...@@ -405,12 +396,11 @@ int main(void)
break; break;
} }
singlePortLoop(&rtOpts, ptpPortDS, 0);// RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS, int portIndex) singlePortLoop(&rtOpts, ptpPortDS, 0);// RunTimeOpts *rtOpts, PtpPortDS *ptpPortDS, int portIndex)
sharedPortsLoop(ptpPortDS); sharedPortsLoop(ptpPortDS);
delay(100000); spll_update_aux_clocks();
#endif // delay(1000);
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment