Create a skeleton Rust broadcast radio HAL
This is to prove that rust broadcast radio HAL can be built and can run. The skeleton Rust broadcast radio HAL will return UNKNOWN_ERROR for all APIs. Bug: 335514024 Test: m android.hardware.broadcastradio-rust-service Change-Id: I763175b984c130d75cdc9506ba92c8c1b44338b5
This commit is contained in:
parent
31fdd9bb30
commit
6d71e46f31
7 changed files with 222 additions and 0 deletions
|
@ -36,6 +36,9 @@ aidl_interface {
|
||||||
sdk_version: "module_current",
|
sdk_version: "module_current",
|
||||||
min_sdk_version: "Tiramisu",
|
min_sdk_version: "Tiramisu",
|
||||||
},
|
},
|
||||||
|
rust: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
versions_with_info: [
|
versions_with_info: [
|
||||||
{
|
{
|
||||||
|
@ -68,3 +71,10 @@ java_defaults {
|
||||||
latest_android_hardware_broadcastradio + "-java",
|
latest_android_hardware_broadcastradio + "-java",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rust_defaults {
|
||||||
|
name: "latest_android_hardware_broadcastradio_rust",
|
||||||
|
rustlibs: [
|
||||||
|
latest_android_hardware_broadcastradio + "-rust",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
31
broadcastradio/aidl/rust_impl/Android.bp
Normal file
31
broadcastradio/aidl/rust_impl/Android.bp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
rust_binary {
|
||||||
|
name: "android.hardware.broadcastradio-rust-service",
|
||||||
|
relative_install_path: "hw",
|
||||||
|
vendor: true,
|
||||||
|
srcs: ["src/*.rs"],
|
||||||
|
crate_root: "src/main.rs",
|
||||||
|
defaults: [
|
||||||
|
"latest_android_hardware_broadcastradio_rust",
|
||||||
|
],
|
||||||
|
vintf_fragments: ["broadcastradio-rust-service.xml"],
|
||||||
|
init_rc: ["broadcastradio-rust-service.rc"],
|
||||||
|
rustlibs: [
|
||||||
|
"libbinder_rs",
|
||||||
|
],
|
||||||
|
}
|
13
broadcastradio/aidl/rust_impl/README.md
Normal file
13
broadcastradio/aidl/rust_impl/README.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Rust Skeleton BroadcastRadio HAL implementation.
|
||||||
|
|
||||||
|
WARNING: This is not a reference BroadcastRadio HAL implementation and does
|
||||||
|
not contain any actual implementation.
|
||||||
|
|
||||||
|
This folder contains a skeleton broadcast radio HAL implementation in Rust to
|
||||||
|
demonstrate how vendor may implement a Rust broadcast radio HAL. To run this
|
||||||
|
broadcast radio HAL, include `android.hardware.broadcastradio-rust-service`
|
||||||
|
in your image.
|
||||||
|
|
||||||
|
This implementation returns `StatusCode::UNKNOWN_ERROR` for all operations
|
||||||
|
and does not pass VTS/CTS. Vendor must replace the logic in
|
||||||
|
`default_broadcastradio_hal.rs` with the actual implementation
|
|
@ -0,0 +1,5 @@
|
||||||
|
service vendor.broadcastradio-default /vendor/bin/hw/android.hardware.broadcastradio-service.default
|
||||||
|
interface aidl android.hardware.broadcastradio.IBroadcastRadio/amfm
|
||||||
|
class hal
|
||||||
|
user audioserver
|
||||||
|
group audio
|
|
@ -0,0 +1,23 @@
|
||||||
|
<!--
|
||||||
|
~ Copyright (C) 2024 The Android Open Source Project
|
||||||
|
~
|
||||||
|
~ Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
~ you may not use this file except in compliance with the License.
|
||||||
|
~ You may obtain a copy of the License at
|
||||||
|
~
|
||||||
|
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
~
|
||||||
|
~ Unless required by applicable law or agreed to in writing, software
|
||||||
|
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
~ See the License for the specific language governing permissions and
|
||||||
|
~ limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<manifest version="1.0" type="device">
|
||||||
|
<hal format="aidl">
|
||||||
|
<name>android.hardware.broadcastradio</name>
|
||||||
|
<version>2</version>
|
||||||
|
<fqname>IBroadcastRadio/amfm</fqname>
|
||||||
|
</hal>
|
||||||
|
</manifest>
|
107
broadcastradio/aidl/rust_impl/src/default_broadcastradio_hal.rs
Normal file
107
broadcastradio/aidl/rust_impl/src/default_broadcastradio_hal.rs
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
use android_hardware_broadcastradio::aidl::android::hardware::broadcastradio::{
|
||||||
|
AmFmRegionConfig::AmFmRegionConfig,
|
||||||
|
AnnouncementType::AnnouncementType,
|
||||||
|
ConfigFlag::ConfigFlag,
|
||||||
|
DabTableEntry::DabTableEntry,
|
||||||
|
IAnnouncementListener::IAnnouncementListener,
|
||||||
|
IBroadcastRadio::IBroadcastRadio,
|
||||||
|
ICloseHandle::ICloseHandle,
|
||||||
|
ITunerCallback::ITunerCallback,
|
||||||
|
ProgramFilter::ProgramFilter,
|
||||||
|
ProgramSelector::ProgramSelector,
|
||||||
|
Properties::Properties,
|
||||||
|
VendorKeyValue::VendorKeyValue,
|
||||||
|
};
|
||||||
|
use binder::{Interface, Result as BinderResult, StatusCode, Strong};
|
||||||
|
use std::vec::Vec;
|
||||||
|
|
||||||
|
/// This struct is defined to implement IBroadcastRadio AIDL interface.
|
||||||
|
pub struct DefaultBroadcastRadioHal;
|
||||||
|
|
||||||
|
impl Interface for DefaultBroadcastRadioHal {}
|
||||||
|
|
||||||
|
impl IBroadcastRadio for DefaultBroadcastRadioHal {
|
||||||
|
fn getAmFmRegionConfig(&self, _full : bool) -> BinderResult<AmFmRegionConfig> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getDabRegionConfig(&self) -> BinderResult<Vec<DabTableEntry>> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getProperties(&self) -> BinderResult<Properties> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getImage(&self, _id : i32) -> BinderResult<Vec<u8>> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn setTunerCallback(&self, _callback : &Strong<dyn ITunerCallback>) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn unsetTunerCallback(&self) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn tune(&self, _program : &ProgramSelector) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn seek(&self, _direction_up : bool, _skip_sub_channel : bool) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn step(&self, _direction_up : bool) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cancel(&self) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn startProgramListUpdates(&self, _filter : &ProgramFilter) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn stopProgramListUpdates(&self) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn isConfigFlagSet(&self, _flag : ConfigFlag) -> BinderResult<bool> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn setConfigFlag(&self, _flag : ConfigFlag, _value : bool) -> BinderResult<()> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn setParameters(&self, _parameters : &[VendorKeyValue]) -> BinderResult<Vec<VendorKeyValue>> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getParameters(&self, _parameters : &[String]) -> BinderResult<Vec<VendorKeyValue>> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn registerAnnouncementListener(&self, _listener : &Strong<dyn IAnnouncementListener>,
|
||||||
|
_enabled : &[AnnouncementType]) -> BinderResult<Strong<dyn ICloseHandle>> {
|
||||||
|
Err(StatusCode::UNKNOWN_ERROR.into())
|
||||||
|
}
|
||||||
|
}
|
33
broadcastradio/aidl/rust_impl/src/main.rs
Normal file
33
broadcastradio/aidl/rust_impl/src/main.rs
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2024 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
mod default_broadcastradio_hal;
|
||||||
|
|
||||||
|
use android_hardware_broadcastradio::aidl::android::hardware::broadcastradio::IBroadcastRadio::BnBroadcastRadio;
|
||||||
|
use crate::default_broadcastradio_hal::DefaultBroadcastRadioHal;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
binder::ProcessState::start_thread_pool();
|
||||||
|
let my_service = DefaultBroadcastRadioHal;
|
||||||
|
let service_name = "android.hardware.broadcastradio.IBroadcastRadio/amfm";
|
||||||
|
let my_service_binder = BnBroadcastRadio::new_binder(
|
||||||
|
my_service,
|
||||||
|
binder::BinderFeatures::default(),
|
||||||
|
);
|
||||||
|
binder::add_service(service_name, my_service_binder.as_binder())
|
||||||
|
.expect(format!("Failed to register {}?", service_name).as_str());
|
||||||
|
// Does not return.
|
||||||
|
binder::ProcessState::join_thread_pool()
|
||||||
|
}
|
Loading…
Reference in a new issue