Commit d6ba0125 authored by Tomasz Wlostowski's avatar Tomasz Wlostowski

added t2/t4_phase_transition measurement as an user command

parent 2b7a565f
......@@ -15,75 +15,11 @@
#include "ptpd.h"
int wrc_extra_debug = 1;
int wrc_gui_mode = 0;
int get_bitslide(int ep)
static int get_bitslide(int ep)
{
return (pcs_read(16) >> 4) & 0x1f;
}
#define MAX_BITSLIDES 20
static struct {
int occupied;
int phase_min, phase_max, phase_dev;
int rx_ahead;
int delta;
int hits;
} bslides[MAX_BITSLIDES];
int bslide_bins()
{
int i, hits = 0;
for(i=0;i<MAX_BITSLIDES;i++)
if(bslides[i].occupied) hits++;
return hits;
}
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
void bslide_update(int phase, int delta, int ahead, int bs)
{
bslides[bs].occupied = 1;
bslides[bs].phase_min = MIN(phase, bslides[bs].phase_min);
bslides[bs].phase_max = MAX(phase, bslides[bs].phase_max);
bslides[bs].phase_dev = bslides[bs].phase_max - bslides[bs].phase_min;
bslides[bs].delta = delta;
bslides[bs].rx_ahead = ahead;
bslides[bs].hits++;
}
static int quit = 0;
static void print_cal_stats()
{
int i,last_occupied = -1;
printf("Calibration statistics: \n");
printf("bitslide[UIs] | Delta[ns] | Ahead[bool] | phase_min[tics] | phase_max[tics] | phase_dev[tics] | hits | delta_prev[ps] \n");
for(i=0;i<MAX_BITSLIDES;i++)
if(bslides[i].occupied)
{
printf("%-15d %-11d %-13d %-17d %-17d %-17d %-6d %d\n",
i,
bslides[i].delta,
bslides[i].rx_ahead,
bslides[i].phase_min,
bslides[i].phase_max,
bslides[i].phase_dev,
bslides[i].hits,
(last_occupied >= 0) ? bslides[i].delta-bslides[last_occupied].delta:0
);
last_occupied = i;
}
printf("\n");
}
struct meas_entry {
int delta_ns;
int phase;
......@@ -91,7 +27,7 @@ struct meas_entry {
int ahead;
};
void purge_socket(wr_socket_t *sock)
static void purge_socket(wr_socket_t *sock)
{
wr_sockaddr_t from;
char buf[128];
......@@ -99,7 +35,7 @@ void purge_socket(wr_socket_t *sock)
while(ptpd_netif_recvfrom(sock, &from, buf, 128, NULL) > 0) update_rx_queues();
}
int meas_phase_range(wr_socket_t *sock, int phase_min, int phase_max, int phase_step, struct meas_entry *results)
static int meas_phase_range(wr_socket_t *sock, int phase_min, int phase_max, int phase_step, struct meas_entry *results)
{
char buf[128];
wr_timestamp_t ts_tx, ts_rx, ts_sync;
......@@ -107,6 +43,7 @@ int meas_phase_range(wr_socket_t *sock, int phase_min, int phase_max, int phase_
MsgHeader mhdr;
int setpoint = phase_min, i = 0, phase;
spll_set_phase_shift(SPLL_ALL_CHANNELS, phase_min);
while(spll_shifter_busy(0));
purge_socket(sock);
......@@ -130,10 +67,6 @@ int meas_phase_range(wr_socket_t *sock, int phase_min, int phase_max, int phase_
MsgFollowUp fup;
msgUnpackFollowUp(buf, &fup);
// mprintf("FUP shift: %d TS_ahead : %d ,nsec :%d ,phase: %d, dmphase: %d delta %d\n",shift,ts_sync.raw_ahead, ts_sync.nsec, ts_sync.phase, phase,
// fup.preciseOriginTimestamp.nanosecondsField - ts_sync.nsec);
mprintf("Shift: %d/%dps [step %dps] \r", setpoint,phase_max,phase_step);
results[i].phase = phase;
results[i].phase_sync = ts_sync.phase;
......@@ -154,7 +87,7 @@ int meas_phase_range(wr_socket_t *sock, int phase_min, int phase_max, int phase_
return i;
}
int find_transition(struct meas_entry *results, int n, int positive)
static int find_transition(struct meas_entry *results, int n, int positive)
{
int i;
for(i=0;i<n;i++)
......@@ -166,8 +99,7 @@ int find_transition(struct meas_entry *results, int n, int positive)
extern void ptpd_netif_set_phase_transition(wr_socket_t *sock, int phase);
void calc_trans()
int measure_t24p(int *value)
{
wr_socket_t *sock;
wr_sockaddr_t sock_addr;
......@@ -185,28 +117,21 @@ void calc_trans()
sock_addr.mac[4] = 0;
sock_addr.mac[5] = 0;
mprintf("---------------------------------\nWR PTP Core phase_transition parameter calibration program\n\
Make sure your SPEC is connected to a WR switch (running PTP in master mode)\n---------------------------------\n");
mprintf("Waiting for link to go up");
mprintf("LNK: ");
while( !ep_link_up(NULL) )
{
mprintf(".");
timer_delay(1000);
}
mprintf("\n");
mprintf("\nPLL: ");
spll_init(SPLL_MODE_SLAVE, 0, 1);
mprintf("Locking the PLL...");
while(!spll_check_lock(0));
mprintf("locked\n");
mprintf("\n");
if(ptpd_netif_init() != 0)
{
mprintf("ptpd-netif initialization failed\n");
return;
}
return -1;
sock = ptpd_netif_create_socket(PTPD_SOCK_RAW_ETHERNET, 0, &sock_addr);
nr=meas_phase_range(sock, 0, 8000, 1000, results);
......@@ -238,166 +163,8 @@ Make sure your SPEC is connected to a WR switch (running PTP in master mode)\n--
for(i=0;i<nr;i++) mprintf("phase_dmtd: %d delta_ns: %d, phase_sync: %d\n", results[i].phase, results[i].delta_ns, results[i].phase_sync);
for(;;);
// print_cal_stats();
}
void pps_adjustment_test()
{
wr_timestamp_t ts_tx, ts_rx;
wr_socket_t *sock;
wr_sockaddr_t sock_addr, to, from;
int adjust_count = 0;
sock_addr.family = PTPD_SOCK_RAW_ETHERNET; // socket type
sock_addr.ethertype = 0x88f7;
sock_addr.mac[0] = 0x1;
sock_addr.mac[1] = 0x1b;
sock_addr.mac[2] = 0x19;
sock_addr.mac[3] = 0;
sock_addr.mac[4] = 0;
sock_addr.mac[5] = 0;
ptpd_netif_init();
sock = ptpd_netif_create_socket(PTPD_SOCK_RAW_ETHERNET, 0, &sock_addr);
while(!quit)
{
char buf[128];
wr_sockaddr_t to;
// memset(to.mac, 0xff, 6);
to.mac[0] = 0x1;
to.mac[1] = 0x1b;
to.mac[2] = 0x19;
to.mac[3] = 0;
to.mac[4] = 0;
to.mac[5] = 0;
to.ethertype = 0x88f7;
to.family = PTPD_SOCK_RAW_ETHERNET; // socket type
if(adjust_count == 0)
{
ptpd_netif_adjust_counters(1,0);// 500000000);
adjust_count = 8;
}
// if(!ptpd_netif_adjust_in_progress())
{
ptpd_netif_sendto(sock, &to, buf, 64, &ts_tx);
update_rx_queues();
int n = ptpd_netif_recvfrom(sock, &from, buf, 128, &ts_rx);
mprintf("TX timestamp: correct %d %d:%d\n", ts_tx.correct, (int) ts_tx.utc, ts_tx.nsec);
mprintf("RX timestamp: correct %d %d:%d\n", ts_rx.correct, (int) ts_rx.utc, ts_rx.nsec);
adjust_count --;
}// else printf("AdjustInProgress\n");
timer_delay(1000);
}
}
void wrc_debug_printf(int subsys, const char *fmt, ...)
{
va_list ap;
if(wrc_gui_mode) return;
va_start(ap, fmt);
if(wrc_extra_debug || (!wrc_extra_debug))
vprintf(fmt, ap);
va_end(ap);
}
void wrc_initialize()
{
int ret, i;
uint8_t mac_addr[6], ds18_id[8] = {0,0,0,0,0,0,0,0};
char sfp_pn[17];
uart_init();
uart_write_string(__FILE__ " is up (compiled on "
__DATE__ " " __TIME__ ")\n");
if(value) *value = ttrans;
mac_addr[0] = 0x08; //
mac_addr[1] = 0x00; // CERN OUI
mac_addr[2] = 0x30; //
mac_addr[3] = 0xca;
mac_addr[4] = 0xfe;
mac_addr[5] = 0xba;
timer_init(1);
ep_init(mac_addr);
ep_enable(1, 1);
minic_init();
pps_gen_init();
}
#define LINK_UP 0
#define LINK_WENT_UP 1
#define LINK_DOWN 2
#define LINK_WENT_DOWN 3
int wrc_check_link()
{
static int prev_link_state = -1;
int link_state = ep_link_up(NULL);
int rv = 0;
if(!prev_link_state && link_state)
{
TRACE_DEV("Link up.\n");
gpio_out(GPIO_LED_LINK, 1);
rv = LINK_WENT_UP;
} else if(prev_link_state && !link_state)
{
TRACE_DEV("Link down.\n");
gpio_out(GPIO_LED_LINK, 0);
rv = LINK_WENT_DOWN;
} else rv = (link_state ? LINK_UP : LINK_DOWN);
prev_link_state = link_state;
return rv;
}
int main(void)
{
wrc_initialize();
calc_trans();
for(;;);
for(;;)
{
int l_status = wrc_check_link();
switch (l_status)
{
case LINK_WENT_UP:
mprintf("Link up.\n");
spll_init(SPLL_MODE_SLAVE, 0, 1);
case LINK_UP:
break;
case LINK_WENT_DOWN:
mprintf("Link down.\n");
break;
}
spll_show_stats();
// timer_delay(1000);
}
return 0;
}
OBJS_TESTS = tests/measure_t24p.o
\ No newline at end of file
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