根据上一篇Android11(RK3568)自定义服务制作(2)-Service制作 完成了系统service的注册后,进一步就要完成Hardware层的制作,完成自定义service跟kernel驱动的调用。

通过Service调用Kernel驱动的最简单方法就是用JNI。

首先在hardware/libhardware/modules/下创建hello文件夹,并在hello文件夹中添加hello.c文件

#define LOG_TAG "HelloStub"#include <hardware/hardware.h>
#include <hardware/hello.h>
// #include <fcntl.h>
#include <errno.h>
#include <cutils/log.h>
#include <cutils/atomic.h>#include <malloc.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>#define DEVICE_NAME "/dev/hello"
#define MODULE_NAME "Hello"
#define MODULE_AUTHOR "sommer_jiang@163.com"/*设备打开和关闭接口*/
static int hello_device_open(const struct hw_module_t *module, const char *name, struct hw_device_t **device);
static int hello_device_close(struct hw_device_t *device);/*设备访问接口*/
static int hello_set_val(struct hello_device_t *dev, int val);
static int hello_get_val(struct hello_device_t *dev, int *val);static int hello_device_open(const struct hw_module_t *module, const char *name, struct hw_device_t **device)
{struct hello_device_t *dev;dev = (struct hello_device_t *)malloc(sizeof(struct hello_device_t));if (!dev){ALOGE("Hello Stub: failed to alloc space");return -EFAULT;}memset(dev, 0, sizeof(struct hello_device_t));dev->common.tag = HARDWARE_DEVICE_TAG;dev->common.version = 0;dev->common.module = (hw_module_t *)module;dev->common.close = hello_device_close;dev->set_val = hello_set_val;dev->get_val = hello_get_val;if ((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1){ALOGE("Hello Stub: failed to open /dev/hello -- %s.", strerror(errno));free(dev);return -EFAULT;}*device = &(dev->common);ALOGI("Hello Stub: open /dev/hello successfully.");ALOGI("Hello Stub: name -- %s.", name);return 0;
}static int hello_device_close(struct hw_device_t *device)
{struct hello_device_t *hello_device = (struct hello_device_t *)device;if (hello_device){close(hello_device->fd);free(hello_device);}return 0;
}static int hello_set_val(struct hello_device_t *dev, int val)
{ALOGI("Hello Stub: set value %d to device.", val);write(dev->fd, &val, sizeof(val));return 0;
}static int hello_get_val(struct hello_device_t *dev, int *val)
{if (!val){ALOGE("Hello Stub: error val pointer");return -EFAULT;}read(dev->fd, val, sizeof(*val));ALOGI("Hello Stub: get value %d from device", *val);return 0;
}/*模块方法表*/
static struct hw_module_methods_t hello_module_methods = {.open = hello_device_open};/*模块实例变量*/
struct hello_module_t HAL_MODULE_INFO_SYM = {.common = {.tag = HARDWARE_MODULE_TAG,.version_major = 1,.version_minor = 0,.id = HELLO_HARDWARE_MODULE_ID,.name = MODULE_NAME,.author = MODULE_AUTHOR,.methods = &hello_module_methods,}};

并在相同的目录写下Android.bp,内容如下:

// Copyright (C) 2013 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.cc_library_shared {name: "hello.default",relative_install_path: "hw",proprietary: true,srcs: ["hello.c"],cflags: ["-Wall", "-Werror"],header_libs: ["libhardware_headers"],shared_libs: ["liblog"],
}

接下来在hardware/libhardware/include/hardware/中添加供引用的hello.h文件

#ifndef ANDROID_HELLO_INTERFACE_H  #define ANDROID_HELLO_INTERFACE_H  #include <hardware/hardware.h>  __BEGIN_DECLS  /*定义模块ID*/  #define HELLO_HARDWARE_MODULE_ID "hello"  /*硬件模块结构体*/  struct hello_module_t {  struct hw_module_t common;  };  /*硬件接口结构体*/  struct hello_device_t {  struct hw_device_t common;  int fd;  int (*set_val)(struct hello_device_t* dev, int val);  int (*get_val)(struct hello_device_t* dev, int* val);  };  __END_DECLS  #endif

这几个完成后别忘了在/hardware/libhardware/Android.mk中添加以下硬件模块

hardware_modules := \hello

添加完这些后,可以采用mmm编译整个libhardware来把硬件驱动层完成。

完成了硬件驱动层后,最艰难痛苦的一步来了,就是selinux的填写。其实按照规律也不是很难填写。

/device/rockchip/common/sepolicy/vendor/device.te添加以下设备

#sommerjiang 20211101 add
type hello_device, dev_type;

/device/rockchip/common/sepolicy/vendor/domain.te添加以下代码

#sommerjiang 20211101 add
allow domain hello_device:chr_file rw_file_perms;

/device/rockchip/common/sepolicy/vendor/file_contexts添加以下代码

//sommer.jiang,20211115,add for /dev/hello
/dev/hello         u:object_r:hello_device:s0

/device/rockchip/common/sepolicy/private/service_contexts添加以下代码

hello                                          u:object_r:hello_service:s0

/device/rockchip/common/sepolicy/vendor/service.te添加以下代码

