Linux内核增加HDF驱动子系统
<p><img title="Linux内核增加HDF驱动子系统" alt="Linux内核增加HDF驱动子系统" border="0" src="https://zhuji.jb51.net/uploads/img/202305/3f69795692b92fa263d9c11c245bc745.jpg"></p>
<h3>
前言</h3>
<p>
HDF驱动子系统是OpenHarmony重要的特色功能之一,其主要的功能是实现驱动程序在多内核多平台的物联网环境,实现一次驱动开发,多端部署。之前移植OHOS3.0使用了传统的linux驱动,比较遗憾,今天尝试将HDF驱动子系统加入编译框架。开始前先了解几个名词。</p>
<p>
HCS(HDF Configuration Source)是 HDF 驱动框架的配置描述源码,JSON存储。</p>
<p>
HC-GEN(HDF Configuration Generator)是 HCS 配置转换工具,可以将 HDF 配置文件HCS转换为二进制HCB。</p>
<p>
HCB(HDF Configuration Binary)二进制文件,驱动可使用 HDF 框架提供的配置解析接口获取配置。</p>
<h3>
内核打补丁</h3>
<p>
如何在内核加入HDF驱动,linux内核下主要实现是下面两个目录:</p>
<p>
drivers\adapter\khdf\linux 和 drivers\framework</p>
<p>
这两个目录是通过链接的方式加入到内核编译的,流程如下:</p>
<p>
kernel\linux\build\kernel.mk:75</p>
<ol class="dp-sql">
<li class="alt">
<span><span>$(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(HDF_PATCH_FILE) && patch -p1 < $(DEVICE_PATCH_FILE) </span></span>
</li>
</ol>
<p>
可以参考3516的HDF补丁:kernel\linux\patches\linux-5.10\hi3516dv300_patch\hdf.patch</p>
<ol class="dp-sql">
<li class="alt">
<span><span>patching file drivers/Kconfig </span></span>
</li>
<li>
<span>patching file drivers/Makefile </span>
</li>
<li class="alt">
<span>patching file drivers/hdf/Makefile </span>
</li>
<li>
<span>patching symbolic link drivers/hdf/framework </span>
</li>
<li class="alt">
<span>patching symbolic link drivers/hdf/khdf </span>
</li>
<li>
<span>patching symbolic link include/hdf </span>
</li>
<li class="alt">
</li>
<li>
<span># 添加到linux内核的补丁 </span>
</li>
<li class="alt">
<span>drivers/hdf/framework -> /drivers/framework/ # 驱动子系统驱动框架、配置管理、配置解析、驱动通用框架模型、硬件通用平台能力接口等 </span>
</li>
<li>
<span>drivers/hdf/khdf -> /drivers/adapter/khdf/linux/ # 在linux内核中部署OpenHarmony驱动框架 </span>
</li>
<li class="alt">
<span>drivers/hdf/Makefile # 由hdf.patch提供 </span>
</li>
<li>
<span>include/hdf -> /drivers/framework/include/ # 驱动框架对外提供能力的头文件 </span>
</li>
</ol>
<h3>
内核配置</h3>
<p>
只是打上补丁还不行,还得在内核的编译配置文件中加入HDF选项。最开始的做法就是参考3516的配置选择,但是发现有些配置会导致编译失败。测试发现下面的配置是可以编译成功的。</p>
<ol class="dp-sql">
<li class="alt">
<span><span>[*] Enable HDF manager </span></span>
</li>
<li>
<span>(2) <span class="keyword">Set</span><span> HDF support platform </span></span>
</li>
<li class="alt">
<span>[*] Enable HDF platform driver </span>
</li>
<li>
<span>[*] Enable HDF platform mipi dsi driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF platform gpio driver </span>
</li>
<li>
<span>[*] Enable HDF platform i2c driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF platform watchdog driver </span>
</li>
<li>
<span>[*] hi35xx pwm driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF platform pwm driver </span>
</li>
<li>
<span>[*] Enable HDF platform uart driver </span>
</li>
<li class="alt">
<span>[ ] Enable HDF platform sdio driver </span>
</li>
<li>
<span>[ ] Enable HDF platform emmc driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF platform mmc driver </span>
</li>
<li>
<span>[*] Enable HDF platform spi driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF platform rtc driver </span>
</li>
<li>
<span>[*] Enable HDF linux test </span>
</li>
<li class="alt">
<span>[*] Enable HDF Display driver </span>
</li>
<li>
<span>[ ] Enable HDF Lcdkit driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF Icn9700 driver </span>
</li>
<li>
<span>[ ] Enable HDF St7789 driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF input driver </span>
</li>
<li>
<span>[*] Enable HDF tp 5P5 GT911 driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF tp 2P35 FT6236 driver </span>
</li>
<li>
<span>[ ] Enable HDF wifi </span>
</li>
<li class="alt">
<span>[ ] Enable HDF Bluetooth </span>
</li>
<li>
<span>[*] Enable HDF sensor driver </span>
</li>
<li class="alt">
<span>[ ] Enable HDF accel sensor driver </span>
</li>
<li>
<span>[ ] Enable HDF gyro sensor driver </span>
</li>
<li class="alt">
<span>[ ] Enable HDF barometer sensor driver </span>
</li>
<li>
<span>[ ] Enable HDF hall sensor driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF storage driver </span>
</li>
<li>
<span>[ ] Enable HDF USB PNP Notify driver </span>
</li>
<li class="alt">
<span>[ ] Enable F_GENERIC driver </span>
</li>
<li>
<span>[ ] Enable HDF Audio driver </span>
</li>
<li class="alt">
<span>[*] Enable HDF vibrator driver </span>
</li>
<li>
<span>[*] Enable HDF linear vibrator driver </span>
</li>
<li class="alt">
<span>[ ] Enable HDF dsoftbus driver </span>
</li>
<li>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF=y </span>
</li>
<li>
<span>CONFIG_HDF_SUPPORT_LEVEL=2 </span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_PLATFORM=y </span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI=y </span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y </span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_PLATFORM_I2C=y </span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_PLATFORM_WATCHDOG=y </span>
</li>
<li>
<span>CONFIG_PWM_HI35XX=y </span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_PLATFORM_PWM=y </span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_PLATFORM_UART=y </span>
</li>
<li class="alt">
<span># CONFIG_DRIVERS_HDF_PLATFORM_SDIO <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_PLATFORM_EMMC <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_PLATFORM_MMC=y </span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_PLATFORM_SPI=y </span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_PLATFORM_RTC=y </span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_TEST=y </span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_DISP=y </span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_LCDKIT <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_LCD_ICN9700=y </span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_LCD_ST7789 <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_INPUT=y </span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_TP_5P5_GT911=y </span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_TP_2P35_FT6236=y </span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_WIFI <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span># CONFIG_DRIVERS_HDF_BT <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_SENSOR=y </span>
</li>
<li class="alt">
<span># CONFIG_DRIVERS_HDF_SENSOR_ACCEL <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_SENSOR_GYRO <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span># CONFIG_DRIVERS_HDF_SENSOR_BAROMETER <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_SENSOR_HALL <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_STORAGE=y </span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_USB_PNP_NOTIFY <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span># CONFIG_DRIVERS_HDF_USB_F_GENERIC <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li>
<span># CONFIG_DRIVERS_HDF_AUDIO <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li class="alt">
<span>CONFIG_DRIVERS_HDF_VIBRATOR=y </span>
</li>
<li>
<span>CONFIG_DRIVERS_HDF_VIBRATOR_LINEAR=y </span>
</li>
<li class="alt">
<span># CONFIG_DRIVERS_HDF_DSOFTBUS <span class="keyword">is</span><span> </span><span class="op">not</span><span> </span><span class="keyword">set</span><span> </span></span>
</li>
<li>
<span># <span class="keyword">end</span><span> </span><span class="keyword">of</span><span> Device Drivers </span></span>
</li>
</ol>
<p>
[*] Enable HDF linux test 是需要设置的,如果没有设置CONFIG_DRIVERS_HDF_TEST,目录结构就出问题了,会报这样的错误。</p>
<ol class="dp-sql">
<li class="alt">
<span><span>drivers/hdf/khdf/Makefile:22: PRODUCT_PATH=vendor/raspberrypi/RPI4B </span></span>
</li>
<li>
<span>scripts/Makefile.build:44: drivers/hdf/khdf/../../../../vendor/raspberrypi/RPI4B/hdf_config/Makefile: <span class="keyword">No</span><span> such file </span><span class="op">or</span><span> directory </span></span>
</li>
<li class="alt">
<span>make: *** <span class="keyword">No</span><span> </span><span class="keyword">rule</span><span> </span><span class="keyword">to</span><span> make target </span><span class="string">'drivers/hdf/khdf/../../../../vendor/raspberrypi/RPI4B/hdf_config/Makefile'</span><span>. Stop. </span></span>
</li>
<li>
<span>CC drivers/net/wireless/mac80211_hwsim.o </span>
</li>
<li class="alt">
<span>make: *** Error 2 </span>
</li>
<li>
<span>make: *** Error 2 </span>
</li>
<li class="alt">
<span>make: *** Error 2 </span>
</li>
<li>
<span>make: *** Waiting <span class="keyword">for</span><span> unfinished jobs.... </span></span>
</li>
</ol>
<p>
下面3个选项要关闭,不然会报下面的错误。</p>
<p>
[ ] Enable HDF platform sdio driver</p>
<p>
[ ] Enable HDF platform emmc driver</p>
<p>
[ ] Enable HDF wifi</p>
<ol class="dp-sql">
<li class="alt">
<span><span>drivers/../../../../../../drivers/adapter/khdf/linux/platform/sdio/sdio_adapter.o: </span><span class="op">In</span><span> </span><span class="keyword">function</span><span> `Hi35xxLinuxSdioRescan': </span></span>
</li>
<li>
<span>sdio_adapter.c:(.text+0x20): undefined reference <span class="keyword">to</span><span> `hisi_sdio_rescan' </span></span>
</li>
<li class="alt">
<span>sdio_adapter.c:(.text+0x34): undefined reference <span class="keyword">to</span><span> `himci_get_mmc_host' </span></span>
</li>
<li>
<span>drivers/../../../../../../drivers/adapter/khdf/linux/platform/sdio/sdio_adapter.o: <span class="op">In</span><span> </span><span class="keyword">function</span><span> `Hi35xxLinuxSdioFindFunc': </span></span>
</li>
<li class="alt">
<span>sdio_adapter.c:(.text+0xc84): undefined reference <span class="keyword">to</span><span> `himci_get_mmc_host' </span></span>
</li>
<li>
<span>sdio_adapter.c:(.text+0xc9c): undefined reference <span class="keyword">to</span><span> `himci_get_mmc_host' </span></span>
</li>
<li class="alt">
<span>sdio_adapter.c:(.text+0xcb4): undefined reference <span class="keyword">to</span><span> `himci_get_mmc_host' </span></span>
</li>
<li>
<span>drivers/../../../../../../drivers/adapter/khdf/linux/platform/emmc/emmc_adapter.o: <span class="op">In</span><span> </span><span class="keyword">function</span><span> `Hi35xxLinuxEmmcBind': </span></span>
</li>
<li class="alt">
<span>emmc_adapter.c:(.text+0x214): undefined reference <span class="keyword">to</span><span> `himci_get_mmc_host' </span></span>
</li>
<li>
<span>drivers/../../../../../../device/hisilicon/drivers/wifi/driver/hi3881/oal/oal_sdio_host.o: <span class="op">In</span><span> </span><span class="keyword">function</span><span> `sdio_card_detect_change': </span></span>
</li>
<li class="alt">
<span>oal_sdio_host.c:(.text+0x2ce8): undefined reference <span class="keyword">to</span><span> `hisi_sdio_rescan' </span></span>
</li>
<li>
<span>make: *** Error 1 </span>
</li>
<li class="alt">
<span>make: Leaving directory <span class="string">'/home/liangzili/ohos/out/KERNEL_OBJ/kernel/src_tmp/linux-5.10'</span><span> </span></span>
</li>
<li>
<span>make: *** Error 2 </span></span>
</li>
<li class="alt">
<span>ninja: build stopped: subcommand failed. </span>
</li>
</ol>
<h3>
编译过程</h3>
<p>
为了方便测试可以单独进行内核编译,比如我的编译命令是这样的。</p>
<ol class="dp-sql">
<li class="alt">
<span><span>./build.sh </span><span class="comment">--product-name RPI4B --ccache --build-target raspberrypi_products</span><span> </span></span>
</li>
</ol>
<p>
可以分析下HDF这部分的编译过程。</p>
<p>
linux-5.10\drivers\hdf\Makefile,hdf.patch会添加这个Makefile,将khdf文件夹加入编译。</p>
<ol class="dp-sql">
<li class="alt">
<span><span>obj-$(CONFIG_DRIVERS_HDF) += khdf/ </span></span>
</li>
</ol>
<p>
linux-5.10\drivers\hdf\khdf\Makefile</p>
<ol class="dp-sql">
<li class="alt">
<span><span>export HDF_ROOT := drivers/hdf </span></span>
</li>
<li>
<span>obj-$(CONFIG_DRIVERS_HDF) += osal/ </span>
</li>
<li class="alt">
<span>obj-$(CONFIG_DRIVERS_HDF) += network/ </span>
</li>
<li>
<span>obj-$(CONFIG_DRIVERS_HDF) += config/ </span>
</li>
<li class="alt">
</li>
<li>
<span>SUPPORT_LEVEL_STD_H := $(shell [ <span class="string">"$(CONFIG_HDF_SUPPORT_LEVEL)"</span><span> -ge 2 ] && echo </span><span class="keyword">true</span><span>) </span></span>
</li>
<li class="alt">
</li>
<li>
<span>$(warning PRODUCT_PATH=$(PRODUCT_PATH)) # 会检查PRODUCT_PATH变量 </span>
</li>
<li class="alt">
<span>ifeq ($(PRODUCT_PATH),) </span>
</li>
<li>
<span>$(error PRODUCT_PATH <span class="op">not</span><span>) </span></span>
</li>
<li class="alt">
<span>endif </span>
</li>
<li>
</li>
<li class="alt">
<span># 这里有条注释指明了*.hcs配置文件的存放路径 </span>
</li>
<li>
<span># <span class="keyword">for</span><span> L2+, hcs config should </span><span class="op">in</span><span> vendor/product_company/product_name/config/khdf </span></span>
</li>
<li class="alt">
<span>ifeq ($(SUPPORT_LEVEL_STD_H), <span class="keyword">true</span><span>) </span></span>
</li>
<li>
<span>SUB_DIR:=khdf/ </span>
</li>
<li class="alt">
<span>endif </span>
</li>
<li>
</li>
<li class="alt">
<span># HDF test的配置会使hcs目录结构不一样,我当时没有设置CONFIG_DRIVERS_HDF_TEST就掉这个坑里了。 </span>
</li>
<li>
<span>ifeq ($(CONFIG_DRIVERS_HDF), y) </span>
</li>
<li class="alt">
<span>ifeq ($(CONFIG_DRIVERS_HDF_TEST), y) </span>
</li>
<li>
<span>obj-$(CONFIG_DRIVERS_HDF) += ../../../../$(PRODUCT_PATH)/hdf_config/$(SUB_DIR)/hdf_test/ </span>
</li>
<li class="alt">
<span>obj-$(CONFIG_DRIVERS_HDF) += test/ </span>
</li>
<li>
<span><span class="keyword">else</span><span> </span></span>
</li>
<li class="alt">
<span>obj-$(CONFIG_DRIVERS_HDF) += ../../../../$(PRODUCT_PATH)/hdf_config/$(SUB_DIR) </span>
</li>
<li>
<span>endif </span>
</li>
<li class="alt">
<span>endif </span>
</li>
<li>
<span># ... 后面按照配置添加一些编译目录 ... </span>
</li>
</ol>
<p>
drivers\adapter\khdf\linux\Makefile:会调用 obj-(CONFIG_DRIVERS_HDF) += ../../../../(CONFIGDRIVERSHDF)+=../../../../(PRODUCT_PATH)/hdf_config/$(SUB_DIR)/hdf_test/ 这是OHOS3.0默认的HCS文件存放路径。官方的注释也说明了,所以将设备对应的*.hcs存放到 vendor\raspberrypi\RPI4B\hdf_config\khdf 文件夹,参考 3516 的 vendor\hisilicon\Hi3516DV300\hdf_config\khdf\hdf.hcs 就可了。</p>
<ol class="dp-sql">
<li class="alt">
<span><span>#include </span><span class="string">"device_info/device_info.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"platform/i2c_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"platform/hi35xx_watchdog_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"platform/hi35xx_pwm_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"platform/hi35xx_uart_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"platform/sdio_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"platform/emmc_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"platform/hi35xx_spi_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"input/input_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"wifi/wlan_platform.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"wifi/wlan_chip_hi3881.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"sensor/sensor_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"audio/audio_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"audio/codec_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"audio/dai_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"audio/dma_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"audio/dsp_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"vibrator/vibrator_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
<span>#include <span class="string">"vibrator/linear_vibrator_config.hcs"</span><span> </span></span>
</li>
<li>
<span>#include <span class="string">"lcd/lcd_config.hcs"</span><span> </span></span>
</li>
<li class="alt">
</li>
<li>
<span>root { </span>
</li>
<li class="alt">
<span>module = <span class="string">"hisilicon,hi35xx_chip"</span><span>; </span></span>
</li>
<li>
<span>} </span>
</li>
</ol>
<p>
参考 3516 的 vendor\hisilicon\Hi3516DV300\hdf_config\khdf\Makefile</p>
<p>
其中:PRODUCT_PATH环境变量的来源:kernel/linux/build/kernel_module_build.sh:42:export PRODUCT_PATH=$4</p>
<ol class="dp-sql">
<li class="alt">
<span><span>ifeq ($(LOCAL_HCS_ROOT),) </span></span>
</li>
<li>
<span>LOCAL_HCS_ROOT := $(PRODUCT_PATH) </span>
</li>
<li class="alt">
<span>endif </span>
</li>
<li>
</li>
<li class="alt">
<span>SOURCE_ROOT:=$(abspath ../../../../../) </span>
</li>
<li>
</li>
<li class="alt">
<span>HC_GEN_DIR := $(abspath $(SOURCE_ROOT)/drivers/framework/tools/hc-gen) </span>
</li>
<li>
<span>HC_GEN := $(HC_GEN_DIR)/build/hc-gen </span>
</li>
<li class="alt">
<span>LOCAL_HCS_ROOT := $(abspath $(dir $(realpath $(lastword $(MAKEFILE_LIST))))) </span>
</li>
<li>
</li>
<li class="alt">
<span>HCS_DIR := $(LOCAL_HCS_ROOT) </span>
</li>
<li>
</li>
<li class="alt">
<span>ifneq ($(TARGET_BOARD_PLATFORM),) </span>
</li>
<li>
<span>HCS_DIR := $(LOCAL_HCS_ROOT)/$(TARGET_BOARD_PLATFORM) </span>
</li>
<li class="alt">
<span><span class="keyword">else</span><span> </span></span>
</li>
<li>
<span>ifneq ($(CONFIG_ARCH_HI3516DV300),) </span>
</li>
<li class="alt">
<span>HCS_DIR := $(LOCAL_HCS_ROOT) </span>
</li>
<li>
<span>endif </span>
</li>
<li class="alt">
<span>ifneq ($(CONFIG_ARCH_HI3518EV300),) </span>
</li>
<li>
<span>HCS_DIR := $(LOCAL_HCS_ROOT) </span>
</li>
<li class="alt">
<span>endif </span>
</li>
<li>
<span>endif </span>
</li>
<li class="alt">
<span>$(info HCS_DIR = $(HCS_DIR)) </span>
</li>
<li>
<span>HCB_FLAGS := -b -i -a </span>
</li>
<li class="alt">
</li>
<li>
<span>HCS_OBJ := hdf_hcs_hex.o </span>
</li>
<li class="alt">
<span>HCS_OBJ_SRC := $(subst .o,.c,$(notdir $(HCS_OBJ))) </span>
</li>
<li>
</li>
<li class="alt">
<span>CONFIG_GEN_HEX_SRC := $(addprefix $(LOCAL_HCS_ROOT)/, $(HCS_OBJ_SRC)) </span>
</li>
<li>
<span>CONFIG_HCS_SRC := $(subst _hcs_hex.o,.hcs,$(addprefix $(HCS_DIR)/, $(HCS_OBJ))) </span>
</li>
<li class="alt">
</li>
<li>
<span>$(obj)/$(HCS_OBJ): $(CONFIG_GEN_HEX_SRC) </span>
</li>
<li class="alt">
<span>$(Q)$(CC) $(c_flags) -c -o $@ $< </span>
</li>
<li>
<span>$(Q)rm -f $< </span>
</li>
<li class="alt">
</li>
<li>
<span>$(CONFIG_GEN_HEX_SRC): $(LOCAL_HCS_ROOT)/%_hcs_hex.c: $(HCS_DIR)/%.hcs | $(HC_GEN) </span>
</li>
<li class="alt">
<span>$(Q)echo gen hdf built-<span class="op">in</span><span> config </span></span>
</li>
<li>
<span>$(Q)if [ ! -d $(dir $@) ]; <span class="keyword">then</span><span> mkdir -p $(dir $@); fi </span></span>
</li>
<li class="alt">
<span>$(Q)$(HC_GEN) $(HCB_FLAGS) -o $(subst _hex.c,,$(@)) $< </span>
</li>
<li>
</li>
<li class="alt">
<span>$(CONFIG_GEN_SRCS): $(CONFIG_OUT_DIR)%.c: $(HCS_DIR)/%.hcs | $(HC_GEN) </span>
</li>
<li>
<span>$(Q)echo gen hdf driver config </span>
</li>
<li class="alt">
<span>$(Q)if [ ! -d $(dir $@) ]; <span class="keyword">then</span><span> mkdir -p $(dir $@); fi </span></span>
</li>
<li>
<span>$(Q)$(HC_GEN) -t -o $@ $< </span>
</li>
<li class="alt">
</li>
<li>
<span>$(HC_GEN): </span>
</li>
<li class="alt">
<span>$(HIDE)make -C $(HC_GEN_DIR) </span>
</li>
<li>
</li>
<li class="alt">
<span>obj-$(CONFIG_DRIVERS_HDF) += $(HCS_OBJ) </span>
</li>
</ol>
<h3>
查看结果</h3>
<p>
编译完成后,可以上传内核镜像到开发板,来查看HDF驱动框架是否启动成功。</p>
<p>
加入HDF前:</p>
<ol class="dp-sql">
<li class="alt">
<span><span># ls dev/ </span></span>
</li>
<li>
<span>__parameters__ hwrng tty1 tty28 tty46 tty7 </span>
</li>
<li class="alt">
<span>__trigger__ input tty10 tty29 tty47 tty8 </span>
</li>
<li>
<span>autofs kmsg tty11 tty3 tty48 tty9 </span>
</li>
<li class="alt">
<span>binder linux,cma tty12 tty30 tty49 ttyAMA0 </span>
</li>
<li>
<span>block loop-control tty13 tty31 tty5 ttyS0 </span>
</li>
<li class="alt">
<span>bus mem tty14 tty32 tty50 ttyprintk </span>
</li>
<li>
<span>cachefiles memcg tty15 tty33 tty51 unix </span>
</li>
<li class="alt">
<span><span class="keyword">char</span><span> </span><span class="op">null</span><span> tty16 tty34 tty52 urandom </span></span>
</li>
<li>
<span>console port tty17 tty35 tty53 vchiq </span>
</li>
<li class="alt">
<span>cpuctl ptmx tty18 tty36 tty54 vcs </span>
</li>
<li>
<span>cpuset pts tty19 tty37 tty55 vcs1 </span>
</li>
<li class="alt">
<span>dri random tty2 tty38 tty56 vcsa </span>
</li>
<li>
<span>fd rawctl tty20 tty39 tty57 vcsa1 </span>
</li>
<li class="alt">
<span>freezer snd tty21 tty4 tty58 vcsu </span>
</li>
<li>
<span>fscklogs stderr tty22 tty40 tty59 vcsu1 </span>
</li>
<li class="alt">
<span><span class="keyword">full</span><span> stdin tty23 tty41 tty6 vga_arbiter </span></span>
</li>
<li>
<span>gpiochip0 stdout tty24 tty42 tty60 vndbinder </span>
</li>
<li class="alt">
<span>gpiochip1 system tty25 tty43 tty61 watchdog </span>
</li>
<li>
<span>graphics tty tty26 tty44 tty62 watchdog0 </span>
</li>
<li class="alt">
<span>hwbinder tty0 tty27 tty45 tty63 zero </span>
</li>
</ol>
<p>
加入HDF后:</p>
<ol class="dp-sql">
<li class="alt">
<span><span># ls dev/ </span></span>
</li>
<li>
<span>HDF_PLATFORM_I2C_MANAGER loop-control tty24 tty54 </span>
</li>
<li class="alt">
<span>HDF_PLATFORM_UART_1 mem tty25 tty55 </span>
</li>
<li>
<span>HDF_TEST memcg tty26 tty56 </span>
</li>
<li class="alt">
<span>I2C_TEST <span class="op">null</span><span> tty27 tty57 </span></span>
</li>
<li>
<span>__parameters__ port tty28 tty58 </span>
</li>
<li class="alt">
<span>__trigger__ ptmx tty29 tty59 </span>
</li>
<li>
<span>autofs pts tty3 tty6 </span>
</li>
<li class="alt">
<span>binder random tty30 tty60 </span>
</li>
<li>
<span>block rawctl tty31 tty61 </span>
</li>
<li class="alt">
<span>bus sample_service tty32 tty62 </span>
</li>
<li>
<span>cachefiles snd tty33 tty63 </span>
</li>
<li class="alt">
<span><span class="keyword">char</span><span> stderr tty34 tty7 </span></span>
</li>
<li>
<span>console stdin tty35 tty8 </span>
</li>
<li class="alt">
<span>cpuctl stdout tty36 tty9 </span>
</li>
<li>
<span>cpuset system tty37 ttyAMA0 </span>
</li>
<li class="alt">
<span>dev_mgr tty tty38 ttyS0 </span>
</li>
<li>
<span>dri tty0 tty39 ttyprintk </span>
</li>
<li class="alt">
<span>fd tty1 tty4 unix </span>
</li>
<li>
<span>freezer tty10 tty40 urandom </span>
</li>
<li class="alt">
<span>fscklogs tty11 tty41 vchiq </span>
</li>
<li>
<span><span class="keyword">full</span><span> tty12 tty42 vcs </span></span>
</li>
<li class="alt">
<span>gpiochip0 tty13 tty43 vcs1 </span>
</li>
<li>
<span>gpiochip1 tty14 tty44 vcsa </span>
</li>
<li class="alt">
<span>graphics tty15 tty45 vcsa1 </span>
</li>
<li>
<span>hdf_bl tty16 tty46 vcsu </span>
</li>
<li class="alt">
<span>hdf_input_host tty17 tty47 vcsu1 </span>
</li>
<li>
<span>hdf_misc_vibrator tty18 tty48 vga_arbiter </span>
</li>
<li class="alt">
<span>hdf_sensor_manager_ap tty19 tty49 vndbinder </span>
</li>
<li>
<span>hwbinder tty2 tty5 watchdog </span>
</li>
<li class="alt">
<span>hwrng tty20 tty50 watchdog0 </span>
</li>
<li>
<span>input tty21 tty51 zero </span>
</li>
<li class="alt">
<span>kmsg tty22 tty52 </span>
</li>
<li>
<span>linux,cma tty23 tty53 </span>
</li>
</ol>
<p>
基本算是启动成功了,接下来考虑打算用HDF的方式添加一下设备。来验证HDF驱动框架是否运转正常。</p>
<p>
原文链接:https://harmonyos.51cto.com</p>
頁:
[1]