From 0ca42dbdbe5849e1cae9f0c9039f14ae0a0f35ba Mon Sep 17 00:00:00 2001 From: Sebastien Bourdeauducq Date: Sat, 9 May 2015 17:26:36 +0800 Subject: [PATCH] runtime/dds: send one FUD per command in a batch, compensate POW --- soc/runtime/dds.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/soc/runtime/dds.c b/soc/runtime/dds.c index 2429eb2b6..fc871fa26 100644 --- a/soc/runtime/dds.c +++ b/soc/runtime/dds.c @@ -6,8 +6,8 @@ #include "dds.h" #define DURATION_WRITE 5 -#define DURATION_INIT (8*DURATION_WRITE) -#define DURATION_PROGRAM (8*DURATION_WRITE) +#define DURATION_INIT (7*DURATION_WRITE) /* not counting FUD */ +#define DURATION_PROGRAM (8*DURATION_WRITE) /* not counting FUD */ #define DDS_WRITE(addr, data) do { \ rtio_o_address_write(addr); \ @@ -25,7 +25,7 @@ void dds_init_all(void) now = rtio_get_counter() + 10000; for(i=0;i> 16) & 0xff); DDS_WRITE(DDS_FTW3, (ftw >> 24) & 0xff); + /* We assume that the RTIO clock is DDS SYNCLK */ if(phase_mode == PHASE_MODE_TRACKING) - /* We assume that the RTIO clock is DDS SYNCLK */ - pow += (timestamp >> RTIO_FINE_TS_WIDTH)*ftw >> 18; + pow += (ref_time >> RTIO_FINE_TS_WIDTH)*ftw >> 18; + if(phase_mode != PHASE_MODE_CONTINUOUS) { + long long int fud_time; + + fud_time = now + 2*DURATION_WRITE; + pow -= ((ref_time - fud_time) >> RTIO_FINE_TS_WIDTH)*ftw >> 18; + } + DDS_WRITE(DDS_POW0, pow & 0xff); DDS_WRITE(DDS_POW1, (pow >> 8) & 0x3f); + DDS_WRITE(DDS_FUD, 0); } struct dds_set_params { @@ -83,7 +91,7 @@ struct dds_set_params { static int batch_mode; static int batch_count; -static long long int batch_fud_time; +static long long int batch_ref_time; static struct dds_set_params batch[DDS_MAX_BATCH]; void dds_batch_enter(long long int timestamp) @@ -92,7 +100,7 @@ void dds_batch_enter(long long int timestamp) exception_raise(EID_DDS_BATCH_ERROR); batch_mode = 1; batch_count = 0; - batch_fud_time = timestamp; + batch_ref_time = timestamp; } void dds_batch_exit(void) @@ -103,13 +111,13 @@ void dds_batch_exit(void) if(!batch_mode) exception_raise(EID_DDS_BATCH_ERROR); rtio_chan_sel_write(RTIO_DDS_CHANNEL); - now = batch_fud_time - batch_count*DURATION_PROGRAM; + /* + FUD time */ + now = batch_ref_time - batch_count*(DURATION_PROGRAM + DURATION_WRITE); for(i=0;i