鸿蒙的驱动子系统-4-驱动配置文件的分析

系统
前文《小型系统驱动示例程序的编译和验证》提到,以UART驱动实例程序为例,可将示驱动程序分为三部分,本文将基于Hi3516平台详细分析第一部分驱动的配置文件的相关要点。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

前文《小型系统驱动示例程序的编译和验证》提到,以UART驱动实例程序为例,可将示驱动程序分为三部分:

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

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

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

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

在项目根目录执行:find ./ -name *.hcs

  1.   ./device/hisilicon/hispark_aries/sdk_liteos/config/hdf.hcs 
  2.       ...... 
  3.       ./device/hisilicon/hispark_aries/sdk_liteos/config/watchdog/watchdog_config.hcs 
  4.  
  5. ./device/hisilicon/hispark_taurus/sdk_liteos/config/hdf.hcs 
  6. ./device/hisilicon/hispark_taurus/sdk_liteos/config/sdio/sdio_config.hcs 
  7. ./device/hisilicon/hispark_taurus/sdk_liteos/config/input/input_config.hcs 
  8. ./device/hisilicon/hispark_taurus/sdk_liteos/config/spi/spi_config.hcs 
  9. ./device/hisilicon/hispark_taurus/sdk_liteos/config/emmc/emmc_config.hcs 
  10. ./device/hisilicon/hispark_taurus/sdk_liteos/config/device_info/device_info.hcs 
  11. ./device/hisilicon/hispark_taurus/sdk_liteos/config/gpio/gpio_config.hcs 
  12. ./device/hisilicon/hispark_taurus/sdk_liteos/config/rtc/rtc_config.hcs 
  13. ./device/hisilicon/hispark_taurus/sdk_liteos/config/i2c/i2c_config.hcs 
  14. ./device/hisilicon/hispark_taurus/sdk_liteos/config/lcd/lcd_config.hcs 
  15. ./device/hisilicon/hispark_taurus/sdk_liteos/config/uart/uart_config.hcs 
  16. ./device/hisilicon/hispark_taurus/sdk_liteos/config/wifi/wlan_platform.hcs 
  17. ./device/hisilicon/hispark_taurus/sdk_liteos/config/wifi/wlan_chip_hi3881.hcs 
  18. ./device/hisilicon/hispark_taurus/sdk_liteos/config/usb/usb_config.hcs 
  19. ./device/hisilicon/hispark_taurus/sdk_liteos/config/watchdog/watchdog_config.hcs 
  20. ./device/hisilicon/hispark_taurus/sdk_liteos/config/pwm/pwm_config.hcs 
  21. ./device/hisilicon/hispark_taurus/sdk_liteos/config/dmac/dmac_config.hcs 
  22.  
  23.       ./device/qemu/arm_virt/config/hdf.hcs 
  24.       ...... 
  25.       ./device/qemu/arm_virt/config/cfiflash/cfi_config.hcs 
  26. ./vendor/huawei/hdf/sample/config/spi/spi_config.hcs 
  27. ./vendor/huawei/hdf/sample/config/device_info/device_info.hcs 
  28. ./vendor/huawei/hdf/sample/config/gpio/gpio_config.hcs 
  29. ./vendor/huawei/hdf/sample/config/uart/uart_config.hcs 
  30.  
  31.       ./vendor/hisilicon/hispark_aries/config/hdf.hcs 
  32.       ...... 
  33.       ./vendor/hisilicon/hispark_aries/config/wifi/wlan_chip_hi3881.hcs 
  34.  
  35. ./vendor/hisilicon/hispark_taurus/config/hdf.hcs 
  36. ./vendor/hisilicon/hispark_taurus/config/input/input_config.hcs 
  37. ./vendor/hisilicon/hispark_taurus/config/device_info/device_info.hcs 
  38. ./vendor/hisilicon/hispark_taurus/config/hdf_test/emmc_test_config.hcs 
  39. ./vendor/hisilicon/hispark_taurus/config/hdf_test/sdio_test_config.hcs 
  40. ./vendor/hisilicon/hispark_taurus/config/hdf_test/pwm_test_config.hcs 
  41. ./vendor/hisilicon/hispark_taurus/config/hdf_test/hdf_test_manager/device_info.hcs 
  42. ./vendor/hisilicon/hispark_taurus/config/hdf_test/hdf_test.hcs 
  43. ./vendor/hisilicon/hispark_taurus/config/hdf_test/gpio_test_config.hcs 
  44. ./vendor/hisilicon/hispark_taurus/config/hdf_test/spi_test_config.hcs 
  45. ./vendor/hisilicon/hispark_taurus/config/hdf_test/uart_test_config.hcs 
  46. ./vendor/hisilicon/hispark_taurus/config/hdf_test/i2c_test_config.hcs 
  47. ./vendor/hisilicon/hispark_taurus/config/hdf_test/hdf_config_test.hcs 
  48. ./vendor/hisilicon/hispark_taurus/config/lcd/lcd_config.hcs 
  49. ./vendor/hisilicon/hispark_taurus/config/sensor/sensor_config.hcs 
  50. ./vendor/hisilicon/hispark_taurus/config/sensor/accel/bmi160_config.hcs 
  51. ./vendor/hisilicon/hispark_taurus/config/sensor/accel/accel_config.hcs 
  52. ./vendor/hisilicon/hispark_taurus/config/wifi/wlan_platform.hcs 
  53. ./vendor/hisilicon/hispark_taurus/config/wifi/wlan_chip_hi3881.hcs 
  54.  
  55.       ./drivers/adapter/khdf/liteos/test/tools/hc-gen/test/unittest/02_empty_root_ei/case.hcs 
  56.  
  57.       ...... 
  58.       ./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文件的入口。简单,下面不再详细分析。

  1. LITEOSTOPDIR = //kernel/liteos_a/  
  2.  
  3. 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文件中添加对应的设备描述。

