【移植】小型系统平台驱动移植

往期知识点记录:

平台驱动移植

在这一步,我们会在源码目录 //device/vendor_name/soc_name/drivers 目录下创建平台驱动,如果你要移植的 SOC 的厂商还没有创建仓库的话,请联系 sig_devboard 创建。

建议的目录结构:

复制代码
device
├── vendor_name
│   ├── drivers
│   │   │   ├── common
│   │   │   ├── Kconfig # 厂商驱动内核菜单入口
│   │   │   └── lite.mk # 构建的入口
│   ├── soc_name
│   │   ├── drivers
│   │   │   ├── dmac
│   │   │   ├── gpio
│   │   │   ├── i2c
│   │   │   ├── LICENSE
│   │   │   ├── mipi_dsi
│   │   │   ├── mmc
│   │   │   ├── pwm
│   │   │   ├── README.md # docs 如果需要的话
│   │   │   ├── README_zh.md
│   │   │   ├── rtc
│   │   │   ├── spi
│   │   │   ├── uart
│   │   │   └── watchdog
│   ├── board_name

HDF 为所有的平台驱动都创建了驱动模型,移植平台驱动的主要工作是向模型注入实例。 这些模型你可以在源码目录 //drivers/hdf_core/framework/support/platform/include 中找到定义。

