OpenHarmony 实战开发——器件驱动移植

536 篇文章 8 订阅
425 篇文章 3 订阅

本章节讲解如何移植各类器件驱动。

LCD驱动移植

移植LCD驱动的主要工作是编写一个驱动,在驱动中生成模型的实例,并完成注册。

这些LCD的驱动被放置在源码目录//drivers/hdf_core/framework/model/display/driver/panel中。

  1. 创建Panel驱动

创建HDF驱动,在驱动初始化中调用RegisterPanel接口注册模型实例。如:

   int32_t LCDxxEntryInit(struct HdfDeviceObject *object)
   {
       struct PanelData *panel = CreateYourPanel();
       // 注册模型实例
       if (RegisterPanel(panel) != HDF_SUCCESS) {
           HDF_LOGE("%s: RegisterPanel failed", __func__);
           return HDF_FAILURE;
       }
       return HDF_SUCCESS;
   }
   
   struct HdfDriverEntry g_xxxxDevEntry = {
       .moduleVersion = 1,
       .moduleName = "LCD_XXXX",
       .Init = LCDxxEntryInit,
   };
   
   HDF_INIT(g_xxxxDevEntry);
  1. 配置加载panel驱动

    产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在display的host中,名为device_lcd的device中增加配置。

注意:
moduleName 要与panel驱动中的moduleName相同。

   root {
       ...
       display :: host {
           device_lcd :: device {
                   deviceN :: deviceNode {
                       policy = 0;
                       priority = 100;
                       preload = 2;
                       moduleName = "LCD_XXXX";
                   }
           }
       }
   }

TP驱动移植

本节描述如何移植触摸屏驱动。触摸屏的器件驱动被放置在源码目录//drivers/hdf_core/framework/model/input/driver/touchscreen中。 移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例。

  1. 创建触摸屏器件驱动

在上述touchscreen目录中创建名为touch_ic_name.c的文件。编写如下内容

   #include "hdf_touch.h"
   
   static int32_t HdfXXXXChipInit(struct HdfDeviceObject *device)
   {
       ChipDevice *tpImpl = CreateXXXXTpImpl();
       if(RegisterChipDevice(tpImpl) != HDF_SUCCESS) { // 注册ChipDevice模型
           ReleaseXXXXTpImpl(tpImpl);
           return HDF_FAILURE;
       }
       return HDF_SUCCESS;
   }
   
   struct HdfDriverEntry g_touchXXXXChipEntry = {
       .moduleVersion = 1,
       .moduleName = "HDF_TOUCH_XXXX", // 注意这里的moduleName要与后续的配置完全一致
       .Init = HdfXXXXChipInit,
   };
   
   HDF_INIT(g_touchXXXXChipEntry);

其中ChipDevice中要实现如下方法:

  1. 配置产品,加载器件驱动

    产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在名为input的host中,名为device_touch_chip的device中增加配置。

说明:
moduleName 要与触摸屏驱动中的moduleName相同。

   deviceN :: deviceNode {
       policy = 0;
       priority = 130;
       preload = 0;
       permission = 0660;
       moduleName = "HDF_TOUCH_XXXX";
       deviceMatchAttr = "touch_XXXX_configs";
   }

WLAN驱动移植

WLAN驱动分为两部分,一部分负责管理WLAN设备,另一个部分负责处理WLAN流量。

图1 OpenHarmony WLAN结构示意图

如图1,左半部分负责管理WLAN设备,右半部分负责WLAN流量。HDF WLAN分别为这两部分做了抽象,驱动的移植过程可以看做分别实现这两部分所需接口。这些接口有:

说明:
详细的接口开发指导,请参考WLAN开发。

具体的移植步骤如下:

  1. 创建HDF WLAN芯片驱动

在目录/device/vendor_name/peripheral/wifi/chip_name/创建文件hdf_wlan_chip_name.c。内容模板如下:

   static int32_t HdfWlanXXXChipDriverInit(struct HdfDeviceObject *device) {
       static struct HdfChipDriverFactory factory = CreateChipDriverFactory(); // 需要移植者实现的方法
       struct HdfChipDriverManager *driverMgr = HdfWlanGetChipDriverMgr();
       if (driverMgr->RegChipDriver(&factory) != HDF_SUCCESS) { // 注册驱动工厂
           HDF_LOGE("%s fail: driverMgr is NULL!", __func__);
           return HDF_FAILURE;
       }
       return HDF_SUCCESS;
   }
   
   struct HdfDriverEntry g_hdfXXXChipEntry = {
       .moduleVersion = 1,
       .Init = HdfWlanXXXChipDriverInit,
       .Release = HdfWlanXXXChipRelease,
       .moduleName = "HDF_WIFI_CHIP_XXX" // 注意:这个名字要与配置一致
   };
   
   HDF_INIT(g_hdfXXXChipEntry);