官方文档已经对该文件结构已经有很详细的解释了:

  1. root { 
  2.     device_info { 
  3.         match_attr = "hdf_manager"
  4.         template host {            // host模板,继承该模板的节点(如下sample_host)如果使用模板中的默认值,则节点字段可以缺省 
  5.         //...... 
  6.         } 
  7.  
  8.         sample_host :: host{ 
  9.             hostName = "host0";              // host名称,host节点是用来存放某一类驱动的容器 
  10.             priority = 100;                  // host启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证host的加载顺序 
  11.             device_sample :: device {        // sample设备节点 
  12.                 device0 :: deviceNode {      // sample驱动的DeviceNode节点 
  13.                     policy = 1;              // policy字段是驱动服务发布的策略,在驱动服务管理章节有详细介绍 
  14.                     priority = 100;          // 驱动启动优先级(0-200),值越大优先级越低,建议默认配100,优先级相同则不保证device的加载顺序 
  15.                     preload = 0;             // 驱动按需加载字段,在本章节最后的说明有详细介绍 
  16.                     permission = 0664;       // 驱动创建设备节点权限 
  17.                     moduleName = "sample_driver";   // 驱动名称,该字段的值必须和驱动入口结构的moduleName值一致 
  18.                     serviceName = "sample_service";    // 驱动对外发布服务的名称,必须唯一 
  19.                     deviceMatchAttr = "sample_config"; // 驱动私有数据匹配的关键字,必须和驱动私有数据配置表中的match_attr值相等 
  20.                 } 
  21.             } 
  22.         } 
  23.     } 

这里仅增加我自己的一些粗浅理解:

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

  1. platform :: host { 
  2.  
  3.           hostName = "platform_host"
  4.  
  5.           ........ 
  6.  
  7.       } 

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

  1. //vendor/hisilicon/hispark_taurus/config/device_info/device_info.hcs  
  2. Line 19:          platform :: host { 
  3. Line 204:         display :: host { 
  4. Line 245:         input :: host { 
  5. Line 337:         network :: host { 
  6. Line 360:         sensor :: host { 
  7. Line 384:         storage :: host { 
  8. Line 387:         media :: host { 
  • device: 具备相同属性的某一类具体的设备,比如I2C设备、uart设备,
  • deviceNode : 某一类具体设备的某些具体的设备节点,如I2C总线上挂着设备0,设备1,它们分别有各自的驱动配置
  1. device_i2c :: device { 
  2.               device0 :: deviceNode { 
  3.                   ...... 
  4.               } 
  5.               device1 :: deviceNode { 
  6.                   ...... 
  7.               } 
  8.           } 
  9.           device_uart :: device { 
  10.               device0 :: deviceNode { 
  11.                   ...... 
  12.               } 
  13.               device1 :: deviceNode { 
  14.  
  15.                   ...... 
  16.               } 
  17.  
  18.           } 

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

  1. device5 :: deviceNode { 
  2.                    policy = 2; 
  3.                    priority = 10; 
  4.                    permission = 0660; 
  5.                    moduleName = "UART_SAMPLE";                   //uart_sample_driver 
  6.                    serviceName = "HDF_PLATFORM_UART_5";  //uart_sample_service 
  7.                    deviceMatchAttr = "sample_uart_5";              //uart_sample_config 
  8.                } 
  • 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 文件:

  1. struct HdfDriverEntry g_sampleUartDriverEntry = { 
  2.     .moduleVersion = 1, 
  3.     .moduleName    = "UART_SAMPLE",      //uart_sample_driver 
  4.     .Bind    = SampleUartDriverBind, 
  5.     .Init    = SampleUartDriverInit, 
  6.     .Release = SampleUartDriverRelease, 
  7. }; 
  8.  
  9. HDF_INIT(g_sampleUartDriverEntry); 

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

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

  1. #define UART_DEV_SERVICE_NAME_PREFIX "HDF_PLATFORM_UART_%d"           //uart_sample_service 
  2.  
  3. struct DevHandle *UartOpen(uint32_t port)    //sample code,port=5 
  4.     ...... 
  5.     ret = snprintf_s(serviceName, MAX_DEV_NAME_SIZE + 1, 
  6.  
  7.                              MAX_DEV_NAME_SIZE, UART_DEV_SERVICE_NAME_PREFIX, port); 
  8.     ...... 

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 匹配。

  1. uart_sample { 
  2.          num = 5; 
  3.          base = 0x120a0000;   
  4.          irqNum = 38; 
  5.          baudrate = 115200; 
  6.          uartClk = 24000000;  
  7.          wlen = 0x60;        
  8.          parity = 0; 
  9.          stopBit = 0; 
  10.          match_attr = "sample_uart_5";    //uart_sample_config 
  11.      } 

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

这些配置在 HdfDeviceObject 结构体中,通过 property 指向的树形结构来保存:

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

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

  1. struct UartResource { 
  2.     uint32_t num;        /* UART port num */ 
  3.     uint32_t base;       /* UART PL011 base address */ 
  4.     uint32_t irqNum;     /* UART PL011 IRQ num */ 
  5.     uint32_t baudrate;   /* Default baudrate */ 
  6.     uint32_t wlen;       /* Default word length */ 
  7.     uint32_t parity;     /* Default parity */ 
  8.     uint32_t stopBit;    /* Default stop bits */ 
  9.     uint32_t uartClk;    /* UART clock */ 
  10.     unsigned long physBase; 
  11. }; 
  12.  
  13. struct UartDevice { 
  14.     struct IDeviceIoService ioService; 
  15.     struct UartResource resource; 
  16.     enum UartDeviceState state;     /* UART State */ 
  17.     uint32_t uartClk;               /* UART clock */ 
  18.     uint32_t baudrate;              /* Baudrate */ 
  19.     struct BufferFifo rxFifo; 
  20. }; 

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

对驱动配置文件的更多详情,还是请去官方文档仔细研读,比如驱动服务的管理、消息机制的管理和HCS的语法等等。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-08-17 14:39:00

鸿蒙HarmonyOS应用

2021-08-03 15:10:26

Linux代码驱动

2021-08-10 11:30:30

Linux代码中断控制器

2021-08-31 11:53:38

Linux inputLinux 系统

2021-12-15 10:02:25

鸿蒙HarmonyOS应用

2021-06-18 15:23:59

鸿蒙HarmonyOS应用

2015-10-19 17:36:19

MOST内核Linux

2021-05-13 21:51:38

鸿蒙HarmonyOS应用

2010-01-12 16:53:23

Fedora Core

2010-02-25 18:02:06

2011-02-25 13:34:33

Proftpd结构

2023-10-04 08:40:23

微软Windows 11

2011-03-25 17:13:37

Nagios配置文件

2011-02-25 16:39:34

proftpd配置文件

2023-04-28 08:42:08

Linux内核SPI驱动

2021-09-07 15:48:28

鸿蒙HarmonyOS应用

2009-07-20 13:58:07

MySQL JDBC驱

2021-10-08 06:50:32

Linux驱动挂载

2010-06-11 16:32:29

2009-08-04 10:46:04

点赞
收藏

51CTO技术栈公众号