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