Android Q adds Hal motor service

Android Q adds Hal motor service

  • At the beginning of this year, it received a foreign intelligent infusion project. This project requires the upper layer to send instructions to control the motor. In order to follow the overall development architecture of Android, this film will describe how to create a hal service to open/operate the device

Taking Sgm42509 as an example, the similar
files and modifications of other modules are as follows:
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 --> can also be omitted here

    <!-- 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 the object object corresponding to the underlying node, which is convenient for increasing Selinux permissions

Subsequent only need to read and write sysfs_graphics type, Set, Get operation

 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. Key point: Add the corresponding hal service, and then automatically use the hidl-gen tool
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",
}

If you are interested, you can contact the blogger to provide the source code

Guess you like

Origin blog.csdn.net/weixin_45080805/article/details/120764511