18c339a94Sopenharmony_ci# Usage Guide 28c339a94Sopenharmony_ci 38c339a94Sopenharmony_ci## 简介 48c339a94Sopenharmony_ci在OpenHarmony系统中,上层应用或服务层通过调用HDF框架提供的HDI接口,能够以一种标准化和抽象化的方式与底层硬件设备进行交互。使用h2hdf工具,用户只需提供一个drivername,工具会自动生成整个框架的代码,包含驱动配置文件、idl接口、驱动程序driver和驱动服务框架。 58c339a94Sopenharmony_ci 68c339a94Sopenharmony_ci## 约束 78c339a94Sopenharmony_ci系统:建议Ubuntu 20.04或者Windows 10 88c339a94Sopenharmony_ci 98c339a94Sopenharmony_ci依赖版本:VS Code 1.62.0 108c339a94Sopenharmony_ci 118c339a94Sopenharmony_ci## 使用方法 128c339a94Sopenharmony_ci 138c339a94Sopenharmony_ci### 生成 148c339a94Sopenharmony_ci 158c339a94Sopenharmony_ci1.安装typescript:在napi_generator/src/cli/h2hdf/src目录下执行命令: 168c339a94Sopenharmony_ci 178c339a94Sopenharmony_ci npm i typescript 188c339a94Sopenharmony_ci 198c339a94Sopenharmony_ci2.安装stdio:在napi_generator/src/cli/h2hdf目录下执行命令: 208c339a94Sopenharmony_ci 218c339a94Sopenharmony_ci npm i stdio 228c339a94Sopenharmony_ci 238c339a94Sopenharmony_ci3.在napi_generator/src/cli/h2hdf/src下执行以下命令: 248c339a94Sopenharmony_ci 258c339a94Sopenharmony_ci``` 268c339a94Sopenharmony_cinode main.js -n hello 278c339a94Sopenharmony_ci``` 288c339a94Sopenharmony_ci 298c339a94Sopenharmony_ci其中,参数详情如下: 308c339a94Sopenharmony_ci 318c339a94Sopenharmony_ci -n, drivername,例如:hello 328c339a94Sopenharmony_ci 338c339a94Sopenharmony_ci -v, 可选参数,版本,默认为4.1 348c339a94Sopenharmony_ci 358c339a94Sopenharmony_ci -o, 可选参数,默认为当前目录,指定生成框架代码输出路径。 368c339a94Sopenharmony_ci 378c339a94Sopenharmony_ci6.执行成功后在napi_generator/src/cli/h2hdf/src/下生成hellohdf文件夹,文件夹中目录结构如下所示: 388c339a94Sopenharmony_ci 398c339a94Sopenharmony_ci``` 408c339a94Sopenharmony_cihellohdf 418c339a94Sopenharmony_ci├── HcsConfig # hcs配置文件 428c339a94Sopenharmony_ci│ ├── device_info.hcs # 内容配置到源码vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs文件中 438c339a94Sopenharmony_ci├── IdlInterface 448c339a94Sopenharmony_ci│ ├── hello # 拷贝到源码drivers/interface 458c339a94Sopenharmony_ci│ │ ├── v1_0 468c339a94Sopenharmony_ci│ │ │ ├── BUILD.gn 478c339a94Sopenharmony_ci│ │ │ ├── IHelloInterface.idl # idl接口 488c339a94Sopenharmony_ci│ │ ├── bundle.json 498c339a94Sopenharmony_ci├── Peripheral # 拷贝到源码drivers/peripheral 508c339a94Sopenharmony_ci│ ├── hello 518c339a94Sopenharmony_ci│ │ ├── hal 528c339a94Sopenharmony_ci│ │ │ ├── include 538c339a94Sopenharmony_ci│ │ │ │ ├── hello_dump.h 548c339a94Sopenharmony_ci│ │ │ ├── BUILD.gn 558c339a94Sopenharmony_ci│ │ │ ├── hello_dump.c # hidump实现 568c339a94Sopenharmony_ci│ │ ├── hdi_service # hdi_service 578c339a94Sopenharmony_ci│ │ │ ├── BUILD.gn # 编译两个动态库:libhello_driver、libhello_interface_service_1.0 588c339a94Sopenharmony_ci│ │ │ ├── hello_interface_driver.cpp # driver:定义驱动入口的对象,将驱动入口注册到HDF框架中;在加载驱动时HDF框架会先调用Bind函数,再调用Init函数加载该驱动;当Init调用异常时,HDF框架会调用Release释放驱动资源并退出 598c339a94Sopenharmony_ci│ │ │ ├── hello_interface_service.cpp # 驱动服务 608c339a94Sopenharmony_ci│ │ │ ├── hello_interface_service.h 618c339a94Sopenharmony_ci│ │ ├── utils/interface 628c339a94Sopenharmony_ci│ │ │ ├── hello_log.h # 日志文件 638c339a94Sopenharmony_ci│ │ ├── BUILD.gn 648c339a94Sopenharmony_ci│ │ ├── bundle.json 658c339a94Sopenharmony_ci``` 668c339a94Sopenharmony_ci 678c339a94Sopenharmony_ci### 编译 688c339a94Sopenharmony_ci 698c339a94Sopenharmony_ci1. **拷目录:** 将hellohdf/Peripheral文件夹下的hello文件夹拷贝到源码drivers/peripheral目录下 708c339a94Sopenharmony_ci 718c339a94Sopenharmony_ci``` 728c339a94Sopenharmony_cicp hellohdf/Peripheral/hello 源码/drivers/peripheral -r 738c339a94Sopenharmony_ci``` 748c339a94Sopenharmony_ci 758c339a94Sopenharmony_ci2. **拷目录:** 将hellohdf/IdlInterface文件夹下的hello文件夹拷贝到源码drivers/interface目录下 768c339a94Sopenharmony_ci 778c339a94Sopenharmony_ci``` 788c339a94Sopenharmony_cicp hellohdf/IdlInterface/hello 源码/drivers/interface -r 798c339a94Sopenharmony_ci``` 808c339a94Sopenharmony_ci 818c339a94Sopenharmony_ci3. **改文件:** 将hellohdf/HcsConfig/device_info.hcs中的内容拷贝到源码vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs文件中,如下所示: 828c339a94Sopenharmony_ci 838c339a94Sopenharmony_ci``` 848c339a94Sopenharmony_ci root { 858c339a94Sopenharmony_ci device_info { 868c339a94Sopenharmony_ci ... 878c339a94Sopenharmony_ci // 增加以下内容 888c339a94Sopenharmony_ci hello :: host { 898c339a94Sopenharmony_ci hostName = "hello_host"; 908c339a94Sopenharmony_ci priority = 50; 918c339a94Sopenharmony_ci hello_device :: device { 928c339a94Sopenharmony_ci device0 :: deviceNode { 938c339a94Sopenharmony_ci preload = 0; 948c339a94Sopenharmony_ci policy = 2; 958c339a94Sopenharmony_ci priority = 100; 968c339a94Sopenharmony_ci moduleName = "libhello_driver.z.so"; 978c339a94Sopenharmony_ci serviceName = "hello_interface_service"; 988c339a94Sopenharmony_ci } 998c339a94Sopenharmony_ci } 1008c339a94Sopenharmony_ci } 1018c339a94Sopenharmony_ci // 增加上述内容 1028c339a94Sopenharmony_ci ... 1038c339a94Sopenharmony_ci } 1048c339a94Sopenharmony_ci } 1058c339a94Sopenharmony_ci``` 1068c339a94Sopenharmony_ci 1078c339a94Sopenharmony_ci4. **配置产品:** 以rk3568为例,在源码vendor/hihope/rk3568/config.json文件中hdf子系统的components中增加以下内容: 1088c339a94Sopenharmony_ci 1098c339a94Sopenharmony_ci``` 1108c339a94Sopenharmony_ci{ 1118c339a94Sopenharmony_ci "component": "drivers_interface_hello", 1128c339a94Sopenharmony_ci "features": [] 1138c339a94Sopenharmony_ci}, 1148c339a94Sopenharmony_ci{ 1158c339a94Sopenharmony_ci "component": "drivers_peripheral_hello", 1168c339a94Sopenharmony_ci "features": [] 1178c339a94Sopenharmony_ci} 1188c339a94Sopenharmony_ci``` 1198c339a94Sopenharmony_ci 1208c339a94Sopenharmony_ci"drivers_interface_hello"为生成的drivers/interface/hello/v1_0/BUILD.gn中的part_name,其中"drivers_interface_"为固定格式。drivers_peripheral_hello"为生成的drivers/peripheral/hello/bundle.json中的component,"drivers_peripheral_"为固定格式。 1218c339a94Sopenharmony_ci 1228c339a94Sopenharmony_ci5. **编译:** 在源码下执行以下命令进行编译: 1238c339a94Sopenharmony_ci 1248c339a94Sopenharmony_ci``` 1258c339a94Sopenharmony_ci./build.sh --product-name rk3568 1268c339a94Sopenharmony_ci``` 1278c339a94Sopenharmony_ci 1288c339a94Sopenharmony_ci编译成功后,镜像位置在out/rk3568/packages/phone/image目录下 1298c339a94Sopenharmony_ci 1308c339a94Sopenharmony_ci### 验证 1318c339a94Sopenharmony_ci 1328c339a94Sopenharmony_ci#### 动态加载 1338c339a94Sopenharmony_ci 1348c339a94Sopenharmony_ci1.查看hostId:镜像烧录后,在vendor/etc/init/hdf_devhost.cfg文件里查看hostId 1358c339a94Sopenharmony_ci 1368c339a94Sopenharmony_ci``` 1378c339a94Sopenharmony_cicat vendor/etc/init/hdf_devhost.cfg 1388c339a94Sopenharmony_ci``` 1398c339a94Sopenharmony_ci 1408c339a94Sopenharmony_ci 1418c339a94Sopenharmony_ci 1428c339a94Sopenharmony_ci2.加载hello_host,命令如下: 1438c339a94Sopenharmony_ci 1448c339a94Sopenharmony_ci``` 1458c339a94Sopenharmony_ci./vendor/bin/hdf_devhost 14 hello_host 1468c339a94Sopenharmony_ci``` 1478c339a94Sopenharmony_ci 1488c339a94Sopenharmony_ci 1498c339a94Sopenharmony_ci 1508c339a94Sopenharmony_ci注意 :不可将进程kill 1518c339a94Sopenharmony_ci 1528c339a94Sopenharmony_ci3.查看host是否加载:新开一个命令行窗口,hdc进入开发板,执行以下命令查看进程是否拉起: 1538c339a94Sopenharmony_ci 1548c339a94Sopenharmony_ci``` 1558c339a94Sopenharmony_cips -A | grep host 1568c339a94Sopenharmony_ci``` 1578c339a94Sopenharmony_ci 1588c339a94Sopenharmony_ci屏幕显示hello_host进程号,则表明host已被拉起 1598c339a94Sopenharmony_ci 1608c339a94Sopenharmony_ci 1618c339a94Sopenharmony_ci 1628c339a94Sopenharmony_ci4.使用hidumper查看更多细节信息: 1638c339a94Sopenharmony_ci 1648c339a94Sopenharmony_ci通过DeviceServiceManager查询用户空间的设备信息 1658c339a94Sopenharmony_ci 1668c339a94Sopenharmony_ci``` 1678c339a94Sopenharmony_ci hidumper -s HdfDeviceServiceManager -a "-query" 1688c339a94Sopenharmony_ci``` 1698c339a94Sopenharmony_ci 1708c339a94Sopenharmony_ci 1718c339a94Sopenharmony_ci 1728c339a94Sopenharmony_ci通过DeviceServiceManager查询hello_host提供什么功能 1738c339a94Sopenharmony_ci 1748c339a94Sopenharmony_ci``` 1758c339a94Sopenharmony_cihidumper -s HdfDeviceServiceManager -a "-host hello_host -h" 1768c339a94Sopenharmony_ci``` 1778c339a94Sopenharmony_ci 1788c339a94Sopenharmony_ci-h:打印dump help信息 1798c339a94Sopenharmony_ci 1808c339a94Sopenharmony_ci 1818c339a94Sopenharmony_ci 1828c339a94Sopenharmony_ci通过DeviceServiceManager查询hello_host提供的helloworld功能 1838c339a94Sopenharmony_ci 1848c339a94Sopenharmony_ci``` 1858c339a94Sopenharmony_cihidumper -s HdfDeviceServiceManager -a "-host hello_host -c" 1868c339a94Sopenharmony_ci``` 1878c339a94Sopenharmony_ci 1888c339a94Sopenharmony_ci-c:打印出Hello, World! 1898c339a94Sopenharmony_ci 1908c339a94Sopenharmony_ci 1918c339a94Sopenharmony_ci 1928c339a94Sopenharmony_ci其中,-h、-c定义在生成的hellohdf/Peripheral/hello/hal/hello_dump.c中: 1938c339a94Sopenharmony_ci 1948c339a94Sopenharmony_ci 1958c339a94Sopenharmony_ci 1968c339a94Sopenharmony_ci#### 静态加载 1978c339a94Sopenharmony_ci 1988c339a94Sopenharmony_ci// todo 待补充 1998c339a94Sopenharmony_ci 200