changeset 953:ab54957dbe35

libpwon: implement -Petmoff mode
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 07 Jun 2023 20:06:12 +0000
parents 68d4474c1a36
children 21604c3413c1
files libpwon/Makefile libpwon/etmoff.c libpwon/forkoff.c libpwon/readconf.c
diffstat 4 files changed, 36 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libpwon/Makefile	Wed Jun 07 08:00:44 2023 +0000
+++ b/libpwon/Makefile	Wed Jun 07 20:06:12 2023 +0000
@@ -1,6 +1,6 @@
 CC=	gcc
 CFLAGS=	-O2
-OBJS=	duart28c.o forkoff.o readconf.o
+OBJS=	duart28c.o etmoff.o forkoff.o readconf.o
 LIB=	libpwon.a
 
 all:	${LIB}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpwon/etmoff.c	Wed Jun 07 20:06:12 2023 +0000
@@ -0,0 +1,25 @@
+/*
+ * This libpwon module implements -Petmoff mode: set the baud rate to 115200
+ * and send out ETM command doing Iota poweroff, triggering a VRPC reboot cycle
+ * on the USB-charging phone.  The "wakeup shot" logic is a copy of what we do
+ * in rvinterf.
+ */
+
+#include <sys/types.h>
+#include <unistd.h>
+
+extern int target_fd;
+
+static u_char wakeup_shot[64];
+static u_char etm_devoff_pkt[9] =
+		{0x02, 0x14, 0x01, 0x67, 0x1E, 0x01, 0x00, 0x79, 0x02};
+
+void
+bootctrl_do_etmoff()
+{
+	set_fixed_baudrate("115200");
+	set_serial_nonblock(0);
+	write(target_fd, wakeup_shot, sizeof wakeup_shot);
+	usleep(100000);
+	write(target_fd, etm_devoff_pkt, sizeof etm_devoff_pkt);
+}
--- a/libpwon/forkoff.c	Wed Jun 07 08:00:44 2023 +0000
+++ b/libpwon/forkoff.c	Wed Jun 07 20:06:12 2023 +0000
@@ -5,7 +5,7 @@
 #include <unistd.h>
 
 extern char bootctrl_pwon_cmd[];
-extern int bootctrl_duart28c_mode;
+extern int bootctrl_duart28c_mode, bootctrl_etmoff_mode;
 
 static char shell_pathname[] = "/bin/sh";
 
@@ -38,5 +38,9 @@
 		fork_exec_pwon_cmd();
 		return(1);
 	}
+	if (bootctrl_etmoff_mode) {
+		bootctrl_do_etmoff();
+		return(2);
+	}
 	return(0);
 }
--- a/libpwon/readconf.c	Wed Jun 07 08:00:44 2023 +0000
+++ b/libpwon/readconf.c	Wed Jun 07 20:06:12 2023 +0000
@@ -9,6 +9,7 @@
 #define	MAX_BOOTCTRL_CONF_LINE	510
 
 char bootctrl_pwon_cmd[MAX_BOOTCTRL_CONF_LINE+1];
+int bootctrl_etmoff_mode;
 
 find_bootctrl_entry(soughtname)
 	char *soughtname;
@@ -20,6 +21,10 @@
 
 	if (bootctrl_check_duart28c(soughtname))
 		return(0);
+	if (!strcmp(soughtname, "etmoff")) {
+		bootctrl_etmoff_mode = 1;
+		return(0);
+	}
 	inf = fopen(conf_file_pathname, "r");
 	if (!inf) {
 		perror(conf_file_pathname);