0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HDF Display驱动模型的整体架构加载及运行流程

电子工程师 来源:OpenAtom OpenHarmony 作者:翟海鹏 2021-09-05 10:51 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Display 驱动概述

随着电子产业迅速发展,带屏类的设备种类日益增多,各种各样的显示屏也随之出现。

最常见的显示屏有 LCD(Liquid Crystal Display)屏、LED(OrganicLight-Emitting Diode)点阵屏、OLED(Organic Light-EmittingDiode)屏等,根据其各自特点,用于不同的显示场景。显示屏的硬件接口主要有 MIPIHDMI、SPI、I2C、RGB、MCU 等,现在用于手机的高分辨率显示屏,主要用的是 MIPI 接口,HDMI 接口主要用于显示器或 TV,RGB 和 MCU 接口为并口,主要用于功能机之上。

以 LCD 为例,其驱动主要完成三部分工作:

1、对 LCD Driver IC 及模组相关的硬件资源进行初始化,包括配置 MIPI 参数,操作 GPIO 管脚,设置上下电时序,下发屏端初始化参数序列等;

2、器件驱动操作接口对注册或者对接到标准的显示框架上,例如 DRM 架构或者 FB 显示架构,保证在设备亮灭屏状态切换时,显示架构可以通过 panel 驱动注册的接口操控 LCD;

3、背光参数配置及等级设置等。

Display驱动模型介绍

驱动模型背景

当前操作系统和 SOC 种类繁多,各厂商的显示屏器件也各有不同,随之针对器件的驱动代码也不尽相同,往往是某一款器件驱动,只适用于某单一内核系统或 SOC,如果要迁移到其他内核或者 SOC,可能会有不小的移植工作量。而且,不同驱动 IC 的驱动代码差异较大,产品更换驱动 IC,则又需要重新开发对应的器件驱动,造成重复工作。因此,我们尝试基于 HDF 驱动框架,编写一套较通用的 Display 器件驱动模型,尽可能降低驱动开发者的开发或移植工作量,简化器件驱动开发,提升开发效率。

190266be-0da6-11ec-8fb8-12bb97331649.png

图1 HDF Display驱动模型层次关系

以显示模块为例,上层为图形服务;中间层为 HDI 层(Hardware Display Interface),对图形服务提供驱动能力接口,方便其操作具体的外设器件;显示驱动模型当前部署在内核态,向上对接到 Display HDI 的实现,同时在内核对接到标准的显示框架上(如DRM、FB);向下对接不同的 panel 驱动,从而自上而下打通显示通路,驱动屏幕点亮。

驱动模型通过逐步兼容不同的显示框架(DRM、FB)及差异化的 SOC,开发者可基于其快速开发显示屏器件驱动。

驱动模型解析

显示驱动模型基于 HDF 驱动框架、Platform 接口及 OSAL 接口开发,可以屏蔽不同内核形态(LiteOSLinux)差异,适用于不同芯片平台(Hi35xx、Hi38xx、V3S等),为显示屏器件提供统一的驱动平台。

当前驱动模型主要部署在内核态中,向上对接到 Display 公共 hal 层,辅助 HDI 的实现。显示驱动通过 Display-HDI 层对图形服务暴露显示屏驱动能力;向下对接显示屏 panel 器件,驱动屏幕正常工作,自上而下打通显示全流程通路。

模型各层设计说明

Display 驱动模型基于 HDF 驱动框架、Platform 接口及 OSAL 接口开发,可以做到不区分OS(LiteOS、Linux)和芯片平台(Hi35xx、Hi38xx、V3S等),为 LCD 器件提供统一的驱动模型。

如图 2 所示,当前 HDF Display 驱动模型主要分为四层:标准架构适配层(DRM Panel Adapter Driver)、显示公共驱动层(DisplayCommon Driver)、芯片平台适配层(SoC Adapter Driver)、器件驱动层(Display Panel Driver)。

1、标准架构适配层

194972fc-0da6-11ec-8fb8-12bb97331649.png

图3. 标准架构适配层组件

如图 3 所示,本层主要完成对接标准的显示驱动架构,如 DRM(Direct Rending Manager)或 FB(Framebuffer),以 DRM 为例,将 panel 侧驱动接口对接到标准框架中,保证在 DRM 框架中实现对 Panel 驱动的操作接口,当前注册的接口如下。

