尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块

尝试给OpenHarmony4.0增加可以在动态库中使用的日志模块

  • 前言
  • 一、资源来源
  • 二、实践步骤
    • 1.修改OH内核并编译
    • 2.动态库增加welog打印
    • 3.设备验证
    • 打完收工
  • 总结
  • 参考


前言

最近在搞OpenHarmony4.0蓝牙模块的适配,最主要的工作就是在libbt_vendor.z.so这个库的编写修改,该库上承HDF驱动,下接内核驱动。
目前卡在了该库中对蓝牙设备进行相关操作的接口,需要增加日志打印进行调试。但OpenHarmony的hilog貌似在动态库中加的日志并不能通过hilog命令在串口或者HDC中进行打印,所以想再加一套单独的日志打印途径。


一、资源来源

OpenHarmony单模块welog打印机制
打算使用该内容进行测试使用。
https://gitee.com/itopen/module_code/tree/master
验证后发现基本按README.md的使用指导进行即可,但有些小细节需要自己摸索。

二、实践步骤

1.修改OH内核并编译

将gitee资源对应目录C/welog/driver的welog文件夹直接放到OH版本的内核驱动目录下,本文使用的是RISCV架构的OH4.0-RVBOOK版本,对应的目录为:

kernel/linux/rvbook-kernel/drivers/

其他版本的内核驱动目录比如:

kernel/linux/linux-5.10/drivers/

然后对该目录下的Kconfig和Makefile进行修改,因为有顺序影响,为了避免麻烦,所以建议将新增的内容直接放到对应文件的靠后位置。
Kconfig文件新增此行:

source "drivers/welog/Kconfig"

Makefile文件新增此行

obj-y               += welog/

修改保存后,删除OH版本out目录下的kernel和对应产品生成的images目录下的内核镜像,使用下面命令进行内核编译(有些产品不需要加“–no-prebuilt-sdk”选项):

./build.sh --product-name rvbook --ccache --no-prebuilt-sdk -T build_kernel

2.动态库增加welog打印

将gitee上include目录下的welog.h放到能被libbt_vendor调用到的对应目录(查看BUILD.gn即可),在需要加入之的.c文件中进行#include引用。修改该.c文件,比如op()代码增加welog打印。
根据welog.h的内容,发现此日志模块支持welog_err、welog_info、welog_debug三种模式,使用这些直接代替标准化格式输出的printf即可。
比如:

