changeset 736:7d1df6d831e4

libpwon: added -Pdtr and -Prts support for DUART28C
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 16 Sep 2020 03:40:51 +0000
parents 5b8287c655cf
children 6d97866bad79
files libpwon/Makefile libpwon/duart28c.c libpwon/forkoff.c libpwon/readconf.c
diffstat 4 files changed, 61 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/libpwon/Makefile	Tue Sep 15 04:29:43 2020 +0000
+++ b/libpwon/Makefile	Wed Sep 16 03:40:51 2020 +0000
@@ -1,6 +1,6 @@
 CC=	gcc
 CFLAGS=	-O2
-OBJS=	forkoff.o readconf.o
+OBJS=	duart28c.o forkoff.o readconf.o
 LIB=	libpwon.a
 
 all:	${LIB}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpwon/duart28c.c	Wed Sep 16 03:40:51 2020 +0000
@@ -0,0 +1,46 @@
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+
+extern int target_fd;
+
+int bootctrl_duart28c_mode;
+static int mctl_arg;
+
+bootctrl_check_duart28c(bc_name)
+	char *bc_name;
+{
+	if (!strcmp(bc_name, "dtr")) {
+		bootctrl_duart28c_mode = 1;
+		mctl_arg = TIOCM_DTR;
+		return 1;
+	}
+	if (!strcmp(bc_name, "rts")) {
+		bootctrl_duart28c_mode = 1;
+		mctl_arg = TIOCM_RTS;
+		return 1;
+	}
+	return 0;
+}
+
+void
+fork_duart28c_pulse()
+{
+	int i;
+
+	i = fork();
+	if (i < 0) {
+		perror("fork");
+		exit(1);
+	}
+	if (i)
+		return;
+	ioctl(target_fd, TIOCMBIS, &mctl_arg);
+	usleep(50000);
+	ioctl(target_fd, TIOCMBIC, &mctl_arg);
+	exit(0);
+}
--- a/libpwon/forkoff.c	Tue Sep 15 04:29:43 2020 +0000
+++ b/libpwon/forkoff.c	Wed Sep 16 03:40:51 2020 +0000
@@ -5,6 +5,7 @@
 #include <unistd.h>
 
 extern char bootctrl_pwon_cmd[];
+extern int bootctrl_duart28c_mode;
 
 static char shell_pathname[] = "/bin/sh";
 
@@ -27,9 +28,15 @@
 
 pwon_if_needed()
 {
-	if (!bootctrl_pwon_cmd[0])
-		return(0);
-	signal(SIGCHLD, SIG_IGN);
-	fork_exec_pwon_cmd();
-	return(1);
+	if (bootctrl_duart28c_mode) {
+		signal(SIGCHLD, SIG_IGN);
+		fork_duart28c_pulse();
+		return(1);
+	}
+	if (bootctrl_pwon_cmd[0]) {
+		signal(SIGCHLD, SIG_IGN);
+		fork_exec_pwon_cmd();
+		return(1);
+	}
+	return(0);
 }
--- a/libpwon/readconf.c	Tue Sep 15 04:29:43 2020 +0000
+++ b/libpwon/readconf.c	Wed Sep 16 03:40:51 2020 +0000
@@ -18,6 +18,8 @@
 	int lineno;
 	char *cp, *np;
 
+	if (bootctrl_check_duart28c(soughtname))
+		return(0);
 	inf = fopen(conf_file_pathname, "r");
 	if (!inf) {
 		perror(conf_file_pathname);