platform/kevin/ecfw: init
parent
1b9d35c10d
commit
bdebb940c9
@ -0,0 +1,149 @@
|
|||||||
|
{ boardName
|
||||||
|
}:
|
||||||
|
|
||||||
|
{ stdenv
|
||||||
|
, lib
|
||||||
|
, libftdi1
|
||||||
|
, hostname
|
||||||
|
, git
|
||||||
|
, pkg-config
|
||||||
|
, arm-none-eabi-gcc
|
||||||
|
, ncurses
|
||||||
|
, fetchgit
|
||||||
|
, buildPackages
|
||||||
|
, ectool
|
||||||
|
, flashrom-chromebook
|
||||||
|
}:
|
||||||
|
|
||||||
|
let makeTarget = "build/${boardName}/ec.bin";
|
||||||
|
|
||||||
|
in stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "chromebook-ec-firmware";
|
||||||
|
version = "${boardName}-1d2c13";
|
||||||
|
|
||||||
|
src = fetchgit {
|
||||||
|
url = "https://chromium.googlesource.com/chromiumos/platform/ec";
|
||||||
|
rev = "90210ee80a286c4878652cce69c205af44cd84ed";
|
||||||
|
hash = "sha256-IcS94qDCBLOtKeEQixGcOBqxzCH5oebFCFCJoTZEoAA=";
|
||||||
|
};
|
||||||
|
|
||||||
|
# ectool has the same obnoxious run-git-on-myself habit that coreboot does
|
||||||
|
getVersion = ''
|
||||||
|
#!${buildPackages.runtimeShell}
|
||||||
|
cat <<\EOF
|
||||||
|
#define CROS_EC_VERSION "${finalAttrs.version} ${placeholder "out"}"
|
||||||
|
/* limited to 32 characters */
|
||||||
|
#define CROS_EC_VERSION32 "${finalAttrs.version}"
|
||||||
|
#define VERSION "${finalAttrs.version}"
|
||||||
|
#define BUILDER "nix"
|
||||||
|
#define DATE "1970-01-01 00:00:00"
|
||||||
|
EOF
|
||||||
|
'';
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
patchShebangs .
|
||||||
|
mv $getVersionPath util/getversion.sh
|
||||||
|
chmod +x util/getversion.sh
|
||||||
|
'';
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
arm-none-eabi-gcc
|
||||||
|
|
||||||
|
# ecfw uses this to search for libftdi1, which is used in a tool
|
||||||
|
# (`ecst`) which runs at build-time (?!?!)
|
||||||
|
buildPackages.pkg-config
|
||||||
|
];
|
||||||
|
buildInputs = [
|
||||||
|
ncurses libftdi1 # part of `ecst`, which runs at build-time
|
||||||
|
];
|
||||||
|
enableParallelBuilding = true;
|
||||||
|
|
||||||
|
makeFlags = [
|
||||||
|
"BOARD=${boardName}"
|
||||||
|
|
||||||
|
# crusty old codebase, modern compiler
|
||||||
|
"EXTRA_CFLAGS=-w"
|
||||||
|
|
||||||
|
# Makefile gets confused when nixpkgs sets $out
|
||||||
|
"out=build/${boardName}"
|
||||||
|
|
||||||
|
"CPP=arm-none-eabi-cpp"
|
||||||
|
"BUILDCC=${buildPackages.stdenv.cc}/bin/cc"
|
||||||
|
|
||||||
|
#"V=1"
|
||||||
|
|
||||||
|
makeTarget
|
||||||
|
];
|
||||||
|
|
||||||
|
flashEcRw = ''
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "rebooting EC into the RO image..."
|
||||||
|
${ectool}/bin/ectool reboot_ec RO
|
||||||
|
${ectool}/bin/ectool version | grep 'Firmware copy: RO'
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "enabling RO image write protect..."
|
||||||
|
${ectool}/bin/ectool flashprotect enable | head -n1 | grep ro_now
|
||||||
|
${flashrom-chromebook}/bin/flashrom-chromebook -p ec --wp-status | grep "write protect is enabled"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "writing the RW image..."
|
||||||
|
${flashrom-chromebook}/bin/flashrom-chromebook -p ec -i EC_RW -w ${placeholder "out"}/ecfw.bin
|
||||||
|
${ectool}/bin/ectool version
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "rebooting into the new RW image..."
|
||||||
|
${ectool}/bin/ectool reboot_ec RW
|
||||||
|
sleep 2
|
||||||
|
${ectool}/bin/ectool version
|
||||||
|
${ectool}/bin/ectool version | grep 'Firmware copy: RW'
|
||||||
|
'';
|
||||||
|
|
||||||
|
flashEcRo = ''
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "making sure you are in the RW image before flashing the RO..."
|
||||||
|
${ectool}/bin/ectool version | grep 'Firmware copy: RW'
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "disabling RO image write protect..."
|
||||||
|
${ectool}/bin/ectool flashprotect disable
|
||||||
|
${flashrom-chromebook}/bin/flashrom-chromebook -p ec --wp-status | grep "write protect is disabled"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "writing the RO image..."
|
||||||
|
${flashrom-chromebook}/bin/flashrom-chromebook -p ec -i EC_RO -w ${placeholder "out"}/ecfw.bin
|
||||||
|
${ectool}/bin/ectool version
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "rebooting into the new RO image..."
|
||||||
|
${ectool}/bin/ectool reboot_ec RO
|
||||||
|
sleep 2
|
||||||
|
${ectool}/bin/ectool version
|
||||||
|
${ectool}/bin/ectool version | grep 'Firmware copy: RO'
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "re-enabling RO image write protect..."
|
||||||
|
${ectool}/bin/ectool flashprotect enable
|
||||||
|
${flashrom-chromebook}/bin/flashrom-chromebook -p ec --wp-status | grep "write protect is enabled"
|
||||||
|
'';
|
||||||
|
|
||||||
|
passAsFile = [ "getVersion" "flashEcRo" "flashEcRw" ];
|
||||||
|
|
||||||
|
installPhase = ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
mv ${makeTarget} $out/ecfw.bin
|
||||||
|
cp $flashEcRoPath $out/bin/flash-ec-ro.sh
|
||||||
|
cp $flashEcRwPath $out/bin/flash-ec-rw.sh
|
||||||
|
chmod +x $out/bin/flash-ec-ro.sh $out/bin/flash-ec-rw.sh
|
||||||
|
'';
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Firmware for Chromebooks' Embedded Controller (EC)";
|
||||||
|
};
|
||||||
|
})
|
Loading…
Reference in New Issue