Android Q 添加Hal 电机服务

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,[email protected]  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 "[email protected]"

#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/[email protected]

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",
}

如果感兴趣,可联系博主提供源代码

猜你喜欢

转载自blog.csdn.net/weixin_45080805/article/details/120764511
今日推荐