Commit a0604894 authored by Federico Vaga's avatar Federico Vaga

trig-dist move to wrtd

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>


NOTE
This commit has been created by `git subtree` on the Mock Turtle repository
on tag mock-turtle-2.0

This commit will not compile
parents
.PHONY: all clean modules install modules_install clean_all
.PHONY: gitmodules prereq prereq_install prereq_install_warn prereq_clean
DIRS = lib tools doc
WRTD=$(shell pwd)
export WRTD
export WRNC
all clean modules install modules_install: gitmodules
for d in $(DIRS); do $(MAKE) -C $$d $@ || exit 1; done
/*
* This work is part of the White Rabbit Node Core project.
*
* Copyright (C) 2013-2014 CERN (www.cern.ch)
* Author: Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* Released according to the GNU GPL, version 2 or any later version.
*/
#ifndef __WRTD_COMMON_H
#define __WRTD_COMMON_H
#define WRTD_CPU_TDC 0
#define WRTD_CPU_FD 1
#define WRTD_IN_MAX 2
#define WRTD_IN_TDC_CONTROL 0
#define WRTD_IN_FD_CONTROL 1
#define WRTD_OUT_MAX 4
#define WRTD_OUT_TDC_CONTROL 0
#define WRTD_OUT_FD_CONTROL 1
#define WRTD_OUT_TDC_LOGGING 2
#define WRTD_OUT_FD_LOGGING 3
/* Command and log message IDs */
#define WRTD_LOG_RAW_INPUT 0x1
#define WRTD_LOG_SENT_TRIGGER 0x2
#define WRTD_CMD_TDC_CHAN_ENABLE 0x1
#define WRTD_CMD_TDC_CHAN_SET_DEAD_TIME 0x2
#define WRTD_CMD_TDC_CHAN_SET_DELAY 0x3
#define WRTD_CMD_TDC_CHAN_GET_STATE 0x4
#define WRTD_CMD_TDC_CHAN_ARM 0x5
#define WRTD_CMD_TDC_CHAN_SET_MODE 0x7
#define WRTD_CMD_TDC_CHAN_SET_SEQ 0x8
#define WRTD_CMD_TDC_CHAN_ASSIGN_TRIGGER 0x9
#define WRTD_CMD_TDC_CHAN_SET_FLAGS 0xa
#define WRTD_CMD_TDC_CHAN_SET_TIMEBASE_OFFSET 0xb
#define WRTD_CMD_TDC_PING 0xc
#define WRTD_CMD_TDC_SOFTWARE_TRIGGER 0xd
#define WRTD_CMD_TDC_CHAN_SET_LOG_LEVEL 0xe
#define WRTD_CMD_TDC_CHAN_RESET_COUNTERS 0xf
#define WRTD_CMD_FD_CHAN_ENABLE 0x1
#define WRTD_CMD_FD_CHAN_ASSIGN_TRIGGER 0x2
#define WRTD_CMD_FD_READ_HASH 0x3
#define WRTD_CMD_FD_CHAN_REMOVE_TRIGGER 0x4
#define WRTD_CMD_FD_CHAN_GET_STATE 0x5
#define WRTD_CMD_FD_CHAN_SET_DELAY 0x6
#define WRTD_CMD_FD_CHAN_SET_WIDTH 0x7
#define WRTD_CMD_FD_CHAN_SET_MODE 0x8
#define WRTD_CMD_FD_SOFTWARE_TRIGGER 0x9
#define WRTD_CMD_FD_CHAN_ARM 0xa
#define WRTD_REP_ACK_ID 0x100
#define WRTD_REP_STATE 0x101
#define WRTD_REP_NACK 0x102
#define WRTD_REP_TRIGGER_HANDLE 0x103
#define WRTD_REP_HASH_ENTRY 0x104
#define TDC_NUM_CHANNELS 5
#define TDC_TRIGGER_COALESCE_LIMIT 5
#define FD_NUM_CHANNELS 4
#define FD_HASH_ENTRIES 128
#define FD_MAX_QUEUE_PULSES 16
/**
* availables trigger mode
*/
enum wrtd_trigger_mode {
WRTD_TRIGGER_MODE_SINGLE = 1, /**< In SINGLE mode, the input/output will
trigger only on the 1st pulse/trigger
message after arming.*/
WRTD_TRIGGER_MODE_AUTO = 2, /**< In AUTO mode, the input/output will
trigger on every pulse/trigger message.*/
};
/**
* This enum is used in list_input_state / list_output_state
* structures to pass state information
*/
enum wrnc_io_flags {
WRTD_ENABLED = (1 << 0), /*!< I/O is physically enabled */
WRTD_TRIGGER_ASSIGNED = (1 << 1), /*!< I/O is has a trigger assigned */
WRTD_LAST_VALID = (1 << 2), /*!< I/O processed at least one pulse.
It's timestamp/ID is in the "last"
field. */
WRTD_ARMED = (1 << 3), /*!< I/O is armed */
WRTD_TRIGGERED = (1 << 4), /*!< I/O has triggered */
};
enum wrtd_log_level {
WRTD_LOG_NOTHING = 0,
WRTD_LOG_RAW = (1 << 0), /**< Input only: log all pulses coming to
the TDC input */
WRTD_LOG_SENT = (1 << 1), /**< Input only: log all sent triggers */
WRTD_LOG_PROMISC = (1 << 2), /**< Output only: promiscious mode -
log all trigger messages received
from WR network */
WRTD_LOG_FILTERED = (1 << 3), /**< Output only: log all trigger
messages that have been assigned
to the output */
WRTD_LOG_EXECUTED = (1 << 4), /**< Output only: log all triggers
executed on the output */
WRTD_LOG_MISSED = (1 << 5), /**< Output only: log all triggers
missed by the output */
WRTD_LOG_ALL = 0xff,
};
#define HASH_ENT_EMPTY (0 << 0)
#define HASH_ENT_DIRECT (1 << 0)
#define HASH_ENT_CONDITION (1 << 1)
#define HASH_ENT_CONDITIONAL (1 << 2)
#define HASH_ENT_DISABLED (1 << 3)
struct wr_timestamp {
uint64_t seconds;
uint64_t ticks;
uint64_t bins;
};
struct wrtd_trig_id {
uint32_t system;
uint32_t source_port;
uint32_t trigger;
};
struct wrtd_trigger_entry {
struct wr_timestamp ts;
struct wrtd_trig_id id;
uint32_t seq;
};
struct wrtd_log_entry {
uint32_t type;
uint32_t seq;
int channel;
struct wrtd_trig_id id;
struct wr_timestamp ts;
};
#ifdef WRNODE_RT
struct wrtd_trigger_message {
struct rmq_message_addr hdr;
uint32_t transmit_seconds;
uint32_t transmit_cycles;
int count;
struct wrtd_trigger_entry triggers[TDC_TRIGGER_COALESCE_LIMIT];
};
#endif
#ifdef WRNODE_RT
static inline void ts_add(struct wr_timestamp *a, const struct wr_timestamp *b)
{
a->frac += b->frac;
if(a->frac >= 4096)
{
a->frac -= 4096;
a->cycles ++;
}
a->cycles += b->cycles;
if(a->cycles >= 125000000)
{
a->cycles -= 125000000;
a->seconds++;
}
a->seconds += b->seconds;
}
static inline void ts_sub(struct wr_timestamp *a, const struct wr_timestamp *b)
{
a->frac -= b->frac;
if(a->frac < 0)
{
a->frac += 4096;
a->cycles --;
}
a->cycles -= b->cycles;
if(a->cycles < 0)
{
a->cycles += 125000000;
a->seconds--;
}
a->seconds -= b->seconds;
if(a->seconds == -1)
{
a->seconds = 0;
a->cycles -= 125000000;
}
}
#endif
#endif
doxy-wrtd
\ No newline at end of file
GIT_VERSION = $(shell cd $(src); git describe --dirty --long --tags)
O ?= doxy-wrtd
# Build the documentation with or without the internals details
ifdef SHOW_INTERNALS
EXCLUDE_FILES = ""
BRIEF = "API Documentation - With Internals"
else
EXCLUDE_FILES = "../lib/libwrtd-internal.h"
BRIEF = "API Documentation"
endif
all: doxygen
doxygen:
GIT_VERSION=$(GIT_VERSION) EXCLUDE_FILES=$(EXCLUDE_FILES) BRIEF=$(BRIEF) \
OUTPUT=$(O) doxygen ./doxygen-wrtd-config
clean:
rm -rf $(O)
# Latex stuff
rm -f *.dvi *.aux *.out *.log *.backup
PROJECT_NAME = "White Rabbit Trigger Distribution - Software"
PROJECT_NUMBER = $(GIT_VERSION)
PROJECT_BRIEF = $(BRIEF)
PROJECT_LOGO =
OUTPUT_DIRECTORY = $(OUTPUT)
CREATE_SUBDIRS = YES
TAB_SIZE = 8
OPTIMIZE_OUTPUT_FOR_C = YES
EXTRACT_STATIC = YES
CASE_SENSE_NAMES = YES
WARN_NO_PARAMDOC = YES
INPUT = ../lib
RECURSIVE = YES
EXCLUDE = $(EXCLUDE_FILES)
GENERATE_HTML = YES
GENERATE_LATEX = YES
# If it exists includes Makefile.specific. In this Makefile, you should put
# specific Makefile code that you want to run before this. For example,
# build a particular environment.
-include Makefile.specific
WRNC := ../../../
LIB = libwrtd.a
LOBJ := libwrtd.o
LOBJ += $(WRNC)/lib/libwrnc.o
CFLAGS += -Wall -ggdb -O2 -I. -I../common -I$(WRNC)/lib -I$(WRNC)/kernel $(EXTRACFLAGS)
LDLIBS += -L. -lwrtd
modules all: $(LIB)
%: %.c $(LIB)
$(CC) $(CFLAGS) $(LDFLAGS) $*.c $(LDLIBS) -o $@
$(LIB): $(LOBJ)
ar r $@ $^
clean:
rm -f $(LIB) .depend *.o *~
.depend: Makefile $(wildcard *.c *.h)
$(CC) $(CFLAGS) -M $(LOBJ:.o=.c) -o $@
install modules_install:
-include .depend
/*
* Copyright (C) 2014 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
* License: GPL v3
*/
#include "libwrtd.h"
struct wrtd_desc {
struct wrnc_dev *wrnc;
uint32_t app_id;
uint32_t n_cpu;
};
This diff is collapsed.
/*
* Copyright (C) 2014 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
* inspired by a draft of Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
* License: GPL v3
*/
#ifndef __WRTD_LIB_H__
#define __WRTD_LIB_H__
#include <stdint.h>
#include <stdio.h>
#include <wrtd-common.h>
struct wrtd_node;
#define WRTD_DEFAULT_TIMEOUT 1000
enum wrtd_error_list {
EWRTD_INVALD_ANSWER_ACK = 3276,
EWRTD_INVALD_ANSWER_STATE,
EWRTD_INVALD_BINARY,
EWRTD_INVALD_DEAD_TIME,
EWRTD_INVALID_TRIG_ID,
EWRTD_INVALID_CHANNEL,
EWRTD_NO_IMPLEMENTATION,
__EWRTD_MAX_ERROR_NUMBER,
};
struct wrtd_trigger_handle {
uint32_t ptr_cond;
uint32_t ptr_trig;
int channel;
};
struct wrtd_input_state {
int input;
uint32_t flags; ///> enum list_io_flags
uint32_t log_level; ///> enum list_log_level
int mode;
uint32_t tagged_pulses;
uint32_t sent_triggers;
uint32_t sent_packets;
struct wrtd_trigger_entry last_sent;
struct wrtd_trig_id assigned_id;
struct wr_timestamp dead_time;
struct wr_timestamp delay;
struct wr_timestamp last;
};
struct wrtd_output_trigger_state {
int is_conditional;
int enabled;
struct wrtd_trig_id trigger;
struct wrtd_trig_id condition;
struct wr_timestamp delay_trig;
struct wr_timestamp delay_cond;
struct wrtd_trigger_handle handle;
int worst_latency_us;
};
struct wrtd_output_state {
int output;
uint32_t executed_pulses;
uint32_t missed_pulses_late;
uint32_t missed_pulses_deadtime;
uint32_t missed_pulses_overflow;
struct wrtd_trigger_entry last_executed;
struct wrtd_trigger_entry last_programmed;
struct wrtd_trigger_entry last_enqueued;
uint32_t flags; ///> enum list_io_flags
uint32_t log_level; ///> enum list_log_level
int mode;
uint32_t dead_time;
uint32_t pulse_width;
struct wr_timestamp worst_rx_delay;
uint32_t rx_packets;
uint32_t rx_loopback;
};
/**
* @file lbwrtd.c
*/
extern const char *wrtd_strerror(int err);
extern int wrtd_init();
extern void wrtd_exit();
extern struct wrtd_node *wrtd_open_by_fmc(uint32_t device_id);
extern struct wrtd_node *wrtd_open_by_lun(int lun);
extern void wrtd_close(struct wrtd_node *dev);
extern struct wrnc_dev *wrtd_get_wrnc_dev(struct wrtd_node *dev);
extern int wrtd_load_application(struct wrtd_node *dev, char *rt_tdc,
char *rt_fd);
extern int wrtd_in_enable(struct wrtd_node *dev, unsigned int input, int enable);
extern int wrtd_in_is_enabled(struct wrtd_node *dev, unsigned int input);
extern int wrtd_in_trigger_assign(struct wrtd_node *dev, unsigned int input,
struct wrtd_trig_id *trig_id);
extern int wrtd_in_trigger_unassign(struct wrtd_node *dev, unsigned int input);
extern int wrtd_in_trigger_mode_set(struct wrtd_node *dev, unsigned int input,
enum wrtd_trigger_mode mode);
extern int wrtd_in_arm(struct wrtd_node *dev, unsigned int input, int armed);
extern int wrtd_in_disarm(struct wrtd_node *dev, unsigned int input, int armed);
extern int wrtd_in_read_log(struct wrtd_node *dev, struct wrtd_log_entry *log,
int flags, int input_mask, int count);
extern int wrtd_in_trigger_software(struct wrtd_node *dev,
struct wrtd_trigger_entry *trigger);
extern int wrtd_in_delay_set(struct wrtd_node *dev, unsigned int input,
uint64_t delay_ps);
extern int wrtd_in_delay_get(struct wrtd_node *dev, unsigned int input,
uint64_t *delay_ps);
extern int wrtd_in_seq_counter_set (struct wrtd_node *dev, unsigned int input);
extern int wrtd_in_dead_time_set(struct wrtd_node *dev, unsigned int input,
uint64_t dead_time_ps);
extern int wrtd_in_dead_time_get(struct wrtd_node *dev, unsigned int input,
uint64_t *dead_time_ps);
extern int wrtd_in_state_get(struct wrtd_node *dev, unsigned int input,
struct wrtd_input_state *state);
extern int wrtd_in_counters_reset(struct wrtd_node *dev, unsigned int input);
extern int wrtd_in_timebase_offset_set(struct wrtd_node *dev,
unsigned int input, uint64_t offset);
extern int wrtd_in_log_level_set(struct wrtd_node *dev, unsigned int input,
uint32_t log_level);
extern int wrtd_out_enable(struct wrtd_node *dev, unsigned int output,
int enable);
extern int wrtd_out_dead_time_set(struct wrtd_node *dev, unsigned int output,
uint64_t dead_time_ps);
extern int wrtd_out_trig_assign(struct wrtd_node *dev,
struct wrtd_trigger_handle *handle,
int output, struct wrtd_trig_id *trig,
struct wrtd_trig_id *condition);
extern int wrtd_out_trig_remove (struct wrtd_node *dev,
struct wrtd_trigger_handle *handle);
extern int wrtd_out_trig_get_all (struct wrtd_node *dev, unsigned int output,
struct wrtd_output_trigger_state *triggers,
int max_count);
extern int wrtd_out_trig_set_delay(struct wrtd_node *dev,
struct wrtd_trigger_handle *handle,
uint64_t delay_ps);
extern int wrtd_out_trig_set_condition_delay(struct wrtd_node *dev,
struct wrtd_trigger_handle *handle,
uint64_t delay_ps);
extern int wrtd_out_trig_get_state(struct wrtd_node *dev,
struct wrtd_trigger_handle *handle,
struct wrtd_output_trigger_state *state);
extern int wrtd_out_trig_enable(struct wrtd_node *dev,
struct wrtd_trigger_handle *handle, int enable);
extern int wrtd_out_read_log(struct wrtd_node *dev, struct wrtd_log_entry *log,
int flags, unsigned int output_mask, int count);
extern int wrtd_out_set_log_level(struct wrtd_node *dev, unsigned int output,
uint32_t log_level);
extern int wrtd_out_set_trigger_mode(struct wrtd_node *dev,
unsigned int output, int mode);
extern int wrtd_out_arm(struct wrtd_node *dev, unsigned int input, int armed);
//int wrtd_out_get_state(struct wrtd_node *dev, unsigned int input, int armed);
extern int wrtd_out_reset_counters(struct wrtd_node *dev, unsigned int output);
extern int wrtd_out_check_triggered(struct wrtd_node *dev, unsigned int output);
//int wrtd_out_wait_trigger(struct wrtd_node*, int output_mask, struct wrtd_trig_id *id);
#endif
wrtd-boot
wrtd-tdc-config
\ No newline at end of file
# If it exists includes Makefile.specific. In this Makefile, you should put
# specific Makefile code that you want to run before this. For example,
# build a particular environment.
-include Makefile.specific
DESTDIR ?= /usr/local
CFLAGS += -Wall -ggdb -I../common -I$(WRNC)/lib -I$(WRNC)/kernel -I../lib $(EXTRACFLAGS)
LDLIBS += -L../lib -lwrtd -L$(WRNC)/lib -lwrnc
PROGS := wrtd-boot
PROGS += wrtd-tdc-config
all: $(PROGS)
install:
install -d $(DESTDIR)/bin
install -D $(PROGS) $(DESTDIR)/bin
%: %.c ../lib/libwrtd.a
$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDLIBS) -o $@
# make nothing for modules_install, but avoid errors
modules_install:
clean:
rm -f $(PROGS) *.o *~
.PHONY: all, clean
/*
* Copyright (C) 2014 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
* License: GPL v3
*/
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <getopt.h>
#include <libwrnc.h>
#include <libwrtd.h>
static void help()
{
fprintf(stderr, "wrtd-boot [options] -D 0x<hex-number> -t <path> -f <path>\n");
fprintf(stderr, "It loads thewhite-rabbit trigger-distribution application into the node-core CPUs\n\n");
fprintf(stderr, "-D WRNC device identificator\n");
fprintf(stderr, "-t path to TDC real-time application\n");
fprintf(stderr, "-f path to Fine-Delay real-time application\n");
exit(1);
}
int main(int argc, char *argv[])
{
int err;
uint32_t dev_id = 0;
char *tdc = NULL, *fd =NULL, c;
struct wrtd_node *wrtd;
struct wrnc_dev *wrnc;
atexit(wrtd_exit);
while ((c = getopt (argc, argv, "hD:t:f:")) != -1) {
switch (c) {
case 'h':
case '?':
help();
break;
case 'D':
sscanf(optarg, "0x%x", &dev_id);
break;
case 't':
tdc = optarg;
break;
case 'f':
fd = optarg;
break;
}
}
if (!fd || !tdc) {
fprintf(stderr, "Missing binary file to load\n");
exit(1);
}
if (!dev_id) {
fprintf(stderr, "Invalid wrnc device\n");
exit(1);
}
wrtd_init();
wrtd = wrtd_open_by_fmc(dev_id);
if (!wrtd) {
fprintf(stderr, "Cannot open WRNC: %s\n", wrtd_strerror(errno));
exit(1);
}
/* Load the application into the WRNC CPUs */
err = wrtd_load_application(wrtd, tdc, fd);
if (err) {
fprintf(stderr, "Cannot program binary to WRNC: %s\n",
wrtd_strerror(errno));
exit(1);
}
/* Get the WRNC token */
wrnc = wrtd_get_wrnc_dev(wrtd);
/* Enable TDC and FD CPUs */
err = wrnc_cpu_enable(wrnc, 0);
if (err)
exit(1);
err = wrnc_cpu_enable(wrnc, 1);
if (err)
exit(1);
/* Start running application on TDC and FD CPUs */
err = wrnc_cpu_start(wrnc, 0);
if (err)
exit(1);
err = wrnc_cpu_start(wrnc, 1);
if (err)
exit(1);
wrtd_close(wrtd);
fprintf(stdout,
"white rabbit trigger distribution node succesfully programmed\n");
exit(0);
}
This diff is collapsed.
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