]>
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
29 def isBinderfsLoaded(args
):
30 with open("/proc/filesystems", "r") as handle
:
33 if len(words
) >= 2 and words
[1] == "binder":
38 def allocBinderNodes(args
, binder_dev_nodes
):
43 TYPESHIFT
= NRSHIFT
+ NRBITS
44 SIZESHIFT
= TYPESHIFT
+ TYPEBITS
45 DIRSHIFT
= SIZESHIFT
+ SIZEBITS
49 def IOC(direction
, _type
, nr
, size
):
50 return (direction
<< DIRSHIFT
) |
(_type
<< TYPESHIFT
) |
(nr
<< NRSHIFT
) |
(size
<< SIZESHIFT
)
52 def IOWR(_type
, nr
, size
):
53 return IOC(READ|WRITE
, _type
, nr
, size
)
55 BINDER_CTL_ADD
= IOWR(98, 1, 264)
56 binderctrlfd
= open('/dev/binderfs/binder-control','rb')
58 for node
in binder_dev_nodes
:
59 node_struct
= struct
.pack(
60 '256sII', bytes(node
, 'utf-8'), 0, 0)
62 fcntl
.ioctl(binderctrlfd
.fileno(), BINDER_CTL_ADD
, node_struct
)
63 except FileExistsError
:
66 def probeBinderDriver(args
):
71 for node
in BINDER_DRIVERS
:
72 if os
.path
.exists("/dev/" + node
):
75 binder_dev_nodes
.append(BINDER_DRIVERS
[0])
76 for node
in VNDBINDER_DRIVERS
:
77 if os
.path
.exists("/dev/" + node
):
80 binder_dev_nodes
.append(VNDBINDER_DRIVERS
[0])
81 for node
in HWBINDER_DRIVERS
:
82 if os
.path
.exists("/dev/" + node
):
85 binder_dev_nodes
.append(HWBINDER_DRIVERS
[0])
87 if len(binder_dev_nodes
) > 0:
88 if not isBinderfsLoaded(args
):
89 command
= ["modprobe", "binder_linux"]
90 output
= tools
.helpers
.run
.user(args
, command
, check
=False, output_return
=True)
92 logging
.error("Failed to load binder driver")
93 logging
.error(output
.strip())
95 if isBinderfsLoaded(args
):
96 command
= ["mkdir", "-p", "/dev/binderfs"]
97 tools
.helpers
.run
.user(args
, command
, check
=False)
98 command
= ["mount", "-t", "binder", "binder", "/dev/binderfs"]
99 tools
.helpers
.run
.user(args
, command
, check
=False)
100 allocBinderNodes(args
, binder_dev_nodes
)
101 command
= ["ln", "-s"]
102 command
.extend(glob
.glob("/dev/binderfs/*"))
103 command
.append("/dev/")
104 tools
.helpers
.run
.user(args
, command
, check
=False)
108 def probeAshmemDriver(args
):
109 if not os
.path
.exists("/dev/ashmem"):
110 command
= ["modprobe", "ashmem_linux"]
111 output
= tools
.helpers
.run
.user(args
, command
, check
=False, output_return
=True)
113 logging
.error("Failed to load ashmem driver")
114 logging
.error(output
.strip())
116 if not os
.path
.exists("/dev/ashmem"):
121 def setupBinderNodes(args
):
123 has_vndbinder
= False
125 if args
.vendor_type
== "MAINLINE":
126 probeBinderDriver(args
)
127 for node
in BINDER_DRIVERS
:
128 if os
.path
.exists("/dev/" + node
):
130 args
.BINDER_DRIVER
= node
132 raise OSError('Binder node "binder" for waydroid not found')
134 for node
in VNDBINDER_DRIVERS
:
135 if os
.path
.exists("/dev/" + node
):
137 args
.VNDBINDER_DRIVER
= node
138 if not has_vndbinder
:
139 raise OSError('Binder node "vndbinder" for waydroid not found')
141 for node
in HWBINDER_DRIVERS
:
142 if os
.path
.exists("/dev/" + node
):
144 args
.HWBINDER_DRIVER
= node
146 raise OSError('Binder node "hwbinder" for waydroid not found')
148 for node
in BINDER_DRIVERS
[:-1]:
149 if os
.path
.exists("/dev/" + node
):
151 args
.BINDER_DRIVER
= node
153 raise OSError('Binder node "binder" for waydroid not found')
155 for node
in VNDBINDER_DRIVERS
[:-1]:
156 if os
.path
.exists("/dev/" + node
):
158 args
.VNDBINDER_DRIVER
= node
159 if not has_vndbinder
:
160 raise OSError('Binder node "vndbinder" for waydroid not found')
162 for node
in HWBINDER_DRIVERS
[:-1]:
163 if os
.path
.exists("/dev/" + node
):
165 args
.HWBINDER_DRIVER
= node
167 raise OSError('Binder node "hwbinder" for waydroid not found')
169 def loadBinderNodes(args
):
170 cfg
= tools
.config
.load(args
)
171 args
.BINDER_DRIVER
= cfg
["waydroid"]["binder"]
172 args
.VNDBINDER_DRIVER
= cfg
["waydroid"]["vndbinder"]
173 args
.HWBINDER_DRIVER
= cfg
["waydroid"]["hwbinder"]