]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/helpers/drivers.py
config: Edit system_channel (systems -> system)
[waydroid.git] / tools / helpers / drivers.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
3 import logging
4 import os
5 import glob
6 import tools.config
7 import tools.helpers.run
8
9
10 BINDER_DRIVERS = [
11 "anbox-binder",
12 "puddlejumper",
13 "binder"
14 ]
15 VNDBINDER_DRIVERS = [
16 "anbox-vndbinder",
17 "vndpuddlejumper",
18 "vndbinder"
19 ]
20 HWBINDER_DRIVERS = [
21 "anbox-hwbinder",
22 "hwpuddlejumper",
23 "hwbinder"
24 ]
25
26 def probeBinderDriver(args):
27 binder_dev_nodes = []
28 has_binder = False
29 has_vndbinder = False
30 has_hwbinder = False
31 for node in BINDER_DRIVERS:
32 if os.path.exists("/dev/" + node):
33 has_binder = True
34 if not has_binder:
35 binder_dev_nodes.append(BINDER_DRIVERS[0])
36 for node in VNDBINDER_DRIVERS:
37 if os.path.exists("/dev/" + node):
38 has_vndbinder = True
39 if not has_vndbinder:
40 binder_dev_nodes.append(VNDBINDER_DRIVERS[0])
41 for node in HWBINDER_DRIVERS:
42 if os.path.exists("/dev/" + node):
43 has_hwbinder = True
44 if not has_hwbinder:
45 binder_dev_nodes.append(HWBINDER_DRIVERS[0])
46
47 if len(binder_dev_nodes) > 0:
48 devices = ','.join(binder_dev_nodes)
49 command = ["modprobe", "binder_linux", "devices=\"{}\"".format(devices)]
50 output = tools.helpers.run.root(args, command, check=False, output_return=True)
51 if output:
52 logging.error("Failed to load binder driver for devices: {}".format(devices))
53 logging.error(output.strip())
54 else:
55 command = ["mkdir", "-p", "/dev/binderfs"]
56 tools.helpers.run.root(args, command, check=False)
57 command = ["mount", "-t", "binder", "binder", "/dev/binderfs"]
58 tools.helpers.run.root(args, command, check=False)
59 command = ["ln", "-s"]
60 command.extend(glob.glob("/dev/binderfs/*"))
61 command.append("/dev/")
62 tools.helpers.run.root(args, command, check=False)
63
64 for node in binder_dev_nodes:
65 if not os.path.exists("/dev/" + node):
66 return -1
67
68 return 0
69
70 def probeAshmemDriver(args):
71 if not os.path.exists("/dev/ashmem"):
72 command = ["modprobe", "ashmem_linux"]
73 output = tools.helpers.run.root(args, command, check=False, output_return=True)
74 if output:
75 logging.error("Failed to load ashmem driver")
76 logging.error(output.strip())
77
78 if not os.path.exists("/dev/ashmem"):
79 return -1
80
81 return 0
82
83 def setupBinderNodes(args):
84 has_binder = False
85 has_vndbinder = False
86 has_hwbinder = False
87 if args.vendor_type == "MAINLINE":
88 probeBinderDriver(args)
89 for node in BINDER_DRIVERS:
90 if os.path.exists("/dev/" + node):
91 has_binder = True
92 args.BINDER_DRIVER = node
93 if not has_binder:
94 raise OSError('Binder node "binder" for waydroid not found')
95
96 for node in VNDBINDER_DRIVERS:
97 if os.path.exists("/dev/" + node):
98 has_vndbinder = True
99 args.VNDBINDER_DRIVER = node
100 if not has_vndbinder:
101 raise OSError('Binder node "vndbinder" for waydroid not found')
102
103 for node in HWBINDER_DRIVERS:
104 if os.path.exists("/dev/" + node):
105 has_hwbinder = True
106 args.HWBINDER_DRIVER = node
107 if not has_hwbinder:
108 raise OSError('Binder node "hwbinder" for waydroid not found')
109 else:
110 for node in BINDER_DRIVERS[:-1]:
111 if os.path.exists("/dev/" + node):
112 has_binder = True
113 args.BINDER_DRIVER = node
114 if not has_binder:
115 raise OSError('Binder node "binder" for waydroid not found')
116
117 for node in VNDBINDER_DRIVERS[:-1]:
118 if os.path.exists("/dev/" + node):
119 has_vndbinder = True
120 args.VNDBINDER_DRIVER = node
121 if not has_vndbinder:
122 raise OSError('Binder node "vndbinder" for waydroid not found')
123
124 for node in HWBINDER_DRIVERS[:-1]:
125 if os.path.exists("/dev/" + node):
126 has_hwbinder = True
127 args.HWBINDER_DRIVER = node
128 if not has_hwbinder:
129 raise OSError('Binder node "hwbinder" for waydroid not found')
130
131 def loadBinderNodes(args):
132 cfg = tools.config.load(args)
133 args.BINDER_DRIVER = cfg["waydroid"]["binder"]
134 args.VNDBINDER_DRIVER = cfg["waydroid"]["vndbinder"]
135 args.HWBINDER_DRIVER = cfg["waydroid"]["hwbinder"]