完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
根据上一篇Android11(RK3568)自定义服务制作(2)-Service制作 完成了系统服务的注册后,进一步完成硬件层的制作,完成自定义服务跟内核驱动的调用。
通过Service调用内核的最简单的方法是添加JNI。 首先在hardware/libhardware/modules/下创建hello文件夹,然后驱动在hello文件夹中hello.c文件 #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 ”你好“ #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); 静态 int hello_device_close(struct hw_device_t *device); /*设备访问接口*/ static int hello_set_val(struct hello_device_t *dev, int val); 静态 int hello_get_val(struct hello_device_t *dev, int *val); 静态 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: 分配空间失败“); 返回-EFAULT; } memset(dev, 0, sizeof(struct hello_device_t)); dev-》common.tag = HARDWARE_DEVICE_TAG; 开发-》common.version = 0; dev-》common.module = (hw_module_t *)module; dev-》common.close = hello_device_close; 开发-》set_val = hello_set_val; 开发-》get_val = hello_get_val; if ((dev-》fd = open(DEVICE_NAME, O_RDWR)) == -1) { ALOGE(”Hello Stub: 未能打开 /dev/hello -- %s.“, strerror(errno)); 免费(开发); 返回-EFAULT; } *device = &(dev-》common); ALOGI(”Hello Stub: 打开 /dev/hello 成功。“); ALOGI(”Hello Stub: 名字 -- %s. 返回0; } 静态 int hello_device_close(struct hw_device_t *device) { struct hello_device_t *hello_device = (struct hello_device_t *)device; 如果(hello_device) { 关闭(hello_device-》fd); 免费(你好设备); } 返回 0; } static int hello_set_val(struct hello_device_t *dev, int val) { ALOGI(“Hello Stub: set value %d to device.”, val); 写(dev-》fd,&val,sizeof(val)); 返回0; } static int hello_get_val(struct hello_device_t *dev, int *val) { if (!val) { ALOGE(“Hello Stub: error val pointer”); 返回-EFAULT; } 读取(dev-》fd,val,sizeof(*val)); ALOGI(“Hello Stub: 从设备获取值 %d”, *val); 返回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,内容如下: // 版权所有 (C) 2013 Android 开源项目 // // 根据 Apache 许可证 2.0 版(“许可证”)获得许可; // 除非遵守许可证,否则您不得使用此文件。 // 您可以在 // // http://www.apache.org/licenses/LICENSE-2.0 // // 除非适用法律要求或书面同意,否则软件 // 分发于许可证按“原样”分发, // 不提供任何明示或暗示的保证或条件。 // 请参阅许可证以了解特定语言的管理权限和 // 许可证下的限制。 cc_library_shared { 名称:“hello.default”, relative_install_path:“hw”, 专有: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; }; 结构 hw_device_t 通用; 诠释 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.mk中添加下面的硬件模块 hardware_modules := hello 这些之后,可以采用编译完成后把libhardware来把硬件驱动完成。 完成了硬件刷新层后,最苦恼的一步来了,就是linux的。按照规律也不是最坏的。/device/rockchip/common/sepolicy/vendor/device. 添加以下设备 #sommerjiang20211101 add type hello_device , 开发类型; /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 允许 system_server hello_device:chr_file rw_file_perms; 允许 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; 至此,所有的中间层都完成了。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1924 浏览 1 评论
synopsys 的design ware:DW_fpv_div,浮点数除法器,默认32位下,想提升覆盖率(TMAX),如果用功能case去提升覆盖率呢?
2406 浏览 1 评论
RK3588 GStreamer调试四路鱼眼摄像头四宫格显示报错
5193 浏览 1 评论
【飞凌嵌入式OK3576-C开发板体验】RKNN神经网络-YOLO图像识别
254 浏览 0 评论
【飞凌嵌入式OK3576-C开发板体验】SSH远程登录网络配置及CAN通讯
1336 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:00 , Processed in 0.499537 second(s), Total 72, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号