forked from palera1n/PongoOS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
load_linux.py
81 lines (64 loc) · 2.41 KB
/
load_linux.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python3
import usb.core
import struct
import sys
import argparse
import time
parser = argparse.ArgumentParser(description='A little Linux kernel/initrd uploader for pongoOS.')
parser.add_argument('-k', '--kernel', dest='kernel', help='path to kernel image')
parser.add_argument('-d', '--dtbpack', dest='dtbpack', help='path to dtbpack')
parser.add_argument('-r', '--initrd', dest='initrd', help='path to initial ramdisk')
parser.add_argument('-c', '--cmdline', dest='cmdline', help='custom kernel command line')
args = parser.parse_args()
if args.kernel is None:
print(f"error: No kernel specified! Run `{sys.argv[0]} --help` for usage.")
exit(1)
if args.dtbpack is None:
print(f"error: No dtbpack specified! Run `{sys.argv[0]} --help` for usage.")
exit(1)
dev = usb.core.find(idVendor=0x05ac, idProduct=0x4141)
if dev is None:
print("Waiting for device...")
while dev is None:
dev = usb.core.find(idVendor=0x05ac, idProduct=0x4141)
if dev is not None:
dev.set_configuration()
break
time.sleep(2)
else:
dev.set_configuration()
kernel = open(args.kernel, "rb").read()
fdt = open(args.dtbpack, "rb").read()
if args.cmdline is not None:
dev.ctrl_transfer(0x21, 4, 0, 0, 0)
dev.ctrl_transfer(0x21, 3, 0, 0, f"linux_cmdline {args.cmdline}\n")
if args.initrd is not None:
print("Loading initial ramdisk...")
initrd = open(args.initrd, "rb").read()
initrd_size = len(initrd)
dev.ctrl_transfer(0x21, 2, 0, 0, 0)
dev.ctrl_transfer(0x21, 1, 0, 0, struct.pack('I', initrd_size))
dev.write(2, initrd, 1000000)
dev.ctrl_transfer(0x21, 4, 0, 0, 0)
dev.ctrl_transfer(0x21, 3, 0, 0, "ramdisk\n")
print("Initial ramdisk loaded successfully.")
print("Loading device tree...")
dev.ctrl_transfer(0x21, 2, 0, 0, 0)
dev.ctrl_transfer(0x21, 1, 0, 0, 0)
dev.write(2, fdt)
dev.ctrl_transfer(0x21, 4, 0, 0, 0)
dev.ctrl_transfer(0x21, 3, 0, 0, "fdt\n")
print("Device tree loaded successfully.")
print("Loading kernel...")
kernel_size = len(kernel)
dev.ctrl_transfer(0x21, 2, 0, 0, 0)
dev.ctrl_transfer(0x21, 1, 0, 0, struct.pack('I', kernel_size))
dev.write(2, kernel, 1000000)
print("Kernel loaded successfully.")
dev.ctrl_transfer(0x21, 4, 0, 0, 0)
print("Booting...")
try:
dev.ctrl_transfer(0x21, 3, 0, 0, "bootl\n")
except:
# if the device disconnects without acknowledging it usually means it succeeded
print("Success.")