This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

superconfig / machines / pixel8 / initramfs.nix
6.1 kB 210 lines
1{ 2 pkgsCross, 3 stdenvNoCC, 4 writeScript, 5 callPackage, 6 cpio, 7 gzip, 8}: 9 10let 11 # Use aarch64 cross-compiled packages 12 aarch64 = pkgsCross.aarch64-multiplatform; 13 busybox = aarch64.busybox.override { enableStatic = true; }; 14 15 kernel = callPackage ./kernel.nix { }; 16 17 # Modules needed for USB (and their full dependency chain) 18 # Traced via modinfo -F depends, topologically sorted 19 usbModules = [ 20 # Leaf dependencies (no deps of their own) 21 "ect_parser" 22 "eusb_repeater" 23 "exynos-pd_el3" 24 "google_tcpci_shim" 25 "gs-chipid" 26 "gs_perf_mon" 27 "gvotable" 28 "kernel-top" 29 "logbuffer" 30 "max77759_helper" 31 "pixel-suspend-diag" 32 "sched_tp" 33 "systrace" 34 "xhci-goog-dma" 35 # Level 1 36 "exynos-pmu-if" 37 "dss" 38 "exynos-pd_hsi0" 39 "usb_psy" 40 "max77759_contaminant" 41 "max77779_contaminant" 42 "pinctrl-exynos-gs" 43 # Level 2 44 "gs_acpm" 45 "max777x9_contaminant" 46 "bc_max77759" 47 # Level 3 48 "cmupmucal" 49 "vh_sched" 50 "pixel_metrics" 51 # Level 4 52 "exynos_pm_qos" 53 "exynos-cpupm" 54 # USB hardware 55 "phy-exynos-usbdrd-eusb-super" 56 "dwc3-exynos-usb" 57 "xhci-exynos" 58 # Type-C port manager 59 "tcpci_max77759" 60 ]; 61 62 # Init script - with diagnostics written to metadata partition 63 initScript = writeScript "init" '' 64 #!/bin/busybox sh 65 66 /bin/busybox mkdir -p /proc /sys /dev /tmp /config /metadata 67 /bin/busybox mount -t proc proc /proc 68 /bin/busybox mount -t sysfs sys /sys 69 /bin/busybox mount -t devtmpfs dev /dev 70 /bin/busybox mount -t tmpfs tmp /tmp 71 /bin/busybox mount -t configfs none /config 2>/dev/null 72 /bin/busybox --install -s /bin 73 74 # Open watchdog fd 75 exec 3>/dev/watchdog 2>/dev/null 76 77 # Diagnostics written to tmpfs, then dd'd to vendor_boot at offset 60MB 78 LOG=/tmp/debug.txt 79 echo "=== NixOS init started ===" > $LOG 2>/dev/null 80 date >> $LOG 2>/dev/null 81 echo "=== /dev/block ===" >> $LOG 2>/dev/null 82 ls -la /dev/block/platform/13200000.ufs/by-name/ >> $LOG 2>/dev/null 83 echo "=== configfs ===" >> $LOG 2>/dev/null 84 ls -la /config/ >> $LOG 2>/dev/null 85 echo "=== usb_gadget exists? ===" >> $LOG 2>/dev/null 86 ls -la /config/usb_gadget/ >> $LOG 2>/dev/null 87 echo "=== /sys/class/udc before modules ===" >> $LOG 2>/dev/null 88 ls -la /sys/class/udc/ >> $LOG 2>/dev/null 89 90 # Load USB modules in dependency order, logging each 91 ${builtins.concatStringsSep "\n" ( 92 map (mod: '' 93 echo "loading ${mod}..." >> $LOG 2>/dev/null 94 insmod /lib/modules/${mod}.ko >> $LOG 2>&1 95 '') usbModules 96 )} 97 98 echo "=== /sys/class/udc after modules ===" >> $LOG 2>/dev/null 99 ls -la /sys/class/udc/ >> $LOG 2>/dev/null 100 echo "=== usb_gadget after modules ===" >> $LOG 2>/dev/null 101 ls -la /config/usb_gadget/ >> $LOG 2>/dev/null 102 echo "=== dmesg (last 100 lines) ===" >> $LOG 2>/dev/null 103 dmesg | tail -100 >> $LOG 2>/dev/null 104 105 # Wait for UDC 106 sleep 3 107 echo "=== /sys/class/udc after sleep ===" >> $LOG 2>/dev/null 108 ls -la /sys/class/udc/ >> $LOG 2>/dev/null 109 110 # Set up USB gadget serial (ACM) 111 if [ -d /config/usb_gadget ]; then 112 mkdir -p /config/usb_gadget/g1/strings/0x409 113 echo 0x18d1 > /config/usb_gadget/g1/idVendor 114 echo 0x4ee7 > /config/usb_gadget/g1/idProduct 115 echo "NixOS" > /config/usb_gadget/g1/strings/0x409/manufacturer 116 echo "Pixel8" > /config/usb_gadget/g1/strings/0x409/product 117 118 mkdir -p /config/usb_gadget/g1/configs/c.1/strings/0x409 119 echo "ACM" > /config/usb_gadget/g1/configs/c.1/strings/0x409/configuration 120 121 mkdir -p /config/usb_gadget/g1/functions/acm.usb0 122 ln -s /config/usb_gadget/g1/functions/acm.usb0 /config/usb_gadget/g1/configs/c.1/ 123 124 UDC=$(ls /sys/class/udc/ 2>/dev/null | head -1) 125 echo "UDC=$UDC" >> $LOG 2>/dev/null 126 [ -n "$UDC" ] && echo "$UDC" > /config/usb_gadget/g1/UDC 2>/dev/null 127 else 128 echo "=== /config/usb_gadget NOT FOUND ===" >> $LOG 2>/dev/null 129 fi 130 131 echo "=== gadget setup done ===" >> $LOG 2>/dev/null 132 133 # Also dump block device info for debugging 134 echo "=== /proc/partitions ===" >> $LOG 2>/dev/null 135 cat /proc/partitions >> $LOG 2>/dev/null 136 echo "=== looking for vendor_boot ===" >> $LOG 2>/dev/null 137 138 # Find vendor_boot block device via sysfs partition names 139 VB="" 140 for part in /sys/class/block/sd*/; do 141 pname=$(cat "''${part}uevent" 2>/dev/null | grep PARTNAME | cut -d= -f2) 142 devname=$(cat "''${part}uevent" 2>/dev/null | grep DEVNAME | cut -d= -f2) 143 if echo "$pname" | grep -q "vendor_boot"; then 144 VB="/dev/$devname" 145 echo "Found vendor_boot at $VB (partname=$pname)" >> $LOG 2>/dev/null 146 break 147 fi 148 done 149 150 # Write diagnostics to vendor_boot at offset 60MB 151 if [ -n "$VB" ] && [ -b "$VB" ]; then 152 dd if=$LOG of=$VB bs=1 seek=62914560 conv=notrunc 2>/dev/null 153 echo "DIAG_OK" | dd of=$VB bs=1 seek=62914544 conv=notrunc 2>/dev/null 154 echo "wrote diagnostics to $VB" >> $LOG 2>/dev/null 155 else 156 echo "vendor_boot block device not found" >> $LOG 2>/dev/null 157 fi 158 sync 159 160 # Spawn shell on USB serial as background process 161 ( 162 sleep 2 163 while true; do 164 if [ -e /dev/ttyGS0 ]; then 165 setsid sh -c 'sh </dev/ttyGS0 >/dev/ttyGS0 2>&1' 166 fi 167 sleep 1 168 done 169 ) & 170 171 # PID 1 - feed watchdog and stay alive 172 while true; do 173 echo 1 >&3 2>/dev/null 174 sleep 2 175 done 176 ''; 177 178in 179stdenvNoCC.mkDerivation { 180 name = "pixel8-initramfs"; 181 182 dontUnpack = true; 183 184 nativeBuildInputs = [ 185 cpio 186 gzip 187 ]; 188 189 buildPhase = '' 190 mkdir -p root/{bin,dev,proc,sys,tmp,run,config,lib/modules} 191 192 cp ${busybox}/bin/busybox root/bin/busybox 193 chmod 755 root/bin/busybox 194 195 cp ${initScript} root/init 196 chmod 755 root/init 197 198 # Copy USB modules and dependencies 199 ${builtins.concatStringsSep "\n" ( 200 map (mod: " cp ${kernel}/modules/${mod}.ko root/lib/modules/") usbModules 201 )} 202 203 (cd root && find . | sort | cpio -o -H newc --quiet | gzip -9) > initrd 204 ''; 205 206 installPhase = '' 207 mkdir -p $out 208 cp initrd $out/initrd 209 ''; 210}