Run VHAL server with launch_cvd
Test: build and create Acloud local instance, also tested 2 cvd
instances by `launch_cvd`, works as normal
Bug: 157603385
Change-Id: I6c28712f9386d7ad08606786a4bf48ac9b3f5c82
Merged-In: I6c28712f9386d7ad08606786a4bf48ac9b3f5c82
diff --git a/host/commands/assemble_cvd/flags.cc b/host/commands/assemble_cvd/flags.cc
index 5ce8e99..d57e871 100644
--- a/host/commands/assemble_cvd/flags.cc
+++ b/host/commands/assemble_cvd/flags.cc
@@ -169,6 +169,8 @@
"guest to host. One of [serial, vsock]");
DEFINE_bool(enable_tombstone_receiver, true, "Enables the tombstone logger on "
"both the guest and the host");
+DEFINE_bool(enable_vehicle_hal_grpc_server, true, "Enables the vehicle HAL "
+ "emulation gRPC server on the host");
DEFINE_bool(use_bootloader, false, "Boots the device using a bootloader");
DEFINE_string(bootloader, "", "Bootloader binary path");
DEFINE_string(boot_slot, "", "Force booting into the given slot. If empty, "
@@ -379,6 +381,10 @@
tmp_config_obj.set_tombstone_receiver_binary(
vsoc::DefaultHostArtifactsPath("bin/tombstone_receiver"));
+ tmp_config_obj.set_enable_vehicle_hal_grpc_server(FLAGS_enable_vehicle_hal_grpc_server);
+ tmp_config_obj.set_vehicle_hal_grpc_server_binary(
+ vsoc::DefaultHostArtifactsPath("bin/android.hardware.automotive.vehicle@2.0-virtualization-grpc-server"));
+
tmp_config_obj.set_use_bootloader(FLAGS_use_bootloader);
tmp_config_obj.set_bootloader(FLAGS_bootloader);
@@ -414,6 +420,8 @@
instance.set_host_port(6520 + num - 1);
instance.set_adb_ip_and_port("127.0.0.1:" + std::to_string(6520 + num - 1));
+ instance.set_vehicle_hal_server_port(9210 + num - 1);
+
instance.set_device_title(FLAGS_device_title);
instance.set_virtual_disk_paths({
diff --git a/host/commands/run_cvd/kernel_args.cc b/host/commands/run_cvd/kernel_args.cc
index 60a53dd..af77420 100644
--- a/host/commands/run_cvd/kernel_args.cc
+++ b/host/commands/run_cvd/kernel_args.cc
@@ -87,6 +87,12 @@
kernel_cmdline.push_back("androidboot.force_normal_boot=1");
}
+ if (config.enable_vehicle_hal_grpc_server() && instance.vehicle_hal_server_port()) {
+ constexpr int vehicle_hal_server_cid = 2;
+ kernel_cmdline.push_back(concat("androidboot.vendor.vehiclehal.server.cid=", vehicle_hal_server_cid));
+ kernel_cmdline.push_back(concat("androidboot.vendor.vehiclehal.server.port=", instance.vehicle_hal_server_port()));
+ }
+
// TODO(b/158131610): Set this in crosvm instead
kernel_cmdline.push_back(concat("androidboot.wifi_mac_address=",
mac_to_str(instance.wifi_mac_address())));
diff --git a/host/commands/run_cvd/launch.cc b/host/commands/run_cvd/launch.cc
index e34303b..93d600f 100644
--- a/host/commands/run_cvd/launch.cc
+++ b/host/commands/run_cvd/launch.cc
@@ -340,3 +340,27 @@
GetOnSubprocessExitCallback(config));
}
}
+
+void LaunchVerhicleHalServerIfEnabled(const vsoc::CuttlefishConfig& config,
+ cvd::ProcessMonitor* process_monitor) {
+ if (!config.enable_vehicle_hal_grpc_server()) {
+ return;
+ }
+
+ cvd::Command grpc_server(config.vehicle_hal_grpc_server_binary());
+ auto instance = config.ForDefaultInstance();
+
+ const unsigned vhal_server_cid = 2;
+ const unsigned vhal_server_port = instance.vehicle_hal_server_port();
+ const std::string vhal_server_power_state_file =
+ cvd::AbsolutePath(instance.PerInstancePath("power_state"));
+ const std::string vhal_server_power_state_socket =
+ cvd::AbsolutePath(instance.PerInstancePath("power_state_socket"));
+
+ grpc_server.AddParameter("--server_cid=", vhal_server_cid);
+ grpc_server.AddParameter("--server_port=", vhal_server_port);
+ grpc_server.AddParameter("--power_state_file=", vhal_server_power_state_file);
+ grpc_server.AddParameter("--power_state_socket=", vhal_server_power_state_socket);
+ process_monitor->StartSubprocess(std::move(grpc_server),
+ GetOnSubprocessExitCallback(config));
+}
diff --git a/host/commands/run_cvd/launch.h b/host/commands/run_cvd/launch.h
index 7acbf1d..0a8756f 100644
--- a/host/commands/run_cvd/launch.h
+++ b/host/commands/run_cvd/launch.h
@@ -50,3 +50,6 @@
StreamerLaunchResult LaunchWebRTC(cvd::ProcessMonitor* process_monitor,
const vsoc::CuttlefishConfig& config);
+
+void LaunchVerhicleHalServerIfEnabled(const vsoc::CuttlefishConfig& config,
+ cvd::ProcessMonitor* process_monitor);
diff --git a/host/commands/run_cvd/main.cc b/host/commands/run_cvd/main.cc
index 01b7a44..b45b22c 100644
--- a/host/commands/run_cvd/main.cc
+++ b/host/commands/run_cvd/main.cc
@@ -427,6 +427,8 @@
auto tombstone_server = LaunchTombstoneReceiverIfEnabled(*config, &process_monitor);
auto tombstone_kernel_args = KernelCommandLineFromTombstone(tombstone_server);
+ LaunchVerhicleHalServerIfEnabled(*config, &process_monitor);
+
// The streamer needs to launch before the VMM because it serves on several
// sockets (input devices, vsock frame server) when using crosvm.
StreamerLaunchResult streamer_config;
diff --git a/host/libs/config/cuttlefish_config.cpp b/host/libs/config/cuttlefish_config.cpp
index 1b1403b..cc9a000 100644
--- a/host/libs/config/cuttlefish_config.cpp
+++ b/host/libs/config/cuttlefish_config.cpp
@@ -125,6 +125,10 @@
const char* kWebRTCPublicIP = "webrtc_public_ip";
const char* kWebRTCEnableADBWebSocket = "webrtc_enable_adb_websocket";
+const char* kEnableVehicleHalServer = "enable_vehicle_hal_server";
+const char* kVehicleHalServerBinary = "vehicle_hal_server_binary";
+const char* kVehicleHalServerPort = "vehicle_hal_server_port";
+
const char* kRestartSubprocesses = "restart_subprocesses";
const char* kRunAdbConnector = "run_adb_connector";
const char* kAdbConnectorBinary = "adb_connector_binary";
@@ -575,6 +579,14 @@
(*Dictionary())[kVncServerPort] = vnc_server_port;
}
+int CuttlefishConfig::InstanceSpecific::vehicle_hal_server_port() const {
+ return (*Dictionary())[kVehicleHalServerPort].asInt();
+}
+
+void CuttlefishConfig::MutableInstanceSpecific::set_vehicle_hal_server_port(int vehicle_hal_server_port) {
+ (*Dictionary())[kVehicleHalServerPort] = vehicle_hal_server_port;
+}
+
void CuttlefishConfig::set_enable_webrtc(bool enable_webrtc) {
(*dictionary_)[kEnableWebRTC] = enable_webrtc;
}
@@ -591,6 +603,22 @@
return (*dictionary_)[kWebRTCBinary].asString();
}
+void CuttlefishConfig::set_enable_vehicle_hal_grpc_server(bool enable_vehicle_hal_grpc_server) {
+ (*dictionary_)[kEnableVehicleHalServer] = enable_vehicle_hal_grpc_server;
+}
+
+bool CuttlefishConfig::enable_vehicle_hal_grpc_server() const {
+ return (*dictionary_)[kEnableVehicleHalServer].asBool();
+}
+
+void CuttlefishConfig::set_vehicle_hal_grpc_server_binary(const std::string& vehicle_hal_server_binary) {
+ (*dictionary_)[kVehicleHalServerBinary] = vehicle_hal_server_binary;
+}
+
+std::string CuttlefishConfig::vehicle_hal_grpc_server_binary() const {
+ return (*dictionary_)[kVehicleHalServerBinary].asString();
+}
+
void CuttlefishConfig::set_webrtc_assets_dir(const std::string& webrtc_assets_dir) {
(*dictionary_)[kWebRTCAssetsDir] = webrtc_assets_dir;
}
diff --git a/host/libs/config/cuttlefish_config.h b/host/libs/config/cuttlefish_config.h
index 45c15e1..c99ecf1 100644
--- a/host/libs/config/cuttlefish_config.h
+++ b/host/libs/config/cuttlefish_config.h
@@ -193,6 +193,12 @@
void set_webrtc_enable_adb_websocket(bool enable);
bool webrtc_enable_adb_websocket() const;
+ void set_enable_vehicle_hal_grpc_server(bool enable_vhal_server);
+ bool enable_vehicle_hal_grpc_server() const;
+
+ void set_vehicle_hal_grpc_server_binary(const std::string& vhal_server_binary);
+ std::string vehicle_hal_grpc_server_binary() const;
+
void set_restart_subprocesses(bool restart_subprocesses);
bool restart_subprocesses() const;
@@ -284,6 +290,8 @@
public:
std::string serial_number() const;
int vnc_server_port() const;
+ // Port number to connect to the vehicle HAL server on the host
+ int vehicle_hal_server_port() const;
int host_port() const;
std::string adb_ip_and_port() const;
std::string adb_device_name() const;
@@ -341,6 +349,7 @@
public:
void set_serial_number(const std::string& serial_number);
void set_vnc_server_port(int vnc_server_port);
+ void set_vehicle_hal_server_port(int vehicle_server_port);
void set_host_port(int host_port);
void set_adb_ip_and_port(const std::string& ip_port);
void set_device_title(const std::string& title);
diff --git a/host_package.mk b/host_package.mk
index 8b9196f..419e0c5 100644
--- a/host_package.mk
+++ b/host_package.mk
@@ -19,6 +19,7 @@
cvd_host_executables := \
adb \
adbshell \
+ android.hardware.automotive.vehicle@2.0-virtualization-grpc-server \
launch_cvd \
lpmake \
lpunpack \