OpenHarmony 3.1 Release版本关键特性解析——HDI硬件设备接口介绍

OpenHarmony-5.HDI 框架 使用IDL语法描述HDI接口并保存为.idl文件,.idl文件在编译过程中转换为C/C++语言的函数接口声明、客户端与服务端IPC相关过程代码,开发时只需要基于生成的头文件中函数接口实现具体服务功能即可。HDI(Hardware Device Interface,硬件设备接口)是HDF驱动框架为开发者提供的硬件规范化描述性接口,位于基础系统服务层和设备驱动层之间,是连通驱动程序和系统服务进行数据流通的桥梁,是提供给硬件系统服务开发者使用的、统一的硬件设备功能抽象接口,其目的是为系统服务屏蔽南向设备差异。 阅读详情

HDF 驱动框架是 OpenAtom OpenHarmony(简称“OpenHarmony”)系统硬件生态开放的基础,为驱动开发者提供了驱动加载、驱动服务管理和驱动消息机制等驱动框架能力,同时还为开发者提供了规范的HDI硬件设备接口,让开发者能屏蔽南向设备差异,提供更好的硬件。本文将为大家带来 HDI 硬件设备接口的介绍。

图1 HDF驱动框架

一、HDI介绍

HDI(Hardware Device Interface,硬件设备接口)是 HDF 驱动框架为开发者提供的硬件规范化描述性接口。在 OpenHarmony 分层结构中,HDI 位于 “基础系统服务层”和“设备抽象层(DAL)”之间。硬件设备通过 DAL 抽象化,并基于 IDL(Interface Description Language)接口描述语言描述后,为上层应用或服务提供了规范的硬件设备接口。

图2 OpenHarmony 分层结构

HDI 支持“IPC 模式”及“直通模式”两种调用方式。其中,IPC 模式即跨进程通信模式,基于 binder 机制实现,调用端通过 Proxy 代理库调用 HDI 接口,具备良好的解耦性和安全性,是标准系统的默认部署方式。直通模式,将 HDI 实现为共享库,调用端使用 dlopen 加载 HDI 实现库并直接调用 HDI 接口,是小型系统的默认部署方式,同时还适用于对性能有特殊需求的标准系统模块。

图3 两种调用方式

HDI 硬件设备接口的优点用一句话总结就是:为硬件的接入提供了统一的实现通路。屏蔽了硬件接口的具体实现,实现系统软件与硬件的架构解耦。让开发者专注于硬件接口的使用,从而简化开发过程,提升开发效率。

二、HDI实现

通过上文的介绍,相信很多小伙伴会有疑问,HDI 接口是怎么实现的呢?下面我们将为你介绍 IPC 模式下基于 C/S(Client-Server 客户端与服务端)结构的 HDI 接口实现。

2.1 IDL接口描述语言

为方便后文的理解,我们先简单了解一下 IDL 接口描述语言。

IDL(Interface Description Language)是一类用来描述接口的语言,通过一种中立的方式来定义客户端与服务端均认可的编程接口,可以实现在二者间的跨进程通信(IPC)。跨进程通信意味着可以在一个进程访问另一个进程的数据,或调用另一个进程的方法。通常把应用接口提供方(供调用)称为服务端,调用方称为客户端。

IDL 先把需要传递的对象分解成操作系统能够理解的基本类型,然后根据接口声明编译,生成 IPC/RPC代理(Proxy)和桩(Stub)的 C/C++ 代码,从而为调用者提供一致的接口和调用方式。

 图4 IDL IPC模式通信模型

2.2 基于IDL语言实现HDI接口

首先,使用 IDL 语法描述 HDI 接口并保存为.idl文件,然后编写 .idl 文件的编译脚本 BUILD.gn 文件,最后编译 .idl 文件即可。下面我们将为大家演示电源子系统的 HDI 接口的实现过程。

(1)使用IDL语法编写 .idl 文件

● 定义电源接口 IPowerInterface.idl

package ohos.hdi.power.v1_0; 
import ohos.hdi.power.v1_0.IPowerHdiCallback;
import ohos.hdi.power.v1_0.PowerTypes; 

interface IPowerInterface { 
  RegisterCallback([in] IPowerHdiCallback ipowerHdiCallback); 
  StartSuspend(); 
  StopSuspend(); 
  ForceSuspend(); 
  SuspendBlock([in] String name); 
  SuspendUnblock([in] String name); 
  PowerDump([out] String info);
}

