HIDL 原本是android9.0 以上版本都具有的特性,主要用于java 层和C/C++ 层功能的连接,简言之,一句话通过hwbinder 与 HAL 进行IPC 通信。 通过hidl-gen工具可以将框架搭建好,有效地将业务层,驱动层隔离开。下面以T9630为例,分享一下touch 模块HIDL 搭建。
一. 创建hal 文件
我们创建Itouch.hal, types.hal 放到指定目录
首先系统必须完整编译通过了确保hidl-gen 已经生成
PKG_ROOT=vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces
PACKAGE=vendor.mediatek.vstTouch@1.0
HIDL_GEN_OUT=$PKG_ROOT/vstTouch/1.0/default
IMPL_GEN_OUT=$PKG_ROOT/vstTouch/1.0/impl
PACKAGE 为hidl 服务的名称。
PKG_ROOT 为存放hidl 服务的目录。
HIDL_GEN_OUT 服务的实现目录。
IMPL_GEN_OUT为 hidl 服务依赖的厂商实现目录。
执行指令
hidl-gen -L androidbp -rvendor.mediatek:$PKG_ROOT -randroid.hidl:system/libhidl/transport $PACKAGE
可以生成vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/vstTouch/1.0/Android.bp 文件,如下:
执行指令
hidl-gen -o $HIDL_GEN_OUT -Lc++-impl -r vendor.mediatek:$PKG_ROOT -r android.hidl:system/libhidl/transport $PACKAGE
生成touch.cpp,touch.h
执行指令
hidl-gen -o $HIDL_GEN_OUT -L androidbp-impl -r vendor.mediatek:$PKG_ROOT -r android.hidl:system/libhidl/transport $PACKAGE
可以生成default/Android.bp
执行指令
hidl-gen -o $IMPL_GEN_OUT -L androidbp-impl -r vendor.mediatek:$PKG_ROOT -r android.hidl:system/libhidl/transport $PACKAGE
生成impl 目录及Androd.bp,如下:
手动创建service.cpp,rc 文件
vstTouch/1.0/Android.bp 文件如下:
// This file is autogenerated by hidl-gen -Landroidbp.
hidl_interface {
name: "vendor.mediatek.vstTouch@1.0",
root: "vendor.mediatek",
system_ext_specific: true,
srcs: [
"types.hal",
"Itouch.hal",
],
interfaces: [
"android.hidl.base@1.0",
],
gen_java: true,
}
subdirs = [
"default",
"impl",
]
说明几点:
该bp 指定输出vendor.mediatek.vstTouch@1.0
subdirs 添加需要遍历的子目录impl,default
root 必须是上hidl 服务所在的root 目录中有定义,如
vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/android.bp中定义的hidl_package_root 中有定义
hidl_package_root {
name: "vendor.mediatek",
path: "vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces",
}
subdirs = [
"wifi/supplicant/1.0",
"tv",
"wifidisplay/1.0",
"graphics",
"vstTouch" ,
]
其中vstTouch 为我们需要的工作目录,加上之后整编就可以编到该模块
vstTouch/1.0/default/Android.bp 文件
// FIXME: your file license if you have one
cc_binary {
name: "vendor.mediatek.vstTouch@1.0-service",
defaults: ["hidl_mstar"],
proprietary: true,
compile_multilib: "32",
relative_install_path: "hw",
srcs: [
"service.cpp",
"touch.cpp",
],
init_rc: [
"vendor.mediatek.vstTouch@1.0-service.rc"
],
shared_libs: [
"libhidlbase",
"libutils",
"liblog",
"vendor.mediatek.vstTouch@1.0",
"vendor.mediatek.vstTouch@1.0-impl",
"libcutils",
],
cppflags: [
],
}
输出hidl 服务的二进制文件vendor.mediatek.vstTouch@1.0-service 及rc 文件vendor.mediatek.vstTouch@1.0-service.rc
注意relative_install_path 为hw 时,文件会输出到/vendor/bin/hw/目录下,否则rc 文件中指定失败无法自启动,另外还依赖vendor.mediatek.vstTouch@1.0,vendor.mediatek.vstTouch@1.0-impl。
vstTouch/1.0/impl/Android.bp 如下:
cc_library_shared {
name: "vendor.mediatek.vstTouch@1.0-impl",
// relative_install_path: "hw",
proprietary: true,
srcs: [
"VstTpVendorFromFctImpl.cpp",
"VstTpVendorFromHuaXinImpl.cpp",
"VstTpVendorFromSongLiImpl.cpp",
"VstTpVendorFromYiLiImpl.cpp",
],
shared_libs: [
"libhidlbase",
"libutils",
"vendor.mediatek.vstTouch@1.0",
],
}
输出vendor.mediatek.vstTouch@1.0-impl的动态库srcs 指定个厂商的代码实现逻辑,此处relative_install_path 去掉这样库默认输出到/vendor/lib 下,否则vendor.mediatek.vstTouch@1.0-service 找不到改库也会启动失败。
vendor.mediatek.vstTouch@1.0-service.rc 文件如下:
service Vst_tp /vendor/bin/hw/vendor.mediatek.vstTouch@1.0-service
class hal
user system
group system
vstTouch 下面几个目录的依赖关系如下:
单编可以生成对应库和依赖文件
croot
mmm vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/vstTouch/1.0/
五. 安装
主要是修改mk ,xml 文件
vendor/mediatek/common-tv/common.mk 添加
PRODUCT_PACKAGES += \
vendor.mediatek.vstTouch@1.0 \
vendor.mediatek.vstTouch@1.0-service \
vendor.mediatek.vstTouch@1.0-impl \
device/mediatek/m7332/common/configs/manifest.xml 添加:
<hal format="hidl">
<name>vendor.mediatek.vstTouch</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface>
<name>Itouch</name>
<instance>default</instance>
</interface>
</hal>
另外一个vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/current.txt添加hash code
1c0383b25e0ba623f7216243477f00636c2225afe892f1dc11dee77ee5ddf1d6 vendor.mediatek.vstTouch@1.0::types
89e611490954b2b7097d6e25ad1719266e20903a18a5a7f8aff34978d349484e vendor.mediatek.vstTouch@1.0::Itouch
通过指令
hidl-gen -L hash -r vendor.mediatek:$PKG_ROOT -randroid.hidl:system/libhidl/transport $PACKAGE >> $PKG_ROOT/current.txt
添加。
六. 权限设置在vendor/mediatek/proprietary_tv/open/system/sepolicy 目录下
新增文件hal_vstTouch.te
binder_call(hal_vstTouch_client, hal_vstTouch_server)
binder_call(hal_vstTouch_server, hal_vstTouch_client)
add_hwservice(hal_vstTouch_server, hal_vstTouch_hwservice)
allow hal_vstTouch_client hal_vstTouch_hwservice:hwservice_manager find;
新增文件hal_vstTouch_default.te
type hal_vstTouch_default, domain;
hal_server_domain(hal_vstTouch_default, hal_vstTouch)
type hal_vstTouch_default_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(hal_vstTouch_default)
vndbinder_use(hal_vstTouch_default)
set_prop(hal_vstTouch_default, mtk_core_property_type)
allow hal_vstTouch_default AIPQService:binder call;
allow hal_vstTouch_default hal_allocator:fd { use };
allow hal_vstTouch_default hal_allocator_server:fd { use };
allow hal_vstTouch_default hal_allocator:binder { call };
allow hal_vstTouch_default hal_allocator_server:binder { call };
allow hal_vstTouch_default hidl_memory_hwservice:hwservice_manager { find };
allow hal_vstTouch_default mstar_system_vndservice:service_manager { add find };
allow hal_vstTouch_default self:binder { transfer call };
attributes文件添加如下内容:
attribute hal_vstTouch;
attribute hal_vstTouch_client;
attribute hal_vstTouch_server;
platform_app.te 新增内容:
hal_client_domain(platform_app, hal_vstTouch);
system_app.te新增内容:
hal_client_domain(system_app, hal_vstTouch);
file_contexts 新增内容:
/vendor/bin/hw/vendor\.mediatek\.vstTouch@1\.0-service u:object_r:hal_vstTouch_default_exec:s0
hwservice.te 新增内容:
type hal_vstTouch_hwservice, hwservice_manager_type;
priv_app.te 新增内容:
hal_client_domain(priv_app, hal_vstTouch);
hwservice_contexts 新增内容:
# hal vstTouch
vendor.mediatek.vstTouch::Itouch u:object_r:hal_vstTouch_hwservice:s0
然后全编,升级后可以看到
七. APP 调用
Androd.mk 中添加
LOCAL_STATIC_JAVA_LIBRARIES += \
vendor.mediatek.vstTouch-V1.0-java
test.java 中
import vendor.mediatek.vstTouch.V1_0.Itouch;
public void test(){
Itouch touch = Itouch.getService();
touch.setTheLimitedRect(0,0,3840,2160);
}
归纳一下修改的文件:
.
├── device
│ └── mediatek
│ └── m7332
│ └── common
│ └── configs
│ └── manifest.xml
└── vendor
└── mediatek
├── common-tv
│ └── common.mk
└── proprietary_tv
└── open
├── hardware
│ └── mtk_interfaces
│ ├── Android.bp
│ ├── current.txt
│ └── vstTouch
│ └── 1.0
│ ├── Android.bp
│ ├── default
│ │ ├── Android.bp
│ │ ├── service.cpp
│ │ ├── touch.cpp
│ │ ├── touch.h
│ │ └── vendor.mediatek.vstTouch@1.0-service.rc
│ ├── impl
│ │ ├── Android.bp
│ │ ├── VstTpVendorBase.cpp
│ │ ├── VstTpVendorBase.h
│ │ ├── VstTpVendorFromFctImpl.cpp
│ │ ├── VstTpVendorFromFctImpl.h
│ │ ├── VstTpVendorFromHuaXinImpl.cpp
│ │ ├── VstTpVendorFromHuaXinImpl.h
│ │ ├── VstTpVendorFromSongLiImpl.cpp
│ │ ├── VstTpVendorFromSongLiImpl.h
│ │ ├── VstTpVendorFromYiLiImpl.cpp
│ │ └── VstTpVendorFromYiLiImpl.h
│ ├── Itouch.hal
│ └── types.hal
└── system
└── sepolicy
├── attributes
├── file_contexts
├── hal_vstTouch_default.te
├── hal_vstTouch.te
├── hwservice_contexts
├── hwservice.te
├── platform_app.te
├── priv_app.te
└── system_app.te
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)