本节我们会以 GPIO 为例,讲解如何移植平台驱动,移植过程包含以下步骤:

  1. 创建 GPIO 驱动
    在源码目录 //device/vendor_name/soc_name/drivers/gpio 中创建文件 soc_name_gpio.c。内容模板如下:

    复制代码
     #include "gpio_core.h"
     // 定义GPIO结构体,如果需要的话
     struct SocNameGpioCntlr {
         struct GpioCntlr cntlr;  // 这是HDF GPIO驱动框架需要的结构体
         int myData; // 以下是当前驱动自身需要的
     };
     // Bind 方法在HDF驱动中主要用户对外发布服务,这里我们不需要,直接返回成功即可
     static int32_t GpioBind(struct HdfDeviceObject *device)
     {
         (void)device;
         return HDF_SUCCESS;
     }
     // Init方法时驱动初始化的入口,我们需要在Init方法中完成模型实例的注册
     static int32_t GpioInit(struct HdfDeviceObject *device)
     {
         SocNameGpioCntlr *impl = CreateGpio(); // 你的创建代码
         ret = GpioCntlrAdd(&impl->cntlr);  // 注册GPIO模型实例
         if (ret != HDF_SUCCESS) {
             HDF_LOGE("%s: err add controller:%d", __func__, ret);
             return ret;
         }
         return HDF_SUCCESS;
     }
     // Release方法会在驱动卸载时被调用,这里主要完成资源回收
     static void GpioRelease(struct HdfDeviceObject *device)
     {
         // GpioCntlrFromDevice 方法能从抽象的设备对象中获得init方法注册进去的模型实例。
         struct GpioCntlr *cntlr = GpioCntlrFromDevice(device);
         //资源释放...
     }
     struct HdfDriverEntry g_gpioDriverEntry = {
         .moduleVersion = 1,
         .Bind = GpioBind,
         .Init = GpioInit,
         .Release = GpioRelease,
         .moduleName = "SOC_NAME_gpio_driver", // 这个名字我们稍后会在配置文件中用到,用来加载驱动。
     };
     HDF_INIT(g_gpioDriverEntry); // 注册一个GPIO的驱动入口
  2. 创建厂商驱动构建入口
    如前所述 device/vendor_name/drivers/lite.mk 是厂商驱动的构建的入口。我们需要从这个入口开始,进行构建。

    复制代码
     #文件device/vendor_name/drivers/lite.mk
     SOC_VENDOR_NAME := $(subst $/",,$(LOSCFG_DEVICE_COMPANY))
     SOC_NAME := $(subst $/",,$(LOSCFG_PLATFORM))
     BOARD_NAME := $(subst $/",,$(LOSCFG_PRODUCT_NAME))
     # 指定SOC进行构建
     LIB_SUBDIRS += $(LITEOSTOPDIR)/../../device/$(SOC_VENDOR_NAME)/$(SOC_NAME)/drivers/
  3. 创建 SOC 驱动构建入口

    复制代码
     #文件device/vendor_name/soc_name/drivers/lite.mk
     SOC_DRIVER_ROOT := $(LITEOSTOPDIR)/../../device/$(SOC_VENDOR_NAME)/$(SOC_NAME)/drivers/
     # 判断如果打开了GPIO的内核编译开关
     ifeq ($(LOSCFG_DRIVERS_HDF_PLATFORM_GPIO), y)
         # 构建完成要链接一个叫hdf_gpio的对象
         LITEOS_BASELIB += -lhdf_gpio
         # 增加构建目录gpio
         LIB_SUBDIRS    += $(SOC_DRIVER_ROOT)/gpio 
     endif
     # 后续其他驱动在此基础上追加
  4. 创建 GPIO 构建入口

    复制代码
     include $(LITEOSTOPDIR)/config.mk
     include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk
     # 指定输出对象的名称,注意要与SOC驱动构建入口里的LITEOS_BASELIB 保持一致
     MODULE_NAME := hdf_gpio
     # 增加HDF框架的INCLUDE
     LOCAL_CFLAGS += $(HDF_INCLUDE)
     # 要编译的文件
     LOCAL_SRCS += soc_name_gpio.c
     # 编译参数
     LOCAL_CFLAGS += -fstack-protector-strong -Wextra -Wall -Werror -fsigned-char -fno-strict-aliasing -fno-common
     include $(HDF_DRIVER)
  5. 配置产品加载驱动
    产品的所有设备信息被定义在源码文件 //vendor/vendor_name/product_name/config/device_info/device_info.hcs 中。
    平台驱动请添加到 platform 的 host 中。

说明:

moduleName 要与驱动定义中的相同。

复制代码
root {
    ...
    platform :: host {
        device_gpio :: device {
                device0 :: deviceNode {
                    policy = 0;
                    priority = 10;
                    permission = 0644;
                    moduleName = "SOC_NAME_gpio_driver"; 
                }
        }
    }
}

最后

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview

如何快速入门?

1.基本概念

2.构建第一个ArkTS应用

3.......

鸿蒙开发面试真题(含参考答案):

《OpenHarmony源码解析》:

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ......
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ......

OpenHarmony 设备开发学习手册 :https://gitcode.com/HarmonyOS_MN/733GH/overview


相关推荐
ltl1 小时前
向量库与图 RAG:HNSW、DiskANN 到 GraphRAG
linux
OH_TPC1 小时前
HarmonyOS APP开发---“滤镜大师“图像处理App,需要用到这个库
java·图像处理·华为·harmonyos·鸿蒙
学代码的CJY2 小时前
Linux 库制作与原理:静态库、动态库、ELF 与动态链接完全指南
linux·运维·服务器
沸速存储2 小时前
CPU 和 GPU 核心差别在哪?为什么 AI 训练离不开 GPU
服务器·人工智能·科技·嵌入式硬件·电脑
呱呱巨基3 小时前
Linux 查找命令
linux·笔记·学习·查找命令
basketball6163 小时前
软考中级网络工程师 第4章 无线通信网 备考总结
linux·服务器·网络·网络工程师·软考
我不会JAVA!4 小时前
【无标题】
嵌入式硬件·h.264
芯岭技术郦4 小时前
OM6625A芯片 Timer 定时器计数模式使用说明
stm32·单片机·嵌入式硬件
好评1244 小时前
【Linux】进程信号
linux·运维·服务器
zhangrelay4 小时前
ROS 2 Lyrical 第4章 URDF机器人建模与Gazebo Garden仿真
linux·笔记·学习·ubuntu·机器人·ros2