]>
glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/helpers/drivers.py
1 # Copyright 2021 Erfan Abdi
2 # SPDX-License-Identifier: GPL-3.0-or-later
9 import tools
.helpers
.run
32 def isBinderfsLoaded(args
):
33 with open("/proc/filesystems", "r") as handle
:
36 if len(words
) >= 2 and words
[1] == "binder":
41 def allocBinderNodes(args
, binder_dev_nodes
):
46 TYPESHIFT
= NRSHIFT
+ NRBITS
47 SIZESHIFT
= TYPESHIFT
+ TYPEBITS
48 DIRSHIFT
= SIZESHIFT
+ SIZEBITS
52 def IOC(direction
, _type
, nr
, size
):
53 return (direction
<< DIRSHIFT
) |
(_type
<< TYPESHIFT
) |
(nr
<< NRSHIFT
) |
(size
<< SIZESHIFT
)
55 def IOWR(_type
, nr
, size
):
56 return IOC(READ|WRITE
, _type
, nr
, size
)
58 BINDER_CTL_ADD
= IOWR(98, 1, 264)
59 binderctrlfd
= open('/dev/binderfs/binder-control','rb')
61 for node
in binder_dev_nodes
:
62 node_struct
= struct
.pack(
63 '256sII', bytes(node
, 'utf-8'), 0, 0)
65 fcntl
.ioctl(binderctrlfd
.fileno(), BINDER_CTL_ADD
, node_struct
)
66 except FileExistsError
:
69 def probeBinderDriver(args
):
74 for node
in BINDER_DRIVERS
:
75 if os
.path
.exists("/dev/" + node
):
78 binder_dev_nodes
.append(BINDER_DRIVERS
[0])
79 for node
in VNDBINDER_DRIVERS
:
80 if os
.path
.exists("/dev/" + node
):
83 binder_dev_nodes
.append(VNDBINDER_DRIVERS
[0])
84 for node
in HWBINDER_DRIVERS
:
85 if os
.path
.exists("/dev/" + node
):
88 binder_dev_nodes
.append(HWBINDER_DRIVERS
[0])
90 if len(binder_dev_nodes
) > 0:
91 if not isBinderfsLoaded(args
):
92 devices
= ','.join(binder_dev_nodes
)
93 command
= ["modprobe", "binder_linux",
94 "devices=\"{}\"".format(devices
)]
95 output
= tools
.helpers
.run
.user(args
, command
, check
=False, output_return
=True)
97 logging
.error("Failed to load binder driver")
98 logging
.error(output
.strip())
100 if isBinderfsLoaded(args
):
101 command
= ["mkdir", "-p", "/dev/binderfs"]
102 tools
.helpers
.run
.user(args
, command
, check
=False)
103 command
= ["mount", "-t", "binder", "binder", "/dev/binderfs"]
104 tools
.helpers
.run
.user(args
, command
, check
=False)
105 allocBinderNodes(args
, binder_dev_nodes
)
106 command
= ["ln", "-s"]
107 command
.extend(glob
.glob("/dev/binderfs/*"))
108 command
.append("/dev/")
109 tools
.helpers
.run
.user(args
, command
, check
=False)
113 def probeAshmemDriver(args
):
114 if not os
.path
.exists("/dev/ashmem"):
115 command
= ["modprobe", "-q", "ashmem_linux"]
116 tools
.helpers
.run
.user(args
, command
, check
=False)
118 if not os
.path
.exists("/dev/ashmem"):
123 def setupBinderNodes(args
):
125 has_vndbinder
= False
127 if args
.vendor_type
== "MAINLINE":
128 probeBinderDriver(args
)
129 for node
in BINDER_DRIVERS
:
130 if os
.path
.exists("/dev/" + node
):
132 args
.BINDER_DRIVER
= node
134 raise OSError('Binder node "binder" for waydroid not found')
136 for node
in VNDBINDER_DRIVERS
:
137 if os
.path
.exists("/dev/" + node
):
139 args
.VNDBINDER_DRIVER
= node
140 if not has_vndbinder
:
141 raise OSError('Binder node "vndbinder" for waydroid not found')
143 for node
in HWBINDER_DRIVERS
:
144 if os
.path
.exists("/dev/" + node
):
146 args
.HWBINDER_DRIVER
= node
148 raise OSError('Binder node "hwbinder" for waydroid not found')
150 for node
in BINDER_DRIVERS
[:-1]:
151 if os
.path
.exists("/dev/" + node
):
153 args
.BINDER_DRIVER
= node
155 raise OSError('Binder node "binder" for waydroid not found')
157 for node
in VNDBINDER_DRIVERS
[:-1]:
158 if os
.path
.exists("/dev/" + node
):
160 args
.VNDBINDER_DRIVER
= node
161 if not has_vndbinder
:
162 raise OSError('Binder node "vndbinder" for waydroid not found')
164 for node
in HWBINDER_DRIVERS
[:-1]:
165 if os
.path
.exists("/dev/" + node
):
167 args
.HWBINDER_DRIVER
= node
169 raise OSError('Binder node "hwbinder" for waydroid not found')
171 def loadBinderNodes(args
):
172 cfg
= tools
.config
.load(args
)
173 args
.BINDER_DRIVER
= cfg
["waydroid"]["binder"]
174 args
.VNDBINDER_DRIVER
= cfg
["waydroid"]["vndbinder"]
175 args
.HWBINDER_DRIVER
= cfg
["waydroid"]["hwbinder"]
176 # These might not be in cfg on package upgrade
177 args
.BINDER_PROTOCOL
= cfg
["waydroid"].get("binder_protocol")
178 args
.SERVICE_MANAGER_PROTOCOL
= cfg
["waydroid"].get("service_manager_protocol")