你的位置:骚虎出入口免费 > 无限免费观看视频大全 > 无限免费观看视频大全 鸿蒙的驱动子编制
无限免费观看视频大全
无限免费观看视频大全 鸿蒙的驱动子编制
发布日期:2021-09-20 04:04    点击次数:182

想晓畅更众内容,请访问:桃花社区视频在线观看免费完整版

51CTO和华为官方战略配相符共建的鸿蒙技术社区

https://harmonyos.51cto.com

前文《幼型编制驱动示例程序的编译和验证》挑到,以UART驱动实例程序为例,可将示驱动程序分为三片面:

1. 设备树的描述文件及驱动的配置描述文件(.hcs)

2. 驱动程序的内核空间片面的实现和编译脚本

3. 驱动程序的用户空间片面的实现和编译脚本

本文将基于Hi3516平台详细分析第一片面驱动的配置文件的有关要点。

在项现在根现在录实走:find ./ -name *.hcs

  ./device/hisilicon/hispark_aries/sdk_liteos/config/hdf.hcs       ......       ./device/hisilicon/hispark_aries/sdk_liteos/config/watchdog/watchdog_config.hcs  ./device/hisilicon/hispark_taurus/sdk_liteos/config/hdf.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/sdio/sdio_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/input/input_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/spi/spi_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/emmc/emmc_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/device_info/device_info.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/gpio/gpio_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/rtc/rtc_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/i2c/i2c_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/lcd/lcd_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/uart/uart_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/wifi/wlan_platform.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/wifi/wlan_chip_hi3881.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/usb/usb_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/watchdog/watchdog_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/pwm/pwm_config.hcs ./device/hisilicon/hispark_taurus/sdk_liteos/config/dmac/dmac_config.hcs        ./device/qemu/arm_virt/config/hdf.hcs       ......       ./device/qemu/arm_virt/config/cfiflash/cfi_config.hcs ./vendor/huawei/hdf/sample/config/spi/spi_config.hcs ./vendor/huawei/hdf/sample/config/device_info/device_info.hcs ./vendor/huawei/hdf/sample/config/gpio/gpio_config.hcs ./vendor/huawei/hdf/sample/config/uart/uart_config.hcs        ./vendor/hisilicon/hispark_aries/config/hdf.hcs       ......       ./vendor/hisilicon/hispark_aries/config/wifi/wlan_chip_hi3881.hcs  ./vendor/hisilicon/hispark_taurus/config/hdf.hcs ./vendor/hisilicon/hispark_taurus/config/input/input_config.hcs ./vendor/hisilicon/hispark_taurus/config/device_info/device_info.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/emmc_test_config.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/sdio_test_config.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/pwm_test_config.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/hdf_test_manager/device_info.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/hdf_test.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/gpio_test_config.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/spi_test_config.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/uart_test_config.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/i2c_test_config.hcs ./vendor/hisilicon/hispark_taurus/config/hdf_test/hdf_config_test.hcs ./vendor/hisilicon/hispark_taurus/config/lcd/lcd_config.hcs ./vendor/hisilicon/hispark_taurus/config/sensor/sensor_config.hcs ./vendor/hisilicon/hispark_taurus/config/sensor/accel/bmi160_config.hcs ./vendor/hisilicon/hispark_taurus/config/sensor/accel/accel_config.hcs ./vendor/hisilicon/hispark_taurus/config/wifi/wlan_platform.hcs ./vendor/hisilicon/hispark_taurus/config/wifi/wlan_chip_hi3881.hcs        ./drivers/adapter/khdf/liteos/test/tools/hc-gen/test/unittest/02_empty_root_ei/case.hcs        ......       ./drivers/adapter/khdf/liteos/test/tools/hc-gen/test/unittest/30_include_order/base2.hcs 

把hispark_aries、qemu/arm_virt、test/unittest这些有关不大的先往失踪,剩下的清理成外格如下:

鸿蒙的驱动子编制-4-驱动配置文件的分析-鸿蒙HarmonyOS技术社区

PartA灰色片面由 //drivers/adapter/khdf/liteos/hdf_lite.mk 文件内对 HAVE_VENDOR_CONFIG 的判定决定了不编译它,又由 LOSCFG_DRIVERS_HDF_TEST 决定编译入口在 PartB/hdf_test/Makefile,而不是PartB/Makefile。

PartB/PartC的蓝色片面,能够由开发者自走配置是否编译,PartB/hdf_test 不编译的话,那编译入口就是PartB/Makefile。

