当前位置: 首页 > news >正文

OprnHarmony驱动开发:外设器件HDF驱动移植规范

驱动移植

SoC芯片平台HDF驱动移植

驱动适配相关文件放置在drivers/adapter/platform中,对应有gpioi2cpwmspiuartwatchdog,都是通过HDF机制加载,本章节以gpio为例进行详细说明。

GPIO驱动适配

gpio驱动适配需要完成编译的适配、源码的适配。

//drivers/adapter/platform/gpio/BUILD.gn文件中,描述了恒玄gpio驱动的编译适配。如下:

module_switch = defined(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO)	 --- 如果打开HDF的GPIO配置开关,才进行如下编译
module_name = get_path_info(rebase_path("."), "name")hdf_driver(module_name) {sources = []if (defined(LOSCFG_SOC_COMPANY_BESTECHNIC)) {				 --- 如果打开恒玄的芯片配置开关,才进行恒玄GPIO的驱动编译sources += [ "gpio_bes.c" ]}include_dirs = [ "." ]
}

//drivers/adapter/platform/gpio/gpio_bes.c文件中,描述了恒玄gpio驱动的源码适配。 首先,按照OpenHarmonyHDF驱动框架加载驱动基本适配框架,如下:

struct HdfDriverEntry g_GpioDriverEntry = {.moduleVersion = 1,.moduleName = "BES_GPIO_MODULE_HDF",.Bind = GpioDriverBind,.Init = GpioDriverInit,.Release = GpioDriverRelease,
};
HDF_INIT(g_GpioDriverEntry); 	 --- 通过HDF_INIT 加载GPIO驱动

然后,在初始化的时候会获取hcs参数进行初始化,如下:

static int32_t GpioDriverInit(struct HdfDeviceObject *device)
{int32_t ret;struct GpioCntlr *gpioCntlr = NULL;if (device == NULL) {HDF_LOGE("%s: device is NULL", __func__);return HDF_ERR_INVALID_PARAM;}gpioCntlr = GpioCntlrFromDevice(device); 	 --- gpioCntlr节点变量就可以获取具体gpio配置if (gpioCntlr == NULL) {...

编码规范和设计思想见bes 驱动适配PR。

Board外设器件HDF驱动移植

Board外设器件表示通过SoC平台总线连接的外设器件,在本案例中,显示屏属于外设器件,其驱动适配放在//device/board/fnlink/drivers/liteos_m目录中。

显示驱动适配

SoC驱动适配,在//device/board/fnlink/drivers/liteos_m/display/BUILD.gn文件中,根据hdf_driver模板加载驱动模块,如下:

module_name = get_path_info(rebase_path("."), "name")
hdf_driver(module_name) {sources = ["zzw395.c",]include_dirs = ["//drivers/peripheral/display/interfaces/include",...]
}

//device/board/fnlink/drivers/liteos_m/display/zzw395.c文件中,根据驱动框架加载显示驱动,如下:

static struct HdfDriverEntry g_ZZW395DriverEntry = {.moduleVersion = 1,.moduleName = "HDF_PANEL_ZZW395",.Bind = PanelDriverBind,.Init = PanelDriverInit,.Release = PanelDriverRelease,
};HDF_INIT(g_ZZW395DriverEntry);

其中的驱动参数根据hcs配置,在PanelDriverInit初始化时加载,如下:

static int32_t PanelDriverInit(struct HdfDeviceObject *object)
{if (object == NULL) {return HDF_FAILURE;}HDF_LOGD("%s entry !!!", __func__);if (object->property) {if (PanelGetResource(&priv, object->property) != HDF_SUCCESS) {HDF_LOGE("%s: PanelGetResource failed", __func__);return HDF_FAILURE;}}
...

http://www.mrgr.cn/news/15155.html

相关文章:

  • Python和PySide6实现分别实现tcp通信。
  • SpringBoot 实战:SpringBoot整合Flink CDC,实时追踪mysql数据变动
  • SprinBoot+Vue餐厅点餐系统的设计与实现
  • 深度学习速通系列:贝叶思SVM
  • 操作系统:哪些函数属于系统调用?
  • DataWhale夏令营:Task2:建模方案解读与进阶
  • 微服务中间件之Nacos-安装篇
  • useeffect和uselayout区别
  • docker安装minio
  • DevOps实现CI/CD实战(三)- 集成Sonar Qube
  • EmguCV学习笔记 VB.Net 7.2 特征点检测
  • webgl入门
  • 最佳实践:Typora+docusaurus完美解决(云笔记+知识库+博客)需求
  • JVM 方法区存放那些内容
  • Redis 安装
  • 绕过后端校验的策略
  • Python Socket 服务:深入解析与使用技巧
  • 【数仓建模过程】Spark数据清洗篇
  • FPGA中的存储器--学习笔记
  • MySQL集群