Android Q 添加Hal 电机服务
- 今年年初,接到国外的智能输液项目。该项目需要上层下发指令控制电机,为了遵循Android整体的开发架构,此片将描述如何新建一个hal服务,去打开/操作设备
以Sgm42509为例,其他模块类似
文件及修改如下所示:
1、android/device/qcom/sepolicy/legacy/vendor/common/hwservice_contexts
#hhuiming add motor feature
vendor.dxdragon.motorservice::IMotorService u:object_r:hal_motor_hwservice:s0
vendor.nexpresso.sgm42609service::ISgm42609Service u:object_r:hal_sgm42609_hwservice:s0
vendor.nexpresso.itr1502service::IItr1502Service u:object_r:hal_itr1502_hwservice:s0
2、android/device/qcom/msm8937_32go/manifest.xml
<!-- add by hhuimig for motor hal service -->
<hal format="hidl">
<name>vendor.dxdragon.motorservice</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IMotorService</name>
<instance>default</instance>
</interface>
</hal>
<!-- add by hhuimig for sgm42609 hal service on 2020.1.8 -->
<hal format="hidl">
<name>vendor.nexpresso.sgm42609service</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>ISgm42609Service</name>
<instance>default</instance>
</interface>
</hal>
<!--add by hhuiming for itr1502 service-->
<hal format="hidl">
<name>vendor.nexpresso.itr1502service</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IItr1502Service</name>
<instance>default</instance>
</interface>
</hal>
3、android/device/qcom/msm8937_32go/msm8937_32go.mk
#add by hhuiming for motor
PRODUCT_PACKAGES += vendor.dxdragon.motorservice@1.0
PRODUCT_PACKAGES += vendor.dxdragon.motorservice@1.0-impl
PRODUCT_PACKAGES += vendor.dxdragon.motorservice@1.0-service
PRODUCT_PACKAGES += vendor.dxdragon.motorservice@1.0-service.rc
PRODUCT_PACKAGES += vendor.dxdragon.motorservice-V1.0-java
PRODUCT_PACKAGES += mp6500.default
$(call inherit-product-if-exists, vendor/xxx/app/xxx.mk)
#add by hhuiming for sgm42609
PRODUCT_PACKAGES += vendor.nexpresso.sgm42609service@1.0
PRODUCT_PACKAGES += vendor.nexpresso.sgm42609service@1.0-impl
PRODUCT_PACKAGES += vendor.nexpresso.sgm42609service@1.0-service
PRODUCT_PACKAGES += vendor.nexpresso.sgm42609service@1.0-service.rc
PRODUCT_PACKAGES += vendor.nexpresso.sgm42609service-V1.0-java
PRODUCT_PACKAGES += sgm42609.default
#add by hhuiming for sgm42609
PRODUCT_PACKAGES += vendor.nexpresso.itr1502service@1.0
PRODUCT_PACKAGES += vendor.nexpresso.itr1502service@1.0-impl
PRODUCT_PACKAGES += vendor.nexpresso.itr1502service@1.0-service
PRODUCT_PACKAGES += vendor.nexpresso.itr1502service@1.0-service.rc
PRODUCT_PACKAGES += vendor.nexpresso.itr1502service-V1.0-java
PRODUCT_PACKAGES += itr1502.default
4、android/device/qcom/msm8937_32go/manifest.xml
<!-- add by hhuimig for motor hal service -->
<hal format="hidl">
<name>vendor.dxdragon.motorservice</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IMotorService</name>
<instance>default</instance>
</interface>
</hal>
<!-- add by hhuimig for sgm42609 hal service on 2020.1.8 -->
<hal format="hidl">
<name>vendor.nexpresso.sgm42609service</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>ISgm42609Service</name>
<instance>default</instance>
</interface>
</hal>
<!--add by hhuiming for itr1502 service-->
<hal format="hidl">
<name>vendor.nexpresso.itr1502service</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>IItr1502Service</name>
<instance>default</instance>
</interface>
</hal>
5、android/hardware/interfaces/compatibility_matrices/compatibility_matrix.5.xml -->此处也可以省略
<!-- add by hhuiming for motor service -->
<hal format="hidl" optional="true">
<name>vendor.dxdragon.motorservice</name>
<version>1.0</version>
<interface>
<name>IMotorService</name>
<instance>default</instance>
</interface>
</hal>
<!-- add by hhuiming for sgm42609 service on 2021/01.08-->
<hal format="hidl" optional="true">
<name>vendor.nexpresso.sgm42609service</name>
<version>1.0</version>
<interface>
<name>ISgm42609Service</name>
<instance>default</instance>
</interface>
</hal>
<!-- add by hhuiming for itr1502 service on 2021/02/26-->
<hal format="hidl" optional="true">
<name>vendor.nexpresso.itr1502service</name>
<version>1.0</version>
<interface>
<name>IItr1502Service</name>
<instance>default</instance>
</interface>
</hal>
6、android/device/qcom/sepolicy
legacy/vendor/common/file_contexts | 5 ++++-
legacy/vendor/common/hal_sgm42609_service.te | 12 ++++++++++++
legacy/vendor/common/hwservice.te | 1 +
legacy/vendor/common/hwservice_contexts | 1 +
legacy/vendor/msm8937/platform_app.te | 2 ++
5 files changed, 20 insertions(+), 1 deletion(-)
create mode 100644 legacy/vendor/common/hal_sgm42609_service.te
diff --git a/legacy/vendor/common/file_contexts b/legacy/vendor/common/file_contexts
index 43db5f0..b9ae4f5 100644
--- a/legacy/vendor/common/file_contexts
+++ b/legacy/vendor/common/file_contexts
@@ -733,5 +733,8 @@
#wifilearner daemon
/(vendor|system/vendor)/bin/wifilearner u:object_r:wifilearnersvc_exec:s0
-#hhuiming add ntc temperature feature
+#hhuiming add moto temperature feature
/(vendor|system/vendor)/bin/hw/vendor\.dxdragon\.motorservice@1\.0-service u:object_r:hal_motor_service_exec:s0
+
+#hhuiming add sgm42609 temperature feature
+/(vendor|system/vendor)/bin/hw/vendor\.nexpresso\.sgm42609service@1\.0-service u:object_r:hal_sgm42609_service_exec:s0
diff --git a/legacy/vendor/common/hal_sgm42609_service.te b/legacy/vendor/common/hal_sgm42609_service.te
new file mode 100644
index 0000000..08f8af2
--- /dev/null
+++ b/legacy/vendor/common/hal_sgm42609_service.te
@@ -0,0 +1,12 @@
+type hal_sgm42609_service, domain;
+type hal_sgm42609_service_exec, exec_type, vendor_file_type, file_type;
+#hwbinder access
+init_daemon_domain(hal_sgm42609_service)
+hwbinder_use(hal_sgm42609_service)
+
+allow hal_sgm42609_service hwservicemanager_prop:file { read open getattr map};
+allow hal_sgm42609_service hal_sgm42609_hwservice:hwservice_manager { add };
+allow hal_sgm42609_service hal_sgm42609_hwservice:hwservice_manager { find };
+allow hal_sgm42609_service hidl_base_hwservice:hwservice_manager { add };
+allow hal_sgm42609_service hal_sgm42609_service:netlink_kobject_uevent_socket { create bind read setopt write getopt };
+allow hal_sgm42609_service sysfs_graphics:file rw_file_perms;
diff --git a/legacy/vendor/common/hwservice.te b/legacy/vendor/common/hwservice.te
index 38eedf3..00bacfd 100644
--- a/legacy/vendor/common/hwservice.te
+++ b/legacy/vendor/common/hwservice.te
@@ -68,3 +68,4 @@ type hal_perfcallback_hwservice, hwservice_manager_type, protected_hwservice;
type vendor_hal_dspmanager_hwservice, hwservice_manager_type;
#hhuiming add motor feature
type hal_motor_hwservice, hwservice_manager_type;
+type hal_sgm42609_hwservice, hwservice_manager_type;
diff --git a/legacy/vendor/common/hwservice_contexts b/legacy/vendor/common/hwservice_contexts
index 791217b..05a99b3 100644
--- a/legacy/vendor/common/hwservice_contexts
+++ b/legacy/vendor/common/hwservice_contexts
@@ -108,3 +108,4 @@ vendor.qti.hardware.perf::IPerfCallback u:object_r:hal_perf
vendor.qti.hardware.dsp::IDspService u:object_r:vendor_hal_dspmanager_hwservice:s0
#hhuiming add motor feature
vendor.dxdragon.motorservice::IMotorService u:object_r:hal_motor_hwservice:s0
+vendor.nexpresso.sgm42609service::ISgm42609Service u:object_r:hal_sgm42609_hwservice:s0
diff --git a/legacy/vendor/msm8937/platform_app.te b/legacy/vendor/msm8937/platform_app.te
index dd04128..7139af3 100755
--- a/legacy/vendor/msm8937/platform_app.te
+++ b/legacy/vendor/msm8937/platform_app.te
@@ -30,3 +30,5 @@ allow platform_app oemfs:lnk_file { read getattr };
allow platform_app hal_motor_hwservice:hwservice_manager { find };
allow platform_app hal_motor_service:binder { call transfer };
allow platform_app platform_app:netlink_kobject_uevent_socket { create bind read setopt getopt };
+allow platform_app hal_sgm42609_hwservice:hwservice_manager { find };
+allow platform_app hal_sgm42609_service:binder { call transfer };
--
2.7.4
7、modify底层节点所对应的object对象,便于增加Selinux权限
后续只需要对sysfs_graphics 类型进行读写,Set,Get操作
legacy/vendor/common/genfs_contexts | 5 +++++
legacy/vendor/common/hal_motor_service.te | 1 +
2 files changed, 6 insertions(+)
diff --git a/legacy/vendor/common/genfs_contexts b/legacy/vendor/common/genfs_contexts
index 5918b0d..281cec6 100755
--- a/legacy/vendor/common/genfs_contexts
+++ b/legacy/vendor/common/genfs_contexts
@@ -86,3 +86,8 @@ genfscon sysfs /devices/0306_02.01.00/time_us u:object_r:sysfs_mhi:s0
genfscon sysfs /devices/1101_00.01.00/time_us u:object_r:sysfs_mhi:s0
genfscon sysfs /devices/1101_01.01.00/time_us u:object_r:sysfs_mhi:s0
genfscon sysfs /devices/1101_02.01.00/time_us u:object_r:sysfs_mhi:s0
+
+#add by hhuiming on 2021.01.07
+genfscon sysfs /devices/virtual/mp6500/mp6500/mp6500_moto_dir u:object_r:sysfs_graphics:s0
+genfscon sysfs /devices/virtual/mp6500/mp6500/mp6500_moto_run u:object_r:sysfs_graphics:s0
+genfscon sysfs /devices/virtual/mp6500/mp6500/mp6500_moto_step u:object_r:sysfs_graphics:s0
diff --git a/legacy/vendor/common/hal_motor_service.te b/legacy/vendor/common/hal_motor_service.te
index 5183d20..84e1e42 100644
--- a/legacy/vendor/common/hal_motor_service.te
+++ b/legacy/vendor/common/hal_motor_service.te
@@ -9,3 +9,4 @@ allow hal_motor_service hal_motor_hwservice:hwservice_manager { add };
allow hal_motor_service hal_motor_hwservice:hwservice_manager { find };
allow hal_motor_service hidl_base_hwservice:hwservice_manager { add };
allow hal_motor_service hal_motor_service:netlink_kobject_uevent_socket { create bind read setopt write getopt };
+allow hal_motor_service sysfs_graphics:file rw_file_perms;
--
2.7.4
8、重点:增加对应的hal服务,然后通过hidl-gen工具自动
android/vendor/nexpress/interface/Android.bp
android/vendor/nexpress/interface/current.txt
android/vendor/nexpress/interface/itr1502service
android/vendor/nexpress/interface/read.me
android/vendor/nexpress/interface/sgm42609service
read.me, 根据规则,编写hal文件之后,自动生成对应的cpp和h文件。其中项目路径下的service.cpp,vendor.nexpresso.sgm42609service@1.0-service.rc Android.mk文件需要自行书写
Android目录后,再执行下面命令生成模块
hidl-gen -Landroidbp -r vendor.nexpresso:vendor/nexpresso/interfaces -r android.hidl:system/libhidl/transport vendor.nexpresso.sgm42609service@1.0
hidl-gen -L hash -r vendor.nexpresso.sgm42609service:vendor/nexpresso/interfaces/sgm42609service -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.nexpresso.sgm42609service@1.0 >> ./current.txt
hidl-gen -Landroidbp -r vendor.nexpresso:vendor/nexpresso/interfaces -r android.hidl:system/libhidl/transport vendor.nexpresso.itr1502service@1.0
hidl-gen -L hash -r vendor.nexpresso.itr1502service:vendor/nexpresso/interfaces/itr1502service -r android.hardware:hardware/interfaces -r android.hidl:system/libhidl/transport vendor.nexpresso.itr1502service@1.0 >> ./current.txt
android/vendor/nexpresso/interfaces/sgm42609service/1.0/default/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_LDLIBS += -llog
LOCAL_C_INCLUDES += \
hardware/libhardware/include \
LOCAL_SRC_FILES := \
service.cpp \
Sgm42609Service.cpp \
LOCAL_SHARED_LIBRARIES := \
libhidlbase \
libhidltransport \
libutils \
liblog \
vendor.nexpresso.sgm42609service@1.0 \
libcutils \
libdl
LOCAL_MODULE_TAGS := optional
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_MODULE := vendor.nexpresso.sgm42609service@1.0-service
LOCAL_INIT_RC := vendor.nexpresso.sgm42609service@1.0-service.rc
LOCAL_MODULE_CLASS := EXECUTABLES
LOCAL_CFLAGS += -Wall -Wextra -Werror -Wno-unused-parameter -Wmacro-redefined
include $(BUILD_EXECUTABLE)
android/vendor/nexpresso/interfaces/sgm42609service/1.0/default/service.cpp
/*
* Copyright 2020 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.
*/
#define LOG_TAG "vendor.nexpresso.sgm42609service@1.0-service"
#include "Sgm42609Service.h"
#include <vendor/nexpresso/sgm42609service/1.0/ISgm42609Service.h>
#include <hidl/LegacySupport.h>
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using vendor::nexpresso::sgm42609service::V1_0::ISgm42609Service;
using vendor::nexpresso::sgm42609service::V1_0::implementation::Sgm42609Service;
using android::hardware::defaultPassthroughServiceImplementation;
using android::sp;
int main(int /*arg */,char ** /*argc */) {
return defaultPassthroughServiceImplementation<ISgm42609Service>();
}
android/vendor/nexpresso/interfaces/sgm42609service/1.0/default/vendor.nexpresso.sgm42609service@1.0-service.rc
service sgm42609_service /vendor/bin/hw/vendor.nexpresso.sgm42609service@1.0-service
class hal
user root
group root system
vendor/nexpresso/interfaces/sgm42609service/read.me
当前目录,直接执行下面的文件在相应的文件下面生成相应的文件
1.0/default下面生成Android.bp文件
hidl-gen -o 1.0/default -Landroidbp-impl -rvendor.nexpresso:vendor/nexpresso/interfaces -randroid.hidl:system/libhidl/transport vendor.nexpresso.sgm42609service@1.0
1.0/default下面把相应的*.hal文件转化成.h .cpp文件
hidl-gen -o 1.0/default -Lc++-impl -rvendor.nexpresso:vendor/nexpresso/interfaces -randroid.hidl:system/libhidl/transport vendor.nexpresso.sgm42609service@1.0
vendor/nexpresso/interfaces/Android.bp
subdirs = ["*"]
hidl_package_root {
name: "vendor.nexpresso",
path: "vendor/nexpresso/interfaces",
}
如果感兴趣,可联系博主提供源代码