Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
S
Software for White Rabbit PTP Core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
32
Issues
32
List
Board
Labels
Milestones
Merge Requests
6
Merge Requests
6
CI / CD
CI / CD
Pipelines
Schedules
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Projects
Software for White Rabbit PTP Core
Commits
3d8b7b3d
Commit
3d8b7b3d
authored
Apr 23, 2020
by
Tomasz Wlostowski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[wip] ertm14: RF NCO sync over streamers starting to work!
parent
483e2775
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
160 additions
and
42 deletions
+160
-42
board.c
boards/ertm14/board.c
+160
-42
No files found.
boards/ertm14/board.c
View file @
3d8b7b3d
...
...
@@ -140,7 +140,6 @@ static struct ad95xx_config clk_dist_ertm15_default_config =
static
spll_gain_schedule_t
spll_main_ocxo_gain_sched
;
static
int
has_new_config
=
0
;
static
int
ertm_init_complete
=
0
;
static
int
ertm14_update_config_task
(
void
);
...
...
@@ -489,14 +488,6 @@ static void ertm14_align_ref_out_to_pps(void)
#if 0
#define CLK_PPS_STATE_START 0
#define CLK_PPS_STATE_MASTER 1
#define CLK_PPS_STATE_WAIT_SERVO 2
#define CLK_PPS_STATE_SLAVE 3
#define CLK_PPS_STATE_DONE 4
#define CLK_PPS_STATE_RUN_SYNC 5
#define CLK_PPS_SYNC_MAX_HANDLERS 2
struct ertm14_clk_pps_sync_handler {
...
...
@@ -704,20 +695,131 @@ static void ertm14_clk_pps_sync_task(void)
#endif
static
int
evth_
clk_pps
_sync
;
static
int
evth_
dds_nco
_sync
;
static
void
ertm14_clk_pps_sync_init
(
void
)
#define DDS_NCO_STATE_WAIT_TIMING 0
#define DDS_NCO_STATE_RECONFIGURE 1
#define DDS_NCO_STATE_ARM 2
#define DDS_NCO_STATE_WAIT_TRIGGER 3
static
int
dds_nco_sync_state
=
0
;
static
void
ertm14_dds_nco_sync_init
(
void
)
{
evth_clk_pps_sync
=
event_listener_create
()
;
dds_nco_sync_state
=
DDS_NCO_STATE_WAIT_TIMING
;
}
static
void
ertm14_clk_pps_sync_task
(
void
)
static
void
rf_nco_sync_disable_channel
(
struct
ertm14_dds_state
*
state
,
uint32_t
ioupdate_channel
)
{
fine_pulse_gen_setup_channel
(
&
board
.
dds_sync_dev
,
ioupdate_channel
,
1
,
board
.
dds_sync_delays
[
ioupdate_channel
],
0
);
state
->
sync_count
=
0
;
}
static
void
rf_nco_sync_configure_channel
(
struct
ertm14_dds_state
*
state
,
uint32_t
ioupdate_channel
)
{
int
flags
=
0
;
pp_printf
(
"nco_sync: source=%d
\n
"
,
state
->
sync_source
);
if
(
state
->
sync_source
==
ERTM14_SYNC_SOURCE_RF_TRIGGER
)
flags
|=
FINE_PULSE_GEN_USE_EXT_TRIGGER
;
fine_pulse_gen_setup_channel
(
&
board
.
dds_sync_dev
,
ioupdate_channel
,
1
,
board
.
dds_sync_delays
[
ioupdate_channel
],
flags
);
state
->
sync_count
=
0
;
}
static
void
rf_nco_sync_arm_channel
(
struct
ertm14_dds_state
*
state
,
uint32_t
ioupdate_channel
)
{
if
(
state
->
sync_source
==
ERTM14_SYNC_SOURCE_NONE
)
return
;
fine_pulse_gen_trigger
(
&
board
.
dds_sync_dev
,
(
1
<<
ioupdate_channel
),
0
);
}
static
int
rf_nco_sync_wait_trigger
(
struct
ertm14_dds_state
*
state
,
uint32_t
ioupdate_channel
)
{
int
evt
=
event_poll
(
evth_clk_pps_sync
);
// no sync? consider the channel always triggered
if
(
state
->
sync_source
==
ERTM14_SYNC_SOURCE_NONE
)
return
1
;
return
fine_pulse_gen_is_triggered
(
&
board
.
dds_sync_dev
,
1
<<
ioupdate_channel
);
}
static
void
ertm14_dds_nco_sync_task
(
void
)
{
int
evt
=
event_poll
(
evth_dds_nco_sync
);
if
(
evt
>
0
)
pp_printf
(
"**********ncosync %d
\n
"
,
evt
);
if
(
evt
)
switch
(
evt
)
{
board_dbg
(
"[dds-trigger-rx] GOT EVENT: %d
\n
"
,
evt
);
case
WRC_ERTM14_EVENT_RECONFIGURED
:
board_dbg
(
"nco_sync: reconfig request
\n
"
);
dds_nco_sync_state
=
DDS_NCO_STATE_RECONFIGURE
;
break
;
case
WRC_EVENT_LINK_DOWN
:
case
WRC_EVENT_LINK_UP
:
case
WRC_EVENT_TIMING_DOWN
:
case
WRC_EVENT_TIMING_UP
:
board_dbg
(
"link/timing status change, restarting nco_sync
\n
"
);
rf_nco_sync_disable_channel
(
&
ertm14_current_state
->
ref
,
ERTM14_DDS_IOUPDATE_REF
);
rf_nco_sync_disable_channel
(
&
ertm14_current_state
->
lo
,
ERTM14_DDS_IOUPDATE_LO
);
dds_nco_sync_state
=
DDS_NCO_STATE_WAIT_TIMING
;
break
;
default:
break
;
}
switch
(
dds_nco_sync_state
)
{
case
DDS_NCO_STATE_WAIT_TIMING
:
if
(
evt
==
WRC_EVENT_TIMING_UP
)
{
board_dbg
(
"nco_sync: timing up, configuring FPGen
\n
"
);
dds_nco_sync_state
=
DDS_NCO_STATE_RECONFIGURE
;
}
break
;
case
DDS_NCO_STATE_RECONFIGURE
:
if
(
!
wrc_is_timing_up
()
)
{
dds_nco_sync_state
=
DDS_NCO_STATE_WAIT_TIMING
;
}
else
{
rf_nco_sync_configure_channel
(
&
ertm14_current_state
->
ref
,
ERTM14_DDS_IOUPDATE_REF
);
rf_nco_sync_configure_channel
(
&
ertm14_current_state
->
lo
,
ERTM14_DDS_IOUPDATE_LO
);
}
dds_nco_sync_state
=
DDS_NCO_STATE_ARM
;
break
;
case
DDS_NCO_STATE_ARM
:
board_dbg
(
"(Arm!)
\n
"
);
rf_nco_sync_arm_channel
(
&
ertm14_current_state
->
ref
,
ERTM14_DDS_IOUPDATE_REF
);
rf_nco_sync_arm_channel
(
&
ertm14_current_state
->
lo
,
ERTM14_DDS_IOUPDATE_LO
);
dds_nco_sync_state
=
DDS_NCO_STATE_WAIT_TRIGGER
;
break
;
case
DDS_NCO_STATE_WAIT_TRIGGER
:
{
int
trig_ref
=
rf_nco_sync_wait_trigger
(
&
ertm14_current_state
->
ref
,
ERTM14_DDS_IOUPDATE_REF
);
int
trig_lo
=
rf_nco_sync_wait_trigger
(
&
ertm14_current_state
->
lo
,
ERTM14_DDS_IOUPDATE_REF
);
if
(
trig_ref
&&
trig_lo
)
{
board_dbg
(
"(Trig!)
\n
"
);
dds_nco_sync_state
=
DDS_NCO_STATE_ARM
;
}
break
;
}
default:
break
;
}
}
...
...
@@ -869,12 +971,11 @@ int ertm14_init_mac_eeprom(void)
ep_set_mac_addr
(
mac
);
}
int
ertm14_init
(
void
)
int
ertm14_
low_level_
init
(
void
)
{
int
i
;
uint32_t
id
;
has_new_config
=
0
;
ertm_init_complete
=
0
;
memset
(
&
board
,
0
,
sizeof
(
struct
ertm14_board
));
...
...
@@ -1020,9 +1121,11 @@ int ertm14_init(void)
board_dbg
(
"Initializing DDSes
\n
"
);
ertm15_init_dds
();
uint64_t
ftw
=
ad9910_frequency_to_ftw
(
&
board
.
dds_ad9910_ref
,
ERTM14_DEFAULT_DDS_FREQUENCY_HZ
);
/* Program the DDSes to some meaninfgul settings, say, 205 MHz */
ad9910_program
(
&
board
.
dds_ad9910_ref
,
205000000ULL
,
0
,
0x0
);
ad9910_program
(
&
board
.
dds_ad9910_lo
,
205000000ULL
,
0
,
0x0
);
ad9910_program
(
&
board
.
dds_ad9910_ref
,
ftw
,
0
,
0x0
);
ad9910_program
(
&
board
.
dds_ad9910_lo
,
ftw
,
0
,
0x0
);
}
/* Setup the SoftPLL for the OCXO we have */
...
...
@@ -1076,10 +1179,9 @@ void ertm14_config_init()
cfg
->
ref
.
sync_count
=
0
;
cfg
->
lo
.
sync_count
=
0
;
cfg
->
ref
.
sync_source
=
ERTM14_SYNC_SOURCE_PPS
;
cfg
->
lo
.
sync_source
=
ERTM14_SYNC_SOURCE_PPS
;
cfg
->
ref
.
sync_state
=
ERTM14_SYNC_STATE_IDLE
;
cfg
->
lo
.
sync_state
=
ERTM14_SYNC_STATE_IDLE
;
cfg
->
ref
.
sync_source
=
ERTM14_SYNC_SOURCE_RF_TRIGGER
;
cfg
->
lo
.
sync_source
=
ERTM14_SYNC_SOURCE_RF_TRIGGER
;
for
(
j
=
0
;
j
<=
ERTM14_CLKAB_OUT_MAX_ID
;
j
++
)
{
...
...
@@ -1100,8 +1202,9 @@ struct ertm14_board_state *ertm14_get_state_for_config(int config_id)
int
ertm14_apply_config
(
int
config_id
)
{
board_dbg
(
"Apply_config: %d
\n
"
,
config_id
);
ertm14_current_state
=
&
ertm14_configs
[
config_id
];
has_new_config
=
1
;
event_post
(
WRC_ERTM14_EVENT_APPLY_NEW_CONFIG
)
;
}
int
ertm14_get_current_config_id
()
...
...
@@ -1158,24 +1261,32 @@ static int ertm14_commit_config( struct ertm14_board_state *cfg )
ertm15_rf_distr_output_enable
(
&
board
.
rf_distr
,
ERTM15_RF_REF
,
i
,
st_ref
);
}
cfg
->
lo
.
sync_state
=
ERTM14_SYNC_STATE_IDLE
;
cfg
->
ref
.
sync_state
=
ERTM14_SYNC_STATE_IDLE
;
ertm15_update_rf_switches
(
&
board
.
rf_distr
);
}
static
int
ertm14_update_config_task
(
void
)
static
int
evth_config_update_listener
;
static
int
ertm14_config_update_init
(
void
)
{
}
static
int
ertm14_config_update_task
(
void
)
{
if
(
has_new_config
&&
ertm_init_complete
&&
ertm14_current_state
->
valid
)
//pp_printf("cutask %d\n", ertm_init_complete );
if
(
ertm_init_complete
)
{
int
i
;
board_dbg
(
"New config detected, applying...
\n
"
);
int
evt
=
event_poll
(
evth_config_update_listener
);
has_new_config
=
0
;
if
(
evt
>
0
)
{
pp_printf
(
"####################CUEvt %d
\n
"
,
evt
);
}
if
(
!
(
board
.
mode
&
ERTM14_MODE_WITHOUT_ERTM15
)
)
if
(
evt
==
WRC_ERTM14_EVENT_APPLY_NEW_CONFIG
)
{
board_dbg
(
"New config detected, applying...
\n
"
);
ertm14_commit_config
(
ertm14_current_state
);
event_post
(
WRC_ERTM14_EVENT_RECONFIGURED
);
}
}
}
...
...
@@ -1245,25 +1356,32 @@ int wrc_board_early_init()
/* reset the networking part of the WRCore and start the WR Endpoint */
net_rst
();
return
ertm14_init
();
return
ertm14_
low_level_
init
();
}
extern
int
phy_calibration_poll
();
extern
void
phy_calibration_init
();
int
wrc_board_init
()
{
ertm14_shell_init
();
evth_dds_nco_sync
=
event_listener_create
();
evth_config_update_listener
=
event_listener_create
();
wrc_task_create
(
"iuart14"
,
NULL
,
iuart_14_poll
);
wrc_task_create
(
"rf-nco-sync"
,
ertm14_dds_nco_sync_init
,
ertm14_dds_nco_sync_task
);
wrc_task_create
(
"ertm-config"
,
ertm14_config_update_init
,
ertm14_config_update_task
);
wrc_task_create
(
"phy-cal"
,
phy_calibration_init
,
phy_calibration_poll
);
ertm14_apply_config
(
0
);
return
0
;
}
extern
int
phy_calibration_poll
();
extern
void
phy_calibration_init
();
int
wrc_board_create_tasks
()
{
wrc_task_create
(
"iuart14"
,
NULL
,
iuart_14_poll
);
wrc_task_create
(
"clk-pps-sync"
,
ertm14_clk_pps_sync_init
,
ertm14_clk_pps_sync_task
);
wrc_task_create
(
"ertm-config"
,
NULL
,
ertm14_update_config_task
);
wrc_task_create
(
"phy-cal"
,
phy_calibration_init
,
phy_calibration_poll
);
return
0
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment