Commit 2a853764 authored by Tristan Gingold's avatar Tristan Gingold

adc: add support for adcin.

parent d5868bff
-include Makefile.specific -include Makefile.specific
OBJS := wrtd-rt-adcout.o OBJS := wrtd-rt-adc.o
OUTPUT = wrtd-rt-adcout OUTPUT = wrtd-rt-adc
TRTL ?= ../../../dependencies/mock-turtle/ TRTL ?= ../../../dependencies/mock-turtle/
TRTL_SW = $(TRTL)/software TRTL_SW = $(TRTL)/software
......
...@@ -5,7 +5,13 @@ ...@@ -5,7 +5,13 @@
OUT_QUEUE_MAXTIME: maximum time in advance. OUT_QUEUE_MAXTIME: maximum time in advance.
*/ */
#define OUT_QUEUE_NAME(x) OUT_QUEUE_PREFIX##x #ifndef OUT_QUEUE_PREFIX
#error "OUT_QUEUE_PREFIX not defined"
#endif
#define OUT_QUEUE_CONCAT2(x,y) x##y
#define OUT_QUEUE_CONCAT(x,y) OUT_QUEUE_CONCAT2(x,y)
#define OUT_QUEUE_NAME(x) OUT_QUEUE_CONCAT(OUT_QUEUE_PREFIX,x)
#define OUT_QUEUE_STRUCT OUT_QUEUE_NAME(out_queue) #define OUT_QUEUE_STRUCT OUT_QUEUE_NAME(out_queue)
struct OUT_QUEUE_STRUCT { struct OUT_QUEUE_STRUCT {
...@@ -119,3 +125,4 @@ static int OUT_QUEUE_NAME(out_queue_check_timeout) (struct OUT_QUEUE_STRUCT *q) ...@@ -119,3 +125,4 @@ static int OUT_QUEUE_NAME(out_queue_check_timeout) (struct OUT_QUEUE_STRUCT *q)
#undef OUT_QUEUE_STRUCT #undef OUT_QUEUE_STRUCT
#undef OUT_QUEUE_NAME #undef OUT_QUEUE_NAME
#undef OUT_QUEUE_CONCAT
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "mockturtle-rt.h" #include "mockturtle-rt.h"
#include <mockturtle-framework.h> #include <mockturtle-framework.h>
#include "wrtd-common.h" #include "wrtd-common.h"
#include "fmc_adc_alt_trigin.h"
#define OUT_QUEUE_MAXTIME 10 #define OUT_QUEUE_MAXTIME 10
#define OUT_QUEUE_PREFIX adcin_ #define OUT_QUEUE_PREFIX adcin_
...@@ -21,7 +22,8 @@ ...@@ -21,7 +22,8 @@
struct wrtd_adcin_dev { struct wrtd_adcin_dev {
uint32_t io_addr; uint32_t io_addr;
adcin_out_queue queue; int idle;
struct adcin_out_queue queue;
}; };
static inline int adcin_wr_present(struct wrtd_adcin_dev *fd) static inline int adcin_wr_present(struct wrtd_adcin_dev *fd)
...@@ -61,7 +63,7 @@ static inline void adcin_writel(struct wrtd_adcin_dev *dev, uint32_t value, ...@@ -61,7 +63,7 @@ static inline void adcin_writel(struct wrtd_adcin_dev *dev, uint32_t value,
dp_writel(value, dev->io_addr + reg); dp_writel(value, dev->io_addr + reg);
} }
static inline uint32_t adcin_readl (struct wrtd_adcin *dev, uint32_t reg) static inline uint32_t adcin_readl (struct wrtd_adcin_dev *dev, uint32_t reg)
{ {
return dp_readl(dev->io_addr + reg); return dp_readl(dev->io_addr + reg);
} }
...@@ -71,20 +73,20 @@ static inline uint32_t adcin_readl (struct wrtd_adcin *dev, uint32_t reg) ...@@ -71,20 +73,20 @@ static inline uint32_t adcin_readl (struct wrtd_adcin *dev, uint32_t reg)
/** /**
* Drop the given enqueued trigger * Drop the given enqueued trigger
*/ */
static void drop_trigger(struct wrtd_fd_channel *out, static void adcin_drop_trigger(struct wrtd_adcin_dev *dev,
struct wrtd_event *ev, struct wrtd_event *ev, unsigned reason)
struct lrt_pulse_queue *q, unsigned reason)
{ {
out->idle = 1; struct adcin_out_queue *q = &dev->queue;
dev->idle = 1;
if (pulse_queue_empty(q)) if (adcin_out_queue_empty(q))
return; return;
/* Drop the pulse */ /* Drop the pulse */
pulse_queue_pop(q); adcin_out_queue_pop(q);
/* Disarm the FD output */ /* Disarm the FD output */
fd_ch_writel(out, FD_DCR_MODE, FD_REG_DCR); adcin_writel(dev, 0, ALT_TRIGIN_CTRL);
wrtd_log(WRTD_LOG_MSG_EV_DISCARDED, reason, ev, NULL); wrtd_log(WRTD_LOG_MSG_EV_DISCARDED, reason, ev, NULL);
} }
...@@ -112,9 +114,9 @@ static void adcin_output (struct wrtd_adcin_dev *dev) ...@@ -112,9 +114,9 @@ static void adcin_output (struct wrtd_adcin_dev *dev)
#endif #endif
if (ctrl & ALT_TRIGIN_CTRL_ENABLE) { if (ctrl & ALT_TRIGIN_CTRL_ENABLE) {
/* Armed but still waiting for trigger */ /* Armed but still waiting for trigger */
if (check_output_timeout (dev)) { if (adcin_out_queue_check_timeout (q)) {
/* Will never trigger. Missed. */ /* Will never trigger. Missed. */
drop_trigger(dev, ev, q, WRTD_LOG_DISCARD_TIMEOUT); adcin_drop_trigger(dev, ev, WRTD_LOG_DISCARD_TIMEOUT);
} }
} else { } else {
/* Has been triggered. */ /* Has been triggered. */
...@@ -130,11 +132,11 @@ static void adcin_output (struct wrtd_adcin_dev *dev) ...@@ -130,11 +132,11 @@ static void adcin_output (struct wrtd_adcin_dev *dev)
if (adcin_out_queue_empty(q)) if (adcin_out_queue_empty(q))
return; return;
ev = pulse_queue_front(q); ev = adcin_out_queue_front(q);
ts = &ev->ts; ts = &ev->ts;
if (!wr_is_timing_ok()) { if (!wr_is_timing_ok()) {
drop_trigger(out, ev, q, WRTD_LOG_DISCARD_NO_SYNC); adcin_drop_trigger(dev, ev, WRTD_LOG_DISCARD_NO_SYNC);
return; return;
} }
...@@ -156,13 +158,12 @@ static void adcin_output (struct wrtd_adcin_dev *dev) ...@@ -156,13 +158,12 @@ static void adcin_output (struct wrtd_adcin_dev *dev)
dev->idle = 0; dev->idle = 0;
} }
static void fd_local_output(struct wrtd_fd_dev *fd, static void adcin_local_output(struct wrtd_adcin_dev *dev,
struct wrtd_event *ev, unsigned ch) struct wrtd_event *ev, unsigned ch)
{ {
struct wrtd_fd_channel *out = &fd->channels[ch];
struct wrtd_event *pq_ev; struct wrtd_event *pq_ev;
pq_ev = pulse_queue_push(&out->queue); pq_ev = adcin_out_queue_push(&dev->queue);
if (!pq_ev) { if (!pq_ev) {
/* overflow. /* overflow.
FIXME: stats ? */ FIXME: stats ? */
...@@ -192,8 +193,8 @@ static int wrtd_out_disable(struct trtl_fw_msg *msg_i, ...@@ -192,8 +193,8 @@ static int wrtd_out_disable(struct trtl_fw_msg *msg_i,
} }
#endif #endif
static void wrtd_adcin_data_init(struct wrtd_adcin_dev *dev) static void adcin_data_init(struct wrtd_adcin_dev *dev)
{ {
adcin_out_queue_init(&fd->channels[i].queue); adcin_out_queue_init(&dev->queue);
adcin->idle = 1; dev->idle = 1;
} }
...@@ -45,6 +45,11 @@ static inline int adcout_wr_time_locked(struct wrtd_adcout_dev *adcout) ...@@ -45,6 +45,11 @@ static inline int adcout_wr_time_locked(struct wrtd_adcout_dev *adcout)
return 1; return 1;
} }
static void adcout_wr_enable_lock(struct wrtd_adcout_dev *dev, int enable)
{
return;
}
static inline int adcout_wr_time_ready(struct wrtd_adcout_dev *adcout) static inline int adcout_wr_time_ready(struct wrtd_adcout_dev *adcout)
{ {
return adcout_readl(adcout, ALT_TRIGOUT_STATUS) & ALT_TRIGOUT_WR_VALID; return adcout_readl(adcout, ALT_TRIGOUT_STATUS) & ALT_TRIGOUT_WR_VALID;
......
...@@ -414,8 +414,10 @@ static void wrtd_route(struct wrtd_rule *rule, const struct wrtd_event *ev) ...@@ -414,8 +414,10 @@ static void wrtd_route(struct wrtd_rule *rule, const struct wrtd_event *ev)
} }
else { else {
if (rule->conf.dest_cpu != WRTD_DEST_CPU_LOCAL) { if (rule->conf.dest_cpu != WRTD_DEST_CPU_LOCAL) {
#if NBR_CPUS > 1
wrtd_remote_output wrtd_remote_output
(&tev, rule->conf.dest_cpu, rule->conf.dest_ch); (&tev, rule->conf.dest_cpu, rule->conf.dest_ch);
#endif
} else { } else {
/* Local delivery. */ /* Local delivery. */
wrtd_local_output(&tev, rule->conf.dest_ch); wrtd_local_output(&tev, rule->conf.dest_ch);
...@@ -623,7 +625,7 @@ static int wrtd_main(void) ...@@ -623,7 +625,7 @@ static int wrtd_main(void)
#ifdef WRTD_NET_RX #ifdef WRTD_NET_RX
wrtd_recv_network(); wrtd_recv_network();
#endif #endif
#if NBR_CPUS > 0 #if NBR_CPUS > 1
wrtd_recv_loopback(); wrtd_recv_loopback();
#endif #endif
......
...@@ -202,6 +202,7 @@ struct wrtd_io_msg { ...@@ -202,6 +202,7 @@ struct wrtd_io_msg {
#define WRTD_APP_TDC_5CH 0x35D0 #define WRTD_APP_TDC_5CH 0x35D0
#define WRTD_APP_FD_4CH 0x35E0 #define WRTD_APP_FD_4CH 0x35E0
#define WRTD_APP_ADCIN_5CH 0x35B0
enum wrtd_trtl_actions { enum wrtd_trtl_actions {
/* Always the first one, to get root and version. */ /* Always the first one, to get root and version. */
......
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