openharmony上有一个重要的调试工具HDC,作为移植上的一点现进行一点适配记录。我们设备端主要运行的代码路径为developtools/hdc_standard/src/daemon,为啥是这个目录见下图,官方给的说明。

所以能很轻松的找到函数入口,入口为developtools/hdc_standard/src/daemon/main.cpp文件里面的main函数,接下来就是分析执行流程。

展示的是去掉了相关判断的部分代码,并不是完整代码
void SetLogCache(bool enable){g_logCache = enable;}int main(int argc, const char *argv[])
{Hdc::Base::SetLogCache(false); //设置 g_logCache = false;Hdc::Base::RemoveLogFile(); //因为g_logCache  = false,所以不执行任何操作ForkChildCheck(argc, argv); //设置 g_enableUsb = true;g_enableUart = true;NeedDropPriv();umask(0);signal(SIGPIPE, SIG_IGN);signal(SIGCHLD, SIG_IGN);signal(SIGALRM, SIG_IGN);WRITE_LOG(LOG_DEBUG, "HdcDaemon main run");HdcDaemon daemon(false); //执行函数 HdcDaemon::HdcDaemon 和 HdcSessionBase::HdcSessionBasedaemon.InitMod(g_enableTcp, g_enableUsb, g_enableUart); //执行  HdcDaemon::InitMod(0,1,1)daemon.WorkerPendding(); //执行 HdcSessionBase::WorkerPendding,这里因为运行了loop循环,s所以下面的无法执行,所以不做分析return 0;
}HdcDaemon::HdcDaemon(bool serverOrDaemonIn): HdcSessionBase(serverOrDaemonIn)
{clsTCPServ = nullptr;clsUSBServ = nullptr;clsUARTServ = nullptr;clsJdwp = nullptr;enableSecure = false;
}
HdcSessionBase::HdcSessionBase(bool serverOrDaemonIn)
{// print version pidWRITE_LOG(LOG_INFO, "Program running. %s Pid:%u", Base::GetVersion().c_str(), getpid());// server/daemon common initialization codethreadPoolCount = SIZE_THREAD_POOL;string uvThreadEnv("UV_THREADPOOL_SIZE");string uvThreadVal = std::to_string(threadPoolCount); setenv(uvThreadEnv.c_str(), uvThreadVal.c_str(), 1); //用来改变或增加环境变量的内容 UV_THREADPOOL_SIZE = 16uv_loop_init(&loopMain);WRITE_LOG(LOG_DEBUG, "loopMain init");uv_rwlock_init(&mainAsync);uv_async_init(&loopMain, &asyncMainLoop, MainAsyncCallback);uv_rwlock_init(&lockMapSession);serverOrDaemon = false;ctxUSB = nullptr;wantRestart = false;threadSessionMain = uv_thread_self();
}
void HdcDaemon::InitMod(bool bEnableTCP, bool bEnableUSB, [[maybe_unused]] bool bEnableUART)
{WRITE_LOG(LOG_DEBUG, "HdcDaemon InitMod");WRITE_LOG(LOG_DEBUG, "bEnableTCP:%d,bEnableUSB:%d", bEnableTCP, bEnableUSB);if (bEnableUSB) {// usbclsUSBServ = new(std::nothrow) HdcDaemonUSB(false, this); //执行HdcDaemonUSB::HdcDaemonUSB和 HdcUSBBase::HdcUSBBase函数if (clsUSBServ == nullptr) {WRITE_LOG(LOG_FATAL, "InitMod new clsUSBServ failed");return;}((HdcDaemonUSB *)clsUSBServ)->Initial(); // 执行 HdcDaemonUSB::Initial函数}WRITE_LOG(LOG_DEBUG, "bEnableUART:%d", bEnableUART);if (bEnableUART) {// UARTclsUARTServ = new(std::nothrow) HdcDaemonUART(*this);if (clsUARTServ == nullptr) {WRITE_LOG(LOG_FATAL, "InitMod new clsUARTServ failed");return;}((HdcDaemonUART *)clsUARTServ)->Initial();}clsJdwp = new(std::nothrow) HdcJdwp(&loopMain);if (clsJdwp == nullptr) {WRITE_LOG(LOG_FATAL, "InitMod new clsJdwp failed");return;}((HdcJdwp *)clsJdwp)->Initial();// enable securitystring secure;SystemDepend::GetDevItem("ro.hdc.secure", secure);enableSecure = (Base::Trim(secure) == "1");
}void HdcSessionBase::WorkerPendding()
{uv_run(&loopMain, UV_RUN_DEFAULT);ClearInstanceResource();
}
int HdcDaemonUSB::Initial()
{// after Linux-3.8,kernel switch to the USB Function FS// Implement USB hdc function in user spaceWRITE_LOG(LOG_DEBUG, "HdcDaemonUSB init");basePath = GetDevPath(USB_FFS_BASE); // constexpr auto USB_FFS_BASE = "/dev/usb-ffs/";if (access((basePath + "/ep0").c_str(), F_OK) != 0) {WRITE_LOG(LOG_DEBUG, "Only support usb-ffs, make sure kernel3.8+ and usb-ffs enabled, usbmode disabled");return ERR_API_FAIL;}ctxRecv.thisClass = this;ctxRecv.bufSizeMax = Base::GetUsbffsBulkSize();ctxRecv.buf = new uint8_t[ctxRecv.bufSizeMax]();if (!ctxRecv.buf) {WRITE_LOG(LOG_FATAL, "Init alloc memory failed");return ERR_BUF_ALLOC;}HdcDaemon *daemon = (HdcDaemon *)clsMainBase;WRITE_LOG(LOG_DEBUG, "HdcDaemonUSB::Initiall");uv_timer_init(&daemon->loopMain, &checkEP); // 初始化一个定时器,初始化定时器句柄checkEP.data = this;uv_timer_start(&checkEP, WatchEPTimer, 0, 1000);  //constexpr uint16_t TIME_BASE = 1000;//设置定时器  checkEP: 定时器句柄;WatchEPTimer : 回调函数,定时时间到的时候会调用这个函数;0 : 在 uv_run() 之后多久启动定时器,单位是毫秒;TIME_BASE : 定时器循环定时的时间,也就是重复调用的时间,单位是毫秒return 0;
}

运行结果如下图,可以看到重复调用了WatchEPTimer这个函数

所以会一直执行如下函数去读取数据

nt HdcDaemonUSB::LoopUSBRead(HUSB hUSB, int readMaxWanted)
{int ret = ERR_GENERIC;HdcDaemon *daemon = reinterpret_cast<HdcDaemon *>(clsMainBase);uv_buf_t iov;ctxRecv.data = hUSB;ctxRecv.bufSize = readMaxWanted;ctxRecv.req = {};uv_fs_t *req = &ctxRecv.req;req->data = &ctxRecv;iov = uv_buf_init(reinterpret_cast<char *>(ctxRecv.buf), ctxRecv.bufSize);ret = uv_fs_read(&daemon->loopMain, req, hUSB->bulkOut, &iov, 1, -1, OnUSBRead);if (ret < 0) {WRITE_LOG(LOG_FATAL, "uv_fs_read < 0");return ERR_API_FAIL;}ctxRecv.atPollQueue = true;return RET_SUCCESS;
}

openharmony标准系统移植之适配hdc功能相关推荐

  1. openharmony标准系统移植之init启动流程分析

    接上篇移植openharmony标准系统后,系统进入终端后,发现执行指令特别卡顿,太影响调试了.目前还不知道是什么问题导致的,不知道是不是cpu性能不够,但是感觉不太像是这个问题,卡顿如下图.基本一个 ...

  2. openharmony标准系统移植之添加产品编译

    首先我这里下载的是源码文件包的形式,如下图,我们使用 命令 tar xvf code-v3.1-Release.tar.gz进行解压文件.解压完成后如下图,多了code-v3.1-Release文件夹 ...

  3. openharmony标准系统之app手动签名

    今天在标准系统上使用DevEco Studio 3.0 Beta2开发app时,想直接在真机上运行,结果提示吐下信息, App LaunchInstall Failed: [Info]App inst ...

  4. 第一块能鸿蒙OpenHarmony标准系统的开发板——DAYU200

    简介 DAYU200是润和软件推出了OpenHarmony富设备开发板. 基于Rockchip RK3568,集成双核心架构GPU以及高效能NPU: 板载四核64位Cortex-A55 处理器采用22 ...

  5. 【起航】OpenHarmony远征04小型系统移植

    openharmony小型系统内核移植信息表 内核 支持的arch ROM 文件系统 Flash类型 Liteos-A ARMV7 >2M VFAT.JFFS2 SPI.NOR.NAND Lin ...

  6. OpenHarmony 平头哥玄铁架构 轻量系统移植—润和W800移植分享

    本方案基于OpenHarmony LiteOS-M内核,使用联盛德W800芯片的润和软件海王星系列[Neptune100开发板](https://gitee.com/openharmony-sig/d ...

  7. Android系统移植与调试之-------如何修改Android设备添加重启、飞行模式、静音模式等功能(一)...

    1.首先先来看一下修改前后的效果对比图 修改之后的图片 确认重启界面 具体的修改内容在下一篇中具体介绍. Android系统移植与调试之------->如何修改Android设备添加重启.飞行模 ...

  8. 安卓10和android区别,华为8月9日发布安卓10.0系统 华为EMUI 10.0功能及适配机型 华为安卓系统和鸿蒙OS区别...

    华为8月9日发布安卓10.0系统 华为EMUI 10.0功能及适配机型 华为安卓系统和鸿蒙OS区别 根据最新消息显示,华为终端官方再次给出消息称,在8月9日华为开发者大会首天,他们将发布新一代基于An ...

  9. 迅为IMX6ULL教程更新至2060+页,裸机开发,Linux系统移植,驱动开发,构建文明系统,QT开发,系统编程

    教程更新至2060+页 彻底让零基础的同学真正学会 更完善的教程更全面的讲解更高效的学习 第一部分 总领及学习指引:主要探讨的学习方法,我们将尽量用比较简洁的方式,让大家明白嵌入式系统知识体系,以及它 ...

  10. Android系统源码目录及功能介绍

    Android的移植按如下流程:     1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...

最新文章

  1. Ubuntu16.04 安装
  2. POJ2253 Frogger(最短路径)
  3. SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善
  4. Spring 缓存注解@Cacheable 在缓存时候 ,出现了第一次进入调用 方法 ,第二次不调用的异常
  5. fstab自动挂载_玩客云刷机系统之armbian挂载U盘增加空间
  6. Linux shell脚本中单双引号的区别
  7. Linux 命令之 netstat -- 查看网络状态信息/显示网络状态
  8. ftp服务器收集文件,ftp服务器收集文件
  9. MotifStack:多motif序列比较和可视化
  10. 浅谈三角带的使用及其分类
  11. 使用JSON的RESTful云数据库
  12. python硬件测试开发工程师_硬件测试工程师
  13. windows server 2008 大量拷贝后释放内存
  14. IEEE1588v2解析(7)gPTP协议和PTP的关系
  15. 【解决方法】VMware Horizo​​n View创建虚拟桌面失败,报错:View Composer Agent初始化错误(16):无法激活软件许可证
  16. 【全网世界区划最全整理输出之第五部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第五部分到结束行21088,总条数:21088
  17. Spring入门笔记总结
  18. 中国人民大学与加拿大女王大学金融硕士项目不仅实现自我升华还能拿到闪亮文凭
  19. 商务统计_4 用图表演示数据 - 频数分布
  20. Android系统移植与调试之-------build.prop文件详细赏析

热门文章

  1. 谷歌图形化HTML5网页编辑器Google Web Designer
  2. 捷径越来越少,快钱越来越难,为什么人生的路越来越窄?
  3. iOS 13越狱:越狱后如何安装AppSync和afc2越狱补丁
  4. N的阶乘 -- (九度OJ 大整数乘法)
  5. ElasticSearch中 如何使用“group by“ 进行日 周 月 年统计呢?(ElasticsearchTemplate进行聚合查询)
  6. python:PTA逆转裁判
  7. 投入产出实例matlab,基于MATLAB的投入产出分析
  8. <4>STM32F103基础知识
  9. Android应用去广告方法盘点
  10. 阿里云服务器mysql数据库读写权限设置_MySQL权限管理