在上述代码的CreateChipDriverFactory方法中,需要创建一个HdfChipDriverFactory类型的对象。该对象提供如下方法:

其中Build方法负责创建一个管理指定网络接口的对象HdfChipDriver。该对象需要提供方法:

  1. 编写配置文件描述驱动支持的芯片

在产品配置目录下创建芯片的配置文件,保存至源码路径//vendor/vendor_name/product_name/config/wifi/wlan_chip_chip_name.hcs

该文件模板如下:

   root {
       wlan_config {
           chip_name :& chipList {
               chip_name :: chipInst {
                   match_attr = "hdf_wlan_chips_chip_name"; /* 这是配置匹配属性,用于提供驱动的配置根 */
                   driverName = "driverName"; /* 需要与HdfChipDriverFactory中的driverName相同*/
                   sdio {
                       vendorId = 0xXXXX; /* your vendor id */
                       deviceId = [0xXXXX]; /*your supported devices */
                   }
               }
           }
       }
   }

说明:

路径和文件中的vendor_name、product_name、chip_name请替换成实际名称。

vendorId 和 deviceId需要根据实际芯片的识别码进行填写。

  1. 编写配置文件,加载驱动

产品的所有设备信息被定义在源码文件//vendor/vendor_name/product_name/config/device_info/device_info.hcs中。修改该文件,在名为network的host中,名为device_wlan_chips的device中增加配置。模板如下:

   deviceN :: deviceNode {
       policy = 0;
       preload = 2;
       moduleName = "HDF_WLAN_CHIPS";
       deviceMatchAttr = "hdf_wlan_chips_chip_name";
       serviceName = "driverName";
   }

说明:
moduleName 要与HDF WLAN 芯片驱动中的moduleName相同。

  1. 修改Kconfig文件,让移植的WLAN模组出现再内核配置中

device/vendor_name/drivers/Kconfig中增加配置菜单,模板如下

   config DRIVERS_HDF_WIFI_chip_name
       bool "Enable chip_name Host driver"
       default n
       depends on DRIVERS_HDF_WLAN   help
         Answer Y to enable chip_name Host driver.

说明:
请替换模板中的chip_name为实际的芯片名称。

  1. 修改构建脚本,让驱动参与内核构建

    在源码文件//device/vendor_name/drivers/lite.mk末尾追加如下内容。

   ifeq ($(LOSCFG_DRIVERS_HDF_WIFI_chip_name), y)
       # 构建完成要链接一个叫hdf_wlan_chipdriver_chip_name的对象,建议按这个命名,防止冲突
       LITEOS_BASELIB += -lhdf_wlan_chipdriver_chip_name
       # 增加构建目录gpio
       LIB_SUBDIRS    += ../peripheral/wifi/chip_name
   endif

说明:
请替换模板中的chip_name为实际的芯片名称。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA(Field-Programmable Gate Array)是一种可编程逻辑器件,它能够在电路中实现各种数字逻辑功能。Verilog语言则是一种硬件描述语言,用于描述数字系统的行为和结构。本文将通过基于Altera EP4CE10(一款FPGA芯片)进行的FPGA Verilog开发实战指南,向读者介绍如何使用Verilog语言开发FPGA应用。 首先,选择合适的开发工具,例如Altera Quartus Prime软件。在Quartus中,创建一个新的工程,并添加Verilog源文件,用于编写FPGA应用的逻辑代码。在编写代码时,需要了解基本的Verilog语法和模块化设计的原则。 接下来,将FPGA芯片选项设置为Altera EP4CE10,并进行引脚分配。引脚分配是将逻辑信号与FPGA芯片引脚相连接的过程。确保正确地将输入和输出信号与特定引脚相连接,以实现所需的功能。 然后,进行逻辑编译和映射。逻辑编译将Verilog代码转换为低级逻辑网表,并进行逻辑优化。映射阶段将逻辑网表映射到FPGA芯片中的逻辑单元和开关资源。 在映射之后,进行时序分析和布线。时序分析用于验证设计在时序要求下的正确性,以确保信号传输的稳定性和准确性。布线是将逻辑资源与FPGA芯片中的物理资源相互连接的过程。 最后,进行编程和调试。将生成的比特流文件下载到FPGA芯片中,并进行信号调试和性能优化。通过使用逻辑分析仪等工具,可以检查信号的波形和逻辑的正确性,并根据需要进行调整和改进。 在进行FPGA Verilog开发实战时,需要具备较好的数字电路基础和Verilog语言掌握程度。通过实践和经验积累,不断提升对FPGA开发的理解和技能,才能开发出高效和可靠的FPGA应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值