# HG changeset patch # User Mychaela Falconia # Date 1686168372 0 # Node ID ab54957dbe35767748d53014769636900dd2e755 # Parent 68d4474c1a36a68155257f5eae50428ee24a5adc libpwon: implement -Petmoff mode diff -r 68d4474c1a36 -r ab54957dbe35 libpwon/Makefile --- 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} diff -r 68d4474c1a36 -r ab54957dbe35 libpwon/etmoff.c --- /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 +#include + +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); +} diff -r 68d4474c1a36 -r ab54957dbe35 libpwon/forkoff.c --- 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 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); } diff -r 68d4474c1a36 -r ab54957dbe35 libpwon/readconf.c --- 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);