自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

鴻蒙的驅(qū)動子系統(tǒng)-4-驅(qū)動配置文件的分析

系統(tǒng)
前文《小型系統(tǒng)驅(qū)動示例程序的編譯和驗證》提到,以UART驅(qū)動實例程序為例,可將示驅(qū)動程序分為三部分,本文將基于Hi3516平臺詳細分析第一部分驅(qū)動的配置文件的相關(guān)要點。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

前文《小型系統(tǒng)驅(qū)動示例程序的編譯和驗證》提到,以UART驅(qū)動實例程序為例,可將示驅(qū)動程序分為三部分:

1. 設備樹的描述文件及驅(qū)動的配置描述文件(.hcs)

2. 驅(qū)動程序的內(nèi)核空間部分的實現(xiàn)和編譯腳本

3. 驅(qū)動程序的用戶空間部分的實現(xiàn)和編譯腳本

本文將基于Hi3516平臺詳細分析第一部分驅(qū)動的配置文件的相關(guān)要點。

在項目根目錄執(zhí)行: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這些關(guān)系不大的先去掉,剩下的整理成表格如下:

鴻蒙的驅(qū)動子系統(tǒng)-4-驅(qū)動配置文件的分析-鴻蒙HarmonyOS技術(shù)社區(qū)

PartA灰色部分由 //drivers/adapter/khdf/liteos/hdf_lite.mk 文件內(nèi)對 HAVE_VENDOR_CONFIG 的判斷決定了不編譯它,又由 LOSCFG_DRIVERS_HDF_TEST 決定編譯入口在 PartB/hdf_test/Makefile,而不是PartB/Makefile。

PartB/PartC的藍色部分,可以由開發(fā)者自行配置是否編譯,PartB/hdf_test 不編譯的話,那編譯入口就是PartB/Makefile。

更詳細的編譯路徑分析,見前文《驅(qū)動相關(guān)模塊的編譯》。

上表的文件可分為三類:

【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框架加載驅(qū)動所需要的基本信息,基于HDF框架開發(fā)的驅(qū)動,必須要在device_info.hcs文件中添加對應的設備描述。