更详细的编译路径分析无限免费观看视频大全,见前文《驱动有关模块的编译》。

上外的文件可分为三类:

【3-1】Makefile:编译 hcs文件的入口。浅易,下面不再详细分析。

LITEOSTOPDIR = //kernel/liteos_a/   HDF_DRIVER = //adapter/khdf/liteos/hdf_driver.mk   【定义在//drivers/adapter/khdf/liteos/lite.mk:61】 

【3-2】device_info.hcs:这是整个平台一切设备新闻的配置汇总,设备新闻能够分布在分别路径下的若干个device_info.hcs文件中,最后会被hc-gen整相符在一首。

device_info.hcs 包含了HDF框架添载驱动所必要的基本新闻,基于HDF框架开发的驱动,必须要在device_info.hcs文件中增补对答的设备描述。

官方文档已经对该文件组织已经有很详细的注释了:

root {     device_info {         match_attr = "hdf_manager";         template host {            // host模板,继承该模板的节点(如下sample_host)倘若操纵模板中的默认值,则节点字段能够缺省         //......         }          sample_host :: host{             hostName = "host0";              // host名称,host节点是用来存放某一类驱动的容器             priority = 100;                  // host启动优先级(0-200),值越大优先级越矮,提出默认配100,优先级相通则不保证host的添载挨次             device_sample :: device {        // sample设备节点                 device0 :: deviceNode {      // sample驱动的DeviceNode节点                     policy = 1;              // policy字段是驱动服务发布的策略,在驱动服务管理章节有详细介绍                     priority = 100;          // 驱动启动优先级(0-200),值越大优先级越矮,提出默认配100,优先级相通则不保证device的添载挨次                     preload = 0;             // 驱动按需添载字段,在本章节末了的表明有详细介绍                     permission = 0664;       // 驱动创建设备节点权限                     moduleName = "sample_driver";   // 驱动名称,该字段的值必须和驱动入口组织的moduleName值相反                     serviceName = "sample_service";    // 驱动对外发布服务的名称,必须唯一                     deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置外中的match_attr值十分                 }             }         }     } } 

这边仅增补吾本身的一些粗浅理解:

host + hostName:一个host,就是联相符类设备驱动的容器。如下面的平台类host,就包含了常见的i2c/gpio/uart/sdio等等,

platform :: host {            hostName = "platform_host";            ........        } 

还有外设类的host,包括了dipsplay类、input类、network类等等:

//vendor/hisilicon/hispark_taurus/config/device_info/device_info.hcs  Line 19:          platform :: host { Line 204:         display :: host { Line 245:         input :: host { Line 337:         network :: host { Line 360:         sensor :: host { Line 384:         storage :: host { Line 387:         media :: host { 
device: 具备相通属性的某一类详细的设备,比如I2C设备、uart设备, deviceNode : 某一类详细设备的某些详细的设备节点,如I2C总线上挂着设备0,设备1,它们别离有各自的驱动配置
device_i2c :: device {               device0 :: deviceNode {                   ......               }               device1 :: deviceNode {                   ......               }           }           device_uart :: device {               device0 :: deviceNode {                   ......               }               device1 :: deviceNode {                    ......               }            } 

接下来就是详细的deviceNode的各个字段了,以前文挑到的uart驱动示例程序的deviceNode为例,配置见 //vendor/huawei/hdf/sample/config/device_info/device_info.hcs

device5 :: deviceNode {                    policy = 2;                    priority = 10;                    permission = 0660;                    moduleName = "UART_SAMPLE";                   //uart_sample_driver                    serviceName = "HDF_PLATFORM_UART_5";  //uart_sample_service                    deviceMatchAttr = "sample_uart_5";              //uart_sample_config                } 
policy:驱动服务发布的策略,官方文档《驱动服务管理》章节有专门详细的注释。 priority :驱动启动优先级(0-200),值越大优先级越矮: 0~ 49板级驱动,50~149设备驱动,150~200 接口拔插类设备驱动 preload :驱动添载手段,声援按需添载和挨次添载两栽手段,官方文档《驱动开发》章节也有专门详细的注释。 permission :驱动创建设备节点权限,默认是0666 moduleName = "UART_SAMPLE":驱动名称,该字段的值必须和驱动入口组织的moduleName值相反。

本文起头的“2. 驱动程序的内核空间片面的实现和编译脚本”中的内核实现片面代码中的驱动入口组织 g_sampleUartDriverEntry,代码见 //vendor/huawei/hdf/sample/platform/uart/src/uart_sample.c 文件:

struct HdfDriverEntry g_sampleUartDriverEntry = {     .moduleVersion = 1,     .moduleName    = "UART_SAMPLE",      //uart_sample_driver     .Bind    = SampleUartDriverBind,     .Init    = SampleUartDriverInit,     .Release = SampleUartDriverRelease, };  HDF_INIT(g_sampleUartDriverEntry); 

serviceName = "HDF_PLATFORM_UART_5":驱动对外发布服务的名称,必须唯一,这是调用者找到驱动服务的凭证,要十足匹配才能找到并操纵对答的驱动服务。

本文起头的“3. 驱动程序的用户空间片面的实现和编译脚本”中的实现片面代码://vendor/huawei/hdf/sample/platform/uart/dispatch/uart_if.c 中

#define UART_DEV_SERVICE_NAME_PREFIX "HDF_PLATFORM_UART_%d"           //uart_sample_service  struct DevHandle *UartOpen(uint32_t port)    //sample code,port=5 {     ......     ret = snprintf_s(serviceName, MAX_DEV_NAME_SIZE + 1,                               MAX_DEV_NAME_SIZE, UART_DEV_SERVICE_NAME_PREFIX, port);     ...... } 

deviceMatchAttr = "sample_uart_5":驱动私有数据匹配的关键字,必须和驱动私有数据配置外中的match_attr值十分

这是 device_info.hcs 设备新闻与下面的 xxx_config.hcs 中设备专属资源描述挂钩的凭证,device_info.hcs是设备树的树干和树枝,xxx_config.hcs 内的节点就是一片片树叶,deviceMatchAttr 就是树枝和叶片之间的叶柄。

【3-3】xxx_config.hcs:这是对特定设备专属资源的别离描述,分别类别的设备,各自操纵的资源一定也分别,会有本身的特定描述新闻。

例如,//vendor/huawei/hdf/sample/config/uart/uart_config.hcs 文件对该设备节点的描述,上面的 deviceMatchAttr 必须与这边的 match_attr 匹配。

uart_sample {          num = 5;          base = 0x120a0000;            irqNum = 38;          baudrate = 115200;          uartClk = 24000000;           wlen = 0x60;                 parity = 0;          stopBit = 0;          match_attr = "sample_uart_5";    //uart_sample_config      } 

uart_sample 的其他字段则是对这个设备节点的一些资源的初首化/默认配置了。

这些配置在 HdfDeviceObject 组织体中,经由过程 property 指向的树形组织来保存:

/** Pointer to the property of the device, which is read by the HDF from the configuration file and   transmitted to the driver. */   const struct DeviceResourceNode *property; 

在 SampleUartDriverInit(struct HdfDeviceObject *device)中调用 AttachUartDevice() 再调用GetUartDeviceResource()来读取property树形组织,从中解析出有关字段和值,保存在 struct UartDevice *uartDevice 组织体中,以供调用:

struct UartResource {     uint32_t num;        /* UART port num */     uint32_t base;       /* UART PL011 base address */     uint32_t irqNum;     /* UART PL011 IRQ num */     uint32_t baudrate;   /* Default baudrate */     uint32_t wlen;       /* Default word length */     uint32_t parity;     /* Default parity */     uint32_t stopBit;    /* Default stop bits */     uint32_t uartClk;    /* UART clock */     unsigned long physBase; };  struct UartDevice {     struct IDeviceIoService ioService;     struct UartResource resource;     enum UartDeviceState state;     /* UART State */     uint32_t uartClk;               /* UART clock */     uint32_t baudrate;              /* Baudrate */     struct BufferFifo rxFifo; }; 

其他类型的设备节点专属资源,有各自定义的API和有关组织体做相通的事情。

对驱动配置文件的更众细目,照样请往官方文档仔细研读,比如驱动服务的管理、新闻机制的管理和HCS的语法等等。

想晓畅更众内容,请访问:桃花社区视频在线观看免费完整版

51CTO和华为官方战略配相符共建的鸿蒙技术社区

https://harmonyos.51cto.com

【编辑选举】无限免费观看视频大全

鸿蒙官方战略配相符共建——HarmonyOS技术社区 浅谈HarmonyOS Glide组件的GIF能力 HarmonyOS基础技术赋能之轻量级数据库Preferencens HarmonyOS自定义控件之Material风格的下拉刷新 HarmonyOS 自动化测试实践 HarmonyOS 基于LYEVK-3861开发童年游玩之贪吃蛇

Powered by 骚虎出入口免费 @2013-2021 RSS地图 HTML地图