Adds the stripDetector daemon

This commit is contained in:
brueckner_m 2020-06-04 11:50:33 +02:00
parent 0e514a470d
commit 40257fc82d
2 changed files with 226 additions and 0 deletions

View File

@ -0,0 +1,29 @@
current_dir = $(shell pwd)
CROSS = nios2-buildroot-linux-gnu-
CC = $(CROSS)gcc
CFLAGS += -Wall #-DDEBUG
PROGS = stripd
DESTDIR ?= bin
INSTMODE = 0777
SRCS = stripd.c
OBJS = $(SRCS:.c=.o)
all: clean $(PROGS)
version: clean versioning $(PROGS)
boot: $(OBJS)
$(PROGS): $(OBJS)
mkdir -p $(DESTDIR)
$(CC) -o $@ $^ $(CFLAGS) $(LDLIBS)
mv $(PROGS) $(DESTDIR)
rm $(main_src)*.o
clean:
rm -rf $(DESTDIR)/$(PROGS) *.o *.gdb $(main_src)*.o

View File

@ -0,0 +1,197 @@
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/select.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <signal.h>
#include <errno.h>
#define UART_DEVICE "/dev/ttyAL0"
#ifdef DEBUG
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, "DEBUG: %s:%d:%s(): " fmt, \
__FILE__, __LINE__, __func__, ##args)
#else
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */
#endif
struct termios oldtio;
int uart;
int update_files = 1;
void intHandler(int signo)
{
DEBUG_PRINT("signo %d received\n", signo);
if (signo == SIGINT)
{
DEBUG_PRINT("SIGINT handling\n");
tcsetattr(uart,TCSANOW,&oldtio);
close(uart);
exit(0);
}
if (signo == SIGUSR1)
{
DEBUG_PRINT("SIGUSR1 handling\n");
update_files = 1;
}
}
void kill_servers()
{
system("killall gotthard2DetectorServer mythen3DetectorServer gotthard2DetectorServer_developer mythen3DetectorServer_developer");
}
void set_hv_zero()
{
FILE* hv;
hv = fopen("/etc/devlinks/hvdac", "w");
if (hv == NULL)
fprintf(stderr, "Could not open hvdac file.\n");
else
{
fputc('0', hv);
fclose(hv);
}
}
void disable_chip_power()
{
unsigned* mem_ptr;
unsigned mem_val;
unsigned mem_address = 0x18040000;
int mem_desc;
mem_desc = open("/dev/mem", O_RDWR | O_SYNC, 0);
if (mem_desc == -1)
fprintf(stderr, "Cannot open /dev/mem\n");
else
{
mem_ptr = (unsigned *) mmap(0, 0x1000, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, mem_desc, mem_address);
if (mem_ptr == MAP_FAILED)
fprintf(stderr, "Cannot map memory area\n");
else
{
mem_val = mem_ptr[0x84/4];
mem_val = mem_val & 0x7FFFFFFF; // Removes top bit
mem_ptr[0x84/4] = mem_val;
munmap((unsigned*) mem_address, 0x1000);
}
close(mem_desc);
}
}
void prepare_for_shutdown()
{
kill_servers();
set_hv_zero();
disable_chip_power();
system("sync");
return;
}
int uart_setup(struct termios* old_settings)
{
int desc;
struct termios newtio;
desc = open(UART_DEVICE, O_RDWR | O_NOCTTY);
if (desc < 0) { perror(UART_DEVICE); exit(-1); }
tcgetattr(desc, old_settings);
newtio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | IGNCR | IXANY;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
tcflush(desc, TCIFLUSH);
tcsetattr(desc,TCSANOW,&newtio);
return desc;
}
int get_boot_condition()
{
FILE* ru_trig_cond;
char ru_trig_cond_content[10];
int bytes_read;
ru_trig_cond = fopen("/sys/devices/platform/sopc@0/18000000.bridge/180000c0.remoteupdate/remote_update/trig_cond","r");
if (ru_trig_cond == NULL)
fprintf(stderr, "Cannot read remote update status\n");
bytes_read = fread(ru_trig_cond_content, 1, 10, ru_trig_cond);
if (bytes_read < 4)
fprintf(stderr, "Invalid file content\n");
return strtoul(ru_trig_cond_content, NULL, 0);
}
void write_cmd_in_file(char* cmd, char* filename, int lines)
{
int res,i;
char buf[255];
FILE* cmd_file;
cmd_file = fopen(filename, "w");
write(uart, cmd, 1);
for (i=0; i < lines; i++)
{
res = read(uart, buf, 255);
fwrite(buf, 1, res, cmd_file);
}
fclose(cmd_file);
}
int main(int argc, char* argv[])
{
char buf[255];
fd_set readfs;
int maxfd;
int res;
char factory_image_detected_cmd = 'f';
char get_voltage_cmd = 'u';
char get_versions_cmd = 'v';
char get_eventlog_cmd = 'e';
uart = uart_setup(&oldtio);
signal(SIGINT, intHandler);
signal(SIGUSR1, intHandler);
maxfd = uart+1;
if (get_boot_condition() != 4)
write(uart, &factory_image_detected_cmd, 1);
while (1)
{
if (update_files == 1)
{
DEBUG_PRINT("Updating files...\n");
write_cmd_in_file(&get_voltage_cmd, "/tmp/uc_voltage", 1);
write_cmd_in_file(&get_versions_cmd, "/tmp/uc_versions", 2);
write_cmd_in_file(&get_eventlog_cmd, "/tmp/uc_eventlog", 16);
update_files = 0;
}
FD_SET(uart, &readfs);
res = select(maxfd, &readfs, NULL, NULL, NULL);
if ((res == -1) && (errno == EINTR)) // If SIGUSR1 occured
continue;
if (FD_ISSET(uart,&readfs))
{
res = read(uart, buf, 255);
buf[res] = 0;
DEBUG_PRINT("-->%s:%d<--", buf, res);
if ((buf[0] == 'S') && (res < 5))
{
prepare_for_shutdown();
exit(0);
}
}
usleep(1000);
}
// Should never get here
tcsetattr(uart,TCSANOW,&oldtio);
return 0;
}