static int op(bt_opcode_t opcode, void *param)
{welog_err("bluetooth op start!! %d", opcode);int retval = 0;switch (opcode) {case BT_OP_POWER_ON: // Power on the BT Controller.if (rtkbt_transtype & RTKBT_TRANS_UART) {upio_set_bluetooth_power(UPIO_BT_POWER_OFF);usleep(20000L);welog_err("set power off and delay 200ms");upio_set_bluetooth_power(UPIO_BT_POWER_ON);welog_err("set power on and delay 00ms");}break;case BT_OP_POWER_OFF: // Power off the BT Controller.if (rtkbt_transtype & RTKBT_TRANS_UART) {upio_set_bluetooth_power(UPIO_BT_POWER_OFF);usleep(20000L);welog_err("set power off and delay 200ms");}break;// Establish hci channels. it will be called after BT_OP_POWER_ON.case BT_OP_HCI_CHANNEL_OPEN: {welog_err("bluetooth open channel");if ((rtkbt_transtype & RTKBT_TRANS_UART) && (rtkbt_transtype & RTKBT_TRANS_H5)) {welog_err("bluetooth trans h5");int fd, idx;int(*fd_array)[] = (int(*)[])param;if (userial_vendor_open((tUSERIAL_CFG *)&userial_H5_cfg) != -1) {retval = 1;}fd = userial_socket_open();if (fd != -1) {for (idx = 0; idx < HCI_MAX_CHANNEL; idx++) {(*fd_array)[idx] = fd;}} else {retval = 0;}} else if ((rtkbt_transtype & RTKBT_TRANS_UART) && (rtkbt_transtype & RTKBT_TRANS_H4)) {welog_err("bluetooth trans h4");/* retval contains numbers of open fd of HCI channels */int(*fd_array)[] = (int(*)[])param;int fd, idx;if (userial_vendor_open((tUSERIAL_CFG *)&userial_H4_cfg) != -1) {retval = 1;}fd = userial_socket_open();if (fd != -1) {for (idx = 0; idx < HCI_MAX_CHANNEL; idx++) {(*fd_array)[idx] = fd;}} else {retval = 0;}/* retval contains numbers of open fd of HCI channels */} else {welog_err("bluetooth USB op for %d", opcode);int fd, idx = 0;int(*fd_array)[] = (int(*)[])param;for (idx = 0; idx < 10L; idx++) {if (userial_vendor_usb_open() != -1) {retval = 1;break;}}fd = userial_socket_open();if (fd != -1) {for (idx = 0; idx < HCI_MAX_CHANNEL; idx++) {(*fd_array)[idx] = fd;}} else {retval = 0;}}}break;// Close all the hci channels which is opened.case BT_OP_HCI_CHANNEL_CLOSE: {userial_vendor_close();}break;// initialization the BT Controller. it will be called after// BT_OP_HCI_CHANNEL_OPEN. Controller Must call init_cb to notify the host// once it has been done.case BT_OP_INIT: {welog_err("bluetooth start BT_OP_INIT");if (rtkbt_transtype & RTKBT_TRANS_UART) {welog_err("rtkbt_transtype & RTKBT_TRANS_UART hw_config_start");hw_config_start(rtkbt_transtype);} else {welog_err("BT_OP_INIT else");int usb_info = 0;retval = userial_vendor_usb_ioctl(GET_USB_INFO, &usb_info);if (retval == -1) {welog_err("bluetooth get usb info fail");return retval;} else {welog_err("bluetooth hw_usb_config_start");hw_usb_config_start(RTKBT_TRANS_H4, usb_info);}}RTK_btservice_init();}break;// Get the LPM idle timeout in milliseconds.case BT_OP_GET_LPM_TIMER: {}break;// Enable LPM mode on BT Controller.case BT_OP_LPM_ENABLE: {}break;// Disable LPM mode on BT Controller.case BT_OP_LPM_DISABLE: {}break;// Wakeup lock the BTC.case BT_OP_WAKEUP_LOCK: {}break;// Wakeup unlock the BTC.case BT_OP_WAKEUP_UNLOCK: {}break;// transmit event response to vendor lib.case BT_OP_EVENT_CALLBACK: {hw_process_event((HC_BT_HDR *)param);}break;}welog_err("bluetooth op return result:%d", retval);return retval;
}

编译对应目标或者直接正版本增量编译,使打印生效。

./build.sh --product-name rvbook --ccache --no-prebuilt-sdk

3.设备验证

编译完成后进行全镜像烧录。
设备启动后,通过串口或者HDC查看设备/dev目录下设备
在这里插入图片描述
此处还需要通过chomd修改welog驱动权限,否则日志功能不可用。

chmod -R 777 /dev/welog

阅读新增的日志驱动代码,可以发现新的模块日志将会被保存在/data/log/welog/welog.log中
之后在确保新增日志的接口被调用后,发现该目录并没有日志文件生成。此处应该是日志模块代码的一个小bug,代码并没有生成不存在的子目录
因此需要手动

mkdir /data/log/welog/
chmod -R 777 /data/log/welog/

又因为该OH内核不支持vim等命令创建新文件,因此使用HDC将welog.log放到该目录下

./hdc file send welog.log /data/log/welog/

然后运行相关模块的代码,使用命令

tail -f /data/log/welog/welog.log

监测日志变化即可。
在这里插入图片描述

./hdc shell mount -oremount,rw /
./hdc shell mount -oremount,rw /vendor
./hdc shell mkdir /data/log/welog/
./hdc file send …/images/welog.log /data/log/welog/
./hdc shell chmod -R 777 /data/log/welog/

打完收工

总结

需要知道HDC用法,linux内核的一些基本知识,OH的修改、编译、烧录、运行。

参考

https://blog.csdn.net/weixin_42135087/article/details/139903669

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/410371.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS 使用 Amazon EC2 控制台安装和配置 CloudWatch 代理以添加其他指标如内存

默认情况下&#xff0c;Amazon CloudWatch 提供基本指标&#xff08;例如 CPUUtilization 和 NetworkIn&#xff09;用于监控 Amazon EC2 实例。要收集其他指标&#xff0c;您可以在 EC2 实例上安装 CloudWatch 代理&#xff0c;然后将该代理配置为发出所选指标。您可以使用 Am…

网络安全售前入门04——审计类产品了解

目录 1.前言 2.数据库审计介绍 2.1产品架构功能 2.2应用场景 2.3部署形式 2.4产品价值 2.5选型依据 1.前言 为方便初接触网络安全售前工作的小伙伴了解网安行业情况,我制作一系统售前入门(安全产品,安全服务,法律法规等)文章介绍,希望能给初进网安职场的小伙伴提供…

【Qt】Qt系统 | Qt事件 | 定时器

文章目录 定时器QTimerEventQTimer获取系统日期及时间 定时器 Qt 中在进行窗口程序的处理过程中&#xff0c;经常要周期性的执行某些动作&#xff0c;或者制作一些动画效果&#xff0c;使用定时器可以实现这些需求。 定时器&#xff0c;会在间隔一定时间后&#xff0c;执行某一…

Git下载安装配置

Git的下载与安装 Git是一种分布式版本控制系统&#xff0c;用于跟踪文件和文件夹的变化。它最初由Linus Torvalds开发&#xff0c;用于管理Linux内核的源代码。Git的设计目标是&#xff1a;速度快、开发效率高、数据完整性和可靠性强。 Git通过创建一个存储库&#xff08;rep…

【FESCO福利专区-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

什么领域/方向的产品经理既有发展前景又能做的长久

前几天我在知乎上回答了一道“目前什么领域的产品经理比较有发展前景&#xff1f;有推荐的课程吗&#xff1f;”的问题&#xff0c;讲得还比较实在&#xff0c;于是在这里也顺便分享一下。 TOP1.商业产品经理 之所以这个方向能排在第1&#xff0c;我认为有3点理由。 第1点&a…

国产游戏技术能否引领全球?

国产游戏技术&#xff1a;引领全球还是任重道远&#xff1f; 近年来&#xff0c;伴随着中国科技和经济的迅猛发展&#xff0c;国产游戏行业也呈现出蓬勃发展的态势。从《原神》到《黎明杀机手机版》&#xff0c;多款国产游戏在国际市场上崭露头角。而国产游戏在画面渲染、物理…

基于layui实现简单的万智牌生命计数器页面

对照手机App“旅法师营地”的万智牌生命计数器窗口&#xff08;如下图所示&#xff09;&#xff0c;使用layui、jQuery等实现简单的万智牌生命计数器页面。   主要实现的功能如下&#xff1a;   1&#xff09;点击左右两侧的-1、1、-5、5区域更新左右两侧生命值&#xff1…

短视频SDK解决方案,代码逻辑结构清晰,接入便捷

美摄科技凭借其在多媒体处理领域的深厚积累&#xff0c;推出了高效、易用的短视频SDK解决方案&#xff0c;为开发者及内容创作者提供了一站式的短视频创作与编辑工具&#xff0c;让每一份灵感都能轻松转化为引人入胜的视觉盛宴。 一、技术领先&#xff0c;打造极致体验 美摄科…

DNS详解

DNS详解 DNS 是一个域名系统&#xff0c;它主要用于将人类容易记忆的域名转换成ip地址。 默认情况下&#xff0c;设备会自动从网络供应商获取DNS服务器地址&#xff0c;并使用DNS服务器对域名进行解析。 此外&#xff0c;你也可以手动设置DNS服务器&#xff0c;具体操作系统…

反射机制简单基础

前序 在我们没有学习框架之前我们都是通给new来创建对象&#xff0c;如&#xff1a;创建一个我们已知的对象 Car carnew Car(); 调用类中的成员变量和成员方法都是对象直接调用。 在学习了mybatis框架后&#xff0c;我们了解到可以通过类名&#xff0c;能动态得到类中定义的…

基于x86 平台opencv的图像采集和seetaface6的静默活体功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的静默活体功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的静默活体模块从而实现…

量化四大邪术之一:般若波罗蜜

网络相传亚洲有四大邪术&#xff0c;日本化妆&#xff0c;韩国整容&#xff0c;泰国变X&#xff0c;Z国PS。 这些都是让人在颜值上看起来很美&#xff0c;类似地&#xff0c;在量化交易领域&#xff0c;也有四大邪术能让净值曲线看起来很美&#xff0c;今儿个来说量化四大邪术当…

一文弄懂MySQL中的锁

MySQL中的锁概述 MySQL中的锁机制是数据库管理系统用于控制并发操作的一种手段&#xff0c;主要用于保证数据的一致性和完整性。当多个事务同时操作同一数据时&#xff0c;锁机制可以防止数据冲突和确保事务的隔离性。 在MySQL中&#xff0c;锁可以分为三大类&#xff1a;全局…

前端自动导入依赖

前言 开发中通常会有很多导入语句&#xff0c;如何确保一些通用的api和hook无需每次手动导入即可使用。 <script setup lang"ts"> import { ref, reactive } from "vue" import { useRoute, useRouter } from "vue-router" import { log…

在多云生态下,如何实现跨云的自动化身份管理?

在多云环境下实现跨云的自动化身份管理是一个重要的课题&#xff0c;因为这可以帮助企业确保用户和应用程序能够在不同云服务提供商之间无缝地访问资源&#xff0c;同时保持高度的安全性和合规性。以下是一些关键技术和实践方法&#xff0c;用于实现跨云环境下的自动化身份管理…

Go学习笔记(一)语法

标准库文档&#xff1a;Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国 B站课程&#xff1a;8小时转职Golang工程师(如果你想低成本学习Go语言) 课程作者语雀&#xff08;首页有更多内容&#xff09;&#xff1a;8小时转职Golang工程师 语雀 代码仓…

关于武汉芯景科技有限公司的多协议收发芯片XJ526(第二篇RS422模式)开发指南(兼容SP526)

一、设置芯片为RS422模式 SP526 包含高度集成的串行收发器。SP526 提供 RS-232 &#xff08;V.28&#xff09;、RS-423 &#xff08;V.10&#xff09;、RS-422 &#xff08;V.11&#xff09; 和 RS-485 的硬件接口模式。接口模式选择通过两个控制引脚D0、D1完成。 我们将D0接…

『功能项目』摄像机跟随角色【07】

我们打开上一篇06新输入系统项目&#xff0c; 本章要做的事情是摄像机跟随主角移动&#xff0c; 给主角增加一个Player标签方便主摄像机查找主角对象 在编辑场景调好角度&#xff0c;选择Main Camera对象按键盘Ctrl Shift F使运行场景与编辑场景相同 新建CameraCtrl脚本代码 …

玄机又成国漫首创!IP与AI融合,凭实力火出圈

现在国漫越来越卷了&#xff0c;不仅卷制作质量&#xff0c;还卷各种花式联动。最近玄机科技和百度文库联合举办的AI漫画大赛圆满结束&#xff0c;这还是国内的IP第一次和AI技术融合&#xff0c;而且产出了不少好作品。下面就一起来看看吧&#xff01; 提到玄机科技&#xff0c…