]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/helpers/drivers.py
lxc: Use v4l2 camera hal on mainline
[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
27 def isBinderfsLoaded(args):
28 with open("/proc/filesystems", "r") as handle:
29 for line in handle:
30 words = line.split()
31 if len(words) >= 2 and words[1] == "binder":
32 return True
33
34 return False
35
36 def probeBinderDriver(args):
37 binder_dev_nodes = []
38 has_binder = False
39 has_vndbinder = False
40 has_hwbinder = False
41 for node in BINDER_DRIVERS:
42 if os.path.exists("/dev/" + node):
43 has_binder = True
44 if not has_binder:
45 binder_dev_nodes.append(BINDER_DRIVERS[0])
46 for node in VNDBINDER_DRIVERS:
47 if os.path.exists("/dev/" + node):
48 has_vndbinder = True
49 if not has_vndbinder:
50 binder_dev_nodes.append(VNDBINDER_DRIVERS[0])
51 for node in HWBINDER_DRIVERS:
52 if os.path.exists("/dev/" + node):
53 has_hwbinder = True
54 if not has_hwbinder:
55 binder_dev_nodes.append(HWBINDER_DRIVERS[0])
56
57 if len(binder_dev_nodes) > 0:
58 if not isBinderfsLoaded(args):
59 devices = ','.join(binder_dev_nodes)
60 command = ["modprobe", "binder_linux", "devices=\"{}\"".format(devices)]
61 output = tools.helpers.run.user(args, command, check=False, output_return=True)
62 if output:
63 logging.error("Failed to load binder driver for devices: {}".format(devices))
64 logging.error(output.strip())
65
66 if isBinderfsLoaded(args):
67 command = ["mkdir", "-p", "/dev/binderfs"]
68 tools.helpers.run.user(args, command, check=False)
69 command = ["mount", "-t", "binder", "binder", "/dev/binderfs"]
70 tools.helpers.run.user(args, command, check=False)
71 command = ["ln", "-s"]
72 command.extend(glob.glob("/dev/binderfs/*"))
73 command.append("/dev/")
74 tools.helpers.run.user(args, command, check=False)
75 else:
76 return -1
77
78 return 0
79
80 def probeAshmemDriver(args):
81 if not os.path.exists("/dev/ashmem"):
82 command = ["modprobe", "ashmem_linux"]
83 output = tools.helpers.run.user(args, command, check=False, output_return=True)
84 if output:
85 logging.error("Failed to load ashmem driver")
86 logging.error(output.strip())
87
88 if not os.path.exists("/dev/ashmem"):
89 return -1
90
91 return 0
92
93 def setupBinderNodes(args):
94 has_binder = False
95 has_vndbinder = False
96 has_hwbinder = False
97 if args.vendor_type == "MAINLINE":
98 probeBinderDriver(args)
99 for node in BINDER_DRIVERS:
100 if os.path.exists("/dev/" + node):
101 has_binder = True
102 args.BINDER_DRIVER = node
103 if not has_binder:
104 raise OSError('Binder node "binder" for waydroid not found')
105
106 for node in VNDBINDER_DRIVERS:
107 if os.path.exists("/dev/" + node):
108 has_vndbinder = True
109 args.VNDBINDER_DRIVER = node
110 if not has_vndbinder:
111 raise OSError('Binder node "vndbinder" for waydroid not found')
112
113 for node in HWBINDER_DRIVERS:
114 if os.path.exists("/dev/" + node):
115 has_hwbinder = True
116 args.HWBINDER_DRIVER = node
117 if not has_hwbinder:
118 raise OSError('Binder node "hwbinder" for waydroid not found')
119 else:
120 for node in BINDER_DRIVERS[:-1]:
121 if os.path.exists("/dev/" + node):
122 has_binder = True
123 args.BINDER_DRIVER = node
124 if not has_binder:
125 raise OSError('Binder node "binder" for waydroid not found')
126
127 for node in VNDBINDER_DRIVERS[:-1]:
128 if os.path.exists("/dev/" + node):
129 has_vndbinder = True
130 args.VNDBINDER_DRIVER = node
131 if not has_vndbinder:
132 raise OSError('Binder node "vndbinder" for waydroid not found')
133
134 for node in HWBINDER_DRIVERS[:-1]:
135 if os.path.exists("/dev/" + node):
136 has_hwbinder = True
137 args.HWBINDER_DRIVER = node
138 if not has_hwbinder:
139 raise OSError('Binder node "hwbinder" for waydroid not found')
140
141 def loadBinderNodes(args):
142 cfg = tools.config.load(args)
143 args.BINDER_DRIVER = cfg["waydroid"]["binder"]
144 args.VNDBINDER_DRIVER = cfg["waydroid"]["vndbinder"]
145 args.HWBINDER_DRIVER = cfg["waydroid"]["hwbinder"]