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

adc: add support for adcin.

parent d5868bff
-include Makefile.specific
OBJS := wrtd-rt-adcout.o
OUTPUT = wrtd-rt-adcout
OBJS := wrtd-rt-adc.o
OUTPUT = wrtd-rt-adc
TRTL ?= ../../../dependencies/mock-turtle/
TRTL_SW = $(TRTL)/software
......
......@@ -5,7 +5,13 @@
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)
struct OUT_QUEUE_STRUCT {
......@@ -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_NAME
#undef OUT_QUEUE_CONCAT
......@@ -12,6 +12,7 @@
#include "mockturtle-rt.h"
#include <mockturtle-framework.h>
#include "wrtd-common.h"
#include "fmc_adc_alt_trigin.h"
#define OUT_QUEUE_MAXTIME 10
#define OUT_QUEUE_PREFIX adcin_
......@@ -21,7 +22,8 @@
struct wrtd_adcin_dev {
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)
......@@ -61,7 +63,7 @@ static inline void adcin_writel(struct wrtd_adcin_dev *dev, uint32_t value,
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);
}
......@@ -71,20 +73,20 @@ static inline uint32_t adcin_readl (struct wrtd_adcin *dev, uint32_t reg)
/**
* Drop the given enqueued trigger
*/
static void drop_trigger(struct wrtd_fd_channel *out,
struct wrtd_event *ev,
struct lrt_pulse_queue *q, unsigned reason)
static void adcin_drop_trigger(struct wrtd_adcin_dev *dev,
struct wrtd_event *ev, 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;
/* Drop the pulse */
pulse_queue_pop(q);
adcin_out_queue_pop(q);
/* 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);
}
......@@ -112,9 +114,9 @@ static void adcin_output (struct wrtd_adcin_dev *dev)
#endif
if (ctrl & ALT_TRIGIN_CTRL_ENABLE) {
/* Armed but still waiting for trigger */
if (check_output_timeout (dev)) {
if (adcin_out_queue_check_timeout (q)) {
/* Will never trigger. Missed. */
drop_trigger(dev, ev, q, WRTD_LOG_DISCARD_TIMEOUT);
adcin_drop_trigger(dev, ev, WRTD_LOG_DISCARD_TIMEOUT);
}
} else {
/* Has been triggered. */
......@@ -130,11 +132,11 @@ static void adcin_output (struct wrtd_adcin_dev *dev)
if (adcin_out_queue_empty(q))
return;
ev = pulse_queue_front(q);
ev = adcin_out_queue_front(q);
ts = &ev->ts;
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;
}
......@@ -156,13 +158,12 @@ static void adcin_output (struct wrtd_adcin_dev *dev)
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_fd_channel *out = &fd->channels[ch];
struct wrtd_event *pq_ev;
pq_ev = pulse_queue_push(&out->queue);
pq_ev = adcin_out_queue_push(&dev->queue);
if (!pq_ev) {
/* overflow.
FIXME: stats ? */
......@@ -192,8 +193,8 @@ static int wrtd_out_disable(struct trtl_fw_msg *msg_i,
}
#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->idle = 1;
adcin_out_queue_init(&dev->queue);
dev->idle = 1;
}
......@@ -45,6 +45,11 @@ static inline int adcout_wr_time_locked(struct wrtd_adcout_dev *adcout)
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)
{
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)
}
else {
if (rule->conf.dest_cpu != WRTD_DEST_CPU_LOCAL) {
#if NBR_CPUS > 1
wrtd_remote_output
(&tev, rule->conf.dest_cpu, rule->conf.dest_ch);
#endif
} else {
/* Local delivery. */
wrtd_local_output(&tev, rule->conf.dest_ch);
......@@ -623,7 +625,7 @@ static int wrtd_main(void)
#ifdef WRTD_NET_RX
wrtd_recv_network();
#endif
#if NBR_CPUS > 0
#if NBR_CPUS > 1
wrtd_recv_loopback();
#endif
......
......@@ -202,6 +202,7 @@ struct wrtd_io_msg {
#define WRTD_APP_TDC_5CH 0x35D0
#define WRTD_APP_FD_4CH 0x35E0
#define WRTD_APP_ADCIN_5CH 0x35B0
enum wrtd_trtl_actions {
/* 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