● 如果需要从服务端回调,可以定义 callback 接口类 IPowerHdiCallback.idl

package ohos.hdi.power.v1_0; 

[callback] interface IPowerHdiCallback { 
   OnSuspend(); 
   OnWakeup();
}

● 如果 interface 中用到了自定义数据类型,将自定义类型定义到 powerTypes.idl

package ohos.hdi.power.v1_0; 

enum PowerHdfCmd { 
  CMD_REGISTER_CALLBCK = 0, 
  CMD_START_SUSPEND,
  CMD_STOP_SUSPEND,
  CMD_FORCE_SUSPEND,
  CMD_SUSPEND_BLOCK,
  CMD_SUSPEND_UNBLOCK,
  CMD_DUMP,
}; 

enum PowerHdfCallbackCmd { 
  CMD_ON_SUSPEND = 0,
  CMD_ON_WAKEUP,
};

enum PowerHdfState { 
   AWAKE = 0, 
   INACTIVE,
   SLEEP,
};

(2)编写 .idl 文件的编译脚本 BUILD.gn

import("//drivers/adapter/uhdf2/hdi.gni") 
if (defined(ohos_lite)) { 
  group("libpower_proxy_1.0") { 
    deps = [] 
    public_configs = [] 
  } 
} else {
  hdi("power") {
   module_name = "power_interface_service" 

   sources = [
     "IPowerHdiCallback.idl",
     "IPowerInterface.idl", 
     "PowerTypes.idl", 
   ] 
   language = "cpp" subsystem_name = "hdf" part_name = "power_device_driver" }
}

(3)编译 .idl文件

使用编译工具 hdi-gen 编译 IDL 文件,IDL 文件在编译过程中转换为 C/C++ 语言的函数接口声明、客户端与服务端 IPC 相关过程代码,开发者只需要基于生成的 power.h 函数接口实现具体服务功能即可。

编译后生成代码在 out/product/gen/drivers/interface/power 中,接口代码如下:

namespace OHOS { 
namespace HDI { 
namespace Power { 
namespace V1_0 { 
using namespace OHOS; 

enum {
 CMD_POWER_INTERFACE_REGISTER_CALLBACK,
 CMD_POWER_INTERFACE_START_SUSPEND,
 CMD_POWER_INTERFACE_STOP_SUSPEND,
 CMD_POWER_INTERFACE_FORCE_SUSPEND,
 CMD_POWER_INTERFACE_SUSPEND_BLOCK,
 CMD_POWER_INTERFACE_SUSPEND_UNBLOCK,
 CMD_POWER_INTERFACE_POWER_DUMP,
 CMD_POWER_INTERFACE_GET_VERSION,
};

class IPowerInterface : public IRemoteBroker {
public:
 DECLARE_INTERFACE_DESCRIPTOR(u"ohos.hdi.power.v1_0.IPowerInterface");
 virtual ~IPowerInterface() = default;
 static sptr<IPowerInterface> Get();
 static sptr<IPowerInterface> GetInstance(const std::string& serviceName);
 virtual int32_t RegisterCallback(const sptr<IPowerHdiCallback>& ipowerHdiCallback) = 0; 
 virtual int32_t StartSuspend() = 0;
 virtual int32_t StopSuspend() = 0;
 virtual int32_t ForceSuspend() = 0;
 virtual int32_t SuspendBlock(const std::string& name) = 0;
 virtual int32_t SuspendUnblock(const std::string& name) = 0;
 virtual int32_t PowerDump(std::string& info) = 0;
 virtual int32_t GetVersion(uint32_t& majorVer, uint32_t& minorVer) = 0;
};
} // V1_0
} // Power
} // HDI
} // OHOS

(4)实现HDI接口

● 实现 UHDF Driver,用于将 HDI 实现加载为独立进程,并基于 HDF 驱动框架发布设备服务。

static int32_t PowerInterfaceDriverDispatch(struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data,
  struct HdfSBuf *reply)
 {
   ...... 
   return hdfPowerInterfaceHost->service->OnRemoteRequest(cmdId, *dataParcel, *replyParcel, option); // 将接口调用转发到stub实现
 } 

static int HdfPowerInterfaceDriverBind(struct HdfDeviceObject *deviceObject)
 {
   ...... 
  hdfPowerInterfaceHost->ioservice.Dispatch = PowerInterfaceDriverDispatch; 
  hdfPowerInterfaceHost->ioservice.Open = NULL; 
  hdfPowerInterfaceHost->ioservice.Release = NULL;
  hdfPowerInterfaceHost->service = new PowerInterfaceImpl();

  deviceObject->service = &hdfPowerInterfaceHost->ioservice;
  return HDF_SUCCESS;
 }

 ......