static struct drm_panel_funcs g_hdfDrmPanelFuncs = { .get_modes = HdfDrmPanelGetModes, .enable = HdfDrmPanelEnable, .disable = HdfDrmPanelDisable, .prepare = HdfDrmPanelPrepare, .unprepare = HdfDrmPanelUnprepare,};

2、显示公共驱动层

1963f730-0da6-11ec-8fb8-12bb97331649.png

图4. 显示公共驱动层组件

如图 4 所示,此部分属于整个驱动模型的中枢,所有的屏端接口注册、Panel 信息管理、屏幕状态控制、用户态 HDI 接口命令处理、以及通用的基础显示特性,目前都是通过这部分实现。

在本层通过结构体 DispManager 管理所有的显示信息,其成员 PanelManager 用于记录与显示屏相关的接口及参数信息。同时接收并处理 HDI 层直接对 panel 操作相关的指令(主要用于 L0-L1 等轻量级系统),如 Panel 器件信息的获取、休眠唤醒、背光设置等指令。此外,本层还负责实现一些基础显示特性的业务框架,如 ESD 检查机制,力求将显示相关的共有逻辑集中到本层实现,以简化 Panel 器件驱动的实现,避免 panel 驱动中相同功能的重复实现,便于统一管理和维护。

3、芯片平台适配层

196d125c-0da6-11ec-8fb8-12bb97331649.png

图5. 芯片平台适配层组件

如图 5 所示,借助此 SoC 适配层,实现 Display 器件驱动和 SoC 侧硬件资源的解耦,主要完成芯片平台强相关的参数配置,如 mipi 速率计算及设置、管脚复用配置,以及其他和 SoC 强相关的差异化配置及初始化等。

4、器件驱动层

198c77a0-0da6-11ec-8fb8-12bb97331649.png

图6. 器件驱动层组件

如图 6 所示,器件驱动层主要实现和器件自身强相关的驱动适配接口,例如发送初始化序列、休眠唤醒流程、背光设置、ESD 检测等,同时完成 panel 信息的解析,并将 panel 向上注册到公共驱动层进行管理。

基于 Display 驱动模型开发 LCD 器件驱动,可以借助平台提供的各种能力及接口,较大程度的降低器件驱动的开发难度和周期,提升开发效率。

说明

以上驱动模型中的各层,需要根据产品自身情况来选择,其中“显示公共驱动层”和“器件驱动层”为必选项,“标准架构适配层”和“芯片平台适配层”则为可选项。对于L0-L1这种轻量级SoC,一般都会有与SoC强相关的硬件配置需要在“芯片平台适配层”中完成,而对于L2及其以上的SoC,通常都会采用标准的显示框架,此时“标准架构适配层”则必不可少。

驱动加载及运行

HDF 的驱动的加载方式,在之前的 HDF 框架介绍章节中已经做过说明,框架通过解析设备描述的 hcs 配置文件,获取到各设备的配置信息,根据 moduleName 来匹配对应设备的驱动文件入口,按照配置的加载优先级,依次加载驱动,详细说明会在下一节的“具体开发步骤”中进行描述。

如图 7 所示,简要概括了驱动模型的加载及运行流程,对模型内部组件及关联组件之间的关系做了划分,整体加载流程分为 9 步,分别说明如下:

“显示公共驱动层”和“器件驱动层”为必选项,“标准架构适配层”和“芯片平台适配层”

1、HDF Device Manager 解析设备描述;

2、HDF 优先加载器件驱动层,构建 Panel 设备;

3、将 panel 信息及操作接口注册到公共驱动层;

4、HDF 其次加载芯片平台适配层,进行 SoC 相关硬件资源初始化;

5、HDF 再次加载公共驱动层,对共有特性进行初始化;

6、HDF 最后加载标准架构适配层;

7、从公共驱动层中获取到 PanelManager,;

8、将对应 panel 注册到 DRM 框架中;

9、在系统运行起来后,DRM 会调用 panel ops 进行显示屏控制。

对于采用像 LiteOS 这种轻量内核的系统,并不会像 Linux 内核那样提供标准的显示框架,驱动模型也无法与其对接,因而上层图形系统可以通过 HDI 接口,来直接操控显示屏。