type hello_service,                 system_api_service, system_server_service, service_manager_type;

/device/rockchip/common/sepolicy/vendor/system_app.te添加以下代码

#sommerjiang 20211101 add
allow system_app hello_service:service_manager find;

/device/rockchip/common/sepolicy/vendor/system_server.te添加以下代码

#sommerjiang 20211101 add
allow system_server hello_device:chr_file rw_file_perms;
allow system_server hello_service:service_manager {add };

device/rockchip/common/sepolicy/vendor/untrusted_app.te添加以下代码

#sommer.jiang add
allow untrusted_app hello_service:service_manager find;

至此,所有的中间层都完成了。

Android11(RK3568)自定义服务制作(3)-Hardware制作和权限管理相关推荐

  1. SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_44102992/article/ details/107335702 前言 提到权限管理这块肯定很多人第一想到的 ...

  2. SVN服务端客户端安装配置及权限管理

    SVN服务端安装配置: 1. 下载SVN服务端: 下载地址:https://www.visualsvn.com/downloads/ 2. 安装SVN服务端: 打开程序:安装目录\bin\msc程序 ...

  3. Android11(RK3568)自定义服务制作(2)-Service制作

    上一篇介绍了如何在android中制作kernel驱动,并在驱动中留下了dev和sys两种接口供应用程序调用. Android11(RK3568)自定义服务制作(1)-Kernel驱动 一,驱动测试 ...

  4. 第一节 安卓自定义轮播图的制作

    专栏目录 第一节 自定义轮播图的制作 第二节 底部导航栏菜单,炫酷菜单动画,背景变暗.按钮焦点获取 第三节 适配Android10的拍照.从相册获取代码,包括完整的权限申请和图片地址获取 第四节 百度 ...

  5. 学生老师的家教服务平台小程序制作

    学生老师的家教服务平台小程序制作 本文项目是一款连接学生和老师的家教服务平台小程序,主要是为求教家庭提供有效的平台途径,同时也帮助在校大学生以及在职教师找到更多的教学机会,是一款连接学生.家长和老师的 ...

  6. hbuilder制作简单网页_企业信息化网站+营销服务之电子商务网站制作流程

    爱美食爱技术 网站制作流程,是指网站制作过程中必须遵循的工作顺序.每个成品网站都必须按标准流程进行建设.这类似于企业的产品生产线,一个工序一个工序地完成整个产品加工.很多人把网站制作与网页制作混为一谈 ...

  7. Ambari自定义服务

    在学习Ambari的路上,欢迎提出问题并相互交流,共同成长 基础思路框架 一.Pulsar服务部署 ZooKeeper 集群(3 个 ZooKeeper 节点组成) Broker 集群(3 个 Pul ...

  8. PageAdmin CMS网站制作教程:如何创建及管理栏目?

    PageAdmin CMS网站制作教程: 1.登录管理后台后,在顶部导航中找到网站,并点击: 2.在左侧栏目中找到栏目管理,并点击: 3.进入到栏目管理页面,在顶部找到菜单,点击添加. 4.进入到栏目 ...

  9. 制作报价单,制作价目表的软件和app

    报价单制作,制作价目表,主要为商户与个人提供方便快速的电子价目表制作与展示,商户可以通过价目二维码扫一扫为客户提供方便信息浏览.并且提供用户个性化价目表制作定制服务.我们有丰富的价目模版,提供价目表制 ...

  10. html如何制作一个漂亮的表格?+ 列表制作 + 表单制作(干货!直接收代码)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 html如何 ...

最新文章

  1. CNS接连发文背书,原来生姜这么神奇
  2. LeetCode 1119. Remove Vowels from a String--C++,Java,Python解法
  3. EWORD 0511
  4. Android NFC开发实战详解
  5. 用Shell脚本在推出的RAC节点上批量部署32个Oracle11gR2 RAC备份恢复案例场景的方法PART2...
  6. const修饰指针和引用的用法【转贴】
  7. 计算机基础知识ip地址,计算机基础知识练习题
  8. paip.目录文件列表排序算法
  9. mysql与_mysql常见的运算符及使用
  10. 人体姿态估计的基本概念
  11. 大华NVR接入海康摄像机的设置
  12. IIC原理超详细讲解---值得一看
  13. 从 C10K 到 DPDK
  14. 苹果手机投屏到Windows
  15. 深大uooc大学生心理健康章节答案第二章
  16. https请求百度share分享报错问题
  17. 史上最全——QQ秘籍之全攻略
  18. OkHttp3使用详解
  19. postgis版本升级
  20. Xd等设计可用的相关资源整理

热门文章

  1. 数字图像处理MFC程序设计之灰度图像的线性变换
  2. 深度学习之学习(1-1) VGG16网络结构详解
  3. 数据结构(郝斌老师)
  4. openmv自然光下寻找激光点
  5. 对jeecg框架的认识
  6. 计算机屏幕截图如何保存,怎么在屏幕截图
  7. FFmpeg推流以后自动结束的方法
  8. 在Eclipse中如何快速的计算代码量
  9. 22考研清华电子系957,390+高分上岸初复试经验分享
  10. 使用DragonBones开发FLASH骨骼动画入门教程