This repository has no description
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}