官方文檔已經(jīng)對該文件結(jié)構(gòu)已經(jīng)有很詳細的解釋了:

  1. root { 
  2.     device_info { 
  3.         match_attr = "hdf_manager"
  4.         template host {            // host模板,繼承該模板的節(jié)點(如下sample_host)如果使用模板中的默認值,則節(jié)點字段可以缺省 
  5.         //...... 
  6.         } 
  7.  
  8.         sample_host :: host{ 
  9.             hostName = "host0";              // host名稱,host節(jié)點是用來存放某一類驅(qū)動的容器 
  10.             priority = 100;                  // host啟動優(yōu)先級(0-200),值越大優(yōu)先級越低,建議默認配100,優(yōu)先級相同則不保證host的加載順序 
  11.             device_sample :: device {        // sample設備節(jié)點 
  12.                 device0 :: deviceNode {      // sample驅(qū)動的DeviceNode節(jié)點 
  13.                     policy = 1;              // policy字段是驅(qū)動服務發(fā)布的策略,在驅(qū)動服務管理章節(jié)有詳細介紹 
  14.                     priority = 100;          // 驅(qū)動啟動優(yōu)先級(0-200),值越大優(yōu)先級越低,建議默認配100,優(yōu)先級相同則不保證device的加載順序 
  15.                     preload = 0;             // 驅(qū)動按需加載字段,在本章節(jié)最后的說明有詳細介紹 
  16.                     permission = 0664;       // 驅(qū)動創(chuàng)建設備節(jié)點權(quán)限 
  17.                     moduleName = "sample_driver";   // 驅(qū)動名稱,該字段的值必須和驅(qū)動入口結(jié)構(gòu)的moduleName值一致 
  18.                     serviceName = "sample_service";    // 驅(qū)動對外發(fā)布服務的名稱,必須唯一 
  19.                     deviceMatchAttr = "sample_config"; // 驅(qū)動私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動私有數(shù)據(jù)配置表中的match_attr值相等 
  20.                 } 
  21.             } 
  22.         } 
  23.     } 

這里僅增加我自己的一些粗淺理解:

host + hostName:一個host,就是同一類設備驅(qū)動的容器。如下面的平臺類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 : 某一類具體設備的某些具體的設備節(jié)點,如I2C總線上掛著設備0,設備1,它們分別有各自的驅(qū)動配置
  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驅(qū)動示例程序的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:驅(qū)動服務發(fā)布的策略,官方文檔《驅(qū)動服務管理》章節(jié)有非常詳細的解釋。
  • priority :驅(qū)動啟動優(yōu)先級(0-200),值越大優(yōu)先級越低: 0~ 49板級驅(qū)動,50~149設備驅(qū)動,150~200 接口拔插類設備驅(qū)動
  • preload :驅(qū)動加載方式,支持按需加載和按序加載兩種方式,官方文檔《驅(qū)動開發(fā)》章節(jié)也有非常詳細的解釋。
  • permission :驅(qū)動創(chuàng)建設備節(jié)點權(quán)限,默認是0666
  • moduleName = "UART_SAMPLE":驅(qū)動名稱,該字段的值必須和驅(qū)動入口結(jié)構(gòu)的moduleName值一致。

本文開頭的“2. 驅(qū)動程序的內(nèi)核空間部分的實現(xiàn)和編譯腳本”中的內(nèi)核實現(xiàn)部分代碼中的驅(qū)動入口結(jié)構(gòu) 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":驅(qū)動對外發(fā)布服務的名稱,必須唯一,這是調(diào)用者找到驅(qū)動服務的憑證,要完全匹配才能找到并使用對應的驅(qū)動服務。

本文開頭的“3. 驅(qū)動程序的用戶空間部分的實現(xiàn)和編譯腳本”中的實現(xiàn)部分代碼://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":驅(qū)動私有數(shù)據(jù)匹配的關(guān)鍵字,必須和驅(qū)動私有數(shù)據(jù)配置表中的match_attr值相等

這是 device_info.hcs 設備信息與下面的 xxx_config.hcs 中設備專屬資源描述掛鉤的憑證,device_info.hcs是設備樹的樹干和樹枝,xxx_config.hcs 內(nèi)的節(jié)點就是一片片樹葉,deviceMatchAttr 就是樹枝和葉片之間的葉柄。

【3-3】xxx_config.hcs:這是對特定設備專屬資源的分別描述,不同類別的設備,各自使用的資源肯定也不同,會有自己的特定描述信息。

例如,//vendor/huawei/hdf/sample/config/uart/uart_config.hcs 文件對該設備節(jié)點的描述,上面的 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 的其他字段則是對這個設備節(jié)點的一些資源的初始化/默認配置了。

這些配置在 HdfDeviceObject 結(jié)構(gòu)體中,通過 property 指向的樹形結(jié)構(gòu)來保存:

  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)中調(diào)用 AttachUartDevice() 再調(diào)用GetUartDeviceResource()來讀取property樹形結(jié)構(gòu),從中解析出相關(guān)字段和值,保存在 struct UartDevice *uartDevice 結(jié)構(gòu)體中,以供調(diào)用:

  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. }; 

其他類型的設備節(jié)點專屬資源,有各自定義的API和相關(guān)結(jié)構(gòu)體做類似的事情。

對驅(qū)動配置文件的更多詳情,還是請去官方文檔仔細研讀,比如驅(qū)動服務的管理、消息機制的管理和HCS的語法等等。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-08-17 14:39:00

鴻蒙HarmonyOS應用

2021-08-10 11:30:30

Linux代碼中斷控制器

2021-08-03 15:10:26

Linux代碼驅(qū)動

2021-08-31 11:53:38

Linux inputLinux 系統(tǒng)

2021-12-15 10:02:25

鴻蒙HarmonyOS應用

2015-10-19 17:36:19

MOST內(nèi)核Linux

2021-06-18 15:23:59

鴻蒙HarmonyOS應用

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結(jié)構(gòu)

2023-10-04 08:40:23

微軟Windows 11

2011-03-25 17:13:37

Nagios配置文件

2011-02-25 16:39:34

proftpd配置文件

2025-03-18 07:21:07

2021-09-07 15:48:28

鴻蒙HarmonyOS應用

2023-04-28 08:42:08

Linux內(nèi)核SPI驅(qū)動

2009-07-20 13:58:07

MySQL JDBC驅(qū)

2021-10-08 06:50:32

Linux驅(qū)動掛載

2010-06-11 16:32:29

點贊
收藏

51CTO技術(shù)棧公眾號