FreeCalypso > hg > freecalypso-tools
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); }