Display驱动开发指导

驱动开发说明

基于 HDF Display 驱动模型,开发一款器件驱动,开发者主要需要完成两部分工作:HCS 配置文件、器件驱动层适配。

对于轻量级设备(L0-L1),以海思 Hi35xx 芯片为例,除了上述两部分工作外,还需要在芯片平台适配层中,完成 SoC 有关显示屏的硬件资源配置。

对于标准设备(≥L2),还需要关注与 DRM 对接的标准架构适配层,此部分在模型中已经添加,开发者只需聚焦器件驱动层的实现即可。

具体开发步骤

此处我们以润和开发板(Hi3516 SoC)为例,说明适配一款 LCD 屏需要完成的工作。

添加 Display 配置信息

(1)设备描述配置

配置文件目录:

vendor/hisilicon/hispark_taurus/config/device_info/device_info.hcs

基础的设备描述信息,在 HDF 的配置章节有作说明,此处不再重复描述。在配置文件中添加 LCD 设备描述信息如下:

device_lcd :: device { device0 :: deviceNode { policy = 0; // 设备发布策略为0,即只对内核态发布服务 priority = 100; // 设备对应驱动加载优先级,值越小越早加载 preload = 0; // 0代表正常加载,1代表不加载 permission = 0660; // 设备对应节点的权限// 模块名很关键,需和对应驱动的中的moduleName保持一致 moduleName = “LCD_XXX”; serviceName = “hdf_lcdxxx_service”; // 当前设备对应的服务 deviceMatchAttr = “ hdf_lcdxxx_driver”; // 设备对应私有配置属性名 }}

(2)器件私有配置

参考的配置文件目录:

vendor/hisilicon/hispark_taurus/config/lcd/lcd_config.hcs

检查配置宏

驱动模型的编译入口:drivers/adapter/khdf/liteos/model/display/Makefile

根据编译控制内容可知,需增加 panel 对应的编译控制宏:

ifeq ($(LOSCFG_DRIVERS_HDF_LCD_XXX), y)LOCAL_SRCS += $(LITEOSTOPDIR)/。。/。。/drivers/framework/model/display/driver/panel/mipi_xxx.cendif

配置编译宏的路径:

kernel/liteos_a/tools/build/config/hispark_taurus_clang_release.config

LOSCFG_DRIVERS_HDF_DISP=yLOSCFG_DRIVERS_HDF_LCD_XXX=y

适配器件驱动

Display 驱动模型路径:drivers/framework/model/display/driver

对应的器件驱动路径:drivers/framework/model/display/driver/panel

驱动入口模板如下:

struct HdfDriverEntry g_ xxxDevEntry = { .moduleVersion = 1, .moduleName = “LCD_XXX”, // 要求和device_info.hcs中配置的模块名一致 .Init = xxxEntryInit, // 驱动入口};HDF_INIT(g_xxxDevEntry); // HDF驱动入口解析模板

LCD 器件驱动需要适配的基础接口包括 init、on、off、setBacklight 等,并将器件信息挂接到 panle 的 info 成员上。

static void xxxPanelInit(struct PanelData *panel){ panel-》info = &g_panelInfo; panel-》status.powerStatus = POWER_STATUS_OFF; panel-》status.currLevel = MIN_LEVEL; panel-》esd = &g_panelEsd; panel-》init = xxxInit; panel-》on = xxxOn; panel-》off = xxxOff; panel-》setBacklight = xxxSetBacklight;}

Display开发实例

当前润和开源板(Hi3516 SoC)上搭载的是众盛捷的 5.5 寸屏,对应的 Driver IC 型号为集创北方 ICN9700,显示屏的物理接口为 MIPI DSI,以此屏为例进行开发示例说明。

添加配置

配置路径:

vendor/hisilicon/hispark_taurus/config/device_info/device_info.hcs

/* Display驱动相关的设备描述配置 */display :: host { hostName = “display_host”; /* Display平台驱动设备描述 */ device_hdf_disp :: device { device0 :: deviceNode { policy = 2; priority = 200; permission = 0660; moduleName = “HDF_DISP”; serviceName = “hdf_disp”; } } /* SOC适配层驱动设备描述 */ device_hi35xx_disp :: device { device0 :: deviceNode { policy = 0; priority = 199; moduleName = “HI351XX_DISP”;

} } /* LCD器件驱动设备描述 */ device_lcd :: device { device0 :: deviceNode { policy = 0; priority = 100; preload = 0; moduleName = “LCD_ ICN9700”; } }}

通过如上配置中的器件驱动的 moduleName 为 “LCD_ICN9700”,HDF 遍历对应的驱动入口并加载匹配的驱动。

适配编译

编译入口:drivers/adapter/khdf/liteos/model/display/Makefile

ifeq ($(LOSCFG_DRIVERS_HDF_LCD_ICN9700), y)LOCAL_SRCS += $(LITEOSTOPDIR)/。。/。。/drivers/framework/model/display/driver/panel/mipi_icn9700.cendif

配置编译宏的路径:

kernel/liteos_a/tools/build/config/hispark_taurus_clang_release.config

LOSCFG_DRIVERS_HDF_LCD_ICN9700 =y

添加器件驱动

驱动路径:drivers/framework/model/display/driver/panel/mipi_icn9700.c

器件驱动加载入口:

struct HdfDriverEntry g_icn9700DevEntry = { .moduleVersion = 1, .moduleName = “LCD_ICN9700”, .Init = Icn9700EntryInit,};

器件驱动初始化及 Panel 注册:

int32_t Icn9700EntryInit(struct HdfDeviceObject *object){ struct Icn9700Dev *icn9700 = NULL; if (object == NULL) { HDF_LOGE(“%s: object is null”, __func__); return HDF_FAILURE; } icn9700 = (struct Icn9700Dev *)OsalMemCalloc(sizeof(struct Icn9700Dev)); if (icn9700 == NULL) { HDF_LOGE(“%s icn9700 malloc fail”, __func__); return HDF_FAILURE; } Icn9700PanelInit(&icn9700-》panel);

icn9700-》panel.object = object; icn9700-》reset_gpio = RESET_GPIO; icn9700-》reset_delay = 20; // delay 20ms object-》priv = (void *)icn9700; if (RegisterPanel(&icn9700-》panel) != HDF_SUCCESS) { HDF_LOGE(“%s: RegisterPanel failed”, __func__); return HDF_FAILURE; } HDF_LOGI(“%s: exit succ”, __func__); return HDF_SUCCESS;}

Panel Info 初始化:

static struct PanelInfo g_panelInfo = { .width = WIDTH, /* width */ .height = HEIGHT, /* height */ .hbp = HORIZONTAL_BACK_PORCH,

/* horizontal back porch */ .hfp = HORIZONTAL_FRONT_PORCH, /* horizontal front porch */ .hsw = HORIZONTAL_SYNC_WIDTH, /* horizontal sync width */ .vbp = VERTICAL_BACK_PORCH, /* vertical back porch */ .vfp = VERTICAL_FRONT_PORCH, /* vertical front porch */ .vsw = VERTICAL_SYNC_WIDTH, /* vertical sync width */ .frameRate = FRAME_RATE, /* frame rate */ .intfType = MIPI_DSI, /* panel interface type */ .intfSync = OUTPUT_USER,

/* output timing type */ /* mipi config info */ .mipi = { DSI_2_LANES, DSI_VIDEO_MODE, VIDEO_BURST_MODE, FORMAT_RGB_24_BIT }, /* backlight config info */ .blk = { BLK_PWM, MIN_LEVEL, MAX_LEVEL, DEFAULT_LEVEL }, .pwm = { BLK_PWM1, PWM_MAX_PERIOD },};

填充 Panel 信息并挂接回调接口:

static struct PanelEsd g_panelEsd = { .support = false, .checkFunc = Icn9700EsdCheckFunc,};static void Icn9700PanelInit(struct PanelData *panel){ panel-》info = &g_panelInfo; panel-》status.powerStatus = POWER_STATUS_OFF; panel-》status.currLevel = MIN_LEVEL; panel-》esd = &g_panelEsd; panel-》init = Icn9700Init; panel-》on = Icn9700On; panel-》off = Icn9700Off; panel-》setBacklight = Icn9700SetBacklight;}

Panel 亮屏接口实现:

static int32_t Icn9700On(struct PanelData *panel){ int32_t ret; struct Icn9700Dev *icn9700 = NULL; icn9700 = PanelToIcn9700Dev(panel); if (icn9700 == NULL) { HDF_LOGE(“%s: icn9700 is null”, __func__); return HDF_FAILURE; } /* lcd reset power on */ ret = LcdResetOn(icn9700); if (ret != HDF_SUCCESS) { HDF_LOGE(“%s: LcdResetOn failed”, __func__);

return HDF_FAILURE; } if (icn9700-》mipiHandle == NULL) { HDF_LOGE(“%s: mipiHandle is null”, __func__); return HDF_FAILURE;

} /* send mipi init code */ int32_t count = sizeof(g_OnCmd) / sizeof(g_OnCmd[0]); int32_t i; for (i = 0; i 《 count; i++) { ret = MipiDsiTx(icn9700-》mipiHandle, &(g_OnCmd[i])); if (ret != HDF_SUCCESS) { HDF_LOGE(“%s: MipiDsiTx failed”, __func__); return HDF_FAILURE; } } panel-》status.powerStatus = POWER_STATUS_ON; /* set mipi to hs mode */ MipiDsiSetHsMode(icn9700-》mipiHandle);

添加芯片适配驱动

驱动路径:

drivers/framework/model/display/driver/adapter_soc/hi35xx_disp.c

部分代码示例如下,mipi 参数配置:

static int32_t MipiDsiInit(struct PanelInfo *info){ int32_t ret; struct DevHandle *mipiHandle = NULL; struct MipiCfg cfg; mipiHandle = MipiDsiOpen(0); if (mipiHandle == NULL) { HDF_LOGE(“%s: MipiDsiOpen failed”, __func__); return HDF_FAILURE; } cfg.lane = info-》mipi.lane; cfg.mode = info-》mipi.mode;

cfg.format = info-》mipi.format; cfg.burstMode = info-》mipi.burstMode; cfg.timing.xPixels = info-》width;cfg.timing.hsaPixels = info-》hsw; cfg.timing.hbpPixels = info-》hbp; cfg.timing.hlinePixels = info-》width + info-》hbp + info-》hfp + info-》hsw; cfg.timing.vsaLines = info-》vsw; cfg.timing.vbpLines = info-》vbp;cfg.timing.vfpLines = info-》vfp; cfg.timing.ylines = info-》height; cfg.timing.edpiCmdSize = 0;cfg.pixelClk = CalcPixelClk(info);

cfg.phyDataRate = CalcDataRate(info); /* config mipi device */ ret = MipiDsiSetCfg(mipiHandle, &cfg); if (ret != HDF_SUCCESS) { HDF_LOGE(“%s:MipiDsiSetCfg failed”, __func__); } MipiDsiClose(mipiHandle); return ret;}

总结

本文简要说明了 HDF Display 驱动模型的整体架构、加载及运行流程、以及开发者基于此模型开发一款 LCD 驱动需要完成的基础适配工作。当前模型更多的是聚焦对各显示框架和差异化 SOC 的兼容适配,优先满足不同开发板的基本显示功能需求,驱动模型还在不断演进完善,欢迎持续关注。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1928

    浏览量

    88194
  • 模型
    +关注

    关注

    1

    文章

    3648

    浏览量

    51710
  • HarmonyOS
    +关注

    关注

    80

    文章

    2146

    浏览量

    35568

原文标题:OpenHarmony HDF Display驱动模型解析及移植指导

文章出处:【微信号:gh_e4f28cfa3159,微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    迅为RK3568开发板实操-HDF驱动配置UART

    /hdf_config/khdf/device_info/device_info.hcs 文件, device_info.hcs 中添加以下内容: 1、device3 :: deviceNode { 2
    的头像 发表于 06-27 15:58 431次阅读

    知识分享 | 评估模型架构——如何实现?

    确保良好的模型架构对于开发安全和可靠的软件非常重要。本文为您介绍MES Model Examiner® (MXAM)如何优化模型架构,简化复杂度管理步骤,并最终提升软件质量。
    的头像 发表于 06-05 11:46 458次阅读
    知识分享 | 评估<b class='flag-5'>模型</b><b class='flag-5'>架构</b>——如何实现?

    迅为RK3568开发板实操-HDF驱动配置UART-修改HCS配置

    deviceMatchAttr 的值表示驱动的私有配置信息 5 serviceName 表示服务名称,服务加载成功之后会在开发板的/dev/目录下生成节点。例如 HDF_PLATFORM_UART_9 后面跟着的数据 9 是
    发表于 05-22 11:32

    【北京迅为】iTOP-RK3568开发板鸿蒙OpenHarmony系统南向驱动开发实操-HDF驱动配置UART

    【北京迅为】iTOP-RK3568开发板鸿蒙OpenHarmony系统南向驱动开发实操-HDF驱动配置UART
    的头像 发表于 03-25 11:02 1287次阅读
    【北京迅为】iTOP-RK3568开发板鸿蒙OpenHarmony系统南向<b class='flag-5'>驱动</b>开发实操-<b class='flag-5'>HDF</b><b class='flag-5'>驱动</b>配置UART

    北京迅为iTOP-RK3568开发板OpenHarmony系统南向驱动开发实操-HDF驱动配置LED

    北京迅为iTOP-RK3568开发板OpenHarmony系统南向驱动开发实操-HDF驱动配置LED
    的头像 发表于 03-14 14:41 1102次阅读
    北京迅为iTOP-RK3568开发板OpenHarmony系统南向<b class='flag-5'>驱动</b>开发实操-<b class='flag-5'>HDF</b><b class='flag-5'>驱动</b>配置LED

    北京迅为RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构

    北京迅为RK3568开发板OpenHarmony系统南向驱动开发内核HDF驱动框架架构
    的头像 发表于 03-11 14:13 1557次阅读
    北京迅为RK3568开发板OpenHarmony系统南向<b class='flag-5'>驱动</b>开发内核<b class='flag-5'>HDF</b><b class='flag-5'>驱动</b>框架<b class='flag-5'>架构</b>

    请问stm32mp257如何修改设备树并加载驱动

    1、重新编译kernel容易报错,重新编译设备树也会报错。 2、加载驱动,编译环境应该对应,加载不成功。 3、想知道整体比方说,修改下IO,修改下设备树,加入一个应用程序。
    发表于 03-07 08:05

    请问为什么模型加载时间比CPU长?

    为什么模型加载时间比 CPU 长?
    发表于 03-06 06:03

    迅为RK3568开发板篇Openharmony配置HDF控制UART-实操-HDF驱动配置UART-修改HCS配置

    serviceName 表示服务名称,服务加载成功之后会在开发板的/dev/目录下生成节点。例如HDF_PLATFORM_UART_9 后面跟着的数据 9 是 UartOpen()的端口号
    发表于 02-21 10:53

    【「鸿蒙操作系统设计原理与架构」阅读体验】- 第5章阅读有感

    Ch5 驱动子系统原理解析 书中对 HarmonyOS 中的 HDF 驱动架构所画的这张图非常清晰的描述了 HDF 的设计思想。书中的描述
    发表于 02-02 00:34

    迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译

    编译内核时将该 HDF 驱动编译到镜像中,接下来编写驱动编译脚本 Makefile,代码如下所示: 加入编译体系,填加模块目录到 drivers/hdf_core/adapter/kh
    发表于 01-22 10:35

    迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-编写内核 LED HDF 驱动程序

    接下来编译 LED 驱动,该驱动用于在基于华为设备框架(HDF)的系统中控制 LED 灯的开关,完整代码如下所示: 更多内容可以关注:迅为RK3568开发板篇OpenHarmony
    发表于 01-17 15:13

    迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统

    hdf_led:子组件目录 app:led 应用层目录 ├── BUILD.gn:应用 APP 的 GN 文件 └── led_test.c:应用层 LED 测试程序 driver:内核 HDF 驱动
    发表于 01-13 15:59

    迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-配置创建私有配置文件

    私有配置文件,用来填写一些驱动的默认配置信息。HDF 框架在加载驱动时,会获取相应的配置信息并将其保存在 HdfDeviceObject 的 property 中。这些配置信息通过 B
    发表于 01-10 11:13

    迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-修改HCS硬件配置

    驱动的设备描述修改/vendor/hihope/rk3568/hdf_config/khdf/device_info/device_info.hcs 文件,添加如下代码,如下所示: 接下来解释一下
    发表于 01-08 15:25