xref: /napi_generator/src/cli/h2hdf/docs/usage.md (revision 8c339a94)
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![image-20240724093743837](./figures/pic_show_hostid.png)
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![image-20240903114845035](./figures/pic_show_exe.png)
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![image-20240724093743837](./figures/pic_show_devhostPid.png)
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![image-20240724093543096](./figures/pic_show_host.png)
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![image-20240724093543096](./figures/pic_show_dumph.png)
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![image-20240724093535915](./figures/pic_show_dump.png)
1918c339a94Sopenharmony_ci
1928c339a94Sopenharmony_ci其中,-h、-c定义在生成的hellohdf/Peripheral/hello/hal/hello_dump.c中:
1938c339a94Sopenharmony_ci
1948c339a94Sopenharmony_ci![image-20240724093543096](./figures/pic_show_dumpc.png)
1958c339a94Sopenharmony_ci
1968c339a94Sopenharmony_ci#### 静态加载
1978c339a94Sopenharmony_ci
1988c339a94Sopenharmony_ci// todo 待补充
1998c339a94Sopenharmony_ci
200