From 30ac75903b04fbaf120d33658a2602ce454ed3b7 Mon Sep 17 00:00:00 2001 From: Adam Joseph Date: Wed, 29 Mar 2023 13:56:43 -0700 Subject: [PATCH] src/util/ectool/: init --- src/platform/kevin/default.nix | 1 + src/util/ectool/default.nix | 58 ++++ ...ectool-patches-of-unclear-provenance.patch | 291 ++++++++++++++++++ 3 files changed, 350 insertions(+) create mode 100644 src/util/ectool/default.nix create mode 100644 src/util/ectool/ectool-patches-of-unclear-provenance.patch diff --git a/src/platform/kevin/default.nix b/src/platform/kevin/default.nix index e814592..0ff39d2 100644 --- a/src/platform/kevin/default.nix +++ b/src/platform/kevin/default.nix @@ -88,5 +88,6 @@ in { ''; }); + ectool = final.nixpkgsOnBuildForHost.callPackage (import ../../util/ectool) { }; }); } diff --git a/src/util/ectool/default.nix b/src/util/ectool/default.nix new file mode 100644 index 0000000..430b40b --- /dev/null +++ b/src/util/ectool/default.nix @@ -0,0 +1,58 @@ +{ lib +, stdenv +, pkg-config +, fetchFromGitHub +, boardName ? "kevin" +}: + +let makeTarget = "build/${boardName}/util/ectool"; + +in stdenv.mkDerivation { + pname = "ectool"; + version = "1d2c13"; + + src = fetchFromGitHub { + owner = "coreboot"; + repo = "chrome-ec"; + rev = "1d2c13a1630a1a6222411e1c03186cb9b1f576e0"; + hash = "sha256-xcZQeCEp0q3Wf5XYCY5EtnoIRziu7IA5AYv0ZyXShGk="; + }; + + postPatch = '' + patchShebangs . + ''; + + enableParallelBuilding = true; + + makeFlags = [ + "BOARD=${boardName}" + + # ectool's Makefile gets confused when nixpkgs sets $out + "out=build/${boardName}" + + # ectool's terminology is crazy; they call the buildPlatform + # HOST and they call the hostPlatform BOARD: + "HOSTCC=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc" + "HOSTCPP=${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++" + + # they also use CROSS_COMPILE for the targetPrefix of the + # platform on which `ectool` runs: + "CROSS_COMPILE=${stdenv.cc.targetPrefix}" + + # crusty old codebase, new compiler + "EXTRA_CFLAGS=-w -Wno-error -Wno-address-of-packed-member" + + #"V=1" + + makeTarget + ]; + + installPhase = '' + mkdir -p $out/bin + mv ${makeTarget} $out/bin/ + ''; + + meta = with lib; { + description = "Communicate with Chromebooks' Embedded Controller (EC)"; + }; +} diff --git a/src/util/ectool/ectool-patches-of-unclear-provenance.patch b/src/util/ectool/ectool-patches-of-unclear-provenance.patch new file mode 100644 index 0000000..28cab45 --- /dev/null +++ b/src/util/ectool/ectool-patches-of-unclear-provenance.patch @@ -0,0 +1,291 @@ +diff --git a/util/comm-dev.c b/util/comm-dev.c +index 33a69f9d6..92b76de45 100644 +--- a/util/comm-dev.c ++++ b/util/comm-dev.c +@@ -65,10 +65,9 @@ static int ec_command_dev(int command, int version, + s_cmd.command = command; + s_cmd.version = version; + s_cmd.result = 0xff; ++ memcpy(s_cmd.outdata, outdata, outsize); + s_cmd.outsize = outsize; +- s_cmd.outdata = (uint8_t *)outdata; + s_cmd.insize = insize; +- s_cmd.indata = indata; + + r = ioctl(fd, CROS_EC_DEV_IOCXCMD, &s_cmd); + if (r < 0) { +@@ -89,6 +88,7 @@ static int ec_command_dev(int command, int version, + return -EECRESULT - s_cmd.result; + } + ++ memcpy(indata, s_cmd.indata, insize); + return r; + } + +@@ -102,8 +102,8 @@ static int ec_readmem_dev(int offset, int bytes, void *dest) + if (!fake_it) { + s_mem.offset = offset; + s_mem.bytes = bytes; +- s_mem.buffer = dest; + r = ioctl(fd, CROS_EC_DEV_IOCRDMEM, &s_mem); ++ memcpy(dest, s_mem.buffer, bytes); + if (r < 0 && errno == ENOTTY) + fake_it = 1; + else +@@ -199,25 +199,28 @@ static int ec_readmem_dev_v2(int offset, int bytes, void *dest) + */ + static int ec_dev_is_v2(void) + { ++ /* + struct ec_params_hello h_req = { + .in_data = 0xa0b0c0d0 + }; + struct ec_response_hello h_resp; +- struct cros_ec_command s_cmd = { }; ++ struct cros_ec_command s_cmd = { ++ //.indata = 0xa0b0c0d0 ++ }; + int r; + + s_cmd.command = EC_CMD_HELLO; + s_cmd.result = 0xff; + s_cmd.outsize = sizeof(h_req); +- s_cmd.outdata = (uint8_t *)&h_req; + s_cmd.insize = sizeof(h_resp); +- s_cmd.indata = (uint8_t *)&h_resp; + + r = ioctl(fd, CROS_EC_DEV_IOCXCMD, &s_cmd); + if (r < 0 && errno == ENOTTY) + return 1; + + return 0; ++ */ ++ return 1; + } + + static int ec_pollevent_dev(unsigned long mask, void *buffer, size_t buf_size, +diff --git a/util/cros_ec_dev.h b/util/cros_ec_dev.h +index 7ff87aed9..c5dce4159 100644 +--- a/util/cros_ec_dev.h ++++ b/util/cros_ec_dev.h +@@ -13,24 +13,26 @@ + #define CROS_EC_DEV_NAME "cros_ec" + #define CROS_EC_DEV_VERSION "1.0.0" + ++#define CROS_EC_PROTO2_MAX_PARAM_SIZE 252 ++#define CROS_EC_MEMMAP_SIZE 255 ++ + /* + * @version: Command version number (often 0) + * @command: Command to send (EC_CMD_...) +- * @outdata: Outgoing data to EC + * @outsize: Outgoing length in bytes +- * @indata: Where to put the incoming data from EC +- * @insize: On call, how much we can accept. On return, how much we got. ++ * @insize: Max number of bytes to accept from EC + * @result: EC's response to the command (separate from communication failure) +- * ioctl returns zero on success, negative on error ++ * @outdata: Outgoing data to EC ++ * @indata: Where to put the incoming data from EC + */ + struct cros_ec_command { + uint32_t version; + uint32_t command; +- uint8_t *outdata; + uint32_t outsize; +- uint8_t *indata; + uint32_t insize; + uint32_t result; ++ uint8_t outdata[CROS_EC_PROTO2_MAX_PARAM_SIZE]; ++ uint8_t indata[CROS_EC_PROTO2_MAX_PARAM_SIZE]; + }; + + /* +@@ -43,12 +45,12 @@ struct cros_ec_command { + struct cros_ec_readmem { + uint32_t offset; + uint32_t bytes; +- char *buffer; ++ uint8_t buffer[CROS_EC_MEMMAP_SIZE]; + }; + +-#define CROS_EC_DEV_IOC ':' +-#define CROS_EC_DEV_IOCXCMD _IOWR(':', 0, struct cros_ec_command) +-#define CROS_EC_DEV_IOCRDMEM _IOWR(':', 1, struct cros_ec_readmem) ++#define CROS_EC_DEV_IOC 0xEC ++#define CROS_EC_DEV_IOCXCMD _IOWR(CROS_EC_DEV_IOC, 0, struct cros_ec_command) ++#define CROS_EC_DEV_IOCRDMEM _IOWR(CROS_EC_DEV_IOC, 1, struct cros_ec_readmem) + + /* + * @version: Command version number (often 0) +diff --git a/util/ecst.c b/util/ecst.c +old mode 100755 +new mode 100644 +diff --git a/util/ecst.h b/util/ecst.h +old mode 100755 +new mode 100644 +diff --git a/util/ectool.c b/util/ectool.c +index 4285e7ce6..4ac9b8c1c 100644 +--- a/util/ectool.c ++++ b/util/ectool.c +@@ -48,26 +48,18 @@ static struct option long_opts[] = { + + const char help_str[] = + "Commands:\n" +- " autofanctrl \n" +- " Turn on automatic fan speed control.\n" +- " backlight \n" +- " Enable/disable LCD backlight\n" + " battery\n" + " Prints battery info\n" +- " batterycutoff [at-shutdown]\n" ++ " WARNING! batterycutoff [at-shutdown]\n" + " Cut off battery output power\n" +- " batteryparam\n" ++ " ? batteryparam\n" + " Read or write board-specific battery parameter\n" + " boardversion\n" + " Prints the board version\n" +- " cbi\n" +- " Get/Set Cros Board Info\n" + " chargecurrentlimit\n" + " Set the maximum battery charging current\n" + " chargecontrol\n" + " Force the battery to stop charging or discharge\n" +- " chargeoverride\n" +- " Overrides charge port selection logic\n" + " chargestate\n" + " Handle commands related to charge state v2 (and later)\n" + " chipinfo\n" +@@ -76,8 +68,6 @@ const char help_str[] = + " Prints supported version mask for a command number\n" + " console\n" + " Prints the last output to the EC debug console\n" +- " cec\n" +- " Read or write CEC messages and settings\n" + " echash [CMDS]\n" + " Various EC hash commands\n" + " eventclear \n" +@@ -88,10 +78,6 @@ const char help_str[] = + " Prints raw EC host event flags\n" + " eventgetb\n" + " Prints raw EC host event flags copy B\n" +- " eventgetscimask\n" +- " Prints SCI mask for EC host events\n" +- " eventgetsmimask\n" +- " Prints SMI mask for EC host events\n" + " eventgetwakemask\n" + " Prints wake mask for EC host events\n" + " eventsetscimask \n" +@@ -102,14 +88,10 @@ const char help_str[] = + " Sets the wake mask for EC host events\n" + " extpwrlimit\n" + " Set the maximum external power limit\n" +- " fanduty \n" +- " Forces the fan PWM to a constant duty cycle\n" + " flasherase \n" + " Erases EC flash\n" + " flashinfo\n" + " Prints information on the EC flash\n" +- " flashspiinfo\n" +- " Prints information on EC SPI flash, if present\n" + " flashpd \n" + " Flash commands over PD\n" + " flashprotect [now] [enable | disable]\n" +@@ -118,16 +100,6 @@ const char help_str[] = + " Reads from EC flash to a file\n" + " flashwrite \n" + " Writes to EC flash from a file\n" +- " fpcheckpixels\n" +- " Count the number of dead pixels on the sensor\n" +- " fpframe\n" +- " Retrieve the finger image as a PGM image\n" +- " fpinfo\n" +- " Prints information about the Fingerprint sensor\n" +- " fpmode [capture|deepsleep|fingerdown|fingerup]\n" +- " Configure/Read the fingerprint sensor current mode\n" +- " fptemplate [|]\n" +- " Add a template if is provided, else dump it\n" + " forcelidopen \n" + " Forces the lid switch to open position\n" + " gpioget \n" +@@ -164,8 +136,6 @@ const char help_str[] = + " Test low-level key scanning\n" + " led | =...>\n" + " Set the color of an LED or query brightness range\n" +- " lightbar [CMDS]\n" +- " Various lightbar control commands\n" + " motionsense [CMDS]\n" + " Various motion sense control commands\n" + " panicinfo\n" +@@ -174,8 +144,6 @@ const char help_str[] = + " Whether or not the AP should pause in S5 on shutdown\n" + " pdcontrol [suspend|resume|reset|disable|on]\n" + " Controls the PD chip\n" +- " pdchipinfo \n" +- " Get PD chip information\n" + " pdlog\n" + " Prints the PD event log entries\n" + " pdwritelog \n" +@@ -184,34 +152,10 @@ const char help_str[] = + " Get All USB-PD alternate SVIDs and modes on \n" + " pdsetmode \n" + " Set USB-PD alternate SVID and mode on \n" +- " port80flood\n" +- " Rapidly write bytes to port 80\n" +- " port80read\n" +- " Print history of port 80 write\n" + " powerinfo\n" + " Prints power-related information\n" + " protoinfo\n" + " Prints EC host protocol information\n" +- " pstoreinfo\n" +- " Prints information on the EC host persistent storage\n" +- " pstoreread \n" +- " Reads from EC host persistent storage to a file\n" +- " pstorewrite \n" +- " Writes to EC host persistent storage from a file\n" +- " pwmgetfanrpm [ | all]\n" +- " Prints current fan RPM\n" +- " pwmgetkblight\n" +- " Prints current keyboard backlight percent\n" +- " pwmgetnumfans\n" +- " Prints the number of fans present\n" +- " pwmgetduty\n" +- " Prints the current 16 bit duty cycle for given PWM\n" +- " pwmsetfanrpm \n" +- " Set target fan RPM\n" +- " pwmsetkblight \n" +- " Set keyboard backlight in percent\n" +- " pwmsetduty\n" +- " Set 16 bit duty cycle of given PWM\n" + " readtest \n" + " Reads a pattern from the EC via LPC\n" + " reboot_ec " +@@ -231,26 +175,12 @@ const char help_str[] = + " Control the behavior of RWSIG task.\n" + " rwsigstatus\n" + " Run RW signature verification and get status.\n" +- " sertest\n" +- " Serial output test for COM2\n" + " switches\n" + " Prints current EC switch positions\n" +- " temps \n" +- " Print temperature.\n" +- " tempsinfo \n" +- " Print temperature sensor info.\n" + " thermalget \n" + " Get the threshold temperature values from the thermal engine.\n" + " thermalset \n" + " Set the threshold temperature values for the thermal engine.\n" +- " tpselftest\n" +- " Run touchpad self test.\n" +- " tpframeget\n" +- " Get touchpad frame data.\n" +- " tmp006cal [params...]\n" +- " Get/set TMP006 calibration\n" +- " tmp006raw \n" +- " Get raw TMP006 data\n" + " usbchargemode \n" + " Set USB charging mode\n" + " usbmux \n"