]> glassweightruler.freedombox.rocks Git - waydroid.git/blob - tools/interfaces/IHardware.py
arch: Separately identify arm64_only CPUs without AArch32 support
[waydroid.git] / tools / interfaces / IHardware.py
1 import gbinder
2 import logging
3 from tools import helpers
4 from gi.repository import GLib
5
6
7 INTERFACE = "lineageos.waydroid.IHardware"
8 SERVICE_NAME = "waydroidhardware"
9
10 TRANSACTION_enableNFC = 1
11 TRANSACTION_enableBluetooth = 2
12 TRANSACTION_suspend = 3
13 TRANSACTION_reboot = 4
14 TRANSACTION_upgrade = 5
15 TRANSACTION_upgrade2 = 6
16
17 def add_service(args, enableNFC, enableBluetooth, suspend, reboot, upgrade):
18 helpers.drivers.loadBinderNodes(args)
19 try:
20 serviceManager = gbinder.ServiceManager("/dev/" + args.BINDER_DRIVER, args.SERVICE_MANAGER_PROTOCOL, args.BINDER_PROTOCOL)
21 except TypeError:
22 serviceManager = gbinder.ServiceManager("/dev/" + args.BINDER_DRIVER)
23
24 def response_handler(req, code, flags):
25 logging.debug(
26 "{}: Received transaction: {}".format(SERVICE_NAME, code))
27 reader = req.init_reader()
28 local_response = response.new_reply()
29 if code == TRANSACTION_enableNFC:
30 status, arg1 = reader.read_int32()
31 ret = enableNFC(arg1 != 0)
32 local_response.append_int32(0)
33 local_response.append_int32(ret)
34 elif code == TRANSACTION_enableBluetooth:
35 status, arg1 = reader.read_int32()
36 ret = enableBluetooth(arg1 != 0)
37 local_response.append_int32(0)
38 local_response.append_int32(ret)
39 elif code == TRANSACTION_suspend:
40 suspend()
41 local_response.append_int32(0)
42 elif code == TRANSACTION_reboot:
43 reboot()
44 local_response.append_int32(0)
45 elif code == TRANSACTION_upgrade:
46 arg1 = reader.read_string16()
47 status, arg2 = reader.read_int32()
48 arg3 = reader.read_string16()
49 status, arg4 = reader.read_int32()
50 upgrade(arg1, arg2, arg3, arg4)
51 local_response.append_int32(0)
52 elif code == TRANSACTION_upgrade2:
53 arg1 = reader.read_string16()
54 status, arg2 = reader.read_int64()
55 arg3 = reader.read_string16()
56 status, arg4 = reader.read_int64()
57 upgrade(arg1, arg2, arg3, arg4)
58 local_response.append_int32(0)
59 else:
60 return local_response, -99999 # Some error unknown to binder to force a RemoteException
61
62 return local_response, 0
63
64 def binder_presence():
65 if serviceManager.is_present():
66 status = serviceManager.add_service_sync(SERVICE_NAME, response)
67
68 if status:
69 logging.error("Failed to add service {}: {}".format(
70 SERVICE_NAME, status))
71 args.hardwareLoop.quit()
72
73 response = serviceManager.new_local_object(INTERFACE, response_handler)
74 args.hardwareLoop = GLib.MainLoop()
75 binder_presence()
76 status = serviceManager.add_presence_handler(binder_presence)
77 if status:
78 args.hardwareLoop.run()
79 serviceManager.remove_handler(status)
80 del serviceManager
81 else:
82 logging.error("Failed to add presence handler: {}".format(status))