From 846aa974f9fe779e4260a0927e977a63c55bace1 Mon Sep 17 00:00:00 2001 From: Rostislav Lisovy Date: Thu, 19 Jul 2012 18:19:47 +0200 Subject: [PATCH] lin_config: Run as daemon when configuring sllin tty line discipline --- lin_config/src/Makefile | 2 +- lin_config/src/lin_config.c | 18 +++++++++-- lin_config/src/lin_config.h | 7 +++-- lin_config/src/linc_parse_xml.c | 5 +-- lin_config/src/pcl_config.c | 6 ++-- lin_config/src/sllin_config.c | 54 ++++++++++++++++++++++++--------- 6 files changed, 65 insertions(+), 27 deletions(-) diff --git a/lin_config/src/Makefile b/lin_config/src/Makefile index 52b7c2d..7e95d78 100644 --- a/lin_config/src/Makefile +++ b/lin_config/src/Makefile @@ -8,7 +8,7 @@ objects = linc_parse_xml.o pcl_config.o sllin_config.o lin_config.o lin_config: $(objects) $(CC) $(objects) $(LIBS) -o lin_config -%.o : %.c +%.o : %.c %.h $(CC) $(CFLAGS) $(LIBS) -c $< -o $@ .PHONY: clean diff --git a/lin_config/src/lin_config.c b/lin_config/src/lin_config.c index 891494c..96b56d1 100644 --- a/lin_config/src/lin_config.c +++ b/lin_config/src/lin_config.c @@ -30,6 +30,8 @@ #include "sllin_config.h" #include "lin_config.h" +struct linc_lin_state linc_lin_state; + void linc_explain(int argc, char *argv[]) { @@ -117,12 +119,22 @@ int main(int argc, char *argv[]) //ret = pcl_config(&linc_lin_state); ret = sllin_config(&linc_lin_state); -// printf("Press any key to detach %s ...\n", linc_lin_state.dev); -// getchar(); + if (ret < 0) + return EXIT_FAILURE; + if (ret == LIN_EXIT_OK) { + return EXIT_SUCCESS; + } - if (ret < 0) + printf("Running in background ...\n"); + ret = daemon(0, 0); + if (ret < 0) { + perror("daemon()"); return EXIT_FAILURE; + } + + /* Sleep to keep the line discipline active. */ + pause(); return EXIT_SUCCESS; } diff --git a/lin_config/src/lin_config.h b/lin_config/src/lin_config.h index e46cf8a..6d4ea1b 100644 --- a/lin_config/src/lin_config.h +++ b/lin_config/src/lin_config.h @@ -1,6 +1,9 @@ #ifndef _LIN_CONFIG_H_ #define _LIN_CONFIG_H_ +#define LIN_EXIT_OK 1 + +/* Flags passed to configuration functions */ #define FLASH_CONF_fl (1 << 0) #define RESET_DEVICE_fl (1 << 1) #define SLLIN_ATTACH_fl (1 << 2) @@ -28,7 +31,7 @@ struct linc_lin_state { int bus_termination; /* LIN bus termination in device -- Master or Slave */ /* Subscriber/publisher table entries */ - struct linc_frame_entry frame_entry[MAX_LIN_ID]; + struct linc_frame_entry frame_entry[MAX_LIN_ID + 1]; /* Scheduler table entries */ // FIXME max value struct linc_scheduler_entry scheduler_entry[100]; @@ -38,7 +41,5 @@ struct linc_lin_state { int flags; /* Flags passed to configuration function of particular device */ }; -struct linc_lin_state linc_lin_state; - #endif /* _LIN_CONFIG_H_ */ diff --git a/lin_config/src/linc_parse_xml.c b/lin_config/src/linc_parse_xml.c index 00e4abe..160ef84 100644 --- a/lin_config/src/linc_parse_xml.c +++ b/lin_config/src/linc_parse_xml.c @@ -47,7 +47,8 @@ void linc_parse_scheduler_entries(struct linc_lin_state *linc_lin_state, xmlDocP linc_lin_state->scheduler_entry[linc_lin_state->scheduler_entries_cnt].interval_ms = interval; linc_lin_state->scheduler_entries_cnt++; - //printf("Time = %d Entry = %d\n", interval, linid); + //printf("Time = %d Lin ID = %d Entry no. = %d\n", + // interval, linid, linc_lin_state->scheduler_entries_cnt-1); } cur = cur->next; } @@ -104,7 +105,7 @@ void linc_parse_frame_configuration(struct linc_lin_state *linc_lin_state, xmlDo tmp_node = tmp_node->next; } - if (linid >= 0) { + if (linid >= 0 && linid <= MAX_LIN_ID) { memcpy(&linc_lin_state->frame_entry[linid], &tmp_fr_entry, sizeof(struct linc_frame_entry)); } diff --git a/lin_config/src/pcl_config.c b/lin_config/src/pcl_config.c index 503f1d5..03ccae1 100644 --- a/lin_config/src/pcl_config.c +++ b/lin_config/src/pcl_config.c @@ -320,8 +320,8 @@ int pcl_lin_init(int tty, struct linc_lin_state *linc_lin_state) pkt.seq_frlen = 0x2; pkt.ctrl_tiface = PCL_PACKET_LIN_IFACE; pkt.ctrl_comc = 0x1F; - pkt.parms[0] = pcl_lin_state.baudrate & 0xFF; - pkt.parms[1] = (pcl_lin_state.baudrate >> 8) & 0xFF; + pkt.parms[0] = linc_lin_state->baudrate & 0xFF; + pkt.parms[1] = (linc_lin_state->baudrate >> 8) & 0xFF; pcl_send_frame(tty, &pkt); pcl_read_response(tty); @@ -451,6 +451,6 @@ int pcl_config(struct linc_lin_state *linc_lin_state) pcl_reset_input_mode(tty); close(tty); - return 0; + return LIN_EXIT_OK; } diff --git a/lin_config/src/sllin_config.c b/lin_config/src/sllin_config.c index f2c24fa..06751c5 100644 --- a/lin_config/src/sllin_config.c +++ b/lin_config/src/sllin_config.c @@ -28,6 +28,19 @@ struct sllin_connection { char iface[IFNAMSIZ+1]; }; +void sllin_ms_to_timeval(int ms, struct timeval *tv) +{ + tv->tv_sec = (int) ms/1000; + tv->tv_usec = (ms % 1000) * 1000; +} + +int sllin_cache_config(struct linc_lin_state *linc_lin_state, + struct sllin_connection *sllin_connection) +{ + + return 0; +} + int sllin_bcm_config(struct linc_lin_state *linc_lin_state, struct sllin_connection *sllin_connection) { @@ -38,8 +51,6 @@ int sllin_bcm_config(struct linc_lin_state *linc_lin_state, int ret; int i; - //printf("tty %s to netdevice %s\n", linc_lin_state->dev, sllin_connection->iface); - s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM); if (s < 0) { perror("socket(): bcmsocket"); @@ -68,24 +79,29 @@ int sllin_bcm_config(struct linc_lin_state *linc_lin_state, } for (i = 0; i < linc_lin_state->scheduler_entries_cnt; i++) { + struct timeval time; memset(&msg, 0, sizeof(msg)); + msg.msg_head.nframes = 1; msg.msg_head.opcode = TX_SETUP; msg.msg_head.flags |= SETTIMER | STARTTIMER; - //msg.msg_head.ival2.tv_sec = // FIXME - msg.msg_head.ival2.tv_usec = - linc_lin_state->scheduler_entry[i].interval_ms * 1000; - msg.msg_head.can_id = - linc_lin_state->scheduler_entry[i].lin_id | CAN_RTR_FLAG; + sllin_ms_to_timeval( + linc_lin_state->scheduler_entry[i].interval_ms, &time); + msg.msg_head.ival2.tv_sec = time.tv_sec; + msg.msg_head.ival2.tv_usec = time.tv_usec; + msg.msg_head.can_id = ( + linc_lin_state->scheduler_entry[i].lin_id | CAN_RTR_FLAG); msg.frame.can_dlc = 0; + msg.frame.can_id = msg.msg_head.can_id; + + //printf("tv_sec = %i, tv_usec = %i\n", time.tv_sec, time.tv_usec); sendto(s, &msg, sizeof(msg), 0, (struct sockaddr*)&caddr, sizeof(caddr)); - printf(".\n"); //read_response(s); // FIXME } - close(s); + /* Do not close "s" to make BCM configuration running */ printf("Configuration finished\n"); return 0; @@ -119,7 +135,8 @@ int sllin_config(struct linc_lin_state *linc_lin_state) return -1; } - printf("Attached tty %s to netdevice %s\n", linc_lin_state->dev, sllin_connection.iface); + printf("Attached tty %s to netdevice %s\n", + linc_lin_state->dev, sllin_connection.iface); } if (linc_lin_state->flags & SLLIN_DETACH_fl) { @@ -130,15 +147,22 @@ int sllin_config(struct linc_lin_state *linc_lin_state) return -1; } - printf("Detached sllin line discipline from %s\n", linc_lin_state->dev); - return 0; + printf("Detached sllin line discipline from %s\n", + linc_lin_state->dev); + + close(tty); + return LIN_EXIT_OK; } ret = sllin_bcm_config(linc_lin_state, &sllin_connection); + if (ret < 0) + return ret; + + ret = sllin_cache_config(linc_lin_state, &sllin_connection); + + /* !!! Do not close "tty" to enable newly + configured tty line discipline */ - printf("Press any key to detach %s ...\n", linc_lin_state->dev); - getchar(); - close(tty); return ret; } -- 2.39.2