struct HdfDriverEntry g_powerinterfaceDriverEntry = {
 .moduleVersion = 1,
 .moduleName = "power_interface_service",
 .Bind = HdfPowerInterfaceDriverBind,
 .Init = HdfPowerInterfaceDriverInit,
 .Release = HdfPowerInterfaceDriverRelease,
};

● 实现 HDI 接口

#include "v1_0/power_interface_stub.h" 

/* 继承PowerInterfaceStub并实现IPowerInterface 中的接口*/
class PowerInterfaceImpl :public PowerInterfaceStub { 
public:
 virtual ~PowerInterfaceImpl() {}
 int32_t RegisterCallback(const sptr<IPowerHdiCallback>& ipowerHdiCallback) override; 
 int32_t StartSuspend() override;
 int32_t StopSuspend() override;
 int32_t ForceSuspend() override;
 int32_t SuspendBlock(const std::string& name) override;
 int32_t SuspendUnblock(const std::string& name) override;
 int32_t PowerDump(std::string& info) override;
}; 

// 在cpp中对相关接口进行实现,其中调用了内核相关接口,实现了具体功能

 int32_t PowerInterfaceImpl::StopSuspend()
 {
  suspendRetry_ = false;

  return HDF_SUCCESS; 
} 

int32_t PowerInterfaceImpl::ForceSuspend()
 {
  suspendRetry_ = false;

  NotifyCallback(CMD_ON_SUSPEND);
  DoSuspend();
  NotifyCallback(CMD_ON_WAKEUP);
  return HDF_SUCCESS;
} 
int32_t PowerInterfaceImpl::SuspendBlock(const std::string& name)
 {
  std::lock_guard<std::mutex> lock(mutex_);
  if (name.empty()) { 
      return HDF_ERR_INVALID_PARAM;
  } 
  UniqueFd fd(TEMP_FAILURE_RETRY(open(LOCK_PATH, O_RDWR | O_CLOEXEC))); 
  bool ret = SaveStringToFd(fd, name);
  if (!ret) {
      return HDF_FAILURE;
 } return HDF_SUCCESS;
}

三、HDI使用

通过上文的介绍,相信大家已经对 HDI 有了一定的了解,下面我们将为大家介绍 HDI 的使用,在直通模式下,对 HDI 接口调用为同一进程空间函数调用,过程较为直接,这里我们重点阐述 IPC 模式下的调用原理,然后通过 CPP 语言来展示电源子系统 HDI 的调用。

3.1 调用原理

在 IPC 模式下,当系统服务调用 HDI 接口时,通过 proxy 库将函数调用转换为 IPC 请求,将接口调用的参数进行序列化;IPC 请求通过 IPC 框架发送到服务端,请求将被 stub 库先处理,然后对接口调用的参数进行反序列化,再转换成对服务实现的函数调用,从而实现接口调用过程。

 图5 HDI调用过程

3.2 基于CPP语言的使用

上文已经编译生成了电源子系统的 HDI 接口,下面我们来看看如何使用 CPP 语言来调用 HDI 接口吧。

(1)客户端在BUILD.gn中增加依赖://drivers/interface/foo/v1.0:libfoo_proxy_1.0"

ohos_executable("call_foo_hdi") { 
sources = [
"src/call_foo_hdi.cpp",
] 
deps = [
"//drivers/interface/foo/v1.0:libfoo_proxy_1.0", 
] 
external_deps = [
"hiviewdfx_hilog_native:libhilog", 
"ipc:ipc_core", 
"utils_base:utils", 
] 
part_name = "bar" 
subsystem_name = "bar_subsystem" 
}

(2)在实现电源子系统的代码中调用 HDI 接口,代码如下:

#include "v1_0/power_interface.h" //包含Power HDI接口头文件 
using namespace OHOS::HDI::Power::V1_0; //使用HDI接口命名空间 
namespace OHOS { 
namespace PowerMgr { 
sptr<IPowerInterface> powerInterface = nullptr; SystemSuspendController::SystemSuspendController()
{ 
  sptr<IPowerHdiCallback> g_callback = new
  PowerHdiCallbackImpl(); powerInterface = IPowerInterface::Get(); //调用接口实例化接口获取客户端实例
  if (powerInterface == nullptr) {
      POWER_HILOGE(COMP_SVC, "The hdf interface is null");
      return;
  }
  powerInterface->RegisterCallback(g_callback); // 调用HDI接口注册电源事件回调 
}

四、结语

以上就是本文全部内容,我们在这里简单介绍了HDI接口的实现思路及使用,对于广大南向开发者,我们还在社区提供了详细的HDI接口实现指导,欢迎大家在gitee社区参与更多讨论。

社区链接:

https://gitee.com/openharmony/drivers_interface

OpenHarmony—4.0图形HDI基础适配及点屏差异分析 1.1 进程数量变化新增加两个uhdf进程。allocator_host进程及composer_host进程。删除了disp_gralloc_host 进程,并使用allocator_host替换。uhdf添加进程配置如下:1.2 拉起关系变化composer以前版本composer由render_service通过单例拉起,现在通过composer service拉起接口实现层libdisplay_composer_vdi_impl.z.so,对外提供标准的IPC服务.allocator。 阅读详情

相关推荐

【鸿蒙南向开发】OpenHarmony实战之视频编解码HDI的使用

Codec HDI Interface (简称HDI)提供基于OpenMax 的标准接口,Media Service 调用这套接口实现硬件编解码能力。

HarmonyOS_666的博客 1676

OpenHarmony 图形HDI接口适配

图形HDI接口composer、allocator的适配过程,详解Display HDI的适配过程

RK3588跑OpenHarmony标准系统:构建、驱动与算力适配实战

在嵌入式开发中,操作系统选型与硬件算力适配往往决定产品落地效率。OpenHarmony标准系统基于Linux内核与HDF驱动框架,为富设备提供完整的系统服务与分布式能力,而RK3588作为高性能SoC,凭借多核CPU、6TOPS NPU及丰富接口,成为承载该系统的理想平台。本文围绕RK3588适配OpenHarmony标准系统全流程,涵盖源码构建、烧写启动、内核与HDF驱动调试,以及NPU推理、RGA加速等异构算力应用,并总结了开发调试与长期维护中的实际经验。无论是评估方案还是产品原型,都可作为直接参考。

weixin_33796205的博客 373

OpenHarmony之HDI

HDI(Hardware Device Interface,硬件设备接口)是HDF驱动框架为开发者提供的硬件规范化描述性接口。通过规范化的设备接口标准,为系统提供统一、稳定的硬件设备操作接口。HDI支持“IPC模式”及“直通模式”两种调用方式。IPC模式即跨进程通信模式,基于binder机制实现,调用端通过Proxy代理库调用HDI接口,具备良好的解耦性和安全性,是标准系统的默认部署方式。

DD'Notes 729

鸿蒙进阶——HDI及IDL硬件接口IPC框架小结

HDI(Hardware Device Interface):OpenHarmony硬件设备接口,定义系统中跨进程通信的接口,实现服务间的跨进程通信

最美不过,心中有梦,身旁有你! 3902

OpenHarmony中基于HDF框架的驱动开发和使用

代码版本:openharmony 3.2 release。

wobuzai11的博客 3428

OpenHarmony I2C总线开发与排障:从协议原理到系统级问题定位

I2C总线是嵌入式系统中最常用的低速通信协议之一,依靠SDA和SCL两根线即可实现设备间可靠数据传输。其开漏输出与上拉电阻配置、7位/10位地址机制、时序与ACK应答等原理,是开发者定位通信故障的基础。在OpenHarmony这类分布式操作系统中,I2C从硬件寄存器到HDF驱动框架再到用户态HDI接口的多层抽象,让问题定位更具挑战。借助逻辑分析仪抓取波形,结合设备节点扫描、SELinux权限检查,可高效解决地址错误、上拉电阻不足、时钟拉伸、休眠唤醒后I2C控制器复位等典型问题。以EEPROM读写和GT911

weixin_34043301的博客 408

OpenHarmony-8.IDL工具

d后的dir为目标输出目录,以输出文件夹名为IIdlTestServiceTs为例,在idl可执行文件所在目录下执行./idl-gen -gen-ts -d IIdlTestServiceTs -c IIdlTestServiceTs/IFoo.id,将会在执行环境的IIdlTestServiceTs目录中生成接口文件、Stub文件、Proxy文件。根据OpenHarmony IDL中的定义生成的信息或代码可以简化跨进程或跨设备调用接口的实现。1.openharmony IDL工具。

weixin_41028621的博客 1579

仓颉语言 Media Kit 媒体服务错误码全解析:5400101~5411011 错误原因与处理方案

本文基于开源仓颉语料库中 [Media 错误码参考文档](https://link.gitcode.com/i/4056952b08813ac71edeeceeb035cf94),系统梳理仓颉开发场景下 `ohos.multimedia.media`(媒体服务)模块特有的 18 个业务错误码,涵盖内存分配失败、状态机操作不允许、IO 异常、操作超时、播放服务死亡、音频焦点冲突以及网络链路、SSL

gitblog_00001的博客 613

【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02

宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_

weixin_49199313的博客 107

鸿蒙中的设备驱动接口(HDI)架构解析:统一驱动模型与跨平台适配实战指南

HDI(Hardware Driver Interface)是 OpenHarmony 系统中实现设备驱动标准化与平台无关性的关键抽象层,承担着连接 HDF 驱动框架与上层服务的桥梁作用。它通过语言无关、平台中立的接口定义语言(IDL)与自动代码生成机制,实现硬件能力在各类设备间的复用与隔离。本文结合 OpenHarmony 3.2 与 4.0 LTS 的实际驱动开发案例,系统解析 HDI 的设计原理、接口构建方式、Stub/Skeleton 通信模型与驱动服务注册流程,并以摄像头与音频子系统为例,详解 H

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1591

OpenHarmony WLAN HDI 源码学习

文章目录WLAN_HDI一、WILAN HAL1.1、IWiFi1.2、IWiFiBaseFeature1.3、Client二、HDI Service2.1、Service2.2、IWifiInterface三、注册WLAN回调函数 WLAN_HDI 关于WLAN HDI的介绍,可见官网文档,其结构可如图所示: WLAN HDI 目的是提供接口给 Wi-Fi Service调用,其提供的功能有:启动/关闭WLAN,查看连接状态,注册回调函数,启动wlan扫描等。 一、WILAN HAL WLAN HAL模

杀手的博客 1884

使用moveit中的报错及解决

1.fatal error: moveit/move_group_interface/move_group.h: 没有那个文件或目录。// #include <moveit/move_group_interface/move_group.h> 改为。问题1 moveit/move_group_interface/move_group.h: 没有那个文件或目录。在运行c++程序时报错。

qq_60566155的博客 2285

OpenHarmony支持HDMI接口声卡适配说明

card_controller配置项根据声卡包含的驱动服务进行配置,不同声卡包含的驱动服务可能不同,HDMI声卡包含platform、dai和codec所以需要配置codecName codec驱动服务名称,platformName platform驱动服务名称、cpuDaiName platform侧dai服务名称、codecDaiName codec侧驱动服务名称。hwInfo配置声卡的信息,包括声卡播放和录音支持的格式、采样率范围、通道范围、缓存buffer最大值、每个周期的字节范围、周期的范围。

OpenHarmony_dev的博客 1926

银河麒麟V10ARM架构服务器离线安装docker\nacos【附安装包】

本文分享了在银河麒麟ARM64操作系统上安装Docker和Nacos的完整过程。首先提供了Docker的自动化安装脚本,包含服务配置、存储路径设置等关键步骤,并给出了常用维护命令。接着详细介绍了通过Docker-compose部署Nacos的方法,包括镜像导入、配置文件修改、鉴权设置等注意事项,特别强调了密钥长度必须超过32个字符的要求。文章还提供了Nacos初次登录的注意事项,并预告了后续可能推出的Redis、Nginx等安装教程。所有配置文件和脚本均可直接下载使用,适合内网环境下国产操作系统的部署

weixin_39054697的博客 2344

用Django框架+爬虫技术实现自动获取可画(Canva)团队会员资格的方法

可画(canva)是一个非常流行的在线平面设计平台,因为它无需专业训练和技能就可以利用其丰富的资源设计出美观、酷炫的作品,因而它受到了极其广泛的设计专业和非专业人群的喜爱本文介绍了一种方法,它采用Django网络框架与爬虫技术相结合,实时监控定时更新可画团队版免费邀请链接的网站页面,一旦链接有更新动作,第一时间获取相关信息,并直接加载这个有效的邀请链接,自动进入可画网站获得团队版使用资格。

hhyyqq的博客 2207

OpenHarmony开发之——Camera模块

OpenHarmony相机驱动框架模型对上实现相机HDI(Hardware Device Interface)接口,对下实现相机Pipeline模型,管理相机各个硬件设备。HDI实现层:实现OHOS(OpenHarmony Operation System)相机标准南向接口。框架层:对接HDI实现层的控制、流的转发,实现数据通路的搭建,管理相机各个硬件设备等功能。设备适配层:屏蔽底层芯片和OS(Operation System)差异,支持多平台适配。图 1Camera驱动模块架构图。

m0_71263309的博客 1450

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 339

OpenHarmony IDL工具规格及使用说明书(仅对系统应用开放)

当客户端和服务器进行IPC通信时,需要定义双方都认可的接口,以保障双方可以成功通信,OpenHarmony IDL(OpenHarmony Interface Definition Language)则是一种定义此类接口的工具。OpenHarmony IDL先把需要传递的对象分解成操作系统能够理解的基本类型,并根据开发者的需要封装跨边界的对象。图1IDL接口描述。

1 1364

ABB RobotStudio 和 S7-PLCSIM Advanced V5.0 搭建虚拟通信环境,实现 PLC 对机器人布尔量、数字量和模拟量的控制。

本教程详细介绍了如何利用ABB RobotStudio和S7-PLCSIM Advanced V5.0搭建虚拟通信环境,实现PLC对机器人的布尔量、数字量和模拟量控制。主要内容包括:在TIA Portal V20中配置PLC项目并编写通信程序;通过S7-PLCSIM Advanced创建虚拟PLC运行环境;在RobotStudio中设置机器人PROFINET通信;以及建立虚拟网络连接并进行功能测试。该方案适用于工业自动化虚拟调试,可显著降低现场调试风险。操作需注意软件版本兼容性、网络配置及信号映射准确性,最

CHUXUEZHE8210的博客 2515

非线性动力学_用MatCont分析非线性动力学方程组(一)

写在前面:笔者打算写两到三篇系列文章介绍MatCont,此为第一篇《用MatCont分析非线性动力学方程组(一)》。MatCont是一个基于Matlab而开发的免费工具包,专门用来做非线性动力学模型分叉、向量场、周期性等分析,符号(连续性)运算和数值(离散性)运算均适用。该工具的开发及研究项目由比利时Ghent大学的Willy Govaerts教授、荷兰Utrecht大学的Yuri Kuznets...

weixin_39700215的博客 2766

OpenHarmony编译系统

openHarmony 编译系统

weixin_37210821的博客 2218

Modkit

Nmod- 通过过滤器分类为具有指定碱基修饰的残基的调用数量。Ncanonical- 通过过滤器分类为未修饰的碱基的调用数量。确切的碱基必须通过修饰代码推断。例如,如果修饰代码是m(5mC),则未修饰的碱基是胞嘧啶。如果修饰代码是a,则未修饰的碱基是腺苷。Nother mod- 通过过滤器分类为修饰的调用数量,但修饰不同于列出的碱基(且相应的未修饰碱基相同)。例如,对于给定的胞嘧啶,可能有 3 个读取带有h调用,1 个带有未修饰调用,2 个带有m调用。在h的 bedMethyl 行中,N。

生物信息学 1264

OpenHarmony 标准系统 HDF 框架音视频驱动开发

根据 OpenHarmony 系统的自下而上的层次结构划分:内核层、系统服务层、框架层和应用层。内核层包含两方面,内核子系统和驱动子系统。这层主要以 HDF 驱动框架为基础实现音频 codec 驱动,audio HDI 接口的封装。由于产品形态和解决方案的多样化,音频 codec 的驱动方式也分用户态驱动方式和内核态驱动方式来实现。音频 codec 驱动工作后需要对硬件资源进行统一抽象封装,对上层暴露统一的音频接口,这样做的目的就是符合音频规范化操作,保证生态良性发展。

跑不了的你的博客 3459

BEV和OCC学习-4:数据准备生成pkl文件(NuSences)

info[‘cam_instances’][‘CAM_XXX’][i][‘bbox_3d’]:长度为 7 的列表,以 (x, y, z, l, h, w, yaw) 的顺序表示实例的 3D 边界框。info[‘cam_instances’][‘CAM_XXX’][i][‘bbox’]:2D 边界框标注(3D 框投影的矩形框),顺序为 [x1, y1, x2, y2] 的列表。info[‘cam_instances’][‘CAM_XXX’][i][‘attr_label’]:实例的属性标签。

zfjBIT的专栏 1699

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: OpenHarmony 3.2 Beta1版本正式发布
下一篇: 【直播回顾】战码先锋第四期:轻松入门,成为媒体子系统贡献者
OpenHarmony开发者
博客等级 码龄5年 626粉丝 221原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值