From ef788780ac786dca20f9b49a3a2ef4c40e729f62 Mon Sep 17 00:00:00 2001 From: Gloria Date: Wed, 18 Jan 2023 14:09:12 +0800 Subject: [PATCH] replaced dev-dev (en) folder with that in master Signed-off-by: wusongqing --- en/device-dev/Readme-EN.md | 12 +- en/device-dev/dev-board-on-the-master.md | 18 +- en/device-dev/device-test/Readme-EN.md | 6 + en/device-dev/device-test/developer_test.md | 975 +++++ en/device-dev/device-test/figures/FAQ-1.PNG | Bin 0 -> 137741 bytes en/device-dev/device-test/figures/L0-1.PNG | Bin 0 -> 67322 bytes en/device-dev/device-test/figures/NFS-2.PNG | Bin 0 -> 61951 bytes .../figures/en-us_image_0000001154351160.jpg | Bin 0 -> 9280 bytes .../figures/en-us_image_0000001200230833.gif | Bin 0 -> 6570 bytes .../device-test/figures/result-1.PNG | Bin 0 -> 410945 bytes en/device-dev/device-test/xdevice.md | 701 ++++ en/device-dev/device-test/xts.md | 506 +++ en/device-dev/driver/Readme-EN.md | 1 + .../driver/driver-hdf-development.md | 132 +- en/device-dev/driver/driver-hdf-load.md | 30 + en/device-dev/driver/driver-hdf-manage.md | 74 +- .../driver/driver-hdf-message-management.md | 82 +- en/device-dev/driver/driver-hdf-overview.md | 15 +- en/device-dev/driver/driver-hdf-sample.md | 50 +- .../driver/driver-hdf-servicemanage.md | 126 +- .../driver/driver-peripherals-camera-des.md | 971 +++-- .../driver/driver-peripherals-codec-des.md | 2 +- .../driver/driver-peripherals-external-des.md | 130 +- .../driver/driver-peripherals-lcd-des.md | 563 ++- .../driver/driver-peripherals-light-des.md | 134 +- .../driver/driver-peripherals-motion-des.md | 19 +- .../driver/driver-peripherals-sensor-des.md | 117 +- .../driver/driver-peripherals-touch-des.md | 823 ++-- .../driver/driver-peripherals-usb-des.md | 1061 +++-- .../driver/driver-peripherals-vibrator-des.md | 137 +- .../driver/driver-platform-adc-des.md | 83 +- .../driver/driver-platform-adc-develop.md | 489 ++- .../driver/driver-platform-dac-des.md | 54 +- .../driver/driver-platform-dac-develop.md | 631 +-- .../driver/driver-platform-gpio-des.md | 507 ++- .../driver/driver-platform-gpio-develop.md | 540 ++- .../driver/driver-platform-i2c-des.md | 337 +- .../driver/driver-platform-i2c-develop.md | 376 +- .../driver/driver-platform-i3c-des.md | 192 +- .../driver/driver-platform-i3c-develop.md | 535 +-- .../driver/driver-platform-mmc-develop.md | 457 ++- .../driver/driver-platform-pin-des.md | 222 +- .../driver/driver-platform-pin-develop.md | 780 ++-- .../driver/driver-platform-pwm-des.md | 446 ++- .../driver/driver-platform-pwm-develop.md | 363 +- .../driver/driver-platform-uart-des.md | 506 +-- .../driver/driver-platform-uart-develop.md | 532 +-- .../driver/driver-platform-watchdog-des.md | 341 +- .../driver-platform-watchdog-develop.md | 401 +- .../figures/4-wire-uart-communication.png | Bin 6763 -> 8192 bytes .../driver/figures/light_driver_model.png | Bin 13595 -> 13270 bytes .../driver/figures/using-I3C-process.png | Bin 0 -> 16073 bytes .../driver/figures/using-MIPI-CSI-process.png | Bin 16854 -> 29155 bytes .../driver/figures/using-PWM-process.png | Bin 15514 -> 17130 bytes .../driver/figures/using-UART-process.png | Bin 8739 -> 9475 bytes .../driver/figures/using-watchdog-process.png | Bin 8425 -> 13941 bytes en/device-dev/faqs/faqs-environment-setup.md | 49 +- en/device-dev/faqs/faqs-startup.md | 44 +- .../guide/device-camera-control-example.md | 48 +- .../guide/device-camera-visual-run.md | 8 +- .../guide/device-outerdriver-demo.md | 28 +- .../guide/device-wlan-led-control.md | 2 +- en/device-dev/kernel/Readme-EN.md | 5 +- .../kernel/figures/create_delete_plimits.png | Bin 0 -> 58087 bytes .../kernel/figures/memory_limiter.png | Bin 0 -> 84103 bytes .../kernel/figures/newip-connections.png | Bin 23487 -> 11103 bytes .../kernel/figures/newip-development.png | Bin 154262 -> 187332 bytes en/device-dev/kernel/figures/newip-header.png | Bin 22829 -> 23206 bytes en/device-dev/kernel/figures/pids_limiter.png | Bin 0 -> 92355 bytes .../kernel/figures/sched_limiter.png | Bin 0 -> 64732 bytes .../kernel/kernel-mini-basic-interrupt.md | 167 +- .../kernel/kernel-mini-basic-ipc-event.md | 212 +- .../kernel/kernel-mini-basic-ipc-mutex.md | 172 +- .../kernel/kernel-mini-basic-ipc-queue.md | 276 +- .../kernel/kernel-mini-basic-ipc-sem.md | 161 +- .../kernel/kernel-mini-basic-list.md | 181 +- .../kernel/kernel-mini-basic-memory.md | 104 +- .../kernel/kernel-mini-basic-soft.md | 168 +- .../kernel/kernel-mini-basic-task.md | 79 +- ...mini-time.md => kernel-mini-basic-time.md} | 74 +- en/device-dev/kernel/kernel-mini-overview.md | 111 +- en/device-dev/kernel/kernel-overview.md | 2 +- en/device-dev/kernel/kernel-small-plimits.md | 336 ++ en/device-dev/kernel/kernel-standard-build.md | 8 +- .../kernel/kernel-standard-mm-eswap.md | 126 +- en/device-dev/kernel/kernel-standard-newip.md | 229 +- .../kernel/kernel-standard-overview.md | 13 +- en/device-dev/kernel/kernel-standard-patch.md | 61 +- .../kernel/kernel-standard-sched-rtg.md | 11 - en/device-dev/porting/Readme-EN.md | 14 +- .../figures/bearpi_hm_micro_hb_env.png | Bin 0 -> 12045 bytes .../figures/bearpi_hm_micro_hb_set.png | Bin 0 -> 4576 bytes .../porting/figures/cst85_hb_set.png | Bin 0 -> 7588 bytes .../porting/figures/cst85_kconfig.png | Bin 0 -> 18944 bytes .../figures/dayu200/dayu200-audio-01.png | Bin 0 -> 19830 bytes .../figures/dayu200/dayu200-audio-02.png | Bin 0 -> 14685 bytes .../figures/dayu200/dayu200-audio-03.png | Bin 0 -> 383444 bytes .../figures/dayu200/dayu200-backlight-01.png | Bin 0 -> 22455 bytes .../figures/dayu200/dayu200-backlight-02.png | Bin 0 -> 152678 bytes .../porting/figures/dayu200/dayu200-bt-01.png | Bin 0 -> 42702 bytes .../porting/figures/dayu200/dayu200-bt-02.png | Bin 0 -> 117342 bytes .../figures/dayu200/dayu200-camera-01.png | Bin 0 -> 27028 bytes .../figures/dayu200/dayu200-camera-02.png | Bin 0 -> 7272 bytes .../figures/dayu200/dayu200-camera-03.png | Bin 0 -> 237916 bytes .../figures/dayu200/dayu200-lcd-01.png | Bin 0 -> 23619 bytes .../figures/dayu200/dayu200-sensor-01.png | Bin 0 -> 132781 bytes .../porting/figures/dayu200/dayu200-tp-01.png | Bin 0 -> 43371 bytes .../porting/figures/dayu200/dayu200-tp-02.png | Bin 0 -> 316122 bytes .../figures/dayu200/dayu200-vibrator-01.png | Bin 0 -> 93522 bytes .../figures/dayu200/dayu200-wifi-01.png | Bin 0 -> 256604 bytes .../figures/dayu200/dayu200-wifi-02.png | Bin 0 -> 397396 bytes .../figures/dayu200/dayu200-wifi-03.png | Bin 0 -> 262278 bytes .../figures/dayu200/dayu200-wifi-04.png | Bin 0 -> 125788 bytes .../figures/dayu200/dayu200-wifi-05.png | Bin 0 -> 182266 bytes .../figures/dayu200/dayu200-wifi-06.png | Bin 0 -> 173915 bytes .../figures/dayu200/dayu200-wifi-07.png | Bin 0 -> 62269 bytes .../figures/dayu200/dayu200-wifi-08.png | Bin 0 -> 36153 bytes .../figures/dayu200/dayu200-wifi-09.png | Bin 0 -> 31928 bytes .../figures/isoftstone/yangfan-Audio-ADM.png | Bin 0 -> 38637 bytes .../isoftstone/yangfan-Audio-commond.png | Bin 0 -> 85711 bytes .../figures/isoftstone/yangfan-Audio-play.png | Bin 0 -> 55673 bytes .../isoftstone/yangfan-Audio-start.png | Bin 0 -> 184888 bytes .../isoftstone/yangfan-picture-uvc0.png | Bin 0 -> 553035 bytes .../isoftstone/yangfan-picture-v4l2_main.png | Bin 0 -> 611309 bytes .../figures/isoftstone/yangfan-print-01.png | Bin 0 -> 95250 bytes .../porting/figures/niobe407_boot.png | Bin 0 -> 6264 bytes .../porting/figures/niobe407_hb_env.png | Bin 0 -> 16567 bytes .../porting/figures/niobe407_hb_set.png | Bin 0 -> 7070 bytes .../porting/figures/niobe407_menuconfig.png | Bin 0 -> 7974 bytes en/device-dev/porting/figures/w800_select.png | Bin 0 -> 11530 bytes ...ing-bes2600w-on-minisystem-display-demo.md | 8 +- .../porting/porting-cst85f01-combo-demo.md | 855 ++++ .../porting-dayu200-on_standard-demo.md | 3497 +++++++++++++++++ .../porting-stm32f407-on-minisystem-eth.md | 1287 ++++++ .../porting-stm32mp15xx-on-smallsystem.md | 600 +++ .../porting/porting-w800-combo-demo.md | 851 ++++ .../porting-yangfan-on_standard-demo.md | 1679 ++++++++ .../quickstart-appendix-hi3516-ide.md | 12 +- .../quick-start/quickstart-ide-3516-burn.md | 2 +- .../quickstart-ide-3568-helloworld.md | 4 +- en/device-dev/subsystems/Readme-EN.md | 18 +- .../subsys-app-privilege-config-guide.md | 2 +- .../subsystems/subsys-arkcompiler-guide.md | 77 + .../subsystems/subsys-boot-init-log.md | 75 + .../subsystems/subsys-boot-init-sandbox.md | 15 +- .../subsystems/subsys-boot-init-service.md | 15 +- .../subsystems/subsys-boot-init-sub-unit.md | 121 + en/device-dev/subsystems/subsys-build-all.md | 369 +- .../subsys-build-component-building-rules.md | 282 ++ .../subsys-build-gn-hap-compilation-guide.md | 2 +- .../subsystems/subsys-dfx-hilog-rich.md | 6 +- .../subsys-dfx-hisysevent-logging.md | 220 +- .../subsystems/subsys-dfx-hisysevent-query.md | 390 +- .../subsystems/subsys-dfx-hisysevent-tool.md | 78 +- en/device-dev/subsystems/subsys-ota-guide.md | 140 +- .../subsystems/subsys-testguide-test.md | 930 ----- .../subsystems/subsys-toolchain-hdc-guide.md | 393 +- .../subsystems/subsys-usbservice-overview.md | 294 +- en/device-dev/subsystems/subsys-xts-guide.md | 513 --- en/device-dev/website.md | 91 +- 160 files changed, 21205 insertions(+), 8787 deletions(-) create mode 100644 en/device-dev/device-test/Readme-EN.md create mode 100644 en/device-dev/device-test/developer_test.md create mode 100644 en/device-dev/device-test/figures/FAQ-1.PNG create mode 100644 en/device-dev/device-test/figures/L0-1.PNG create mode 100644 en/device-dev/device-test/figures/NFS-2.PNG create mode 100644 en/device-dev/device-test/figures/en-us_image_0000001154351160.jpg create mode 100644 en/device-dev/device-test/figures/en-us_image_0000001200230833.gif create mode 100644 en/device-dev/device-test/figures/result-1.PNG create mode 100644 en/device-dev/device-test/xdevice.md create mode 100644 en/device-dev/device-test/xts.md create mode 100644 en/device-dev/driver/driver-hdf-load.md create mode 100644 en/device-dev/driver/figures/using-I3C-process.png create mode 100644 en/device-dev/kernel/figures/create_delete_plimits.png create mode 100644 en/device-dev/kernel/figures/memory_limiter.png create mode 100644 en/device-dev/kernel/figures/pids_limiter.png create mode 100644 en/device-dev/kernel/figures/sched_limiter.png rename en/device-dev/kernel/{kernel-basic-mini-time.md => kernel-mini-basic-time.md} (61%) create mode 100644 en/device-dev/kernel/kernel-small-plimits.md create mode 100644 en/device-dev/porting/figures/bearpi_hm_micro_hb_env.png create mode 100644 en/device-dev/porting/figures/bearpi_hm_micro_hb_set.png create mode 100644 en/device-dev/porting/figures/cst85_hb_set.png create mode 100644 en/device-dev/porting/figures/cst85_kconfig.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-audio-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-audio-02.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-audio-03.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-backlight-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-backlight-02.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-bt-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-bt-02.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-camera-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-camera-02.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-camera-03.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-lcd-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-sensor-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-tp-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-tp-02.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-vibrator-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-01.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-02.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-03.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-04.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-05.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-06.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-07.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-08.png create mode 100644 en/device-dev/porting/figures/dayu200/dayu200-wifi-09.png create mode 100644 en/device-dev/porting/figures/isoftstone/yangfan-Audio-ADM.png create mode 100644 en/device-dev/porting/figures/isoftstone/yangfan-Audio-commond.png create mode 100644 en/device-dev/porting/figures/isoftstone/yangfan-Audio-play.png create mode 100644 en/device-dev/porting/figures/isoftstone/yangfan-Audio-start.png create mode 100644 en/device-dev/porting/figures/isoftstone/yangfan-picture-uvc0.png create mode 100644 en/device-dev/porting/figures/isoftstone/yangfan-picture-v4l2_main.png create mode 100644 en/device-dev/porting/figures/isoftstone/yangfan-print-01.png create mode 100644 en/device-dev/porting/figures/niobe407_boot.png create mode 100644 en/device-dev/porting/figures/niobe407_hb_env.png create mode 100644 en/device-dev/porting/figures/niobe407_hb_set.png create mode 100644 en/device-dev/porting/figures/niobe407_menuconfig.png create mode 100644 en/device-dev/porting/figures/w800_select.png create mode 100644 en/device-dev/porting/porting-cst85f01-combo-demo.md create mode 100644 en/device-dev/porting/porting-dayu200-on_standard-demo.md create mode 100644 en/device-dev/porting/porting-stm32f407-on-minisystem-eth.md create mode 100644 en/device-dev/porting/porting-stm32mp15xx-on-smallsystem.md create mode 100644 en/device-dev/porting/porting-w800-combo-demo.md create mode 100644 en/device-dev/porting/porting-yangfan-on_standard-demo.md create mode 100644 en/device-dev/subsystems/subsys-arkcompiler-guide.md create mode 100644 en/device-dev/subsystems/subsys-boot-init-log.md create mode 100644 en/device-dev/subsystems/subsys-boot-init-sub-unit.md create mode 100644 en/device-dev/subsystems/subsys-build-component-building-rules.md delete mode 100644 en/device-dev/subsystems/subsys-testguide-test.md delete mode 100644 en/device-dev/subsystems/subsys-xts-guide.md diff --git a/en/device-dev/Readme-EN.md b/en/device-dev/Readme-EN.md index 389ab1daec..048e956eb6 100644 --- a/en/device-dev/Readme-EN.md +++ b/en/device-dev/Readme-EN.md @@ -19,7 +19,13 @@ - Mini System SoC Porting Cases - [Mini-System Devices with Screens — Bestechnic SoC Porting Case](porting/porting-bes2600w-on-minisystem-display-demo.md) - [Combo Solution — ASR Chip Porting Case](porting/porting-asr582x-combo-demo.md) - + - [IoT Solution - Chipsea CST85 Chip Porting Case](porting/porting-cst85f01-combo-demo.md) + - [Mini System STM32F407 SoC Porting Case](porting/porting-stm32f407-on-minisystem-eth.md) + - [Combo Solution – W800 Chip Porting Case](porting/porting-w800-combo-demo.md) + - Small System SoC Porting Cases + - [Mini-System Devices – STM32MP1 SoC Porting Case](porting/porting-stm32mp15xx-on-smallsystem.md) + - Standard System SoC Porting Cases + - [Standard System Solution – Rockchip RK3568 Porting Case](porting/porting-dayu200-on_standard-demo.md) - Subsystem Development - Kernel - [Kernel for the Mini System](kernel/kernel-mini-overview.md) @@ -47,10 +53,8 @@ - [Mini- and Small-System Devices](guide/device-wlan-led-control.md) - [Standard-System Devices](guide/device-clock-guide.md) - Debugging - - [Test Case Development](subsystems/subsys-testguide-test.md) + - [Test Case Development](device-test/Readme-EN.md) - [R&D Tools](subsystems/subsys-toolchain-hdc-guide.md) -- XTS Certification - - [XTS Test Case Development](subsystems/subsys-xts-guide.md) - Tools - [Docker Environment](get-code/gettools-acquire.md) - [IDE](get-code/gettools-ide.md) diff --git a/en/device-dev/dev-board-on-the-master.md b/en/device-dev/dev-board-on-the-master.md index 92f664523a..d06cbadbb9 100644 --- a/en/device-dev/dev-board-on-the-master.md +++ b/en/device-dev/dev-board-on-the-master.md @@ -1,24 +1,25 @@ # OpenHarmony Development Boards List -Currently, the OpenHarmony community supports 17 types of development boards, as listed in the table below. +Currently, OpenHarmony supports 22 development board models, as listed in the table below. ## Standard-System Development Boards | Board Model| Chip Model| Function Description and Use Case| Application Scenario| Code Repository and Daily Build| | ---------- | -------- | -------- | ------------ | -------------------------------------- | -|HiHope HH-SCDAYU200| RK3568 |Function description:
Bolstered by the Rockchip RK3568, the HH-SCDAYU200 development board integrates the dual-core GPU and efficient NPU. Its quad-core 64-bit Cortex-A55 processor uses the advanced 22 nm fabrication process and is clocked at up to 2.0 GHz. The board is packed with Bluetooth, Wi-Fi, audio, video, and camera features, with a wide range of expansion ports to accommodate various video input and outputs. It comes with dual GE auto-sensing RJ45 ports, so it can be used in multi-connectivity products, such as network video recorders (NVRs) and industrial gateways.
Use case:
DAYU200 Adaptation Case|Entertainment, easy travel, and smart home, such as kitchen hoods, ovens, and treadmills.|Code repositories:
[device_soc_rockchip](https://gitee.com/openharmony/device_soc_rockchip)
[device_board_hihope](https://gitee.com/openharmony/device_board_hihope)
[vendor_hihope](https://gitee.com/openharmony/vendor_hihope)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|HiHope HH-SCDAYU200| RK3568 |Function description:
Bolstered by the Rockchip RK3568, the HH-SCDAYU200 development board integrates the dual-core GPU and efficient NPU. Its quad-core 64-bit Cortex-A55 processor uses the advanced 22 nm fabrication process and is clocked at up to 2.0 GHz. The board is packed with Bluetooth, Wi-Fi, audio, video, and camera features, with a wide range of expansion ports to accommodate various video input and outputs. It comes with dual GE auto-sensing RJ45 ports, so it can be used in multi-connectivity products, such as network video recorders (NVRs) and industrial gateways.
Use case:
[DAYU200 Adaptation Case](porting/porting-dayu200-on_standard-demo.md)|Entertainment, easy travel, and smart home, such as kitchen hoods, ovens, and treadmills.|Code repositories:
[device_soc_rockchip](https://gitee.com/openharmony/device_soc_rockchip)
[device_board_hihope](https://gitee.com/openharmony/device_board_hihope)
[vendor_hihope](https://gitee.com/openharmony/vendor_hihope)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | |Hispark_Phoenix|Hi3751V351|Function description:
Hi3751 V351 is a main processor designed for FHD smart televisions, conforming to a wide range of global television standards. It supports NTSC/PAL/SECAM demodulation, DTMB/DVB-C/ATSC/ISDB-T demodulation, and DVB-T/T2/S/S2 extension. The SoC running AOSP has a built-in multi-core Arm Cortex-A53 CPU, multi-core Arm Mali-T450 GPU, and 1 GB DDR SDRAM. It can handle USB playback, video formats such as MPEG2, H.264, H.265, RMVB, and AVS+, as well as audio decoding and sound processing [including in-house super wide sound (SWS) processing]. It also supports CVBS/YPbPr/VGA/HDMI 1.4/USB inputs, LVDS/mini-LVDS interfaces, and mainstream TCONLESS panels.|Smart TVs, smart home central control screens, smart displays, commercial display advertising screens, interactive whiteboards, industrial control screens, printer screens, white good screens, and fitness device display screens.|Code repositories:
[device_soc_hisilicon](https://gitee.com/openharmony/device_soc_hisilicon)
[device_board_hisilicon](https://gitee.com/openharmony/device_board_hisilicon)
[vendor_hisilicon](https://gitee.com/openharmony/vendor_hisilicon)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| |Unionpi Tiger|Amlogic A311D|Function description:
Unionpi Tiger is a piece of intelligent hardware used in scenarios such as image processing, audio and video processing, and deep learning. Its main processor Amlogic A311D supports the GPU and neural network acceleration subsystem, 4K video codec engine, industry-leading HDR image processing, and all standards-based audio/video input/output interfaces. The CPU of the active system uses the big-core and small-core design with a clock speed of up to 2.2 GHz. It integrates four Cortex-A73 cores, two Cortex-A53 cores, and a standalone 5.0T NPU.|Smart home, AI facial recognition, industrial control, smart vehicle-mounted devices, multimedia processing, and AI edge computing.|Code repositories:
[device_soc_amlogic](https://gitee.com/openharmony/device_soc_amlogic)
[device_board_unionman](https://gitee.com/openharmony/device_board_unionman)
[vendor_unionman](https://gitee.com/openharmony/vendor_unionman)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| |MILOS_Standard0|NXP i.MX8M Mini|Function description:
MILOS_Standard0 is powered by the NXP i.MX8M Mini processor and clocked at up to 1.8 GHz. It integrates a wide range of peripheral input and output ports, including LVDS, MIPI-DSI output, and MIPI-CSI camera ports, as well as GE, multi-channel USB, and multi-serial communications ports.|High-performance instruments and meters (industry and medical care), industrial control and human-machine interaction devices, intelligent transportation, smart fire fighting, and smart buildings.|Code repositories:
[device_soc_nxp](https://gitee.com/openharmony/device_soc_nxp)
[device_board_osware](https://gitee.com/openharmony/device_board_osware)
[vendor_osware](https://gitee.com/openharmony/vendor_osware)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| |Yangfan development board|RK3399|Function description:
The Yangfan development board is built based on the RK3399 chip. The RK3399 CPU uses the big.LITTLE core architecture, with two Cortex-A72 big cores and four Cortex-A53 small cores. It provides significant improvements over its predecessor in terms of integers, floating point numbers, memory, overall performance, power consumption, and core area. The RK3399 GPU leverages the next-generation quad-core Arm Mali-T860 processor. The various bandwidth compression technologies (such as intelligent overlay, ASTC, and local pixel storage) and a wide array of graphics and computing interfaces make it more capable of complex graphics use cases.|Interactive advertising machines, interactive digital signage, intelligent self-service terminals, intelligent retail terminals, industrial control hosts, and robot devices.|Code repositories:
[device_soc_rockchip](https://gitee.com/openharmony/device_soc_rockchip)
[device_board_isoftstone](https://gitee.com/openharmony/device_board_isoftstone)
[vendor_isoftstone](https://gitee.com/openharmony/vendor_isoftstone)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| |ZLG development board|T507|Function description:
The ZLG development board is equipped with the Quanzhi industrial-grade T507 chip, which integrates the quad-core CortexTM A53 CPU, G31 MP2 GPU, multi-channel video outputs (RGB/2 x LVDS/HDMI/CVBS OUT), and multi-channel video inputs (MIPI CSI/BT.656/BT.1120). It allows for 4K@60 fps H.265 decoding, 4K@25 fps H.264 decoding, DI, and 3D noise reduction. All these features, combined with its automatic color tuning system and trapezoid correction module, contribute to a smooth user experience and professional visual effects.|Industrial control, smart cockpits, smart home, smart electricity, and online education.|Code repositories:
[device_soc_allwinner](https://gitee.com/openharmony/device_soc_allwinner)
[device_board_isoftstone](https://gitee.com/openharmony/device_board_isoftstone)
[vendor_isoftstone](https://gitee.com/openharmony/vendor_isoftstone)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| +|Venus series smart TV khdvk_3566b development board|RK3566|Function description:
The khdvk_3566b development board comes with the Rockchip RK3566 Cortex-A55 quad-core processor. Thanks to a wide range of universal display ports and port types, it can be connected to a myriad of peripherals to meet the requirements of various man-machine interaction scenarios.|Tablets, learning machines, and facial recognition devices, including turnstiles, devices for facial recognition payment, industrial robots, medical devices, license plate recognition devices, advertising machines, digital signage, smart self-service terminals, and smart retail terminals.|Code repositories:
[device_soc_rockchip](https://gitee.com/openharmony/device_soc_rockchip)
[device_board_kaihong](https://gitee.com/openharmony/device_board_kaihong)
[vendor_kaihong](https://gitee.com/openharmony/vendor_kaihong)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| ## Small-System Development Boards | Board Model| Chip Model| Function Description and Use Case| Application Scenario| Code Repository and Daily Build| | ---------- | -------- | -------- | ------------ | -------------------------------------- | -|Hispark_Taurus|Hi3516DV300|Function description:
Hi3516D V300 is the next-generation system on chip (SoC) for smart HD IP cameras. It integrates the next-generation image signal processor (ISP), H.265 video compression encoder, and high-performance NNIE engine, and delivers high performance in terms of low bit rate, high image quality, intelligent processing and analysis, and low power consumption.|Smart devices with screens, such as refrigerators with screens and head units.|Code repositories:
[device_soc_hisilicon](https://gitee.com/openharmony/device_soc_hisilicon)
[device_board_hisilicon](https://gitee.com/openharmony/device_board_hisilicon)
[vendor_hisilicon](https://gitee.com/openharmony/vendor_hisilicon)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| -|BearPi-HM Micro|STM32MP157A|Function description:
The BearPi-HM Micro development board is equipped with the STM32MP157 chip, works with a 4.3-inch LCD capacitive touchscreen, and comes with Wi-Fi circuits and standards-based E53 interfaces. The E53 interfaces can be used to connect to smart humidifiers, smart desk lamps, smart security facilities, and intelligent smoke detectors.
Use case:
BearPi-HM Mircro Adaptation Case|Smart home, smart hardware, and central control screens.|Code repositories:
[device_soc_st](https://gitee.com/openharmony/device_soc_st)
[device_board_bearpi](https://gitee.com/openharmony/device_board_bearpi)
[vendor_bearpi](https://gitee.com/openharmony/vendor_bearpi)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|Hispark_Taurus|Hi3516DV300|Function description:
Hi3516DV300 is the next-generation system on chip (SoC) for smart HD IP cameras. It integrates the next-generation image signal processor (ISP), H.265 video compression encoder, and high-performance NNIE engine, and delivers high performance in terms of low bit rate, high image quality, intelligent processing and analysis, and low power consumption.|Smart devices with screens, such as refrigerators with screens and head units.|Code repositories:
[device_soc_hisilicon](https://gitee.com/openharmony/device_soc_hisilicon)
[device_board_hisilicon](https://gitee.com/openharmony/device_board_hisilicon)
[vendor_hisilicon](https://gitee.com/openharmony/vendor_hisilicon)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| +|BearPi-HM Micro|STM32MP157A|Function description:
The BearPi-HM Micro development board is equipped with the STM32MP157 chip, works with a 4.3-inch LCD capacitive touchscreen, and comes with Wi-Fi circuits and standards-based E53 interfaces. The E53 interfaces can be used to connect to smart humidifiers, smart desk lamps, smart security facilities, and intelligent smoke detectors.
Use case:
[BearPi-HM Mircro Adaptation Case](porting/porting-stm32mp15xx-on-smallsystem.md)|Smart home, smart hardware, and central control screens.|Code repositories:
[device_soc_st](https://gitee.com/openharmony/device_soc_st)
[device_board_bearpi](https://gitee.com/openharmony/device_board_bearpi)
[vendor_bearpi](https://gitee.com/openharmony/vendor_bearpi)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | ## Mini-System Development Boards @@ -28,8 +29,11 @@ Currently, the OpenHarmony community supports 17 types of development boards, as |Multi-modal V200Z-R|BES2600|Function description:
The multi-modal V200Z-R development board is a high-performance, multi-functional, and cost-effective AIoT SoC powered by the BES2600WM chip of Bestechnic. It integrates a quad-core Arm processor with a frequency of up to 1 GHz as well as dual-mode Wi-Fi and dual-mode Bluetooth. The board supports the 802.11 a/b/g/n/ and BT/BLE 5.2 standards. It is able to accommodate RAM of up to 42 MB and flash memory of up to 32 MB, and supports the MIPI display serial interface (DSI) and camera serial interface (CSI). It is applicable to various AIoT multi-modal VUI and GUI interaction scenarios.
Use case:
[Multi-modal V200Z-R Adaptation Case](porting/porting-bes2600w-on-minisystem-display-demo.md)|Smart hardware, and smart devices with screens, such as speakers and watches.|Code repositories:
[device_soc_bestechnic](https://gitee.com/openharmony/device_soc_bestechnic)
[device_board_fnlink](https://gitee.com/openharmony/device_board_fnlink)
[vendor_bestechnic](https://gitee.com/openharmony/vendor_bestechnic)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | |Langguo LANGO200|ASR582X|Function description:
The LANGO200 IoT development board integrates the high-performance WiFi-BLE dual-mode chip ASR5822, external storage chip, voice playing chip, and analog-to-digital converter. It supports common peripheral interfaces like SPI, and can be connected to an external OLED display and infrared remote control.
Use case:
[LANGO200 Adaptation Case](porting/porting-asr582x-combo-demo.md)|Connection modules for smart home products.|Code repositories:
[device_soc_asrmicro](https://gitee.com/openharmony/device_soc_asrmicro)
[device_board_lango](https://gitee.com/openharmony/device_board_lango)
[vendor_asrmicro](https://gitee.com/openharmony/vendor_asrmicro)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | |Goodix GR5515-STARTER-KIT|GR5515|Function description:
The GR5515-STARTER-KIT development board is a Bluetooth 5.1-capable single-mode Bluetooth low energy (BLE) SoC and comes with multifunctional keys and LED indicators.|Smart hardware, such as watches, wristbands, and price tags.|Code repositories:
[device_soc_goodix](https://gitee.com/openharmony/device_soc_goodix)
[device_board_goodix](https://gitee.com/openharmony/device_board_goodix)
[vendor_goodix](https://gitee.com/openharmony/vendor_goodix)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| -|Niobe407|STM32F407IGT6|Function description:
The Niobe407 development board is powered by the STM32F407 chip, which integrates the Arm Cortex-M4 CPU with the FPU and adaptive real-time accelerator and is cloced at up to 168 MHz.
Use case:
Niobe407 Adaptation Case|Smart transportation and industrial control.|Code repositories:
[device_soc_st](https://gitee.com/openharmony/device_soc_st)
[device_board_talkweb](https://gitee.com/openharmony/device_board_talkweb)
[vendor_talkweb](https://gitee.com/openharmony/vendor_talkweb)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|Niobe407|STM32F407IGT6|Function description:
The Niobe407 development board is powered by the STM32F407 chip, which integrates the Arm Cortex-M4 CPU with the FPU and adaptive real-time accelerator and is clocked at up to 168 MHz.
Use case:
[Niobe407 Adaptation Case](porting/porting-stm32f407-on-minisystem-eth.md)|Smart transportation and industrial control.|Code repositories:
[device_soc_st](https://gitee.com/openharmony/device_soc_st)
[device_board_talkweb](https://gitee.com/openharmony/device_board_talkweb)
[vendor_talkweb](https://gitee.com/openharmony/vendor_talkweb)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | |B91 Generic Starter Kit|TLSR9x|Function description:
The B91 Generic Starter Kit developed by Telink is a hardware platform that can be used to evaluate TLSR9 chipsets. You can leverage it to develop applications that comply with the 2.4 GHz interface standards, such as BLE, BLE Mesh, Zigbee 3.0, Thread, and 2.4 GHz proprietary protocols.|Connection modules for smart home products.|Code repositories:
[device_soc_telink](https://gitee.com/openharmony/device_soc_telink)
[device_board_telink](https://gitee.com/openharmony/device_board_telink)
[vendor_telink](https://gitee.com/openharmony/vendor_telink)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds| -|cst85_wblink|cst85f01|Function description:
The cst85_wblink development board is a high-performance, multi-functional, and cost-effective AIoT SoC development board developed by CHIPSEA based on the cst85f01 chip. The cst85_wblink development board integrates dual-band Wi-Fi and dual-mode Bluetooth and supports standard 802.11 a/b/g/n protocols and Bluetooth/BLE 5.0 protocols. It comes in multiple memory flavors, with up to 992 KB of RAM and up to 16 MB of flash memory. In addition, it supports MIPI DSI and CSI, which makes it a great choice for developing Wi-Fi and Bluetooth applications for IoT and smart devices.
Use case:
cst85_wblink Adaptation Case|IoT and smart home.|Code repositories:
[device_soc_chipsea](https://gitee.com/openharmony/device_soc_chipsea)
[device_board_chipsea](https://gitee.com/openharmony/device_board_chipsea)
[vendor_chipsea](https://gitee.com/openharmony/vendor_chipsea)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | -|Neptune100| W800 |Function description:
Based on the WinnerMicro W800 chip, the Neptune 100 development board is a Wi-Fi & Bluetooth dual-mode SoC development board. It supports the standard 802.11 b/g/n protocols and has a complete built-in TCP/IP protocol stack. Its built-in Bluetooth baseband processor supports the Bluetooth/BLE4.2 protocols. It provides various digital interfaces, including the built-in QFlash, SPI, UART, GPIO, I2C, I2S and 7816 interfaces. The development board provides reliable security with support for a wide array of security features: hardware encryption and decryption algorithms, built-in DSP, floating-point arithmetic unit, security engine, code security permission configuration, built-in 2 MB flash memory, firmware encryption storage, firmware signature, secure debugging, and secure upgrade.
Use case:
Neptune 100 Adaptation Case|IoT, smart home, and connection products.|Code repositories:
[device_soc_winnermicro](https://gitee.com/openharmony/device_soc_winnermicro)
[device_board_hihope](https://gitee.com/openharmony/device_board_hihope)
[vendor_hihope](https://gitee.com/openharmony/vendor_hihope)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|cst85_wblink|cst85f01|Function description:
The cst85_wblink development board is a high-performance, multi-functional, and cost-effective AIoT SoC development board developed by CHIPSEA based on the cst85f01 chip. The cst85_wblink development board integrates dual-band Wi-Fi and dual-mode Bluetooth and supports standard 802.11 a/b/g/n protocols and Bluetooth/BLE 5.0 protocols. It comes in multiple memory flavors, with up to 992 KB of RAM and up to 16 MB of flash memory. In addition, it supports MIPI DSI and CSI, which makes it a great choice for developing Wi-Fi and Bluetooth applications for IoT and smart devices.
Use case:
[cst85_wblink Adaptation Case](porting/porting-cst85f01-combo-demo.md)|IoT and smart home.|Code repositories:
[device_soc_chipsea](https://gitee.com/openharmony/device_soc_chipsea)
[device_board_chipsea](https://gitee.com/openharmony/device_board_chipsea)
[vendor_chipsea](https://gitee.com/openharmony/vendor_chipsea)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|Neptune100| W800 |Function description:
Based on the WinnerMicro W800 chip, the Neptune 100 development board is a Wi-Fi & Bluetooth dual-mode SoC development board. It supports the standard 802.11 b/g/n protocols and has a complete built-in TCP/IP protocol stack. Its built-in Bluetooth baseband processor supports the Bluetooth/BLE4.2 protocols. It provides various digital interfaces, including the built-in QFlash, SPI, UART, GPIO, I2C, I2S and 7816 interfaces. The development board provides reliable security with support for a wide array of security features: hardware encryption and decryption algorithms, built-in DSP, floating-point arithmetic unit, security engine, code security permission configuration, built-in 2 MB flash memory, firmware encryption storage, firmware signature, secure debugging, and secure upgrade.
Use case:
[Neptune 100 Adaptation Case](porting/porting-w800-combo-demo.md)|IoT, smart home, and connection products.|Code repositories:
[device_soc_winnermicro](https://gitee.com/openharmony/device_soc_winnermicro)
[device_board_hihope](https://gitee.com/openharmony/device_board_hihope)
[vendor_hihope](https://gitee.com/openharmony/vendor_hihope)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | |RK2206| RK2206 |Function description:
The RK2206 development board uses the high-performance and cost-effective RK2206 chip as its main control board. It runs the OpenHarmony mini system and provides built-in Wi-Fi/AP and NFC features as well as LCD and E53 interfaces. The E53 interfaces are compatible with various sensor modules, facilitating diversified IoT applications. The RK2006 development board has been deployed in more than 20 mature use cases and demonstrated in comprehensive courseware.|Smart city, smart home, smart teaching, smart vehicle-mounted devices, and smart healthcare.|Code repositories:
[device_soc_rockchip](https://gitee.com/openharmony/device_soc_rockchip)
[device_board_lockzhiner](https://gitee.com/openharmony/device_board_lockzhiner)
[vendor_lockzhiner](https://gitee.com/openharmony/vendor-lockzhiner)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|HPM6750EVK2 development board| HPM6700 |Function description:
The HPM6700/6400 series MCU is a high-performance real-time RISC-V microcontroller from Shanghai Xianji Semiconductor Technology Co., Ltd.. It provides high computing power, efficient control, and various multimedia functions for industrial automation and edge computing applications.|Industrial control and edge computing.|Code repositories:
[device_soc_hpmicro](https://gitee.com/openharmony/device_soc_hpmicro)
[device_board_hpmicro](https://gitee.com/openharmony/device_board_hpmicro)
[vendor_hpmicro](https://gitee.com/openharmony/vendor_hpmicro)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|NiobeU4| ESP32U4WDH |Function description:
NiobeU4 is an IoT device development suite developed based on ESP32U4WDH. It integrates 2.4 GHz Wi-Fi and dual-mode Bluetooth and features ultra-high RF performance, stability, universality, reliability, and ultra-low power consumption. It works at 13.56 MHz and supports NFC contactless communication.|Contactless reader/writer applications that require low power consumption, voltage, and cost; lithium battery power supply and charge/discharge management; out-of-the-box intelligent hardware solution for developers to verify and develop their own software and functions.|Code repositories:
[device_soc_esp](https://gitee.com/openharmony/device_soc_esp)
[device_board_openvalley ](https://gitee.com/openharmony/device_board_openvalley)
[vendor_openvalley](https://gitee.com/openharmony/vendor_openvalley)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | +|BK7235 development board| BK7235 |Function description:
BK7235 is a highly integrated Wi-Fi 6+BLE 5.2 combo SoC developed by Beken for IoT applications. It features diverse array of resources, powerful performance, and high security.|IoT, smart home, and connection products.|Code repositories:
[device_soc_beken](https://gitee.com/openharmony/device_soc_beken)
[device_board_beken](https://gitee.com/openharmony/device_board_beken)
[vendor_beken](https://gitee.com/openharmony/vendor_beken)
Daily build:
http://ci.openharmony.cn/dailys/dailybuilds | diff --git a/en/device-dev/device-test/Readme-EN.md b/en/device-dev/device-test/Readme-EN.md new file mode 100644 index 0000000000..4ca9e2c132 --- /dev/null +++ b/en/device-dev/device-test/Readme-EN.md @@ -0,0 +1,6 @@ +# Device Test + +- [Development Self-Test Framework User Guide](developer_test.md) +- [xDevice User Guide](xdevice.md) +- [XTS Test Case Development Guide](xts.md) + diff --git a/en/device-dev/device-test/developer_test.md b/en/device-dev/device-test/developer_test.md new file mode 100644 index 0000000000..4faa7c3315 --- /dev/null +++ b/en/device-dev/device-test/developer_test.md @@ -0,0 +1,975 @@ +# Development Self-Test Framework User Guide + + +## Overview + +OpenHarmony provides you with a comprehensive development self-test framework **developer_test**. As a part of the OpenHarmony test toolset, the development self-test framework is provided for you to test the development by yourself. You can develop relevant test cases based on your test requirements to discover defects at the development phase, greatly improving the code quality. + +This document describes how to use the development self-test framework of OpenHarmony. + + +### Introduction + +After adding or modifying code, OpenHarmony developers want to quickly verify whether the modified code functions properly, and the system already has a large number of automated test cases of existing functions, such as TDD cases and XTS cases. The development self-test framework aims to help you improve your self-test efficiency so that you can quickly execute the specified automated test cases and conducting development tests at the development phase. + + +### Constraints + +When executing test cases using the framework, you must connect to the OpenHarmony device in advance. + + +## Environment Preparations + +The development self-test framework depends on the Python environment. It is required that the Python version be 3.7.5 or later. Before using the framework, you can refer to the following document for configuration. + +Click [here](https://gitee.com/openharmony/docs/blob/master/en/device-dev/get-code/sourcecode-acquire.md) to obtain the source code. + +### Basic Self-Test Framework Environment + +| Environment Dependency | Version | Description | +| ----------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| Operating system | Ubuntu 18.04 or later | Code compilation environment. | +| Linux extension component| libreadline-dev | Plugin used to read commands. | +| python | 3.7.5 or later | Language used by the test framework. | +| Python plugins | pyserial 3.3 or later, paramiko 2.7.1 or later, setuptools 40.8.0 or later, and rsa4.0 or later| - **pserial**: supports Python serial port communication.
- **paramiko**: allows Python to use SSH.
- **setuptools**: allows Python packages to be created and distributed easily.
- **rsa**: implements RSA encryption in Python.| +| NFS Server | haneWIN NFS Server 1.2.50 or later or NFS v4 or later | Devices can be connected using serial ports. Mini- and small-system devices are used. | +| HDC | 1.1.0 | A tool that enables devices to be connected through the HarmonyOS Device Connector (HDC). | + + + +1. Run the following command to install the Linux extended component readline: + + ```bash + sudo apt-get install libreadline-dev + ``` + The installation is successful if the following information is displayed: + ``` + Reading package lists... Done + Building dependency tree + Reading state information... Done + libreadline-dev is already the newest version (7.0-3). + 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. + ``` + +2. Run the following command to install the **setuptools** plugin: + ```bash + pip3 install setuptools + ``` + The installation is successful if the following information is displayed: + ``` + Requirement already satisfied: setuptools in d:\programs\python37\lib\site-packages (41.2.0) + ``` + +3. Run the following command to install the **paramiko** plugin: + ```bash + pip3 install paramiko + ``` + The installation is successful if the following information is displayed: + ``` + Installing collected packages: pycparser, cffi, pynacl, bcrypt, cryptography, paramiko + Successfully installed bcrypt-3.2.0 cffi-1.14.4 cryptography-3.3.1 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0 + ``` + +4. Run the following command to install the **ras** plugin: + ```bash + pip3 install rsa + ``` + The installation is successful if the following information is displayed: + ``` + Installing collected packages: pyasn1, rsa + Successfully installed pyasn1-0.4.8 rsa-4.7 + ``` + +5. Run the following command to install the **pyserial** plugin: + ```bash + pip3 install pyserial + ``` + The installation is successful if the following information is displayed: + ``` + Requirement already satisfied: pyserial in d:\programs\python37\lib\site-packages\pyserial-3.4-py3.7.egg (3.4) + ``` + +6. Install the NFS server if the device outputs results only through the serial port. + + > This step is applicable to small-system or mini-system devices. + + - Windows OS: Install the **haneWIN NFS Server1.2.50** package. + - Linux OS: Run the following command to install the NFS server: + ```bash + sudo apt install nfs-kernel-server + ``` + The installation is successful if the following information is displayed: + ``` + Reading package lists... Done + Building dependency tree + Reading state information... Done + nfs-kernel-server is already the newest version (1:1.3.4-2.1ubuntu5.3). + 0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded. + ``` + +7. If the device supports HDC connection, install the HDC tool. For details about the installation process, see [HDC-OpenHarmony device connector](https://gitee.com/openharmony/developtools_hdc_standard/blob/master/README.md). + + +### Environment Dependency Check + +| Check Item | Operation | Requirement | +| -------------------------------------------------- | --------------------------------------------------- | ------------------------- | +| Check whether Python is installed successfully. | Run the **python --version** command. | The Python version is 3.7.5 or later. | +| Check whether Python plugins are successfully installed. | Go to the **test/developertest** directory and run **start.bat** or **start.sh**.| The **>>>** prompt is displayed.| +| Check the NFS server status (for the devices that support only serial port output).| Log in to the development board through the serial port and run the **mount** command to mount the NFS. | The file directory can be mounted. | +| Check whether the HDC is successfully installed. | Run the **hdc_std -v** command. | The HDC version is 1.1.0 or later. | + + +## Test Case Preparation + +The test framework supports multiple types of tests and provides different test case templates for them._ + +**TDD Test (C++)** + +Naming rules for source files + +The source file name of test cases must be the same as that of the test suite. The file names must use lowercase letters and in the *Function*_*Sub-function*_**test** format. More specific sub-functions can be added as required. +Example: +``` +calculator_sub_test.cpp +``` + +Test case example +```c++ +/* + * Copyright (c) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "calculator.h" +#include + +using namespace testing::ext; + +class CalculatorSubTest : public testing::Test { +public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(); + void TearDown(); +}; + +void CalculatorSubTest::SetUpTestCase(void) +{ + // Set a setup function, which will be called before all test cases. +} + +void CalculatorSubTest::TearDownTestCase(void) +{ + // Set a teardown function, which will be called after all test cases. +} + +void CalculatorSubTest::SetUp(void) +{ + // Set a setup function, which will be called before all test cases. +} + +void CalculatorSubTest::TearDown(void) +{ + // Set a teardown function, which will be called after all test cases. +} + +/** + * @tc.name: integer_sub_001 + * @tc.desc: Verify the sub function. + * @tc.type: FUNC + * @tc.require: issueNumber + */ +HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1) +{ + // Step 1 Call the function to obtain the test result. + int actual = Sub(4, 0); + + // Step 2 Use an assertion to compare the obtained result with the expected result. + EXPECT_EQ(4, actual); +} +``` +The procedure is as follows: + +1. Add comment information to the test case file header. + +``` +/* + * Copyright (c) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +``` + +2. Add the test framework header file and namespace. + +```c++ +#include + +using namespace testing::ext; +``` + +3. Add the header file of the test class. + +```c++ +#include "calculator.h" +``` + +4. Define the test suite (test class). + +```c++ +class CalculatorSubTest : public testing::Test { +public: + static void SetUpTestCase(void); + static void TearDownTestCase(void); + void SetUp(); + void TearDown(); +}; + +void CalculatorSubTest::SetUpTestCase(void) +{ + // Set a setup function, which will be called before all test cases. +} + +void CalculatorSubTest::TearDownTestCase(void) +{ + // Set a teardown function, which will be called after all test cases. +} + +void CalculatorSubTest::SetUp(void) +{ + // Set a setup function, which will be called before all test cases. +} + +void CalculatorSubTest::TearDown(void) +{ + // Set a teardown function, which will be called after all test cases. +}== +``` +> **NOTE** +> +> When defining a test suite, ensure that the test suite name is the same as the target to build and uses the upper camel case style. + +5. Add implementation of the test cases, including test case comments and logic. + +```c++ +/** + * @tc.name: integer_sub_001 + * @tc.desc: Verify the sub function. + * @tc.type: FUNC + * @tc.require: issueNumber + */ +HWTEST_F(CalculatorSubTest, integer_sub_001, TestSize.Level1) +{ + // Step 1 Call the function to obtain the test result. + int actual = Sub(4, 0); + + // Step 2 Use an assertion to compare the obtained result with the expected result. + EXPECT_EQ(4, actual); +} +``` +> **NOTE** +> +> @tc.require: The format must be started with **AR/SR** or **issue**, for example, **issueI56WJ7**. + +The following test case templates are provided for your reference. + +| Type | Description | +| --------------- | ------------------------------------------------ | +| HWTEST(A,B,C) | Use this template if the test case execution does not depend on setup or teardown. | +| HWTEST_F(A,B,C) | Use this template if the test case execution (excluding parameters) depends on setup or teardown.| +| HWTEST_P(A,B,C) | Use this template if the test case execution (including parameters) depends on setup or teardown. | + +In the template names: + +- **A** indicates the test suite name. + +- **B** indicates the test case name, which is in the *Function*_*No.* format. The *No.* is a three-digit number starting from **001**. + +- *C* indicates the test case level. There are five test case levels: guard-control level 0 and non-guard-control level 1 to level 4. Of levels 1 to 4, a smaller value indicates a more important function verified by the test case. + + +**NOTE** + +- The expected result of each test case must have an assertion. + +- The test case level must be specified. + +- It is recommended that the test be implemented step by step according to the template. + +- The comment must contain the test case name, description, type, and requirement number, which are in the @tc.*xxx*: *value* format. The test case type @**tc.type** can be any of the following: + + +| Test Case Type| Code| +| ------------ | -------- | +| Function test | FUNC | +| Performance test | PERF | +| Reliability test | RELI | +| Security test | SECU | +| Fuzzing test | FUZZ | + +**TDD Test (JS)** + +- Naming rules for source files + + +The source file name of a test case must be in the *Function**Sub-function***Test** format, and each part must use the upper camel case style. More specific sub-functions can be added as required. +Example: +``` +AppInfoTest.js +``` + +- Test case example + +```js +/* + * Copyright (C) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import app from '@system.app' + +import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + +describe("AppInfoTest", function () { + beforeAll(function() { + // Set a setup function, which will be called before all test cases. + console.info('beforeAll caled') + }) + + afterAll(function() { + // Set a teardown function, which will be called after all test cases. + console.info('afterAll caled') + }) + + beforeEach(function() { + // Set a setup function, which will be called before all test cases. + console.info('beforeEach caled') + }) + + afterEach(function() { + // Set a teardown function, which will be called after all test cases. + console.info('afterEach caled') + }) + + /* + * @tc.name:appInfoTest001 + * @tc.desc:verify app info is not null + * @tc.type: FUNC + * @tc.require: issueNumber + */ + it("appInfoTest001", 0, function () { + // Step 1 Call the function to obtain the test result. + var info = app.getInfo() + + // Step 2 Use an assertion to compare the obtained result with the expected result. + expect(info != null).assertEqual(true) + }) +}) +``` +The procedure is as follows: +1. Add comment information to the test case file header. + ``` + /* + * Copyright (C) 2021 XXXX Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + ``` +2. Import the APIs and JSUnit test library to test. + ```js + import app from '@system.app' + + import {describe, beforeAll, beforeEach, afterEach, afterAll, it, expect} from 'deccjsunit/index' + ``` +3. Define the test suite (test class). + ```js + describe("AppInfoTest", function () { + beforeAll(function() { + // Set a setup function, which will be called before all test cases. + console.info('beforeAll caled') + }) + + afterAll(function() { + // Set a teardown function, which will be called after all test cases. + console.info('afterAll caled') + }) + + beforeEach(function() { + // Set a setup function, which will be called before all test cases. + console.info('beforeEach caled') + }) + + afterEach(function() { + // Set a teardown function, which will be called after all test cases. + console.info('afterEach caled') + }) + ``` +4. Add implementation of the test cases. + ```JS + /* + * @tc.name:appInfoTest001 + * @tc.desc:verify app info is not null + * @tc.type: FUNC + * @tc.require: issueNumber + */ + it("appInfoTest001", 0, function () { + // Step 1 Call the function to obtain the test result. + var info = app.getInfo() + + // Step 2 Use an assertion to compare the obtained result with the expected result. + expect(info != null).assertEqual(true) + }) + ``` + > **NOTE** + > + > @tc.require: The format must be started with **issue**, for example, **issueI56WJ7**. + +**Fuzzing Test** + +[Fuzzing case specifications](https://gitee.com/openharmony/test_developertest/blob/master/libs/fuzzlib/README_zh.md) + + +**Benchmark Test** + +[Benchmark case specifications](https://gitee.com/openharmony/test_developertest/blob/master/libs/benchmark/README_zh.md) + +## **Test Case Building** + +When a test case is executed, the test framework searches for the build file of the test case in the test case directory and builds the test case located. The following describes how to write build files (GN files) in different programming languages. + +**TDD Test** + +The following provides templates for different languages for your reference. + +- **Test case build file example (C++)** + +``` +# Copyright (c) 2021 XXXX Device Co., Ltd. + +import("//build/test.gni") + +module_output_path = "developertest/calculator" + +config("module_private_config") { + visibility = [ ":*" ] + + include_dirs = [ "../../../include" ] +} + +ohos_unittest("CalculatorSubTest") { + module_out_path = module_output_path + + sources = [ + "../../../include/calculator.h", + "../../../src/calculator.cpp", + ] + + sources += [ "calculator_sub_test.cpp" ] + + configs = [ ":module_private_config" ] + + deps = [ "//third_party/googletest:gtest_main" ] +} + +group("unittest") { + testonly = true + deps = [":CalculatorSubTest"] +} +``` +The procedure is as follows: + +1. Add comment information for the file header. + ``` + # Copyright (c) 2021 XXXX Device Co., Ltd. + ``` +2. Import the build template. + ``` + import("//build/test.gni") + ``` +3. Specify the file output path. + ``` + module_output_path = "developertest/calculator" + ``` + > **NOTE**
The output path is ***Part name*/*Module name***. + +4. Configure the directories for dependencies. + + ``` + config("module_private_config") { + visibility = [ ":*" ] + + include_dirs = [ "../../../include" ] + } + ``` + > **NOTE** + > + > Generally, the dependency directories are configured here and directly referenced in the build script of the test case. + +5. Set the output build file for the test cases. + + ``` + ohos_unittest("CalculatorSubTest") { + } + ``` +6. Write the build script (add the source file, configuration, and dependencies) for the test cases. + ``` + ohos_unittest("CalculatorSubTest") { + module_out_path = module_output_path + sources = [ + "../../../include/calculator.h", + "../../../src/calculator.cpp", + "../../../test/calculator_sub_test.cpp" + ] + sources += [ "calculator_sub_test.cpp" ] + configs = [ ":module_private_config" ] + deps = [ "//third_party/googletest:gtest_main" ] + } + ``` + + > **NOTE** + > + > Set the test type based on actual requirements. The following test types are available: + > + > - **ohos_unittest**: unit test + > - **ohos_moduletest**: module test + > - **ohos_systemtest**: system test + > - **ohos_performancetest**: performance test + > - **ohos_securitytest**: security test + > - **ohos_reliabilitytest**: reliability test + > - **ohos_distributedtest**: distributed test + +7. Group the test case files by test type. + + ``` + group("unittest") { + testonly = true + deps = [":CalculatorSubTest"] + } + ``` + > **NOTE** + > + > Grouping test cases by test type allows you to execute a specific type of test cases when required. + +- **Test case build file example (JavaScript)** + +``` +# Copyright (C) 2021 XXXX Device Co., Ltd. + +import("//build/test.gni") + +module_output_path = "developertest/app_info" + +ohos_js_unittest("GetAppInfoJsTest") { + module_out_path = module_output_path + + hap_profile = "./config.json" + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" +} + +group("unittest") { + testonly = true + deps = [ ":GetAppInfoJsTest" ] +} +``` + +The procedure is as follows: + +1. Add comment information for the file header. + +``` +# Copyright (C) 2021 XXXX Device Co., Ltd. +``` + +2. Import the build template. + +``` +import("//build/test.gni") +``` + +3. Specify the file output path. + +``` +module_output_path = "developertest/app_info" +``` +> **NOTE** +> +> The output path is ***Part name*/*Module name***. + +4. Set the output build file for the test cases. + +``` +ohos_js_unittest("GetAppInfoJsTest") { +} +``` +> **NOTE** +> - Use the **ohos_js_unittest** template to define the JavaScript test suite. Pay attention to the difference between JavaScript and C++. +> - The file generated for the JavaScript test suite must be in .hap format and named after the test suite name defined here. The test suite name must end with **JsTest**. + +5. Configure the **config.json** file and signature file, which are mandatory. + +``` +ohos_js_unittest("GetAppInfoJsTest") { + module_out_path = module_output_path + + hap_profile = "./config.json" + certificate_profile = "//test/developertest/signature/openharmony_sx.p7b" +} +``` +**config.json** is the configuration file required for HAP build. You need to set **target** based on the tested SDK version. Default values can be retained for other items. The following is an example: + +```json +{ + "app": { + "bundleName": "com.example.myapplication", + "vendor": "example", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5 // Set it based on the tested SDK version. In this example, SDK5 is used. + } + }, + "deviceConfig": {}, + "module": { + "package": "com.example.myapplication", + "name": ".MyApplication", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "entry", + "moduleType": "entry" + }, + "abilities": [ + { + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ], + "name": "com.example.myapplication.MainAbility", + "icon": "$media:icon", + "description": "$string:mainability_description", + "label": "MyApplication", + "type": "page", + "launchType": "standard" + } + ], + "js": [ + { + "pages": [ + "pages/index/index" + ], + "name": "default", + "window": { + "designWidth": 720, + "autoDesignWidth": false + } + } + ] + } + } +``` + +6. Group the test case files by test type. + +``` +group("unittest") { + testonly = true + deps = [ ":GetAppInfoJsTest" ] +} +``` +> **NOTE** +> +> Grouping test cases by test type allows you to execute a specific type of test cases when required. + +**Fuzzing Test** + +[Fuzzing case specifications](https://gitee.com/openharmony/test_developertest/blob/master/libs/fuzzlib/README_zh.md) + +**Benchmark Test** + +[Benchmark case specifications](https://gitee.com/openharmony/test_developertest/blob/master/libs/benchmark/README_zh.md) + + +**Configuring ohos.build** + +Configure the part build file to associate with specific test cases. +``` +"partA": { + "module_list": [ + + ], + "inner_list": [ + + ], + "system_kits": [ + + ], + "test_list": [ // Test under configuration module calculator. + "//system/subsystem/partA/calculator/test:unittest", + "//system/subsystem/partA/calculator/test:fuzztest", + "//system/subsystem/partA/calculator/test:benchmarktest" + } +``` +> **NOTE**
**test_list** contains the test cases of the corresponding module. + +## Configuring Test Resources + +Test resources include external file resources, such as image files, video files, and third-party libraries, required for test case execution. + +Perform the following steps: + +1. Create a **resource** directory under the **test** directory of the part, create a corresponding module directory under the **resource** directory, and store the resource files required in this module directory. + +2. In the module directory under **resource**, create the **ohos_test.xml** file in the following format: + +```xml + + + + + + + +``` + +3. In the build file of the test cases, configure **resource_config_file** to point to the resource file **ohos_test.xml**. + +``` +ohos_unittest("CalculatorSubTest") { + resource_config_file = "//system/subsystem/partA/test/resource/calculator/ohos_test.xml" +} +``` +>**NOTE** +>- **target_name** indicates the test suite name defined in the **BUILD.gn** file in the **test** directory. **preparer** indicates the action to perform before the test suite is executed. +>- **src="res"** indicates that the test resources are in the **resource** directory under the **test** directory. **src="out"** indicates that the test resources are in the **out/release/$(*part*)** directory. + +## Test Case Execution + +### Configuration File + +Before executing test cases, you need to modify the configuration based on the device used. + +#### Modifying user_config.xml +```xml + + + + false + + false + + true + + + + + + + + + + + + + + + + + cmd + 115200 + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + +``` +>**NOTE** +> +>If HDC is connected to the device before the test cases are executed, you only need to configure the device IP address and port number, and retain the default settings for other parameters. + +### Command Description + +1. Start the test framework. + ``` + start.bat + ``` +2. Select the product. + + After the test framework starts, you are asked to select a product. Select the development board to test. + + If you need to manually add a product, add it within the **\** tag to **config/framework_config.xml**. + +3. Execute test cases. + + Run the following command to execute test cases: + ``` + run -t UT -ts CalculatorSubTest -tc interger_sub_00l + ``` + In the command: + ``` + -**t [TESTTYPE]**: specifies the test type, which can be **UT**, **MST**, **ST**, **PERF**, **FUZZ**, or **BENCHMARK**. This parameter is mandatory. + -**tp [TESTPART]**: specifies the part to test. This parameter can be used independently. + -**tm [TESTMODULE]**: specifies the module to test. This parameter must be specified together with **-tp**. + -**ts [TESTSUITE]**: specifies a test suite. This parameter can be used independently. + -**tc [TESTCASE]**: specifies a test case. This parameter must be specified together with **-ts**. + -**h**: displays help information. + ``` + +#### Executing Test Cases on Windows + +Test cases cannot be built on Windows. You need to run the following command to build test cases on Linux: +``` +./build.sh --product-name {product_name} --build-target make_test +``` + +>**NOTE** +>- **product-name**: specifies the name of the product to be compiled. +>- **build-target**: specifies the test case to build. **make_test** indicates all test cases. You can specify the test cases based on requirements. + +After the build is complete, the test cases are automatically saved in **out/ohos-arm-release/packages/phone/tests**. + +##### Setting Up the Execution Environment +1. On Windows, create the **Test** directory in the test framework and then create the **testcase** directory in the **Test** directory. + +2. Copy **developertest** and **xdevice** from the Linux environment to the **Test** directory on Windows, and copy the test cases to the **testcase** directory. + + >**NOTE** + > + >Port the test framework and test cases from the Linux environment to the Windows environment for subsequent execution. + +3. Modify the **user_config.xml** file. + ```xml + + + false + + + + D:\Test\testcase\tests + + ``` + >**NOTE** + > + >**\** indicates whether to build test cases. **\** indicates the path for searching for test cases. + +#### Executing Test Cases on Linux + +If you directly connect to a Linux host, you can directly run commands to execute test cases. + +##### Mapping the Remote Port +To enable test cases to be executed on a remote Linux server or a Linux VM, map the port to enable communication between the device and the remote server or VM. Configure port mapping as follows: +1. On the HDC server, run the following commands: + ``` + hdc_std kill + hdc_std -m -s 0.0.0.0:8710 + ``` + >**NOTE** + > + >The IP address and port number are default values. + +2. On the HDC client, run the following command: + ``` + hdc_std -s xx.xx.xx.xx:8710 list targets + ``` + >**NOTE** + > + >Enter the IP address of the device to test. + +## Viewing the Test Result + +### Test Report Logs + +After the test cases are executed, the test result will be automatically generated. You can view the detailed test result in the related directory. + +### Test Result +You can obtain the test result in the following directory: +``` +test/developertest/reports/xxxx_xx_xx_xx_xx_xx +``` +>**NOTE** +> +>The folder for test reports is automatically generated. + +The folder contains the following files: +| Type | Description | +| ------------------------------------ | ------------------ | +| result/ | Test cases in standard format.| +| log/plan_log_xxxx_xx_xx_xx_xx_xx.log | Test case logs. | +| summary_report.html | Test report summary. | +| details_report.html | Detailed test report. | + +### Test Framework Logs +``` +reports/platform_log_xxxx_xx_xx_xx_xx_xx.log +``` + +### Latest Test Report +``` +reports/latest +``` diff --git a/en/device-dev/device-test/figures/FAQ-1.PNG b/en/device-dev/device-test/figures/FAQ-1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..bebb315141c4cc3c004b502bb288705c8af9ebd8 GIT binary patch literal 137741 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

>#=avr% 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 literal 0 HcmV?d00001 diff --git a/en/device-dev/device-test/figures/L0-1.PNG b/en/device-dev/device-test/figures/L0-1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..de07672f8c2e4039fb8db712dfbf5bf6bcf9dec1 GIT binary patch literal 67322 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 r3QzG*M` literal 0 HcmV?d00001 diff --git a/en/device-dev/device-test/figures/NFS-2.PNG b/en/device-dev/device-test/figures/NFS-2.PNG new file mode 100644 index 0000000000000000000000000000000000000000..f28bc54cac3eb231ce16681cf8f1736823cd2cae GIT binary patch literal 61951 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%0D1SWCam4v+sDDNm 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 DkmpMZ literal 0 HcmV?d00001 diff --git a/en/device-dev/device-test/figures/en-us_image_0000001154351160.jpg b/en/device-dev/device-test/figures/en-us_image_0000001154351160.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ace4cefd36637675f235df3cd596eca3ed218e6c GIT binary patch literal 9280 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 literal 0 HcmV?d00001 diff --git a/en/device-dev/device-test/figures/en-us_image_0000001200230833.gif b/en/device-dev/device-test/figures/en-us_image_0000001200230833.gif new file mode 100644 index 0000000000000000000000000000000000000000..9cd37267672d3bea422b98d95c413e26df330de8 GIT binary patch literal 6570 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 JM0d_6{{uMe%Deyo literal 0 HcmV?d00001 diff --git a/en/device-dev/device-test/figures/result-1.PNG b/en/device-dev/device-test/figures/result-1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..64c730feade073029102459e92c01f8ff885f51d GIT binary patch literal 410945 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
    %=9$4YOlrEM>h@TZ zRg9XQTj5Qyt`IW<*aYOE=iWW^)keZVAjFKoaxGFD`*8p5eOx-U7pd+xFw>Y_(B&|* zvH+)U|BCI{`Ib0hcj883nGip;|awPWy?(< z#qwOrN{}~nM%dm-{M-NMzwoE=W@PypE+S^$pNr}o6U#-JGk;3B~6)6stRC0?FLgOyG& zB4Qk2XvDq~iiSJ)@aTLSQhcpuaw6JxK1e=!8*k56AkajdQ?TM(;aC*Zb&*A5zp>k2 zI2M-sruh-_0_Go8plch3qGK0vzAFcTW;D0lbqY|oSc$C_6)4&o1lu_UAws;XFVDo$ ztH0oX{`Y+}Z}fsOJF4SL@J{3AllW}y$Nj%uLr1I!XWwO&?6Edy0#6=~V3)6%5bqMc z{|78yAVr};nmC1{l@?f8y>;v$OuN53=iS#rCa#%-+#s3?mVni5mni7RhwE| zTcp;r6BzC3Kx6ej95{6jN9xKEVM0WnwJ0Q|l_%n~vEwElJ$it16QdZOzPIT9S00m- z`|qnLbJF7$=6F1FlwA1_{BZXo2E?x=867{1dvAZk-`{j&lO`i(;?MGtLIyzI#0?=y zg{W&igu$!N@z?+Ocf7nmiO%+YXw2OJH!Ho_UAIhWq>SK`(S(636FAw@ggw;rW5Rf4q&xo{9KX(_^3gjgKi_5Oy`7z;ksT z_O!R6<=7t7*4Ln><^cKzui`3=XY+Ca_ik9QsG@9&qD%k4+k2NVFgg!2W8=8<`ZxUB zPp6TnCBCCeXf!`myufrsNsb3Y`v_#!9z;h^J@z#3LUmO$jvSxFwX=h$NN|UthFH}y zhZ#e7rPkrhM><$$+k8V+DI6Oo_#Lsw20n6-fOA=O%EP%jw z8!CH-@!;+mv{hE4y0!`J9o;zAl#Ufvs=_K?c0F4-H*!YcmIBnZbmGj^6AtgMA6>wq zgDq&t+Xyf5UFH-p$lI+!YF-(39XN^0kAK16|MNH8pXx`0xL@jan~LXw#f?4x0VfYZIz#cA@t0 z2p<3Vcl`YyKVfR93%hHoP`=R<)90e{2ovf8B80gIaF_^ZeaCLpRM(@qq+ z&zx#PV*}lv#&xjkFvf+{$PvYsHU*PgU8!F;O-F4U^t+p4oG@i!L@opTct;O!$yHQ))h`kNFu-#9W zYqi9FgQubn1G9BFc=H$By>}iRoqMp0=4JQpS~TrFi0<|_WChvJkS-Nv3d&7Ak={VQ zxH5DIIbj|!7m#kq%acvrg4~J*?5?W7(F-r|=ciZD zwZ9QHyX(-H5dtG!4Vu$=c&C3WIELZytxLF0&&DC}+sC3VtHaI!>{u+J73i zfBp?WU+Y0}?pF922)n_kS-5d+y#Mj*6&$TeMufW#*DXe#rwi+~S=f7g7(?`IExT&4 zYj-_8YYS@9!r)}AD(b8w>b!9D3I#$mALXUkO?a%WsYd&meq0|pjFN4>P@}+UI!VZO zMQM4G?d=)FNcT~iZ{fTjK7I^Cgt;&~UC1fZz4_|UcG`fQb>s&cn{oQ)5BT-*C|avX zPb!PCg96fb?pkIG85-tTTT+M1SNhSruLe8GR_@$EzS5rVKg~gS6sW0MVbzW%9Pd7Z zQ+u1xu$#Tt2JCBYMoEk_v;?Y9Cf!gn4n$gM75Swa9GHBG-+s74JcE1!jeS?*iiKmC zC*QVsf%zvBtWGaS^{(C6z3U*(zakFv!(|-W!*H_;HM!xi;PEL?v`2JFBlaD+fV+KF zC@F}6E6uYoal)#eHDMi`f$@;O7%to325kWaPNK1^D9gY)a3}h%la6#Zpsto|Ow&%379}9N?KWQC zI*-o!VnkZoA*Sp&uKoBMo{u(R`x+ZKC+x<+ouBZRdnZv6=>`3W5}dq2w&BHD9N1Za z-TNoWU;luq_B4e0dtgm*4{pEu5zpzpg$4Lwc}53rym^fmmphQ|V+k9(P~^2=#?^~s zIMmj_VWFY468mb>k=`_lTer@kv!Mf(>)oMi8Gvm?6@+)v<+H?3f4GKYjdk4f)^1z* z&i0g?kWb_58De$yX$)ssLP{)=^2x%ugO(FkZ_XorQH`dPQ+WR75zciVK;5o7H04IY z-b`oVViePDfg3jLI!;{h1dfSxm9y_n^~eY^6608WXz2u@`SMS=|8NS24%L%=Cq1F- z8yfecyW=p5!<=V2V)4l5Xc*dKb44$%+#JF2X5v13NUFCZyOMNa^Z{;;A4gHlN^Tc{ zyn;L|Rzzb*X(MWh!yX!cfS;e=!imnks3!ZqH+vndjkOm(1KBYdt01&pIfom^h1e-5 z*@t`z3a1N-W`yzPMJrw)-lQOat?yRsop_2LUf#xuk`Q?KhajzO3U7aYj>`?3Ve1`= zO^u^?``b%g?dC(B+O-Q^M~`BpuLV)8E0Q?3B_C}T zoQC~pu43d!C-E7Y_o7DRH`F7&c@S@&-oTOKEQC49bG}JH_GV+*XInL}PvCf69riHH>?V7-w*lE}OvwICkDU*Jrazi4{fK*yF5~cF!VI&mq#yMSt?2GL ziqdti(43QqVSa$@%KYL5{vs4F(0vu0*CT%?>1@Xt+pTpzVPcU`56LmFv(3Bqw zS1a9Fo-Yy=B`KKu=A!%3WlWsfhlV}OMwX(iC?1(D*YNz-MI3FeK(w_w)O-@LXU`xW z{QWnIm8wu0FXYGSnmP!|+>e779^<#4uj5F5CPJOq&SJ6gy;I0uD+*xkwGs6rkMQ>O zeVi#@2QU9%BsHJMtDgwp&B<_Dz7`vH58~BdUg1`6H8xloa|H!zPNCS@c^V@pd(cRB zhH-?>BS$gXzaJYsOy|Xw$}sWYj+Wjl7&+QS*cIZvu%QmyoBHwg`Ar-v%SWU$!@Cj$ zdKQQ-Jb^2B&f-LC6*sRnyV8(TUW2Z|hq!m{BuW#4;iyS?Cmw0KEEFj_S*%xqj-i`$ zzx(Jv(u^vym3#AI;AFve-OlnKX*EZzEA2vW_epfuQ(Q@S-_7B@3ArKWb9}g(`U=#a zdqa4?iX%sft8&-wMqPa~jvwkqMU)4$$kxxn``0R7U^x`WaAX&kQ;c{TH=h5BzyHTy zaQplT)YEg+ZTE*J@lN659N9+CSTuK!;wkyd2hHKLbFi2~&nl&DhfNd{Tszl8ac~Vv zDq2yR5)B(OEyAME&hQka!FO1TqJt+fa_R({>gxyxgqg!fFgDPRcu$&l8n^g73WfA{ zSqx6zo5IyDivM@*K|x_HQo`&gR-xzNDMMYy2y4>2F?#t9CQr4Ys=5Yyh%@gk%R^~> z1NINx#I?~AsNA|0YaBEoD<=yR_tn@|LYS$kz`=oQc=P-rhL5+Pl3|8)c1|uzBwwX? zfp~+mrlD9a>iWBLQRM#=WmRC{5Q&og-58|Uu7!Ahb@eW^wjaRo$Z_mR4}_@>#Yk-4 z2`_S%E0MAL5N^Hs6Mh}ahqJjhSC}DjET1I8;sqP`QVhJki=I83QC!x{#S#szZ5TQ` zgucC*@NyP*xZ^3yLfc{ml6RlQ)a8pfMLeL2d}Muj74}tSAgl2N&R(8EZ^sc-#s$OP zhzDtDb0jxS;`+147#KJ}7#Hf^u3hywa%>RonGvuSsB;@>*mzWVo?HildylW<*s;bL zUEQ;1AC4bBiCuAC&>@>Id|!;OQoQ9Hi_*g*7(3L7cCukLyZ4YUYerr1b_ClCyJ#}L z&5FuZjqI>4{~-GMCvar{UhJY+tERdZ303VlbLkpxjSQfQc#5T-(oF34Rf-pg_o!&- z!#rdMVP+rN`>*21-~I!?{`?RF-EG*tGYgvntY>n7N;LoawqYo2?#9qy8(LW&jWE;F zMwl5UzLL2b7P>r&&u9+W&Q1#-q*iz0=IcM<&tt{#u+~|i3!f!4Zl0PJ3_apeM)s=t zKtCS*@@KrdcpMePf$A&rkQih$Gj1-YVD5#)>M>km*f>lahWG}avG0gPT9CW=lAZsVZ%+-}RcIh?#`t%YGwlrW@Z9Vx;;`uX2-ZERQ46jX< zqs zgsBUCXs@b8V{0$EPn<-4fCmh@0(`ob#UDDB@J+11_^oI7^ZnB(inJj;7AxfVB2gyW zk$~fu_8~Qs#!$Kw1x#0KYjNcG7_OXbz(#MK*<2LiMxbMWH9HznM{#FEYX_#D{)KRJ zOoW?!B+(pA-pSbq8q~V z+HrQc7k#absHgY3dshSY9&bkR21jn!HjBZPO@fG9w_@_uZ}{QLG1M2YhmE=#x6o}9 zmWk8%{(*o0uP5klFGt)mx}JEp3SmawHUb4*gqg#Ka8P7t>gtL2m1iK#S&iaF5oS~f zGy0ZToza5R1LtwPy%{y7gqg}c*j&9I$0n}e{^TfX6IQ^Eb!(W$%vUI0V8T=3LrsJ1 zcGn=LE>iqYm}zJ^jpL_!Q556}qZ!O7LqXdd-kVA>dgBRxeK>%M4R(u&88#Lrn6BPI z@0`7x8uZ=y4S&BsD9oqPzjMMYg!w`i7piN*AtDp?bp=@CWdl2V2e`VsBPc!|u{(BP zXKN=WFP=kvm@%Z)P2n0#v^U*@Xer#0lq} z6)Us$^(hTUFm&cL_BS<UxMLlkMQdw!u3XnMa9hgT-2U-*g1!63@#yb=#?79c$cu6# zo1z3wJ!7oR>%{RZPw|&GSJ08Q4T07apX%8orl=p2m#-6dY({0xF4R?4V_!u!3K|Zg zXW|;gcHO8-h{AG9!3-A`uAAr~wq*=AdeY%zqb~Hl;^S75hP8ho_7C2}jk7&ypcsq! zr^cOSXsXLZTI&tGelUdH`Sr+OO}HmJ!!Yj@Q^Ms;>Y7?G`S@@6>1q!uNndtRe6`6} zew^bLzbI}k+0NxwS-zQ#Mc-i^^4q3x?cz8N zw>5HkwECGm+6ZpmI)_7z9jJ`*g0Z$TWM!k#F}@cW`E{r-VfLNjm*qr8aP3SBlKc#2 z;~~;lHGwAlQz#azr8#VB7LNUzaO`zeCCCVO6w7@RZg|=-_1lg;$44-HupOX zFm?;U*7SUoSCk`f`v$lfXhE6VUCFMafJjjf?qLZ?$pLBL8Lx z*s=pzIg+l=r|UD2k{ASAA_$+gql}b=Tg*+!MpYSsIWHTT8JWn=%}3GBa#W{B!dX1Y zz=Wp&8G#9${Ns?7UyRbSQtXHih6#~~FRBD)3)hhe+)733j1lLDyhToe?S zqB1WTk;~1w7HY!pC_zqD6IR|4*q&2@on>Vx%TGnDr!lmNU@OjFIQ>*%&URTWic3mR zQdEGPtW0EPW+T6Vp1HUH*^w@@!2=sR3tU8FFPk!m+T*IUcl#ScVcd3rfpST3U*oIoq%yz@A%>ou8=V6J})9jp5+80hxJ4 zD5E*b+_(m2^!y7j!`fR~tU>$zKVdA_Z0={0ge4l3l%Qtmg^lSM91cp0ijcD*93J{) zFj#fi^tCJiFm!-lTqeCIhW8wLr-b($5#BSRDJT?6kg!CoO#rs+C_wqnBAUA_PCs(< z3Qh(Te|T)gKM6k%s^Ax9d-14bVGzlw?}yu-F2n_+-q zvM>v&(JNqMsLq}JIWzCm!p*-E{5NKyip_s6vp4h`g*#DMv=xC)rcftG&g1Z|1|vH^ zBDJ|FV)$aek+BIO%S^d(%vnIEIT4=+CNUjfr+A^fp%G<~R&#z!T9)RWY^kEQi%=&D za>;Jxp`<(?ao*<8RikI3&t)zBuz6bs3QNk#emHTu!s!>=xutCbpLN^lGn#)U#oH0- zAUvCEb{u?YYTF_>ax=o$MIwGj2Fkd(DME4HW<)G^0H2()vY1m=l2?Vki3j4g<&do| zM+Lp3m=%^Vv~@#3=z0XLTn2L;eQ1y#Dl00$$}bkF`4x2EohW4ffS#kMnCxq5IV!gW z!ca#rckZW!ux}T#1-XU7@ux=lK~J>s%Hs>5O++iZtQfh3t8C^+GvcwFOAe?&iR`}F zs(2L9cMCHT5$ej$hGn*l{3?%pwo?!iQu9zozNW0A5IbUgVWG(*BBUb1n6P*ur~4KL z8Uo7~V!~_|`D3!dH1A~vnG~SgEwt-m!c&lgwuK$Slk-qoUV);_MEKd5fKR$A zZd=*zJyuC%P1g9^s|K;%@H?tW-pEWu$4Y9A$=>#r}vXZ?`Ik_@sc{# zkgkeV#xqehFvs@&eb}++#S0}E>nMb;jd17kw8+R$Ck9#Zf)V@^^9bi;FPKfuCOaec z3`MD{$uF?t1zUt?5w?r+2~)+$%Zz{{BkiK!V+k%zeFH389SL_G1@H`Puxe8Q%8K)l zm6?meQkuJPFPJL4r+9&c&lNE6VB;Q&w45SNN6NFea?ilE%M`O8d<3?eANa?`Bd1V=nVcK|_dp20Y*}GTc3p%Sv3o1X zXuu;d9=XI}cJ3@iX?i@|C~!9L+l)=2E8yVh3{$=pLNkhypPhy5>}(_kTf;6q3p)#P zkdu*yq;=jf^52T`BARFNhk1pW$Vew%L3}wUIS!!#p5$M1hy#&NP2B*$z*Sfgm4cFd z@h;=`sW-k*&(#3O^l9@N|8Ukd;sV zb|;ECywkg7SYhK&SpJUol*CcV_sS~pp`+)BZF_4GZ~6X(*$)cyU7Ggr-;jn9;`b$m z#PPCo==qCLQdWWL)G*kHFF=b6(``))EDPO=eCA&{{+5my7Xuoj7`G--7g!>29ohHr zb=Z)$gX|aSz|LZt&qQokF;Y^7BYaefhYcEph{ z5G5uTT)Sw;MzEMk19mIdV;gapLBre~Yc>;y;Oq@?^VArua@6CxJk9+r=Kthj=p2RA^b(X3#`2RA;Av+F zHP2{lj$4gowpJ7$3T+vicP(89tlvVq!OeRvHU~Sy*uom#Yd0XwpXS|QcHT{wg&;9U z^1N54gu>c*-n=u+Xqdxe?Plb$>j*QYr8^Kyd|!SZX4KRz5D>8$VT75O)N~;iW0)yS zLR_F5)aPM_6S5Cq<=66Fv{}G6J}e4`y)+ z!%JD_CU}}CLVra(HioT)ld~&KSn}92j{FtzWQreh^U04z3;D6SrY=@(Ek`NY%dG4I z}a7v+(h3o65CT5zDiJ#yanF&22k~g!WMRn zhn+QaMR-@C_oAs~i-=8`bl)-HinbwPwFd+Y?_$>rh358a92>!6M7!14o?VEt62@m(j5v$;^35xtF;l!iq9_L) z+X!?%_!&bP23+jE;GSPBtmB~!^c+0NhZJzUvoI|l9!7fL6Nj38X5kT8>LyMIq?l|P zGdqbF1i2b=aqzq5hp(atr*+9FAiG*Z@nKTT1C_I0<>h+1Rqm9ftHhMY01%&i+Uc!wmDU1q=(E&PvEdF=08B#XdHIaVJd! zSghXuak;4JoQRWMFzx&Eagodw2#Fj+zO+q`lvor%cHU`0j zo^x(|Xo6K?2?z^|K-BhBilIcYO3`*~3GsrawESFM<#;Q-V{>o1e-@WtETyVH*saDbj6Y}4SVLNEtJT*-ixI`hZqKtG|nES~lzQx)3{4}mm zM?A(=B3`YjNAXA8Hsr9FgTqV`LR@vhGqi@sh8^^NQxR@!PTY^;ZqjWXj|e1ZmvAxs zoV)_*cJ6v-=&)Rf=>4$R&Lf7!B@CuJYWS|dhEOp73&%?|j9~&VQ!VL+} zWEn!@iSL(}p*U{`BE4;)$~pn?#ki6(i~sZxQg{TD6CFtPQHIRC<8VJ;*t0q#Jj4<5 z@_KOak4CykR|}I95n`h~Cl|#PFKFu{Ac;6F#bzbN!dQM5H|dC9WjzNstosH}paZAi zjogN?GM2N?OCz7{0zI1Rxf>o>2QP}ZRSn=79)oOpM;sq3&%xGkYqDRW_?F&_vhgY; zQGCgKZ&n`pi;PfMiHa92*QTR@{0@s7^XZ!PZmf8L?$7jp7WLSOXH3 zHgUxF8D{b`5#?hKz7#tWU>;_awGotc5EJK*B5UPhVutCe5{&(mxVV<-CpXumtDKE5 zE=EeQnb03FyyzMuwdW0|9Ou+>+j_e#30APv606;?zMA1GvYfb4447KD45 z(|B3VT8J4X!=#yOK$n9e~FmgBu<{Nr3OWoLlVEoc46!@!f#b0yp_hllUi(>hZ()73mxhNx^Iy6^o zLfK9hXJwJzhwBX zDbnLt!^J=jvJN5G#B#%FQE*~8Pr9BRv1T8UEwqs(gcb5-Y`hFRCAsN{@z$HMd#rdt z$J`0)(yLKH9JsiUo;y36=7=~J`Pi!LO$cx?rt8V3vQ5o$YS1(Hn43r29*0%dERW_P z%A+M>m98$gDO5?t5ut0G$RF#%#%CS2Q#{7zzBpw&);Z{LopNTLmGqSrFRa*H&aDNA zkDar_h1uA)dS33Eu&c-l3GG&4!}c7`*OyilA!}nG?6p<7E-VZ3qzvzier$wLc&eo5 z2F?hKCf>>LPGgSqcM%@vDUNrR3y~9cp_mq9;<)*hyT7yIh4g;>EJ$FH>ttkU z3^QZ?0-<}bR@;)tBFpW{nd4L#=vbR``kY#`nHF`ya?Utrg`LAVM-e}D>>}aX zo658K7q*0%|M{%2#Fh|W)AttMcYXrq<1nK%=R4Cv&!9-pOwS-o&&QpW_^#{NjuTlK z?pk(FZtj_0ybA~1bBeG}`tdHzD3cMp-$ov27$33~(9mS@_|2=zjeFucv$ndy7KAMbOnCE?LCE3n@Yn@brv zMwZ`g3%FxD7R*1*C2NT^$6m5Ti~{5&;az+#Spc#;5%o>`&?1`m=9U(WJ-Cfs-b4r% zbKY6!g<}_Rf3j!JyjN~x)w7E9+(KJAqZ9OBwg@iNPa&3AJ2ejfM0Dpq2m9`{O=TiG zyE9)**qqDLZ^#k8=ir@P&pP}p&{?6bPWvUURTV3CQzHGPd&slJT@}$7$)_ok{3_u-izZzT88;Kkq>3Qle3*dzsZs|GdjrZ>a<^F-=ljl zjLk0euz6+A=7`k8SJ8hY0XCX6R_+VRl1K++NbS=G)-~V;2c$^Jp$5 z2RhS20Ttnb;dtixl;_)Qkf-HRa_!r5(BtU-i-cHV{fR_6GL=-R2t9dL;Tc9uE2MuIHpI>hXw z8Z-ocNXkq_q>};!fn_*Q9}actcj(+Fi1645n!lN6pB8#H#%JD_n4DU=2CPWFbIcbcb#^UioAyH0E@oUmtj z2X;OIGmLjg!VIUc3$C9Qq2FbGMlyGpEA*fe|2|)4c+Si?#AKe%s?fVM^(w^akv0U_ zyq{luiU{MXcjzkfCGW)fTpP(a=d_JvoQ5S^x%r&Wm8bbJ@fEJs=Jek=e@`4`&TqU& z7T}$JljewFScrETJBN3&snd8T-aLbME-n)r*JtCMZ1+68bGZ?298A|(jL4Fl!g-d2 zcdq^E^f+cj^b8X5E_!Fv*NXhbg6mj}`&oErbIamep^f|y-ak%eW5n5U%nIw!CT{G=%Z^Kp9gAXeMIo0opEaPMH2_X~Z!!ku>k@7*^(kX1FuG zD`sa@2q%nFaCrvyZyGC~@njnBJ2CUFToegk#1W*VS%;r@`>#(D7I$zwN77g%<#U8_ z*20_!<6>fCqGwf>BRgswgVvs7NDjA#w)&TI6HX|OQk3Swz@`YjFR!3vt?-BoZa&$V zm=B{loNJ5bkDFnIo{#Zg=F6DA({sp+Yz%j9H^nHN?vcHiofqPPOs^NrKhssR4-$2C zZj3l9p=&uT5|$V*mSe}5DAWDs>Der1JDvB$|#LMQW4-bkrBqcCh(od~Lq36pn}4;05C*?y~?hEY~pyGt;={bN8Q# z;l+i1ljWA?KMPw-m~)+&NXkWV&p>u~4rVx;_b$w^+?6EEFkkjA%uvk5J)7{@De=#~ zOvJ{{&8K8O#tLU_TmbHo;n3hQ=}XnlBUb?_3UHI6rVzWaD_?HIN%w}uAuO`NbU=1z#t>%_SW!zl7m<&G&(n#nuR zHH1Nyli`ky5a$WZeh|k}p3Wtba5hMco3QV4`ZOOi@8E2b@(SYeDVPzidq}_x>A?Fj z!|qS^>uX^~GCM=`HwE@z0W&df6jx9&z5 z=Z^lJu{}cn!^K(bGsXu3y?xQ}Jiu#vzICvjT~QoPY^uw%OMFI5s?tzOI_@sCa>|27yZ`l2g-> zm6auuY-FS+A=r*prY!uyC0UXs`F(^DTdU|a>~GzTqP4bUge711T?#n_o^u$|Gcv_& zOBT|Sqv35d?K~DiSb|T_8lIt>kd>K*Y|-!J)D;%GN{d%0@kbDvcNM2lr0tkL z?=e_zOqi1NozD?&-mTyfl7LLQ|D1UbbB86H_a*=F`-?J>P1`^u6&}Hj7k|R5SJ%YKJ&pcfC_uuerq7@~3is9$1x#&rNC0UYxHDQ6gq`!Z*@cD4qn1zEaRmcvo zT+|(5OR^;2pYUKCn}PP$8sr683(wz{c-@lxvkEK3)?XEcs-`;BZCVLE4K*&YE9u%# z5|%X9(1Y2!GMwqViI@NQ6}P4ip)z+poIX%!xFp}VFwE$!j6hjq9qJQT!BA73TU?iP z?UMX+3R{HHuyRIRNevF}+zLM{El5k+$+{#{bEyT;#>3nO$YlV!y*xm9bqO zlE3p$Eo_(PoH=JA`@7Ej650Mn!WPX<+^{BgD^j;@#n!FKNY9Lezoij0MZ1M0e(zsK zcwF@|tF9H-4_R5ZOYI}N5`47q!CDEks_r?zMfx$@edG@=+zv~zXXAubHcPnnON3Pe zOSCg{cNi>*B;iBd!Ub!Sl8}_N4UvB4kdgZXa)~8blJ88uM)87~Ul?M8t)aD`YtWJ` z$v>Z%t_(%&8XIVfwcuWoe;wf|DM82850POWu+}6lw`e=fi02EmVdxW$jPz~Tx@ilx zrEJ5ds1>kK6z*b_{Jkal-i5=Avo9jTJYlP?wuqQnl0S;D9k~J%Ype(fg1>_vR9W`{ z3D+&jl1vMS8DmR$uMI|^vp)FW95dvjlog?5;D8n33D}gLhO{&$DcGL09--dW&{vaz z!j~TTy(FJ4Yy+vfp*cL)u12t{0r;{DJHRZ-lKfK%D`4Qd$B5@!g&lzwGw1Qe#S8P# zf1VaOrB7(>xFk!mBwt0i7Qk!~UczVJy(kLXY0sBMYt7CHTO?ExwicTITe7Tm>%SoJ z`{wh`jxkvBAKyxZM<2<~5)ZCmXsK{PC=@U%NH4^!lrTtKJj~L)xK{D=e@6<^@(Wwz z{qcmJPf2dUvoVodbUULgY>7Ajx472HOLpdi!r5uE1G2J^S6EskT9PGM3?U;V@$X+E zY*#7QN?yWeOR^;YY{KFFj~d@D$)X5PNs(*cyJ*K1%m|P0#g2iQj)PbWe8q+Bk(cBT zCo`B?>LB*7D-;(h$}4cK!x_`+i&)S-JMTw3st{vCM0ru?-2-9Sjoh4z&wFcb2;7WC=Uz$r?vgCY zHxafQOACfkRTwyPTBI9fGfsA6|L$}I8nSa_C4KKRgdN}E5QgksZFBUnw{Hlw3Dz*w z`hyoRkp3(9rs2ThZjLif&*ibhwb~{>E5SUiS&Eu?{8A5w;43?X-^A#n0 zZ%LM9NtWa*3Jc_yWJ#7}NtR?umSjnmWJ#7}NtR?umSjo(8AVbqHBSv=dK zBnN5d7*uzjMsHIN!Xu-&--_F~31KU2VXUqEuT{OuQ-O;03Pg#|JITIt*HPuAx_EQJ z=G}2U$~sPCpgC7;-V+e+YY!8e_kRxmLG!6X&%&ys6=b>H-YQGGJ^r{toJY$!2pi+# zIJ|C%i9zCyEbQ;=#||5r#p_O@C<7_~5{wTVMNNM448MwtPrzz7eQ2qZeU$XQKZ@{3 zCoGp^U6dGaq`7Q5cLTe9H5RXUK}jC6Hmi}*at4zJ3+LFGh*d5y*IhcIW-*0Fep^{l z0g7_0`0Ss%s|BCWI(o=JM($tb_z~h=%FLIsU5jL&WE8%y0xA{qwQOu`*OAx}M|{2# zBXLw(dZzG(YVcp5*+LniV6x)B;xtr0GDgiE!K)!TK4O-z+*`mIR&Wj-{maWH42cOGmq?y?XR(bs|-0= zc_>T#Y`%QV*grw&9y~?axmcVhjI_;vXUeRFp!ju*f*BeMJ==Wjii-@_7IWTnbC?l3 zvSqO`!|ChX_UN(-ir`6@e|8p_g6zCj>J)IXmV9$``y=LER(#&McP_FiEKx+izp?8A zN1?&H zBRs}6L|Bz2AE04sgVgpuq%U^y!m477br!?lQI~tC)4!=O$2X}!{yn}!N=jsNNKX{R zbZPFfUd+GB&#}ugvh+LRoa9}??9x0A$0yRt7IkN@6Z**o97tuZosprrj5&A#l|Emg zcwu)dnzy=evGDFyLBb3)k)9Z=^F`S@3Gf1#A`o}2Y*Z9kuNiaiLn_>O}!Ag zJ`?ptq0rJ){|N5$^@XoOHrY@YnuhKON!o}=8#Cx}@uCtG<$RIeR)=jqhR`OT{N7mX zpGa83ffa2q`}^IWd&~UYJiXwA#aN4cEC4GyQWC{BjQ=i(t(Y+GCT9v`BgWl45fPDr zhN5uj>Ii6Fe<#k#I6ZNVIWecK!pu=e!s4k}A1zHj>w7M==Cc^&L-YQf3!iZoeQgK~ z-LN_#4(pw*VW|AQE-X^KEipD{$MU@c!=IXqVz~=3?j%hy?&8eF*B|>Q<#XshO7in^ z7w^koiex4SNHOhuwFnn|lP$cYVO2zs4%lF}i<)p-8v;~+aobWVZXc3RHuAKIdLe$m($ z_xRPXA*4e}LC8B=k4;VjsMFj^zV44M3^M}g8E-(@k#d9^%8|{Lbls9Hwy=5EHH<;& z(F#Pc?#3TE?>rTig?TBF-Ii!)cmiY{E8!RKY_<055Gs=pJPOL6HHb1L{{0cU%2U>afNudaGh4X1N1-4i1@U1HkX2BUc>U+d;uJ4*#BvK} z^KU*aY;l&SrUB25JJEXTJSHc`F+R|Tqs6HRv`{CKqde!uu|$-Nz!(mp*=Rn}kMkGK zMVTA}+o?w5k&(4PeBNf*k<*cE(8R|s4?Qza zL~jk3JoZl%6?#90tFy58a6g8JhA=odC?-P~89R>b75dOnn;jd&jM=KqDDNb^j0rK* zzpoByUWVj6KVKnPV5aF9jI@Scy65nMv5Zahp?331SZlDLUHBcoiaexr9N@pT8r^-v zm^e3q<9jmTN_wG0xS9VOpDJuui84Rp3Rnswsf6ft_mxUM@9vj4=x(oyu$U;G)4)UQ)V>9*Jg4$gbi1aq) z3IJw4XMwqtHthU1p}O%jhPknm96yHIb?#7;GJXWxAID-|y^?nBK+*M;*=K0sDK z5Sa}}F*w|ZQ>XhdJTi)LrhDUONe7SM(C&3`RU>EpAyW5^gv0xqWbElWf&Mesar5SD z{B5!l%j^s|A}Z-Sv!Y1Yk%UFk4K+;|tjNcS$x-yNBRBengnn#{`LiJm^i&`((vEah z8VZX-(!M7lzo@7{1axt$I6qf-%F58UaYDv{Ghd~6VYI6hYuruV!LLYf6|Jy&UoQqn z>D`Zwp#Stqve~37Oi#u}G2D>?2hwddO>JzbKZl9Ye)M#;BYD|$5{2y|)PaRl3feDC zVti;2ql3p#Uzvt=X{|Vab^xbO_M(4?bdSRr)4y?yjtpaHXc#@awqcdMK(s@H556+- z8G$9jGD~rSY}eTd@(CyRp}j!%SwooK??UInMqWPjZT%da@#Cr{F;hoWib5jp7-p`JXV}bv? z>wYg$Q-fC2ZcLmVMDK}{IL+Be(vgu7^zGY&ln@u_e9@vVD;iQmNZAPtF&(v4e>gDZ08(q4&%kJh=A) zzw~E7Pm3+)O8(C8C#?9$6&p+TVeGH*navE&Xxzkm^kV8 zyuiCy!ea>sohYOqJdN(oYD8JEGvOs)`#p$Scs2PJ($$lst7isO!PH4 zzAk?4*Alh}XX&4S+GFQ2LSsEMJc&bPG4M8L2_}YlXT+DcqMLm7$k-(u$n=J_-ur#* zw-Yw+o9cw3fY-4>T8&iV5YV zp=M-sZ$?-~=@8kPejUXbc#z~ytq`6t``&f}}YBeodLCq?jnoM;%bB>VhpSs?=PIDu;v^6HP{-1$ii_Z~+6Iv=P@NkMUbY|EpV zSzrL0)#+&JI)if;&Y`cX7V90%p&~7}Aa6W>>|rSh@G>=&Fn0R4;wt1E?Z&Ay{qyoO zO#0E=O)=AEYbd@a5B~9@1O-`JtWByx|AotV^ztnB#;tp5sWIKBN?X zA8z+Ylj(U^R$i=m=R?QH3$;@(acrX@q(5Tb87Jp!8zCU27M*<}J9FkVIx^zmZm0^W zdBtO#ozb#_SL{w4Ix&dJ^XG7KUjck{G@#7IhT``Z=JyS}qfoe?_%yRKVWItd77+=<~bV2N{qZl5Tz~tl${CcYob=xH5U%x=Udhr4) zT;S`OBBZznlc$=oJ;o2K{KF8R*o?umFY(}HC89mlIm5$!hp!A-DHHf?Zp6g1i#S@9 zicsH3Y~M4A(TgXLz1$YMGy&5uLPcH*T0!~fAyV0pAB(WH0SE}#ii(!oczN?O4yU?s zi*GXuPsHD9b1N>4^q_F-Y6JzZMrc?b_Mdo$*OyMAB7z*4!e<(2BEt&0o>(1Uf|}|k z96T_Hd)K>B808IZIZ2AH3>hg0Y;30Mo(!O3QxpX`n^Dw#59desAY7nM%Kn*SVa8Qp z1glkfsNGeIhWZ{%of||?!zP%LL7Pj0DbSUZg3+>AG>+fI(8*$KTDKB@elggd*G)<= zf~HL#Fy((qWg-uJhZIy)RHCY?6T|)ExIR_}H^R+AvdYG82n)aIv3KLrc5$h55#2dM77PoU|Ijgqe_# zY_xPg#p|g)R7V^yWDy&Zc{TQ_$sds~W-=5Gfx3WzzQPneOGvPW#g z8Qgg?gqp-?tXa7U1xIh={MiPq*Vcr9h~4|i@w=*6`wPjG4PCb*mPAuA##Y~HOB zcjNG}gE-h+hr0Rm-n;{GRyxoS8;`hryW#~3&`3Wt{L;~NvLDSmHzOj%AO5R0VQ14d zJiB=vC$c@EsX^~^dR&BIo_#XP$}3P=*@3|`XK{0~3ZC@&{CC5uNd<=HSl2v^iDUCI z(16Ch)hJC3!ZKAwC`x#4KH*c!*c;p1ui`)MokHqb8*b;l@N?2_X(`x7?neLQWgIHs zipaHr2=HHp&3TQubmKC*^L(Hspl5v7oPLYq1x7l^e%UyOp`!N|e!6oSxrtHm4+uh_ zzaKUiAIG&PcW~`u9X1&1Lxbk%aYosn#&)6Pf3+d+^kurDF^4`0dzQa}s+Kyx`($2NSCh zWYrAe{_81p6|KjLRe{2LlI>WZl!F83U*S*BM^LuT8GIt%JeK?xcw$TaAa2|`hK7_F ztX=7gjoIxOId=j3wpc(<&h>EUA8 zyFa`zoM^y6FBCa>{#^0UoX?4;stB~8V;zF+MFY5agD~jz4T~4ZXQ^9yQ=r<23xE9u z*ZRxhx5^)D!y-|z?+ngPUB#)=O>oka`s_tf9_c90IT@{o8%WTPf}AYJ`ptg$0R%n?;HhByDu|G~w|b#T$5xOU#$FuZG7IlzN#F0|CYSD(e^ z-3;q0hVkLZ-1+W5ENUCUDb^^*iK`*egZo; ztboota)8n__SmL=8v7usx3IBqLg6ts_IgBWYH(wp;T7}__zv4=^JsnJxG`Q1cL|Fc zJQ|Cpt|_*(UdOeY9mw9ek{f$WLM@K~w4b4LB$YYEh&4f2$W_EtqE=djOnQg-U z+qZCSpce7I!4!8iqU*v9bQOlfT6`l7&7+)@Av~gYVdUv$oZORvaNlqwRSjbB;u#bL zI6+@pZ1JBPdjz&+l+xH+&~uE9y$w-zCQzS0m&D&xta5Pnm%ri7l~ZVFn46zzsy~9U zJ0mEt)WG6&f@DP}Ixsi4hiBq0^xvPv;luz~$bNst3ycHvt$mTv)Q7$UrAUZiIl%SU zo_`8gt~|k1^Hz9T%;o@vc(=v+-KTKt=?H3*W3k3}Bk~U2#JP!mh+$oA=H!HVP>@=I z+`%h&eETRe)~>;twVBv8_!wuqbKoPTAf_7>BWoFBMe0$UJ+uM3QWEs-n+SXMK-53{ zPyE+^Jwlz&`-&HY@7}^J3_CJ?zgdoh9lxO$LR@+z3yx}n#f!(kNZ2lGPi#+F2U}YM z^2P7Vp?$2-Jv8;;@}}<#rq>5Fa(h?6*xBV0?)?|V28iff?|q~7Ur7_f)JOy6V+AC zIC5x&d{Y;amfJ!@Y|OL5eBUyppS*y_4|UgLp}%_{_BDxff@w*@I{oSVJ>inigUj|VTpT`(oP+=b1g%9xR4ESky}*mJ zUC0U2o?Qq3RN?S$j^LaQOg)=KTizDJdo(gyF5>L@E^H%Sqcw99f$%-KZ##wykI$m1 zC=wxSf)Et69p%lJaQi|#w%E+;@xHzHH2 zF?RkEnv>lBK*bC65Xx!>a9Cf3fvG-}`WbKwZLFeDnH;oFY!QYZ{fvp0BzS5G+dL`B zOTlz`5;|`_!DLH1d<80ym6an9u1Dq2Ej%48$0|ELuFVDu6y)^RpnCKoP8CPO-H=s0 z%ag** z^T^Aw1+N^Odi@l48#X{oQ|1dxY;3hJwOE6qg*v`QLuR ztBGQ`NGx6uj@>LoIQCupM{xh&D8OlmgUO;4FUY`pdo@bqR=~|n7kc^zFff=FLl_!r zLYv+X=Xhu=Jew^zeES+YHoCw_V;VCWFmv=nOhb&L zCbV?tk3|Q%0yU^{_a@B9NWn2?KQ8=u7srx=9ma2t%jp zvDt-HGcw&KqsKSE`jQ^pdhrllX@0O&Q{d)?&AZjM3hdnI2M=>y=t`P*{=0Vqe6!*O zwmVlR0L8tN=&eeCj|m0giezWxSVfv8GLJsO%co-~T4@ALz6j4Okn#>ien9~W3%fA! z*PrqBVi`PW-1G51UAz!n){LU%TJtbKVyFjw9d!uEJ}%G|a$2%dMp%*3j!S?25B%S^ zx{w%bJzKm$&nM-u0j(ECa6D}T+;w=|8APmIJ0p+Q*~jtd-XKc+$+=CBeZG8);ss6= zDbUr!`i615m~6xqLs+JE;n7b&;6#!Y^fhSgi#4`I6qbNiQdA^jAqC&! z5j+~Gg}2=YiWdkwO4fOpIG!lEc!5NP?53vSTD0DLforv^!5ynazK`wv&~gbw$_es4 z*Nz~`ksZad@cVyAA)6zk;f=)f5)^Isg7hL1q0g0XTfD%8IF=G?g(gpazyXC5FY)$D zH9QG-%ugxI1UsbnDtu_Hti|Dr=ke41abztcY>39oBMu;^Zw;H+Y;3obA`(qDPudV( z(QUZ&s1GG;bO>Xz!h4ebu^mym#*rvLHiRQ}32;@HCX5T zl=*rHs6LCk_YPvajo~{2Fv9e=C|=-%>8CbAcAmn6=R?R1umzuW_*!t?zp@Y~Q`3Rj z@)8WRM?+R(K+JZg>SI}W3x;lXW5>5FUSOikI*ugc#E&m9Ttq%bnqmwkC1@JEB6ve5 z?)>!*PL!>Nwv@tWCOMVJ&st+^V;?%JW8iM^o>sN2utzEwdu}|(jgBbj36zOH$U|M< z6n1XqnD~k8cy|)4zvG=h%+@KAFJniXg*QLIn-kwl@d6XFgKP(-cOC}r528-2c!5jq zD0`xM{08 z;N9`YcP;cBa%5-RQgQ6YF!rxs{{0m%5Kop9I3cE{8-vHH5a*~)vAHmx!{ZxbLsdWS zzPN|BL~od>v$2ckqHasbMLk)Vi&BaTY(lgD_mZ|2~kzYF?hTN@lJEc9#e4!cb?xz`!*k#s}o1#3CHdfcMwxQ-Nxa~0kB}L zgxT0lvT@?&6WnWzg|?RHcq0~<+it~?+t+X~-Wi7C`5Y&I?7j3Go?mK4v?=|K;&R4a zZNe(he{~2I{zgzEos*;3T1i(<9G4n zpC?cg<0UxGQKv=ST4sk0DlPvVGu{Xs-SDTGpr1SJ&E{|4Fh~nbI zIQQ3|@M^LIt_v32$scMOz&g1V_wG%gGQ<#S^v;B1*TM4WT=ZVKg{~bw(3JknMP6l! zI~?Ji_A#T}U?7f`TlYV@Iq_KaB@3hp{`t4(xb0cD=H^6pY+s(Q^4I zrViyIP=m*Hy;Ky0qUgj`Je#ORh_eA?lth>mjeS#k2913mPCtEvKR@q8jIHs);stiZ zK}0JqkJiA;*=kO1M&HN?M)7Sp)U*cLG`EXq&qQ{{aWh&j4&z8t;P+R&z>XtPw?#-{ z7lwM9kmxFw160+=y27Kl@!~NKX9jS`swpvDCA{0OZ^Fde`{+&$fh}=pE`Mp5jw6pB z<6-L-80!kiR|xUW3Yq-!&f)Q2&ttcbEi}m=vwXdo#~z&j%R@}&u7b?WPEeXNo(4=^ zlhAc>6qz3Ec*J>Q{$`>DEBEDCzT6#FI+8vY2`i>oGlo-8DSDbBzG03-1&V5`&^UDm zb>Zqz`z9SA<_X(LueT9hE!kM^X0k|KPFPM;07LuD=)63MTu&+TW0J4?mlbZ_<8W|q z4pw@aE!wLwaAwU?Tj){7i%(FG4<>v zPL+hgp6m=eUYT(M>ySzeK7WY5!e}_N;x@9Ms(MLiyY&!{52eAzNK<%J4RH4H+#B~9Vy{JX? zoixO{&!C)yu^ZQ6oUrv)9opWW!(w-97|0!c`vYQV1oP;49L_k5V_A7<_>U2^J=qR7 z@{w z2r?8OC#Gkfgv+%Z=zY8!evW2jk7VyUT2Ki|K|xy=UZh9E!;2)OhDIBq`ssg)+wRliei))+zoyZGpJQl79KUReP z`de6K$;EPUgYen+S}u{;%B$B)FC)=ce3qG-kq_2p6``jk7rSB{pe?Ls;w>(;5xw^@ z+CNp}4# ziT;n(IOtD(C}T5vWd9!NrT9A3j`ML8z<$DJbTriAwLAqG2M=I@4UGXx-sE+m_K`l5 zZN@wrCttruU-2Q#aW;jnFz)zR0DUCh?!@TmW302WlwWD^UBb@B820X4k@KMog@;0* z$AvnJAhcCwhS4+}^+J^#_n)5uQKCVUm-JO^v*@BSoCD=?@3U1eZLFo1VzB|djkzFkPj2TW`m@m5z3b9UnD z&6jxnt{5#t&VG(~G74>{1hdV^{xzrEw_Dd==;&H2kfM1$BY$hWB{9)t; zU1+M>VfCd_43uBSJb&ACc+v3*tykkP>$d0PSc9&UuuB;*Aila`K42#61$@!TTeykp@zF5HQn z5Vq?D26{?yI^L4ncJgQaI|*+ktM9W6r>;H3nGJ!zD-ilw`Qyn8QXyZY8-PP)gBY#P z!Ysleir?!Sn!zISII_}{@TB`AYOXJXrF7*A#W`I7zd%602T%AU?!D{$`3Ai5uI#w=$oXh+eu zXce-Xx=?X?F`Q_uDm$j;k0URzpRvZ$WBGXBUxWkmePN>Y=UoN=hY0nzp2!SQhu)y& z%Cd2PBPY7h*0e+Tit8x)GmsbbDPgqQhG!r9@n)}&aOR>I=a8*i1z_o&2K=p~5J%&z zpsKJ9_4kU7nmXK)vr+o^G?ve_7PiP$cAc=rw%S6RZ|+C)wI#4K7f%EU=xS+T#kHJZ$}$3=BbkuU)6s#hsW;|btHrO~?{Io4#i5@ZtFofc zg%vdoA+Ao9bFlCkqDwBd{UPK9_NiJbHdwGX2W<_xNQrS8kHcL52;Yayv^Ye#&!Bht z^V{@TyH7%3{I?MHGod^2xcOg9Uf}V}qT8>YodM)@kJy2n#xH2R5|5d78e_VjF782J(E&s_nn+fL zvhI|(-s{H4ksPeCv=EL1;5O7>c?$y{tB~O*trxNozA-e0*THxAI@pGD3p510pkwBU zpo6b5*nA&rt;TB{`lP3}VI@{^?ZU^=M@X=e=q~-8w2o%$iqu!57*s-DU|eBh?~a|% z2GR9m5B$l8NhdH^cP*zdY|Lpy=kr6DW5R7b{@d>s#xEu!SXf!X+}I59S8LJVeh;fW zl#mzLcHK7MSvTeDx0b_tOkX`18oS_d*EWaa4m{s z80FZSI&cbIgIvmA%CD`5rwZ=|s||G{Pb@v0kFNH7WGr%~_T#*U>&9A$+;$6%pBix? zJ`C1sl31vq`-;oe=xe`^HC_|R3%m`o-_fVIw%k#u)r{9=*q*$wrQi{^+Zz53y880N=+;$do)R-(G){*S`o8N5`oqdzBjW;$uXhHSikl)#6{@q2~?xKZR zc$a$;u|am0B)_M|FaJ=GK2k=rx@vbjV(^&J2&z!^E#HUh`rQ| zFYT|f?`MzAhJ$T;QhKKtmk{5IcpSiC&i_+FAoL?Ob zb4@0f@^_>QeW$zl461t?aCL<@tPRM|P2mTp5(9Hn!ar7U@(RO=@=>(sO+sEEVckU* zth*Tkm#5)bYddle{66Fb9ZhvCy!0BUVjW;c@1rY+4aE3B+UEL3#<1G>7$bvku){@$ zs6+l<$J`Nf&Nblc`?tu5i>>+iI8=f(Z`tSQ!^qSDtM9g> zEi>Y~=M;pwj5$fjdGqf`Ua)e)a3kf&d@Tu}THqKNL zRz`_}6L7BdEBXo!Vu_FX*s4+9)ye=^LNyoj)JR|?$}wCOzaR7FNW}NofS+B#|Oa=3+bYx zr2%W-xwu$1fOnS_$qNL!)Qu3Dcm|b?r8u$1PyVcRp5U}!j?=H-jZ|tVGtFL{DusH7q=R0XxHjVaHp- zDY<4$n7pw5F}{8Mj1SjW$$)w46ACPr+n(XuP!FJf+3XCLtYbw9_x#U5iUcp>Qu zNW_(QAMySHB`z*f@`4%`oH~nL5utEkkS=}pcgi0}ULZd+CmpZazTm$~k0YEXpQW}% zzgL-`iN+6q#oG)wSea7$NOhCgyB^ul`Ug{!7c87zu=V;atkP%ZsQmYn3a`p?nv1<> zF5`6aGA!7A3(a*;u}y}&z>GYHwU<%(;Vn+g_EtE)Mw`G~3{JOv#H&M|u$9$aR{n(K z1>xLJ=M+3?8^-%vE8$>iD6bon32>+IUr`&e_-N*};5r=SSgB^l0>+oA& z1~(D>^IlwDpq zUeq2FY9GNL^VlbyCtG<$@mg!fd>ni70+)Bk2;^SnXU@xz7p^ZIBQJ=*qp@ec1^J^N zG4ysXeAws7{FV!*1| z@b9bxO34d+ZnB=~COm2{!v5Km4^rG#YKNq+?3hrMPW*E&!uh7~IgcyqXE~c7|I5B+ zEUt>jj2uaeW3RA74#z&~56X81zb;@1Y5Vi zrnss>^=p8Ma?}o8gHEo;a6WYi5ps7(X~WTM8I`{JM!U zJ$ZrdEBk!HE;{@<;Sa6@jD61I>IeNh3+ITA3lAW#r3QCWVkid|$5tjT2c=%Ysm*Z+ zuvD_BfMWrV52+4hZxdn@x1S9D;dmjock<;@dlP=A*hb>qR?cQ5n3-*QyzLd*-P8xpKZ|$We@E@v*>JOxt%<0^Xx(jejSM3v(Hf>kV%_zVpWv5opU``4 zrOdPGJCPZzw?D_X!ERh#DIqUdI3ws(E&iV`?Rd6l)_9GBY)##MCgQVO@VVw5wuH-1 zR7h)pKC4fmq^SyL5+;%txSnIR>@-Tce?{H-x$v-7&^_T6-VYDs(Ry2$vF_5}O6m&w zGYqjYR~dPMzc+-9+ala-96X3u%F>cI9~Lpu496*r5R)wxS!CX8k>@M8#NNHZM~nJi{1BhipNp|4^*q{xI?1 zgaa!B;b$lDk<<^`3C`#WkUg?bJz0#&v+fQ56c@mh}fUAYd!IC286p=*t7 zQt|S`Yi##7REoi6MW6328?#AxY-$mfQ~Fy)-T8XXSI4j)3*iT{GyYEG9)**IE%>GE z6oMU%#(twtV^3)gqL`aAW@em2V?_R1@&o!7@QTdB>z3PCVWT#Q%`oPnds2IGn=vNg z+;9f@GCs>*Iu@BMJfZ!+s}@D~mf#uTm=!tw8PChdk8vUWTf=2vOaT;N+BFQu8+8=Ir#axASnqdz2@Jtl8-NQ=Tae|$kFn)BN zg|&Czd;$LA4we#LVs4!s;ifBrr!^ky8Y3bW|Fc--_i!U+iob5IU?Dh#>yM`@bN1?m?S;fj#s<@nZFfF-5gpGaCoiyw zbytPcob|}5?Zl(>-;2DUiIq3*VVj!+%ys>#w2P7?$!Mj?;mc)Y*)hcWA?5B-MAAd?f!`310irV;~d@& zn;*4fwD>T*Y|R8a8@nI-%e2n2 z2>5*X@)j8$77&qf3HPyb#>(^qNMB?#Zfs=S2BsF6bG8=4U3an0kR1O%Fwj}FX`lxr zo<&)Ua`FOCX3g673@sli0Za*mgE2W#=`#r^Y54C$$%jv zOyQju{8p{Rw#}On$OD#(JQ96)Qcu>wv)*B;xoG4Ba7QSdDe#U>;`6)v?nY7fCp1zb zY;8(5^8+?4F!gQSuBW$eDS@F2kPGm6-2k zNQsVQY?H$@W$@6^jJ)mh;ZERy3p1?${F5iKB{~r`rcSZTb$O{}`j4TkjaT^YA z2!*>4c*WoGyV@t`pz~8XP6Rr@l-fm^J#Tn89eKeKo332NQnp8R@`cj2;esbm;wt=x zfeD}88?zw`SC4H)h@J@|QtzRyUY@+b#UM@hjg-9i;`6J6SYc0olMC{shXDaOmGEO| zYRbW;Ks$&?cll>Xgn;ayi@ZR#%?abIL#X=jE2@tNz|M@?U8);TK)B4qmNR*1Y;HkI zOEVgtok2>h3)!^7J94nrH->q{F+3>kKxca!0mXWhynTqvM>B9}Nf?bovVDgTEYEt0 zfq@~^J~@N+K@2juz-x|(^{0?m--pr8=QzANT!A1Wmg&d~?B~3;<)FHu8QuM(`1r*~+o$NA-?tHkamB`@$qsHqdek5>_ZF2bQ0YG*CUb2zCG*}!Aj0o*O9 zLg)MU=&X5-`-kG;Wp5%$mP@I7LXe6|ENO`YiIC`HNL4Tv%~ zq-QDkZZ0l5Z^X&R^=KB_y#>m!=~ph}>Xj=fc=iC#FDAfV zMF)m9^RWAI1$sKE{qs*CalVx>`DWrh7rXA(qwhm6hCY7Ax6ecP(A9xvx_?J^ABwMR zMzkwWjE?JKK=!3#;e&ZQE~BWT0qvdiuBG>JDmfgcB15rXNk%w_`wKk00B5ZzVXgFo4E@eB9NhWO{K{Il4b};_^~= zSQ$=Sz4C8IUSLw2LlTZWtR+9wDvZ_U7w55ap@*C;3c?su-w?s8uA%5nE85A=G&R1% zjq?du7Pc7=tJ?53_XL(vQt;h2L}OjUItFXEWa7%>C&=Ct3OCP4tUXbL%EnG~cD%#8 zhbf4$Ga+4Nl3oMe3f&e_8TatGu^G*+En?kY=HuKVFS51qXBdb~5lMclv!floL!a>N z+bD+n-V0-|wY>v%Z=Ygsl$2N{LtbcnfQ{k$a9?!*uWGCDzOxgxg*n&}9Ry>-a1&xA z`6gA1XryJoL{r5jtO;^~5#f7fvGluT3i5)Ut_Y4k$#^{a39YX(5W$2A>F>C>FY>^g zlxwJNe1@!zkuXz&-K6)@Qqe}tp*$4c+>dBa#zD%)Do@N$MqXfFGz*#a!x$aBk2PF4 zlKhUxgnr;9T zw2|+sd3+j4iA%BOOaZ#u+tFV05C^s-U}0h^PCO?6zJE4+yah?iKekurl0^beF|6gq7+4rmjn{E3XPwounsS z-(FXbH<^1d-_-;vTJjU323#B$Ib&J+UBcJo+uwJgDmN8#5>BAFr2uCY$qUrR+G_ep z%I!h1(+9^2-5 zL03ftpLHkktf~net#5HZGY(F6MgnPr^)k?9;GDCTDy23xqsdw+u zT3?OYh6Yp=T|=TX7xU%sKdq4N>Ot#pp}YlUnQIVe#6?~%7Fr|W$RTWq4TH6=e7rK? zNno2$tUP!Z6?IL5uWl{O#{PIe!n;xe1&zVLWfU$xu7q84` zt;d=C64X^yp^V$TG8KU4Gc z0OFDkA+M$Y*JQ~H286v;EHHD&72KEMaW(mMDbth*Qp)#SKu5svUP66EHd8~kT=n(_5`8V;zB8BbZ#NoC35&&WQJm~wTLjOj6x^)s z!(dx6?jBkW8?KK~+vrek?i05X`*tnG9CyR9i40z;Xu9AqUUoMjXTxl`2*eVuMLid4 zQIAssl-HvAKB4Y(giwppqt8~}q`@50E6O=ja(wp5;9gn=^J|bA-uwje~Hdp~r0Oeo40W zcpql#Oq_V(8ld0WOq4b&CogbL7{2=nnn?G&Z8PDdP|s2K+k-c~pD4eZtu$U4P%b4b z0#Zg^&^04`a{zC@^q}I{JbBzp{#?u06Z7`G#K++Z@ma*OV?>h zLJV}i#F0gOoSh1sqmyyJ?Kd>v-;H^;GS~B@iQOU`fBqgHULC-EAEOCGEY^MAiSo(G z3nW}0lh0QSU^rtLuDpAWR4YR<4)_Pefb}%6L1fA~6xDSJex@$}I94R@$L*2=JdhzT z7!ZEvW9|Zy&*Ek^`5E$eZG`RG-oC}Hb+ce%Xdw6i#^bs=i*dHP4vh`fsH&_*LrXSR z5neD7h2mfl;RE(Fbqy2~A0oxi1okQS(c9gD#>z6BS;(X-eY%GTE);*R*7TvTtrSnr zNb0ck4BZ(bxW_EU?zGj2^Ommxn#@VXL&`1kQx{T9A$ul!pSk@mYDd1}`J)RAj9@zN0@_CV@hZ(tEZ_TQxF3^4X7G=V%EmHD5~XH#yFxJxsPw+!NDDf3vh)7Psj&tz{R|G z=q*bnYgpoJ149XJW5SN_t|zE(dWF}oTL`-~qUGk= z3AV*GC_{4_%+D-CcUK2K41dBeUq>A3f* zT3pYmeuaAnSHP2UKB1l?^Be;m%2&-}vGH^fs+;&dNm>hWCHoSd?n{KDm6H~W- zh4IPr7S0=y$+alDPN+rIKf{^KOx)kL1iVUm>{=4G84ITnoP5)b2Z@whDcTIzM@${y zvvLUf{1mWy$#vLV%?wLNJf~ii9lqvp1%h-UsJpH z4d5fU`zWCHw;vqMW#TOh<4(t9oXo95Q?t0P(A4k@XR|W#aQjlaR^GmN z;?&$e5XXyqk()$$p<;bj5V4syk0v7dF{j7Lo)Xur7vZZ_1;)c3k3wphG-KMu#c!qiBXV5|q< zjCUCMn2#Nn^gRBI@^fQHZzN^xLt2d47`EcYSB7?8SaY`-Jr$G#P~P^B?#9CyA!2Xd zq~rxYW`F+aI`n<|fE&wg#RScD&% zVkt)2?qW@Z6Xm_~*>i0EKELjA&ih) z_j{5T)CtpE$3{C_81mu}nfa_Sa>AI<7`69ALdJgVjkOqicg7V4)^1pFvk85*7qLuF z{fBLa@r&=;lX%njH@wSSfglSRf+o+KyYP`XLwJ8b0lxOSP*s_S%$i<&E7}JqTT^+T zPwlE7a1iCgBN)7wF#fsl-3*vmc;I01Af9b@fatBHJ$ZraITV{j;aG7nA7zal z=;)wWT=p2}x6Xl;nUPXk`KOZ?I4R(uXKZFFGq5N@Q8$D~%pSaMYsSO0NNB1si`oRU zlFp&>Fa5~RSOIT!2^*b-gOS~GWW9cmzt>&F{6NVhI(5FGsVU4TsTv12`p{Of!=`7w z_{+P4a5dwCgXBBv93wL`n2E+4L!XjL6SHt+){dg@{yOLhtS(9b$PuzJvLl~N#1pR! z!sJ&}Oif;na{$t-$Ak*^MgQA`he9qetUcFA5<8)8aenO>244H>p#Dswdg!n*r-B7u5iU|Z-zNrcVXX- z?MMpWjNErk1Yjw7>8i!cTS@SDH(NSR?U4JHAz(grA)`wfRIR%Q7{2!4S3{ z^KkTeHr9zEkomL{J!Au&oh_((a|VeN>{L{BeX$P0t-&LhIjc#O?! zHFF29Q9$mefFJ5*DULJz8+{#UxNJmD^9R&lJ%}~_e(?46!aKFh=^0vnIK!n?|=SRWu} zNOIp9n_3`n!xXSi?yhw+?pD%pqGanys zI1zZ3UO!G==tq5)cqKG57PSm)uwY+4>IMmPIX@b>Ens&aNbJ)33ySO`J?uH{MEUUrwJqzLF>H%Lr zKX^LZhAjKx5ES0Ce%mdzjO`5ki2CF zcJ17OXLUpP+HwxzdcH_~@fN3cuYiBR8r**W8U5W?v5aDsV!!@7k{1rGCVVl&68@W> zp>LQ#Wjs%W>P${v=*maNJTc>5Se2}AkGLbJaC*mD_zM_~6PF-tx>kIyfGb?*CLrTgBibu2V5u7=SOV74g|_N!q`#~| zPtge^g$BXT+egrS#qNu!>1@Ke6*A8t-*3itLEi_4M&eZA2s-X;hO--e=IaY@@>Okdhsak-8zG%VPSBdIS;EZzD89^E_TMcK}BIQl~qrg78_++FqM+^YJ-siSdRZz1zfCIu&_=?m@aH=MG_H){C2;rjf`3p1ww*0UeNzE;g|P0NGm#J0vV!-l3>36ipy>D- z%p$+;;pu^pnB_Q^SB7_w4q}l9#U^Rtmbc4yTZEL{MwI7X!n(PEaC4c1s9k4pr=Sa8 zexaOewyy$tfqk_G3?ed7UUCStEX-h_1gjZvfiid<9&~@haMfwdcd`<1*-hiX)H4E$ zGhbpTXB+0&Tf>-=e%{(xliEKp={jm#2`_A4g-B;-1V^vKnY=cL*R7jWis2Id6DV$XwG^#8pKMOgVP+Z{fEvuM12#QUquC`VN?QLLu} zO-mPqr9Z*@n&&vVdJe@@SImq~!0D%LD9<}2=&nk7=;%8lB!cpj(s~r<<>E%}MPwh^ zhsA#WaEe@mtcphT79K|gVH;tk9Z!lf30E;cogm^BpF(kGQu2Zx%pH7jr0g4ds!w7b zujJCUfP3(MJg2eoHZuVc5}TPhcL}l{m5}bovCK=xW+>Jhn%Tg~!xQdK4p?&V31OHA zNQiP$QfQKw>33eRf-|*4!re}M8-9WvZVoV~F=1e63g_V2*nGDc^|{+I&&d&%l;cc_ zvnLaMEy@9dvGGzFno3S#xxX*Y9K(t(zov)CFo z6TTj9SiJoKD!MvxWi`cD%GdZ>1Jl{qmYRm$d-kHRWfVhYM-Vh42>T1);_&802#(x> zyumN%s5pkXlzZz?J8B!+!Eenuysj_6p0&|%b#bG1UxX8R<@nZDg7b+oMJl1)t>NTO z?e6S=#RqcGTAGUubD2o2#3s4kK-m6qbv??@?LbtpKRikIMceM9vZo7I*BH}v+=gUh ztb5uy)C>>f;gP+#`t|`%&0h>pUw?#c&ceIlb`%|$3svr4>a!oM=LiH4m$_Jbs|FR% zZemkxFkGA?5wYbYuD$5Mr*Ad5xFkeEUZAn05`yjbO3_tz0Xw5Z;ZJeZi)?by)>Eix zZ^yOulGXphyIR7T@$oIn9X~!ps)rLS=yL-DQ#b|8Lh|hvG(Oph1ukSWl$#k^`6F)C zb(HjyZ9ZS!-Q*{qZ5@wQ zbbqDw9FtI-s2RmTP7?G94~w5GzD6X}FQv6A-i5~iu8}*C-`a|&`{zJQdiobL2)-f4K%HHKZ2%UYtH%E|RDtXi-YR{Py2p3Q)Z_)uO}ufScmN}xo*~6TG=aQe6?*|4p9j!< zVG&f-^@Li~^{y}IsyvN2P3dj{But!Q;>Es~_%d99YnuZpFPVYh_+u#fI)oyM1)P(N zUC)yyHVbi>;@PiF*AXA?Fu~t{4|zdR*nbA@dV|VyF))@RLy)}+_O9H{r6Sln?{36? zhHKjnVOVsz0_CrAuxnumoSkPOJozXtJa571=LXzNnj;}E@Qy8kNWM~t&Z=wJA4j>Z zr?=oE7i>I&lD2l-+2R6A6A32Qw}7LE2bO0yfmF^9a)v)T8vGObwa*s)3Q=gc_ixiV-4q z-bH&W<@5`^pvk*fs#;=2<}1AadlN1#41%pJJ|lZq_t=hS?L+uhkOn7f5wx{Du=jNz zM!vkjc54$DO0Q+%GsNefMeC;_v|m{!Uy~+Grf=$mh?JWsy0;G2DiiB5;_GyvCi20O zjQe<5d>iW*&w{J73uY}z!i|bH{JrG?#VI$a^0+lIhqY}y&b{ryn=6YDV9VqM#wJFv zuyw%PV{gz$_O-&*dW^ilwji$Qc);D=8~gG{G5T&yK^zHv_1< zx?Wu4;5^I2Mc5g2ENA9=j-dzU?|Y1DRoS}fFa!WQkq&9_}ByqbtGd%{1`oJCI) zDi-r`B(E5`H!~13D+umxu87@y7{z@<__Z(t?sjJ4MIEwwQ5%`XTtaQhKKSa(;!LSf zpX<^1wcCihEsbcnk%DN-4L#{S0>kEDUv@rf-rd8dU|B3CsYRvcpuV#NH})*SEW*rA zVTm~Qs0vN_2PqdZCflQN#rVO(9Y;UGHMG@-uA`0YrT<0(VN`{@hMuEmY=@BKnf8W8~(RC5T>}ic=3RV?|Un)*Z`3`){qdxoIw()OZ&INi8b37Oir%s7vy- zD2lnd6!$ltx`&F9Q9M4Lf$TfyuxDie{Cs`jw|YOWH+G>hcPl)!B;$<6p03CQ*6VMg zqpb|LHpju$-2(xkG1zmp8nsmqurYx1EV1rhf$?J9uii&je-mzRUxvAHJ8>%KDpt&n zM#53T#J{!Sc1kpyR5hS)ZU+|+al5a~EX4cLdq|=&;?C_(xuTn$35+B-QV_}~G@Li! zenT~`9Zp1mKiRFfH&$h2qvi83hHfQ-caa)zQx{v8lAkd% zk=coy7Y-O=X3{0px4p%&)&7)Yv!5}?!t}>z{j~!(*G9lmi}9J{J`@ksTsD%91NiIP z40t0;C6E#s?RNk zwyKtJ9Z%qX5B}lWtKz#)O*OIW>8K@r*r|9(jhYzE{{6=L;j*1x$?V!}j83^DzFq{5bqw_$UwF zbw$bZCy2~syhMI)@&Xg|wKTY&ls$i3_6KGkR9A{NqFz@3x>h(8nCjHUA;Tx%LYL1usOrP7WycWAiz!sRvHN8QMq4f+#@>?NUDmD%GcUV_KJq~$50l3~ z7lf`O9N@Y71}gJY;GjDFLWS=lFK|7_eJKt!XWn4Y}gfTU{`==-e_ zCqg}8DVw+uK-Jb=i5u?+@%6U^?Ls6I7_`Z$P;gj#k&@ltYLGRdI7`k~dpWMO_2b*Cw4Wd^ z7{bOi9=Cf&(cS(4C(@td+4%%SIyl17HyUe?7vtmS8rWIlE$p29C z0*itT=+PLrU3(jCExFhlLcl`yS_PS!ykG=dr-iumDi3!~U&6k~IdF1uf^X;o9J$?y zFO83|Z@vZTCibzs#hxf&8Pd;R!|^q41bhjwsaas2Qt|=`2SWnux^df(+cAK@d>%p< zudu7Uh*g2^FdqYhlgJ-UUO4v}t-~MD-@_{sI?&qEgwC1{RAg;Mh^NdBIy9d2wB4~a zuM15#*TBQh97fDKro=#G;e-`8TG7{>i3OVU8C}msaZ^ezcRuLEt3x65dwu9IA&7os zmLz(@{(2gzqFvTZLWFDycK=U?z;uos>0JJH$Miq?h}w7w|7xr9)NXe^17QC`_9 zf=^sJ9+kYt+4Tf0>2p0D-acFht}Bk=S!+3NCr81N0Jn}2Jx_l&_CBh^(C{myFA9Mj zfpp%Ip0`n)!K+i>58%lz57?TpUIgS+V{oE=0EI{W;c8_hPR2-#%pKs7{u;v_kFm{D zyt2q(hB3@339)kWLekB8^j96nfy{H*A7uqY@|z}}Vc2&45iZ926Zm0(ME1!EDYc=? z{B3wvRF13!AMh5KLfbGXA8SYQsj3#3e<&XnFHU1kgd+?|XMR^*YO|U9U!v_pE>b=1 zVM3ql>x*D!Y9=t?BaT;KkaRhG{VvWdb%%`^y~hj_#9k^uerk+-@*|FF&gksw!^kg9$lbd_jM2D2XfYq@ zkDKxL)>~LPYvP0uub^<*d=E_nf5n^qzOXlyw`Z1rAMyfSuQCTms{2rMY9>5wjL5dc z_HJlu3zxkG7=Hf@yL`k2M4n_YwTi;gvR+i2j1tIi>}Paz><|!p8O0w;ad5T{CBx=0 zk+bFLMc+`D@ain=yj6jLPj7L2RRkOirDK)aIB++O?SAAR2!xXvjX!M-sLwx(w$I(j zS?2*O1F_z`4WFS&1WwnDqVj04{4?m?bZGn-S=eFkvthJeSO^vNiNf#bS!4YuCNG36 zxq=2tq+Xv{4?hzVA#Q4EYQQRH2kw`Y;KsHn7%LvrprZ~Amvy-EZUF!1ucb(j^@SN> z;vZ>?2{I*lK?jzufjCkAD?U_RM}nOUu~b(JS{A`reYy(&`9FK`{P+quOu%lkq5}Lh+jE$P2niywBu?3LFYx>}d#*@mgH%`hX|fZDC<#Ans3UZ$qb< zn187p{bd&rZ>t7%Ep76d(Kz&=6nT5X1(K15%Uo=`_889&#=(RMM_%zr+@6AzaBXO4 zkZowr#Fk5M(f{QgvXY|VDiVPSnws>Up4;xBrS3kGLtJ2}qz|SiFBrneXtkjG(;f1< z8#x9c_Ch%ZDlQ`4j&dd%2U^y?h`UgM(Z)O2JkKUe_NL%6$9m4oJyb^~AhKn;%+Eb)t=LHtBPn}>Kf7gYZ>uuz>;+6{8 zs_qOkxTF{0W7lQGsfddr+&>0Z4v0Khh~uH;8_9oiT+-7vf^*15+$^oey`8}j@p$L4 zP0x0S*@hc6b;v)o1a2ytl;ax0SY!$l8lP?}PvB*74j$!SN7k0*nC&WpmYO;|cU(a3 z>79slwxBVrPveQV|o8O*JPFVnTf<^A3z_bgADA%`CC& z=?FTNk{1XQXj;H?)-gP8eTy?I$mf#o+Khkb{suGG;?Rp4RA+BSxG8V{PGemo5Xol> z(f73i=QqU)He(>M8IR4k&`_6yt&wgpkr&~9d&PhFY*G%UVWH3?7@rCV(g~;oAW`o8Dk48Y`9ZKHbWSR{Ljz%GqN{T8^onQ zLT7yrHby%OW87xNew}u5KrXkAP21eX>)UO=>qfb|(ujd*P zOic)D@%19YVrDQWJr`bRz)1B`?7w&&C+6G3)QGT}r88Dtdx3|W!ZCx|iE)&bX9N!C zHsHZ7Kf%tVnAy;U;_SKGxOZX+EM)U^nRX9IzKrTOlaUvAY=M{fs{4p~mwM;$?d=t}U1B zyuf%Z;vnAj^`Ia%94d4bzZk9@JnHx9?1Rifae40(Ztey5n5 zo6g>g=M}GUas6yq3%NOCADLQI$P~4x{GH;3Gsh8JFW6(<<#(ieH8N*;!%9JSEu9s}ZXdwcf>hZ25P5-gr1r6J^2e#_-_Tcm z9jmM;U)2$l1+~=l;TX0F5BmNG{=26HSN|pCg+Lr4Y&Y`hF_JlM$o!Uxo92#bDEu;r z_RGtls;)1tMfHBh`-)SD6?WQ@UeEcl1Hx9_K*y(A+}bjee4!yiR-HoGUk32{#2WaH z9gV=kbz{Oh*DLY4{SH^#zuKhTKNQt|>_udl5o?AEtCw+8PnDb|oDj#cBZ6x@4Tj9WYB3pGF; zeI2rQTdX4d(EVFI&c_DAMlQ!9e5|zu7n}OTD?$bGf*;b0nY@sP6pmM8*RmMG)OH67 zxR!Nol|oIL-b2qAE;F~_PWfBx3zwNVml2NZF3~Bt_UHwUuXYu%563e0!G=ETaplns z99b6z6CStvyoG)!Y+^@`*Lwr$31EIL?6__tB+Px7J^X^n&9fb?2%J;!hHAv}ItfHR3cGW8r?0b4$Ap`!9U7JH2E8Zj=^uZB@LTib)HvZQvYu+11-!8Nr2 zUxrI?D42X9jW2#*ZNkQ0bJOs&p%z!y+CY4KDe0~*f_Lm*yy)sc!RZ9Jk$vh=o~}kY z_=3H;=p3%V=`|tZb{C#Own=Tk_#q}u)i}^(;FTRLl zd$(bwuL-@E2JDyb!lg^6kQ8iBdT`Cq0t+OysMU(Kr~~3!)GiNunD9J^NFPR&^WEwi z#BkG9tnhH8+=*?6^e6mdx8xeyM&9H6BK|$w3*jG|jdXn{9&ECN3B_Uoi_tR--J`Jb zMkTrnPhb)G7)@On-6PlG!t)|j6kot3on=@Q|J%i-yJP9@4k<}VX^;?!r9sK18>D*) zk?v3tq?BH2=`NM-ZdkgX`91%ayx_WaW@qPn$2p%f*|tzSG@f=C>uKJA0^+x|3c@_l z@}qBTMQw~c35bHuWDp(Mv$9cQAMv?zOX)W6268)mkZPHY>2qLG{%S)%TwUC}FYxfa zn)Ik(rF)DWORS;-!twUj=u4a_&DX^N4hS9}S=#zpmn~%TjM)O&kw*dm`lpzhNW{DQ zO!*uFP@S>z?tIS1hoU;@m4+oLuiLi z>{SK^q0>M!=@zs1lM&D5MHPb#*kEoR;>2&Q5}39+6(k*xp4spZhTL z3(QTpvO>2Etsz5AqmO?+4WEH)1gFBje&xS1>j;(f@qm1slz&;Q}>qr_H-;4 zoL%isBVi|;_APVH@+=D*#{VitXQ=V_oa?-=^>OXH6V!pTe`r#PofpEd2WOv$@5W@Wl6 z`e_qDlFMVZ?$*{o#LhvGRkbWF4OEN!Ty!zAm*`5j7&Wgl-DMDwrmi+2j>IAOC&pZm zpr8DJn#Y@s`8Fd3)TcPR|Brr>-Q)D;j{HVvB3Y|OLmgb$M~_6bLW6#ZB6uHKYYt}jX1*85CHOL=tG=6o3t0FfR23pgtIKF3v5;LtcrKn5_n z>6!Q=I8`bBW~>UaCYWc!InBL1K<@DQ?3cRZQ|%spp1n$s5P$L;#KHZIn_%hUtbJsma>Q1QByjf18Bdc( ztL+nxs>hnEts;^kE}^f5GM!(1d$3x>&isJD18L-^=lKJUpRd9xxb>(mhMW_|SzZd& zN0t0SIoy3^%iY#=N+m8!l!b9+Q6}kXskjkJlZlT+pCt0_?CXYf{!wCN^qV~7&X=2L zeZOi#*YKYl62GwfHZ|-aR*K`3UO9=01Pg+1gHcqUaxt}G(E?Xe z>DI0;_+!Tj%mQ7j_78c@OQ0jEcpU0&#sT9xfHQTBp6RuV=a0@2TVRhdtvdfm!2aJ2 zccw}SU5s0pl^Q0oyU5p@JM-*UHkxm?KFMkwz!VNeLJLHydAneO#?y0FOt3p38;52% zayK27T`Oxy*Yqiew8=EWdBLklgv{@CjwjxH)H&KrjkF6Jjlw(Y=RCE9;Jb*)eI7-V z&v?V6@$CO~*iHIj?fVNxBpW#D!v;;JD@kK2CIZvF`ZYzh2b?z!0f&mZA;6@$CIaa` zyf%Qc)9Q)!Ws>Ixf=R|cUxxVwOPzOD3w7d$kz8KD*G|}ZGT`mFag@{~!oA8X;PWxC zT#{Kdl2{H6aD9vzzZJT=p=afP6T$wE_!!@U#fOBI2GRSvJmCm7@hT$S@xa1%FLFRB zL-(;9jX*3QR2ALYT07}Q>i~v2fvl3>Yqs?H^2wVofhv!ME|T<=+VeX17Tnvfbc?%1 zm217POW4vD0c!#Z2#IyZgGhdwy8JeeBDj{?#XIeWP|j^3H~N@gY4+d)8^E6X%6=<_ zGK|(V^)g26BN+Zeqf46vBK#ZDi8xrgnbM0CK8p&gUW2ZhV}ChTd8bH}_9JPoxfg{YmEf|8=UUfmi=(`Z?bueH_H;D7p}+Z(A2lVtM8R zgjJ~{enEV%Zr%u~p(}2x^tFHMxE!^D)LLS)-i!Mcd9#~ZTDH>qF-s4CwQk;>QZJe- z*IaADm!ilQ7gptDApUIUifgr0F+ar|br3e(#b%tA>68^z`*gF}3kgLt5%s1c5m+*` zx~L5m{@g)#g2kCk@_(t0VCArN>Gad!p`)h?uoiz!RU7 zLHiu^36%V6b@4FmU3OlB@1qhC z>(|w&37oQ&EdTFS=};i3J8pg>G?8D}8Z=?IDO$g(Rh(CY61|Me?Th}iYYa86em<~4 zdap$3N!u13*)UJJtCfA0+L1FqX8Z3%eg$M(lf;3~Rqi{h8Fw#VAg*B#5-eET&4|-4 z^e)fpc4XrVMN<&gzOt%hr+1T1vk?S?;cIxACIKg^KZ3n%d zW#HA8@OxeG@Tn;1Me2!2@zJPY&j+2wj0QB&i~35!dI{=YR)QMgAyTeQ=9l_`DZXD( z%c`eqd-UR~Qfjllqi}pE@h+gpbnH`SGlW3g$r0AJe)~=0@S)5CNx;{H0<^GkU0+R0 zo2Jh_dDoPig5FJW-PDX?1}8Wx)3>W9F?LANV{BAz4&o47@{q%}(Dy^c5Mf5RiIp|n zArwj<^W|axN_-t=Fl%yUuDJDc>aKU}(dA ztR-rz$n~8`Al2nW*J8Kb|31K0OSD(^qG(=kO%T$tW#LrJM~>eH;c{G$I(2^Q;#*w) zfMktOk$20k=@49_=eAa`hd@|bUx)$p1^%K*O+G0Q_iBDy(_hx?D& z-WM~e(WvuNe=>wO@f{GCdKePgm40s2x%1)qgLL#ejTS!nyL0rHOAC<_qBbXW!E81d zbRwX&mWx@;f8zoa2VzI?x9=n=rf-P*4H{JKOA)2(k+(vdXtfj+nU<2hf7aV%;6D_h zp`x4J*e6aAj7tiEyop}4IKEMNaBd|8@|qz@$TGP(mfvebaj|Q#I>iyAR_f!dhYR0q ztvs*VoIKS>UM};u@l!Zd?ED;??8tsy!658R7$i6rVgnsO>>PXu!)&SU>-t9E#$~&V zx&)-CtO3(Nhj_R0@PiL}^lmnp5R?-xZRYv6U(vs7h-cJYDEHLTNVT@oK9yE`A{2Ck zV_<|u5wOArOwa=|>T4Oc{%_5-Hc{F}y0*R}^>G0y zBh@DH3v)Se;i94%SilgV#N?*)tALFJfhV^cpHaQKcq;&?D3ioe6BC|XHqrJ^zBEpl zXGCJ6L^=X%s`vAsr9-0I7T$NI`S5t=#{ax_oJ{edaJx#Yesd<-|Lc>DX+>~&^prL8 z!1xDBREyC&+L&waP)bW8UIbEhntA#6SxfchfIs&A-IJ*g^$BgeB*$ugLNQYb3<$wW z_O*r8HlVGH3~ck1Pq-f>g)US27QF!%-q;=zMYbiSrGRWA`hVOLm&y!uMJ~m!_E;NG z&^w(>Cxi6YAq{6J?a&lZVE-UaLaa?e_a@q}(E*YH9B%eMrG7$_J$`K7i$D7o5+HRa zvA5VKnAVidbaP4h8y5~f4zdPrOA&$bqHT>Q#gQ?1IanrL^mVk6*3ah+SO9wMY{oeN z7}1C6i}$ffXJ!M87^D8hIr@I{s}h9%A&Urp)y|DoZ>>~Xn|LfM_9czT0@~)zg06?F zu$`p4bo4pN5R&M!{L-{u=7y~@;35L`QzJ;`Unxgiidr-zUPcURpPl0h+&eL&yY^}u zJq{JiDxh+IW1Vdip%lJ++55Qx=5C~f;r%q&^v)#u;6S{iOoj=!*o8hS!cmi=sy&f+ zO+$+8KF}EtFM@9+^n3@Zhi}WBENxrR-NegP^5VqYypzV9x+seAzD?hE%wjv13Rn6~ z@lJ}_N4>yw3%ej|ZXSjanxPQx2k64`Y!^MJkAtq8P5Rp$A}hhR9MuW;T>pErN7kJh z#Pp$Y znMR$dykRxX(ef*UxcyI={dP#6PyZU=93Oe4%REr$CEymgiCy$zqySzHV^AJ%5*?4_A!;ue23eV(?n~rczgqba0!$fs5}|;qJ2HBz*svsW<(oQBqjfGclivFauE1 zjtslUOC32?+-AK&uGj>Ox#!%mv~{DIMj`Ze-Zi43`PpdOCs|>@rAH>fy#oQv+V4S( zU9_(oqtUv7KZaksH^t1Wp#3S_8vm#`I*NDdA&^#q^WZp$L*t2O zN?5p9# zt72KBLAluy{%9G~rMg!&(D_E$G^Xx_~oM*oO@czyp`*tS<)B}emE?Ctmez`ZWaX|7&DH7*vbTPB`+K%q+^;ADUr6TrEE$;5{sv4cuJfbI)G~Tm5p$aO&(YND1G%$ zg^T{uCYB;LG8g`vCjB_DmUjs$01tACSn!q#kxl4mpMU(kiKa!-QT%P6CSCA`B0vn; zV8q)z2#1!w!Y!|HUr)oEQX^B*YNwf7JgYc8F`Zb zEh0ngO7hbxtnemCJm670eID_QC4h-0#5}U>2m0xiRO`pbik%iC*aUj$Ul4zHJ$~L9+&2mxdl-=WS6zGoTTDG zp!E-KBtunf-R~loT`SFIqois@4|ub=$1H4Xu>SaQbA8b{^jl1TI}Q^%sRZlVS!tUn z;Kh&qvn;%2OK&ogH(#P{#r8ifw-BRABgMqS)2zMR6JJ zWsEro!z#}aWzaE7(PGf!MKy8JU-!t#gcVjrz*b>79WN4V&WKnOPJ~wZXQ49jAyjuJ^^ylod zY`M9pmJ2_PNte{+OG$d)&ei^?ikc-knOH!)a11<*{6Y`^5v-=+^>NXkN29mwkckv@ zUD)`IK!KTF*F!$+#CB6<5Jzb=sg~I$FjeXFI$zyw_b)Xmoe5qwaGsL8aBopuecNmu z!09ObwMk+1r#~q%8TVc3&r7f1&TBl2)RF@b`|16F$2}>xM`YT{%dtoqReq0G-0tnbIj8J9)k7!9jP= zYYMt->8(bVuLED`ubScH zBQq7%o#4$LbrhG2wMqie=LJXjNDPrdKdcH{i1Z)DcqMI`g#w%ni0m#E%i8O4Nt)QY zy#q!@qL^+b9VVXUnWP|++$K%fPg3@r^TCjzUW0rM zh~go%|HFs&q&$y4AEZ^E8n7qfEtxCCTa$z5w{09=SV!_??4g>8EZq#)yST9f`&yf( z_m!m=GAPy$1Dym*MwhUqe{&O!>i(57B)^#`$@tajozBabzO8CmD;~A|%r5MR{cK3U z4o&8n3pQ8#n^z`rVt(bBCw+>>gO`iPME9q4ZG<2Yswx|6kM&M~qSU`{D}Ia{z+(HS zbfS2i#C+K3Y5Ky&Q@Tg3(+=yV^hdcM>A8{qYKkAhpQO*9>o?J=qGyi+p+#b?Yg$i} zor~xmnCDC2Z|sbfk0|oal~lj!GPtwPjyHvx9ErAPJ7~|XVTH^kvJ2@7>&`FnK^rw4 z(h2&12f<~cs*j~DxMBg(x&g1S*@W!x5sDx54SA!uv>8WqWJJ&Jp-FCh2@8zAV@iMU zaEodmh@d~sA{eO2&aURuxFIf#vXd<7<-q9_egu#)d81bHUN^OVkrK>Oe5X!b;d*KH zosERZE`jI*%Oq|P$A^SsSiOohDDrP%Kso}P-y{oZ3h;7=3{x+ODpE8zhdiu zi^xvb2kFZBoK662t5G_PVbPrCo!6h-H7OsQIzE`9t}dvhg`+C?De50iEqpA@y*6=v z*kM5!H{&ooBRyY$k;tzU_4@P0;5YT^jk7y~WRSR+SbSgT;jnnSE#2X!yT?af;M0(a zS2dl70qsVhlcE6Bz^&3hMsX_S;k^wzaGF3+<><5dc*s8Qh7>Nb_XPc0^5nZRYfkvQ zU}agYcwOqm#(&Dh0F0vcs`hG0_*+#@GcsD!K7$4tDMqAX8n?1Codq?eRe<@l-0YpO zuYU+eV6*wxreJ?W7z*+2?(E7Bh??6Dnv5ts2m|bix51BAF6-+Qp}6ZGB*gsF#_&-uNqk(#GZKI~B#h~{)d2fO;KfPupVkt2 zj2B*>znHJ)pR;xtQ$S_ zye`>11f_yQMss9zF#UI1Esq4qnYoQ)ydykFU4G4BNCd?hVXI7-NTfh1{46nm6E=Fo z%Z9u3Ca5<5Fvv>Uo_6i`b{$V8=1a!I*KTQ$(y!jQP}7Rn;}GF|bBXBD6j6bH?16IP zbDgu9H8luhlE$)uKyC!OT8)^TpG)7(QVfC@r9@z4DJ?cPmrDN~2{|=g8HH(BykqYs z8YB3Y7hc=w{Jp&vO_)=bR+24cejw(wGApZG=lX3R{zk(IBY(}$Q9@@qms^aBi?ns+ zKBS)eGn-fZ##1>o!Z=Th*fP4`PK$4=YN!jG_;|@&LZ-7SAjbw|`Lso*P)7!#S%psZ zi$*8j{rx(Ivik2M4s*t7_*>({Zh2NmpO4m=zuFWyTG+(#Y7eet*mXwNG;(gK?HpiC zx=GW`W8XIAL-C!0O5AE;^ktxTs@_RocIjx6gwg&E$hIUPUT?JwFRN$DJp(+Q#@2SC zEyEN4$?1FiMtnPqvJSq)+Pwuc?W9x98#ma8pihbcTSqc%QXmd&cuRLia!??d=|Bdw z-||XW)W~0)fcAMZ?C|D2q)_nXb_ECBcZtgWycU^&I3&$vS6p!t!#%dxf}5t%pc0i0-my} z5BV2ub@tk6vEBke-J1VxTxQaPZt7&K#OFH*1qFq|iNE`^rtn%5L>62h*rRi-?7I+; z8d&`>N1~*g0gO}`Fc;bp_S{1h_$3W5MSn#|@FU7rl9u8Fo7O7zzSB~Eh1nF-Z#a5g zCR&P}pl)GA6EX>vdVh93Ihj$4cK6}#ISPtNfBw*aRN4$7ci>75I5Vm>i9d`3KNx{irxeG#7B&a~@7=7}?!2nJ! z>U%%yf0Hy)ZM9h7Kc{h83MvYCGQ(GEN-HZmZf+=Wjj|ofR0#VlkAk5k2purc)9{lF zqNZ&IfU#(UXtbBjdgtZrE$^3VPtvd`^DW`dX=!u{rOmbOgm(l3e>Ty))f{3ZF0hZx z(IKvRvWE$n1F9HkjbGkTVF##8dQ0GM2S$Yc$8BnlhA~iV;i6a$%X3px&(6=o|MgMX z`R|i{599W|ROUp^eC>759RnjWv}1es`d=9eJU-1reg(KPoI5lqw{It z6u8V{JZ?u_IFagX{)1MtQ>yfSA)&rizChhGTrMbvDkpA13sCwd8Igls=Fho`^_`Ph1&#C zskxDe%qulHTZ?4kc0Q@OM#AG3uG5wL@PF&nM#P5I7T$sj)Kd|4!WP2>jfLduLx!aLX_Yy{ioiY)kkWwm=%AnLnx--0sFBfven@I$qY zMz*oScy>fGX(TfWc#u(h)v@kjE@n(;+6@&jp=^8V*^KlE)Z(~RB2kHO4vD%NlRw1K z3;ki^9!jFD_bg7sN71v=j%zJfWOgTmYjKhB-1#ka+KAGMO&i?QZVJrv(A>TOOmKJV zVL&_px*`wi{I(-$S)KrhBoauKLbR{g+4%o#Jf0sxzF5a|Wt_0`&+{J97ir$!u7pQGPWKDH>#BBx( zKnIQu@vKd>naVp-#o;3&%A}@5V_*KNL-DO)eek(m{?L3C$J$cq^5&e9K#ATjer)`) zsdav1B^S0DYR2Dsy0-A;=1ShuP$k@_OFYz`mR@K21{tIW zvV2`BeR#OdRFUli#>{B$FcJqpaQIo;?!g6*>aKAm+h;gyUdPH|18nT8U$@ZjRnt;vak`7#T0#{m8n&@sq{E$5Kn`~skI5Uifq zb)uKcE12ve`yO!n<;j4v(mTAhOpcK`#aOpTYEo(c(2{5$Yv=vfHay-DEdo)1&oHTh z>CT6pUvV9G?`iFy14sTnpf9}HFgoMNrgI@Cc3$S185l%yJRvQytih>v*JkkgLLeob zNBB#E+I3kPPB%D)BVU=5?34K{w4mi z=6lwLmWu9)KBOEM(1yi}EllEszD+dijI3G2cY=;!T3xDlD(w%n1&${c_9HinEtxR6 z!H`?^TvH-kJvNmADHGky2OFzbI7F)bkZ(>e!oyK^t2z4HdUPDdRo9VkOM$l`Q&U7K zL-kJ-egZ{J24;^+FLOEZigvQ=DJu&`b+B)G6dGU|?>o5+5+d{K0*u%ZUh^uGcb<|` zvv%K)@Q%!C5q6CG82&mpEF>Q*ZWGMdN3>c#&1{V)pYbpIy*9#g_=Ur-+zN3cnv1%0 zqTy{1ulE-cy_=S|Hk8Js=Fcc;7C;e-#smJCkHd{a)Zth|R^j60 znwnsUJYos(!bnFlh^g;e`z>rA6~0^E?Sgbmj2JTTFPf;_yxx!g9+Cz;PjZHCpC|_H@;KCYYhsO833^7h*g~*5>9W@=N3IN=s%t-(cjIp^myZ z5yoltY@J3gUOZo@D!$gIyY0Xu@XILVqQNQ_7xm`v%luknA}6u+K@8jbUWZ&x={^-LcEunYNM-9d!^Uw+MkzTzDhviB?Q3 z&S$72u?q%{*oahSxV=w9rwRw1wwpB8!adN0)gDjo@lU9=$Qse3Vnq5wzwYpnUL+JV z2Tb-DlMem{{00E?%i^OmZ`I!1Jf`S}W3t%a585|IL7)Y=Uq8cE$0K;nCl3HG&VmVI zukQpOYRUT*fII`Mu@c)0l;y+gZ$@Q!9vJjAoWKk>P$RiS0}PaK*4iTr_rxemk>d66 z{F>ifQdW(tZr9b{+nP~+joMc2yvioqYS&&6xVaK1zsng~m8-2emQ@5}%0$GiS#CNB z&^6WBZt09mRtFR?8+v%4%A_B+>EDClT2ss<+R^iK$5DVnA)LN=$ zNf2Iv@~Q7IPgBf*>(Fd#%YxyMDrWVfDN+EA!mdsrU|YmcD4>FHEdnvM4u`=S;LIQ@ z&5}osQB3`8dJo#(K70H+u;_*z@{BuMpC5D!9i0zCuo4l}s6IJ$jaKk#UN^s)L|3a% zh~+^Rda^L{KPG+JmG(7#7w!lst3;xT2oURj^C^E_tf>W_)Ysu22#1Sc zawkD@1LvRt2ZN0qT}jrPkzqnoT1k3BL|o}7Ka?JiWG8)8jN^e_lhl%BNd$}`ON=q( zWPB4X=N4G%M_di7W9D3l9H75y?}ii>#i(E&9MtqaP zK{-m-gDEgf_DL6L96RCTViC1jK)Jn5|;l0**;G$(r3m0^IeS9s;0h8nOeS8n2 zeu{&4tFO6gP*{yDixloBf1>{Tcyr2v_5|&NLnY-acPJbzv8bv0B3b^W3*;4{JSV)x zou2iB0a<4fZ`T^cew{1#4HFD3tmFRW6nFw=(&{5C8R7U~PwEXWHp$_K{G*VuE_s-1 zP{O7hdyI|ybO@ebXl`Bl7j`&wlj+0-TWX62pHh+?*=8VDz*v!W!}zFrH@JlWM_Rvs zyu%XmQW)*pL8fTy4jWanX7Wu(35)%)pcL1*vV0AWhE1rj$VE?~MwjTCs2aBx(_3+4 zx$S_mndc?}hWt2KXXvPHx7VMG=O~|k`QGsN4v<&b6Gnk_wBhDwTwliX)4blu@~r@{ zLn0K6_mfN;So6MQU+5*>BpHddQWb;NT|3O501pfrzgP6%+2_KDPb!3qKW*mC*esn| zEm>5``gYM0-?RW_+LM@yz{(7& z0~Z&>*oSh9K3Ji*oWs{h*F0ek7wxiX`or;kRB;<$&1&q2IeSfJkZ>4kTp}<|v!cs8n)gpJ- z=Wxc;y7a8?_K2{1{LKz}rGTq-SpXRLsL>O=$k!Y@stXnW3PH#iBH*9lZHQ}8*Co13? zlVEHm>A$4aR;wSKusv)~)ZA9&zETKjfyKk;zCPz9gLXaK>gb|`4GJbr3le*JscZeH z0GCuKVMe?j;G%{F1jW!o`{*Hi+FpToVDuLwCg37_VGJI;JL zz>c$nOYXTbJuD5J`*s$O-9!ocwAAOS>b`a7F?18{EFv!a9!whY z_$hljzVPc0d}a(;r>2F(qHSy%@T!t%cLmFwodzLHh=hN*;2CKXEuZ6ePgwlrZhJer z-7ox-8_~HDme04cY&0d6HK(g2zthb6d*gRf+PTQP(olwo^XD2&MVD00Ay`^Ucin>{ z@@(1^jjA3bet`nOQ-=Edk?lmB{PZj;AuDl!O_PRZwV)0ogF0$*?uoc{hO6I>CLTC7 z#BnGr-4S8v>($p5rDsyx5Ag#yVu1Kt1`vXpe2&EdomL%y^z*es3qF%6GNDW*odFFV zv5cV>c(p;S8|LA)$v@L6ekh=J%$Az;rGBu0g}){r@c9h;z4057nyur1mzoprs4E62 zmkC+xzvIaB{*W_{FJ6hv``)!XfLY&qct7FOw_UT6mBb%T+w|MiV^QVd`)SY59rr{3 zn-|}F`rt09EyxGQuqUb?_rVHtX97*{hyE#I-t)eSZs>CL{j&W+crNedVAN$+lTJ!3 zM;wygKMxMOk0wn_0?Z(OI+tj%wLflVJx5&;(Aoo5_>~MGY@CqZc0h_leSfM&V3r5yMp zAjWy^hfa~N1zijF4%bs0K{b?lS!LV5q2!aIsh?OFe%u$LF~m(~q}OwiHS@ov?tuZq zn~0%th4)Z zWw244-ifiUpR=T$rpdTvQTvxWP6tU6YrRZ#bcUyW^)&oo`R@27NR3F@3Hv@D+2^@$ zx_ZHcNS;ZxK84ppFMsugo#RpLA9ZdSycQ53$5O#RuZ^iHGC8ej@J9AqW7z|zwEbs+ zQQEKAl(k>H3fe?-({#lZ&M|>=y`ow;&z_LGdh06^jPS?454L8HaBd2lArOOGhK;_N zf0i7?@g4@sO%tq1AT=u+3bSCjy50)(r2PycUv)Sqoag7wihv22WQvs!fH9(LjaOwq z!wQotPKkUywk-~((H*X3V9gC`=ri1yNeb2&BN{F85_@*yKe);<+%-Jo;6uaBOeg1P5BG;Y-Bv{gRY{1WBboZ(!&g${s6Xn;i;ELEL3;cpzRxa`;$dcygbR8M%Cr1<%rv1OtGum7~Ps{k6qe~x3c|jQc9BF z8^OHI0i3(M`~j+EZvHj1C-0{3n#)%!3SgreSx_FZH~&bCfFC9RHD5qj;Xt^dJ1pf{Xg%!b#O+*!Y}c zx{tMZGaKEj4AOcjS*%)vzD75=D)#=}YUD2u_T>6QWL;>W5qq-{Uu1CY=;Yt`DzM}T zxV?7g^(iHiV0L%PxW19wptnr;{J&DrzoMCK!{w2o<(M75u>4^JGN;P(Y9+3VKk|)N zO=kAvB`pGY=BUK)@F7zkVIdYeg|X^KaCE4}@|E0ID{R+QD2O)8yr(cCnY? zUYm?IC)Ub4iaA6y#O$qVxx^TB)5!+n1`m|a?`DKct54|)ddP?~@R|%|;;tlPGq*~y zc-3D0%_Vj#`9Uw;Oii@<;Uzly4b2kTH|mLN0Az?Imqech$B&hRvDBy+NWV7H77jqA z@JBP}ptuYV3fdugsbFcm?(9(wi@RKXR zGGR#?BJJ9!cOx`QZ`qLio=Fj|gU+JZSc(#xJV=tmUmW60D@b6-xFUuNtvp4fpMB$&3wbT!;O0fG`=rg<#RB;&KQQA^*s z99`H{M97^9?!UZV8XP@Jz}3X8OQH1_w`6@lLv=Do#=iBrZ2%|LhwzE5<||bLN;BS1 zj#)_pI^|Nyj*RtIwd#z4=c-M#t`of}3YZ|sEQD5Zvdxo)=q3*e6L|f`ynceWN$;F! zbdFnaT8qt+C16S?D}G~3`os8p0)C~2R>h|g;JkO{u5JNigKdw&dCjo8XMml5Ie^UXIm=`cCkE8{rBoBqzfan;rY!u{mHMf@&K)@?pZhYD(As&>vw&}z;#(0w-(T_XW z5f6tJS=C_o+jHh)Xu|Kb0il0W8J_iwK(f(R_kw!;O}An*QEE`CZ7{O zrV>1(4B$wiYdWpAe)QdERM#y;dT%}N(a@gq0}2Oz3c~4%oDu-D5*A1&<4*W*c2*uxF zno!GCw_6zm@;wloaqkKr{Cr--MF`#ve#k=#vL}Ih*_*G^T5G8P#WMQffC#&JTzpGc zTz^bX97x-vLX#MzeLaJKKdmFZ%uOm=G);(qeh(~F*)PFR=4xu)054(qsEs$0Z2-Ys zs0uM6Ebl9NuR%a%35ArtKRFTjAM%-erDQLareO0s4X{qC0wo39>GO3CPxje^__pfywXgX6|CW?TI{-dK!cY&MbV8_q484{w}%U zO-&mz3CR_=4x=xYQ!8F~v)m*fuYa+vY~>=)ckEl8VJej{mhWl7882+ddKFVQMC0^Q zn5~WV+Rj8&DBAhYYg1cTr-)o1wzBuBc@S2awidHi&VsHxeU*7O2BY^VUul(hST=m< z7%=Y3<4yQUyZps1l#Cv~_)@-;eC%eQBXD|&cO`BzxGTdq{TZ-4Q+4Z)gW9E1xC8qr zM#;P4`HJ`SP>zpqqqC9Sj_hp!5z$O&mVl9nR9rSmkCe(Q#L6^(-21=T_hN_mC!>H3yip;8x?d<(n3x#IC4?SuPJn zl7lU6iuI*|fW;L7j4^oadm(?-s@q_oc7ecVI9#zFC4t4-Lk}-`xi<9#!h(O>cwjTx z6b1K9Up*J#W^gk5i_XoTR@kvlMgA5n-X70+Se`x`Y1VFY=VZ_};S7XBDAnYHIVmhf$g|M#T*dzwB$`#cSfF%~+j1 z7m^xJwbJMt`TQAV+W2@rh$DZv-4W?OM&rbI`0tDb<-Gk{eu)eQ27!yRQPVHqYlFcy z+}j(X4t2Wj932Hqi!KW2#FYjO|&g z%+zS0}`Lm|{`$!=nToXOK(cGu2HlT*)l9qnq7ZDktZH!XYBZQ(^Jx|=MY2~r=FS0*UZJ+z8oo8*SSR=zZY zXL_(?+%S@xN5kDO>3>t!g^1*c(~KR+g`DZ~Tx8IYDXzpGvC})7A3*FH#3~1udxPMQ zn*<@!DY&Z9fhk&2E|+*4)?n;}kB39jD#{Ug^Gom691NK2wz(4wC;>1J!{|rhQ`ke9 zfVK-$bPA`BVXeZ{s4?7sf#}dl3JhYnW&aHNuII_KChb9gEHea0*3^>kqotF4dp_}Z z*6k3tAvzu>W}fQDX}oO23`(1CZVRD{jSW0&i0k#Ndj)oZv8$Ee_Yy*u$aSbOu9j4L z(uI!sYz=d&TS8z+$Ayn?G7}zZn&+rdyyO-^O_z~dKN_+(`BjXxZh|BC0OeCS8isc& zP=DP}A$y!d+k5Y;x5SAzu|2v{5G->{rcTtI88fYx-!>~->A&p#7Y-RGNe(yw%(x(y z3M?aku_7FPbUJh)ZPs6x-0Z%+$%3LZgeX3J1XALA$bZ!yIY`Ka1cqC4D_DG;I7Ytr zS@QaW`(RMsdF&(00rv}?-DnxHg0%FT{?&+vF*xZypA;&?isQBH6Am(A+47dWG+`%mW2ozXp}}@ zsg>oa1-kunH^=k+3x^Yyq+j%`PS;!SxF<{k>9`O7L=2j0dJ*s}1){&hckR`fsGf_+-d^M?GfAC~fY5 zvhF5H0HSU$Tsw1#7|xI8V3#U#3iW%7fCuJJ5Q5PClstQm**|>r3#CmtMy#qN^~E2E zN}V_`6zpK*fP*BxwJC3bda_CO*USzJ7qB8#lPC9lf_@( zpQplL(nP6bU;Hr zr}6AX;&7cqi|g*G)d=ppph-s-Q!y*SX%|WBXXM1;3V_ z@qx9VniWktuL7`xxpA{haaJCss{oF@yR+bt%QW^w0VBk`7gF@cgxOe|)YE4(Ao9Y= z^&j1uxY;AM|M0Kcv6Q1n4B${{U9jveNA?Wj=**|!kNNG18Up|91y%K#5Pus+Qglq5 zD||*50tVb!8h>xa^PUL<9y!-oP0QEvqKfl%r55%IYq+33mo4!{Yg9A@wss;x%C+(~ zE|GsSe%>J5-pmTs!G4pLiMgz+`BQE8`^l+WGVRo%D7e}7Wx0k1a4y>YqrO7owEGv#(RD&XhI^PD z2cAD>-&pD1;Uol>_vT6K{S-YmYd#=uJ1 zL`=@X`A$so$(>2@#l(u?-+k=AzSDb-&=C1H5qAIS%Q5@QDib{q9!4q}t}4E5#NVVh zM;10P8CiOGVb&qC<}x2>RIa-6*?GGF*a9t$?&LEs1thnbf_=>N0&eI76I1@Nzj4!J zm8^?0|1A!dUIH9=fo;A_uhIr_$|T;zpGB7aB+1PaDf&V62@kYVRK|ldTxNfVZJk*I zzZKiP4ZzbHzhYdn?XQ7B1Z7TjDA7GchY1&KBm2S!aPiC0ZWj0zd{-b?>JlLaP0H^U zQ1d;ePD{TMgWmlgV{aK%SJ1SHCb+xXL4vzO2(G~b2^Rd|?(Xgy+$~6Ohv0TNxCOU^ zyZb>e-@13rnl&@uJNMWAv%7Y8S5@!s>Z<1%wpXewEk>?bVovB_g^xbr88qsDzqcGh z#2r-j{u%R6LD-Nsd~(RnWntq?44sR{|NT*ve!dz^(WinO1V2bmC+ z!mzU_gpAn-+0<@4-!08+kpqxkGj%0WreA_d?Hfb%QpYo{V!;5 zX7qr>t}oOx^>_P2&VQ}_)sbbM#&gpP7UkoEVGi8G5+ukP0*`3q{`LbYwA?_2yMl5q z((tI|%ci4GL3*a{v4&YUI7x&P;J&_3aJ{`UPRx_=EBslKb(=Jg5Xb=22>Y%vdP_U} zmpXI}d_oI659^piwZSO-Rsk2UN-n$47hPV&@kyYP#bRI8=59 zp+2PA_5}>gQg}{S1|jq zdk%M_JuCK|WgUrVvcPaU)`(S_gw(f>YoL8B`^hGeag){1Al)kntse$ z<;<*O(!NRkYLcO;+II$fbCt#)K4!s=TLHFB7wy0)N_a$2MNRoQFEiX*)xU$)#g{1k^1znK7bbV96C=600K zW2|bUD;SVBVl);U0&%~bK)kmu8d|?&xf_w>3uc0xh}t^ElG*#6ZDBmQNAecabf{w- z(i!&3A7Agwy;UaUr9_tn2XG(y&moa6e5xIDJnMiCR3i-;>OF5O6oG_O-@C4Tix=JK zO2ICi7@0*aT7nGT&Ib)AEDA264;PL!$7eS{4<5qf*kOB=d%l3WuUxr4WWC`l*25*m zwj8Q(ze>CXzT2m6xrR||)QU-MVe7VudnW02%!FmiQ}UUMf`grr(=9(M>n~<4#LPeI zA-VIWVzIZb=_Op1!PDfl)Q&A3y(fwt{P@Cge+zm}#v8c$&3asI88+2qeo@YX`LzG7 za(|J1B`oLbDCcNYb*Z;i`De<*WnA6G&zQM`UodHWO9*zG9b3gjj;`e0wUos54S(sG zn4u$_Rg(APJ$en+x+zL-F8J}}7)UvO{oEyB7P&z(vJ*;TLjTY+HGsRmt_>5Idu(w_ z{`*ObTy!`moL9(AhVeBw#e)KI}mEScWE)z^zheu!*uJCt|11-{$UGic!^dKG-=WVA>BwC@f~A2YxfzQ zosD><1twLuFWMys-!LiZaSbrkS-`QE%7vpKd->>}vyFX_!PR#pSAmVFa zGu@vgFhV1BE|$919LmgR11;r0klgALc8FKc6da2M5QVaBfQ4ArP=VX2qLkJ&3(A8D z0q~3&Hw7M~hw19u7i88sX)UomoS->+z~*caWK)0+c;$(51rv#}n{lbR%=sV)Sg{$S zz1H{?;(UgVEi?Kxw>JO8+{EiWU^66U({V%aQp8?opUbW|1h{yP>(68^J9!HLGg3M5 zr1sv5GWsK21%W4gT>O1vVbAWIoHcyl9x{bqh=_e-OcH-L_cSp?$F>?cDfEo$x|4S2 zo~%y;F6plw%nDrG#{js^_Zg&rVr7>doNeLA;C|8FgIP|zr(v}a+m ztNr2==SQ^++4TcJbu({b$Oxi*8#gxp7_DnpUuF30Qe+%Xx@=Ut^3@}DEMlo95I6lM3|GbaKCs&QDK+R{P z*c-YZOLX89nUhPxh5J*K4WYwmc@Xos9%bt3mIlSXm}&~78^=pcz*k5_#%>7)ueWQR zTB5?D^Roy-;<`!}m!qnNg|VdX2edD>Cil25 zFWqY%ZSI1r>gqs>Rt!N}NsG?37zRQZ2jh)1b5Ou9H%X#N`N8e5Z$xHv>*XH;Uzqd8 z6r?NLA#I9kw{JmlnJZeLcG00j5jHdg7PHa~?Ing+uz&2v+@(4am+=OpH#sZ{J9jzQrN=!Yrv80PdR;dYwoXFc^$~+dGp4# z?O5%|$-^SDAH;SN_*TzB{;w~%+EHvqDYZd58ic|YmgzKHP-^`-{HET#f<3w8l8)}cpNNIZz7eM`U@9suPlgRUUW#)*ut+LvpT-0 zFOo$M4~}^6dmoeBDyi01n=>>B4ei0xa%@x<=|-jeBwta!?&im3<^WSgnLZJ@VzXNJ)VT4-XvOT{9^oG&P zMXPjuR>QjEPxaGszQ%v-PN8yECmKWIiMZV;EQFocXA#%j|BsVJ*7>R4}iukY%zM5iiB+=4()iX$O(&L8ca7$rw>r8RM`8X1ANa^@WC~c+fZO zlE6|f{3T8NCla&e9eL3}>0o6Vyf~}Zn)*aAJ|28f;~mO<9K2yA&MAL^XakEdMde!* z|6ZH5*})a}(WK_lFsp2j?%gEIMj}LZv&V5nb3da)8vbI?&u6^bs3xJW#iH-4 zkcYYg@|+y}n^|MQwiJ%!{az5|^DTqD>%l>&rp)cImtlpu`5I$dkE=`Uaa> zz5U%Qhx6G=aN5DrsJaL(ap4uHv8ay+|1HGm@OPs)7CsrKpGlu_0R{bFS9LSx?KlN% zzM;N|^{`S(z9(cFo5A!Sx+D(e1$9tPs~bqH0sys>uFk>QU_D2 zV@?wx3)q5GE~CD)^APc0@8}j)hY@9PoSvJDI67s@+`}|+N#Wnwa5d-J3>%Mas_P}MWyugnoH%aYglC1=WH|j4WJ}u z8xt4y29Q><%puWz`0wW%zh`Fs61I?HH)WzTNWV|o~->q zI(9MxSo@{Z*RLMm`^=UccliDK?BAB+SE~{oxak0om>^Q@v8tBsr8KIJzilwu+6Wwc z@u002_=5+oi23kRtWkK)PzZ9xPhUdHoU7Eg%RGRpt9zaajOOd-U5S?h5~cK43XH*# zUpydO@qN;#DcwfQyZJ#L{TJ-oBRcuVFiv?+zob8PtDhPJBjJtMd9Wv#2a9*Rc+74o zxmpJ6W3ns`tOgmQG)YWKw~j%w-ky`&MV%xL?oWzkWkgY^*?mWzOX>%TgUADBfgQEz zoYf(hgE%s-WfLOr8U16oX~3f-xo6~-ZyjR#i}2RYB7}~GH9Q=AvSUygpA-M+QRe56 z-#<;vVrdWgr>53|Dh2A!V8s8qV}L5&U?q9s7X_m)Xm{OH_p0TTg(T0pA~vJUhawDu zmpG&A914V&+L12enV$4KUR*y^r6ps1&_c4e$Y?cIUgmajS4U;8BTpYHGW{4I zO5B>^jsLW5Gq}awLPaQILjWL1BHS`Zsn}myP;6}pSktXLRmFYmcG)=6C#mrnqk3}k z^{*UZ=vT2NC=8i2@dLj|y^-iF8?}h(Yq2R#phZKZk1KWcbMiAytaZ(%(atfCE*ZiJNAAxo1{KvR^;kCQuhFSzZ=TT(CKZ zuL3dkI@Uv)*k;^0l8Z-z+9H_9jy{QE30ndM=+=`CCh9NzVaE`|Z@+0~hs;%@d0+aD&4f^Y(-qg{u0)5Rawx!G^@#{* zE4ayI;E`fgbJq<7HSiv6(ioJ)W{6Us=)fd8RiS_c8PoeiDNIEozkWDl^q5_ZPt7{i zvN8UMy_@Ovxr@gRQozNGKtT818@IctAd%AybtkkR$uN(-qrK1faLq%aPtXF^3Gp>( zBC{PPP$Fq~wQbJAMI)qS;kbSq|1s!sT;0P zmzlUYR>a9k==Ls(p0BTpB$Cr^4IhMYPq#L#OJG{0y&c-~3Hak|^AfVozqqC?w~#`; zjW;c+bB4ZaL_4L;7V1-t`x&v0M9_bd3FEvt;|RK8Y}S@CmR*-c!_xyf)ko%0oz}*B zuqyXg1$|!qQZ03#l1r<<l4(G#qTo~9-D|K1NRI`0jHcm{KiTQZN zk3%E+>&JtQ96_&aZj^CLJIBNJ50ldzS-(J|-0#+-M(gTB#^$FB6ygF)J{hKXeD#DG z!X3oyo-yZLQJh<_DI`;4V7sczFG?uy`Zf=<%z#=~KmXQnOqXZ;if;`n?< zx8U2tu)QPg;lEqu78O4T&>=30eOn*^RwOxInZdWUf1X}h49ZTy-DI7A&xlx<`f_2= zcggcHZVxNb_vSJ;GFhm&%kz}K*x7Iu&EQcg zO-9-IDXqUhc2FqHhdWY5NKtJ|ExNtF9=HvQU(RKXbK3(o*Hw*X7>u8470S*6XeHBp zG%(KJ3`v+w9HFig@lV(*w}DC|L_O00qsvdElY@u;x+5ip$1x@lg2PxvqRQ_@^Xm>; z3m4P3ek8&MndgFD5Tym0d|D48I+1uRpOjoWEPFGQ#2u1JdZ$K7vwloaKWVe-cX>rm z{6hPrSQi?4Rb~#PNLhL0mAI5xoq{wzVzCgsBV(M%AtNj+Q%)#hw(WIAXt|QfVk(7p zIZ^2i?S~ja|1jM&rECxIH2+KglE-c5iek4*(OZs0DlHO@&n^HwJmmWFdP!^dsV0n` z84DQtkD7gKRV}7#Pm$%)Otv;|HWD~As8cQdI$EJMVPyE2r7~-`AEme3y?NSzk)3%8 z3tOK>uy>cDorWCUA3h?p5tpMK0 zNoV?&mXJ+}V8z{$c%@cBJwdG%{=Dsa;OI{Hm#X#{bqNZkYYI^SA3t%cjG-*w%j>t7 z-4l^CXHCc@sF3y+hiq++I@;-5`GvU@z@1y{w?W}ngINE9dE;tyU_zL zg}eG4yprpKI7m`ESPB2_+{6DF56=PZ&I-28Dz;eWPfX z2uTpP9JRXMKI)@)NWZpicEGIMn)cs{&+bxuHxQ-H`PuGBT0iu5Y&#;I{j{)`kkJ)x z)E^q|@zRCnZT67VC1kjD=529qHIOk>S8MK=S;*?0xM!olzW$QsqsM<0|8ukNSG0$+ zvsN!cGimWrQxnxa`#V(KK+~ObdU3^3^f1sk4`0D^pfZt=-3AF?-wS6?B*l$o&pEvl z6P~>DfHI3~dW{4DfoG5YeTSpNUOs6jlMf5}5tKvxx(?9l=&@5qNej?25rq;1))V?4 zADc*EZvsT0SA*-Ft>-313gdX3kop>Je|jvghhqZ#dK$v0Z6Z-Lmgo|dhN`uE3rN;# zAc@?6{A{7Okd3u)p+yt>s>L%lxNwS@fRe9b4XjTq8(Dr|>;%IF9}Rx|`8E|iQ()+N ze#`fKwOQpb{t>>$vgb|1o#MJrPaP)?ZmnX-9Dy&J6|}vc=5c*T{#pJXXaBU@fZKop zoM6FVb1sso3ugECi<`%$C>HzmO>nNaoDP6bSA7VrxC%f(-WGR92)NiA*XcO7l^Kq+ zM5@!M33z5Y(Er3-lMr0$!-wK2SKa$sYGFJqZmP~hEN@JT8A35j{Y076iE>EVC#xpK z2S9iNpC#uN)p*JhMrU2>yih zRFRj&IaA23c-Ncev78YGy%Dnd+tF?`64Pj*qJ=-7HcRoh4C?okE*DixbvKW zi2Qe#|9rr&25amsQ|=DoRGboS{U3FFf02YIE&9CfDfD&;Il&;mkn3SG^5*>Sq5=$% zLG4}cDiv?s3|61i6Y04kyAI!Lgkbi^%bmSiU6rc^Jaz`Mw;i0u&ewnz?NhV{ z6K~tkV<5ViRck~} zE@jgh6dv!Na2&e@Me@4dgY{#BpxP7eR%4GqREA{ybv#4Ku<70^G(FONKTs*YN7Qy& z$K}Kkg|Efi*0Wk_F3K1&kC${>@j8eEA87V=V4t5B@-E7oi0H%OJPS64=1Fnq^CUgD ze{}diA=vwS#LZhjajq=LFrXy8b#-_Il9Q@>`O%rNF9s>_e!IA0JsiV~cR1fLYF+u> zQ(VA(qIBXodPnsHd`rmjS5J$UWbQxAsO3|1Llt<>#mAU&lxB)K+aXXxj4n zG>Gtck%1q*nws`-*^h{_dJcqSN7i!wrc`WVy{1~Fr@9+bY83SnfBo3LK=I2L`Af!0 z<)l)q;XymTv|gvvQ+0CaFv#Rht&Z?=fqD=UVmmh(caUC#It88E|#Ia5f61Ayy>$`bCU$PJPW5U6X}BSyW3-m z6IH;1Gwf|fQ@b60A#tNK`WO2{i;ywcWlnuIalNDRZxlWrQaK$-h?P4c;R(~}AYwf^ zyEkBSFVVxJUa#OlWRc*J`xjuV1+Wg>IQ72z$K>Fr$Kc}PvcW4%p{e5s!aPTit2TJ& zK0#Djl34x$QyFTZr)zs+aQou!=Pn)~w zbJU3B755bStqZ5nUku^N4B`APyhk;l`A`X(u1-aB6??y;S>Q0~8QTMw^WXSX}aUG*26BW7&$Yiwr_QPOV-&n>$pV-0Uw#X>=bm zA!D}WwNPz*E)h3Bq3hc!-FL1hv=#~xg1tHZbA$Yf9W;$N=LE3#h~DN*#pRXkm3cBJ z`mrbh>3oTyMp;8x9@yp&KhCe{MCVgFCyFm(kkPao^2c>U?o8BQ*u`}U3FYg|u8OZ6 z2$x4+nX7G0+MUoRX)A}8XO>9oWbHS4x9@|x-|jpKkE+jzQ)MHp2`LX{+BeKmKL1M& z#otNe%E_n|M7492qC^Ow2#?Y{$?38C7_D`}LfgInq9)g%$9jZT{kU!etOf zITzJ2B6pmognMUFZwVrQ!LU#0up-nN*CI#f< zO2BXx*%y}8g(+dH$YK0bCB?B#;##tOdw$CEd8K4mw_i#$Sr;XkFT&CSEq)?o>ON*r zRQSuGvibFMU;Y-Vkp-hNNa%S)%!Uv%#r_CIQWv*>wo850djJBglE-XfF7g^>)0>O> z`MNxBZ$T?6MTxS(O{|anFFNTbotXu7_6~US3w+e3v57@QRiE^^KtlGRG|&0yKI7w! zItPB`wYFeu`d=LM%jg>OJN6`Az{h2i%5PsDLfWia1o|t|5c7+pUDVal z#o#)+tF_I>rZ<5Sj+qvTfsv##$|c!JW*$n{O}JK-u`;^$dzXPc#@=mnr|yOZ9$4<2 z6Ezca$2$SC);9@nk?>c(hdtWd#!@4SSXLUhfy7B86X91&yq^qoFOgdXsHE8CH_@`u z!%OF!LI!zp(%2;Jok;cH`rH12JU$J*QskHta%7nR>e7d9{EBtYcexm<*<+T>59D+N zI!IC1S|Y~~)}t}=kFY`cc=z3&P&nJA_S!L55BmI?Fc3r1eSW&puscgBhfB?@sQu6z z^D+Wq(^@By37}t-ksyR&&}%9FsPa>Rp;btY?7fwh9qNLox8p4ZG#k(UUepr2OFp_; zK7Pjum|X`X@s}2r7ZU;)L{4nkz!Qhtz^cFP*h#`xgl9ap0$R~0AfXTmUR%$^xxcO+ zx8($gnp4>~u~$?jzxnz68tO!=@F$;!@(zzBp@&r$2I&F5p6)6RcUT09mqD?thsA+H zg=qlLX&k)-Tlk@ZCe-vK(+;))o?i7L;(4sv=+oyVO#IU_97i5PLFQe1Y-_*4-1t9? zhn-J8y5$F{Ph9MIg|8zRit!lIy4vVb|J;q0XFs(bq*Gb+`X&3ZAU^2ea%qBl^jzJ! z39`Hg4R0fb4ho49ciG#|_4|C>>8pg?ID`{I*uVwZ+MXh^L*ZmnNWOQ1mmjaAa|Xx7 zuBv2oRmcqT$97}#>QFOU0F*7QSiJE7Wap)g75W3~zj1opG(0z9dj_zYERdAgxKgL5 z2gz@=cjJy?LwCpTeB<%9$fO+8@?GmaQ7plC>yq}}N6+O4d9NaBXQ&z{>-kjdpx)-( zR{=FBoait6>nlt8>Jx48&o$V=NKi6>)IjNm-9K(=ky1?7zhBc2i!vvv{@&))`Iz%n z>#`TtsRi22u&4eY^;r@3%@gs0Sob`Sx-RG!?HL}ZP!Wt4{ajM+Z@w{d=`ikkrF_hD zExH(Bk_z>tzVSfU_dAdrw*+yrpJ;z-FKFU7JNq1-+Epsi-R=8ER)zn>DHLR~z@n?t zgCbXWUs7J}ojpGn%`d$|A@FP$lX32>hr~*MT+C7Z zbKvf^H{$277r&fMgJcZFh&{HV#-n?Z-WsaH*r{};&sgm1fPXHv>p$HGG;mi9DP_X~ zqW*=?1GT!_rHu{?jxCD(%$-E5CqP{O?&<%CevGhkU5Fb2=^yo(jaIN1=piLUdL)A@~$tx3_3x#hNMqMb@HIBbmJXK!Y(+lh!})J7PVIsSjO^zZO(dn=Rdtm zIcyZ$!)5W(xZj>${)M+TePaU%ze6KM9b3O&{LE z2@CzBZStnr`6ggutq4==;Eho3mGSNCWVl}UC4zEgY)JBr-nuf3a|Oev7M0a9X>%=` z*E`{*)2RL^@)92ZeeQxMUKiqc_^+N8M}BelJ8xfnJ>Hp7JAu^gU1SEn5It>a6#( z?+*P9`e^l6i{Sci$YgKVDuRn>+J3;gXj}Yqzrx0$$sgC)oh&@|j**|V&)rvK2B^-? za_UU{i!euEV!MhsFQF=1H4y;%+}*Osf>hIsX2EWzd}Fh@k6k;v^mdz-kFvL|Z5K(b zbwxpO=e!#V&r11~pe>wQ^?l-bj71Ur_&HjUP0=a0D^Cq{_}rp#VL8mtfEpQG*Ot~= ze>BQ;p;lA%@_3YIZ93pC1I=xAE9VQX{heIUEhBHC{wkM!P*eeOLJ_NOe_j2# zNwqgN*;8+{*hyL2QYi%;+U4cpx2h$L;x#0m6|4Md{TJukNg1E&$BZKgyqXB^)Uz&+ zT89I_HMT?!TIkNz!Ref8Hy>wV?BITRj70_c+_}Y*4^oPolT5Sfn{G;?Eip>~U`G89 z-o!_$#l#mxeD)m*&?+*8Rr8c?x&GhJ%MY4`HvG$wIhB`onWt|@6(l5(x%ojw6ldqq zSSpj*G)K={f5pqbjM3I?4%J0RqcVW$Ou-uVtO+@OtTi*ywDPHQs%|YPHR$7)_QseX z@*@LN(l!bOHNpB%!#NnbkH&1pEH9`J~>3A!3{jOrF#Oi0o@HDm5BHctsrE*Y%+A1~b zNya8Zrq`7N_x81yr^vZ{H~S0xd86 zX6GB$P(`*#?RhYQk0h@`U*YsTWcj{}tjU_uPxkgLT-BCd_WHcvcK35X zN~xC9wN_m7>6>h!*J%Mn^Tq$;9A6Q~tOjhXoAyds{<52izYlu(0x5hIgobDN{m}gg zweb1reS3^*VM}i=r9+#ya#r+mEqL101ofJ&sfxP0iW%t>Ya?Zl4&v_7y z;+%kHKD2SSehd2=_()crOj*{9k<3l!|yiD`l zpt+CiuCr3(`_&_UP*yweIn$ZpoqvnsvENvIg?CP+GmeSmRHQVPPi@8eNtZmu+Mjm0 zhFMm}J8;tWzSu%nGiB1MrfOWX$kCR!@qH0co``5R2u-!Nw&X92CE)44cJ+DXRbN52 zu;gYkc~de`M$+{nz;|zsWhenS+Tzbv7rmR1_A<9#V?>N&y><8+qcfq(lilFgx)g)KPVVBhU6c*xRX z#sW(R@$csxet@5}?;whz3#qB~{F|Dh6c+19&-S`sL7(0d;Kg@N4h1?0LKWezyS2jg z^Ql=r@6M-kMyG49uu&L;{=m+P1X4%!bp^Stwr7Pz_PX&<45wOHK1~K?Gdh#D+H?j3 z)|p&W)l=?@t~Y5bp+~IUjXhC>)Hn(E`H1HTh+$yxQ=V$GJBx0mXjgQvdwd-g+Fq{s zanZhnbag$uL1%e?VuZbJ#|A|xFX7QeQf3a6cwBIW6<80-7F3tseR#}H^K5d zHpz&;@GMnThNhN?{CT?qDUe|ECc?Va-O(0eysSEY3hLSyc^W1_c2A>&cLY@HB^qci zCq#2*B@`9+Eig|Q%GK?@&ou$~u;kp_u-q?>XH!eTrnc+Qh4lxdy=r6G*W}^72;Qf5 zzF$lf+QUA{_ENC6*77INs5RX8dCS@NoM4EcO04d^-7{NVG(;4d$x!ePZX#pu*?gX^ zH8xKFRz8kk+5g>-C4b)9v5S52=VRTFr3L7e^{!SgFL?B+zw6Ry<{o3zd}xEPfjo_Q zwAQ|U{ahsaH81)ZX@2{*CZYZNvu$(08yoO5O{n{hnTfjQ<`mwGsJ{7c968#$AwRx= zzMH=eF0~U{i+8q59%CpF7PL^#4p3_SxZQ zO5~t5BG#F4X%~oQzdewA1*fAFX0p1HU?O#HKCB;#H-lW^uq(K9-KD>(WKh<{+VMeQ zWVy##7w7Etfg;%C&A<=O4NjKS?!*A*4bqUpurCx!zEnq+=Iwo%eN)2Z966%;nQY?y z_!o1thTX77P2%@R*3J`gFDg24xCC_A5!t)P6!N06z~=IzD5`nGx2mar_9pD~r!{)# zit(WX%6f5D+eU|+5dtQ`s(o&`*&eO(0*`n1IizpCG~N zH(w-0uW9nS`;L2$wXAu4>|RCT-I8-=h4DzgkE%4XXU3~z{8t~zfqN&>Ddx;7o*pDF zqE0*4EqnKb>^>MaiB=Y*5x~agT?YXO+8$CZf53wgM|eM!W#Git4m&0$2Jab>HQiaj zA77#_45_fdkrtq11AMB$jgknAe$?Wfck|=e{}#>~)4;v>RtZBqvC#V~`EB^C)kK?Tt(7=b`2ilpvX!^^UR2MwBB)}{ro*e&0EcN;ROTs^$O-V{sYw7rzB)04-2fxO zSL(F(()n!cvnTq)JRP0j&+?N0#i&G-AK_))$fgfuN{bhN@F-6R@O%kE#o->ZA=}(L zLLnq1?8C3FW^-t43HuvD|5K0*BfNjpLEwLXKufQ|1njl85ZfzIzO3GKl?(7yZ`rQ|3lVm!^5__zM+nM1X_M+DWb2h@4>-A58Edap$WY{dCm6# z_y2hHfBpJ|XpU%?hd3;5BK9i%#6WH`%YS+sBb<=^|1^OAPdwCm6NLJo`uW}C66U{| zgLe_x-N_L34oW`WFgX)A8X7_BL}Wz}9fz4eE^)uqmn%fi|J0aFy{pTkcb14CPCO!8 zfSlV*5qxv_gF|GNJTBD^DLOaoAd1WjqqKjA-4hw5%cG+|KO+?MYGK1-ZKKwKQg zP0Vxch6$n<1dm$e3ycCki&RJfvLcV){|`Z2d0mn}gJ^Ehl|oP>mB2lHUV=`Kxis#@ zj4m!{Ko(+X@O#|;|7>6XrJgt@1HF!frz>>3!C^xNE_}961o45zYd$7-H$@iFs5h|# zG=4F?(S-l2f&5Q4TXr=ELLGGyx@Vjs3^sRl|&2~ACmfE0N)IEC~i{z@_$uQ zn}@jn2+&2u5|n~kT5EYt@X1aAG-tir>MVdT?^W`iTF!~^f7g%Vx*uBFJ$wJinz`ev z57YPW-;AH?zg{%YhSq64#dH2gGkdp`HjhmeJ;bAWK1#neZ5HiTtZRDZzTf$jt*x1o zva)#q(%%2pVKDX^9*(v`)34P%W^`kZ%B@!0Tv6|tnH}%#1nccfsW|tbA zQ1JD;s@dC7>Ug))pxPM9J7wl`~Iw_4K#gG%tvQ*8szxjTPoE2;=TI_^Xusx=Db_Y z_F%U_+r?&A+EiuqplC(Ru#zYMb~MoHH>RGR9`6l$j3G;E%sbh^f2;Ee(dhR{CNj1{ zqmlGIs30RPhzhKO!(kO2dT){!DrXRFI~}^oFKiWdg15vaDLf9Lx{>DKd_g48vOIOq z5v_y7hWPDYBkn&*qSYm?%jL{Xhfnj*{cKB(#J-Vvj>B+4SE71dIoFcDH@D%~S|>t) ztWKo&$ocP_9~=<(rLPeGPhR-{u3XTwhsP~=w~vu{1pk^hXHs-mTOG+4Y79!>)}_{W zT?W2!1WofRNjM8+`=c4*rpwsND(iO{Y9{Lre+iM!HA?rZ014q@qv`c=*sl<;w)zF1 zETC_?qnssg_-ygSxbg(mIT2>~!;}ni?3W1()*C6$mINe*x3 zTcKO1LpLFf?UN#$5V82cKIVjbD3MVH?Fk`;_-0jBR9&wNKjtBrpK5TEbQuMghUj5j zW~&YjNXGP15wrpls9VLoBk;e5K_GdPNhEdT6vE`kH_p2?wYx(ec>LO}CmtBd8AAqx z)o}T{5DtGYWrVL$qpwuiJF*B$KLElc z`Omyd=!d#RC{f)-_C}@1x7U+c&ks;FG~?i%d7V)nj z+U*q4g)bX6rdOvZw67Q{-C16;#((9zYxEls2#=Q?eV)_p7YHjMumqbIDMo50w14is z6+h^fL7>l~bkt8C@@G%ex>Feg4;t#n@&^1c`^;S_@gqfIr{@f4Ml{sqf+H@~D&+bN; zLB`d%P;`^|ed_!^>(EYy(-?{t?z~_rBN$0xz0A^BVEL}|ggG^KztnF`VZGotkGzb- z80>$P4Syym$x7#*5?~)wS30J}*o?qc)E3q)-F$>oniLF3U*0?}x zOvN>~d}p1Q(2Gw@EN)_Rbs37_1{WS!9mVp4@?!PAtFsp(CF)h zk8hKZI9Ord$V3WEjhvt4fs!qCe`pKyNUnM>^B{`XCF8=jJV3i0KVKmJ6?&%h!(DwE zmkbd5^a|@L!@?IvMeL|f+!(7K88TQl4SrIUO|uj{WH`n6lUD$QN>BR4ysm>VdHrH@nlZ;hav5rxgbbRvgC+Eux*;0l``AvIZ0afb$?6$*V3#g7c2Lw16DP&Ax_(d8I3=G zxYF##1W4GJp}`VjdO!yae?G%VseA!STsQrxL;nH>0pFl-QaXpz&I_+EZ#*F$(<;@@ zEN2gXxD7UyaZbOb8AV8^o*y1{v~saj$BK0~1Dm>Qbo4v)b9*hryz%8Xx@M_H5M-jydmj5u;eFuXmHjI(>uX zdv$vTTpG7%qJ{iH6GT1|=2~$gNDB7=@xCob2TojHQMZg6u+(p@cw_L5-vazco19+c z?GoGGuA&Ogb%{4o4}Oyp?vGlHPgpp{{hM}!xv|Y|+4iW%?*3yCN30bM=^n{P=!@OR zNzCAvF(i7!8W=$s0Cw9s~?JvBA zpP}{l^6QSk4MLy3@CU^%rOUn)Enu(W^_KkNR%QBf7~40A<#8)D^>u0KY4V+uwFn}9 zZl|f)3NY=-DRu^pk2&qu^PGelq&t2kLzd%T|3^Bn-)iOLGUPx-%uyx>CcYdtG1Vnu zwN+->pKb&g6BnTo*+%11g~;$z)tuH20_`yP`0kD^9dIp^IbuE$tnej+-J=l-2L(}R zw*~YJ32?xMJwtgDtjd_f0!v$aB=X}Aia)){7El!&YmO+KzS#tc!h@;*LE1T#NBY+< zri?M_ux(cRYAtTb1c(#4teZ_k2_C--c#ZeWH)yJ8{frzbXTmcf2QLrD)h5(_ycSBC z2qE(q78a)v_T?Wq(}K@a#dRyMC+!=gRZCd=nRQ}-q!Zwro*I$N9Lm7TDC1c7+0^|y zfe47|+yGosM04H1X~IEdPwZMvIUdWI{jo@7_ib?J*forp3-!%1=xm*pc{-sOZa2l< z!D&v)BQt5cD7_Xwr|t^0GbihC>W0iz!JO!Bg*x~>k2q=F;&pIe^4^*{FoOpRwS|sG z^qugG$ucH6dE>G7H2svS$Xh*5eXmD|%4Y)OcN#%aS*@Jpodh01O3}s+li~$mxLhq} z6kK(nlaCfq7{vEOQ!Q^C;F5Wmwy4da= zKL}Ab0px{KMn>je=gs7F1E^i?*i<8i}idU@MBxwCeXkD(NsvB~(rTYo69sK** z(fY2upgHC%<@u8_%2Izww3#5u*Hoe|&k*tsw@u>;J_&hgRle4gHsxiq|82McXFU`X zzRzKs{@tK{t5Ni~$EFJb7k`+)TK6ZD8dsAuB!kS56H?l;^76sk!QORk zx<#w;^B3oQ!Au`#v$R)zdvC74rnU73QB`SnRQFpS$DBEX4s^y%@gAbkV6d9*(CSgH z9Sy~?bWLbbjRhdEHu}7e_0S`oo|A-qwSl~@u#uS+lOMxoY01cbi=CwW4u1RcF)b;- z0QXN@r0;;>ar~Wlyh~YlnMo@oq^eJp z#MdD$g-fI+IR6g-y+A_0c#L0x?AjKbooNmoqu(3n{~cg9(g)+09!EyuO&nVh2~U{_ z#^0ljWG`^IO~T4!xu`BL6vk?ia;%cyo4zLwlN>EzN@Mlg#Gw)zw{sDnaTEDhPhzR3 z@rdgR`tIn7Ifrsc-&y?Dhj(4o$lD$Dr|P>Y$uaX_5z2~g3&(HWBD-;DmOL&Li>0u# zTZ+?Fr6{~nh&wlPkvQplK9)-YGua%hPrHHqoMgm$n*0qH3d~?`xe%vIOVC``h{opg zSYk-yN^9G{9uor{I7h9(flG>5UdW@7k3F8{(M&Y_eu{4-G&aUAz>efRRNb#a>8&f+ zId1}_Iyw+(B*EFs4*D{Ccum`cvzKq9`hGR;Tt0#Mey%XpHB`?Ve+7csIGM8kpMA_{e>|UTvcGmAE!b?o@oSrEHqi0~o zlyKOvg$k8+0?J%e#7Z2=DL^T+sa2K8JG~wA0+=27y)VkC=8X+tZWn|l>leUfl)SN^ zGg4c)$811y)-6G23a=z%@mP15lK;c{LA^c2h?d@nTyY3F1@hc${+VqEk($9+>r0A8 z&~uuAB|FkkQZCn-jGas2NY^$R(U#&A71?DrL0B5U0InlsC;!dB0l`xfalW(&MR&C1 zUW?07kh~6){VhJaHuEKzna#!VJ9p4n(}b3;OspV1`@OmNKMFQh9VRTn-V3EDXZ?P+ z6h-MN*cRzLa;!3)A-x>qHwOvFuL{q!?9MgpUm68-(sv^b9T-D8V`yd#*U9T}BC|ly znWCJth#lvpp);nW>*iRTT8VoXwj$DP%y%*uvhnHy|Cl{UzI6*JiSrO-Nxtbv#+`%} z$Qc;H#N@BYe~4jhC_&J?UATU)6nmni-;vKuy2EnS-z+D>bVh~+rzjq~v>P#AV_^7~ z^!fMBx6Vbem%yZ$d%O^LuOwlb_ZUS^Q(Idl^0jBX(D~SrR)o^>3f!$IL&?Q-?3(Nj zJuOAWrp%}DnvVFx*}__HSC>}j4qME*6ik;T{2v2J1j#5#H-e2A~%4=-L|l^|nmoH29XbyVNJ zfGsPgVfu_kh})Qniu*6obMr73jw54asQA9b1o}Eoh*)(N)qVB2eku_Qr!GT6N);+< zZXj{IH*8cAJf?=^#7)_W>xCsqOq9Yd%gr+z2!K$E*5jA#p6&x4<3}C!W@|tW?!2u7n5TlbA(6K4xBuG z5@$~5qwanwZlXxiyJqu;%er3oIjt2v@|6dxNvbBR(M#!Twxf*Ci-xVJ&*epw{URdT+CrQvtSPy zloxnie+NhBQ}FVYIwM~!jK!h6VwC2lA|+K_mW!7TA#ti7T-kP!tnW!@bai~O0$_zrDi4+m~_nT&hCu^GHd~LP<*_ZtPx;5SfX* zGMOfML+80zm#`m)52qnNw*rsbvarP01=7!0fd1=>7v$r^e9|UlQ^0cJ@Oms+KmpqH zbvT;Qju&msxSkjWa~VBPrCg-LVqbbL2M^J`W}*1@J+wbOj&S;1^FGC~9qq@OyD;fT*{!hby~#O7Jv!fqY%&uLQA)q&UilPJF5 zh-=3-VA=dxm^ouQ*6&M4V_O6AcT9k#jP7x?J|+A4rx!0!|CyLO!!KkZPLy`zLr)3z zZHmQ=S+g-~#x$%yT!8kzE;Kz%#u9s5$i7nNzfb61Or~PbzM15l{QgP)OJFvDB}s$h zGf?}yA1zl7Vp*6S=?7cnHi4yE5F&Qpz_WM#s64p=GXgCjV}YNRYkdrfR0ijeNKA>2 z#;nB~kXQR0wa2IP;sqt2RlGoYVrmV)Ni)cgnSw;u5g&bRjOTorut|0J!?h!=BTX zcskgOYlmVnW%?}nHOY3wZrY2h^@I4SzXFFA1VW-mPOPaRbfjTeb-Dzt9XF7cxDxZH zPQltep%X#@!#Lx$1XoT7<{w0H;iGR z$VW@@IymW%Vyo!BO=T9a@tcjU z`|hCUw-+e6yo+R+ilwVI;q3K?sK0*~XX7Tr*<6==cP-cWtD$=^v$Tds_(a4+MPbo~ zBe+}FhN}tVzl-7pwx}qRc_VVxe5}o`#jB1K%u;T(Og@&_E&vPnT|?oy*)Z2J`fe8i zz8%a)x?#c5dwBi-{lCzZyaeMcM=Qqui(#>cl>av#X8Jpx`)lcoYWfp`qNLSJT(j99`twNb5;xxfElaO@!+RQoLD;yso{&eIzhE~q3s@el5XTlcKu4sUlUb3M47M&SkkQ_O*1PAhX6jsuJJOL`+k))f zbKt3?H(Zb)VT(Qv2w8L-<-JX~ld={b9>qd{dFBho1URIbrr_BNuV!Wf3#fGdLb9p|2uP0a@l3Dc8o<@ zTL;?jok!f%Iasza6*)CDzwVm{FV%h*iy*QJLe#>&IC1O@E~FQtqv;louZ@ANzUI89 z$VJUNfx?akgUhZ-S?$?9}H5k^n5&UxC4Y4WhmO!nPQi$T(avYu;0teC=Wxp_4Bw@RdUyzJdksgp3YAbO0v!Q#? zbHJpyY;^zM{~z?;*o|qnx*v&$*^V%wSi5c>{QMpMk^%;?i6O+UQDo1rB5PkXq~C?l z%<^v*aI~j5YTM**mJ<FEj*IuZar?{)1gOrd#)gnM`D59!Tez2h78{q5PcVH6;;6sL1akb7nuVi!)s^l7WHFS!;^TDwqsU>cll#t1v{DCPMQ#1a`S$8Eu} zV@Gl9_!ZnMt-!-OyWy*CU3(1MMV!UviO7G{h6nja5j%B0*6h88TXpwwdSxV>g(5G_ z?|m76Z1Dm)6DDSM@LO;cB@LxGGQ|;QCi>8)8#Xbu!K4)jQTgmW?x(Lsm<8Kwi=nSaH)^#6C+>Bkuk;Wm``E&O{hldJ;X4{c#+{@=+N=Dwr4^!7{!lAt>AM?7Tt+tLBCm(lQ{2l;EK z!kxX9u5SVh_dO^Y>_gX?rLeRxBc)gU-eJ`zDa+yfO^O%v;I;7t4zHMm5O+J+**n0&L5U+A z9W7x+&qr85Az8%Ut8ulX4LNH<;ABBM!;S(mvVhyzsYq}94gK|LSnTq3Z;_aizS_l* zQQDq>Wr6g&cABzS!$w9%Pq?;RXZ#mmK<&FnxVdpAyu`*Z&=W!CvJ?>|YNA6ZcSnAV+VF+E1>4;Cc zhKt8y;p%7)d!ZjmW?OSe#&5*lbL7}fcEcF9l^y#Hwtbp^B-SKuN7C*KD1Pwvom90Ve5^ZH~R3p?;iF{Vmp*5?t}VsOvGI5 zOG?82{duVQ^#k74A4Vw2t$Cly;)UslGmtdVN{bHI!QMs+bFz;k`ba4DazMn!Ow|AK zU--W|bFgl@*KqLyO@capi;+=t4>uE6BFvU1Fp+$l_A%zR@Y`L0-kwqBZCEH&O>5j4I zF5JJdj+~u8w|GH-=3t$Wjkwm*iDGifJ%n9%;Y zXcGGK6ougtn$K>{~MtHf$?4eLWbP*<*V0Lp+FH)I30w%^FDqV$xapY54P`vTa)RXTR@+b6N z5>S!9366Fa!a|(Zc7GJ?tvwxIEI(C=j>c3h7-vEM)`i%@5>DP5aEao@XDw$i*T)`X zzB(a8Hr{aovRhkmaMH)NS7ixIEBHnwMDphnEJy zOeGonT|v*!gnS6L1*d(;Tx8wtKrFem0+dhx6hTE<}_2LCK7aLn6VESI<-OERu zpAHPZ+qcud70gDO!NGGZB4VNu;^hdduU(}2GZ2nH@WlLmC1`8EgjEsD|Ivl1xdj}& z)*$U}7kWF>u`I|*h;OxC;|q|O*}yMiGA2(7gQwLfa|g?du&v_tbYK%O1?S6qaC_IE zztafYCfCRz5#?_NP_ffP<%n34TOxzqxP7==xDn>Yx+9N|{mzg`Y~VXV-tS(c_4{`Z z`KqQ;*lfCq!KdG8@dCxPre3RXwY?3waiMUwU@;4ePt4&ub_&uOenWpl29~(W^Jv10 zG`6l-fB7kTpXOn+yEV;M?6|M7n6s@IPhOSd(~9TS$(R*j2R-Ajm{$eaS0bBa&x;FFmpw2B=SlXLjTf-gRbKoe$Zq3; zwOLQl*Lw|H1ljdT_5jS@T12u}AbGBjTz2+`qSObolX6gAl!o==EQRgdS?*PA=7_}y z3((pB6ju`{4wo8I3@6V;?fb)WQO1y2J0UKUWbeCN+{2mqzC-=a za^50GPfT2~0f+XT!R33Mc>8M|QYikj)+}D27*oe*0n+Yw;9>fDOmbJqu0ICmc0Sls z@Dx3z2N3081Zx+@976v;&SJ=f=o_qC~cNWzHPjF}ZeE6|~JhHt~r$k)q>&4>> zad5IVhp9q#F(a=*_OcKj1;W%TtAp6Pl z<>>w&FVT2;E!?!^>-AluvEuYKTs^%CZcggCSF_Ny*mn95R!{f97>d)rolT=>ZEOlj z+%*jLU->?Z7ic^gyDdd#OB=3loCtR-5%oFES4QR(pGD%#!(Z^aEgLJnAd`t4^8Tw=E)k<96Hw}K)2H!$15pfY z5r+7Sr6|kVgSkEuVJ9SgeOB=7j`#~rc>bahrxy6pI48g2YwVAi6qYedaOl8c96fml zt^fTE9^XlX_lR|Eme)6cwZ{Y`74@N~HU+T`GMXpJcau!Qx^oZE*O`M&6J6!^s`1?~ z;g2m|U~ik)cp~C(1^QbqVW|yEmdh7o#3Gs?JSJgt!E+4UPs6G}cBU37kJKNrC-34} z*G+7j>OvEVh$dfC80Z*d>h1#cysO8t8Nsk&okkB-Co&25pLO8UQg7IeA!kW=Fk<0o z2=mps=za4Zx7ORkLP|~oDUf986});=hrRx)lZXjSq!t)^s1`rGY)A5ReHa)kKl?Jo zGPZS|Eo?2U5S@4t4UcPZVu_aG1yduM5T@c(WiOsr?88K73kvR8AIi5cS$nMy?*{U) z#MqnF`QYd`LvA6dM>9Dk>&n{chE8wGo2!bzWurJ`?Gm9J>> zPTX$qK*81+cuMHIUpx6)lXK?i2qzbB?6~^|uSP3gV5rFM7qtXgE&X_y_HBw6L=^l- zAI`<`rQ_i)GZN0PG&NO4C5R;*HeGZH{cjtvf2>l!7}QQ8h2Q=M_~CUo&doA_;aBL4 zv4KAP7H+`4{d+Left|^vDGQXLzqT8hp4 z_hY4>350X;1$m93uVaRYU5AjgaS4LV$fyrphx*mR9JUVjupx(Wae5jGE zU<--i+fmfriTw2;a2cZ<17v4td`OmFMAyKNDBbD_J9D}ZrEFGmeRp*9z}C_M4AhNY zykPC>h4mMUu-#97{^JN8P}RvHovgf4uKHCOJN3sOjk6+==HgDLg%C5>^RlL9)R$V77JAWT9Ytk?+$Z=?%Vb!TR zz6mIK^bVaFGvQ1@#5a@eFUG`B4{n=E@ci03NdJoB1*Y%g6L6hXZ0?!{A9JJO!YrD% zb!VJF)AKH5FZF?)bQGQWOxSj~*6u+#TEdGL)cEY;1tn~8AQ%T8zQUW9Q-~x#MDug8 znH6j%9mT2rak$<477Z8X!A3{%_6I!&6Bl0utlEk#zJ@TM`!X_c!KCGv(fF(shvzyB zC#)FE!PYm0MfheM-m(yjd~~4Wwg9IqUgFu!4Ty9X(VU@3;+W7}Vjhdkj;E+OF$Zom zR!y|{G=Ev~0^7O9V?L7ab)xzF8id%A?20!t1RFUf0>{cPV{51{Y)HmW%~Su8umrBu z3X_s5(2>3Xy5A~b{4=3@FecwtPwx*{jFpi7ij1JIOL5I;J}u`jMcCqT)pb0*u@%m? z<}`18WnA^ukX_Lki`8eU(OGjEOG2&4MzZ;nY^km(td=ID=4n4#&n<iOAeNyz3BqhMp_A5x68+>F)ZdEMtM&^x-P6ikhA1> zZ^_F1GnNa`B^~)xY->t==s0dBGVcC0#S2VUiRomV?RtafnTv+wd*)-xY+$qe0(dCzih;b80W7qY?DY}W@7~hJA3$y zpM~>H18BdmC%r93f-5OqwT*++uOP=Pe%PE{6-teG0$L#)Av? zRsV!H-KQ~GkH&>kCKcJe!)73*aRAL%M;0%zIKyhfT&zEM4C}|5s^wk{*iqG6_F-S* zDukJdRBZD%g2t+4{PjP%c!8be&g_hqV|_?ZjL6OyD}7}X8iRAv@bpa!j!!Uyg#1}~ zTheW^L9W}&@&3(oWG*xjz9W{H!+zo(Jbd{QRmUblLOLMmJNYM${MXN(ZO`WzbG^x)FEXgJWn<L=MaWiE_79@|>{OWR$?XhV^R;!Kg!GP|&{MhtK{VeQ zvzOQ%f-yh!0iIMQW47h+x;fin!6;xZ4p$7~dC>vP^(KEoUmrRFtC0S%9d{4Sfxj8~ z4MNd{d|ox3c@)*XKcVJGB)n|cT&8j#Ux37#<|YRRxci0U$iugIQlzDLfu4<##0g<* zE}-*yGcw}?VXW}ojOd=n&QC(s>ptAvGY2m0URA&Qh5Yfw3wGX!Jl%@_=lc%iv&4eF zLeXfF(RGc$ic8&iSC@%(;W`w+>q8c@9A~OO;6>>H%nvYtzG6X`RWX{x?8L3kH>f)? z3uA2!Au`Z~&h+D`>-z!!D%*oVSF7P|G1&FzrQ*rUpHa3$rFdceZT#}%TRcr$NDjAh z5+Q{%w}De)F@AhWPUxbqFJ54<#YjV49gJOZ8V@>ZadPR%;ssMfUDz!+g9p98q3LuK zJnd*=RwxxK>@Z)QgWkbc$Xjj)3p1tT^A*rN8XFnFJ}?HU4`1Rznr86=DV4qy<5wo5 zuI)aK#|A;|taX;WcUg$!yHD`AAQ4es(yyPqNEYT~iOES@cjFVq3k-$qcK(xb?!hb6 zq<^}2ft|l*#PmW(4~FavGA$FgNKX&5lT)!ZA{0(+0@CP$YYDS(iNBScwhiGRy)C(Eh=h!|6{P?1(|~vR_1l1_rU>#>*$gZ zQhv@BsvI$4-bLK)zJr|;b)ah~hSbI$PR>rSWz}4Y>zImkU>>mvsTn7*eu^u}tdXQr z=l~lZQ;s}DU)SHEc!BgOdLPPqe!%~zK7t4z+u`a{`o7MLlW2SXE2@&bU}wn!7sdA! z_sX2+)wv%pUa)cZz^2S>ETv%dv(MsYi*Bxyu_HMRXVxvk?46g<(R>S=Rf-o_KZN%j)B*qW)!ChTHE zfj*5r0U=?kYPV?ovTM-9&)(2rV^=tDP}yFG<^T$ow2fKjv>F@fL3gOFt}wpU&Y5Iw z4B1-+Y_W{VL1UZEO%hgEr?2=f``&Oegq?fIuID^?C9ZY8#M`_TBpb73^4~EKDXy&s z-G{Le3{=|bva^-xw}xyL(?byje@a<&^@Mv97Tnn4E{#Rudu&@xb`QU&c!2^YA;F@M zMc(hD2N|C%ULd=~7AIJBJ3FhK6`Gl-_Pwrwpc7hc2R#GPP+zmQ?7mf#PlO;ZU7z)h zF7@Hi{K9OWvQOFfw9k2ex8eoci3e~X&KY6JE%^8Ihd4dYUcOZ;JqLO5LgHr?FR;ZI zW70b#Gg~;>*}&RV2j0uhp!!uWuCJdAPx8NpZ8Y1S(-&I`y70Oq6|+3;weDc>*Ay?9 zl0RU9h^^UZeNl%q;}Qk`O`Bn6#91fUL}gfIK{KHwn6CBKsdWt(VYL0 z>zlIYKYZ=a)|nxDB-feIl2V^Uo6a!%BIpdw%ZlI7qp>n#zW*$JSI(`HwelAU}Pr4Mc!Iv<%$efX(x6U^D$M2fcZ?U|%(<%i&iowux2nGDu_UbG_ci&F;sv?vs=k|s>}pUS zk!dfyD$NRm&@MzUwAobN0w5f~E) z4-dPK+hD&UTk&p9yo4a*UFmGXFuF9(*wxc1G7&28U6K7uehMMs%O5&s|4&>rX{? zHh+>GRo5Bv8A)eUeFBD{OZ5BfZTO zN4tR^e|(SU7nj0}?AMTdQcKuuyp11T_u=9)Lweq1Yi!*x`&=j9_cb7Sjv;gvv9FlL z74GA)I`0VvYA#}xAA1f4kdB>?BjxY#s_GQYo%GC=?TvI{GI2AmwhW>rbt%H^Kk_!^ zXi)!|thtU4KYYN8tYvC16o{o3u#Ufl9|m3^E7nMm-OR=nGtYM7U0)MU&sC9~bl=1+ zjAER}7^uy{8j@X~?4_>vOeEfZj{m#22z%!G3@^qoza?k|&fkB7r`OgY%9DH@W=DT_ zE^3tG1=3$LYZuHo-GTSdTX1%s(U9!S9-Fv@V)@m_7_7@ioIlB~lJ699-lSu`3-+PB ztp(}pHH#Nm&d&-9lJDVpeHP|YOlzzf)3SVhKqAVXyhhWhsc^FT9WSHMy&8**VC@-# z6IFv~zB00Sfz6##|CvZCeuLK!Q?WW!U1y9Zti#2I0kmIOg$PHQduU#xHiOyfYj`&> zfZR1Ea@%cbkLVLEc=xgkX^V`Zr_^bt?@j?&kkyU1E&13umh24q6J|bBvGeu-2J17i ze!Paxgsnnq?Q3*hjz^S}F5S2CTJ(&i3z1S$hEwap;lhrE`;=~L#)yi!OpoR=c^jHb zDdyEP6l2`%BqU7}4gH>&WY^U(gstlYtl7E@ZmPaBJx@cWFGl_078!uCW1ZB;B17R{ zvUX-35ja@fiXUr|F~LJNB$J+@ihWTTVFuD};8YDsh7@ z473!nv$3L@htgs33CkS~wIO-w*~oLR>@(J%>bX}#(wmXFE4p`P3xstzMOz`x`bh5e zBeDe!&++>1Q7k08WI*?#6Sf`~>)zmhH)mi` zxbtv~%JRq)ccHxdXEdLk1RwjaFJ55tj){peWVTM&Rq_r`i$@kOFnew07LN5fFYva# z06U^cUL(b4M5>Ng#G%e&E*yB(8^X;6^U>oq$O1yBBsmdp)^vS-_bDXt|fqA$kTdwuA=oq$Q+ zW-ua0Q6#g+^esDZbj>)ps=R$`N)OF#Qz4#zxQ_$AHjt4l!gcJuu$&!TFwbdtQlp0= zv9!VDGffzHnuAqRQfh4q`vr*TUV>Mh!NX4N#S851|A<|8(E0WqZfzU~7Yh}GN|TR4 z@E+WM{tnH_&MePkl~JlJ{X@i#xCc!6NDI|Rlc<>6-(FVKXqZxM>v19@nyyM!&%17WVk zfn$9?>(nW12o8pgU^JCRjSS_8BtK2AWL%ad?Z=@7&T4-jV{VCv6Ac)Ao{u=TgM;e# zm;p0$g#Y{#sB9`l)}EQL)m7I42CMoXyL1UQ$H!xwV1S2Z(IX?Rnz&_hkKcA3ZErrH zaO-$@kj@MlR+iWd+<|+~-l6qeGzBiCGhd>^GzLt~oiJ`=A>MsxMe({ISdbk0%)z5c zPS1KQ<{rI;hP(v$n;OUyqU<|ri#cr91urbwmw~jz6$lwaj^rpZu<{7;PQbu_43>GLl{WHxzt##S3KTS>O_}AN9|FL*ub=6zo#JD`jIg%Y6#s zPu)awYa80yTG3Q+66>eBE8Yg8wq};Fi`a*>^b{m#oyGQOG0Z0&M_zRgx;vZE{2(32 zSC562jy{Z4oHGf#_82dOt+|Af`fhY}b)mbq7}@(4z{km4z7WEkGUrgt-gW>dQqJM( zm0Z-99K+IJXNYvH5uR`!_ZnK!)?AE?y^*lAGNZuF2)>(gQQO#x$1etjVyU+;pP;>+ z$=`<7mPVXeKzgt0c+m4Qp?fh4U5>+-E6~~1iH_!4+|AgE89}zfTbC^PZDQq$fW-+o zl9r0Bi~@I(0g!^pUD8Rt&KVP>!kf>&QbS;HfAch#Y;ct6%o zaE2MHm{)yH%*nI%$JEU!D0|REeM8Tx@+yw4nE(qZ^*6JtY{8yDOGdH;wz3(33 z{5&tA;7!w({58c3BAT-T5O@9oy6ethafmHMnuRK4|7DI&u$ReTruuiLV=hrxee@a{ znn~Z=+tGUG3^vasT~X@0L<;lq%dqP_*_kUBkTjM2m*5pRa^)U+x;oHYQ-L$_b74!* zKy7i9Y>0uGHQZ)y!-d-q(cMG(TUU;2hn8ZjtA%_ah1nU0v83ZkIG&n`yEjfiX zksdJCu|Uwe(q+** zu?Tjv99{(a5?C_FeKj&GYS2($g9kND=(u+nQFfMOcZ@MMu>j2tb$D3UM7Adti|9M- zjTni{3Q-5|qO-jerKKHYbE{E)Y{t<1IP!N$AI7-Af6;l|sU^8PJJ8Yo5VvlV{v;)0 zd4!)(0L9v}K;Cvr0xp!^L(TmYNviD znTk@db&jtPcnj@lzLkb8!H(2(q%&DKIGyb8*kw3y`L6IBnrkbOvUvgNjQ*D|s8e4V z*#{ze!(KsWvM*mjUCC+0M|+db$Pl>d1n$(dptJ2RE+3r+CkN@U56X%q9V4*(An93C zE6q(LdvOX9=lTvO>eyNT<8~tD+-aP;dI^VSkR2Ge50@&s(Am*~mfCEjC5#tjSDjad z=PP!E*ZdR|)O6Dv+=Z@&3fwrh5+NRPosp1UiR=R~Ierh0k?faA_F9sCLyQkhbfgGa zc?`D&*(;EJY&x7BrNYrK?km$!PJe&${53w%y!!stGkT`f_oVmj9bLGv!V*#~{m9xXc>#|Ems1C;G#dbZE$ivU84Imm{sD3iWq( zA>7J>=Jt{Ek-Y5~$SggORP`Dq8{MFt8$;Q!H6gQA>xHq#*7=JBw_mPpf z1P&yFw*LRT;squ<&8gB5%-nHaI|7Y`6}%ttWd-j;af9swSn}O z`C&|FN=uNkU@XNwT4HjVYefF@kW$<(=vQmgePkb*j|p3D;-zNs0%1&c#64meE|k|I zd5)#vuc=*+*&?fOtT=idja|*Ct0h0C?kaZ79S51NE^KG+LUwTjnw!YRKfR5li2<+^ z$>&`O`TaWf;aIfyGTEgT((_KVm!@Oa!T=i2%EdRbkHHI&c=jyLojZqu>v_0$Wg~p) z8Jdn6hgDf*Z^##ZP<|d;7dt~wS>(eKlVV%A%}B{mKT^CPj8!+po~=ON zzngGo<~Z1sZzL9U#u}lUQ;}WIbcWgYcC?q3A#Kq(l6j=ggzPG!xwHf&CG9jH)S*6g z!KibGl8+ZJ(6iC=#I*Hkxcj67O*Qps=_$pzxM(=(njd z=}l8Liq5RZBz7F2B32REP;9ko2ab`ybSaB;w}w%=XW%shr*F3?V#9h|J24OA*5zYBt$2ZA0@5Wjn<&KP zRHK^wO=g!mnwn63?l6}4%WaN?>5RS`qF0?m`IAn$&UBUG{Kn~U(UoD+#&alaY$u&* zAf0JI*4l8`Ph5?(JJopH_a0S8Cc#fgic=pLxFhc3UDPymp}!*?vz%-cJIBiNXiHfh zZJ~>be@~yuEHL4C0|sAQ$65=v2xkIICok;0`wL!o-bRAI?r>bi-hQ_9!}O#IynI}O zLvyJAb#&k!6NjAcf1@LBC#E~8v^Oz?j?)|*Eqa3IWqUCrz>IwJQJ(XtknFbZB>Mpk z*$IjX#viN4o0m7S-je(iCcC2tc9j2ufv!8)8lVyr3bOlR>fXC}`J@a-=926bCmBmD z;5TC-_U?+stN7q%KStwYOOLC<@}Lcl=k8UmWQ%% zaKpB;pE1x~gv3Bi*?kbby9_U%-o=r5a=ll6m%$d3{TJ=W-F9uo3oOnG$JT4jc;B3g zDM60H!q?FES?<61aI-fjo1&O+z5-M7b8WrDaI#u^@q)3T9$cehak=xq zq5EbMW;v^DL(g=^aVGW`^q~LVAo_@cQi&oS$W-?q5pGU_R{}y577(*$yuuzc=(5A;|6-g5y=A6fZES zZ-io$p}(FJ^OKFi3eoT;X)(!vQE%}hj=qsh|M-Ehs=uY?6JABTlePTqOKLR@J3Z+KjI1oK?fbw<}=Dt6{|qW}I$EDn*852Vy@wljk< z=A5oVRr*GRxtR^kTUudpmdhF(z1DyhA%978R8s*?9Y2Pv8|TV%?i80h#9g9!r5!B| z%}86oUbtmBASs;v7UJB)r+C(WA0-*X`osJN3;(IucC`wvjn%k!zX#81E@31F+V%KJVWK|We#Kpi~W=6JD;~6OOIctvOliw+q zy{+XIPHgm2@%_l}G`Gg&Lo9zYoD+H7r_70TqrN;3TO&1dB4pnrZU|bIfucH=S0Gv1 zAL2$q7A_?vU~#yQMq#mBXJ#HR!@Y}%nCPixcP}>I`b^5M;l`WWTi=5jISAcg#9!vXGUu70V|0YQ!P(exH7%2zN7gBHGJLd+wFwF}8HZ z+?{)IG}af^=EHL-D;D+LU5SBrW!Ua0FP@T`n`7;bcX;!n1_#1f&Qy6Fio<122wZy| z&-+_&afQ85+;2KY3fBqKuzlYKEDw_nt(%J}hLwiK;!Ir^9-fUuDA{Nu<`bA%BRqB; z4sMwt*cYLXsl9yX?Nrpgrfbg$f+Ok7@SO4Gu$P=I>|L?DRD1D)uPK7Z6Sf#&;SzC^&GM8b{~GJIRGy!bCN^x8MT*MTfR zg(?>s;1qbX35&gvFe>!9K6^WeuA#gh`M;WQD#{ObG$9XtP6N&; zU?(bi2l4LKM%Y?PNoi?v)b{(D=nbDwuH@sz3#?Mw4wKhqp!HP)($+;nCTxYI_?!iW zfva%7>IMFH`$fzRclmCM7g#mD)x>yQc<>hg^Zyt`>5(M}w$SVk*7wd>cP$O^e$iN; zkcx-R?da+5L3eirF76)>i5WBQD&NtfGeUw;7K$VFZ}IwO9Lx-cD_|LHOD3tySggL% zi~sr`AJA2C4htQ~uqp?#0PA}zL~lyOt}UCfYQj2Pt8T&LM~~3+s2+uxD>0Ugr+ngM zmCJTmdbSe1zqR7*w6Sn7R#_lo$zQ*1D0wn~9}2g?(S~h{tNL4?hP9Wtgkjc&77PwP zLhbovtPQq+j;<7bEBD}1VKSBmlVKcXJ4hC6Swtq_{Q1+^#EyK?=o3}`R>cbp!OmEc zoiQUjqr885emZtoncIV(>Q5lZ$y#upM|_v~c=3W69DSzZ(47ldA&bEAn-B4XbfCMt z4K?K_v0@rI|GLI1L9;~Ig3opG3M8kW!j{QnC~&dD)E&7aiWdYsW+H*r;?ua(-HX23 z`^a586}F}{uB{_*p!60_Z47~v%H%tO@1S_$)q}H`=ta(|qNu|*bQ97WUZKA^4Uzt~ z@_B}Rhb8&lU)Z- z2e#pC`XQ{F=?}lqD9lRAM0s}uuI-)yYv!D>YttO0;}n8LXG+mim4jUiC&Syv8&UJO z;Y#&Wl&7yim;+7LWFJLhf6QJKkL}wNaHYHrKlb0kDxXlSOwK{_sRTrZ%)^Pwr+EES zF%mo-VNUvQ?(B=8;Bgom=#L$@USY6gKSD#sVcfWJ2o4U0r@iVkqUSos9Cp!%aPQF* zR2|xg*?#^AoiqpgvKmo;|1#E$rM@EjY9e+(VAwM3*u5R6Gq0oXWgD_K%*B*B+i*NL z4U4DDz`Bz~c>M1UWX4T~E9+xcywKK#qOB9*#FEL%d60b;br=nO8pR9DNpxF{E6vZ) znt2$j!$J{4a<51#M&pwv9Ggz_yT-i4_+;?{1($xY3Aj|p`z;w3 zkyIb}mI|*ec{aeUBGU(=cBpSRay~=Iy^* z@xp;+Mlc#Wc3y$3hNo!DK905H!x0h`gxEcI(D0-kCubQcd{^=< z?Pg%lp^IpG*^k^q+mTj!h3wF5_=QAZ*4~R~eA$RxCY#b`i&^1p?~KW<;^VW3VuzIf>=gL;`eNdoWk{`P!LLtCkhCCh zNQZ=@wrpJB9S{gVFHbBxS%JRlEX)ma*6t&l(3pd?WoS7$vi6Z`z(HyilvsjQlZ+{|EGf!a4+&~19?31^i z#Vv~Y%1$nXy^bO#qPfGs)(eqIxA3U`4vsIM3U6N@Oq{V6sYN}gzP=mNNN04(rWlJo zFnPurx$FfG@%H6C?3@&dg*#JlDlJKnecz21lD!%SCiuX{NCc^)7XpLEA<)kYn{uCE zpyCvwCx#1iD$`+a2W@X_u=65q5R=@FUw-|7S3S3}(No*o#9zY4iWkTyrr0eesRTVg zHR9yN0NBy}Ds2vnMZGo^;PI;u`1O|#oQk%G`H&x~1*rwRms~<)$ws*9X)C(;Sn&c& z?i<2)=2qN!@e1X~mI>SDir6uYp3|{2?>;(iox_?Lku*NMF>U#A6t(u@=Ke@{Sn1JR zMK;4R28Szp@nhpf%%<^R<>-#BH(%m?WilcH>@mj94S@?%(Rud>Rt0&$+Ik8Scc-Fh z;5Du>eXq#HiJ9{d5E71)g zkj*o*fVF)n;!l^L_gyEh?wkj2n%miYB(=1K!_qUTExUyCtH>8Mmnq(ICjZB7K2G23 zMo0cRBut7x2>Fx?6R)B6Ne@z&$b=Y|{f5LU8e4Yk#ID`D$v1j~*ENR`A|8ibrT1`X z<9tNKB%tv1d-TxXqbc?_CYvWRb3)+K(?t0e+lWb|8)Hl<4zzVZ z#MUb)zkd^F)=tM*TMNj@j*J@neFTYp0*c@C~1kactt#Hx!5OlKr^ z@TBqakouuy&l*f8`yL*%6vy(~@v!6+7WtBWCm+|?)D_`TE3jiH%^SI8c>SstCl*Y_ zthmECdFce^M9#w2%=_s3R|8JZ34sIKHO15jI<|9hs{8?R({~{zG8}>a{+O3|3bn5X z@pIue*lXlNhWdSMI1aNn_OC40UcA5x7c3p%yCnxbtra-Gb|$?2{4gPAu^@YG`5F0< zX>`BFVrK-0uf^5!I@~WWLRNM%GEN>wZ0LA+Pg+9uumMl2&ti74qhR+XCNv-DYtg|G zu((1Q-x|SS=5btae}Pv~WEu39fBBOzx|Ct#0*|FjU`E?xJJTdE34PLjUVYaifc!6YB=F!Ym z>?S=EsWb$K>fd6ZU@gp8(X*);>^mb6-r`U4jp3y^|{uOfkt&dtp(LeBfK%_^tgS7Du?kfW6hrUJ%jR*Q%)WyEfU$ zPcxH@!@;^Y7`(L(QdYo3{blDi3m2dKh-VFFFlU79KA5tz81Dw^k+~sMK6Yt*NTgC& zTA9OqXqR1f9Dx)Q6LavWyBLYH{2)^LdLPS0J&<`|;uhV;JhXV`bWX^po$tZh|Mw$j%M@KAWE>A4c7i zxA=F(Zn)Z8kk6@I{?Fm##S3JQ3}gtNn}muFgQ!kfix7R4-P)MW*i+1w-+|w{u24Kn zzLAb479KCfP7Dq zlUPQdM(4ZNc$B_iguVZ);sp&@;fi_qIwYs2V#jPZmE0@&w&Z6ByO3(taTSE!n-uy- zK7?+}0bFVAMd`sc2n}I*wB=ZuejN`U_T$xyY(?<`8}sI{bBx2~widKp+KlNm*9QiT z#rR3nu)CarWN_yC_dK_BXIgo zl)Zb4nu{9|ZlJC+dUjK=?Mf?t?a9NsDIRJC^6bodlb{_aC`v|bxcl%US2StT>c~u6F}?b!jDpU(0GziOylA^mSQ1KOy7`U@afo9Dxy;^?qRG1zsv6oZ50Cy?)^X=B)KxyH^hNJ!2^`mPvQ zjPRKmWNUQ%vE)br+M9B4Y}qt~2hu$U`eEi;vQKTD$lV?U7b}&QKUqGo_WgoXZ9gWXgkiXe~xGjxe8)Z&p(p2)Z2he?GgCZvqf}j9jxTxhs=$V>P%)KQO zB{es&d1(xMe0(u!9?hTC?fC8SZS0uCUK&>ShXtJpOhDf4GgvdxTZ_(6JS-iLxQ$z} zecM*tZhD2EdQve-?2m+76*##&7NMalkp1{AUiMwULed*yyh>=U8NU~Id!FIJ@hzAa z5P*=#Y1olghlcv=*uahjH=?#ywiH8d#Kn89sBNr4_OU%kKCuN$qI}>JF&k?xl%T%7 z2nQFiVrr2fn@~jRvj9hL*P=D=1eQ&SfS;c?X0ADhyIp=;)V>A)D|FNnKGXf zi}RH}z^Rt^c=e3zCe5Wo_MFCssAuKWP>_fb1%fzfeCzvoF*M#kU zrp5k`KxOj)1s^Y7pnDfd;T5qS1q1KVdSe$RsoF?Zz+)YOH7T|DrMD1!=9A9rQOqsu zvZ3wwRiMueNOsld@W&S~C}571@`u@WgJ$j%u_Lzz53@GFpE(mOaj0*NNpY!Y__Ysr z_AG#}u1fI&OOP8xVtalIerV6YtdQXZp>S=b!m@vp6Xm?>8lHBOu^sEC?l`c|RogQq zp}`z^fSjtv)0ko{69$&Cl`{f&+@eAM6g@pXqwok%pLe4?V;f>@*;X;bzwznf1y`)T zSc@0`uEVkMzOWVEc2It9OcT@+WIcI>ABwlamIjCEqEvKrb!(Afm`9Jh(NdFx^*aix=c?{|7ACg_0M);KA9I7-yyfLvm!vZH6g-Y56A#SXoP)kTwh%ZG z7Bcmn3p90%=}p+)D!gn?!E`(Gk#8=LKATv2AZo{5{QAG%qUq{J_!z3{GlK#SLpww- z-ioZ^LR{XSM2^h_czU`aV$nX7*FVFP`~*aLNue(y2UOPu%Tue-_wPoWiVB3i;w>Bb zwJ5kSUWknDm-w-4$5$0EFqm;NcJjyM6be%Q`)_#L`v@J)705fW9KJFsjg`@!7jqcA zu=vaFskYVNLIoa`;W>B;W?wl%LZHfeuL*vACsNyLR)Jy zy6YdI?lg@JfB6nNa{0+|G4jHOg2(8{UI~8}Thc2UhlI@56H705<3-zX%%H%|giY|~ ztX(aOiDIzAP4EICQC7?YfK z2w-tV6I4vpEvTq?W=Kdaf~RkzRZk5ALSm$j;4J8e|1yeFL~G-hqttlUN<< z0uy29h0Vx$_!J*r_u9U;)Ph6D=0Xz@tS~h%|D~( z?kN29`|D4hc;Z_wMg!xv1E_+bnLsyl0BEPB+_lf z7SF7b-#tDD?Js{p#hw5-S$-$Q3*?LHj9rQI_g~|2-g-oN7^?Yk+97>1aK)P3F0|*y zBh=GgZfD4DNXc)UccByg-KR0nSoxNy72G_x;qFgw@Tl}4CObRAh5{2K(n*=ucXIvTGYj;T@HLE7cE>xhWJD)K8{N*U9hln70@Ct@X&?Iu&m0%s8a8p!Z3@g0#2_zHAtUn zCqHvm<$FW&+qz(P;cIk^QoO*ne0B_-gOk^5aABiAJx{X5B)cj3axy=%GncL)ZRa#t zDz{c=Fxy9cU_j$%eByOz}}3C#NPXTs60CvLC#X4?~F-j%q$(@xvK=PAKyme zSVa-E*b>gJ2`K&H4W8aTf*2QeJQv$-j_$*491?DJqC0OL993ocOjy!R&>6Db-piA5 zw<;IcZf7ES(*i_!(cDA!L zs(h+=K?hO0@1Wz|E99;Yfs0fnxkfhDH2e^12Y$wXz0Sj8H^p|`L)TVENX$AfKxT6X zj!#jKP33&5ctH=|(>LPA(_hh;xfxNGx-{lJFn513?v@`#T!fTjGm6{kISIeD_%!ad z*WmK%ad4IzQD5sLaAz@|73_hJs}=eCx-edH3B3=GA=1{8?6MK`=VhT_s{<^^Zm@0W z9UL~I@ZB5q-9L`09?s-juxBKKgyNC)`JH%Duo2E`3nFqpUA!QFD{=O|B9z}fjNi zDt|*dW+76akk3}U6Al!wGn;B+B7@957%?X*@Ung6&I`<5ibPfzH|HR7%k!{a@H16E zm$xyc_}nObJucSYL;j}eLuZAu_`_ydDh{n(gz>f{BaIjKTt&JLSdw0k)|p(f0%$klDg{>n-#>DaGFL%ulC#CE4w4*W=ckH+b>z6lQq2 z!d@yB#x>hvb2ZJ+eMMW~%C@|F+FFkRvwHhk;=j;?Lhf{`okBOUXB;=PjaV5S);L(>qqtI5eVI=M%BtM=+B_;Y`O{ zyvSM%LsL_jnOh@b|7GN?8KdF{vuAGxN8d#_SJi={q)D)%am`{C5seY2iK}p~rk&=* zrSM|~QZydTWfZGO$B@6U3;E@DP*R$Pa?J#QN(TeG+Q$rmsT#In7&@${!wT;8<+er%jk-x$ys z_FP4_w&@P`%^nLWOUO>xj4S2M=oR8xZTiS~geScZaWvW%<}CMOGzX_T`|XE_0p$OREg zv+(F$6E3qwbR9EWKfgrzu~-DEwP$(baBR%1!~32qSQbwA8?+W#rA_GjM87}n zt;O*enx7N}1tVl99SYf9iI=UZm|<@r>l@{7|Gr$*XvGU=uyb30OT8cPtT7og zX`UIDoz0id2wQN0Vuu#wZkaH`?tHv>VT|CL#q7O>PV#SZ$WL$@!{QgF14i@=?Xdi6 zBl_O`ihq^w{1b{7EDqmE^OAT?Y)BhtGh76(O}sAvfUFx*C4g95zn7}Oy3{V+*gm}nJ%zqzPkQ2 z9BJ;u5BHD4$H79dm4cmd^u*ZR#lt%<&@(bMw}WS52|f%yz~ON6X{c|Qoe_zo@Sm~+ zw_2N!5zAhX7`8J8Mt)edFAukF?naD^tvAT+jNghqICfwsW;w}^j}fy)Wt}i=zuAtv z7Z)mu7v%TG?2Oxn8+hEJQM|x@Lt}g}e=}g)UA*eZz&s~wp+A}LXYDu(7oNPwbMnt- zQ!F){pQrIAazN0G6m)#(#I2n)&+14JG&2bmKMdeO`g(+D=!}7WFjgj4V({5bY@DW% zgC*Za-@pe6*BX$sFA6?3^jjJWgA8`e!JM;Q3&P(imUjuphMZyue`3i>}9xc=4FE6-D>77ca=$ z%41u0?81ayckrk@4O0T`XpSIT&tfOFd>G9)hVEFK--8a)*g}t=+I7vkU#5 zr!a>tic@>`e9Uc~vEk}dR34isEV#0~E4x>jODGoYy^6}*I5>{befgS6%=$E3yKxGO z*qQ&DJ~PXm1+B-G)@Nuuw+vy{hBW6foh026`C#kq9<*Fu34bTW4yr8y)d z5A!2z{ik48Ne|j@ZIJf|8S~5NIx67i9M?@|cIDn;mGpu^m&{ z5ddVj^mTl&l;YcpJ3Fx?L?-x2>|WVXhSn=GP~UYQsf&DIPd3KXR4Ka|A`jii3zGd% zCX;kp9;ubR(c{k{|@E?+^)wkhiQ z909ryeNV(^-AC@x*$A?yzR)sO8Jc#69UtShsTeQ2E@82Uy+U7D@j^7tb-u$Z^3N8M zT^QDB(mfMfct@N-(~nP3d2p)QSXA{1#D=;s^Ph*4cOKBQSWYnq^(}p_Y^(GkesPO#Ri3fU9_M^P69Zw!V(lQSW)7^a+dqOng75dGO7cZE@J8}!| zynT!2{OyQPvysLyH1Ngz-GzAhvJ6RcJ)q-08%epf=vxS`%nW(NkjcN9l6!gj4v+5*s2Y2}S`ohP@XHu_rDg?NlyG?swqV_DswRcl~5={VD#i;sq8cOUz;8=msw@7uZ?J z$k2{_{vrcI%-x=f)VQe_XU~izIVxnp#beA7edIp+`)es!v>ysuG{4VubO-u)tVm?F3IR54bp3QLrb4v0$8yMaJaFok8WJ z$K*IogO7~8+2K4~yf9fy@q+Gboa^ex4`tiGu6RLA6N804JT_(F)~y|w;2wyHThdY4 z`3C=Ouol@nrovK3Z|Ds>HCW}e*CHIxzmCk!Q((__BhhT5!r!uZK^68kdgNZ@*IdEI zD1TTh97?TiiH{dAh+*sGgWYFxa3Io}oN$Stk8HAa2$_rH6a@7Y9;D!24~C>0da|)t zyyqM)om>eo8XrR8*GGyMgl(LHH{x{h1tiRw0MCglkd)Jix9{KLb?pg6+gb<<@v1VZ z@mCiwkj}qoxQZ1sgW=?~92u=I@#N-ajQ6w@#_mvmvTfA86L7b`18KADAR&98{EYqA zW>%W;=J)y8)Ms?RViR*XdG1E>KsPQdm5@`cycP>wEZ{q34=TFbkhf)=aGZhAyIj{sa1}&tT028b@Ty**0_%OKaHK*uX+c&I)t>$0s1a zxf@l-S0E<99iHBbImW{U&a2YV*58fG%AFTjWxwZUl)dOg##{#q)Q6u5>jSIlspxpq zi}bl<*EF0!=8S%{c!6}lNY529t8-A@mWPB$W8wTZ;re27hV&gVd+$y3H02?FiYxTk z8#UH5aiY8)g-7PW-_mHPdXycZV&I>EqQ|dMyfXmK7IJ5o$;i&r9lNIzFJBMf_AYNY znaiIa`<~3s5sqvQ9+GL8ziaUVOVpam91ybM4xYbiKn6=<+If%Mc_H=^8edc)Wo;Oo z+`QmJbD8V7nb>wG8yAkmB0yQZ;5ZuxZ+GLreWZB7LnvPOZ+LJp5YATWfd+#G%701m zLdY6q)Vx8@l~ssz9bV{TTLBvx$j@PC=kf{vW!3L&mm{}$6h7-f)?!y7sjQrb#q=HX z=+kI>^8%R*S#pQ{%?#EK3AjyT;L0j<7%Pi-NcT-_y%2S(9M7r`A&NQr%!Wz5Fm-z# zYVW5b)=dw(%I&&M44`j68Hu@VXt}iqvpnS6Rx0g`!~7#C>HZ1rS5{)O7xgc*jbvxc zZ0zAcc82Xt#^f_LpM))m+cAszBs6~*QE+Wwpa(r&KP1%*py62LaQ`S63R(&&U`(Am z%FYE$c2C44=A!oD1uS=0m7R3TJ_-p}ThUsWggFY?M_l8Rh+ts499Mf^;M#geVK*!> zvp1r-NWYqbDHdj0zN3(z{Q12_qZco*Gl{K&XX0pnHS#tFQc$cz@Jbw{-yb_Xf$YEtbH- zW+MtnkMiOyVQQq%8M+S>Yd3@+E5q~JV~AEuj(8`kW|7v*(GU(F_-K=a^BWG^+7k6U3UyLghlAJ^8B z>?{c>v}ZO-3a7DaQSj&)D)&dyys8hWYbfIL+R#~k2vZD6FNWq-vhRlWh)KAN>dI_v zoM<7uMLi_@ti32`{|VjK;xWxvyX>kqn=Q!CPw&CNotFF=xAdc*0#{ z5$5ao+~S3|xVa$|uI4Jm3xfT&fwPAvyxiHY3)=hw6-ZX8l@k_cb)e_W6t%(xIiFj+ z@NcwaZ$-3)4#tGVBdfU$MSJJNkG)Yb^qk25G4jF2oF+76Z$PM}L<&no(E>4?AsrRZ;= z7@gujO@04V@q($59xTGw;bK!8iuW&qzoDk=-q>)Z5sg3U`zM%*r*#yLI-j4b1 z4v>*uFcfU0yntgzWj~tFP%Jc5ydZ(u(rmmMY{BVh3-WOkdctIv*}-d1Azo=YHiE&5 z(yW8$;#htaayJDDJFKaGF2LSsGoUe&{s0yEoB#jq{r6WD%l1ABBROnx&N&K_4P;Rf zGYTd!=bUrSSwRsaCQL|1KoCW82GibWpY!>CzxR&!y?2cF-+10Rd#%OlwOAm!<2k2) zc!sjNx_Wl?tXXr;da4QuZah&cpXlFqnEak_*i&2}v={Z&QBGtZYu@1ck}+@+5n%X? zTjQwRDC_RR_4&5)Rdei%(!ZwWm~gNP{hc3hWr-uK*(UMty!wayA1AV_!dOPnwepR| z`kYcc*%&6+NIoh=W+P4D88seLQj_65XwiTy<_pU@gNh-@3%qlm^NiCd?YzNH?PZlDV-skpm^7pC#3o;XoE$!jA`60FYaZKV#iSN$m z7(j={!*7!pJ|ce|?|MQ0foUWbFI^{WVQs0RGagv;q!m>sCJiDlC}3u3jpes~Kk@>% zjlQ-nA{HIRof~J65ork>>a$u7lW_3xPRvUVqJA^Pin5Wy)DlU@YtYkt9;xI{n%h`n z{^cBG@i7#NGTaBuoDekU49ec#!^!|1Ox#b_5Z^6@y?EQ_%WOstW# zatUH=Yz8f2Vwjm*3ZxNDN|t4?65zBuM1-%#Hc;d2h5p!5N@Pvou9 z^`NKai|L#5QCM;e85EZd#40rYYe%lc_16WsG%p5jI(kB`#ofzS&^b-IsDQt}4_vHi zY-N9O+BvlJzQO5aJDIKvvQoR4S;1-5ZS)Kr8^L~&HC+8?VZ*Wo2sPq!$4Mv2u4`!- zz;pasQ~ZbDR~~9nu;5B<$Y53ky?2D29}+u$1LvW3cn- zhe6~8-r>Z5?IVrk1yxYn%;7v5^-*VA>c6sbGV%i1a|L;UVhp9-WU`72BBz}tUuuNp z1+7qIo-INzlNZLiL+2;k?`!vgxA0*QFAS3184*)Y z(HO5rUJ!$iX7WkJ+UvPEzJ4k^*`6uJ6ira%qDthsC@Mc(zaE~vFbx+KM-3*UEg}ktP zXz~L2Y4eZ0K({9H0`Ih=PF~PT#-XZKd>J4w1Yz?tCNJE_GCK|A1*=+&~w1(xWlMaAuntln!KPDgt_|*(5aEUz+?+;_^rxAZQeFS``KyC z>F~De5&J68b$z}dw=VgIoHOGw(S%}=$!nG(ipueOniyNc$zwh4tCJTEjN<5CwQ|Pv{$9)Qu(b~7r@O*}ZM*!M5PK(5 zEYRD6bJNHl<#B@EhbN%tT&P9;5sFU)KT>v$N$d8$qcL?s8iF+Vk;ZzuaEM!qOL=#2 zV2&@@AvK?weMQsJn3=u`84-Mx8u?-RdgP0dt)YILakUy%R~I9Q7Z9*6@SJ4gUR1Sy z#mij*a8OyyXMtrWAL7i~1Xw7>emVHPtew5FHNOjQj!)5?6Cv<7wGE$+!?{m!adCj~ zu6*m*TTP zxLb29EYovw{?f$M0`?R3qO`pjJHsi4P~?s2T?{Q<5xIi=sP_ff7%5w@$7AidSr_r5 z{th0-9juw`CFIC$V%FnkeKl?_O`sTn{ICIkiP~5{2RA@eBmuB^al5=1%q#N-7##4J9AieH;? zchfZZG5bexFDr&aD)v8okN>;S-9mbhgh@5N~{T0XEE=Hm+BKqzt>o)sNL zyn_`PeX-FZ(1#MvmHH;s?jww3=Y@qAO40VO66{sqd4bwV-**ijHTU2v@4UdBSL1Uv zLtU0{k{8%1;Q_^KJeE@D_|Vymj<$BRzbnU+Et4^3;$ob8)q&3iJCHcqW@O)b82oYM z1qQ#1ydBgAn*mS?pVvnDq*o$Ae#78oKbykL+-XR&WnWz~(D;==)TGYvdf; z4ce-Sf&pzSL@zmu*RLO77dW_dnvbhb&LAr;2)4uNnjFKC7Z|2y z&eR=!^|Ga(*wSIrHB-&=C@3W{6pR6>neP zBAIxbJ6TeZx7pINCp~(03n%8q!;73I!=KDyVP%D}^Uk5Dts9*bs3tnu4LJ3K@K=); zNas6>PYJAFEgBQ19w|jr?_;bFaEG&pLXU!>K?4w|H zbD&_uOpLAI>bn{Fopm@mc@#M)%4ZuJ8o)Jd3eJ_b;l;5Tu+=iAU~4;`*Oue_(kSSv z2kzS12wQXl#cv9+XT}&<%I!TT*4)z1puFlnHYWJNk{tAbzC(RZlU?{Gd4cXRvvI=Y zldsWMcO1#|t+fW;lY>TU1jO^CL@`dxRx;k1b!iishT~7lac^fTTvVJ(vSSSXznr{q zv-&L_Zb*QSxh{A|1Hq0_z^Ik9AC;}jVc=Z>`tM`84cQGH3Zw?)pOR+z6OcTi8w6gU3y! z6exv}trE2j*&HpccpNBe#hc5s;O%He?Vdoo-W0hY~Ph&=exhwoM9UIZ~5WA*O-=l9Mte~VIKWga`tXr}Oq13Lzu@O3v zSazutAL}n;HYW%*kQY3&vQgXBjO=uOI9iauqt>Q>33-8u7fw^K>)v~`J>7}P!ItD# zQd^TRpzS&b#~)Upq4|Sw27g0K7phOqfQOAfyq4ZUWB)^}akhk!ioO$!(vjQKgW{cI zg#OK2W!gEf#@(JKoSCLe0jT`hr2B@vUH*YbXnwU9@np;ONDnQ2W3eH>29-H0F^2V5 zM^QKHuNS6mdxVV2Vhm4SklC=Tn{UzkVi$s(ZK&_5+d&#*bGy)4v;(0u-U=(i z?U&IURjRpb2f39yl`l3;t{ICUo;mOaCf zw8%lSD-t&v?J z?AC{SB+=Oj3wIbHy z+=1mt4YMDZc;$ZKmT?)?-OsTz*ac=(PT5zp-PHT z$afI$_(5RXsf=&vdllPFT-yf8=-~hl{u*T_?G<4aPp3~9&nFaf&<6%@#IMZ8X8z< zzToYNiLm?A$O{Cr+q&V4aPrO#oR}X?xH!?vk%6QDL!}?`!!U*Q@;m77dWFpa zKf&5+4lZP83OjTt$_NAiXMfDQQiBggdk{0oCvZSi8Xrye06QkzK}%0|uQAzbyZDvJ zep!UeE92pyucy>W`o06PitslRlv8p1W-Xf9E0BA5KNdvt?k+rGZwNChYgi0H_8OYJ zKsv-bM)=Ldr8g}oKaxUrM75obNG8t->Bz2Vz}+2_VK-_Nv`6`22KhM8p6$b|04-%q z$^Lx!a%5LM#ntp!xC=+kD(v~U!Tpbkg2CHgp}Y4EGOfiVO==4Z8@Q~#BO))zu9?zU zY-UV-#d4gmO?Yl@17Vo?u$nJxfRd-1C*SN++?XE>=V|*;-t-YImuJJ(&Rl8Fe*oVmFW4Y_`X0RexdYFR%tx?zl10#& zL~O{Z#y=abV?msUV5jCBE8yUgen#MAD*}oHcfpd$# zEA!FZPdejZPH~%RPDI~iKJt2d@M?RooZQRb!3yqyyHM2Fg|}7ra40haG4AXi$aZAm z9JRUHa|D-1iDiHCHhwkYW@0oDb_x(8i}U z4qU=?_n~B0{cR-V1tFiqvDM5g)b4F4e{v05XT&0aVyuz1douPtF2Jc3?Wl3*g81e9I@WOU04gv)D9y92^C^E-Fv|SGW5^L6gpZo4l}6*g>)K##%&+ZKSb2 zbgUwgapV<#X?uiiGs*6dj*WP3Tdn>7Jn{lh$lC{C?9Lmwb8#tx_(jz|fb95!&BE~o zB_|dk+FD0><_41&oTlN>lMm>4vITJgR`g8K{d%O3al4UMcorEE-mq3PK!ZSyVLJB` zUKH*XRvr&Iarc85p1i;vSqF&}7{B|}j_mXhxR{FuGH$DYbtq`*Mg5s6u(i}2@QxJU zCND5Zp*ewMV+UtfSGc*m!=1OP{Ye*&DO+*(?Y~feIStVsO6TE6@yC)EMgVe53@Pwr z7MqHrPn}E8e+?ct_oDV>66`5JRJl%0f${7Mc>d}D5*#(}r11Tqen9W2$80Q>XORQ# zI0d`!zenqn?U)#3NrMY-yLJzCA3Jel5pQQIx`)XNeyj1Yu@~>pPlKbn?B4(<8LWBr z|E(6(oSu$>vvk-9lhb747l(y8_2@0Vghf1oC{BFPv$bu;V#S3@R6pE~)Ib^xzmXXE zw1y|Wv=z1`?+??6}o2i)2?8NNnZ2wrgmZ(m%(vmQq zCoTEFAo4=crUEo~P`kI041!LI(T$Iv`%$(#oW>4SoB4g@h0Dm|og~B#G_`wh`au-d zmf^^}NLZ3X?l^4^@@snVsk@zIQEQv#PJH~w|3-WETzET~lT##XwMm~A| z?@V40lKB=c2wQpwt!>5Rq>qK`oK+gg3y-jSs*^IYtgjER2@{YI69W%{j3eu()Ar<} zvF!;qC69&$CkRE)=kFB1>p2=ew&Plw9~{m9M&t#@$=G@K9onDm!sK8p8F@iyFKbv^ zTVdAWTr_@e!<|*}2zIuRC1=;Aq)Lmk<1nZCEkzp4DYwshg+&%dDd@c2RGg-f$V zvJ+(Fg%Ip{-itRkGU29W49~GE@SwgP_cl%#ln^(h@!l_G9rCMdahdubk6FUFDv%d; z;ZaFG_Dl;KQg$(Zh`jK-VmR^w+fYZOoh(FK+kLEv^oAvqPY2a8a`5|EIrw19qYgY+ z>8;k^h9fUfnUHo0i3wFZp z9ktc@SeN2AsPD^2Bll2W{{Sn-`3OE5|K>V(BXVk*P*L|3=QhvAv?(5NbB)2i;!eCi znxH~n7`wj$J)PN@NBw$052^jXOGru!G^d1SW#TX z@8>*cEv{5GqN4seE^eEH87ZD{a~Y4_FWXUlBKc3;d4ZuXY=544q7VhQR$#oHDJJbZ zjO`gy;BPR5@Bf`Jw_A?;eI0nVB^(y>t{{6)go>}q_TJpZ9~sx0@Q=@$W0lUnU-0Q| zK6a&wd`yA7unIXZp5aX91lSCk2vr4>|E#Q|F)n>4F1~C*8^yrwrKQMSJOP$u1BQxQ zhbJ$X!^J-h*U3*R*_SlPcjVQM9^=z+t)dC}ds5*jCNDhSkJ*9WATNmO8VQ)Z5Vo@z z-Mx8Oq~hO`kEwyYz-@18=ZHzi@1nfD1c$Lbo97F8USiH91)9 zCW@6PN|hMi|zh!6jtA= z-#c;)PhMbOP!~Q4i;&y+PgG}bK!R}Wi~Kt4jQvDx&aFjP@nOser!h@S8xz*uKy`l) zZZ97XZwt|67M0iWUWPmGdeC@f4&3a_V4!b+d6%2e)n9`H<7{L*m?@smc^B9EhA}{cSkaYwWohZedX9qARSVtv4@*`mK!st!U(B5|s%k6ExOY zu?KIWw6zT{3(jHZ!e~TAdmv)sCft5qfpcm*F9_qSUI3ZAbpiU^}BfN*7a(7UR|F z#RzdTmrvxYmf@pJ?Hm%3wBiVERZ?GVZ${Iz0-T-^1U(gE;NOe95V+wH`9t048Y&0) z0 zQOlt+2FMFl#}IF44O5M_Q$}7$I#GwOA2s=6t?20bgimd+ae1*P^;a=@f!aAzoxH&I zeurT1PiHbY)(Vq$+{K5=>&S@p9JGLm{o}+vg=l`8i}WDZfjOT6@

    dB-#%pyAmVG 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 RkA{LgloizFE9ERg{|EEbnT!Ac literal 0 HcmV?d00001 diff --git a/en/device-dev/device-test/xdevice.md b/en/device-dev/device-test/xdevice.md new file mode 100644 index 0000000000..0b33efa70e --- /dev/null +++ b/en/device-dev/device-test/xdevice.md @@ -0,0 +1,701 @@ +# xDevice User Guide + + +## Overview + +As an open-source OS, OpenHarmony supports product development in many chip scenarios. To ensure compatibility of the OpenHarmony ecosystem, OpenHarmony provides the [compatibility test service](https://www.openharmony.cn/certification/document/guid). For related products, API tests are required for verification. However, executing a large number of automated test cases requires a scheduling and execution framework that supports capabilities such as generating visual test reports. Therefore, we designed and developed the xDevice test scheduling and execution framework. + +### Introduction + +The xDevice test scheduling and execution framework is a core component of the test infrastructure of OpenHarmony. It provides related services required for scheduling and executing automated test cases, supports scheduling and execution of a large number of automated test cases, as well as supports the generation of visual test reports. The binary package of xDevice will be compiled together with the XTS suite of OpenHarmony. You can obtain the xDevice tool from the XTS archiving path. + +Based on the device type, xDevice mainly tests tasks in the following scenarios: + +- Perform XTS tests for mini-system devices (such as the Hi3861 development board). +- Perform XTS tests for small-system devices (such as the Hi3516 development board). +- Perform XTS tests for standard-system devices (such as the RK3568 development board). + +### Implementation Principles + +The xDevice tool includes the following functional modules: + +- **command**: enables command-based interactions between users and the test platform. It parses and processes user commands. +- **config**: sets test framework configurations and provides different configuration options for the serial port connection and USB connection modes. +- **driver**: functions as a test case executor, which defines main test steps, such as test case distribution, execution, and result collection. +- **report**: parses test results and generates test reports. +- **scheduler**: schedules various test case executors in the test framework. +- **environment**: configures the test framework environment, enabling device discovery and device management. +- **testkit**: provides test tools to implement JSON parsing, network file mounting, etc. +- **log**: records task logs and device logs. + +In addition to the preceding functional modules, the framework depends on user-defined configuration files, which are classified into two types: + +**Test Task Configuration File** + +The test task configuration file provided by the framework is **user_config.xml**. You can modify the configuration file based on your environment information. + +The environment configuration is as follows: + +```xml + + + + + + + + + + + + + + cmd + 115200 + 8 + 1 + 20 + + + + deploy + 115200 + + + + + + + + cmd + 115200 + 8 + 1 + 1 + + + + + + + + + +``` + +Set the test case directory. + +```xml + + + +

    + + + + + + + + + + + +``` + +Set the resource directory. + +```xml + + + + +``` + +Set the log level. + +```xml + +INFO +``` + +**Test Suite Configuration File** + +The test support suite executed by the device is specified by the test configuration file. + +Each test suite has a test configuration file, which mainly specifies the test support suites (kits) that need to be used. In addition, the setup and teardown operations are supported. + +The following is a configuration file example: + +```json +{ + // Description of the test support suite. + "description": "Configuration for aceceshi Tests", + + // Specify the device for executing the current test support suite. + "environment": { + "type": "device", + "label": "wifiiot" + }, + + // Specify the driver executed by the device. + "driver": { + "type": "OHJSUnitTest", + "test-timeout": "700000", + "bundle-name": "com.open.harmony.acetestfive", + "package-name": "com.open.harmony.acetestfive", + "shell-timeout": "700000" + }, + // The kit is mainly used to support test execution activities, including the setup operation before the test and the teardown operation after the test. + "kits": [ + { + "type": "ShellKit", + "run-command": [ + "remount", + "mkdir /data/data/resource", + "chmod -R 777 /data/data/resource", + "settings put secure adb_install_need_confirm 0" + ], + "teardown-command": [ + "remount", + "rm -rf /data/data/resource" + ] + }, + ] +} +``` + +### Test Commands + +Test commands can be classified into three groups: **help**, **list**, and **run**. Among them, **run** commands are most commonly used in the instruction sequence. + +------ + +You can run **help** commands to obtain help information about the test framework commands. + +```text +help: + use help to get information. +usage: + run: Display a list of supported run command. + list: Display a list of supported device and task record. +Examples: + help run + help list +``` + +**NOTE** + +**help run**: displays the description of **run** commands. + +**help list**: displays the description of **list** commands. + +------ + +You can run **list** commands to display device information and related task information. + +```text +list: + This command is used to display device list and task record. +usage: + list + list history + list +Introduction: + list: display device list + list history: display history record of a serial of tasks + list : display history record about task what contains specific id +Examples: + list + list history + list 6e****90 +``` + + **NOTE** + + **list**: displays device information. + + **list history**: displays historical task information. + + **list *\***: displays historical information about tasks with specified IDs. + +------ + +Run the **run** commands to execute test tasks. + +```text +run: + This command is used to execute the selected testcases. + It includes a series of processes such as use case compilation, execution, and result collection. +usage: run [-l TESTLIST [TESTLIST ...] | -tf TESTFILE + [TESTFILE ...]] [-tc TESTCASE] [-c CONFIG] [-sn DEVICE_SN] + [-rp REPORT_PATH [REPORT_PATH ...]] + [-respath RESOURCE_PATH [RESOURCE_PATH ...]] + [-tcpath TESTCASES_PATH [TESTCASES_PATH ...]] + [-ta TESTARGS [TESTARGS ...]] [-pt] + [-env TEST_ENVIRONMENT [TEST_ENVIRONMENT ...]] + [-e EXECTYPE] [-t [TESTTYPE [TESTTYPE ...]]] + [-td TESTDRIVER] [-tl TESTLEVEL] [-bv BUILD_VARIANT] + [-cov COVERAGE] [--retry RETRY] [--session SESSION] + [--dryrun] [--reboot-per-module] [--check-device] + [--repeat REPEAT] + action task +Specify tests to run. + positional arguments: + action Specify action + task Specify task name,such as "ssts", "acts", "hits" +``` + +The table below describes how to use **run** commands. + +| xDevice Command | Function | Example | +| :----------: | :----------------------------------------------------------: | :----------------------------------------------------------: | +| run xts | Runs all XTS modules of the specified type, for example, **acts**, **hits**, and **ssys**. | run acts | +| run -l xxx | Runs specified module test suites. Multiple module test suites are separated using semicolons (;). | run -l ActsWifiServiceTest;ActsLwipTest | +| run -sn | Specifies the SNs of the executed devices. Multiple SNs are separated using semicolons (;). | run acts -sn 10.117.183.37:17001
    run acts -sn 88Y02******57723;VEG02******16642 | +| run -rp | Specifies the report generation path. By default, subdirectories will be created under **reports** of the work directory using the timestamp or task ID.| run acts -rp /suites/hits/xdevice_reports/2020.09.28-14.21.26 | +| run -respath | Specifies the test resource path. The default value is **resource**. | run acts -respath /cloud/zidane/xts/release/suites/resource | +| run -ta | Specifies module running parameters. You can specify test cases in the running module. Multiple cases are separated using commas (,). Currently, the JS driver test suite is supported.| run acts -ta class:ohos.hardware.soundtrigger.SoundTriggerTest#testKeyphraseParcelUnparcel_noUsers | +| run --retry | Executes failed test cases of the previous task to generate a new test report. | run –retryrun --retry --session 2020-10-30-17-15-11 (task directory name)| + +### Test Report + +After the test framework executes the **run** commands, the console outputs the corresponding logs, and the execution report is generated. The report is generated in the path specified by the **-rp** parameter if set. If the parameter is not set, the report will be generated in the default directory. + +```text +Structure of the report directory (the default or the specified one) + ├── result (test case execution results of the module) + │ ├── *Module name*.xml + │ ├── ... ... + │ + ├── log (running logs of devices and tasks) + │ ├── *Device 1*.log + │ ├── ... ... + │ ├── **.log + ├── summary_report.xml (task summary report) + ├── summary_report.html (task summary visual report) + ├── details_report.html (case execution visual report) + ├── failures_report.html (failed case visual report, which will not be generated if no case fails) + ├── summary.ini (Records information such as the used device, start time, and end time.) + ├── task_info.record (Records executed commands and list of failed cases.) + ├── xxxx.zip (compression file generated by compressing the preceding files) + ├── summary_report.hash (file obtained by encrypting the compression file using SHA-256) + └── ... ... +``` + + +## Environment Preparations + + +### Environment Requirements + +- Python version: 3.7 or later +- pyserial: 3.3 or later +- paramiko: 2.7.1 or later +- rsa: 4.0 or later + + +### Installing the xDevice + +- Install the basic framework of xDevice. + + 1. Go to the root directory of xDevice. + + ```bash + cd testfwk_xdevice + ``` + + 2. Open the console and run the following command: + + ```bash + python setup.py install + ``` + +- Install the OpenHarmony driver plugin **ohos**. + + 1. Go to the **plugin/ohos** directory. + + ```bash + cd testfwk_xdevice/plugin/ohos + ``` + + 2. Open the console and run the following command as the current user: + + ```bash + python setup.py install + ``` + +### Verifying the Environment + +Check whether xDevice is installed successfully. + +1. Go to the root directory of xDevice. + + ```bash + cd testfwk_xdevice + ``` + +2. Open the console and run the following command: + + ```bash + python -m pip list + ``` + +3. Check whether the **xdevice** and **xdevice-ohos** libraries are successfully installed. + + ```text + xdevice 0.0.0 + xdevice-ohos 0.0.0 + ``` + +Check whether xDevice runs properly. + +1. Go to the root directory of xDevice. + + ```bash + cd testfwk_xdevice + ``` + +2. Open the console and run the following command: + + ```bash + python -m xdevice + ``` + +3. Check whether the following information is displayed on the console: + + ```text + [2022-10-13 15:43:31,284] [30076] [Main] [INFO] [*************** xDevice Test Framework 2.11.0.1091 Starting ***************] + [2022-10-13 15:43:31,286] [30076] [ManagerLite] [WARNING] [wifiiot local com cannot be empty, please check] + [2022-10-13 15:43:31,286] [30076] [ManagerLite] [WARNING] [ipcamera local com cannot be empty, please check] + [2022-10-13 15:43:31,287] [30076] [ManagerLite] [WARNING] [device com or ip cannot be empty, please check] + >>> + ``` + + +## Mini-System Device XTS Test Guide (wifiiot) + +1. Identify the serial port usage and modify the **user_config.xml** file in the root directory. + + The COM port whose **type** is **cmd** corresponds to the AT command serial port on the board. The port is used to send commands to the device. In the example, the **ChA(COM20)** serial port is used. + + The COM port whose **type** is **deploy** corresponds to the log output serial port on the board. The port is used to burn the image and print logs. In the example, the **ChB(COM18)** serial port is used. + + If the AT command serial port is the same as the log output serial port, the serial ports can be set to the same port. That is, in the **user_config** file, the COM port whose **type** is **cmd** and the COM port whose **type** is **deploy** can be set to the same port, for example, **COM18**. + + ![L0-1](figures/L0-1.PNG) + + The following is an example of the modified **user_config.xml** file: + + ```xml + + + + + com20 + cmd + 115200 + 8 + 1 + 20 + + + com18 + deploy + 115200 + + + + + + + + + + + + + + + + + + DEBUG + + ``` + +2. Create a **testcase** directory in the root directory of xDevice to store test suite files. XTS test suites are obtained from the daily builds of the system. + + Daily builds: http://ci.openharmony.cn/dailys/dailybuilds + + The following is an example of the test suite configuration file in JSON format: + + ```json + { + "description": "Config for ActsAllTest test cases", + "environment": [ + { + "type": "device", + "label": "wifiiot" + } + ], + "kits": [ + { + "type": "DeployKit", + "timeout": "20000", + "burn_file": "acts/Hi3861_wifiiot_app_allinone.bin" + } + ], + "driver": { + "type": "CTestLite" + } + } + ``` + +3. Execute test cases. + + Go to the root directory of xDevice, open the xDevice console, and run the following command: + + ```bash + python -m xdevice + ``` + + Run the test suite command. + + ```text + run -l ActsAllTest + ``` + + The command output is as follows. + + ![result-1](figures/result-1.PNG) + +## Small-System Device XTS Test Guide (ipcamera) + +1. Identify the serial port usage. + + The COM port whose **type** is **cmd** corresponds to the AT command serial port on the board. The port is used to send commands to the device. In the example, the **ChA(COM20)** serial port is used. + + L0-1 + + IP camera devices have two connection modes. One is to connect through the local serial port, and the other is to connect through the IP address of the local area network. + +2. Configure the NFS server. + + There are two NFS mounting modes. One is to mount through the remote PC, and the other is to mount through the local area network. + + To configure the NFS service on the local area network, perform the following steps: + + 1. Download and install the NFS server. Download address: https://www.hanewin.net/nfs-e.htm + + 2. Configure output and edit the output table file. + + Add an NFS sharing path, for example, **D:\HS\NFS_Share_File -public –alldirs**. Note that the FTP IP address 192.168.1.10 is the IP address of the development board. + + + + 3. Stop the NFS server and restart the NFS server to make the added sharing path take effect. + + 4. Find the mapped network port of the IP camera device on the PC, and manually set the IP address to 192.168.1.11 on the PC. + +3. Modify the **user_config.xml** file in the root directory. The following is an example: + + ```xml + + + + + com20 + cmd + 115200 + 8 + 1 + 1 + + + + 10.176.49.47 + 10003 + + + + + + 10.176.48.202 + 1022 + /data/data/local/ + root + xxx + true + + + 192.168.1.11 + 2049 + D:\test + false + + + + + + DEBUG + + ``` + +4. Create a **testcase** directory in the root directory of xDevice to store test suite files. XTS test suites are obtained from the daily builds of the system. + + Daily builds: http://ci.openharmony.cn/dailys/dailybuilds + + The following is an example of the test suite configuration file in JSON format: + + ```json + { + "description": "Config for kernel test cases", + "environment": [ + { + "type": "device", + "label": "ipcamera" + } + ], + "kits": [ + { + "type": "MountKit", + "server": "NfsServer", + "mount": [ + { + "source": "testcases/kernel", + "target": "/test_root/kernel" + } + ] + } + ], + "driver": { + "type": "CppTestLite", + "excute": "/test_root/kernel/ActsKernelIPCTest.bin" + } + } + ``` + +5. Execute test cases. + + Go to the root directory of xDevice, open the xDevice console, and run the following command: + + ```bash + python -m xdevice + ``` + + Run the test suite command. + + ```text + run -l kernel + ``` + + The command output is as follows. + + ![result-1](figures/result-1.PNG) + +## Standard-System Device XTS Test Guide (RK3568) + +1. Configure the HDC tool, and download the latest **ohos_sdk** from daily builds. + + Daily builds: http://ci.openharmony.cn/dailys/dailybuilds + + After downloading the tool, configure HDC into the environment variables on the PC. To do so, right-click the **Computer** or **My Computer** desktop icon and select **Properties**. Choose **Advanced system settings**. Select the **Advanced** tab, and click **Environment Variables**. In the **Environment Variables** dialog box, select the path of the environment variable. + +2. Run the following command to check whether the device is properly connected: + + ```bash + hdc_std list targets + ``` + +3. Modify the **user_config.xml** file. The following is an example: + + ```xml + + + + + + xxx;xxx + + + + + + + + + DEBUG + + ``` + +4. Create a **testcase** directory in the root directory of xDevice to store test suite files. XTS test suites are obtained from the daily builds of the system. + + Daily builds: http://ci.openharmony.cn/dailys/dailybuilds + + The following is an example of the test suite configuration file in JSON format: + + ```json + { + "description": "Configuration for hjunit demo Tests", + "driver": { + "type": "OHJSUnitTest", + "test-timeout": "180000", + "bundle-name": "ohos.acts.bundle.stage.test", + "module-name": "phone", + "shell-timeout": "600000", + "testcase-timeout": 70000 + }, + "kits": [ + { + "test-file-name": [ + "ActBmsStageEtsTest.hap" + ], + "type": "AppInstallKit", + "cleanup-apps": true + }, + { + "type": "ShellKit", + "teardown-command":[ + "bm uninstall -n ohos.acts.bundle.stage.test" + ] + } + ] + } + ``` + +5. Execute test cases. + + Go to the root directory of xDevice, open the xDevice console, and run the following command: + + ```bash + python -m xdevice + ``` + + Run the test suite command. + + ```text + run -l ActBmsStageEtsTest + ``` + + The command output is as follows. + + ![result-1](figures/result-1.PNG) + +## FAQs + +### The **hdc list targets** command can find a device, but xDevice cannot identify the device. + +**Issue Description** + +The following error information is displayed. + +![FAQ-1](figures/FAQ-1.PNG) + +**Possible Causes** + +The **HDC_SERVER_PORT** variable has been set and the HDC port has been modified. By default, xDevice uses port **8710**. If the port has been modified, the xDevice framework cannot identify the device. + +**Solution** + +Check whether the **HDC_SERVER_PROT** variable is set. If yes, change the port number to **8710** and restart xDevice. diff --git a/en/device-dev/device-test/xts.md b/en/device-dev/device-test/xts.md new file mode 100644 index 0000000000..9fbfd198d1 --- /dev/null +++ b/en/device-dev/device-test/xts.md @@ -0,0 +1,506 @@ +# XTS Test Case Development Guide + + +## Introduction + +The X test suite (XTS) subsystem contains a set of OpenHarmony compatibility test suites, including the currently supported application compatibility test suite (ACTS) and the device compatibility test suite (DCTS) that will be supported in the future. + +This subsystem contains the ACTS and **tools** software package. + +- The **acts** directory stores the source code and configuration files of ACTS test cases. The ACTS helps device vendors detect the software incompatibility as early as possible and ensures that the software is compatible with OpenHarmony during the entire development process. + +- The **tools** software package stores the test case development framework related to **acts**. + + +## System Types + +The following system types are supported: + +- Mini system + The mini system fits into the devices that come with MCU processors, such as Arm Cortex-M and 32-bit RISC-V, and memory greater than or equal to 128 KiB. This system provides a variety of lightweight network protocols, a lightweight graphics framework, and a wide range of read/write components with the Internet of Things (IoT) bus. Typical products include connection modules, sensors, and wearables for smart home. + +- Small system + The small system fits into the devices that come with application processors, such as Arm Cortex-A, and memory greater than or equal to 1 MiB. This system provides higher security capabilities, a standard graphics framework, and video encoding and decoding capabilities. Typical products include smart home IP cameras, electronic cat eyes, and routers, and event data recorders (EDRs) for easy travel. + +- Standard system + The standard system fits into the devices that come with application processors, such as Arm Cortex-A, and memory greater than or equal to 128 MiB. This system provides a complete application framework supporting enhanced interaction, 3D GPU, hardware composer, diverse components, and rich animations. The standard system applies to high-end refrigerator displays. + + +## Contents + + +``` +/test/xts +├── acts # Test code +│ └── subsystem # Source code of subsystem test cases for the standard system +│ └── subsystem_lite # Source code of subsystems test cases for mini and small systems +│ └── BUILD.gn # Build configuration of test cases for the standard system +│ └── build_lite +│ └── BUILD.gn # Build configuration of test cases for mini and small systems +└── tools # Test tool code +``` + + +## Constraints + +Test cases for the mini system must be developed based on C, and those for the small system must be developed based on C++. + + +## How to Use + +**Table 1** Case levels + +| Level| Basic Definition| Test Scope| +| -------- | -------- | -------- | +| Level0 | Smoke| Verifies basic functionalities of key features and basic DFX attributes with the most common input. The pass result indicates that the features are runnable.| +| Level1 | Basic| Verifies basic functionalities of key features and basic DFX attributes with common input. The pass result indicates that the features are testable.| +| Level2 | Major| Verifies basic functionalities of key features and basic DFX attributes with common input and errors. The pass result indicates that the features are functional and ready for beta testing.| +| Level3 | Minor| Verifies functionalities of all key features, and all DFX attributes with common and uncommon input combinations or normal and abnormal preset conditions.| +| Level4 | Rare| Verifies functionalities of key features under extremely abnormal presets and uncommon input combinations.| + +**Table 2** Case scales + +| Case Scale| Test Object| Test Environment| +| -------- | -------- | -------- | +| LargeTest | Service functionalities, all-scenario features, and mechanical power environment (MPE) and scenario-level DFX| Devices close to real devices| +| MediumTest | Modules, subsystem functionalities after module integration, and DFX| Single device that is actually used. You can perform message simulation, but do not mock functions.| +| SmallTest | Modules, classes, and functions| Local PC. Use a large number of mocks to replace dependencies with other modules.| + +**Table 3** Test types + +| Test Type| Definition| +| -------- | -------- | +| Function | Tests the correctness of both service and platform functionalities provided by the tested object for end users or developers.| +| Performance | Tests the processing capability of the tested object under specific preset conditions and load models. The processing capability is measured by the service volume that can be processed in a unit time, for example, call per second, frame per second, or event processing volume per second.| +| Power | Tests the power consumption of the tested object in a certain period of time under specific preset conditions and load models.| +| Reliability | Tests the service performance of the tested object under common and uncommon input conditions, or specified service volume pressure and long-term continuous running pressure. The test covers stability, pressure handling, fault injection, and Monkey test items.| +| Security | Tests the capability of defending against security threats, including but not limited to unauthorized access, use, disclosure, damage, modification, and destruction, to ensure information confidentiality, integrity, and availability. Tests the privacy protection capability to ensure that the collection, use, retention, disclosure, and disposal of users' private data comply with laws and regulations. Tests the compliance with various security specifications, such as security design, security requirements, and security certification of the Ministry of Industry and Information Technology (MIIT).| +| Global | Tests the internationalized data and localization capabilities of the tested object, including multi-language display, various input/output habits, time formats, and regional features, such as currency, time, and culture taboos.| +| Compatibility | Tests backward compatibility of an application with its own data, the forward and backward compatibility with the system, and the compatibility with different user data, such as audio file content of the player and smart SMS messages. Tests system backward compatibility with its own data and the compatibility of common applications in the ecosystem. Tests software compatibility with related hardware.| +| User | Tests user experience of the object in real user scenarios. All conclusions and comments should come from the users, which are all subjective evaluation in this case.| +| Standard | Tests the compliance with industry and company-specific standards, protocols, and specifications. The standards here do not include any security standards that should be classified into the security test.| +| Safety | Tests the safety property of the tested object to avoid possible hazards to personal safety, health, and the object itself.| +| Resilience | Tests the resilience property of the tested object to ensure that it can withstand and maintain the defined running status (including downgrading) when being attacked, and recover from and adapt defense to the attacks to approach mission assurance.| + + +## Test Case Development Guide + +You should select the appropriate programming language and your target test framework to develop test cases. + +**Table 4** Test frameworks and test case languages for different systems + +| System| Test Framework| Language| +| -------- | -------- | -------- | +| Mini system| hctest | c | +| Small system| hcpptest | c++ | +| Standard system| HJSUnit and HCPPTest| JavaScript and C++| + +### C-based Test Case Development and Compilation (for the Mini System) + +**Developing test cases for the mini system** + +The HCTest framework is used to support test cases developed with the C language. HCTest is enhanced and adapted based on the open-source test framework Unity. + +1. Access the **test/xts/acts** repository where the test cases will be stored. + + ``` + ├── acts + │ └──subsystem_lite + │ │ └── module_hal + │ │ │ └── BUILD.gn + │ │ │ └── src + │ └──build_lite + │ │ └── BUILD.gn + ``` + +2. Write the test case in the **src** directory. + + 1. Import the test framework header file. + + ``` + #include "hctest.h" + ``` + + 2. Use the **LITE_TEST_SUIT** macro to define names of the subsystem, module, and test suite. + + + ``` + /** + * @brief register a test suite named "IntTestSuite" + * @param test subsystem name + * @param example module name + * @param IntTestSuite test suite name + */ + LITE_TEST_SUIT(test, example, IntTestSuite); + ``` + + 3. Define SetUp and TearDown. + + Format: Test suite name+SetUp, Test suite name+TearDown. + + The SetUp and TearDown functions must exist, but function bodies can be empty. + + 4. Use the **LITE_TEST_CASE** macro to write the test case. + + Three parameters are involved: test suite name, test case name, and test case properties (including type, granularity, and level). + ``` + LITE_TEST_CASE(IntTestSuite, TestCase001, Function | MediumTest | Level1) + { + //do something + }; + ``` + 5. Use the **RUN_TEST_SUITE** macro to register the test suite. + + + ``` + RUN_TEST_SUITE(IntTestSuite); + ``` + +3. Create a configuration file (**BUILD.gn**) of the test module. + Create a **BUILD.gn** (example) build file in each test module directory. Specify the name of the built static library and its dependent header file and library in the build file. The format is as follows: + + + ``` + import("//test/xts/tools/lite/build/suite_lite.gni") + hctest_suite("ActsDemoTest") { + suite_name = "acts" + sources = [ + "src/test_demo.c", + ] + include_dirs = [ ] + cflags = [ "-Wno-error" ] + } + ``` + +4. Add build options to the **BUILD.gn** file in the **acts** directory. + You need to add the test module to the **test/xts/acts/build_lite/BUILD.gn** script in the **acts** directory. + + + ``` + lite_component("acts") { + ... + if(board_name == "liteos_m") { + features += [ + ... + "//xts/acts/subsystem_lite/module_hal:ActsDemoTest" + ] + } + } + ``` + +5. Run build commands. + Test suites are built along with the version build. The ACTS is built together with the debug version. + + > **NOTE** + > The ACTS build middleware is a static library, which will be linked to the image. + +### C-based Test Case Execution (for the Mini System) + +**Executing test cases for the mini system** + +Burn the image into the development board. + +**Executing the test** + +1. Use a serial port tool to log in to the development board and save information about the serial port. + +2. Restart the device and view serial port logs. + +**Analyzing the test result** + +View the serial port logs, whose format is as follows: + +The log for each test suite starts with **Start to run test suite:** and ends with **xx Tests xx Failures xx Ignored**. + + +### C++-based Test Case Development and Compilation (for Standard and Small Systems) + +**Developing test cases for small-system devices** (For examples of the standard system, go to the **global/i18n_standard** directory.) + +The HCPPTest framework is enhanced and adapted based on the open-source framework Googletest. + +1. Access the **test/xts/acts** repository where the test cases will be stored. + + ``` + ├── acts + │ └──subsystem_lite + │ │ └── module_posix + │ │ │ └── BUILD.gn + │ │ │ └── src + │ └──build_lite + │ │ └── BUILD.gn + ``` + +2. Write the test case in the **src** directory. + 1. Import the test framework header file. + + The following statement includes **gtest.h**: + + + ``` + #include "gtest/gtest.h" + ``` + + 2. Define SetUp and TearDown. + + + ``` + using namespace std; + using namespace testing::ext; + class TestSuite: public testing::Test { + protected: + // Preset action of the test suite, which is executed before the first test case + static void SetUpTestCase(void){ + } + // Test suite cleanup action, which is executed after the last test case + static void TearDownTestCase(void){ + } + // Preset action of the test case + virtual void SetUp() + { + } + // Cleanup action of the test case + virtual void TearDown() + { + } + }; + ``` + + 3. Use the **HWTEST** or **HWTEST_F** macro to write the test case. + + **HWTEST**: definition of common test cases, including the test suite name, test case name, and case annotation. + + **HWTEST_F**: definition of SetUp and TearDown test cases, including the test suite name, test case name, and case annotation. + + Three parameters are involved: test suite name, test case name, and test case properties (including type, granularity, and level). + + + ``` + HWTEST_F(TestSuite, TestCase_0001, Function | MediumTest | Level1) { + // do something + } + ``` + +3. Create a configuration file (**BUILD.gn**) of the test module. + Create a **BUILD.gn** build file in each test module directory. Specify the name of the built static library and its dependent header file and library in the build file. Each test module is independently built into a **.bin** executable file, which can be directly pushed to the development board for testing. + + Example: + + ``` + import("//test/xts/tools/lite/build/suite_lite.gni") + hcpptest_suite("ActsDemoTest") { + suite_name = "acts" + sources = [ + "src/TestDemo.cpp" + ] + + include_dirs = [ + "src", + ... + ] + deps = [ + ... + ] + cflags = [ "-Wno-error" ] + } + + ``` + +4. Add build options to the **BUILD.gn** file in the **acts** directory. + Add the test module to the **test/xts/acts/build_lite/BUILD.gn** script in the **acts** directory. + + + ``` + lite_component("acts") { + ... + else if(board_name == "liteos_a") { + features += [ + ... + "//xts/acts/subsystem_lite/module_posix:ActsDemoTest" + ] + } + } + ``` + +5. Run build commands. + Test suites are built along with the version build. The ACTS is built together with the debug version. + > **NOTE** + > + > The ACTS for the small system is independently built to an executable file (.bin) and archived in the **suites\acts** directory of the build result. + + +### C++-based Test Case Execution (for Standard and Small Systems) + +**Executing test cases for the small system** + +Currently, test cases are shared by the NFS and mounted to the development board for execution. + +**Setting up the environment** + +1. Use a network cable or wireless network to connect the development board to your PC. + +2. Configure the IP address, subnet mask, and gateway for the development board. Ensure that the development board and the PC are on the same network segment. + +3. Install and register the NFS server on the PC and start the NFS service. + +4. Run the **mount** command for the development board to ensure that the development board can access NFS shared files on the PC. + Format: **mount** *NFS server IP address***:/***NFS shared directory* **/***development board directory* **nfs** + + Example: + + ``` + mount 192.168.1.10:/nfs /nfs nfs + ``` + +**Executing test cases** + +Execute **ActsDemoTest.bin** to trigger test case execution, and analyze serial port logs generated after the execution is complete. + +### JavaScript-based Test Case Development (for the Standard System) + +The HJSUnit framework is used to support automated tests of OpenHarmony applications that are developed using the JavaScript language based on the JS application framework. + +**Basic syntax of test cases** + +The test cases are developed with the JavaScript language and must meet the programming specifications of the language. + +**Table 7** Basic syntax of test cases + +| Syntax| Description| Requirement| +| -------- | -------- | -------- | +| beforeAll | Presets a test-suite-level action executed only once before all test cases are executed. You can pass the action function as the only parameter.| Optional| +| afterAll | Presets a test-suite-level clear action executed only once after all test cases are executed. You can pass the clear function as the only parameter.| Optional| +| beforeEach | Presets a test-case-level action executed before each test case is executed. The number of execution times is the same as the number of test cases defined by **it**. You can pass the action function as the only parameter.| Optional| +| afterEach | Presets a test-case-level clear action executed after each test case is executed. The number of execution times is the same as the number of test cases defined by **it**. You can pass the clear function as the only parameter.| Optional| +| describe | Defines a test suite. You can pass two parameters: test suite name and test suite function. **describe** supports embedding. **beforeAll**, **beforeEach**, **afterEach**, and **afterAll** can be defined in each **describe**.| Mandatory| +| it | Defines a test case. You can pass three parameters: test case name, filter parameter, and test case function.
    **NOTE**
    **Filter parameter**: The filter parameter is a 32-bit parameter of the **Int** type. **1** of bit 0 indicates not to filter. **1** of bits 0-10 indicates the test case type. **1** of bits 16-18 indicates the test case scale. **1** of bits 24-28 indicates the test level.
    **Test case type**: Bits 0-10 indicate the following respectively: FUNCTION test, PERFORMANCE test, POWER test, RELIABILITY test, SECURITY test, GLOBAL test, COMPATIBILITY test, USER test, STANDARD test, SAFETY test, and RESILIENCE test.
    **Test case scale**: Bits 16-18 indicate the following respectively: SMALL test, MEDIUM test, and LARGE test.
    **Test level**: Bits 24-28 indicate the following respectively: LEVEL0-0 test, LEVEL1-1 test, LEVEL2-2 test, LEVEL3-3 test, and LEVEL4-4 test.| Mandatory| + +Use the standard syntax of Jasmine to write test cases. The ES6 specification is supported. + +1. Store the test cases in the **entry/src/main/js/test** directory, whose structure is as follows: + + ``` + ├── BUILD.gn + │ └──entry + │ │ └──src + │ │ │ └──main + │ │ │ │ └──js + │ │ │ │ │ └──default + │ │ │ │ │ │ └──pages + │ │ │ │ │ │ │ └──index + │ │ │ │ │ │ │ │ └──index.js # Entry file + │ │ │ │ │ └──test # Test code + │ │ │ └── resources # HAP resources + │ │ │ └── config.json # HAP configuration file + ``` + +2. Start the JS test framework and load test cases. The following is an example for **index.js**: + + ``` + // Start the JS test framework and load test cases. + import {Core, ExpectExtend} from 'deccjsunit/index' + + export default { + data: { + title: "" + }, + onInit() { + this.title = this.$t('strings.world'); + }, + onShow() { + console.info('onShow finish') + const core = Core.getInstance() + const expectExtend = new ExpectExtend({ + 'id': 'extend' + }) + core.addService('expect', expectExtend) + core.init() + const configService = core.getDefaultService('config') + configService.setConfig(this) + require('../../../test/List.test') + core.execute() + }, + onReady() { + }, + } + ``` + +3. Write a unit test case by referring to the following example: + + ``` + // Use HJSUnit to perform the unit test. + describe('appInfoTest', function () { + it('app_info_test_001', 0, function () { + var info = app.getInfo() + expect(info.versionName).assertEqual('1.0') + expect(info.versionCode).assertEqual('3') + }) + }) + ``` + +### JavaScript-based Test Case Packaging (for the Standard System) + +For details about HAP package compilation, see [JS application development guide for the standard system](https://developer.harmonyos.com/en/docs/documentation/doc-guides/build_overview-0000001055075201). + + +## Full Compilation (for the Standard System) + +1. Perform full compilation. + Command: + + + ``` + ./build.sh suite=acts system_size=standard + ``` + + Test case output directory: **out/release/suites/acts/testcases** + + Test framework and case output directory: **out/release/suites/acts** (The test suite execution framework is compiled during case compilation.) + + +## Full Test Case Execution (for Small and Standard Systems) + +**Setting up a test environment** + +Install Python 3.7 or a later version on a Windows environment and ensure that the Windows environment is properly connected to the test device. + +**Test execution directory** (corresponding to the **out/release/suites/acts** directory generated during compilation) + +``` +├── testcase # Directory for storing test suite files +│ └──xxx.hap # HAP file executed by the test suite +│ └──xxx.json # Execution configuration file of the test suite +├── tools # Test framework tool directory +├── run.bat # File for starting the test suite on the Windows platform +├── report # Directory for storing the test reports +``` + +**Executing test cases** + +1. On the Windows environment, locate the directory in which the test cases are stored (**out/release/suites/acts**, copied from the Linux server), go to the directory in the Windows command line interface (CLI), and run **acts\run.bat**. + +2. Enter the command for executing the test case. + - Execute all test cases. + + ``` + run acts + ``` + + **Figure 1** Running process + + ![en-us_image_0000001200230833](figures/en-us_image_0000001200230833.gif) + + - Execute the test cases of a module (view specific module information in **\acts\testcases\**). + + ``` + run –l ActsSamgrTest + ``` + + **Figure 2** Viewing the running command + + ![en-us_image_0000001154351160](figures/en-us_image_0000001154351160.jpg) + + Wait until the execution is complete. + +3. View test reports. + Go to **acts\reports\**, obtain the current execution record, and open **summary_report.html** to view the test report. diff --git a/en/device-dev/driver/Readme-EN.md b/en/device-dev/driver/Readme-EN.md index 82740883af..37a5a50778 100644 --- a/en/device-dev/driver/Readme-EN.md +++ b/en/device-dev/driver/Readme-EN.md @@ -4,6 +4,7 @@ - HDF - [HDF Overview](driver-hdf-overview.md) - [Driver Development](driver-hdf-development.md) + - [Driver Loading](driver-hdf-load.md) - [Driver Service Management](driver-hdf-servicemanage.md) - [Driver Message Mechanism Management](driver-hdf-message-management.md) - [Driver Configuration Management](driver-hdf-manage.md) diff --git a/en/device-dev/driver/driver-hdf-development.md b/en/device-dev/driver/driver-hdf-development.md index 306da57b83..e251299eb0 100644 --- a/en/device-dev/driver/driver-hdf-development.md +++ b/en/device-dev/driver/driver-hdf-development.md @@ -3,9 +3,9 @@ ## Driver Model -The Hardware Driver Foundation (HDF) is designed upon a component-based driver model. This model enables refined driver management and streamlines driver development and deployment. In the HDF, the same type of device drivers are placed in a host. You can develop and deploy the drivers separately. One driver can have multiple nodes. +The Hardware Driver Foundation (HDF) is designed based on a modular driver model to enable refined driver management and streamline driver development and deployment. The HDF allows the same type of device drivers to be placed in a host. The host manages the start and loading of a group of devices. You can deploy dependent drivers to the same host, and deploy independent drivers to different hosts. -The figure below shows the HDF driver model. +The figure below shows the HDF driver model. A device refers to a physical device. A DeviceNode is a component of a device. A device has at least one DeviceNode. Each DeviceNode can publish a device service. Each DevicdNode has a unique driver to interact with the hardware. **Figure 1** HDF driver model @@ -14,17 +14,15 @@ The figure below shows the HDF driver model. ## How to Develop -The HDF-based driver development process involves driver implementation, build, and configuration. The procedure is as follows: +The HDF-based driver development involves driver implementation, write of the driver compilation script, and driver configuration. The procedure is as follows: 1. Implement a driver. Write the driver code and register the driver entry with the HDF. - - Write the driver service code. + - Write the driver service code.
    The following is an example: - The following is an example: - - ``` + ```c #include "hdf_device_desc.h" // Header file that defines the driver development APIs provided by the HDF. #include "hdf_log.h" // Header file that defines the log APIs provided by the HDF. @@ -34,14 +32,14 @@ The HDF-based driver development process involves driver implementation, build, int32_t HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) { HDF_LOGD("Sample driver bind success"); - return 0; + return HDF_SUCCESS; } // Initialize the driver service. int32_t HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) { HDF_LOGD("Sample driver Init success"); - return 0; + return HDF_SUCCESS; } // Release the driver resources. @@ -51,10 +49,9 @@ The HDF-based driver development process involves driver implementation, build, return; } ``` - - Register the driver entry with the HDF. - ``` + ```c // Define a driver entry object. It must be a global variable of the HdfDriverEntry type (defined in hdf_device_desc.h). struct HdfDriverEntry g_sampleDriverEntry = { .moduleVersion = 1, @@ -64,36 +61,36 @@ The HDF-based driver development process involves driver implementation, build, .Release = HdfSampleDriverRelease, }; - // Call HDF_INIT to register the driver entry with the HDF. When loading the driver, the HDF calls the Bind() function and then the Init() function. If the Init() function fails to be called, the HDF will call Release() to release driver resources and exit the driver model. + // Call HDF_INIT to register the driver entry with the HDF. When loading the driver, the HDF calls Bind() and then Init(). If Init() fails to be called, the HDF will call Release() to release driver resources and exit the driver model. HDF_INIT(g_sampleDriverEntry); ``` -2. Build the driver. +2. Write the driver compilation script. - LiteOS - Modify **Makefile** and **BUILD.gn** files. + Modify **makefile** and **BUILD.gn** files. - **Makefile**: - Use the **Makefile** template provided by the HDF to compile the driver code. + Use the **makefile** template provided by the HDF to compile the driver code. - ``` - include $(LITEOSTOPDIR)/../../drivers/adapter/khdf/liteos/lite.mk # (Mandatory) Import the HDF predefined content. + ```c + include $(LITEOSTOPDIR)/../../drivers/hdf_core/adapter/khdf/liteos/lite.mk # (Mandatory) Import the HDF predefined content. MODULE_NAME := # File to be generated. LOCAL_INCLUDE: = # Directory of the driver header files. LOCAL_SRCS : = # Source code files of the driver. LOCAL_CFLAGS : = # Custom build options. - include $(HDF_DRIVER) # Import the Makefile template to complete the build. + include $(HDF_DRIVER) # Import the makefile template to complete the build. ``` - Add the path of the generated file to **hdf_lite.mk** in the **drivers/adapter/khdf/liteos** directory to link the file to the kernel image. The following is an example: + Add the path of the generated file to **hdf_lite.mk** in the **drivers/hdf_core/adapter/khdf/liteos** directory to link the file to the kernel image.
    The following is an example: - ``` + ```c LITEOS_BASELIB += -lxxx # Static library generated by the link. - LIB_SUBDIRS += # Directory in which Makefile is located. + LIB_SUBDIRS += # Directory in which makefile is located. ``` - **BUILD.gn**: @@ -101,9 +98,9 @@ The HDF-based driver development process involves driver implementation, build, Add **BUILD.gn**. The content of **BUILD.gn** is as follows: - ``` + ```c import("//build/lite/config/component/lite_component.gni") - import("//drivers/adapter/khdf/liteos/hdf.gni") + import("//drivers/hdf_core/adapter/khdf/liteos/hdf.gni") module_switch = defined(LOSCFG_DRIVERS_HDF_xxx) module_name = "xxx" hdf_driver(module_name) { @@ -114,42 +111,42 @@ The HDF-based driver development process involves driver implementation, build, } config("public") { # Define the head file configuration of the dependencies. include_dirs = [ - "xxx/xxx/xxx", # Directory of dependency header files. + "xxx/xxx/xxx", # Directory of dependency header files. ] } ``` - Add the **BUILD.gn** directory to **/drivers/adapter/khdf/liteos/BUILD.gn**. + Add the **BUILD.gn** directory to **/drivers/hdf_core/adapter/khdf/liteos/BUILD.gn**. - ``` + ```c group("liteos") { public_deps = [ ":$module_name" ] deps = [ - "xxx/xxx", # Directory where the BUILD.gn of the driver is located. It is a relative path to /drivers/adapter/khdf/liteos. + "xxx/xxx", # Directory where the BUILD.gn of the driver is located. It is a relative path to /drivers/hdf_core/adapter/khdf/liteos. ] } ``` - Linux - To define the driver control macro, add the **Kconfig** file to the driver directory **xxx** and add the path of the **Kconfig** file to **drivers/adapter/khdf/linux/Kconfig**. + To define the driver control macro, add the **Kconfig** file to the driver directory **xxx** and add the path of the **Kconfig** file to **drivers/hdf_core/adapter/khdf/linux/Kconfig**. - ``` + ```c source "drivers/hdf/khdf/xxx/Kconfig" # Kernel directory to which the HDF module is soft linked. ``` - Add the driver directory to **drivers/adapter/khdf/linux/Makefile**. + Add the driver directory to **drivers/hdf_core/adapter/khdf/linux/Makefile**. - ``` + ```c obj-$(CONFIG_DRIVERS_HDF) += xxx/ ``` Add a **Makefile** to the driver directory **xxx** and add code compiling rules of the driver to the **Makefile** file. - ``` + ```c obj-y += xxx.o ``` @@ -161,16 +158,14 @@ The HDF-based driver development process involves driver implementation, build, - (Mandatory) Set driver device information. - The HDF loads a driver based on the driver device description defined by the HDF. Therefore, the driver device description must be added to the **device_info.hcs** file defined by the HDF. + The HDF loads a driver based on the driver device description defined by the HDF. Therefore, the driver device description must be added to the **device_info.hcs** file defined by the HDF.
    The following is an example: - The following is an example: - ``` root { device_info { match_attr = "hdf_manager"; - template host { // Host template. If a node (for example, sample_host) uses the default values in this template, the node fields can be omitted. + template host { // Host template. If a node (for example, sample_host) uses the default values in this template, the node fields can be omitted. hostName = ""; priority = 100; uid = ""; // User ID (UID) of the user-mode process. It is left empty by default. If you do not set the value, this parameter will be set to the value of hostName, which indicates a common user. @@ -191,14 +186,14 @@ The HDF-based driver development process involves driver implementation, build, sample_host :: host{ hostName = "host0"; // Host name. The host node is used as a container to hold a type of drivers. priority = 100; // Host startup priority (0-200). A smaller value indicates a higher priority. The default value 100 is recommended. The hosts with the same priority start based on the time when the priority was configured. The host configured first starts first. - caps = ["DAC_OVERRIDE", "DAC_READ_SEARCH"]; // Linux capabilities of the user-mode process. + caps = ["DAC_OVERRIDE", "DAC_READ_SEARCH"]; // Linux capabilities of a user-mode process. device_sample :: device { // Sample device node. device0 :: deviceNode { // DeviceNode of the sample driver. policy = 1; // Policy for publishing the driver service. For details, see Driver Service Management. priority = 100; // Driver startup priority (0-200). A smaller value indicates a higher priority. The default value 100 is recommended. The drivers with the same priority start based on the time when the priority was configured. The driver configured first starts first. - preload = 0; // The driver is loaded on demand. For details, see "NOTE" at the end of this document. - permission = 0664; // Permission for the driver to create a device node. - moduleName = "sample_driver"; // Driver name. The value of this field must be the same as that of moduleName in the HdfDriverEntry structure. + preload = 0; // The value 0 means to load the driver by default during the startup of the system. + permission = 0664; // Permission for the DeviceNode created. + moduleName = "sample_driver"; // Driver name. The value must be the same as that of moduleName in the HdfDriverEntry structure. serviceName = "sample_service"; // Name of the service published by the driver. The service name must be unique. deviceMatchAttr = "sample_config"; // Keyword for matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. } @@ -218,59 +213,30 @@ The HDF-based driver development process involves driver implementation, build, > > - The process UIDs are configured in **base/startup/init_lite/services/etc/passwd**, and the process GIDs are configured in **base/startup/init_lite/services/etc/group**. For details, see [Adding a System Service User Group]( https://gitee.com/openharmony/startup_init_lite/wikis). > - > - If CAP_DAC_OVERRIDE needs to be configured for a service module, enter **caps = ["DAC_OVERRIDE"]** instead of **caps = ["CAP_DAC_OVERRIDE"]**. + > - The **caps** value is in the caps = ["xxx"] format. To configure **CAP_DAC_OVERRIDE**, set this parameter to **caps = ["DAC_OVERRIDE"]**. Do not set it to **caps = ["CAP_DAC_OVERRIDE"]**. + > + > - **preload** specifies the driver loading policy. For details, see [Driver Loading](../driver/driver-hdf-load.md). - (Optional) Set driver private information. - If the driver has private configuration, add a driver configuration file to set default driver configuration. When loading the driver, the HDF obtains and saves the driver private information in **property** of **HdfDeviceObject**, and passes the information to the driver using **Bind()** and **Init()** (see step 1). + If the driver has private configuration, add a driver configuration file to set default driver configuration. When loading the driver, the HDF obtains and saves the driver private information in **property** of **HdfDeviceObject**, and passes the information to the driver using **Bind()** and **Init()** (see step 1).
    The following is an example of the driver configuration: - The following is an example of the driver private configuration: - ``` - root { + ``` + root { SampleDriverConfig { sample_version = 1; sample_bus = "I2C_0"; match_attr = "sample_config"; // The value must be the same as that of deviceMatchAttr in device_info.hcs. } } - ``` - - After the configuration, add the configuration file to the board-level configuration entry file **hdf.hcs**. (You can use DevEco to perform one-click configuration. For details, see the description about the driver development suite.) - - The following is an example: - - ``` - #include "device_info/device_info.hcs" - #include "sample/sample_config.hcs" - ``` - - + ``` + + Add the configuration file to the **hdf.hcs** file.
    The following is an example: -​ - - -> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    -> Drivers can be loaded on demand or in sequence. -> -> - On-demand loading -> -> ``` -> typedef enum { -> DEVICE_PRELOAD_ENABLE = 0, -> DEVICE_PRELOAD_ENABLE_STEP2, -> DEVICE_PRELOAD_DISABLE, -> DEVICE_PRELOAD_INVALID -> } DevicePreload; -> ``` -> -> - If **preload** in the configuration file is set to **0** (**DEVICE_PRELOAD_ENABLE**), the driver is loaded by default during the system boot process. -> -> - If **preload** is set to **1** (**DEVICE_PRELOAD_ENABLE_STEP2**), the driver is loaded after a quick start is complete. If the system does not support quick start, the value **1** has the same meaning as **DEVICE_PRELOAD_ENABLE**. -> -> - If **preload** is set to **2** (**DEVICE_PRELOAD_DISABLE**), the driver service is dynamically loaded. When a user-mode process requests the driver service, the HDF attempts to dynamically load the driver if the driver service is not available. > For more details, see [Driver Messaging Mechanism](../driver/driver-hdf-message-management.md). -> -> - Sequential loading (**preload** set to **0 (DEVICE_PRELOAD_ENABLE)**) -> -> In the configuration file, the **priority** field (ranging from 0 to 200) determines the loading sequence of a host and a driver. For drivers in different hosts, a smaller host priority value indicates a higher driver loading priority; for drivers in the same host, a smaller driver priority value indicates a higher driver loading priority. + + ``` + #include "device_info/device_info.hcs" + #include "sample/sample_config.hcs" + ``` diff --git a/en/device-dev/driver/driver-hdf-load.md b/en/device-dev/driver/driver-hdf-load.md new file mode 100644 index 0000000000..8c99bf1088 --- /dev/null +++ b/en/device-dev/driver/driver-hdf-load.md @@ -0,0 +1,30 @@ +# Driver Loading + +## Overview + +The HDF loads the drivers that match the configured device list. + +## Driver Loading Policies + +The HDF supports on-demand loading and sequential loading of drivers. The **preload** field in the configuration file (see [Driver Development](../driver/driver-hdf-development.md)) specifies the loading policy of a driver. The values are as follows: + +```c +typedef enum { + DEVICE_PRELOAD_ENABLE = 0, + DEVICE_PRELOAD_ENABLE_STEP2 = 1, + DEVICE_PRELOAD_DISABLE = 2, + DEVICE_PRELOAD_INVALID +} DevicePreload; +``` + +### On-Demand Loading + +- The value **0** (**DEVICE_PRELOAD_ENABLE**) means to load the driver by default during the system boot process. + +- The value **1** (**DEVICE_PRELOAD_ENABLE_STEP2**) means to load the driver after a quick start is complete. If the system does not support quick start, the value **1** has the same meaning as **DEVICE_PRELOAD_ENABLE**. + +- The value **2** (**DEVICE_PRELOAD_DISABLE**) means to load the driver dynamically. When a user-mode process requests the driver service, the HDF attempts to dynamically load the driver if the driver service is not available. For more details, see [Driver Messaging Mechanism](../driver/driver-hdf-message-management.md). + +### Sequential Loading (Default) + +The **priority** field (ranging from 0 to 200) in the configuration file determines the loading sequence of a host and a driver. For the drivers in different hosts, the drivers in the host with a smaller priority value are loaded first. For the drivers in the same host, the driver with a smaller priority value is loaded first. diff --git a/en/device-dev/driver/driver-hdf-manage.md b/en/device-dev/driver/driver-hdf-manage.md index 938fe06a0c..791d863ef9 100644 --- a/en/device-dev/driver/driver-hdf-manage.md +++ b/en/device-dev/driver/driver-hdf-manage.md @@ -3,7 +3,7 @@ ## HDF Configuration Overview -HDF Configuration Source (HCS) is the source code that describes the HDF configuration in key-value pairs. It decouples the configuration code from driver code, simplifying configuration management. +HDF Configuration Source (HCS) provides the source code that describes the HDF configuration in key-value pairs. It decouples the configuration code from driver code, thereby facilitating configuration management. HDF Configuration Generator (HC-GEN) is a tool for converting an HDF configuration file into a file that can be read by the software. @@ -31,24 +31,24 @@ The table below describes the keywords used in the HCS syntax. **Table 1** Keywords used in HCS syntax -| Keyword| Description| Remarks| +| Keyword| Description| Remarks| | -------- | -------- | -------- | -| root | Sets the root node.| - | -| include | References other HCS files.| - | -| delete | Deletes a node or an attribute.| Applicable only to the configuration tree referenced by **include**.| -| template | Defines a template node.| - | -| match_attr | Marks the node attribute for matching.| During configuration parsing, the attribute value can be used to locate the corresponding node.| +| root | Sets the root node.| - | +| include | References other HCS files.| - | +| delete | Deletes a node or an attribute.| Applicable only to the configuration tree referenced by **include**.| +| template | Defines a template node.| - | +| match_attr | Marks the node attribute for matching.| When parsing the configuration, the driver can use the attribute value as a parameter to call an API to locate the node that has this attribute. | ### Basic Structures The HCS has two structures: attribute and node. -**Attribute** +Attribute An attribute is the minimum, independent configuration unit. The syntax is as follows: - + ``` attribute_name = value; ``` @@ -57,7 +57,7 @@ An attribute is the minimum, independent configuration unit. The syntax is as fo - The **value** can be in any of the following formats: - - A binary, octal, decimal, or hexadecimal integer. For details, see the **Data Types** section. + - A binary, octal, decimal, or hexadecimal integer. For details, see [Data Types](#data-types). - String quoted by double quotation marks (""). - Node reference. @@ -67,7 +67,7 @@ An attribute is the minimum, independent configuration unit. The syntax is as fo A node is a set of attributes. The syntax is as follows: - + ``` node_name { module = "sample"; @@ -97,7 +97,7 @@ Attributes automatically use built-in data types, including integer, string, arr - Octal: prefixed with **0**, for example, **0664**. -- Decimal: signed or unsigned, without prefix, for example, **1024** or **+1024**. Negative integers can be read only via signed interfaces. +- Decimal: signed or unsigned, without prefix, for example, **1024** or **+1024**. Negative integers can be read only via APIs with signed numbers. - Hexadecimal: prefixed with **0x**, for example, **0xff00** and **0xFF**. @@ -109,13 +109,13 @@ A string is enclosed in double quotation marks (""). An array can hold either integers or strings, but not a mixture of them. The mixed use of **uint32_t** and **uint64_t** in an integer array will cause typecasting to **uint64**. The following is an example of an integer array and a string array: - + ``` attr_foo = [0x01, 0x02, 0x03, 0x04]; attr_bar = ["hello", "world"]; ``` -**Boolean** +Boolean Boolean data type is a form of data with only two possible values: **true** and **false**. @@ -126,7 +126,7 @@ Boolean data type is a form of data with only two possible values: **true** and The keyword **include** is used to import other HCS files. The syntax is as follows: - + ``` #include "foo.hcs" #include "../bar.hcs" @@ -143,14 +143,14 @@ The following two comment formats are supported: - Single-line comment - + ``` // comment ``` - Multi-line comment - + ``` /* comment @@ -165,13 +165,13 @@ The following two comment formats are supported: You can reference the content of a node to modify the content of another node. The syntax is as follows: - + ``` node :& source_node ``` In this statement, the content of **node** is referenced to modify the content of **source_node**. - + Example: ``` root { @@ -196,7 +196,7 @@ root { The configuration tree generated is as follows: - + ``` root { module = "sample"; @@ -222,7 +222,7 @@ In this example, the value of **bar.attr** is changed to **foo** by referencing You can replicate a node to define a node with similar content. The syntax is as follows: - + ``` node : source_node ``` @@ -230,7 +230,7 @@ You can replicate a node to define a node with similar content. The syntax is as This statement replicates the attributes of the **source_node** node to define **node**. Example: - + ``` root { module = "sample"; @@ -245,7 +245,7 @@ root { The configuration tree generated is as follows: - + ``` root { module = "sample"; @@ -269,7 +269,7 @@ You do not need to specify the path of the **foo** node if the **foo** node and You can use the keyword **delete** to delete unnecessary nodes or attributes from the base configuration tree imported by using the **include** keyword. The following example includes the configuration in **sample2.hcs** to **sample1.hcs** and deletes the **attribute2** attribute and the **foo_2** node. Example: - + ``` // sample2.hcs root { @@ -291,7 +291,7 @@ root { The configuration tree generated is as follows: - + ``` root { attr_1 = 0x1; @@ -306,7 +306,7 @@ root { You can associate an attribute and a node so that the node can be quickly located when the attribute is read during configuration parsing. The syntax is as follows: - + ``` attribute = &node; ``` @@ -314,7 +314,7 @@ You can associate an attribute and a node so that the node can be quickly locate In this statement, the value of **attribute** is a referenced to the node. During code parsing, you can quickly locate the node based on this **attribute**. Example: - + ``` node1 { attributes; @@ -324,9 +324,9 @@ node2 { } ``` -or +Or + - ``` node2 { node1 { @@ -344,7 +344,7 @@ The template is used to generate nodes with consistent syntax, thereby facilitat If a node is defined using the keyword **template**, its child nodes inherit from the node configuration through the double colon operator (::). The child nodes can modify or add but cannot delete attributes in **template**. The attributes not defined in the child nodes will use the attributes defined in **template** as the default values. Example: - + ``` root { module = "sample"; @@ -364,7 +364,7 @@ root { The configuration tree generated is as follows: - + ``` root { module = "sample"; @@ -382,7 +382,7 @@ root { In this example, the **bar** and **bar_1** nodes inherit from the **foo** node. The structure of the generated configuration tree is the same as that of the **foo** node, except that the attribute values are different. -## **Configuration Generation** +## Configuration Generation The HC-GEN tool checks the HCS configuration syntax and converts HCS source files into HCB files. @@ -391,7 +391,7 @@ The HC-GEN tool checks the HCS configuration syntax and converts HCS source file HC-GEN options: - + ``` Usage: hc-gen [Options] [File] options: @@ -410,28 +410,28 @@ options: Generate a .c or .h configuration file. - + ``` hc-gen -o [OutputCFileName] -t [SourceHcsFileName] ``` Generate an HCB file. - + ``` hc-gen -o [OutputHcbFileName] -b [SourceHcsFileName] ``` Generate a macro definition file. - + ``` hc-gen -o [OutputMacroFileName] -m [SourceHcsFileName] ``` Decompile an HCB file to an HCS file. - + ``` hc-gen -o [OutputHcsFileName] -d [SourceHcbFileName] ``` diff --git a/en/device-dev/driver/driver-hdf-message-management.md b/en/device-dev/driver/driver-hdf-message-management.md index 65ae4d200d..0efb9694a6 100644 --- a/en/device-dev/driver/driver-hdf-message-management.md +++ b/en/device-dev/driver/driver-hdf-message-management.md @@ -10,23 +10,23 @@ The HDF messaging mechanism implements the interaction between the user-mode app The messaging mechanism allows: -1. User-mode applications to send messages to drivers. +1. A user-mode application to send a message to a driver. -2. User-mode applications to receive events from drivers. +2. A user-mode application to receive events reported by a driver. **Table 1** APIs for the driver messaging mechanism | API| Description| | -------- | -------- | -| struct HdfIoService \*HdfIoServiceBind(const char \*serviceName); | Obtains a driver service. The **Dispatch()** method in the driver service obtained sends messages to the driver.| -| void HdfIoServiceRecycle(struct HdfIoService \*service); | Releases a driver service.| -| int HdfDeviceRegisterEventListener(struct HdfIoService \*target, struct HdfDevEventlistener \*listener); | Registers the method for receiving events reported by the driver.| -| int HdfDeviceSendEvent(struct HdfDeviceObject \*deviceObject, uint32_t id, struct HdfSBuf \*data); | Sends events. | +| struct HdfIoService \*HdfIoServiceBind(const char \*serviceName); | Obtains a driver service. After obtaining the driver service, the user-mode application uses **Dispatch()** in the driver service obtained to send messages to the driver.| +| void HdfIoServiceRecycle(struct HdfIoService \*service); | Releases a driver service.| +| int HdfDeviceRegisterEventListener(struct HdfIoService \*target, struct HdfDevEventlistener \*listener); | Registers the method for receiving events reported by the driver.| +| int HdfDeviceSendEvent(struct HdfDeviceObject \*deviceObject, uint32_t id, struct HdfSBuf \*data); | Sends events. | ## How to Develop -1. In the driver configuration, set **policy** to **2**. For more details, see [policy](../driver/driver-hdf-servicemanage.md). +1. In the driver configuration file, set **policy** to **2**. For more details, see [Driver Service Management](../driver/driver-hdf-servicemanage.md). ``` device_sample :: Device { @@ -35,23 +35,23 @@ The messaging mechanism allows: } ``` -2. Set the driver permission. By default, the **permission** field is set to **0666**, which allows the driver to create device nodes. You can set this field based on service requirements. +2. Set permissions for the device node of the driver. By default, the **permission** field is set to **0666**. You can set it based on service requirements. 3. Implement the **Dispatch()** method of **IDeviceIoService**. - ``` - // Dispatch messages sent from the user-mode application. - int32_t SampleDriverDispatch(struct HdfDeviceObject *device, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply) + ```c + // Dispatch() is used to process messages sent from the user-mode application. + int32_t SampleDriverDispatch(struct HdfDeviceIoClient *device, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply) { - HDF_LOGE("sample driver lite A dispatch"); - return 0; + HDF_LOGI("sample driver lite A dispatch"); + return HDF_SUCCESS; } int32_t SampleDriverBind(struct HdfDeviceObject *device) { - HDF_LOGE("test for lite os sample driver A Open!"); + HDF_LOGI("test for lite os sample driver A Open!"); if (device == NULL) { HDF_LOGE("test for lite os sample driver A Open failed!"); - return -1; + return HDF_FAILURE; } static struct ISampleDriverService sampleDriverA = { .ioService.Dispatch = SampleDriverDispatch, @@ -59,36 +59,36 @@ The messaging mechanism allows: .ServiceB = SampleDriverServiceB, }; device->service = (struct IDeviceIoService *)(&sampleDriverA); - return 0; + return HDF_SUCCESS; } ``` 4. Define the cmd type in the message processing function. - ``` + ```c #define SAMPLE_WRITE_READ 1 // Read and write operation 1 ``` -5. Bind the driver service and the user-mode application to enable messages to be sent to the driver. +5. Enable the user-mode application to obtain a service and send a message to the driver. - ``` + ```c int SendMsg(const char *testMsg) { if (testMsg == NULL) { HDF_LOGE("test msg is null"); - return -1; + return HDF_FAILURE; } struct HdfIoService *serv = HdfIoServiceBind("sample_driver"); if (serv == NULL) { HDF_LOGE("fail to get service"); - return -1; + return HDF_FAILURE; } - struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + struct HdfSBuf *data = HdfSbufObtainDefaultSize(); if (data == NULL) { HDF_LOGE("fail to obtain sbuf data"); - return -1; + return HDF_FAILURE; } - struct HdfSBuf *reply = HdfSBufObtainDefaultSize(); + struct HdfSBuf *reply = HdfSbufObtainDefaultSize(); if (reply == NULL) { HDF_LOGE("fail to obtain sbuf reply"); ret = HDF_DEV_ERR_NO_MEMORY; @@ -105,41 +105,41 @@ The messaging mechanism allows: goto out; } out: - HdfSBufRecycle(data); - HdfSBufRecycle(reply); + HdfSbufRecycle(data); + HdfSbbufRecycle(reply); HdfIoServiceRecycle(serv); return ret; } ``` 6. Enable the user-mode application to receive messages from the driver. - 1. Enable the driver to report events to the user-mode application. + 1. Implement the method for the user-mode application to process the events reported by the driver. - ``` + ```c static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) { OsalTimespec time; OsalGetTime(&time); - HDF_LOGE("%s received event at %llu.%llu", (char *)priv, time.sec, time.usec); + HDF_LOGI("%{public}s received event at %{public}llu.%{public}llu", (char *)priv, time.sec, time.usec); const char *string = HdfSbufReadString(data); if (string == NULL) { HDF_LOGE("fail to read string in event data"); - return -1; + return HDF_FAILURE; } - HDF_LOGE("%s: dev event received: %d %s", (char *)priv, id, string); - return 0; + HDF_LOGI("%{public}s: dev event received: %{public}d %{public}s", (char *)priv, id, string); + return HDF_SUCCESS; } ``` - 2. Register the method for receiving the messages from the driver. + 2. Register the method for the user-mode application to receive messages from the driver. - ``` + ```c int RegisterListen() { struct HdfIoService *serv = HdfIoServiceBind("sample_driver"); if (serv == NULL) { HDF_LOGE("fail to get service"); - return -1; + return HDF_FAILURE; } static struct HdfDevEventlistener listener = { .callBack = OnDevEventReceived, @@ -147,20 +147,20 @@ The messaging mechanism allows: }; if (HdfDeviceRegisterEventListener(serv, &listener) != 0) { HDF_LOGE("fail to register event listener"); - return -1; + return HDF_FAILURE; } ...... HdfDeviceUnregisterEventListener(serv, &listener); HdfIoServiceRecycle(serv); - return 0; + return HDF_SUCCESS; } ``` 3. Enable the driver to report events. - ``` - int32_t SampleDriverDispatch(struct HdfDeviceObject *device, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply) + ```c + int32_t SampleDriverDispatch(HdfDeviceIoClient *client, int cmdCode, struct HdfSBuf *data, struct HdfSBuf *reply) { - ... // Process the API call. - return HdfDeviceSendEvent(deviceObject, cmdCode, data); + // Process the API call. + return HdfDeviceSendEvent(client->device, cmdCode, data); } ``` diff --git a/en/device-dev/driver/driver-hdf-overview.md b/en/device-dev/driver/driver-hdf-overview.md index 451a190bc0..46991d127a 100644 --- a/en/device-dev/driver/driver-hdf-overview.md +++ b/en/device-dev/driver/driver-hdf-overview.md @@ -3,7 +3,7 @@ ## Introduction -The Hardware Driver Foundation (HDF) provides driver framework capabilities including driver loading, driver service management, and driver messaging mechanism. It strives to build a unified driver architecture platform to provide a more precise and efficient development environment, where you can perform one-time development for multi-device deployment. +The Hardware Driver Foundation (HDF) provides driver framework capabilities, such as driver loading, driver service management, driver messaging mechanism, and configuration management, for driver developers. It strives to provide a more precise and efficient driver development environment, where you can perform one-time development for multi-device deployment. ## Driver Loading @@ -12,18 +12,23 @@ The HDF supports the following loading modes: - On-demand loading - The driver is loaded by default during the operating system (OS) boot process or dynamically loaded after OS is started. + The HDF allows drivers to be loaded by default during the operating system (OS) boot process or dynamically loaded after the OS is started. - Sequential loading - The driver is loaded based on its priority during the OS boot process. + The HDF allows drivers to be loaded based on their priorities during the OS boot process. ## Driver Service Management -The HDF allows centralized management of driver services. You can obtain a driver service by using the API provided by the HDF. +The HDF supports centralized management of driver services. You can obtain a driver service by using the API provided by the HDF. -## Driver messaging mechanism +## Driver Messaging Mechanism The HDF provides a unified driver messaging mechanism, which allows messages to be exchanged between user-mode applications and kernel-mode drivers. + + +## Configuration Management + +HDF Configuration Source (HCS) provides the source code that describes the HDF configuration in key-value pairs. It decouples the configuration code from driver code, simplifying configuration management. diff --git a/en/device-dev/driver/driver-hdf-sample.md b/en/device-dev/driver/driver-hdf-sample.md index 29288f9746..8b3d31a230 100644 --- a/en/device-dev/driver/driver-hdf-sample.md +++ b/en/device-dev/driver/driver-hdf-sample.md @@ -51,7 +51,7 @@ root { Write the driver code based on the HDF. For more details, see [Driver Development](../driver/driver-hdf-development.md). -``` +```c #include #include #include @@ -59,34 +59,34 @@ Write the driver code based on the HDF. For more details, see [Driver Developmen #include "hdf_base.h" #include "hdf_device_desc.h" -#define HDF_LOG_TAG "sample_driver" +#define HDF_LOG_TAG sample_driver #define SAMPLE_WRITE_READ 123 -int32_t HdfSampleDriverDispatch( - struct HdfDeviceObject *deviceObject, int id, struct HdfSBuf *data, struct HdfSBuf *reply) +static int32_t HdfSampleDriverDispatch( + struct HdfDeviceIoClient *client, int id, struct HdfSBuf *data, struct HdfSBuf *reply) { - HDF_LOGE("%s: received cmd %d", __func__, id); + HDF_LOGI("%{public}s: received cmd %{public}d", __func__, id); if (id == SAMPLE_WRITE_READ) { const char *readData = HdfSbufReadString(data); if (readData != NULL) { - HDF_LOGE("%s: read data is: %s", __func__, readData); + HDF_LOGE("%{public}s: read data is: %{public}s", __func__, readData); } if (!HdfSbufWriteInt32(reply, INT32_MAX)) { - HDF_LOGE("%s: reply int32 fail", __func__); + HDF_LOGE("%{public}s: reply int32 fail", __func__); } - return HdfDeviceSendEvent(deviceObject, id, data); + return HdfDeviceSendEvent(client->device, id, data); } return HDF_FAILURE; } -void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) +static void HdfSampleDriverRelease(struct HdfDeviceObject *deviceObject) { // Release resources. return; } -int HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) +static int HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) { if (deviceObject == NULL) { return HDF_FAILURE; @@ -98,17 +98,17 @@ int HdfSampleDriverBind(struct HdfDeviceObject *deviceObject) return HDF_SUCCESS; } -int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) +static int HdfSampleDriverInit(struct HdfDeviceObject *deviceObject) { if (deviceObject == NULL) { - HDF_LOGE("%s::ptr is null!", __func__); + HDF_LOGE("%{public}s::ptr is null!", __func__); return HDF_FAILURE; } - HDF_LOGE("Sample driver Init success"); + HDF_LOGI("Sample driver Init success"); return HDF_SUCCESS; } -struct HdfDriverEntry g_sampleDriverEntry = { +static struct HdfDriverEntry g_sampleDriverEntry = { .moduleVersion = 1, .moduleName = "sample_driver", .Bind = HdfSampleDriverBind, @@ -122,10 +122,10 @@ HDF_INIT(g_sampleDriverEntry); ## Implementing Interaction Between the Application and the Driver -Write the code for interaction between the user-mode application and the driver. Place the code in the **drivers/adapter/uhdf** directory for compilation. For details about **build.gn**, see **drivers/framework/sample/platform/uart/dev/build.gn**. +Write the code for interaction between the user-mode application and the driver. Place the code in the **drivers/hdf_core/adapter/uhdf** directory for compilation. For details about **BUILD.gn**, see **drivers/hdf_core/framework/sample/platform/uart/dev/BUILD.gn**. -``` +```c #include #include #include @@ -134,7 +134,7 @@ Write the code for interaction between the user-mode application and the driver. #include "hdf_sbuf.h" #include "hdf_io_service_if.h" -#define HDF_LOG_TAG "sample_test" +#define HDF_LOG_TAG sample_test #define SAMPLE_SERVICE_NAME "sample_service" #define SAMPLE_WRITE_READ 123 @@ -149,7 +149,7 @@ static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) g_replyFlag = 1; return HDF_FAILURE; } - HDF_LOGE("%s: dev event received: %u %s", (char *)priv, id, string); + HDF_LOGI("%{public}s: dev event received: %{public}u %{public}s", (char *)priv, id, string); g_replyFlag = 1; return HDF_SUCCESS; } @@ -157,13 +157,13 @@ static int OnDevEventReceived(void *priv, uint32_t id, struct HdfSBuf *data) static int SendEvent(struct HdfIoService *serv, char *eventData) { int ret = 0; - struct HdfSBuf *data = HdfSBufObtainDefaultSize(); + struct HdfSBuf *data = HdfSbufObtainDefaultSize(); if (data == NULL) { HDF_LOGE("fail to obtain sbuf data"); return 1; } - struct HdfSBuf *reply = HdfSBufObtainDefaultSize(); + struct HdfSBuf *reply = HdfSbufObtainDefaultSize(); if (reply == NULL) { HDF_LOGE("fail to obtain sbuf reply"); ret = HDF_DEV_ERR_NO_MEMORY; @@ -188,10 +188,10 @@ static int SendEvent(struct HdfIoService *serv, char *eventData) ret = HDF_ERR_INVALID_OBJECT; goto out; } - HDF_LOGE("Get reply is: %d", replyData); + HDF_LOGI("Get reply is: %{public}d", replyData); out: - HdfSBufRecycle(data); - HdfSBufRecycle(reply); + HdfSbufRecycle(data); + HdfSbufRecycle(reply); return ret; } @@ -237,8 +237,8 @@ int main() > > deps = [ > -> "//drivers/adapter/uhdf/manager:hdf_core", +> "//drivers/hdf_core/adapter/uhdf/manager:hdf_core", > -> "//drivers/adapter/uhdf/posix:hdf_posix_osal", +> "//drivers/hdf_core/adapter/uhdf/posix:hdf_posix_osal", > > ] diff --git a/en/device-dev/driver/driver-hdf-servicemanage.md b/en/device-dev/driver/driver-hdf-servicemanage.md index 9cb526b98b..dc617206e0 100644 --- a/en/device-dev/driver/driver-hdf-servicemanage.md +++ b/en/device-dev/driver/driver-hdf-servicemanage.md @@ -7,8 +7,8 @@ Driver services are objects of capabilities provided by HDF driver devices to ex The HDF uses the **policy** field in the configuration file to define policies for a driver to provide services externally. The values this field are as follows: - -``` + +```c typedef enum { /* The driver does not provide services. */ SERVICE_POLICY_NONE = 0, @@ -28,7 +28,7 @@ typedef enum { ## When to Use -The driver service management capability can be used if the driver provides capabilities using APIs. +You can use the driver service management capability of the HDF when the driver needs to provide capabilities via APIs. ## Available APIs @@ -37,7 +37,7 @@ The table below describes the APIs for driver service management. **Table 1** APIs for driver service management -| API| Description| +| API| Description| | -------- | -------- | | int32_t (\*Bind)(struct HdfDeviceObject \*deviceObject) | Binds a service API to the HDF. You need to implement the **Bind()** function.| | const struct HdfObject \*DevSvcManagerClntGetService(const char \*svcName)| Obtains a driver service.| @@ -48,9 +48,9 @@ The table below describes the APIs for driver service management. The development procedure is as follows: -1. Define the services to be published by the driver. - - ``` +1. Define the service to be published by the driver. + + ```c // Define the driver service structure. struct ISampleDriverService { struct IDeviceIoService ioService; // The first member must be of the IDeviceIoService type. @@ -62,91 +62,87 @@ The development procedure is as follows: int32_t SampleDriverServiceA(void) { // You need to implement the service logic. - return 0; + return HDF_SUCCESS; } int32_t SampleDriverServiceB(uint32_t inputCode) { // You need to implement the service logic. - return 0; + return HDF_SUCCESS; } ``` -2. Bind the driver service to the HDF and implement the **Bind()** function in the **HdfDriverEntry** structure. +2. Bind the driver service. - ``` + Implement the **Bind** pointer function, for example, **SampleDriverBind**, in **HdfDriverEntry** to bind the driver service to the HDF. + + ```c int32_t SampleDriverBind(struct HdfDeviceObject *deviceObject) { // deviceObject is a pointer to the device object created by the HDF for each driver. The device object holds private device data and service APIs. if (deviceObject == NULL) { HDF_LOGE("Sample device object is null!"); - return -1; + return HDF_FAILURE; } static struct ISampleDriverService sampleDriverA = { .ServiceA = SampleDriverServiceA, .ServiceB = SampleDriverServiceB, }; deviceObject->service = &sampleDriverA.ioService; - return 0; + return HDF_SUCCESS; } ``` 3. Obtain the driver service. - The driver service can be obtained by using the API or subscription mechanism provided by the HDF. - - - Using the API + The driver service can be obtained by using either of the following methods: - Use the API provided by the HDF to obtain the driver service if the driver has been loaded. + - Using the API provided by the HDF - ``` - ​``` - const struct ISampleDriverService *sampleService = - (const struct ISampleDriverService *)DevSvcManagerClntGetService("sample_driver"); - if (sampleService == NULL) { - return -1; - } - sampleService->ServiceA(); - sampleService->ServiceB(5); - ​``` - ``` + If the service requester clearly knows the time when the driver is loaded, use the API provided by the HDF to obtain the driver service. The following is an example: + + ```c + const struct ISampleDriverService *sampleService = + (const struct ISampleDriverService *)DevSvcManagerClntGetService("sample_driver"); + if (sampleService == NULL) { + return HDF_FAILURE; + } + sampleService->ServiceA(); + sampleService->ServiceB(5); + ``` - Using the subscription mechanism - If the kernel mode is unaware of the time for loading drivers on the same host, use the subscription mechanism provided by the HDF to subscribe to the drivers. After the drivers are loaded, the HDF publishes the driver services to the subscriber. - - The implementation is as follows: - - ``` - // Callback invoked to return the driver services after the subscribed driver is loaded. - // object is the pointer to the private data of the subscriber, and service is the pointer to the subscribed service object. - int32_t TestDriverSubCallBack(struct HdfDeviceObject *deviceObject, const struct HdfObject *service) - { - const struct ISampleDriverService *sampleService = - (const struct ISampleDriverService *)service; - if (sampleService == NULL) { - return -1; - } - sampleService->ServiceA(); - sampleService->ServiceB(5); - } - // Implement the subscription process. - int32_t TestDriverInit(struct HdfDeviceObject *deviceObject) - { - if (deviceObject == NULL) { - HDF_LOGE("Test driver init failed, deviceObject is null!"); - return -1; - } - struct SubscriberCallback callBack; - callBack.deviceObject = deviceObject; - callBack.OnServiceConnected = TestDriverSubCallBack; - int32_t ret = HdfDeviceSubscribeService(deviceObject, "sample_driver", callBack); - if (ret != 0) { - HDF_LOGE("Test driver subscribe sample driver failed!"); - } - return ret; - } - ``` - - - + If the service requester is unaware of the time when the driver (in the same host) is loaded, use the subscription mechanism provided by the HDF to subscribe to the service. After the driver is loaded, the HDF publishes the driver service to the subscriber. The implementation is as follows: + + + ```c + // Callback invoked to return the driver service after the subscribed driver is loaded. + // object is the pointer to the private data of the subscriber, and service is the pointer to the subscribed service object. + int32_t TestDriverSubCallBack(struct HdfDeviceObject *deviceObject, const struct HdfObject *service) + { + const struct ISampleDriverService *sampleService = + (const struct ISampleDriverService *)service; + if (sampleService == NULL) { + return HDF_FAILURE; + } + sampleService->ServiceA(); + sampleService->ServiceB(5); + } + // Implement the subscription process. + int32_t TestDriverInit(struct HdfDeviceObject *deviceObject) + { + if (deviceObject == NULL) { + HDF_LOGE("Test driver init failed, deviceObject is null!"); + return HDF_FAILURE; + } + struct SubscriberCallback callBack; + callBack.deviceObject = deviceObject; + callBack.OnServiceConnected = TestDriverSubCallBack; + int32_t ret = HdfDeviceSubscribeService(deviceObject, "sample_driver", callBack); + if (ret != HDF_SUCCESS) { + HDF_LOGE("Test driver subscribe sample driver failed!"); + } + return ret; + } + ``` diff --git a/en/device-dev/driver/driver-peripherals-camera-des.md b/en/device-dev/driver/driver-peripherals-camera-des.md index d161e03295..61384c46f9 100644 --- a/en/device-dev/driver/driver-peripherals-camera-des.md +++ b/en/device-dev/driver/driver-peripherals-camera-des.md @@ -1,128 +1,137 @@ # Camera -## Overview
    -### Camera +## Overview +### Function -The OpenHarmony camera driver model implements the camera hardware device interface (HDI) and the camera pipeline model to manage camera devices. -The camera driver model consists of the following layers: +The OpenHarmony camera driver model provides the camera hardware device interface (HDI) and the camera pipeline model to manage camera devices. +The camera driver model is divided into three layers: + HDI implementation layer: implements standard ohos (OpenHarmony operating system) APIs for cameras. -+ Framework layer: connects to the HDI implementation layer for control instruction and stream transfer, establishes data channels, and manages camera devices. -+ Device adaptation layer: shields the differences between underlying chips and OSs for multi-platform adaptation. ++ Framework layer: interacts with the HDI implementation layer to set up data channels and operate camera devices. ++ Device adaptation layer: supports different platforms by shielding the differences in underlying chips and operating systems. -### Working Principles +### Working Principles -The camera module is used to initialize services and devices, set up data channels, and configure, create, deliver, and capture streams. The figure below illustrates camera driver model. +The camera module is used to initialize services and devices, set up data channels, and configure, create, deliver, and capture streams. The following figure shows the camera driver model. **Figure 1** HDF-based camera driver model ![](figures/camera-driver-model-architecture.png) -1. When the system starts, the camera_host process is created. The process enumerates underlying devices, creates a **DeviceManager** instance that manages the device tree, an object for each underlying device, and a **CameraHost** instance, and registers the **CameraHost** instance with the UHDF service. Through the UHDF service, the camera service can obtain the underlying **CameraDeviceHost** services to operate the hardware devices. Note that the **DeviceManager** instance can also be created by using the configuration table. +1. When the system starts, the camera_host process is created. The process enumerates underlying devices, creates a **DeviceManager** instance (to manage the device tree), an object for each underlying device, and a **CameraHost** instance, and registers the **CameraHost** instance with the user-mode HDF (UHDF) service. Through the UHDF service, the camera service can obtain the underlying **CameraDeviceHost** services to operate the hardware devices. The **DeviceManager** instance can also be created by using the configuration table. -2. The Camera Service obtains the **CameraHost** instance through the CameraDeviceHost service. The **CameraHost** instance can be used to obtain the bottom-layer camera capabilities, turn on the flashlight, call the **Open()** interface to start the camera and create a connection, create a **DeviceManager** instance (powering on the bottom-layer hardware modules), and create a **CameraDevice** instance (providing the device control interface for the upper layer). When the **CameraDevice** instance is created, each submodule of PipelineCore is instantiated. Among the submodules, StreamPipelineCore is responsible for creating pipelines, and MetaQueueManager is responsible for reporting metadata. +2. The Camera Service obtains the **CameraHost** instance through the CameraDeviceHost service. + + The **CameraHost** instance can be used to obtain the underlying camera capabilities, turn on the flashlight, call **Open()** to start a camera and set up a connection with the camera, create a **DeviceManager** instance (to power on the hardware modules), and create a **CameraDevice** instance (to provide the device control interface for the upper layer). + + When the **CameraDevice** instance is created, the PipelineCore modules will be instantiated. The StreamPipelineCore module creates pipelines, and the MetaQueueManager module reports metadata. 3. The Camera Service configures stream and creates a **Stream** class through the CameraDevice module. The StreamPipelineStrategy module creates the node connection mode of the corresponding stream by using the mode issued by the upper layer and querying the configuration table. The StreamPipelineBuilder module creates a node and returns the pipeline to the StreamPipelineDispatcher module through the connection. The StreamPipelineDispatcher module dispatches pipelines. -4. The Camera Service controls the stream operations through the **Stream** instance. The **AttachBufferQueue()** interface is used to deliver the buffer queue requested from the display module to the bottom layer. The CameraDeviceDriverModel manages the buffer. After the **Capture()** interface is called to deliver commands, the bottom layer transfers the buffer to the upper layer. The Image Signal Processor (ISP) node obtains a specified number of buffers from the buffer queue and delivers the buffers to the bottom-layer ISP hardware. After filling the buffers, the ISP hardware transfers the buffers to the CameraDeviceDriverModel. The CameraDeviceDriverModel fills the created pipeline with the received buffers by using a loop thread. Each node processes the pipeline data and transfers the data to the upper layer by using a callback. At the same time, the buffers are freed for reuse. +4. The Camera Service controls the stream operations through the **Stream** instance. -5. The Camera Service delivers the photographing command through the **Capture()** interface. The **ChangeToOfflineStream()** interface is used to query the position of the photographing buffer. If the ISP hardware has output an image and sent the image data to the IPP node, the common photographing streams can be converted into offline streams. Otherwise, the close process is executed. The **ChangeToOfflineStream()** interface transfers **StreamInfo** to enable the offline stream to obtain the stream information of the common stream, confirms the node connection mode of the offline stream based on the configuration table, and creates the node connection of the offline stream. If the node connection has been created, the interface releases the node required by the non-offline stream through **CloseCamera()**. It then waits for the buffer to return from the bottom-layer pipeline to the upper layer and then releases the pipeline resources. + **AttachBufferQueue()** delivers the buffer queue requested from the display module to the bottom layer. The CameraDeviceDriverModel manages the buffer. After **Capture()** is called to deliver commands, the bottom layer transfers the buffer to the upper layer. The Image Signal Processor (ISP) node obtains a specified number of buffers from the buffer queue and delivers the buffers to the bottom-layer ISP hardware. After filling the buffers, the ISP hardware transfers the buffers to the CameraDeviceDriverModel. The CameraDeviceDriverModel fills the created pipeline with the received buffers by using a loop thread. Each node processes the pipeline data and transfers the data to the upper layer in a callback. At the same time, the buffers are freed to the buffer queue for reuse. -6. The Camera Service sends the **CaptureSetting** parameter to the CameraDeviceDriverModel through the **UpdateSettings()** interface of the **CameraDevice** instance. The CameraDeviceDriverModel forwards the parameter to each node through the StreamPipelineDispatcher module. The **CaptureSetting** parameter carried in **StartStreamingCapture()** and **Capture()** is forwarded to the node to which the stream belongs through the StreamPipelineDispatcher module. +5. The Camera Service delivers the photographing command through **Capture()**. **ChangeToOfflineStream()** is used to query the position of the photographing buffer. If the ISP hardware has output an image and sent the image data to the IPP node, the common photographing stream can be converted into an offline stream. Otherwise, the close process is executed. **ChangeToOfflineStream()** passes **StreamInfo** to enable the offline stream to obtain the stream information of the common stream, determines the node connection mode of the offline stream based on the configuration table, and creates the node connection for the offline stream (if the node connection has been created, the node required by the non-offline stream will be closed by **CloseCamera**.) When the buffer is transferred from the pipeline to the upper layer, the pipeline resources are released. -7. The Camera Service controls underlying metadata reporting through the **EnableResult()** and **DisableResult()** interfaces. If the underlying metadata needs to be reported, the pipeline creates a buffer queue in the CameraDeviceDriverModel to collect and transfer metadata, queries the configuration table based on the StreamPipelineStrategy module, and creates and connects to the specified node through the StreamPipelineBuilder module. The MetaQueueManager module delivers the buffer to the bottom layer, and the bottom-layer node fills in data. The MetaQueueManager module then invokes the upper-layer callback to transfer the data to the upper layer. +6. The Camera Service sends the **CaptureSetting** parameter to the CameraDeviceDriverModel through **UpdateSettings()** of the **CameraDevice** instance. The CameraDeviceDriverModel forwards the parameter to each node through the StreamPipelineDispatcher module. The **CaptureSetting** parameter carried in **StartStreamingCapture()** and **Capture()** is forwarded to the node to which the stream belongs through the StreamPipelineDispatcher module. -8. The Camera Service calls the **Close()** interface of the **CameraDevice** class, and the **CameraDevice** instance calls the corresponding DeviceManager module to power off each hardware. If an offline stream exists in the subpipeline of the IPP node, the offline stream must be reserved until the execution is complete. +7. The Camera Service uses **EnableResult()** and **DisableResult()** to control the reporting of underlying metadata. If the underlying metadata needs to be reported, the pipeline creates a buffer queue in the CameraDeviceDriverModel to collect and transfer metadata, queries the configuration table based on the StreamPipelineStrategy module, and creates and connects to the specified node through the StreamPipelineBuilder module. The MetaQueueManager module delivers the buffer to the bottom layer, and the bottom-layer node fills in data. The MetaQueueManager module then invokes the upper-layer callback to transfer the data to the upper layer. + +8. The Camera Service calls **Close()** of the **CameraDevice** class, and the **CameraDevice** instance calls the corresponding DeviceManager module to power off each hardware. If an offline stream exists in the subpipeline of the IPP node, the offline stream must be reserved until the execution is complete. 9. To implement dynamic frame control, a CollectBuffer thread is started in the StreamOperator. The CollectBuffer thread obtains a buffer from the buffer queue of each stream. If the frame rate of a stream needs to be controlled (1/n of the sensor output frame rate), the CollectBuffer thread can control the buffer packaging of each frame as required, and determine whether to collect the buffer of the stream. For example, if the output frame rate of the sensor is 120 fps and the preview stream frame rate is 30 fps, the CollectBuffer thread collects the buffer of the preview stream every 4 fps. -## Development Guidelines +## Development Guidelines -### When to Use +### When to Use -The camera module encapsulates camera operations in camera preview, photographing, and video streams to facilitate camera hardware operations and improve development efficiency. +The camera module encapsulates camera operations in camera preview, photographing, and video streams to implement camera hardware operations and improve development efficiency. -### Available APIs +### Available APIs +The following table describes the C++ APIs generated from the Interface Definition Language (IDL) interface description. For details about the interface declaration, see the .idl file in **/drivers/interface/camera/v1_0/**. +The parameters passed in the HDI cannot exceed the capability range obtained by **GetCameraAbility**. Even if the parameters beyond the capability range can be passed in APIs such as **UpdateSettings**, **CommitStreams**, and **Capture** with no error returned, unexpected behavior may be caused. - icamera_device.h - | API | Description | - | ------------------------------------------------------------ | ---------------------------- | - | CamRetCode GetStreamOperator(
    const OHOS::sptr &callback,
    OHOS::sptr &streamOperator) | Obtains the stream controller. | - | CamRetCode UpdateSettings(const std::shared_ptr &settings) | Updates device control parameters. | - | CamRetCode SetResultMode(const ResultCallbackMode &mode) | Sets the result callback mode and function.| - | CamRetCode GetEnabledResults(std::vector &results) | Obtains the enabled ResultMeta. | - | CamRetCode EnableResult(const std::vector &results) | Enables specific ResultMeta. | - | CamRetCode DisableResult(const std::vector &results) | Disables specific ResultMeta. | - | void Close() | Closes the camera device. | + | API | Description | + | ---------------------------- | ------------------------------------------------------------ | + | int32_t GetStreamOperator(const sptr& callbackObj, sptr& streamOperator) | Obtains the stream controller. | + | int32_t UpdateSettings(const std::vector& settings) | Updates device control parameters. | + | int32_t SetResultMode(ResultCallbackMode mode) | Sets the result callback mode and function.| + | int32_t GetEnabledResults(std::vector& results) | Obtains the enabled ResultMeta. | + | int32_t EnableResult(const std::vector& results) | Enables specific ResultMeta. | + | int32_t DisableResult(const std::vector& results) | Disables specific ResultMeta. | + | int32_t Close() | Closes the camera device. | - icamera_device_callback.h - | API | Description | + | API | Description | | ------------------------------------------------------------ | ------------------------------------------------------------ | - | void OnError(ErrorType type, int32_t errorCode) | Called when an error occurs on the device to return error information. You need to implement this interface.| - | void OnResult(uint64_t timestamp, const std::shared_ptr &result) | Callback invoked to report metadata related to the camera device. | + | int32_t OnError(ErrorType type, int32_t errorCode) | Called when an error occurs on the camera device. The caller needs to implement this API. | + | int32_t OnResult(uint64_t timestamp, const std::vector& result) | Called to report metadata related to the camera device. | - icamera_host.h - | API | Description | - | ------------------------------------------------------------ | ------------------------------ | - | CamRetCode SetCallback(const OHOS::sptr &callback) | Sets the **ICameraHostCallback** API. | - | CamRetCode GetCameraIds(std::vector\ &cameraIds) | Obtains the IDs of available camera devices.| - | CamRetCode GetCameraAbility(const std::string &cameraId,
    std::shared_ptr &ability) | Obtains the abilities of a camera device. | - | CamRetCode OpenCamera(const std::string &cameraId,
    const OHOS::sptr &callback,
    OHOS::sptr &device) | Opens a camera. | - | CamRetCode SetFlashlight(const std::string &cameraId, bool &isEnable) | Turns on or off the flash. | + | API | Description | + | ------------------------------------------------------------ | ------------------------------------------------------------ | + | int32_t SetCallback(const sptr& callbackObj) | Sets the **ICameraHostCallback** API. | + | int32_t GetCameraIds(std::vector& cameraIds) | Obtains the IDs of available camera devices. | + | int32_t GetCameraAbility(const std::string& cameraId, std::vector& cameraAbility) | Obtains the abilities of a camera device. | + | int32_t OpenCamera(const std::string& cameraId, const sptr& callbackObj, sptr& device) | Opens a camera. | + | int32_t SetFlashlight(const std::string& cameraId, bool isEnable) | Turns on or off the flash. | - icamera_host_callback.h - | API | Description | - | ------------------------------------------------------------ | ---------------------- | - | void OnCameraStatus(const std::string &cameraId, CameraStatus status) | Reports camera status changes.| - | void OnFlashlightStatus(const std::string &cameraId, FlashlightStatus status) | Callback invoked to report the flash status changes. | + | API | Description | + | ------------------------------------------------------------ | ------------------------------------------------------------ | + | int32_t OnCameraStatus(const std::string& cameraId, CameraStatus status) | Called to report camera status changes. | + | int32_t OnFlashlightStatus(const std::string& cameraId, FlashlightStatus status) | Called to report the flash status changes. | + | int32_t OnCameraEvent(const std::string& cameraId, CameraEvent event) | Called to report a camera event. | - ioffline_stream_operator.h - | API | Description | - | ------------------------------------------------------------ | -------------- | - | CamRetCode CancelCapture(int captureId) | Cancels a capture request. | - | CamRetCode ReleaseStreams(const std::vector &streamIds) | Releases streams. | - | CamRetCode Release() | Releases all offline streams.| + | API | Description | + | ---- | ---- | + | int32_t CancelCapture(int32_t captureId) | Cancels a capture request. | + | int32_t ReleaseStreams(const std::vector& streamIds) | Releases streams. | + | int32_t Release() | Releases all offline streams. | - istream_operator.h - | API | Description | - | ------------------------------------------------------------ | -------------------------------- | - | CamRetCode IsStreamsSupported(
    OperationMode mode,
    const std::shared_ptr\ &modeSetting,
    const std::vector<std::shared_ptr<StreamInfo>> &info,
    StreamSupportType &type) | Checks whether a stream can be added. | - | CamRetCode CreateStreams(const std::vector> &streamInfos) | Creates streams. | - | CamRetCode ReleaseStreams(const std::vector &streamIds) | Releases streams. | - | CamRetCode CommitStreams(OperationMode mode,
    const std::shared_ptr &modeSetting) | Configure streams. | - | CamRetCode GetStreamAttributes(
    std::vector> &attributes) | Obtain stream attributes. | - | CamRetCode AttachBufferQueue(int streamId, const OHOS::sptr\ &producer) | Attaches a producer handle to a stream. | - | CamRetCode DetachBufferQueue(int streamId) | Detaches a producer handle from a stream.| - | CamRetCode Capture(int captureId,
    const std::shared_ptr &info, bool isStreaming) | Captures images. | - | CamRetCode CancelCapture(int captureId) | Cancels a capture. | - | CamRetCode ChangeToOfflineStream(const std::vector &streamIds,
    OHOS::sptr &callback,
    OHOS::sptr &offlineOperator) | Changes a stream into an offline stream. | + | API | Description | + | ------------------------------------------------------------ | ------------------------------------------------------------ | + | int32_t IsStreamsSupported(OperationMode mode,
    const std::vector& modeSetting,
    const std::vector& infos,
    StreamSupportType& type) | Checks whether a stream can be added. | + | int32_t CreateStreams(const std::vector& streamInfos) | Creates streams. | + | int32_t ReleaseStreams(const std::vector& streamIds) | Releases streams. | + | int32_t CommitStreams(OperationMode mode, const std::vector& modeSetting) | Configure streams. | + | int32_t GetStreamAttributes(std::vector& attributes) | Obtain stream attributes. | + | int32_t AttachBufferQueue(int32_t streamId, const sptr& bufferProducer) | Attaches a producer handle to a stream. | + | int32_t DetachBufferQueue(int32_t streamId) | Detaches a producer handle from a stream. | + | int32_t Capture(int32_t captureId, const CaptureInfo& info, bool isStreaming) | Captures images. | + | int32_t CancelCapture(int32_t captureId) | Cancels a capture. | + | int32_t ChangeToOfflineStream(const std::vector& streamIds,
    const sptr& callbackObj,
    sptr& offlineOperator) | Changes a stream into an offline stream. | - istream_operator_callback.h - | API | Description | - | ------------------------------------------------------------ | ---------------------------------------- | - | void OnCaptureStarted(int32_t captureId, const std::vector &streamIds) | Called when a capture starts. | - | void OnCaptureEnded(int32_t captureId,
    const std::vector> &infos) | Called when a capture ends. | - | void OnCaptureError(int32_t captureId,
    const std::vector> &infos) | Called when an error occurs during the capture.| - | void OnFrameShutter(int32_t captureId,
    const std::vector &streamIds, uint64_t timestamp) | Called when a frame is captured. | + | API | Description | + | ------------------------------------------------------------ | ----------------------------------------------- | + | int32_t OnCaptureStarted(int32_t captureId, const std::vector& streamIds) | Called when a capture starts. | + | int32_t OnCaptureEnded(int32_t captureId, const std::vector& infos) | Called when a capture ends. | + | int32_t OnCaptureError(int32_t captureId, const std::vector& infos) | Called when an error occurs during the capture. | + | int32_t OnFrameShutter(int32_t captureId, const std::vector& streamIds, uint64_t timestamp) | Called when a frame is captured. | -### How to Develop -To camera driver development procedure is as follows: +### How to Develop +The camera driver development procedure is as follows: -1. Register a **CameraHost**. +1. Register a **CameraHost** instance. - Define the **HdfDriverEntry** structure to define the method for initializing a **CameraHost**. - ``` + Define the **HdfDriverEntry** structure to define the method for initializing **CameraHost**. For details about the code, see **drivers/peripheral/camera/interfaces/hdi_ipc/camera_host_driver.cpp**. + ```c++ struct HdfDriverEntry g_cameraHostDriverEntry = { .moduleVersion = 1, .moduleName = "camera_service", @@ -133,35 +142,48 @@ To camera driver development procedure is as follows: HDF_INIT(g_cameraHostDriverEntry); // Register the HdfDriverEntry structure with the HDF. ``` -2. Initialize the **CameraHost**. +2. Initialize the **CameraHost** service. - **HdfCameraHostDriverBind** defined in the **HdfDriverEntry** structure provides the registration of **CameraServiceDispatch()** and **CameraHostStubInstance()**. **CameraServiceDispatch()** is used to remotely call a method of the **CameraHost**, such as **OpenCamera()** and **SetFlashlight()**. **CameraHostStubInstance()** is used to initialize the camera device, which is called during system startup. + The **HdfCameraHostDriverBind()** method defined in the **HdfDriverEntry** structure registers **CameraServiceDispatch()** and **CameraHostStubInstance()**. **CameraServiceDispatch()** is used to remotely call the **CameraHost** methods, such as **OpenCamera()** and **SetFlashlight()**. **CameraHostStubInstance()** is called during the system startup to initialize the camera. - ``` - int HdfCameraHostDriverBind(HdfDeviceObject *deviceObject) + ```c++ + static int HdfCameraHostDriverBind(struct HdfDeviceObject *deviceObject) { - HDF_LOGI("HdfCameraHostDriverBind enter!"); - if (deviceObject == nullptr) { - HDF_LOGE("HdfCameraHostDriverBind: HdfDeviceObject is NULL !"); + HDF_LOGI("HdfCameraHostDriverBind enter"); + + auto *hdfCameraHostHost = new (std::nothrow) HdfCameraHostHost; + if (hdfCameraHostHost == nullptr) { + HDF_LOGE("%{public}s: failed to create HdfCameraHostHost object", __func__); + return HDF_FAILURE; + } + + hdfCameraHostHost->ioService.Dispatch = CameraHostDriverDispatch; // Provide a method to remotely call a CameraHost method. + hdfCameraHostHost->ioService.Open = NULL; + hdfCameraHostHost->ioService.Release = NULL; + + auto serviceImpl = ICameraHost::Get(true); + if (serviceImpl == nullptr) { + HDF_LOGE("%{public}s: failed to get of implement service", __func__); + delete hdfCameraHostHost; return HDF_FAILURE; } - HdfCameraService *hdfCameraService = reinterpret_cast(OsalMemAlloc(sizeof(HdfCameraService))); - if (hdfCameraService == nullptr) { - HDF_LOGE("HdfCameraHostDriverBind OsalMemAlloc HdfCameraService failed!"); + + hdfCameraHostHost->stub = OHOS::HDI::ObjectCollector::GetInstance().GetOrNewObject(serviceImpl, + ICameraHost::GetDescriptor()); // Initialize the camera. + if (hdfCameraHostHost->stub == nullptr) { + HDF_LOGE("%{public}s: failed to get stub object", __func__); + delete hdfCameraHostHost; return HDF_FAILURE; } - hdfCameraService->ioservice.Dispatch = CameraServiceDispatch; // Used to call methods of the CameraHost. - hdfCameraService->ioservice.Open = nullptr; - hdfCameraService->ioservice.Release = nullptr; - hdfCameraService->instance = CameraHostStubInstance(); // Initialize the camera device. - deviceObject->service = &hdfCameraService->ioservice; + + deviceObject->service = &hdfCameraHostHost->ioService; return HDF_SUCCESS; } ``` The following functions are the implementation of the methods of the **CameraHost**: - ``` + ```c++ int32_t CameraHostStub::CameraHostServiceStubOnRemoteRequest(int cmdId, MessageParcel &data, MessageParcel &reply, MessageOption &option) { @@ -192,11 +214,11 @@ To camera driver development procedure is as follows: **CameraHostStubInstance()** finally calls **CameraHostImpl::Init()** to obtain the physical camera and initialize the DeviceManager and PipelineCore modules. -3. Obtain the **CameraHost**. +3. Obtain the **CameraHost** service. - Call the **Get()** interface to obtain the **CameraHost** from the **CameraService**. The **Get()** interface is as follows: + Use **Get()** to obtain the **CameraHost** from the **CameraService**. The **Get()** method is as follows: - ``` + ```c++ sptr ICameraHost::Get(const char *serviceName) { do { @@ -218,51 +240,80 @@ To camera driver development procedure is as follows: } ``` -4. Implement the **OpenCamera\(\)** interface. +4. Open a camera device. - The **CameraHostProxy** class provides five interfaces: **SetCallback()**, **GetCameraIds()**, **GetCameraAbility()**, **OpenCamera()**, and **SetFlashlight()**. The following describes **OpenCamera()**. - The **OpenCamera()** interface calls the remote **CameraHostStubOpenCamera()** interface through the CMD_CAMERA_HOST_OPEN_CAMERA to obtain an **ICameraDevice** object. + The **CameraHostProxy** class provides **SetCallback()**, **GetCameraIds()**, **GetCameraAbility()**, **OpenCamera()**, and **SetFlashlight()**. - ``` - CamRetCode CameraHostProxy::OpenCamera(const std::string &cameraId, const OHOS::sptr &callback, OHOS::sptr &pDevice) + Use **OpenCamera()** to call the remote **CameraHostStubOpenCamera()** through the **CMD_CAMERA_HOST_OPEN_CAMERA** to obtain an **ICameraDevice** object. + + ```c++ + int32_t CameraHostProxy::OpenCamera(const std::string& cameraId, const sptr& callbackObj, + sptr& device) { - int32_t ret = Remote()->SendRequest(CMD_CAMERA_HOST_REMOTE_OPEN_CAMERA, data, reply, option); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%{public}s: SendRequest failed, error code is %{public}d", __func__, ret); - return INVALID_ARGUMENT; + MessageParcel cameraHostData; + MessageParcel cameraHostReply; + MessageOption cameraHostOption(MessageOption::TF_SYNC); + + if (!cameraHostData.WriteInterfaceToken(ICameraHost::GetDescriptor())) { + HDF_LOGE("%{public}s: failed to write interface descriptor!", __func__); + return HDF_ERR_INVALID_PARAM; } - CamRetCode retCode = static_cast(reply.ReadInt32()); - bool flag = reply.ReadBool(); - if (flag) { - sptr remoteCameraDevice = reply.ReadRemoteObject(); - if (remoteCameraDevice == nullptr) { - HDF_LOGE("%{public}s: CameraHostProxy remoteCameraDevice is null", __func__); - } - pDevice = OHOS::iface_cast(remoteCameraDevice); + + if (!cameraHostData.WriteCString(cameraId.c_str())) { + HDF_LOGE("%{public}s: write cameraId failed!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + if (!cameraHostData.WriteRemoteObject(OHOS::HDI::ObjectCollector::GetInstance().GetOrNewObject(callbackObj, + ICameraDeviceCallback::GetDescriptor()))) { + HDF_LOGE("%{public}s: write callbackObj failed!", __func__); + return HDF_ERR_INVALID_PARAM; + } + + int32_t cameraHostRet = Remote()->SendRequest(CMD_CAMERA_HOST_OPEN_CAMERA, cameraHostData, cameraHostReply, cameraHostOption); + if (cameraHostRet != HDF_SUCCESS) { + HDF_LOGE("%{public}s failed, error code is %{public}d", __func__, cameraHostRet); + return cameraHostRet; } - return retCode; + + device = hdi_facecast(cameraHostReply.ReadRemoteObject()); + + return cameraHostRet; } ``` - **Remote()->SendRequest** calls **CameraHostServiceStubOnRemoteRequest()**, enters the **CameraHostStubOpenCamera()** interface based on **cmdId**, and finally calls **CameraHostImpl::OpenCamera()** to obtain a **CameraDevice** and power on the camera hardware. + **Remote()->SendRequest** calls **CameraHostServiceStubOnRemoteRequest()**, locates **CameraHostStubOpenCamera()** based on **cmdId**, and finally calls **CameraHostImpl::OpenCamera()** to obtain a **CameraDevice** and power on the camera hardware. - ``` - CamRetCode CameraHostImpl::OpenCamera(const std::string &cameraId, const OHOS::sptr &callback, OHOS::sptr &device) + ```c++ + int32_t CameraHostImpl::OpenCamera(const std::string& cameraId, const sptr& callbackObj, + sptr& device) { - std::shared_ptr cameraDevice = std::static_pointer_cast(itr->second); + CAMERA_LOGD("OpenCamera entry"); + DFX_LOCAL_HITRACE_BEGIN; + if (CameraIdInvalid(cameraId) != RC_OK || callbackObj == nullptr) { + CAMERA_LOGW("open camera id is empty or callback is null."); + return INVALID_ARGUMENT; + } + + auto itr = cameraDeviceMap_.find(cameraId); + if (itr == cameraDeviceMap_.end()) { + CAMERA_LOGE("camera device not found."); + return INSUFFICIENT_RESOURCES; + } + CAMERA_LOGD("OpenCamera cameraId find success."); + + std::shared_ptr cameraDevice = itr->second; if (cameraDevice == nullptr) { CAMERA_LOGE("camera device is null."); return INSUFFICIENT_RESOURCES; } - CamRetCode ret = cameraDevice->SetCallback(callback); - if (ret != NO_ERROR) { - CAMERA_LOGW("set camera device callback failed."); - return ret; - } + + CamRetCode ret = cameraDevice->SetCallback(callbackObj); + CHECK_IF_NOT_EQUAL_RETURN_VALUE(ret, HDI::Camera::V1_0::NO_ERROR, ret); + CameraHostConfig *config = CameraHostConfig::GetInstance(); - if (config == nullptr) { - return INVALID_ARGUMENT; - } + CHECK_IF_PTR_NULL_RETURN_VALUE(config, INVALID_ARGUMENT); + std::vector phyCameraIds; RetCode rc = config->GetPhysicCameraIds(cameraId, phyCameraIds); if (rc != RC_OK) { @@ -274,214 +325,333 @@ To camera driver development procedure is as follows: CameraPowerDown(phyCameraIds); return DEVICE_ERROR; } - + auto sptrDevice = deviceBackup_.find(cameraId); if (sptrDevice == deviceBackup_.end()) { + #ifdef CAMERA_BUILT_ON_OHOS_LITE + deviceBackup_[cameraId] = cameraDevice; + #else deviceBackup_[cameraId] = cameraDevice.get(); + #endif } device = deviceBackup_[cameraId]; cameraDevice->SetStatus(true); - return NO_ERROR; + CAMERA_LOGD("open camera success."); + DFX_LOCAL_HITRACE_END; + return HDI::Camera::V1_0::NO_ERROR; } ``` -5. Implement the **GetStreamOperator\(\)** interface. +5. Obtain streams. - **CameraDeviceImpl** defines interfaces such as **GetStreamOperator()**, **UpdateSettings()**, **SetResultMode()**, and **GetEnabledResult()**. The following is an example of implementing the **GetStreamOperator()** interface: + **CameraDeviceImpl** defines **GetStreamOperator()**, **UpdateSettings()**, **SetResultMode()**, and **GetEnabledResult()**. Use **GetStreamOperator()** to obtain steams. - ``` - CamRetCode CameraDeviceImpl::GetStreamOperator(const OHOS::sptr &callback, - OHOS::sptr &streamOperator) + ```c++ + int32_t CameraDeviceImpl::GetStreamOperator(const sptr& callbackObj, + sptr& streamOperator) { - if (callback == nullptr) { + HDI_DEVICE_PLACE_A_WATCHDOG; + DFX_LOCAL_HITRACE_BEGIN; + if (callbackObj == nullptr) { CAMERA_LOGW("input callback is null."); return INVALID_ARGUMENT; } - spCameraDeviceCallback_ = callback; + + spCameraDeciceCallback_ = callbackObj; if (spStreamOperator_ == nullptr) { - // Here, an spStreamOperator object is created and passed to the caller for stream operations. - spStreamOperator_ = new(std::nothrow) StreamOperatorImpl(spCameraDeviceCallback_, shared_from_this()); + #ifdef CAMERA_BUILT_ON_OHOS_LITE + // Create a spStreamOperator_ object and pass it to the caller for subsequent stream operations. + spStreamOperator_ = std::make_shared(spCameraDeciceCallback_, shared_from_this()); + #else + spStreamOperator_ = new(std::nothrow) StreamOperator(spCameraDeciceCallback_, shared_from_this()); + #endif if (spStreamOperator_ == nullptr) { CAMERA_LOGW("create stream operator failed."); return DEVICE_ERROR; } + spStreamOperator_->Init(); ismOperator_ = spStreamOperator_; } streamOperator = ismOperator_; - - spStreamOperator_->SetRequestCallback([this](){ - spCameraDeviceCallback_->OnError(REQUEST_TIMEOUT, 0); + #ifndef CAMERA_BUILT_ON_OHOS_LITE + CAMERA_LOGI("CameraDeviceImpl %{public}s: line: %{public}d", __FUNCTION__, __LINE__); + pipelineCore_->GetStreamPipelineCore()->SetCallback( + [this](const std::shared_ptr &metadata) { + OnMetadataChanged(metadata); }); + #endif + DFX_LOCAL_HITRACE_END; + return HDI::Camera::V1_0::NO_ERROR; } ``` -6. Create a stream. +6. Create streams. - Fill in the **StreamInfo** structure before creating a stream by calling **CreateStreams()**. + Fill in the **StreamInfo** structure before creating streams by calling **CreateStreams()**. - ``` + ```c++ using StreamInfo = struct _StreamInfo { int streamId_; - int width_; // Stream width - int height_; // Stream height - int format_; // Stream format, for example, PIXEL_FMT_YCRCB_420_SP + int width_; // Stream width + int height_; // Stream height + int format_; // Stream format, for example, PIXEL_FMT_YCRCB_420_SP int dataSpace_; - StreamIntent intent_; // StreamIntent, for example, PREVIEW + StreamIntent intent_; // StreamIntent, for example, PREVIEW bool tunneledMode_; - OHOS::sptr bufferQueue_; // The stream buffer queue can be created by using the streamCustomer->CreateProducer() interface. + ufferProducerSequenceable bufferQueue_; // Use streamCustomer->CreateProducer() to create a buffer queue for streams. int minFrameDuration_; EncodeType encodeType_; }; ``` - The **CreateStreams()** interface in the **StreamOperatorImpl** class is used to create a **StreamBase** instance, which can then be used to initialize operations such as **CreateBufferPool()** by using the **init()** interface. + **CreateStreams()** is a method in the **StreamOperator** class (**StreamOperatorImpl** is the base class of **StreamOperator**). Use **CreateStreams()** to create a **StreamBase** object, which initializes operations such as **CreateBufferPool** through its **Init()** method. - ``` - RetCode StreamOperatorImpl::CreateStream(const std::shared_ptr& streamInfo) + ```c++ + int32_t StreamOperator::CreateStreams(const std::vector& streamInfos) { - static std::map typeMap = { - {PREVIEW, "PREVIEW"}, - {VIDEO, "VIDEO"}, - {STILL_CAPTURE, "STILL_CAPTURE"}, - {POST_VIEW, "POST_VIEW"}, {ANALYZE, "ANALYZE"}, - {CUSTOM, "CUSTOM"} - }; - - auto itr = typeMap.find(streamInfo->intent_); - if (itr == typeMap.end()) { - CAMERA_LOGE("do not support stream type. [type = %{public}d]", streamInfo->intent_); - return RC_ERROR; + PLACE_A_NOKILL_WATCHDOG(requestTimeoutCB_); + DFX_LOCAL_HITRACE_BEGIN; + for (const auto& it : streamInfos) { + CHECK_IF_NOT_EQUAL_RETURN_VALUE(CheckStreamInfo(it), true, INVALID_ARGUMENT); + CAMERA_LOGI("streamId:%{public}d and format:%{public}d and width:%{public}d and height:%{public}d", + it.streamId_, it.format_, it.width_, it.height_); + if (streamMap_.count(it.streamId_) > 0) { + CAMERA_LOGE("stream [id = %{public}d] has already been created.", it.streamId_); + return INVALID_ARGUMENT; + } + std::shared_ptr stream = StreamFactory::Instance().CreateShared( // Create a stream instance. + IStream::g_availableStreamType[it.intent_], it.streamId_, it.intent_, pipelineCore_, messenger_); + if (stream == nullptr) { + CAMERA_LOGE("create stream [id = %{public}d] failed.", it.streamId_); + return INSUFFICIENT_RESOURCES; + } + StreamConfiguration scg; + StreamInfoToStreamConfiguration(scg, it); + RetCode rc = stream->ConfigStream(scg); + if (rc != RC_OK) { + CAMERA_LOGE("configure stream %{public}d failed", it.streamId_); + return INVALID_ARGUMENT; + } + if (!scg.tunnelMode && (it.bufferQueue_)->producer_ != nullptr) { + CAMERA_LOGE("stream [id:%{public}d] is not tunnel mode, can't bind a buffer producer", it.streamId_); + return INVALID_ARGUMENT; + } + if ((it.bufferQueue_)->producer_ != nullptr) { + auto tunnel = std::make_shared(); + CHECK_IF_PTR_NULL_RETURN_VALUE(tunnel, INSUFFICIENT_RESOURCES); + rc = tunnel->AttachBufferQueue((it.bufferQueue_)->producer_); + CHECK_IF_NOT_EQUAL_RETURN_VALUE(rc, RC_OK, INVALID_ARGUMENT); + if (stream->AttachStreamTunnel(tunnel) != RC_OK) { + CAMERA_LOGE("attach buffer queue to stream [id = %{public}d] failed", it.streamId_); + return INVALID_ARGUMENT; + } + } + { + std::lock_guard l(streamLock_); + streamMap_[stream->GetStreamId()] = stream; + } + CAMERA_LOGI("create stream success [id:%{public}d] [type:%{public}s]", stream->GetStreamId(), + IStream::g_availableStreamType[it.intent_].c_str()); } - std::shared_ptr stream = StreamFactory::Instance().CreateShared(itr->second); // Create a StreamBase instance. - RetCode rc = stream->Init(streamInfo); - return RC_OK; - } + DFX_LOCAL_HITRACE_END; + return HDI::Camera::V1_0::NO_ERROR; + } ``` -7. Configure the stream. +7. Configure streams. - Use the **CommitStreams()** interface to configure the stream, including PipelineCore initialization and creation. It must be called after the stream is created. + Use **CommitStreams()** to configure streams, including initializing and creating **PipelineCore**. **CommitStreams()** must be called after streams are created. - ``` - CamRetCode StreamOperatorImpl::CommitStreams(OperationMode mode, const std::shared_ptr& modeSetting) + ```c++ + int32_t StreamOperator::CommitStreams(OperationMode mode, const std::vector& modeSetting) { - auto cameraDevice = cameraDevice_.lock(); - if (cameraDevice == nullptr) { - CAMERA_LOGE("camera device closed."); - return CAMERA_CLOSED; - } - std::shared_ptr PipelineCore = - std::static_pointer_cast(cameraDevice)->GetPipelineCore(); - if (PipelineCore == nullptr) { - CAMERA_LOGE("Failed to obtain PipelineCore."); - return CAMERA_CLOSED; + CAMERA_LOGV("enter"); + CHECK_IF_PTR_NULL_RETURN_VALUE(streamPipeline_, DEVICE_ERROR); + PLACE_A_NOKILL_WATCHDOG(requestTimeoutCB_); + if (modeSetting.empty()) { + CAMERA_LOGE("input vector is empty"); + return INVALID_ARGUMENT; } + DFX_LOCAL_HITRACE_BEGIN; - streamPipeCore_ = PipelineCore->GetStreamPipelineCore(); - if (streamPipeCore_ == nullptr) { - CAMERA_LOGE("Failed to obtain the stream PipelineCore."); - return DEVICE_ERROR; + std::vector configs = {}; + { + std::lock_guard l(streamLock_); + std::transform(streamMap_.begin(), streamMap_.end(), std::back_inserter(configs), + [](auto &iter) { return iter.second->GetStreamAttribute(); }); } - - RetCode rc = streamPipeCore_->Init(); // Initialize the PipelineCore. + + std::shared_ptr setting; + MetadataUtils::ConvertVecToMetadata(modeSetting, setting); + DynamicStreamSwitchMode method = streamPipeline_->CheckStreamsSupported(mode, setting, configs); + if (method == DYNAMIC_STREAM_SWITCH_NOT_SUPPORT) { + return INVALID_ARGUMENT; + } + if (method == DYNAMIC_STREAM_SWITCH_NEED_INNER_RESTART) { + std::lock_guard l(streamLock_); + for (auto it : streamMap_) { + it.second->StopStream(); + } + } + { + std::lock_guard l(streamLock_); + for (auto it : streamMap_) { + if (it.second->CommitStream() != RC_OK) { + CAMERA_LOGE("commit stream [id = %{public}d] failed.", it.first); + return DEVICE_ERROR; + } + } + } + RetCode rc = streamPipeline_->PreConfig(setting); // Configure the device stream. if (rc != RC_OK) { - CAMERA_LOGE("Failed to initialize the stream PipelineCore."); + CAMERA_LOGE("prepare mode settings failed"); return DEVICE_ERROR; } - rc = streamPipeCore_->CreatePipeline(mode); // Create a pipeline. + rc = streamPipeline_->CreatePipeline(mode); // Create a pipeline. if (rc != RC_OK) { - CAMERA_LOGE("Failed to create pipeline."); + CAMERA_LOGE("create pipeline failed."); return INVALID_ARGUMENT; } - return NO_ERROR; + + DFX_LOCAL_HITRACE_END; + return HDI::Camera::V1_0::NO_ERROR; } ``` 8. Capture images. - Fill in the **CaptureInfo** structure before calling the **Capture()** method. + Fill in the **CaptureInfo** structure before calling **Capture()**. - ``` + ```c++ using CaptureInfo = struct _CaptureInfo { - std::vector streamIds_; // IDs of streams to be captured - std::shared_ptr captureSetting_; // Camera ability can be obtained through the GetCameraAbility() interface of CameraHost. - bool enableShutterCallback_; + int[] streamIds_; // IDs of the streams to capture. + unsigned char[] captureSetting_; // Use the camera ability obtained by GetCameraAbility() of CameraHost to fill in the settings. + bool enableShutterCallback_; }; ``` - Use the **Capture()** interface in **StreamOperatorImpl** to call the **CreateCapture()** interface to capture streams. + Use the **Capture()** method in **StreamOperator** to capture data streams. - ``` - CamRetCode StreamOperatorImpl::Capture(int captureId, const std::shared_ptr& captureInfo, bool isStreaming) + ```c++ + int32_t StreamOperator::Capture(int32_t captureId, const CaptureInfo& info, bool isStreaming) { - if (!ValidCaptureInfo(captureId, captureInfo)) { - CAMERA_LOGE("capture streamIds is empty. [captureId = %d]", captureId); - return INVALID_ARGUMENT; - } - std::shared_ptr cameraCapture = nullptr; - RetCode rc = CreateCapture(captureId, captureInfo, isStreaming, cameraCapture); - if (rc != RC_OK) { - CAMERA_LOGE("create capture is failed."); - return DEVICE_ERROR; + CHECK_IF_EQUAL_RETURN_VALUE(captureId < 0, true, INVALID_ARGUMENT); + PLACE_A_NOKILL_WATCHDOG(requestTimeoutCB_); + DFX_LOCAL_HITRACE_BEGIN; + + for (auto id : info.streamIds_) { + std::lock_guard l(streamLock_); + auto it = streamMap_.find(id); + if (it == streamMap_.end()) { + return INVALID_ARGUMENT; + } } - + { - std::unique_lock lock(captureMutex_); - camerCaptureMap_.insert(std::make_pair(captureId, cameraCapture)); + std::lock_guard l(requestLock_); + auto itr = requestMap_.find(captureId); + if (itr != requestMap_.end()) { + return INVALID_ARGUMENT; + } } - - rc = StartThread(); - if (rc != RC_OK) { - CAMERA_LOGE("preview start failed."); - return DEVICE_ERROR; + + std::shared_ptr captureSetting; + MetadataUtils::ConvertVecToMetadata(info.captureSetting_, captureSetting); + CaptureSetting setting = captureSetting; + auto request = + std::make_shared(captureId, info.streamIds_.size(), setting, + info.enableShutterCallback_, isStreaming); + for (auto id : info.streamIds_) { + RetCode rc = streamMap_[id]->AddRequest(request); + if (rc != RC_OK) { + return DEVICE_ERROR; + } } - return NO_ERROR; + + { + std::lock_guard l(requestLock_); + requestMap_[captureId] = request; + } + return HDI::Camera::V1_0::NO_ERROR; } ``` 9. Cancel the capture and release the offline stream. - Use the **CancelCapture()** interface in the **StreamOperatorImpl** class to cancel the stream capture based on **captureId**. + Use **CancelCapture()** in the **StreamOperatorImpl** class to cancel the stream capture based on **captureId**. - ``` - CamRetCode StreamOperatorImpl::CancelCapture(int captureId) + ```c++ + int32_t StreamOperator::CancelCapture(int32_t captureId) { - auto itr = camerCaptureMap_.find(captureId); // Search for the CameraCapture object in the Map based on the captureId. - RetCode rc = itr->second->Cancel(); // Call the Cancel() interface in CameraCapture to cancel the stream capture. - std::unique_lock lock(captureMutex_); - camerCaptureMap_.erase(itr); // Erase the CameraCapture object. - return NO_ERROR; + CHECK_IF_EQUAL_RETURN_VALUE(captureId < 0, true, INVALID_ARGUMENT); + PLACE_A_NOKILL_WATCHDOG(requestTimeoutCB_); + DFX_LOCAL_HITRACE_BEGIN; + + std::lock_guard l(requestLock_); + auto itr = requestMap_.find(captureId); // Search for the CameraCapture object in the Map based on the captureId. + if (itr == requestMap_.end()) { + CAMERA_LOGE("can't cancel capture [id = %{public}d], this capture doesn't exist", captureId); + return INVALID_ARGUMENT; + } + + RetCode rc = itr->second->Cancel(); // Call Cancel() in CameraCapture to cancel the stream capture. + if (rc != RC_OK) { + return DEVICE_ERROR; + } + requestMap_.erase(itr); // Erase the CameraCapture object. + + DFX_LOCAL_HITRACE_END; + return HDI::Camera::V1_0::NO_ERROR; } ``` - Use the **ReleaseStreams()** interface in the **StreamOperatorImpl** class t release the streams created by using **CreateStream()** and **CommitStreams()** and destroy the pipeline. + Use **ReleaseStreams()** in the **StreamOperatorImpl** class to release the streams created by using **CreateStream()** and **CommitStreams()** and destroy the pipeline. - ``` - CamRetCode StreamOperatorImpl::ReleaseStreams(const std::vector& streamIds) + ```c++ + int32_t StreamOperator::ReleaseStreams(const std::vector& streamIds) { - RetCode rc = DestroyStreamPipeline(streamIds); // Destroy the pipeline based on streamIds. - rc = DestroyHostStreamMgr(streamIds); - rc = DestroyStreams(streamIds); // Destroy the stream specified by streamIds. - return NO_ERROR; + PLACE_A_NOKILL_WATCHDOG(requestTimeoutCB_); + DFX_LOCAL_HITRACE_BEGIN; + for (auto id : streamIds) { + std::lock_guard l(streamLock_); + auto it = streamMap_.find(id); + if (it == streamMap_.end()) { + continue; + } + if (it->second->IsRunning()) { + it->second->StopStream(); + } + it->second->DumpStatsInfo(); + streamMap_.erase(it); + } + + for (auto id : streamIds) { + CHECK_IF_EQUAL_RETURN_VALUE(id < 0, true, INVALID_ARGUMENT); + } + + DFX_LOCAL_HITRACE_END; + return HDI::Camera::V1_0::NO_ERROR; } ``` 10. Close the camera device. - - Use the **Close()** interface in the **CameraDeviceImpl** class to close the camera device. This interface calls **PowerDown()** in the **DeviceManager** to power off the device. -### Development Example + Use **Close()** in the **CameraDeviceImpl** class to close the camera device. The **PowerDown()** in **DeviceManager** is called to power off the device. -There is a camera demo in the **/drivers/peripheral/camera/hal/init** directory. After system startup, the executable file **ohos_camera_demo** is generated in the **/vendor/bin** directory. This demo can implement basic camera capabilities such as preview and photographing. The following uses the demo as an example to describe how to use the HDI to write the **PreviewOn()** and **CaptureON()** instances. For details, see [ohos_camera_demo](https://gitee.com/openharmony/drivers_peripheral/tree/master/camera/hal/init). +### Example -1. Construct a CameraDemo object in the **main** function. This object contains methods for initializing the camera and starting, stopping, and releasing streams. The **mainDemo->InitSensors()** function is used to initialize the **CameraHost**, and the **mainDemo->InitCameraDevice()** function is used to initialize the **CameraDevice**. +There is a [ohos_camera_demo](https://gitee.com/openharmony/drivers_peripheral/tree/master/camera/hal/init) in the **/drivers/peripheral/camera/hal/init** directory. After the system is started, the executable file **ohos_camera_demo** is generated in the **/vendor/bin** directory. This demo implements basic camera capabilities such as preview and photographing. - ``` +The following uses the demo to describe how to use the HDI to implement **PreviewOn()** and **CaptureON()**. + +1. Construct a **CameraDemo** object in the **main** function. This object contains methods for initializing the camera and starting, stopping, and releasing streams. The **mainDemo->InitSensors()** function is used to initialize the **CameraHost**, and the **mainDemo->InitCameraDevice()** function is used to initialize the **CameraDevice**. + + ```c++ int main(int argc, char** argv) { RetCode rc = RC_OK; auto mainDemo = std::make_shared(); - rc = mainDemo->InitSensors(); // Initialize the CameraHost. + rc = mainDemo->InitSensors(); // Initialize the CameraHost. if (rc == RC_ERROR) { CAMERA_LOGE("main test: mainDemo->InitSensors() error\n"); return -1; @@ -493,13 +663,13 @@ There is a camera demo in the **/drivers/peripheral/camera/hal/init** directory. return -1; } - rc = PreviewOn(0, mainDemo); // Configure and enable streams. + rc = PreviewOn(0, mainDemo); // Configure and enable streams. if (rc != RC_OK) { CAMERA_LOGE("main test: PreviewOn() error demo exit"); return -1; } - ManuList(mainDemo, argc, argv); // Print the menu to the console. + ManuList(mainDemo, argc, argv); // Print the menu to the console. return RC_OK; } @@ -507,190 +677,309 @@ There is a camera demo in the **/drivers/peripheral/camera/hal/init** directory. The function used to initialize the **CameraHost** is implemented as follows, where the HDI **ICameraHost::Get()** is called to obtain the **demoCameraHost** and set the callback: - ``` - RetCode CameraDemo::InitSensors() + ```c++ + RetCode OhosCameraDemo::InitSensors() { - demoCameraHost_ = ICameraHost::Get(DEMO_SERVICE_NAME); + int rc = 0; + + CAMERA_LOGD("demo test: InitSensors enter"); + + if (demoCameraHost_ != nullptr) { + return RC_OK; + } + #ifdef CAMERA_BUILT_ON_OHOS_LITE + demoCameraHost_ = OHOS::Camera::CameraHost::CreateCameraHost(); + #else + constexpr const char *DEMO_SERVICE_NAME = "camera_service"; + demoCameraHost_ = ICameraHost::Get(DEMO_SERVICE_NAME, false); + #endif if (demoCameraHost_ == nullptr) { CAMERA_LOGE("demo test: ICameraHost::Get error"); return RC_ERROR; } - - hostCallback_ = new CameraHostCallback(); + + #ifdef CAMERA_BUILT_ON_OHOS_LITE + hostCallback_ = std::make_shared(); + #else + hostCallback_ = new DemoCameraHostCallback(); + #endif rc = demoCameraHost_->SetCallback(hostCallback_); + if (rc != HDI::Camera::V1_0::NO_ERROR) { + CAMERA_LOGE("demo test: demoCameraHost_->SetCallback(hostCallback_) error"); + return RC_ERROR; + } + + CAMERA_LOGD("demo test: InitSensors exit"); + return RC_OK; } ``` - The implementation of the function for initializing the **CameraDevice** is as follows, where the **GetCameraIds(cameraIds_)**, **GetCameraAbility(cameraId, ability_)**, and **OpenCamera(cameraIds_.front(), callback, demoCameraDevice_)** interfaces are called to obtain the **demoCameraHost**. + The function for initializing the **CameraDevice** is implemented as follows. The **GetCameraIds(cameraIds_)**, **GetCameraAbility(cameraId, ability_)**, and **OpenCamera(cameraIds\_.front(), callback, demoCameraDevice_)** methods are used to obtain the **demoCameraHost**. - ``` - RetCode CameraDemo::InitCameraDevice() + ```c++ + RetCode OhosCameraDemo::InitCameraDevice() { + int rc = 0; + + CAMERA_LOGD("demo test: InitCameraDevice enter"); + + if (demoCameraHost_ == nullptr) { + CAMERA_LOGE("demo test: InitCameraDevice demoCameraHost_ == nullptr"); + return RC_ERROR; + } + (void)demoCameraHost_->GetCameraIds(cameraIds_); + if (cameraIds_.empty()) { + return RC_ERROR; + } const std::string cameraId = cameraIds_.front(); - demoCameraHost_->GetCameraAbility(cameraId, ability_); - - sptr callback = new CameraDeviceCallback(); + demoCameraHost_->GetCameraAbility(cameraId, cameraAbility_); + + MetadataUtils::ConvertVecToMetadata(cameraAbility_, ability_); + + GetFaceDetectMode(ability_); + GetFocalLength(ability_); + GetAvailableFocusModes(ability_); + GetAvailableExposureModes(ability_); + GetExposureCompensationRange(ability_); + GetExposureCompensationSteps(ability_); + GetAvailableMeterModes(ability_); + GetAvailableFlashModes(ability_); + GetMirrorSupported(ability_); + GetStreamBasicConfigurations(ability_); + GetFpsRange(ability_); + GetCameraPosition(ability_); + GetCameraType(ability_); + GetCameraConnectionType(ability_); + GetFaceDetectMaxNum(ability_); + + #ifdef CAMERA_BUILT_ON_OHOS_LITE + std::shared_ptr callback = std::make_shared(); + #else + sptr callback = new DemoCameraDeviceCallback(); + #endif rc = demoCameraHost_->OpenCamera(cameraIds_.front(), callback, demoCameraDevice_); + if (rc != HDI::Camera::V1_0::NO_ERROR || demoCameraDevice_ == nullptr) { + CAMERA_LOGE("demo test: InitCameraDevice OpenCamera failed"); + return RC_ERROR; + } + + CAMERA_LOGD("demo test: InitCameraDevice exit"); + return RC_OK; } ``` -2. Implement the **PreviewOn()** interface to configure streams, enable preview streams, and start stream capture. After this interface is called, the camera preview channel starts running. Two streams are enabled: preview stream and capture or video stream. Only the preview stream will be captured. - - ``` - static RetCode PreviewOn(int mode, const std::shared_ptr& mainDemo) - { - rc = mainDemo->StartPreviewStream(); // Configure the preview stream. - if (mode == 0) { - rc = mainDemo->StartCaptureStream(); // Configure the capture stream. - } else { - rc = mainDemo->StartVideoStream(); // Configure the video stream. - } - - rc = mainDemo->CaptureON(STREAM_ID_PREVIEW, CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); // Capture the preview stream. - return RC_OK; - } - ``` +2. Implement **PreviewOn()** to configure streams, enable preview streams, and start stream capture. - The **StartCaptureStream()**, **StartVideoStream()**, and **StartPreviewStream()** interfaces call the **CreateStream()** interface with different input parameters. + After **PreviewOn()** is called, the camera preview channel starts running. Two streams are enabled: preview stream and capture or video stream. Only the preview stream will be captured. - ``` - RetCode CameraDemo::StartVideoStream() + ```c++ + static RetCode PreviewOn(int mode, const std::shared_ptr& mainDemo) { RetCode rc = RC_OK; - if (isVideoOn_ == 0) { - isVideoOn_ = 1; - rc = CreateStream(STREAM_ID_VIDEO, streamCustomerVideo_, VIDEO); // To enable the preview stream or capture stream, change the input parameters. + CAMERA_LOGD("main test: PreviewOn enter"); + + rc = mainDemo->StartPreviewStream(); // Configure the preview stream. + if (rc != RC_OK) { + CAMERA_LOGE("main test: PreviewOn StartPreviewStream error"); + return RC_ERROR; } + + if (mode == 0) { + rc = mainDemo->StartCaptureStream(); // Configure the capture stream. + if (rc != RC_OK) { + CAMERA_LOGE("main test: PreviewOn StartCaptureStream error"); + return RC_ERROR; + } + } else { + rc = mainDemo->StartVideoStream(); // Configure the video stream. + if (rc != RC_OK) { + CAMERA_LOGE("main test: PreviewOn StartVideoStream error"); + return RC_ERROR; + } + } + + rc = mainDemo->CaptureON(STREAM_ID_PREVIEW, CAPTURE_ID_PREVIEW, CAPTURE_PREVIEW); + if (rc != RC_OK) { + CAMERA_LOGE("main test: PreviewOn mainDemo->CaptureON() preview error"); + return RC_ERROR; + } + + CAMERA_LOGD("main test: PreviewOn exit"); return RC_OK; - } + } ``` - The **CreateStream()** interface calls the HDI to configure and create a stream. Specifically, the interface first calls the HDI to obtain a **StreamOperation** object and then creates a **StreamInfo** object. Call **CreateStreams()** and **CommitStreams()** to create and configure a stream. + The **StartCaptureStream()**, **StartVideoStream()**, and **StartPreviewStream()** methods call **CreateStream()** with different input parameters. - ``` - RetCode CameraDemo::CreateStreams(const int streamIdSecond, StreamIntent intent) + Use **CreateStream()** to call an HDI API to configure and create streams. Specifically, **CreateStream()** calls the HDI to obtain a **StreamOperation** object and then creates a **StreamInfo** object. Call **CreateStreams()** and **CommitStreams()** to create and configure streams. + + ```c++ + RetCode OhosCameraDemo::CreateStream(const int streamId, std::shared_ptr &streamCustomer, + StreamIntent intent) { - std::vector> streamInfos; - std::vector>().swap(streamInfos); + int rc = 0; + CAMERA_LOGD("demo test: CreateStream enter"); + GetStreamOpt(); // Obtain a StreamOperator object. - std::shared_ptr previewStreamInfo = std::make_shared(); - SetStreamInfo(previewStreamInfo, streamCustomerPreview_, STREAM_ID_PREVIEW, PREVIEW); // Fill in the StreamInfo. - if (previewStreamInfo->bufferQueue_ == nullptr) { - CAMERA_LOGE("demo test: CreateStream CreateProducer(); is nullptr\n"); + if (streamOperator_ == nullptr) { + CAMERA_LOGE("demo test: CreateStream GetStreamOpt() is nullptr\n"); return RC_ERROR; } - streamInfos.push_back(previewStreamInfo); - - std::shared_ptr secondStreamInfo = std::make_shared(); - if (streamIdSecond == STREAM_ID_CAPTURE) { - SetStreamInfo(secondStreamInfo, streamCustomerCapture_, STREAM_ID_CAPTURE, intent); - } else { - SetStreamInfo(secondStreamInfo, streamCustomerVideo_, STREAM_ID_VIDEO, intent); - } - - if (secondStreamInfo->bufferQueue_ == nullptr) { - CAMERA_LOGE("demo test: CreateStreams CreateProducer() secondStreamInfo is nullptr\n"); + + StreamInfo streamInfo = {0}; + + SetStreamInfo(streamInfo, streamCustomer, streamId, intent); // Fills in the StreamInfo stream. + if (streamInfo.bufferQueue_->producer_ == nullptr) { + CAMERA_LOGE("demo test: CreateStream CreateProducer(); is nullptr\n"); return RC_ERROR; } - streamInfos.push_back(secondStreamInfo); - + + std::vector streamInfos; + streamInfos.push_back(streamInfo); + rc = streamOperator_->CreateStreams(streamInfos); // Create a stream. - if (rc != Camera::NO_ERROR) { + if (rc != HDI::Camera::V1_0::NO_ERROR) { CAMERA_LOGE("demo test: CreateStream CreateStreams error\n"); return RC_ERROR; } - rc = streamOperator_->CommitStreams(Camera::NORMAL, ability_); - if (rc != Camera::NO_ERROR) { + rc = streamOperator_->CommitStreams(NORMAL, cameraAbility_); + if (rc != HDI::Camera::V1_0::NO_ERROR) { CAMERA_LOGE("demo test: CreateStream CommitStreams error\n"); - std::vector streamIds = {STREAM_ID_PREVIEW, streamIdSecond}; + std::vector streamIds; + streamIds.push_back(streamId); streamOperator_->ReleaseStreams(streamIds); return RC_ERROR; } + + CAMERA_LOGD("demo test: CreateStream exit"); + return RC_OK; } ``` - The **CaptureON()** interface calls the **Capture()** interface of **StreamOperator** to obtain camera data, rotate the buffer, and start a thread to receive data of the corresponding type. + Use **CaptureON()** to call the **Capture()** method of **StreamOperator** to obtain camera data, flip the buffer, and start a thread to receive data of the corresponding type. - ``` - RetCode CameraDemo::CaptureON(const int streamId, const int captureId, CaptureMode mode) + ```c++ + RetCode OhosCameraDemo::CaptureON(const int streamId, + const int captureId, CaptureMode mode) { - std::shared_ptr captureInfo = std::make_shared(); // Create and fill in CaptureInfo. - captureInfo->streamIds_ = {streamId}; - captureInfo->captureSetting_ = ability_; - captureInfo->enableShutterCallback_ = false; - - int rc = streamOperator_->Capture(captureId, captureInfo, true);// The stream capture starts, and buffer recycling starts. + CAMERA_LOGI("demo test: CaptureON enter streamId == %{public}d and captureId == %{public}d and mode == %{public}d", + streamId, captureId, mode); + std::lock_guard l(metaDatalock_); + if (mode == CAPTURE_SNAPSHOT) { + constexpr double latitude = 27.987500; // dummy data: Qomolangma latitde + constexpr double longitude = 86.927500; // dummy data: Qomolangma longituude + constexpr double altitude = 8848.86; // dummy data: Qomolangma altitude + constexpr size_t entryCapacity = 100; + constexpr size_t dataCapacity = 2000; + captureSetting_ = std::make_shared(entryCapacity, dataCapacity); + captureQuality_ = OHOS_CAMERA_JPEG_LEVEL_HIGH; + captureOrientation_ = OHOS_CAMERA_JPEG_ROTATION_270; + mirrorSwitch_ = OHOS_CAMERA_MIRROR_ON; + gps_.push_back(latitude); + gps_.push_back(longitude); + gps_.push_back(altitude); + captureSetting_->addEntry(OHOS_JPEG_QUALITY, static_cast(&captureQuality_), + sizeof(captureQuality_)); + captureSetting_->addEntry(OHOS_JPEG_ORIENTATION, static_cast(&captureOrientation_), + sizeof(captureOrientation_)); + captureSetting_->addEntry(OHOS_CONTROL_CAPTURE_MIRROR, static_cast(&mirrorSwitch_), + sizeof(mirrorSwitch_)); + captureSetting_->addEntry(OHOS_JPEG_GPS_COORDINATES, gps_.data(), gps_.size()); + } + + std::vector setting; + MetadataUtils::ConvertMetadataToVec(captureSetting_, setting); + captureInfo_.streamIds_ = {streamId}; + if (mode == CAPTURE_SNAPSHOT) { + captureInfo_.captureSetting_ = setting; + } else { + captureInfo_.captureSetting_ = cameraAbility_; + } + captureInfo_.enableShutterCallback_ = false; + + int rc = streamOperator_->Capture(captureId, captureInfo_, true); // The capture starts, and buffer starts to flip. + if (rc != HDI::Camera::V1_0::NO_ERROR) { + CAMERA_LOGE("demo test: CaptureStart Capture error\n"); + streamOperator_->ReleaseStreams(captureInfo_.streamIds_); + return RC_ERROR; + } + if (mode == CAPTURE_PREVIEW) { - streamCustomerPreview_->ReceiveFrameOn(nullptr); // Create a preview thread to receive the passed buffers. + streamCustomerPreview_->ReceiveFrameOn(nullptr); // Create a preview thread to receive the passed buffer. } else if (mode == CAPTURE_SNAPSHOT) { - streamCustomerCapture_->ReceiveFrameOn([this](void* addr, const uint32_t size) { // Create a capture thread to receive the passed buffers through the StoreImage callback. + streamCustomerCapture_->ReceiveFrameOn([this](void* addr, const uint32_t size) { // Create a capture thread to receive the passed buffer through the StoreImage callback. StoreImage(addr, size); }); } else if (mode == CAPTURE_VIDEO) { OpenVideoFile(); - streamCustomerVideo_->ReceiveFrameOn([this](void* addr, const uint32_t size) {// Create a video thread to receive the passed buffer by calling the StoreVideo callback. + + streamCustomerVideo_->ReceiveFrameOn([this](void* addr, const uint32_t size) { // Create a video thread to receive the passed buffer through the StoreImage callback. StoreVideo(addr, size); }); } + CAMERA_LOGD("demo test: CaptureON exit"); + return RC_OK; } ``` -3. Implement the **ManuList()** function to obtain characters from the console through the **fgets()** interface. Different characters correspond to different capabilities provided by the demo, and the functionality menu is printed. +3. Implement **ManuList()** to obtain characters from the console through **fgets()**. Different characters correspond to different capabilities provided by the demo, and the functionality menu is printed. - ``` - static void ManuList(const std::shared_ptr& mainDemo, + ```c++ + static void ManuList(const std::shared_ptr& mainDemo, const int argc, char** argv) { int idx, c; - int awb = 1; - constexpr char shortOptions[] = "h:cwvaqof:"; - c = getopt_long(argc, argv, shortOptions, longOptions, &idx); - while(1) { + bool isAwb = true; + const char *shortOptions = "h:cwvaeqof:"; + c = getopt_long(argc, argv, shortOptions, LONG_OPTIONS, &idx); + while (1) { switch (c) { case 'h': - c = PutMenuAndGetChr(); // Print the menu. + c = PutMenuAndGetChr(); // Print the menu. break; - - case 'f': - FlashLightTest(mainDemo); // Test the flashlight capability. + case 'f': + FlashLightTest(mainDemo); // Verify the flashlight capability. c = PutMenuAndGetChr(); break; case 'o': - OfflineTest(mainDemo); // Test the offline capability. + OfflineTest(mainDemo); // Verify the offline capability. c = PutMenuAndGetChr(); break; case 'c': - CaptureTest(mainDemo); // Test the capture capability. + CaptureTest(mainDemo); // Verify the capture capability. c = PutMenuAndGetChr(); break; - case 'w': // Test the AWB capability. - if (awb) { + case 'w': // Verify the AWB capability. + if (isAwb) { mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_INCANDESCENT); } else { mainDemo->SetAwbMode(OHOS_CAMERA_AWB_MODE_OFF); } - awb = !awb; + isAwb = !isAwb; c = PutMenuAndGetChr(); break; - case 'a': // Test the AE capability. + case 'a': // Verify the AE capability. mainDemo->SetAeExpo(); c = PutMenuAndGetChr(); break; - case 'v': // Test the video capability. + case'e': // Verify the metadata operations. + mainDemo->SetMetadata(); + c = PutMenuAndGetChr(); + break; + case'v': // Verify the video function. VideoTest(mainDemo); c = PutMenuAndGetChr(); break; - case 'q': // Exit the demo. + case 'q': // Exit the demo. PreviewOff(mainDemo); mainDemo->QuitDemo(); - exit(EXIT_SUCCESS); - + return; default: CAMERA_LOGE("main test: command error please retry input command"); c = PutMenuAndGetChr(); @@ -700,9 +989,9 @@ There is a camera demo in the **/drivers/peripheral/camera/hal/init** directory. } ``` - The **PutMenuAndGetChr()** interface prints the menu of the demo and calls **fgets()** to wait for commands from the console. + Use **PutMenuAndGetChr()** to print the menu of the demo and call **fgets()** to wait for commands from the console. - ``` + ```c++ static int PutMenuAndGetChr(void) { constexpr uint32_t inputCount = 50; @@ -724,7 +1013,7 @@ There is a camera demo in the **/drivers/peripheral/camera/hal/init** directory. The console outputs the menu details as follows: - ``` + ```c++ "Options:\n" "-h | --help Print this message\n" "-o | --offline stream offline test\n" @@ -732,8 +1021,28 @@ There is a camera demo in the **/drivers/peripheral/camera/hal/init** directory. "-w | --set WB Set white balance Cloudy\n" "-v | --video capture Video of 10s\n" "-a | --Set AE Set Auto exposure\n" + "-e | --Set Metadeta Set Metadata\n" "-f | --Set Flashlight Set flashlight ON 5s OFF\n" "-q | --quit stop preview and quit this app\n"); ``` - +4. Compile and build the **ohos_camera_demo**. + + Add **init:ohos_camera_demo** to **deps** in the **drivers/peripheral/camera/hal/BUILD.gn** file. + + The sample code is as follows: + + ``` + deps = [ + "buffer_manager:camera_buffer_manager", + "device_manager:camera_device_manager", + "hdi_impl:camera_host_service_1.0", + "pipeline_core:camera_pipeline_core", + "utils:camera_utils", + "init:ohos_camera_demo", + ] + ``` + + The following uses RK3568 development board as an example. + 1. Run the **./build.sh --product-name rk3568 --ccache** command to generate the executable binary file **ohos_camera_demo** in **out/rk3568/packages/phone/vendor/bin/**. + 2. Import the executable file **ohos_camera_demo** to the development board, modify the permission, and run the file. diff --git a/en/device-dev/driver/driver-peripherals-codec-des.md b/en/device-dev/driver/driver-peripherals-codec-des.md index fcc4ccf2c4..735c38fa84 100644 --- a/en/device-dev/driver/driver-peripherals-codec-des.md +++ b/en/device-dev/driver/driver-peripherals-codec-des.md @@ -84,7 +84,7 @@ The codec module implements hardware encoding and decoding of video data. It con For more information, see [codec](https://gitee.com/openharmony/drivers_peripheral/tree/master/codec). -### Development Procedure +### How to Develop The codec HDI driver development procedure is as follows: #### Registering and Initializing the Driver diff --git a/en/device-dev/driver/driver-peripherals-external-des.md b/en/device-dev/driver/driver-peripherals-external-des.md index efaf1d14e9..d2b681dcad 100644 --- a/en/device-dev/driver/driver-peripherals-external-des.md +++ b/en/device-dev/driver/driver-peripherals-external-des.md @@ -5,22 +5,22 @@ ### WLAN -The Wireless Local Area Network (WLAN) Driver module in OpenHarmony is developed based on the Hardware Driver Foundation (HDF). It provides cross-OS porting, self-adaptation to component differences, and module assembly and building. +The Wireless Local Area Network (WLAN) driver module is developed based on OpenHarmony Hardware Driver Foundation (HDF). It supports modular assembly and building, automatic adaptation to device differences, and cross-OS porting. ### Working Principles -You can adapt your driver code based on the unified interfaces provided by the WLAN module. The WLAN module provides: +You can modify your driver code based on the unified APIs provided by the WLAN module. The WLAN module provides: -- A unified underlying interface to implement capabilities, such as setting up or closing a WLAN hotspot, scanning hotspots, and connecting to or disconnecting from a hotspot. -- A unified interface to the Hardware Device Interface (HDI) layer to implement capabilities, such as setting or obtaining the device Media Access Control (MAC) address and setting the transmit power. +- APIs for the underlying layer to implement capabilities, such as opening or closing a WLAN hotspot, scanning hotspots, and connecting to or disconnecting from a hotspot. +- APIs for the Hardware Device Interface (HDI) layer to implement capabilities, such as setting or obtaining the device Media Access Control (MAC) address and setting the transmit power. -The figure below shows the WLAN architecture. The WLAN Driver module implements startup loading, parses configuration files, and provides bus abstraction APIs. The WLAN Chip Driver module provides the MAC Sublayer Management Entity (MLME). +The following figure shows the WLAN architecture. The WLAN driver module implements startup loading, parses configuration files, and provides bus abstraction APIs. The WLAN chip driver module provides the MAC Sublayer Management Entity (MLME). **Figure 1** WLAN architecture ![image](figures/WLAN_architecture.png "WLAN architecture") - The figure below shows the WLAN driver architecture. + The following figure shows the WLAN driver architecture. **Figure 2** WLAN driver architecture @@ -32,11 +32,11 @@ The WLAN driver consists of the following modules: 2. WLAN Configuration Core: parses WLAN configuration files. -3. Access point (AP): provides a WLAN access interface for devices. +3. Access point (AP): allows devices to connect to the WLAN. -4. Station (STA): a terminal that accesses the WLAN system. +4. Station (STA): a device that has access to the WLAN system and allows transmission and reception of data. -5. mac80211: defines MAC-layer interfaces for underlying drivers. +5. mac80211: defines MAC-layer APIs for underlying drivers. 6. Bus: provides a unified bus abstract interface for the upper layer. It shields the differences between different kernels by calling the Secure Digital Input Output (SDIO) interfaces provided by the platform layer and encapsulating the adapted USB and PCIe interfaces. It also encapsulates different types of bus operations in a unified manner to shield differences between different chipsets. The complete bus driving capabilities provided by the bus module help simplify and streamline the development of different chip vendors. @@ -58,13 +58,13 @@ The relationships between the main modules are as follows: 4. The protocol stack works with the NetDevice, NetBuf, and FlowCtl modules to exchange data flows. -## Development Guidelines +## How to Develop ### Available APIs The WLAN module provides the following types of APIs: -1. Hardware Device Interface (HDI) and Hardware Abstraction Layer (HAL) APIs for upper-layer services +1. HDI and Hardware Abstraction Layer (HAL) APIs for upper-layer services 2. APIs for vendors @@ -75,7 +75,7 @@ The WLAN module provides the following types of APIs: ![image](figures/WLAN_driver_APIs.png "WLAN Driver APIs") -- The WLAN module provides HAL APIs for upper-layer services (applicable to small and mini systems). **Table 2** and **Table 3** describe some APIs. +- The WLAN module provides HAL APIs for upper-layer services (applicable to small and mini systems). **Table 1** and **Table 2** describe some APIs. **Table 1** wifi_hal.h @@ -95,7 +95,7 @@ The WLAN module provides the following types of APIs: | int32_t (\*getDeviceMacAddress)(const struct IWiFiBaseFeature \*, unsigned char \*, uint8_t)| Obtains the device MAC address.| | int32_t (\*setTxPower)(const struct IWiFiBaseFeature \*, int32_t)| Sets the transmit power.| -- The WLAN Driver module also provides APIs that you need to fill in the implementation. **Table 4** describes some APIs. +- The WLAN Driver module also provides APIs that you need to fill in the implementation. **Table 3** describes some APIs. **Table 3** net_device.h @@ -110,7 +110,7 @@ The WLAN module provides the following types of APIs: - The WLAN Driver module provides APIs that you can directly use to create or release a **WifiModule**, connect to or disconnect from a WLAN hotspot, request or release a **NetBuf**, and convert between the **pbuf** structure of Lightweight IP (lwIP) and a **NetBuf**. - Tables 5 to 7 describe the APIs. + The following tables describe the APIs. **Table 4** wifi_module.h @@ -119,7 +119,7 @@ The WLAN module provides the following types of APIs: | struct WifiModule \*WifiModuleCreate(const struct HdfConfigWifiModuleConfig \*config)| Creates a **WifiModule**.| | void WifiModuleDelete(struct WifiModule \*module)| Deletes a **WifiModule** and releases its data.| | int32_t DelFeature(struct WifiModule \*module, uint16_t featureType)| Deletes a feature from a **WifiModule**.| - | int32_t AddFeature(struct WifiModule \*module, uint16_t featureType, struct WifiFeature \*featureData)| Adds a feature to a **WifiModule**.| + | int32_t AddFeature(struct WifiModule \*module, uint16_t featureType,
    struct WifiFeature \*featureData)| Adds a feature to a **WifiModule**.| **Table 5** wifi_mac80211_ops.h @@ -136,11 +136,11 @@ The WLAN module provides the following types of APIs: | -------- | -------- | | static inline void NetBufQueueInit(struct NetBufQueue \*q)| Initializes a **NetBuf** queue.| | struct NetBuf \*NetBufAlloc(uint32_t size)| Allocates a **NetBuf**.| - | void NetBufFree(struct NetBuf \*nb) | Releases a **NetBuf**.| + | void NetBufFree(struct NetBuf \*nb)| Releases a **NetBuf**.| | struct NetBuf \*Pbuf2NetBuf(const struct NetDevice \*netdev, struct pbuf \*lwipBuf)| Converts the **pbuf** structure of lwIP to a **NetBuf**.| | struct pbuf \*NetBuf2Pbuf(const struct NetBuf \*nb)| Converts a **NetBuf** to the **pbuf** structure of lwIP.| -### How to Develop +### Development Procedure #### WLAN Framework Adaptation The WLAN driver framework developed based on the HDF and Platform framework provides a unified driver model regardless of the OS and system on a chip (SoC). When developing your WLAN driver, you need to configure data based on the WLAN driver framework. @@ -186,19 +186,19 @@ The following uses the Hi3881 WLAN chip as an example to describe how to initial } } reset { - resetType = 0; /* Reset type. The value 0 indicates that reset is dynamically determined, and 1 indicates reset through GPIO. */ - gpioId = 2; /* GPIO pin number. */ - activeLevel=1; /* Active level. The value 0 indicates low level, and 1 indicates high level. */ - resetHoldTime = 30; /* Hold time (ms) after a reset. */ + resetType = 0; /* Reset type. The value 0 indicates that reset is dynamically determined, and 1 indicates reset through GPIO. */ + gpioId = 2; /* GPIO pin number. */ + activeLevel=1; /* Active level. The value 0 indicates low level, and 1 indicates high level. */ + resetHoldTime = 30; /* Hold time (ms) after a reset. */ } - bootUpTimeout = 30; /* Boot timeout duration (ms). */ + bootUpTimeout = 30; /* Boot timeout duration (ms). */ bus { - busEnable = 1; /* Whether to initialize the bus. The value 1 means to initialize the bus; the value 0 means the opposite. */ - busType = 0; /* Bus type. The value 0 indicates SDIO. */ - busId = 2; /* Bus number. */ - funcNum = [1]; /* SDIO function number. */ - timeout = 1000; /* Timeout duration for data read/write. */ - blockSize = 512; /* Size of the data block to read or write. */ + busEnable = 1; /* Whether to initialize the bus. The value 1 means to initialize the bus; the value 0 means the opposite. */ + busType = 0; /* Bus type. The value 0 indicates SDIO. */ + busId = 2; /* Bus number. */ + funcNum = [1]; /* SDIO function number. */ + timeout = 1000; /* Timeout duration for data read/write. */ + blockSize = 512; /* Size of the data block to read or write. */ } } } @@ -546,11 +546,7 @@ The following uses the Hi3881 WLAN chip as an example to describe how to initial } ``` -4. Invoke the event reporting APIs. - - The WLAN framework provides the event reporting APIs. For details, see **hdf_wifi_event.c**. - - For example, call **HdfWiFiEventNewSta AP** to report information about the newly associated STA. +4. Invoke the event reporting APIs.
    The WLAN framework provides the event reporting APIs. For details, see hdf_wifi_event.c.
    For example, call **HdfWiFiEventNewSta AP** to report information about the newly associated STA. ```c hi_u32 oal_cfg80211_new_sta(oal_net_device_stru *net_device, const hi_u8 *mac_addr, hi_u8 addr_len, @@ -567,12 +563,10 @@ The following uses the Hi3881 WLAN chip as an example to describe how to initial hi_unref_param(en_gfp); hi_unref_param(addr_len); #endif - + return HI_SUCCESS; } ``` - - **Verification** Develop test cases in the WLAN module unit test to verify the basic features of the WLAN module. The following uses Hi3516D V300 standard system as an example. @@ -650,7 +644,7 @@ Develop test cases in the WLAN module unit test to verify the basic features of exit 0 ``` - - Create a **udhcpd.conf** file (used to start the **udhcpd**) and copy the following content to the file. In the following, **opt dns** *x.x.x.x* *x.x.x.x* indicates two DNS servers configured. You can configure DNS servers as required. + - Create a **udhcpd.conf** file (used to start the **udhcpd**) and copy the following content to the file.
    In the following, **opt dns** *x.x.x.x* *x.x.x.x* indicates two DNS servers configured. You can configure DNS servers as required. ```text start 192.168.12.2 @@ -704,54 +698,44 @@ Develop test cases in the WLAN module unit test to verify the basic features of busybox udhcpd /vendor/etc/udhcpd.conf ``` - 4. On the mobile phone, select the network named **test** in the available Wi-Fi list and enter the password. - - The network name and password are configured in the **hostapd.conf** file. You can see that network name in the connected Wi-Fi list if the connection is successful. + 4. On the mobile phone, select the network named **test** in the available Wi-Fi list and enter the password.
    The network name and password are configured in the **hostapd.conf** file. You can see that network name in the connected Wi-Fi list if the connection is successful. 5. Ping the test terminal from the development board. - + ```shell busybox ping xxx.xxx.xxx.xxx ``` - In the command, xxx.xxx.xxx.xxx indicates the IP address of the test terminal. If the test terminal can be pinged, the WLAN driver provides basic features normally. - - + In the command, *xxx.xxx.xxx.xxx* indicates the IP address of the test terminal. If the test terminal can be pinged, the WLAN driver provides basic features normally. - Verify basic STA features. - 1. Start the STA on the development board, and enable the hotspot on the test terminal. - - The hotspot name and password are configured in the **hostapd.conf** file. The hotspot name is **test**, and the password is **12345678**. - + 1. Start the STA on the development board, and enable the hotspot on the test terminal.
    The hotspot name and password are configured in the **hostapd.conf** file. The hotspot name is **test**, and the password is **12345678**. + 2. Run the following command in the **cmd** window: - + ```shell hdc shell wpa_supplicant -i wlan0 -d -c wpa_supplicant.conf ``` - - - + 3. Run the following commands in another **cmd** window: - + ```shell hdc shell mount -o rw,remount / mount -o rw,remount /vendor busybox udhcpc -i wlan0 -s system/lib/dhcpc.sh ``` - The IP addresses of the board and test terminal are displayed if the command is successful. - + 4. Ping the test terminal from the development board. - + ```shell busybox ping xxx.xxx.xxx.xxx ``` - - In the command, *xxx.xxx.xxx.xxx* indicates the IP address of the test terminal. If the test terminal can be pinged, the WLAN driver provides basic features normally. - + + In the command, xxx.xxx.xxx.xxx indicates the IP address of the test terminal. If the test terminal can be pinged, the WLAN driver provides basic features normally. #### **API Invocation** The WLAN driver module provides two types of capability interfaces for the upper layer: HDI interface and HAL interface. @@ -963,19 +947,17 @@ The WLAN driver module provides two types of capability interfaces for the upper - Code paths: - - Adaptation of WLAN FlowCtl component on LiteOS: **//drivers/hdf_core/adapter/khdf/liteos/model/network/wifi** - - Adaptation of HDF network model on LiteOS: **//drivers/hdf_core/adapter/khdf/liteos/model/network** - - - Adaptation of WLAN FlowCtl component on Linux, build of the HDF WLAN model, and build of the vendor's WLAN driver: **//drivers/hdf_core/adapter/khdf/linux/model/network/wifi** - - Core code for implementing the WLAN module: **//drivers/hdf_core/framework/model/network/wifi** - - External APIs of the WLAN module: **//drivers/hdf_core/framework/include/wifi** - - HDF network model APIs: **//drivers/hdf_core/framework/include/net** - - WLAN HDI server implementation: **//drivers/peripheral/wlan** - - - - - - - + Adaptation of WLAN FlowCtl component on LiteOS: **//drivers/hdf_core/adapter/khdf/liteos/model/network/wifi** + + Adaptation of HDF network model on LiteOS: **//drivers/hdf_core/adapter/khdf/liteos/model/network** + + Adaptation of WLAN FlowCtl component on Linux, build of the HDF WLAN model, and build of the vendor's WLAN driver: **//drivers/hdf_core/adapter/khdf/linux/model/network/wifi** + + Core code for implementing the WLAN module: **//drivers/hdf_core/framework/model/network/wifi** + + External APIs of the WLAN module: **//drivers/hdf_core/framework/include/wifi** + + HDF network model APIs: **//drivers/hdf_core/framework/include/net** + + WLAN HDI server implementation: **//drivers/peripheral/wlan** diff --git a/en/device-dev/driver/driver-peripherals-lcd-des.md b/en/device-dev/driver/driver-peripherals-lcd-des.md index d5ba25a559..ce3cfd04cf 100644 --- a/en/device-dev/driver/driver-peripherals-lcd-des.md +++ b/en/device-dev/driver/driver-peripherals-lcd-des.md @@ -1,19 +1,25 @@ # LCD - ## Overview +### Function + The Liquid Crystal Display (LCD) driver performs operations such as powering on the LCD and initializing the internal registers of the driver integrated circuits (ICs). -The display driver model developed based on the Hardware Driver Foundation [(HDF)](../driver/driver-hdf-overview.md) provides a basic framework for LCD driver development, improves driver development efficiency, and facilitates porting of the driver across OSs and chip platforms. The figure below shows the HDF-based display driver model. +The display driver model based on the [Hardware Driver Foundation (HDF)](../driver/driver-hdf-overview.md) provides the following functions: + +- Provides a basic framework for LCD driver development to improve development efficiency. + +- Facilitates driver porting across OSs and chip platforms. + +The following figure shows the HDF-based display driver model. **Figure 1** HDF-based display driver model ![image](figures/architecture-of-the-display-driver-model.png "Display Driver Model") - -The display driver model consists of the display common driver layer, SoC adapter layer, and LCD panel driver layer. The HDF-based display driver model shields the differences between kernel forms through platform and OSAL APIs so the LCD driver can be easily ported between different OSs and chip platforms. The display driver model connects to the display common Hardware Abstraction Layer (HAL), supports the implementation of the Hardware Device Interface (HDI), and provides various driver capability interfaces for graphics services through the Display-HDI. +The display driver model consists of the display common driver layer, SoC adapter layer, and LCD panel driver layer. The HDF-based display driver model shields the differences between kernel forms through platform and OSAL APIs so that the LCD driver can be easily ported across OSs and chip platforms. The display driver model connects to the display common Hardware Abstraction Layer (HAL), supports the implementation of the Hardware Device Interface (HDI), and provides various driver capability interfaces for graphics services through the Display-HDI. - Display common driver layer: connects to the display common HAL through the IOService data channel provided by the HDF to receive and process various upper-layer calls in a centralized manner. @@ -23,8 +29,7 @@ The display driver model consists of the display common driver layer, SoC adapte The display driver model leverages the capabilities and APIs provided by the platform to simplify the display driver development and improve the efficiency. - -## Available APIs +### Basic Concepts The LCD interfaces include the Mobile Industry Processor Interface (MIPI) Display Serial Interface (DSI), Transistor-Transistor Logic (TTL) interface, and Low Voltage Differential Signaling (LVDS) interface. The MIPI DSI and TTL interfaces are commonly used. Here is a brief introduction to them. @@ -34,7 +39,7 @@ The LCD interfaces include the Mobile Industry Processor Interface (MIPI) Displa ![](figures/mipi-dsi.png "MIPI DSI") - The DSI is defined by the MIPI Alliance for the displays used in mobile devices. The MIPI DSI is used to transmit image data, in compliance with the MIPI protocol. Generally, control information is sent to the peer IC in the form of MIPI packets over the MIPI DSI, without the need of additional peripheral interfaces. + The DSI is defined by the MIPI Alliance for the displays used in mobile devices. The MIPI DSI is used to transmit image data, in compliance with the MIPI protocol. Generally, control information is sent to the peer IC in the form of MIPI packets over the MIPI DSI, without the need of additional peripheral interfaces. - TTL interface @@ -42,14 +47,31 @@ The LCD interfaces include the Mobile Industry Processor Interface (MIPI) Displa ![](figures/ttl-interface.png "ttl-interface") - TTL level signals are generated by TTL devices, which are a major type of digital integrated circuits. TTL devices are manufactured using the bipolar process and feature high speed, low power consumption, and diversified types. + ​ TTL level signals are generated by TTL devices, which are a major type of digital integrated circuits. TTL devices are manufactured using the bipolar process and feature high speed, low power consumption, and diversified types. + + The TTL interface is used to transmit data in parallel mode under control signals. It transmits data signals, clock signals, and control signals (such as line synchronization signals, frame synchronization signals, and data validity signals). For the LCD with the TTL, additional peripheral interfaces, such as the Serial Peripheral Interface (SPI) and Inter-Integrated Circuit (I2C), are required for the read and write of the internal registers. - The TTL interface is used to transmit data in parallel mode under control signals. It transmits data signals, clock signals, and control signals (such as line synchronization signals, frame synchronization signals, and data validity signals). For the LCD with the TTL, additional peripheral interfaces, such as the Serial Peripheral Interface (SPI) and Inter-Integrated Circuit (I2C), are required for the read and write of the internal registers. +### Constraints +In addition to the IC model, you must consider the LCD peripheral circuit design, LCD interface unit of the baseband chip, backlight IC control, and upper-layer software programs. All these factors affect the development of the LCD driver. -## How to Develop +## Development Guidelines -The HDF-based display driver model provides a unified driver model for LCDs regardless of the OS (LiteOS or Linux OS) and chip platform (Hi35xx, Hi38xx, or V3S). The development procedure is as follows: +### When to Use + +Before applying your device with OpenHarmony system, you need to perform LCD driver adaption. The HDF-based display driver model provides a unified driver model for LCD adaptation regardless of the OS (LiteOS or Linux OS) and chip platform (Hi35xx, Hi38xx, or V3S). + +### Available APIs + +Table 1 APIs required for LCD driver adaptation + +| API | Description | +| :------------------------------------------------------ | ------------------- | +| display :: host | Sets device information. | +| static int32_t LcdResetOn(void) | Sets the status of the reset pin.| +| int32_t SampleEntryInit(struct HdfDeviceObject *object) | Initializes the entry function of the device driver. | + +### How to Develop 1. Add the device configuration related to the LCD driver. @@ -58,305 +80,228 @@ The HDF-based display driver model provides a unified driver model for LCDs rega 3. Add the LCD panel driver and register the panel driver functions in the driver entry function **Init**. The functions provide capabilities for: - Powering on/off the LCD device + Based on the LCD hardware connection, use the GPIO APIs provided by the platform to perform operations on the LCD pins, such as the reset pin and IOVCC pin. For details about the power-on sequence, see the SPEC provided by the LCD supplier. + - Sending the initialization sequence + Based on the LCD hardware interfaces, use the I2C, SPI, and MIPI interfaces provided by the platform to download the LCD initialization sequence. For details, see the SPEC provided by the LCD supplier. -4. Implement other HDF APIs as required, for example, **Release()**. - -5. Use the HDF to create other device nodes for implementing service logic or debugging as required. - - -## Development Example - -Add the device configuration. - - -``` -/* Configuration of the devices related to the display driver */ -display :: host { - hostName = "display_host"; - /* Configuration of the HDF display driver */ - device_hdf_disp :: device { - device0 :: deviceNode { - policy = 2; - priority = 200; - permission = 0660; - moduleName = "HDF_DISP"; - serviceName = "hdf_disp"; - } - } - /* Configuration of the driver device at the SoC adapter layer */ - device_hi35xx_disp :: device { - device0 :: deviceNode { - policy = 0; - priority = 199; - moduleName = "HI351XX_DISP"; - } - } - /* Configuration of the LCD driver */ - device_lcd :: device { - device0 :: deviceNode { - policy = 0; - priority = 100; - preload = 0; - moduleName = "LCD_Sample"; - } - device1 :: deviceNode { - policy = 0; - priority = 100; - preload = 2; - moduleName = "LCD_SampleXX"; - } - } -} -``` - -Adapt the driver to the chip at the SoC adapter layer. The following example shows how to adapt the MIPI device to the Hi35xx series chips at the SoC adapter layer: - - -``` -static int32_t MipiDsiInit(struct PanelInfo *info) -{ - int32_t ret; - struct DevHandle *mipiHandle = NULL; - struct MipiCfg cfg; - - mipiHandle = MipiDsiOpen(0); - if (mipiHandle == NULL) { - HDF_LOGE("%s: MipiDsiOpen failure", __func__); - return HDF_FAILURE; - } - cfg.lane = info->mipi.lane; - cfg.mode = info->mipi.mode; - cfg.format = info->mipi.format; - cfg.burstMode = info->mipi.burstMode; - cfg.timing.xPixels = info->width; - cfg.timing.hsaPixels = info->hsw; - cfg.timing.hbpPixels = info->hbp; - cfg.timing.hlinePixels = info->width + info->hbp + info->hfp + info->hsw; - cfg.timing.vsaLines = info->vsw; - cfg.timing.vbpLines = info->vbp; - cfg.timing.vfpLines = info->vfp; - cfg.timing.ylines = info->height; - /* 0 : no care */ - cfg.timing.edpiCmdSize = 0; - cfg.pixelClk = CalcPixelClk(info); - cfg.phyDataRate = CalcDataRate(info); - /* Configure the MIPI device. */ - ret = MipiDsiSetCfg(mipiHandle, &cfg); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s:MipiDsiSetCfg failure", __func__); - } - MipiDsiClose(mipiHandle); - HDF_LOGI("%s:pixelClk = %d, phyDataRate = %d\n", __func__, - cfg.pixelClk, cfg.phyDataRate); - return ret; -} -``` - -Develop an LCD driver. The sample code is as follows: - - -``` -#define RESET_GPIO 5 -#define MIPI_DSI0 0 -#define BLK_PWM1 1 -#define PWM_MAX_PERIOD 100000 -/* Set the backlight. */ -#define MIN_LEVEL 0 -#define MAX_LEVEL 255 -#define DEFAULT_LEVEL 100 - -#define WIDTH 480 -#define HEIGHT 960 -#define HORIZONTAL_BACK_PORCH 20 -#define HORIZONTAL_FRONT_PORCH 20 -#define HORIZONTAL_SYNC_WIDTH 10 -#define VERTICAL_BACK_PORCH 14 -#define VERTICAL_FRONT_PORCH 16 -#define VERTICAL_SYNC_WIDTH 2 -#define FRAME_RATE 60 - -/* PanelInfo structure */ -struct PanelInfo { - uint32_t width; - uint32_t height; - uint32_t hbp; - uint32_t hfp; - uint32_t hsw; - uint32_t vbp; - uint32_t vfp; - uint32_t vsw; - uint32_t frameRate; - enum LcdIntfType intfType; - enum IntfSync intfSync; - struct MipiDsiDesc mipi; - struct BlkDesc blk; - struct PwmCfg pwm; -}; - -/* Initialization sequence of the LCD panel */ -static uint8_t g_payLoad0[] = { 0xF0, 0x5A, 0x5A }; -static uint8_t g_payLoad1[] = { 0xF1, 0xA5, 0xA5 }; -static uint8_t g_payLoad2[] = { 0xB3, 0x03, 0x03, 0x03, 0x07, 0x05, 0x0D, 0x0F, 0x11, 0x13, 0x09, 0x0B }; -static uint8_t g_payLoad3[] = { 0xB4, 0x03, 0x03, 0x03, 0x06, 0x04, 0x0C, 0x0E, 0x10, 0x12, 0x08, 0x0A }; -static uint8_t g_payLoad4[] = { 0xB0, 0x54, 0x32, 0x23, 0x45, 0x44, 0x44, 0x44, 0x44, 0x60, 0x00, 0x60, 0x1C }; -static uint8_t g_payLoad5[] = { 0xB1, 0x32, 0x84, 0x02, 0x87, 0x12, 0x00, 0x50, 0x1C }; -static uint8_t g_payLoad6[] = { 0xB2, 0x73, 0x09, 0x08 }; -static uint8_t g_payLoad7[] = { 0xB6, 0x5C, 0x5C, 0x05 }; -static uint8_t g_payLoad8[] = { 0xB8, 0x23, 0x41, 0x32, 0x30, 0x03 }; -static uint8_t g_payLoad9[] = { 0xBC, 0xD2, 0x0E, 0x63, 0x63, 0x5A, 0x32, 0x22, 0x14, 0x22, 0x03 }; -static uint8_t g_payLoad10[] = { 0xb7, 0x41 }; -static uint8_t g_payLoad11[] = { 0xC1, 0x0c, 0x10, 0x04, 0x0c, 0x10, 0x04 }; -static uint8_t g_payLoad12[] = { 0xC2, 0x10, 0xE0 }; -static uint8_t g_payLoad13[] = { 0xC3, 0x22, 0x11 }; -static uint8_t g_payLoad14[] = { 0xD0, 0x07, 0xFF }; -static uint8_t g_payLoad15[] = { 0xD2, 0x63, 0x0B, 0x08, 0x88 }; -static uint8_t g_payLoad16[] = { 0xC6, 0x08, 0x15, 0xFF, 0x10, 0x16, 0x80, 0x60 }; -static uint8_t g_payLoad17[] = { 0xc7, 0x04 }; -static uint8_t g_payLoad18[] = { - 0xC8, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52, 0x43, 0x4C, 0x40, - 0x3D, 0x30, 0x1E, 0x06, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52, - 0x43, 0x4C, 0x40, 0x3D, 0x30, 0x1E, 0x06 -}; -static uint8_t g_payLoad19[] = { 0x11 }; -static uint8_t g_payLoad20[] = { 0x29 }; - -struct DsiCmdDesc g_OnCmd[] = { - { 0x29, 0, sizeof(g_payLoad0), g_payLoad0 }, - { 0x29, 0, sizeof(g_payLoad1), g_payLoad1 }, - { 0x29, 0, sizeof(g_payLoad2), g_payLoad2 }, - { 0x29, 0, sizeof(g_payLoad3), g_payLoad3 }, - { 0x29, 0, sizeof(g_payLoad4), g_payLoad4 }, - { 0x29, 0, sizeof(g_payLoad5), g_payLoad5 }, - { 0x29, 0, sizeof(g_payLoad6), g_payLoad6 }, - { 0x29, 0, sizeof(g_payLoad7), g_payLoad7 }, - { 0x29, 0, sizeof(g_payLoad8), g_payLoad8 }, - { 0x29, 0, sizeof(g_payLoad9), g_payLoad9 }, - { 0x23, 0, sizeof(g_payLoad10), g_payLoad10 }, - { 0x29, 0, sizeof(g_payLoad11), g_payLoad11 }, - { 0x29, 0, sizeof(g_payLoad12), g_payLoad12 }, - { 0x29, 0, sizeof(g_payLoad13), g_payLoad13 }, - { 0x29, 0, sizeof(g_payLoad14), g_payLoad14 }, - { 0x29, 0, sizeof(g_payLoad15), g_payLoad15 }, - { 0x29, 0, sizeof(g_payLoad16), g_payLoad16 }, - { 0x23, 0, sizeof(g_payLoad17), g_payLoad17 }, - { 0x29, 1, sizeof(g_payLoad18), g_payLoad18 }, - { 0x05, 120, sizeof(g_payLoad19), g_payLoad19 }, - { 0x05, 120, sizeof(g_payLoad20), g_payLoad20 }, -}; -static DevHandle g_mipiHandle = NULL; -static DevHandle g_pwmHandle = NULL; - -/* Set the status of the reset pin. */ -static int32_t LcdResetOn(void) -{ - int32_t ret; - ret = GpioSetDir(RESET_GPIO, GPIO_DIR_OUT); - if (ret != HDF_SUCCESS) { - HDF_LOGE("GpioSetDir failure, ret:%d", ret); - return HDF_FAILURE; - } - ret = GpioWrite(RESET_GPIO, GPIO_VAL_HIGH); - if (ret != HDF_SUCCESS) { - HDF_LOGE("GpioWrite failure, ret:%d", ret); - return HDF_FAILURE; - } - /* Set the delay to 20 ms. */ - OsalMSleep(20); - return HDF_SUCCESS; -} - -static int32_t SampleInit(void) -{ - /* Open the MIPI DSI device handle. */ - g_mipiHandle = MipiDsiOpen(MIPI_DSI0); - if (g_mipiHandle == NULL) { - HDF_LOGE("%s: MipiDsiOpen failure", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -static int32_t SampleOn(void) -{ - int32_t ret; - /* Power on the LCD. */ - ret = LcdResetOn(); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: LcdResetOn failure", __func__); - return HDF_FAILURE; - } - if (g_mipiHandle == NULL) { - HDF_LOGE("%s: g_mipiHandle is null", __func__); - return HDF_FAILURE; - } - /* Send the initialization sequence via MIPI. */ - int32_t count = sizeof(g_OnCmd) / sizeof(g_OnCmd[0]); - int32_t i; - for (i = 0; i < count; i++) { - ret = MipiDsiTx(g_mipiHandle, &(g_OnCmd[i])); - if (ret != HDF_SUCCESS) { - HDF_LOGE("MipiDsiTx failure"); - return HDF_FAILURE; - } - } - /* Set MIPI to the high speed (HS) mode. */ - MipiDsiSetHsMode(g_mipiHandle); - return HDF_SUCCESS; -} - -/* PanelInfo structure variables */ -static struct PanelInfo g_panelInfo = { - .width = WIDTH, /* width */ - .height = HEIGHT, /* height */ - .hbp = HORIZONTAL_BACK_PORCH, /* horizontal back porch */ - .hfp = HORIZONTAL_FRONT_PORCH, /* horizontal front porch */ - .hsw = HORIZONTAL_SYNC_WIDTH, /* horizontal sync width */ - .vbp = VERTICAL_BACK_PORCH, /* vertical back porch */ - .vfp = VERTICAL_FRONT_PORCH, /* vertical front porch */ - .vsw = VERTICAL_SYNC_WIDTH, /* vertical sync width */ - .frameRate = FRAME_RATE, /* frame rate */ - .intfType = MIPI_DSI, /* panel interface type */ - .intfSync = OUTPUT_USER, /* output timing type */ - /* MIPI configuration */ - .mipi = { DSI_2_LANES, DSI_VIDEO_MODE, VIDEO_BURST_MODE, FORMAT_RGB_24_BIT }, - /* backlight config info */ - .blk = { BLK_PWM, MIN_LEVEL, MAX_LEVEL, DEFAULT_LEVEL }, - .pwm = { BLK_PWM1, PWM_MAX_PERIOD }, -}; - -/* Basic APIs that need to be adapted for the chip driver */ -static struct PanelData g_panelData = { - .info = &g_panelInfo, - .init = SampleInit, - .on = SampleOn, - .off = SampleOff, - .setBacklight = SampleSetBacklight, -}; - -/* Entry function of the chip driver */ -int32_t SampleEntryInit(struct HdfDeviceObject *object) -{ - HDF_LOGI("%s: enter", __func__); - if (object == NULL) { - HDF_LOGE("%s: param is null!", __func__); - return HDF_FAILURE; - } - /* Register the device driver APIs with the platform driver. */ - if (PanelDataRegister(&g_panelData) != HDF_SUCCESS) { - HDF_LOGE("%s: PanelDataRegister error!", __func__); - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -struct HdfDriverEntry g_sampleDevEntry = { - .moduleVersion = 1, - .moduleName = "LCD_SAMPLE", - .Init = SampleEntryInit, -}; - -HDF_INIT(g_sampleDevEntry); -``` +4. (Optional) Implement other HDF APIs, such as **Release()**, as required. + +5. (Optional) Create other device nodes for implementing service logic or debugging based on the HDF as required. + +### Example + +The following uses the Hi35xx series chips as an example to describe how to perform LCD driver adaptation. + +1. Add device information in the **vendor/bearpi/bearpi_hm_micro/hdf_config/device_info/device_info.hcs** file. + + ```c++ + /* Configuration of the devices related to the display driver */ + display :: host { + hostName = "display_host"; + /* Configuration of the HDF display driver */ + device_hdf_disp :: device { + device0 :: deviceNode { + policy = 2; + priority = 200; + permission = 0660; + moduleName = "HDF_DISP"; + serviceName = "hdf_disp"; + } + } + /* Configuration of the driver device at the SoC adapter layer */ + device_hi35xx_disp :: device { + device0 :: deviceNode { + policy = 0; + priority = 199; + moduleName = "HI351XX_DISP"; + } + } + /* Configuration of the LCD driver */ + device_lcd :: device { + device0 :: deviceNode { + policy = 0; + priority = 100; + preload = 0; + moduleName = "LCD_Sample"; + } + device1 :: deviceNode { + policy = 0; + priority = 100; + preload = 2; + moduleName = "LCD_SampleXX"; + } + } + } + ``` + +2. Configure the chip platform driver information in the **drivers/hdf_core/framework/model/display/driver/adapter_soc/hi35xx_disp.c file**. + + ```c++ + /* Configuration of the display driver to adapt to the MIPI and chip platform */ + static int32_t MipiDsiInit(struct PanelInfo *info) + { + int32_t ret; + struct DevHandle *mipiHandle = NULL; + struct MipiCfg cfg; + + mipiHandle = MipiDsiOpen(0); + if (mipiHandle == NULL) { + HDF_LOGE("%s: MipiDsiOpen failure", __func__); + return HDF_FAILURE; + } + cfg.lane = info->mipi.lane; + cfg.mode = info->mipi.mode; + cfg.format = info->mipi.format; + cfg.burstMode = info->mipi.burstMode; + cfg.timing.xPixels = info->width; + cfg.timing.hsaPixels = info->hsw; + cfg.timing.hbpPixels = info->hbp; + cfg.timing.hlinePixels = info->width + info->hbp + info->hfp + info->hsw; + cfg.timing.vsaLines = info->vsw; + cfg.timing.vbpLines = info->vbp; + cfg.timing.vfpLines = info->vfp; + cfg.timing.ylines = info->height; + /* 0 : no care */ + cfg.timing.edpiCmdSize = 0; + cfg.pixelClk = CalcPixelClk(info); + cfg.phyDataRate = CalcDataRate(info); + /* Configure the MIPI device. */ + ret = MipiDsiSetCfg(mipiHandle, &cfg); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s:MipiDsiSetCfg failure", __func__); + } + MipiDsiClose(mipiHandle); + HDF_LOGI("%s:pixelClk = %d, phyDataRate = %d\n", __func__, + cfg.pixelClk, cfg.phyDataRate); + return ret; + } + ``` + +3. Add a device in **drivers/hdf_core/framework/model/display/driver/panel/mipi_icn9700.c**. + + - Define driver-related interface information. + + ```c++ + #define RESET_GPIO 5 + #define MIPI_DSI0 0 + #define BLK_PWM1 1 + #define PWM_MAX_PERIOD 100000 + /* Set the backlight. */ + #define MIN_LEVEL 0 + #define MAX_LEVEL 255 + #define DEFAULT_LEVEL 100 + #define WIDTH 480 + #define HEIGHT 960 + #define HORIZONTAL_BACK_PORCH 20 + #define HORIZONTAL_FRONT_PORCH 20 + #define HORIZONTAL_SYNC_WIDTH 10 + #define VERTICAL_BACK_PORCH 14 + #define VERTICAL_FRONT_PORCH 16 + #define VERTICAL_SYNC_WIDTH 2 + #define FRAME_RATE 60 + ``` + + - Define the **PanelInfo** structure. + + ```c++ + struct PanelInfo { + uint32_t width; + uint32_t height; + uint32_t hbp; + uint32_t hfp; + uint32_t hsw; + uint32_t vbp; + uint32_t vfp; + uint32_t vsw; + uint32_t frameRate; + enum LcdIntfType intfType; + enum IntfSync intfSync; + struct MipiDsiDesc mipi; + struct BlkDesc blk; + struct PwmCfg pwm; + }; + ``` + + - Initialize the LCD. + + ```c++ + static uint8_t g_payLoad0[] = { 0xF0, 0x5A, 0x5A }; + static uint8_t g_payLoad1[] = { 0xF1, 0xA5, 0xA5 }; + static uint8_t g_payLoad2[] = { 0xB3, 0x03, 0x03, 0x03, 0x07, 0x05, 0x0D, 0x0F, 0x11, 0x13, 0x09, 0x0B }; + static uint8_t g_payLoad3[] = { 0xB4, 0x03, 0x03, 0x03, 0x06, 0x04, 0x0C, 0x0E, 0x10, 0x12, 0x08, 0x0A }; + static uint8_t g_payLoad4[] = { 0xB0, 0x54, 0x32, 0x23, 0x45, 0x44, 0x44, 0x44, 0x44, 0x60, 0x00, 0x60, 0x1C }; + static uint8_t g_payLoad5[] = { 0xB1, 0x32, 0x84, 0x02, 0x87, 0x12, 0x00, 0x50, 0x1C }; + static uint8_t g_payLoad6[] = { 0xB2, 0x73, 0x09, 0x08 }; + static uint8_t g_payLoad7[] = { 0xB6, 0x5C, 0x5C, 0x05 }; + static uint8_t g_payLoad8[] = { 0xB8, 0x23, 0x41, 0x32, 0x30, 0x03 }; + static uint8_t g_payLoad9[] = { 0xBC, 0xD2, 0x0E, 0x63, 0x63, 0x5A, 0x32, 0x22, 0x14, 0x22, 0x03 }; + static uint8_t g_payLoad10[] = { 0xb7, 0x41 }; + static uint8_t g_payLoad11[] = { 0xC1, 0x0c, 0x10, 0x04, 0x0c, 0x10, 0x04 }; + static uint8_t g_payLoad12[] = { 0xC2, 0x10, 0xE0 }; + static uint8_t g_payLoad13[] = { 0xC3, 0x22, 0x11 }; + static uint8_t g_payLoad14[] = { 0xD0, 0x07, 0xFF }; + static uint8_t g_payLoad15[] = { 0xD2, 0x63, 0x0B, 0x08, 0x88 }; + static uint8_t g_payLoad16[] = { 0xC6, 0x08, 0x15, 0xFF, 0x10, 0x16, 0x80, 0x60 }; + static uint8_t g_payLoad17[] = { 0xc7, 0x04 }; + static uint8_t g_payLoad18[] = { + 0xC8, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52, 0x43, 0x4C, 0x40, + 0x3D, 0x30, 0x1E, 0x06, 0x7C, 0x50, 0x3B, 0x2C, 0x25, 0x16, 0x1C, 0x08, 0x27, 0x2B, 0x2F, 0x52, + 0x43, 0x4C, 0x40, 0x3D, 0x30, 0x1E, 0x06 + }; + static uint8_t g_payLoad19[] = { 0x11 }; + static uint8_t g_payLoad20[] = { 0x29 }; + static DevHandle g_mipiHandle = NULL; + static DevHandle g_pwmHandle = NULL; + ``` + + - Set the status of the reset pin. + + ```c++ + static int32_t LcdResetOn(void) + { + int32_t ret; + ret = GpioSetDir(RESET_GPIO, GPIO_DIR_OUT); + if (ret != HDF_SUCCESS) { + HDF_LOGE("GpioSetDir failure, ret:%d", ret); + return HDF_FAILURE; + } + ret = GpioWrite(RESET_GPIO, GPIO_VAL_HIGH); + if (ret != HDF_SUCCESS) { + HDF_LOGE("GpioWrite failure, ret:%d", ret); + return HDF_FAILURE; + } + /* Set the delay to 20 ms. */ + OsalMSleep(20); + return HDF_SUCCESS; + } + ``` + + - Initialize the entry function of the device driver. + + ```c++ + int32_t SampleEntryInit(struct HdfDeviceObject *object) + { + HDF_LOGI("%s: enter", __func__); + if (object == NULL) { + HDF_LOGE("%s: param is null!", __func__); + return HDF_FAILURE; + } + /* Register the device driver APIs with the platform driver. */ + if (PanelDataRegister(&g_panelData) != HDF_SUCCESS) { + HDF_LOGE("%s: PanelDataRegister error!", __func__); + return HDF_FAILURE; + } + return HDF_SUCCESS; + } + + struct HdfDriverEntry g_sampleDevEntry = { + .moduleVersion = 1, + .moduleName = "LCD_SAMPLE", + .Init = SampleEntryInit, + }; + + HDF_INIT(g_sampleDevEntry); + ``` diff --git a/en/device-dev/driver/driver-peripherals-light-des.md b/en/device-dev/driver/driver-peripherals-light-des.md index 2abac6f9b9..9b680a1bce 100644 --- a/en/device-dev/driver/driver-peripherals-light-des.md +++ b/en/device-dev/driver/driver-peripherals-light-des.md @@ -5,7 +5,7 @@ ### Light -The light driver model provides APIs for the upper-layer light hardware service layer to control lights, including obtaining the light type, setting the lighting mode and blinking effect, and turning on or off a light. This model implements functionalities such as cross-OS migration and differentiated configurations based on the Hardware Driver Foundation (HDF) to achieve the goal of "one-time development for cross-system deployment" of the light driver. +The light driver model provides APIs for the upper-layer light hardware service layer to control lights, including obtaining the light type, setting the lighting mode and blinking effect, and turning on or off a light. This model implements cross-OS porting and differentiated configurations based on the Hardware Driver Foundation (HDF) to achieve the goal of "one-time development for cross-system deployment" of the light driver. The figure below shows the light driver model. @@ -21,14 +21,14 @@ The figure below shows how the light driver works. ![How light driver works](figures/light_working.png) -The following uses the Hi3516D V300 development board powered by the standard system as an example to describe how the light driver works. +The following describes how the light module driver loads and starts on a Hi3516D V300 board that runs the standard system. -1. The light driver reads the light device management configuration from **Light Host** in the **device_info.hcs** file. -2. The light driver reads the light data configuration from the **light_config.hcs** file. -3. The light driver parses the light device management configuration and associates with the corresponding device driver. -4. The light proxy delivers an instruction to the light stub. -5. The light stub delivers an instruction to the light controller. -6. The light abstract driver interface is started. +1. The Device Manager reads the Light device management configuration from the **device_info.hcs** file. +2. The Device Manager reads the light data configuration from the **light_config.hcs** file. +3. The HCS Parser parses the light device management configuration, loads the Light Host, and controls the Host to load the driver. +4. The Light Proxy obtains the light HDI service instance and calls the Light Stub over Inter-Process Communication (IPC). +5. The Light Stub processes IPC-related service logic and calls the Light Controller after parameter deserialization. +6. The Light Controller implements the HDI APIs and calls the Light Abstract Driver APIs to operate the light devices. ## Development Guidelines @@ -38,33 +38,32 @@ Light control is widely used in daily life. For example, a light is blinking whe ### Available APIs -The light driver model provides APIs to obtain information about all the lights in the system and dynamically set the blinking mode and duration. The light hardware service calls the **GetLightInfo** method to obtain basic information about the light and calls the **TurnOnLight** method to make the light blinking. The table below describes the APIs of the light driver model. +The light driver model provides APIs for obtaining information about all the lights in the system and dynamically setting the blinking mode and duration. The light hardware service calls **GetLightInfo()** to obtain the basic light information, calls **TurnOnLight()** to set the blinking effect, and calls **TurnOffLight()** to turn off lights. The following table describes the APIs of the light driver model. **Table 1** APIs of the light driver model -| API | Description | +| API | Description | | ------------------------------------------------------------ | ------------------------------------------------------------ | -| int32_t (*GetLightInfo)(struct LightInfo **lightInfo, uint32_t *count) | Obtains information about all lights in the system.
    - **lightInfo** indicates the double pointer to the basic light information.
    - **count** indicates the pointer to the number of lights. | -| int32_t (*TurnOnLight)(uint32_t lightId, struct LightEffect *effect) | Turns on available lights in the list based on the specified light type.
    **lightId** indicates the light type, and **effect** indicates the pointer to the blinking effect. | -| int32_t (*TurnOffLight)(uint32_t lightId) | Turns off available lights in the light list based on the specified light type.
    **lightId** indicates the light type. | +| int32_t (*GetLightInfo)([out] struct LightInfo **lightInfo, [out] uint32_t *count) | Obtains information about all types of lights in the system.
    **lightInfo** indicates the double pointer to the light information obtained.
    **count** indicates the pointer to the number of lights.| +| int32_t (*TurnOnLight)([in] uint32_t lightId, [in] struct LightEffect *effect) | Turns on available lights in the list based on the specified light type.
    **lightId** indicates the light type, and **effect** indicates the pointer to the light effect.| +| int32_t (*TurnOffLight)([in] uint32_t lightId) | Turns off available lights in the list based on the specified light type. | -### How to Develop -1. Based on the HDF and the driver entry, complete the light abstract driver development (using the **Bind**, **Init**, **Release**, and **Dispatch** functions), resource configuration, and HCS parsing. Configure the light driver device information. +### Development Procedure +1. Based on the HDF and the driver entry, complete the light abstract driver development (using the **Bind**, **Init**, **Release**, and **Dispatch** functions), resource configuration, and HCS parsing. - Call **HDF_INIT** to register the driver entry with the HDF. Generally, the HDF calls the **Bind** function and then the **Init** function to load the driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. - The light driver model uses HDF configuration source (HCS). For details about HCS fields, see [Configuration Management](../driver/driver-hdf-manage.md). - The light driver entry is defined as follows: + - The light driver model uses HDF configuration source (HCS). For details about HCS fields, see [Configuration Management](driver-hdf-manage.md). The light driver entry is defined as follows: ```c /* Register the light entry data structure object. */ struct HdfDriverEntry g_lightDriverEntry = { - .moduleVersion = 1, // Light module version. - .moduleName = "HDF_LIGHT", // Light module name, which must be the same as the value of moduleName in the device_info.hcs file. - .Bind = BindLightDriver, // BInd the light driver. - .Init = InitLightDriver, // Initialize the light driver. - .Release = ReleaseLightDriver, // Release the light resources. + .moduleVersion = 1, // Version of the light module. + .moduleName = "HDF_LIGHT", // Light module name, which must be the same as the value of moduleName in the device_info.hcs file. + .Bind = BindLightDriver, // Bind() of the light driver. + .Init = InitLightDriver, // Init() of the light driver. + .Release = ReleaseLightDriver, // Release() of the light driver. }; - /* Call HDF_INIT to register the driver entry with the HDF. When loading the driver, the HDF calls Bind() and then Init() to load the driver. If Init() fails to be called, the HDF will call Release() to release resources and exit. */ + /* Call HDF_INIT to register the driver entry with the HDF. */ HDF_INIT(g_lightDriverEntry); ``` @@ -122,7 +121,7 @@ The light driver model provides APIs to obtain information about all the lights } /* Initialize work items. */ if (HdfWorkInit(&drvData->work, LightWorkEntry, (void*)drvData) != HDF_SUCCESS) { - HDF_LOGE("%s: init workQueue fail!", __func__); + HDF_LOGE("%s: init work fail!", __func__); return HDF_FAILURE; } /* Parse the HCS. */ @@ -160,20 +159,24 @@ The light driver model provides APIs to obtain information about all the lights } ``` - - The light device management module publishes light device APIs in the system. During the system startup process, the HDF loads the device management driver based on **Light Host** in the HCS. + - The light device management module is responsible for publishing light device APIs in the system. During the system startup process, the HDF loads the device management driver based on **Light Host** in the HCS. - ``` - /* Light device HCS */ - device_light :: device { - device0 :: deviceNode { - policy = 2; // Policy for the driver to publish services. (0: The driver does not provide services. 1: The driver publishes services for the kernel space. 2: The driver publishes services for both the kernel space and user space.) - priority = 100; // Light driver startup priority. The value ranges from 0 to 200. A larger value indicates a lower priority. The value 100 is recommended. If the priorities are the same, the device loading sequence cannot be ensured. - preload = 0; // Whether to load the driver on demand. The value 0 means to load the driver on demand; the value 2 means the opposite. - permission = 0664; // Permission for the driver to create a device node. - moduleName = "HDF_LIGHT"; // Light driver name. The value of this field must be the same as that of moduleName in the HdfDriverEntry structure. - serviceName = "hdf_light"; // Unique name of the service published by the driver. - deviceMatchAttr = "hdf_light_driver"; // Keyword for matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. + ```c + /* HCS of the light device. */ + light :: host { + hostName = "light_host"; + device_light :: device { + device0 :: deviceNode { + policy = 2; // Policy for the driver to publish services. If the value is 0, the driver does not publish services. If the value is 1, the driver publishes services to the kernel space. If the value is 2, the driver publishes services to both the kernel space and user space. + priority = 100; // Priority (0–200) for starting the light driver. A larger value indicates a lower priority. The recommended value is 100. If the priorities are the same, the device loading sequence is not ensured. + preload = 0; // The value 0 means to load the driver by default during the startup of the system. The value 2 means the opposite. + permission = 0664; // Permission for the device node created. + moduleName = "HDF_LIGHT"; // Light driver name. The value must be the same as the value of moduleName in the driver entry structure. + serviceName = "hdf_light"; // Service published by the light driver. The service name must be unique. + deviceMatchAttr = "hdf_light_driver"; // Keyword for matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. + } } + } ``` 2. Parse the device attribute information and registers, and register them with the light device management module. @@ -193,34 +196,35 @@ The light driver model provides APIs to obtain information about all the lights } for (i = 0; i < drvData->lightNum; ++i) { - ..... - /* Types are used as subscripts to create space. */ - drvData->info[temp] = (struct LightDeviceInfo *)OsalMemCalloc(sizeof(struct LightDeviceInfo)); - ..... - /* Fill in the light device information. */ - ret = parser->GetUint32(node, "busRNum", (uint32_t *)&drvData->info[temp]->busRNum, 0); - if (ret != HDF_SUCCESS) { - /* If busNum fails to be obtained, the color of the light corresponding to busNum cannot be set. */ - drvData->info[temp]->busRNum = LIGHT_INVALID_GPIO; - } - ret = parser->GetUint32(node, "busGNum", (uint32_t *)&drvData->info[temp]->busGNum, 0); - if (ret != HDF_SUCCESS) { - drvData->info[temp]->busGNum = LIGHT_INVALID_GPIO; - } - ret = parser->GetUint32(node, "busBNum", (uint32_t *)&drvData->info[temp]->busBNum, 0); - if (ret != HDF_SUCCESS) { - drvData->info[temp]->busBNum = LIGHT_INVALID_GPIO; + ..... + /* Types are used as subscripts to create space. */ + drvData->info[temp] = (struct LightDeviceInfo *)OsalMemCalloc(sizeof(struct LightDeviceInfo)); + ..... + /* Fill in the light device information. */ + ret = parser->GetUint32(node, "busRNum", (uint32_t *)&drvData->info[temp]->busRNum, 0); + if (ret != HDF_SUCCESS) { + /* If busNum fails to be obtained, the color of the light corresponding to busNum cannot be set. */ + drvData->info[temp]->busRNum = LIGHT_INVALID_GPIO; + } + ret = parser->GetUint32(node, "busGNum", (uint32_t *)&drvData->info[temp]->busGNum, 0); + if (ret != HDF_SUCCESS) { + drvData->info[temp]->busGNum = LIGHT_INVALID_GPIO; + } + ret = parser->GetUint32(node, "busBNum", (uint32_t *)&drvData->info[temp]->busBNum, 0); + if (ret != HDF_SUCCESS) { + drvData->info[temp]->busBNum = LIGHT_INVALID_GPIO; + } } ..... return HDF_SUCCESS; } ``` -3. Call related APIs to obtain the light type, turn on and off lights, and create and delete the timer based on the blinking mode. +3. Implement the APIs for obtaining the light type, setting the blinking mode, turning on and off lights, and creating and destroying a timer based on the blinking mode. ```c - /* Call GetAllLightInfo() to obtain the light type. Call TurnOnLight() to enable the blinking mode. - Call TurnOffLight() to stop blinking. */ + /* Call GetAllLightInfo() to obtain the light types, call TurnOnLight() to turn on lights, + and call TurnOffLight() to turn off lights. */ static int32_t GetAllLightInfo(struct HdfSBuf *data, struct HdfSBuf *reply) { ..... @@ -255,7 +259,7 @@ The light driver model provides APIs to obtain information about all the lights } else { lightBrightness = drvData->info[lightId]->lightBrightness; } - /* If bits 0 to 7 are not 0, output the GPIO pin corresponding to blue based on the status of lightOn. */ + /* If bits 0 to 7 are not 0, output the GPIO pins corresponding to blue based on the status of lightOn. */ if ((lightBrightness & LIGHT_MAKE_B_BIT) != 0) { ret = WriteGpio(drvData->info[lightId]->busBNum, lightOn); if (ret != HDF_SUCCESS) { @@ -263,7 +267,7 @@ The light driver model provides APIs to obtain information about all the lights return HDF_FAILURE; } } - /* If bits 8 to 15 are not 0, output the GPIO pin corresponding to green based on the status of lightOn. */ + /* If bits 8 to 15 are not 0, output the GPIO pins corresponding to green based on the status of lightOn. */ if ((lightBrightness & LIGHT_MAKE_G_BIT) != 0) { ret = WriteGpio(drvData->info[lightId]->busGNum, lightOn); if (ret != HDF_SUCCESS) { @@ -271,7 +275,7 @@ The light driver model provides APIs to obtain information about all the lights return HDF_FAILURE; } } - /* If bits 16 to 23 are not 0, output the GPIO pin corresponding to red based on the status of lightOn. */ + /* If bits 16 to 23 are not 0, output the GPIO pins corresponding to red based on the status of lightOn. */ if ((lightBrightness & LIGHT_MAKE_R_BIT) != 0) { ret = WriteGpio(drvData->info[lightId]->busRNum, lightOn); if (ret != HDF_SUCCESS) { @@ -286,7 +290,7 @@ The light driver model provides APIs to obtain information about all the lights static int32_t TurnOnLight(uint32_t lightId, struct HdfSBuf *data, struct HdfSBuf *reply) { ..... - /* Receive the lightBrightness value passed in. Bits 24 to 31 are extension bits, bits 16 to 23 indicate red, bits 8 to 15 indicate green, and bits 0 to 7 indicate blue. If lightBrightness is not 0, enable the light in the specified color. + /* Receive the lightBrightness value passed in. Bits 24 to 31 are extension bits, bits 16 to 23 indicate red, bits 8 to 15 indicate green, and bits 0 to 7 indicate blue. If lightBrightness is not 0, turn on the light in the specified color. Set the light brightness to a value ranging from 0 to 255 if supported. */ drvData->info[lightId]->lightBrightness = buf->lightBrightness; /* The light is steady on. */ @@ -304,13 +308,13 @@ The light driver model provides APIs to obtain information about all the lights /* Create a timer. */ if (OsalTimerCreate(&drvData->timer, drvData->info[lightId]->onTime, LightTimerEntry, (uintptr_t)lightId) != HDF_SUCCESS) { - HDF_LOGE("%s: create light timer fail!", __func__); - return HDF_FAILURE; + HDF_LOGE("%s: create light timer fail!", __func__); + return HDF_FAILURE; } /* Start the periodic timer. */ if (OsalTimerStartLoop(&drvData->timer) != HDF_SUCCESS) { - HDF_LOGE("%s: start light timer fail!", __func__); - return HDF_FAILURE; + HDF_LOGE("%s: start light timer fail!", __func__); + return HDF_FAILURE; } } return HDF_SUCCESS; @@ -362,7 +366,7 @@ void HdfLightTest::TearDownTestCase() } } -/* Obtain the light type. */ +/* Obtain the test light type. */ HWTEST_F(HdfLightTest, GetLightList001, TestSize.Level1) { struct LightInfo *info = nullptr; diff --git a/en/device-dev/driver/driver-peripherals-motion-des.md b/en/device-dev/driver/driver-peripherals-motion-des.md index e3c3de9260..eb147972af 100644 --- a/en/device-dev/driver/driver-peripherals-motion-des.md +++ b/en/device-dev/driver/driver-peripherals-motion-des.md @@ -4,11 +4,11 @@ ### Function -The motion module provides motion recognition and control capabilities. Currently, OpenHarmony supports recognition of pick-up, flip, shake, and rotation. +The motion module provides motion recognition and control capabilities. OpenHarmony supports recognition of pick-up, flip, shake, and rotation. The motion driver is developed based on the hardware driver foundation (HDF). It shields hardware differences and provides APIs for the Multimodal Sensor Data Platform (MSDP) to implement capabilities such as enabling or disabling motion recognition, and subscribing to or unsubscribing from motion recognition data. -The figure below shows the motion driver architecture. The framework layer provides MSDP services, and interacts with the Motion Stub through the Motion Proxy in the User Hardware Driver Foundation (UHDF). The Motion Stub calls the Motion HDI Impl APIs to provide motion recognition capabilities for upper-layer services. +The following figure shows the motion driver architecture. The framework layer provides MSDP services, and interacts with the Motion Stub through the Motion Proxy in the User Hardware Driver Foundation (UHDF). The Motion Stub calls the Motion HDI Impl APIs to provide motion recognition capabilities for upper-layer services. **Figure 1** Motion driver architecture @@ -23,8 +23,8 @@ The figure below illustrates how a motion driver works. ![](figures/motion_driver_work.png) 1. MSDP: The MSDP service obtains a Motion HDI service instance from the Motion Proxy and calls the Motion HDI API. -2. IDL: The IService Manager allocates a Motion HDI instance requested by the MSDP service, and the Motion Proxy forwards the instance to the MSDP service. After the MSDP service calls the HDI API provided by the Motion Proxy, Motion Stub is called through Inter-Process Communication (IPC) to invoke the Motion Service API. The code is automatically generated by a tool and does not need to be developed by the component vendor. -3. HDI Service: HDI Service consists of Motion Interface Driver, Motion Service, and Motion Impl. Motion Interface Driver provides the motion driver code. A **HdfDriverEntry** structure is defined to implement the **Init**, **Bind**, and **Release** functions. The **HDF_INIT** macro is used to load the driver in the functions. Motion Service provides the motion recognition service interface class. The specific implementation is described in Motion Impl. The code of HDI Service must be developed by the component vendor. +2. IDL: The IService Manager allocates a Motion HDI instance requested by the MSDP service, and the Motion Proxy forwards the instance to the MSDP service. After the MSDP service calls the HDI API provided by the Motion Proxy, Motion Stub is called through Inter-Process Communication (IPC) to invoke the Motion Service API. The code is automatically generated by a tool and does not need to be developed by the component vendor. +3. HDI Service: The HDI service consists of Motion Interface Driver, Motion Service, and Motion Impl. Motion Interface Driver provides the motion driver code. A **HdfDriverEntry** structure is defined to implement the **Init**, **Bind**, and **Release** functions. The **HDF_INIT** macro is used to load the driver in the functions. Motion Service provides the motion recognition service interface class. The specific implementation is described in Motion Impl. The code of HDI Service must be developed by the component vendor. ## Development Guidelines @@ -53,15 +53,15 @@ The development procedure is as follows: The motion recognition directory structure is as follows: ```undefined -/drivers/peripheral/motion # Developed by the vendor. -├── hdi_service # Driver capabilities provided by the motion recognition module for the MSDP service layer. -├── test # Test code for the motion recognition module. -│ └── unittest\hdi # HDI unit test code for the motion recognition module. +/drivers/peripheral/motion # Developed by the vendor. +├── hdi_service # Driver capabilities provided by the motion recognition module for the MSDP service layer. +├── test # Test code for the motion recognition module. +│ └── unittest\hdi # HDI unit test code for the motion recognition module. ``` The following describes how to develop a user-mode motion driver based on the HDF. For details, see [motion_interface_driver.cpp](https://gitee.com/openharmony/drivers_peripheral/blob/master/motion/hdi_service/motion_interface_driver.cpp). -To develop the user-mode driver for motion recognition, implement the **Bind**, **Init**, **Release**, and **Dispatch** functions. The **Bind** function provides service capabilities. The **Init** function initializes the driver before the driver is loaded. The **Release** function releases resources when the **Init** function fails. +You need to implement the **Bind()**, **Init()**, **Release()**, and **Dispatch()** functions. The **Bind()** function binds the service capability with the driver; **Init()** implements the initialization required before the driver is loaded; **Release()** reclaims resources when **Init()** fails; **Dispatch()** implements the service, which is bound in **Bind()**. ```c++ // Custom HdfMotionInterfaceHost object @@ -153,7 +153,6 @@ struct HdfDriverEntry g_motioninterfaceDriverEntry = { HDF_INIT(g_userAuthInterfaceDriverEntry); ``` - ### Verification The procedure is as follows: diff --git a/en/device-dev/driver/driver-peripherals-sensor-des.md b/en/device-dev/driver/driver-peripherals-sensor-des.md index 0d1d3b5707..2f04c658f0 100644 --- a/en/device-dev/driver/driver-peripherals-sensor-des.md +++ b/en/device-dev/driver/driver-peripherals-sensor-des.md @@ -1,41 +1,41 @@ # Sensor - + ## Overview -### Introduction +### Function -The sensor driver model masks the sensor hardware differences and provides interfaces for the upper-layer sensor service to implement basic sensor capabilities, including querying the sensor list, enabling or disabling a sensor, subscribing to or unsubscribing from sensor data changes, and setting sensor options. The model is developed on the Hardware Driver Foundation (HDF), Operating System Abstraction Layer (OSAL), and platform driver interfaces (such as the I2C, SPI, and UART buses). It provides functionalities such as cross-OS migration and differentiated device configurations. The figure below shows the architecture of the sensor driver model. +The sensor driver model shields the hardware difference and provides interfaces for the upper-layer sensor service to implement basic sensor capabilities, including querying the sensor list, enabling or disabling a sensor, subscribing to or unsubscribing from sensor data changes, and setting sensor attributes. Developed based on the Hardware Driver Foundation (HDF), the sensor driver model leverages the capabilities of the OS adaptation layer (OSAL) and platform driver interfaces (such as I2C, SPI, and UART buses) to shield the difference between OSs and platform bus resources, achieving "one-time development and multi-system deployment" of the sensor driver. The figure below shows the architecture of the sensor driver model. **Figure 1** Sensor driver model - + ![Sensor driver model](figures/sensor_driver_model.png) ### Basic Concepts -Currently, sensors are classified into medical sensors and traditional sensors by sensor ID. +Sensors are classified into the following types by sensor ID: -- The IDs of medical sensors range from 128 to 160. +- Medical sensors: The sensor IDs range from 128 to 160. -- The IDs of traditional sensors are out of the range of 128 to 160. +- Traditional sensors: The sensor IDs are out of the range of 128 to 160. ### Working Principles -Based on the loading and running process (shown below) of the sensor driver model, the relationships between key modules in the model and associated modules are clearly defined. +The following figure shows how a sensor driver works. -**Figure 2** How sensor driver works +**Figure 2** How a sensor driver works ![How sensor driver works](figures/sensor_working.png) The following uses the acceleration sensor driver on the Hi3516D V300 development board of the standard system as an example to describe the driver loading and running process. -1. The sensor host reads the sensor management configuration from the Sensor Host node of the device_info HCS (sensor device information HCS). -2. The sensor host parses the sensor management configuration from the HCB database and associates the corresponding sensor driver. +1. The sensor host reads the sensor device management configuration from **Sensor Host** in the **device_info.hcs** file. +2. The sensor host parses the sensor management configuration from the HCB database and associates the configuration with the sensor driver. 3. The sensor host loads and initializes the sensor manager driver. -4. The sensor manager driver publishes the sensor hardware device interfaces (HDIs). -5. The sensor host reads the acceleration sensor driver configuration from the Sensor Host node of the device_info HCS. +4. The sensor manager driver publishes the sensor APIs for the hardware driver interface (HDI). +5. The sensor host reads the acceleration sensor driver configuration information from **Sensor Host** in the **device_info.hcs** configuration file. 6. The sensor host loads the acceleration sensor abstract driver and calls the initialization interface to allocate the sensor driver resources and create the data processing queue. -7. The sensor host reads the chipset driver configuration and private configuration of the acceleration sensor from the accel_xxx_config HCS (sensor private configuration HCS). +7. The sensor host reads the chipset driver configuration and private configuration of the acceleration sensor from the **accel_xxx_config.hcs** file. 8. The acceleration sensor chipset driver calls the common configuration parsing interface to parse the sensor attributes and registers. 9. The chipset driver detects sensors, allocates configuration resources to the acceleration sensor, and registers the acceleration sensor chipset interfaces. 10. Upon successful sensor detection, the chipset driver instructs the abstract driver to register the acceleration sensor to the sensor manager driver. @@ -54,34 +54,38 @@ The following uses the acceleration sensor driver on the Hi3516D V300 developmen The sensor driver model offers the following APIs: -- Sensor HDIs, for easier sensor service development -- Sensor driver model capability interfaces - - Interfaces for registering, loading, and deregistering sensor drivers, and detecting sensors - - Driver normalization interface, register configuration parsing interface, bus access abstract interface, and platform abstract interface for the same type of sensors -- Interfaces to be implemented by developers: Based on the HDF Configuration Source (HCS) and differentiated configuration for sensors of the same type, developers need to implement serialized configuration of sensor device parameters and some sensor device operation interfaces to simplify sensor driver development. +- Sensor HDI APIs, for easier sensor service development + +- APIs for implementing sensor driver model capabilities + - APIs for loading, registering, and deregitering sensor drivers, and detecting sensors based on the HDF + - Unified driver API, register configuration parsing API, bus access abstract API, and platform abstract API for the same type of sensors + +- APIs to be implemented by developers + + Based on the HDF Configuration Source (HCS) and differentiated configuration for sensors of the same type, you need to implement serialized configuration of sensor device parameters and some sensor device operation interfaces to simplify sensor driver development. The sensor driver model provides APIs for the hardware service to make sensor service development easier. See the table below. **Table 1** APIs of the sensor driver model -| API| Description| +| API| Description| | ----- | -------- | | int32_t GetAllSensors(struct SensorInformation **sensorInfo, int32_t *count) | Obtains information about all registered sensors in the system. The sensor information includes the sensor name, sensor vendor, firmware version, hardware version, sensor type ID, sensor ID, maximum range, accuracy, and power consumption.| -| int32_t Enable(int32_t sensorId) | Enables a sensor. The subscriber can obtain sensor data only after the sensor is enabled.| -| int32_t Disable(int32_t sensorId) | Disables a sensor.| -| int32_t SetBatch(int32_t sensorId, int64_t samplingInterval, int64_t reportInterval) | Sets the sampling interval and data reporting interval for a sensor.| -| int32_t SetMode(int32_t sensorId, int32_t mode) | Sets the data reporting mode for a sensor.| -| int32_t SetOption(int32_t sensorId, uint32_t option) | Sets options for a sensor, including its range and accuracy.| -| int32_t Register(int32_t groupId, RecordDataCallback cb) | Registers a sensor data callback based on the group ID.| -| int32_t Unregister(int32_t groupId, RecordDataCallback cb) | Deregisters a sensor data callback based on the group ID.| +| int32_t Enable(int32_t sensorId) | Enables a sensor. The subscriber can obtain sensor data only after the sensor is enabled.| +| int32_t Disable(int32_t sensorId) | Disables a sensor.| +| int32_t SetBatch(int32_t sensorId, int64_t samplingInterval, int64_t reportInterval) | Sets the sampling interval and data reporting interval for a sensor.| +| int32_t SetMode(int32_t sensorId, int32_t mode) | Sets the data reporting mode for a sensor.| +| int32_t SetOption(int32_t sensorId, uint32_t option) | Sets options for a sensor, including its range and accuracy.| +| int32_t Register(int32_t groupId, RecordDataCallback cb) | Registers a sensor data callback based on the group ID.| +| int32_t Unregister(int32_t groupId, RecordDataCallback cb) | Deregisters a sensor data callback based on the group ID.| The sensor driver model provides driver development APIs that do not require further implementation. See the table below. - **Table 2** Sensor driver development APIs that do not need to be implemented by driver developers + **Table 2** Sensor driver development APIs -| API| Description| +| API| Description| | ----- | -------- | | int32_t AddSensorDevice(const struct SensorDeviceInfo *deviceInfo) | Adds a sensor of the current type to the sensor management module.| | int32_t DeleteSensorDevice(const struct SensorBasicInfo *sensorBaseInfo) | Deletes a sensor from the sensor management module.| @@ -97,12 +101,11 @@ The sensor driver model provides driver development APIs that do not require fur - The sensor driver model also provides certain driver development APIs that need to be implemented by driver developers. See the table below. -**Table 3** APIs that need to be implemented by driver developers +**Table 3** APIs to be implemented by driver developers -| API| Description| +| API| Description| | ----- | -------- | | int32_t init(void) | Initializes the sensor device configuration after a sensor is detected.| | int32_t Enable(void) | Enables the current sensor by delivering the register configuration in the enabling operation group based on the device information HCS configuration.| @@ -121,14 +124,14 @@ The sensor driver model also provides certain driver development APIs that need ```c /* Register the entry structure object of the acceleration sensor. */ struct HdfDriverEntry g_sensorAccelDevEntry = { - .moduleVersion = 1, // Version of the acceleration sensor module. - .moduleName = "HDF_SENSOR_ACCEL", // Name of the acceleration sensor module. The value must be the same as that of moduleName in the device_info.hcs file. - .Bind = BindAccelDriver, // Function for binding an acceleration sensor. - .Init = InitAccelDriver, // Function for initializing an acceleration sensor. - .Release = ReleaseAccelDriver, // Function for releasing acceleration sensor resources. + .moduleVersion = 1, // Version of the acceleration sensor module. + .moduleName = "HDF_SENSOR_ACCEL", // Name of the acceleration sensor module. The value must be the same as that of moduleName in the device_info.hcs file. + .Bind = BindAccelDriver, // Function for binding an acceleration sensor. + .Init = InitAccelDriver, // Function for initializing an acceleration sensor. + .Release = ReleaseAccelDriver // Function for releasing acceleration sensor resources. }; - /* Call HDF_INIT to register the driver entry with the HDF. When loading the driver, the HDF calls the Bind function first and then the Init function. If the Init function fails to be called, the HDF will call Release to release the driver resource and exit the sensor driver model. */ + /* Call HDF_INIT to register the driver entry with the HDF. When loading the driver, the HDF calls Bind() and then Init() to load the driver. If Init() fails to be called, the HDF calls Release() to release resources and exit. */ HDF_INIT(g_sensorAccelDevEntry); ``` @@ -228,7 +231,7 @@ The sensor driver model also provides certain driver development APIs that need return drvData->accelCfg; ... } - /* The entry function of the acceleration sensor driver is used to initialize the sensor private data structure object, allocate space for the sensor HCS data configuration object, call the entry function for initializing the sensor HCS data configuration, detect whether the sensor device is in position, create a sensor data reporting timer, register the sensor normalization APIs, and register the sensor device. */ + /* The entry function of the acceleration sensor driver is used to initialize the sensor private data structure object, allocate space for the sensor HCS data configuration object, call the entry function for initializing the sensor HCS data configuration, detect whether the sensor device is in position, create a timer for sensor data reporting, register the sensor normalization APIs, and register the sensor device. */ int32_t AccelInitDriver(struct HdfDeviceObject *device) { ... @@ -271,16 +274,16 @@ The sensor driver model also provides certain driver development APIs that need The acceleration sensor model uses the HCS as the configuration source code. For details about the HCS configuration fields, see [Driver Configuration Management](driver-hdf-manage.md). - ``` + ```hcs /* Device information HCS configuration of the acceleration sensor. */ device_sensor_accel :: device { device0 :: deviceNode { - policy = 1; // Policy for publishing the driver service. - priority = 110; // Driver startup priority (0–200). A larger value indicates a lower priority. The default value 100 is recommended. The sequence for loading devices with the same priority is random. - preload = 0; // Field for specifying whether to load the driver. The value 0 means to load the driver, and 2 means the opposite. - permission = 0664; // Permission for the driver to create a device node. - moduleName = "HDF_SENSOR_ACCEL"; // Driver name. The value must be the same as that of moduleName in the driver entry structure. - serviceName = "sensor_accel"; // Name of the service provided by the driver. The name must be unique. + policy = 1; // Policy for the driver to publish services. + priority = 100; // Priority (0–200) for starting the driver. A larger value indicates a lower priority. The recommended value is 100. If the priorities are the same, the device loading sequence is not ensured. + preload = 0; // The value 0 means to load the driver by default during the startup of the system. The value 2 means the opposite. + permission = 0664; // Permission for the device node created. + moduleName = "HDF_SENSOR_ACCEL"; // Driver name. It must be the same as moduleName in the driver entry structure. + serviceName = "sensor_accel"; // Name of the service published by the driver. The name must be unique. deviceMatchAttr = "hdf_sensor_accel_driver"; // Keyword matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. } } @@ -466,7 +469,7 @@ The sensor driver model also provides certain driver development APIs that need /* Release the resources allocated during driver initialization. */ void Bmi160ReleaseDriver(struct HdfDeviceObject *device) { - ...... + ... if (drvData->sensorCfg != NULL) { AccelReleaseCfgData(drvData->sensorCfg); drvData->sensorCfg = NULL; @@ -511,18 +514,12 @@ The sensor driver model also provides certain driver development APIs that need } ``` ->![](../public_sys-resources/icon-note.gif) **NOTE** -> ->- The sensor driver model provides certain APIs to implement sensor driver capabilities, including the driver device management, abstract bus and platform operation, common configuration, and configuration parsing capabilities. For details about them, see Table 2. ->- You need to implement the following functions: certain sensor operation interfaces (listed in Table 3) and sensor chipset HCS configuration. ->- You also need to verify basic driver functions. +### Verification -### How to Verify +After the driver is developed, develop test cases in the sensor unit test to verify the basic functions of the driver. Use your test platform to set up the test environment. -After the driver is developed, you can develop self-test cases in the sensor unit test to verify the basic functions of the driver. Use the developer self-test platform as the test environment. - -``` -static int32_t g_sensorDataFlag = 0; // Indicates whether to report sensor data. +```c++ +static int32_t g_sensorDataFlag = 0; // Whether to report sensor data. static const struct SensorInterface *g_sensorDev = nullptr; // Retain the obtained sensor interface instance address. /* Register the data reporting function. */ @@ -558,9 +555,9 @@ void HdfSensorTest::TearDownTestCase() /* Verify the sensor driver. */ HWTEST_F(HdfSensorTest,TestAccelDriver_001, TestSize.Level0) { - int32_t sensorInterval = 1000000000; // Data sampling interval, in nanoseconds. - int32_t pollTime = 5; // Data sampling duration, in seconds. - int32_t accelSensorId = 1; // Acceleration sensor ID, which is 1. + int32_t sensorInterval = 1000000000; // Data sampling interval, in nanoseconds. + int32_t pollTime = 5; // Data sampling time, in seconds. + int32_t accelSensorId = 1; // Acceleration sensor ID, which specifies the sensor type. int32_t count = 0; int ret; struct SensorInformation *sensorInfo = nullptr; diff --git a/en/device-dev/driver/driver-peripherals-touch-des.md b/en/device-dev/driver/driver-peripherals-touch-des.md index 5878f9a7cf..292e94bffd 100644 --- a/en/device-dev/driver/driver-peripherals-touch-des.md +++ b/en/device-dev/driver/driver-peripherals-touch-des.md @@ -1,397 +1,508 @@ -# Touchscreen +# Touchscreen -## Overview -- **Functions of the Touchscreen driver** +## Overview - The touchscreen driver is used to power on its integrated circuit \(IC\), configure and initialize hardware pins, register interrupts, configure Inter-Integrated Circuit \(I2C\) or SPI APIs, set input-related configurations, and download and update firmware. +### Function Introduction +The touchscreen driver powers on its integrated circuit (IC), initializes hardware pins, registers interrupts, configures the communication (I2C or SPI) interface, sets input configurations, and downloads and updates firmware. -- **Layers of the Touchscreen driver** +The touchscreen driver is developed based on the OpenHarmony input driver model, which applies basic APIs of the operating system abstraction layer (OSAL) and platform interface layer on the OpenHarmony Hardware Driver Foundation [(HDF)](../driver/driver-hdf-development.md). Common APIs include the bus communication APIs and OS native APIs (such as memory, lock, thread, and timer APIs). The OSAL and platform APIs shield the differences of underlying hardware. This allows the use of the touchscreen driver across platforms and OSs. In this regard, you can develop the touchscreen driver only once and deploy it on multiple devices. - This section describes how to develop the touchscreen driver based on the input driver model. [Figure 1](#fig6251184817261) shows an overall architecture of the touchscreen driver. +### Working Principles - The input driver is developed based on the hardware driver foundation \(HDF\), platform APIs, and operating system abstraction layer \(OSAL\) APIs. It provides hardware driver capabilities through the input Hardware Device Interfaces \(HDIs\) for upper-layer input services to control the touchscreen. +The input driver model is developed based on the HDF and APIs of the platform and OSAL. It provides hardware driver capabilities through the input Hardware Driver Interface (HDI) for upper-layer input services to control the touchscreen. The following figure shows the architecture of the input driver model. +**Figure 1** Input driver model -**Figure 1** Architecture of the input driver model -![](figures/architecture-of-the-input-driver-model.png "architecture-of-the-input-driver-model") +![image](figures/architecture-of-the-input-driver-model.png) -- **Input driver model** +The input driver model consists of the following: - The input driver model mainly consists of the device manager, common drivers, and chip drivers. The platform data channel provides capabilities for sending data generated by the touchscreen from the kernel to the user space. The driver model adapts to different touchscreen devices and hardware platforms via the configuration file, improving the efficiency of the touchscreen development. The description for each part of the input driver model is as follows: +- Input Device Manager: provides APIs for input device drivers to register and deregister input devices and manages the input device list in a unified manner. +- Common input drivers: provide common APIs that are applicable to different input devices (such as the common driver APIs for touchscreens). The APIs can be used to initialize board-specific hardware, handle hardware interrupts, and register input devices with the Input Device Manager. +- Input chip drivers: provide differentiated APIs for the drivers form different vendors. You can use these APIs to develop your drivers with minimum modification. +- Event Hub: provides a unified channel for different input devices to report input events. +- HDF input config: parses and manages the board-specific and private configuration of input devices. - - Input device manager: provides input device drivers with the APIs for registering or unregistering input devices and manages the input device list. +The input driver model provides configuration files to help you quickly develop your drivers. - - Input common driver: provides common abstract drivers \(such as the touchscreen common driver\) of various input devices for initializing the board-level hardware, processing hardware interrupts, and registering input devices with the input device manager. - - Input chip driver: provides different chip drivers of each vendor. You can minimize the workload for the input chip driver development by calling differentiated APIs reserved by the input platform driver. +## How to Develop - - Event hub: provides a unified data reporting channel, which enables input devices to report input events. +### When to Use - - HDF input config: parses and manages the board-level configuration as well as the private configuration of input devices. +The input module provides APIs for powering on the touchscreen driver IC, configuring and initializing hardware pins, registering interrupts, configuring the communication (I2C or SPI) interface, setting input configurations, and downloading and updating firmware. +### Available APIs -- **Advantages of developing drivers based on the HDF** +#### Hardware Interfaces - The touchscreen driver is developed based on the [HDF](driver-hdf-development.md) and is implemented via calls to the OSAL and platform APIs, including bus APIs and OS native APIs \(such as memory, lock, thread, and timer\). The OSAL and platform APIs hide the differences of underlying hardware, so that the touchscreen driver can be migrated across platforms and OSs. In this regard, you can develop the touchscreen driver only once but deploy it on multiple devices. +The hardware interfaces for touchscreens can be classified into the following types based on the pin attributes: +- Power interfaces -## Available APIs +- I/O control interfaces -Based on the attributes of the pins, interfaces on the touchscreens can be classified into the following types: +- Communication interfaces -- Power interfaces -- I/O control interfaces -- Communications interfaces +**Figure 2** Common touchscreen pins -**Figure 2** Common pins of the touchscreen ![](figures/common-pins-of-the-touchscreen.png "common-pins-of-the-touchscreen") -The interfaces shown in the figure are described as follows: +The interfaces shown in the preceding figure are described as follows: -- **Power interfaces** - - LDO\_1P8: 1.8 V digital circuits - - LDO\_3P3: 3.3 V analog circuits +1. **Power interfaces** - Generally, the touchscreen driver IC is separated from the LCD driver IC. In this case, the touchscreen driver IC requires both 1.8 V and 3.3 V power supplies. Nowadays, the touchscreen driver IC and LCD driver IC can be integrated. Therefore, the touchscreen, requires only the 1.8 V power supply, and the 3.3 V power required internally is supplied by the LCD VSP power \(typical value: 5.5 V\) in the driver IC. + - **LDO_1P8**: 1.8 V digital circuit + - **LDO_3P3**: 3.3 V analog circuit -- **I/O control interfaces** - - RESET: reset pin, which is used to reset the driver IC on the host when suspending or resuming the system. - - INT: interrupt pin, which needs to be set to the input direction and pull-up status during driver initialization. After detecting an external touch signal, the driver triggers the interrupt by operating the interrupt pin. The driver reads the touch reporting data in the ISR function. + If the touchscreen driver and ICD driver have its own IC, the touchscreen driver IC requires 1.8 V and 3.3 V power supplies. If the touchscreen driver and LCD driver have an integrated IC, you only need to care about the 1.8 V power supply for the touchscreen. The 3.3 V power supply required can be provided by the LCD VSP power (typically 5.5 V) in the driver IC. -- **Communications interfaces** - - I2C: Since only a small amount of touch data is reported by the touchscreen, I2C is used to transmit the reported data. For details about the I2C protocol and interfaces, see [I2C](driver-platform-i2c-des.md#section5361140416). - - SPI: In addition to touch reporting data coordinates, some vendors need to obtain basic capacitance data. Therefore, Serial Peripheral Interface \(SPI\) is used to transmit such huge amount of data. For details about the SPI protocol and interfaces, see [SPI](driver-platform-spi-des.md#overview). +2. **I/O control interfaces** + - **RESET**: pin used to reset the driver IC on the host when the kernel is put into hibernation or waken up. + - **INT**: interrupt pin, which must be set to the input pull-up state during driver initialization. After detecting an external touch signal, the driver triggers an interrupt by operating the interrupt pin. Then, the driver reads the touch reporting data in an interrupt handler. -## How to Develop +3. **Communication interfaces** -Regardless of the OS and system on a chip \(SoC\), the input driver is developed based on the HDF, platform, and OSAL APIs to provide a unified driver model for touchscreen devices. + - I2C: I2C is used if a small amount of data is reported by the touchscreen. For details about the I2C protocol and related operation APIs, see [I2C](../driver/driver-platform-i2c-des.md). + - SPI: SPI is used if a large amount of data is reported by the touchscreen. For details about the SPI protocol and related operation APIs, see [SPI](../driver/driver-platform-spi-des.md). -The following uses the touchscreen driver as an example to describe the loading process of the input driver model: +#### Software Interfaces -1. Complete the device description configuration, such as the loading priority, board-level hardware information, and private data, by referring to the existing template. +The HDI driver APIs provided for the input service can be classified into the input manager module, input reporter module, and input controller module. The following tables describe the available APIs. -2. Load the input device management driver. The input management driver is loaded automatically by the HDF to create and initialize the device manager. +- input_manager.h -3. Load the platform driver. The platform driver is loaded automatically by the HDF to parse the board-level configuration, initialize the hardware, and provide the API for registering the touchscreen. + | API | Description | + | ------------------------------------------------------------------------------------- | -------------------| + | int32_t (*OpenInputDevice)(uint32_t devIndex); | Opens an input device. | + | int32_t (*CloseInputDevice)(uint32_t devIndex); | Closes an input device. | + | int32_t (*GetInputDevice)(uint32_t devIndex, DeviceInfo **devInfo); | Obtains information about an input device.| + | int32_t (*GetInputDeviceList)(uint32_t *devNum, DeviceInfo **devList, uint32_t size); | Obtains the input device list.| -4. Load the touchscreen driver. The touchscreen driver is loaded automatically by the HDF to instantiate the touchscreen device, parse the private data, and implement differentiated APIs provided by the platform. +- input_reporter.h -5. Register the instantiated touchscreen device with the platform driver. Then bind this device to the platform driver, and complete touchscreen initialization such as interrupt registration and power-on and power-off. + | API | Description | + | ----------------------------------------------------------------------------------- | ------------------ | + | int32_t (*RegisterReportCallback)(uint32_t devIndex, InputReportEventCb *callback); | Registers a callback for an input device.| + | int32_t (*UnregisterReportCallback)(uint32_t devIndex); | Unregisters the callback for an input device.| + | void (*ReportEventPkgCallback)(const EventPackage **pkgs, uint32_t count); | Called to report input event data. | -6. Instantiate the input device and register it with the input manager after the touchscreen is initialized. - - -Perform the following steps: - -1. Add the touchscreen driver-related descriptions. - - Currently, the input driver is developed based on the HDF and is loaded and started by the HDF. Register the driver information, such as whether to load the driver and the loading priority in the configuration file. Then, the HDF starts the registered driver modules one by one. For details about the driver configuration, see [How to Develop](driver-hdf-development.md). - -2. Complete the board-level configuration and private data configuration of the touchscreen. - - Configure the required I/O pins. For example, configure a register for the I2C pin reserved for the touchscreen to use I2C for transmitting data. - -3. Implement differentiated adaptation APIs of the touchscreen. - - Use the platform APIs to perform operations for the reset pins, interrupt pins, and power based on the communications interfaces designed for boards. For details about the GPIO-related operations, see [GPIO](driver-platform-gpio-des.md#overview). - - -## Development Example - -This example describes how to develop the touchscreen driver. - -### Adding the Touchscreen Driver-related Description - -The information about modules of the input driver model is shown as follows and enables the HDF to load the modules in sequence. For details, see [Driver Development](driver-hdf-development.md). - -``` -input :: host { - hostName = "input_host"; - priority = 100; - device_input_manager :: device { - device0 :: deviceNode { - policy = 2; // Publish services externally. - priority = 100; // Loading priority. The input device manager in the input driver has the highest priority. - preload = 0; // Value 0 indicates that the driver is to be loaded, and value 1 indicates the opposite. - permission = 0660; - moduleName = "HDF_INPUT_MANAGER"; - serviceName = "input_dev_manager"; - deviceMatchAttr = ""; - } - } - device_hdf_touch :: device { - device0 :: deviceNode { - policy = 2; - priority = 120; - preload = 0; - permission = 0660; - moduleName = "HDF_TOUCH"; - serviceName = "event1"; - deviceMatchAttr = "touch_device1"; - } - } - - device_touch_chip :: device { - device0 :: deviceNode { - policy = 0; - priority = 130; - preload = 0; - permission = 0660; - moduleName = "HDF_TOUCH_SAMPLE"; - serviceName = "hdf_touch_sample_service"; - deviceMatchAttr = "zsj_sample_5p5"; - } - } -} -``` - -### Adding Board Configuration and Touchscreen Private Configuration - -The following describes the configuration of the board-level hardware and private data of the touchscreen. You can modify the configuration based on service requirements. - -``` -root { - input_config { - touchConfig { - touch0 { - boardConfig { - match_attr = "touch_device1"; - inputAttr { - inputType = 0; // Value 0 indicates that the input device is a touchscreen. - solutionX = 480; - solutionY = 960; - devName = "main_touch"; // Device name - } - busConfig { - busType = 0; // Value 0 indicates the I2C bus. - busNum = 6; - clkGpio = 86; - dataGpio = 87; - i2cClkIomux = [0x114f0048, 0x403]; // Register configuration of the i2c_clk pin - i2cDataIomux = [0x114f004c, 0x403]; // Register configuration of the i2c_data pin - } - pinConfig { - rstGpio = 3; - intGpio = 4; - rstRegCfg = [0x112f0094, 0x400]; // Register configuration of the reset pin - intRegCfg = [0x112f0098, 0x400]; // Register configuration of the interrupt pin - } - powerConfig { - vccType = 2; // Values 1, 2, and 3 indicate the low-dropout regulator (LDO), GPIO, and PMIC, respectively. - vccNum = 20; // The GPIO number is 20. - vccValue = 1800; // The voltage amplitude is 1800 mV. - vciType = 1; - vciNum = 12; - vciValue = 3300; - } - featureConfig { - capacitanceTest = 0; - gestureMode = 0; - gloverMOde = 0; - coverMode = 0; - chargerMode = 0; - knuckleMode = 0; - } - } - chipConfig { - template touchChip { - match_attr = ""; - chipName = "sample"; - vendorName = "zsj"; - chipInfo = "AAAA11222"; // The first four characters indicate the product name. The fifth and sixth characters indicate the IC model. The last three characters indicate the chip model. - busType = 0; - deviceAddr = 0x5D; - irqFlag = 2; // Values 1 and 2 indicate that the interrupt is triggered on the rising and falling edges, respectively. Values 4 and 8 indicate that the interrupt is triggered by the high and low levels, respectively. - maxSpeed = 400; - chipVersion = 0; - powerSequence { - /* Power-on sequence is described as follows: - [Type, status, direction, delay] - Value 0 indicates the power or pin is empty. Values 1 and 2 indicate the VCC (1.8 V) and VCI (3.3 V) power, respectively. Values 3 and 4 indicate the reset and interrupt pins, respectively. - Values 0 and 1 indicate the power-off or pull-down, and the power-on or pull-up, respectively. Value 2 indicates that no operation is performed. - Values 0 and 1 indicate the input and output directions, respectively. Value 2 indicates that no operation is performed. - Delay time, in milliseconds. - */ - powerOnSeq = [4, 0, 1, 0, - 3, 0, 1, 10, - 3, 1, 2, 60, - 4, 2, 0, 0]; - suspendSeq = [3, 0, 2, 10]; - resumeSeq = [3, 1, 2, 10]; - powerOffSeq = [3, 0, 2, 10, - 1, 0, 2, 20]; - } - } - chip0 :: touchChip { - match_attr = "zsj_sample_5p5"; - chipInfo = "ZIDN45100"; - chipVersion = 0; - } - } - } - } - } -} -``` - -### Adding the Touchscreen Driver - -The following example shows how to implement the differentiated APIs provided by the platform driver to obtain and parse the touchscreen data. You can adjust the development process based on the board and touchscreen in use. - -``` -/* Parse the touch reporting data read from the touchscreen into coordinates. */ -static void ParsePointData(ChipDevice *device, FrameData *frame, uint8_t *buf, uint8_t pointNum) -{ - int32_t resX = device->driver->boardCfg->attr.resolutionX; - int32_t resY = device->driver->boardCfg->attr.resolutionY; - - for (int32_t i = 0; i < pointNum; i++) { - frame->fingers[i].y = (buf[GT_POINT_SIZE * i + GT_X_LOW] & ONE_BYTE_MASK) | - ((buf[GT_POINT_SIZE * i + GT_X_HIGH] & ONE_BYTE_MASK) << ONE_BYTE_OFFSET); - frame->fingers[i].x = (buf[GT_POINT_SIZE * i + GT_Y_LOW] & ONE_BYTE_MASK) | - ((buf[GT_POINT_SIZE * i + GT_Y_HIGH] & ONE_BYTE_MASK) << ONE_BYTE_OFFSET); - frame->fingers[i].valid = true; - } -} -/* Obtain the touch reporting data from the chip. */ -static int32_t ChipDataHandle(ChipDevice *device) -{ - int32_t ret; - uint8_t touchStatus = 0; - uint8_t pointNum; - uint8_t buf[GT_POINT_SIZE * MAX_SUPPORT_POINT] = {0}; - InputI2cClient *i2cClient = &device->driver->i2cClient; - uint8_t reg[GT_ADDR_LEN] = {0}; - FrameData *frame = &device->driver->frameData; - reg[0] = (GT_BUF_STATE_ADDR >> ONE_BYTE_OFFSET) & ONE_BYTE_MASK; - reg[1] = GT_BUF_STATE_ADDR & ONE_BYTE_MASK; - ret = InputI2cRead(i2cClient, reg, GT_ADDR_LEN, &touchStatus, 1); - if (ret < 0 || touchStatus == GT_EVENT_INVALID) { - return HDF_FAILURE; - } - OsalMutexLock(&device->driver->mutex); - (void)memset_s(frame, sizeof(FrameData), 0, sizeof(FrameData)); - if (touchStatus == GT_EVENT_UP) { - frame->realPointNum = 0; - frame->definedEvent = TOUCH_UP; - goto exit; - } - reg[0] = (GT_X_LOW_BYTE_BASE >> ONE_BYTE_OFFSET) & ONE_BYTE_MASK; - reg[1] = GT_X_LOW_BYTE_BASE & ONE_BYTE_MASK; - pointNum = touchStatus & GT_FINGER_NUM_MASK; - if (pointNum <= 0 || pointNum > MAX_SUPPORT_POINT) { - HDF_LOGE("%s: pointNum is invalid, %d", __func__, pointNum); - (void)ChipCleanBuffer(i2cClient); - OsalMutexUnlock(&device->driver->mutex); - return HDF_FAILURE; - } - frame->realPointNum = pointNum; - frame->definedEvent = TOUCH_DOWN; - /* Read the touch reporting data from the register. */ - (void)InputI2cRead(i2cClient, reg, GT_ADDR_LEN, buf, GT_POINT_SIZE * pointNum); - /* Parse the touch reporting data. */ - ParsePointData(device, frame, buf, pointNum); -exit: - OsalMutexUnlock(&device->driver->mutex); - if (ChipCleanBuffer(i2cClient) != HDF_SUCCESS) { - return HDF_FAILURE; - } - return HDF_SUCCESS; -} - -static struct TouchChipOps g_sampleChipOps = { - .Init = ChipInit, - .Detect = ChipDetect, - .Resume = ChipResume, - .Suspend = ChipSuspend, - .DataHandle = ChipDataHandle, -}; - -static TouchChipCfg *ChipConfigInstance(struct HdfDeviceObject *device) -{ - TouchChipCfg *chipCfg = (TouchChipCfg *)OsalMemAlloc(sizeof(TouchChipCfg)); - if (chipCfg == NULL) { - HDF_LOGE("%s: instance chip config failed", __func__); - return NULL; - } - (void)memset_s(chipCfg, sizeof(TouchChipCfg), 0, sizeof(TouchChipCfg)); - /* Parse the private configuration of the touchscreen. */ - if (ParseTouchChipConfig(device->property, chipCfg) != HDF_SUCCESS) { - HDF_LOGE("%s: parse chip config failed", __func__); - OsalMemFree(chipCfg); - chipCfg = NULL; - } - return chipCfg; -} - -static ChipDevice *ChipDeviceInstance(void) -{ - ChipDevice *chipDev = (ChipDevice *)OsalMemAlloc(sizeof(ChipDevice)); - if (chipDev == NULL) { - HDF_LOGE("%s: instance chip device failed", __func__); - return NULL; - } - (void)memset_s(chipDev, sizeof(ChipDevice), 0, sizeof(ChipDevice)); - return chipDev; -} - -static void FreeChipConfig(TouchChipCfg *config) -{ - if (config->pwrSeq.pwrOn.buf != NULL) { - OsalMemFree(config->pwrSeq.pwrOn.buf); - } - if (config->pwrSeq.pwrOff.buf != NULL) { - OsalMemFree(config->pwrSeq.pwrOff.buf); - } - OsalMemFree(config); -} - -static int32_t HdfSampleChipInit(struct HdfDeviceObject *device) -{ - TouchChipCfg *chipCfg = NULL; - ChipDevice *chipDev = NULL; - HDF_LOGE("%s: enter", __func__); - if (device == NULL) { - return HDF_ERR_INVALID_PARAM; - } - /* Parse the private configuration of the touchscreen. */ - chipCfg = ChipConfigInstance(device); - if (chipCfg == NULL) { - return HDF_ERR_MALLOC_FAIL; - } - /* Instantiate the touchscreen device. */ - chipDev = ChipDeviceInstance(); - if (chipDev == NULL) { - goto freeCfg; - } - chipDev->chipCfg = chipCfg; - chipDev->ops = &g_sampleChipOps; - chipDev->chipName = chipCfg->chipName; - chipDev->vendorName = chipCfg->vendorName; - - /* Register the touchscreen device with the platform driver. */ - if (RegisterChipDevice(chipDev) != HDF_SUCCESS) { - goto freeDev; - } - HDF_LOGI("%s: exit succ, chipName = %s", __func__, chipCfg->chipName); - return HDF_SUCCESS; - -freeDev: - OsalMemFree(chipDev); -freeCfg: - FreeChipConfig(chipCfg); - return HDF_FAILURE; -} - -struct HdfDriverEntry g_touchSampleChipEntry = { - .moduleVersion = 1, - .moduleName = "HDF_TOUCH_SAMPLE", - .Init = HdfSampleChipInit, -}; - -HDF_INIT(g_touchSampleChipEntry); -``` +- input_controller.h + | API | Description | + | --------------------------------------------------------------------------------------------------- |--------------- | + | int32_t (*SetPowerStatus)(uint32_t devIndex, uint32_t status); | Sets the power status. | + | int32_t (*GetPowerStatus)(uint32_t devIndex, uint32_t *status); | Obtains the power status. | + | int32_t (*GetDeviceType)(uint32_t devIndex, uint32_t *deviceType); | Obtains the device type. | + | int32_t (*GetChipInfo)(uint32_t devIndex, char *chipInfo, uint32_t length); | Obtains the chip information of a device.| + | int32_t (*GetVendorName)(uint32_t devIndex, char *vendorName, uint32_t length); | Obtains the module vendor name of a device. | + | int32_t (*GetChipName)(uint32_t devIndex, char *chipName, uint32_t length); | Obtains the driver chip name of a device. | + | int32_t (*SetGestureMode)(uint32_t devIndex, uint32_t gestureMode); | Sets the gesture mode. | + | int32_t (*RunCapacitanceTest)(uint32_t devIndex, uint32_t testType, char *result, uint32_t length); | Performs a capacitance test.| + | int32_t (*RunExtraCommand)(uint32_t devIndex, InputExtraCmd *cmd); | Executes the specified command. | + +For more information, see [input](https://gitee.com/openharmony/drivers_peripheral/tree/master/input). + +### Development Procedure + +The load process of the input driver model (for the touchscreen driver) is as follows: + +1. The device configuration, including the driver loading priority, board-specific hardware information, and private data, is complete. + +2. The HDF driver loads the input device manager driver to create and initialize the device manager. + +3. The HDF loads the platform driver to parse the board-specific configuration, initialize the hardware, and provide the API for registering the touchscreen. + +4. The HDF loads the touchscreen driver to instantiate the touchscreen device, parse the private data, and implement the differentiated APIs for the platform. + +5. The instantiated touchscreen device registers with the platform driver to bind the device and the driver and complete the device initialization, including interrupt registration and device power-on and power-off. + +6. The instantiated input device registers with the input device manager for unified management. + + +The development process of the touchscreen driver is as follows: + +1. Configure device information.
    The input driver is developed based on the HDF. The HDF loads and starts the driver in a unified manner. You need to configure the driver information, such as whether to load the driver and the loading priority, in the configuration file. Then, the HDF starts the registered driver modules one by one. For details about how to configure the driver, see [Driver Development](../driver/driver-hdf-development.md#how-to-develop). + +2. Configure board-specific information and touchscreen private information.
    Configure the I/O pin functions. For example, set registers for the I2C pins on the board for the touchscreen to enable I2C communication. + +3. Implement device-specific APIs.
    Based on the communication interfaces designed for the board, use the pin operation APIs provided by the platform interface layer to configure the corresponding reset pin, interrupt pin, and power operations. For details about GPIO operations, see [GPIO](../driver/driver-platform-gpio-des.md). + + +### Development Example + +The following example describes how to develop the touchscreen driver for an RK3568 development board. + +1. Configure device information. + + Configure the modules of the input driver model in **drivers/adapter/khdf/linux/hcs/device_info/device_info.hcs**. For details, see [Driver Development](../driver/driver-hdf-development.md). Then, the HDF loads the modules of the input model in sequence based on the configuration information. + + ```c + input :: host { + hostName = "input_host"; + priority = 100; + device_input_manager :: device { + device0 :: deviceNode { + policy = 2; // The driver provides services externally. + priority = 100; // Loading priority. In the input model, the manager module has the highest priority. + preload = 0; // Whether to load the driver. The value 0 means to load the driver; 1 means the opposite. + permission = 0660; + moduleName = "HDF_INPUT_MANAGER"; + serviceName = "input_dev_manager"; + deviceMatchAttr = ""; + } + } + device_hdf_touch :: device { + device0 :: deviceNode { + policy = 2; + priority = 120; + preload = 0; + permission = 0660; + moduleName = "HDF_TOUCH"; + serviceName = "event1"; + deviceMatchAttr = "touch_device1"; + } + } + + device_touch_chip :: device { + device0 :: deviceNode { + policy = 0; + priority = 130; + preload = 0; + permission = 0660; + moduleName = "HDF_TOUCH_SAMPLE"; + serviceName = "hdf_touch_sample_service"; + deviceMatchAttr = "zsj_sample_5p5"; + } + } + } + ``` + +2. Configure board-specific and private data for the touchscreen. + + Configure the data in **drivers/adapter/khdf/linux/hcs/input/input_config.hcs**. The following is an example. You can modify the configuration as required. + + ```c + root { + input_config { + touchConfig { + touch0 { + boardConfig { + match_attr = "touch_device1"; + inputAttr { + inputType = 0; // 0 indicates touchscreen. + solutionX = 480; + solutionY = 960; + devName = "main_touch"; // Device name. + } + busConfig { + busType = 0; // 0 indicates I2C. + busNum = 6; + clkGpio = 86; + dataGpio = 87; + i2cClkIomux = [0x114f0048, 0x403]; // Register of the I2C_CLK pin. + i2cDataIomux = [0x114f004c, 0x403]; // Register of the I2C_DATA pin. + } + pinConfig { + rstGpio = 3; + intGpio = 4; + rstRegCfg = [0x112f0094, 0x400]; // Register of the reset pin. + intRegCfg = [0x112f0098, 0x400]; // Register of the interrupt pin. + } + powerConfig { + vccType = 2; // The value 1 stands for LDO, 2 for GPIO, and 3 for PMIC. + vccNum = 20; // Set the GPIO number to 20. + vccValue = 1800; // Set the voltage amplitude to 1800 mV. + vciType = 1; + vciNum = 12; + vciValue = 3300; + } + featureConfig { + capacitanceTest = 0; + gestureMode = 0; + gloverMOde = 0; + coverMode = 0; + chargerMode = 0; + knuckleMode = 0; + } + } + chipConfig { + template touchChip { + match_attr = ""; + chipName = "sample"; + vendorName = "zsj"; + chipInfo = "AAAA11222"; // The first four characters indicate the product name. The fifth and sixth characters indicate the IC model. The last three characters indicate the model number. + busType = 0; + deviceAddr = 0x5D; + irqFlag = 2; // The value 1 means to trigger an interrupt on the rising edge, 2 means to trigger an interrupt on the falling edge, 4 means to trigger an interrupt by the high level, and 8 means to trigger an interrupt by the low level. + maxSpeed = 400; + chipVersion = 0; + powerSequence { + /* Description of the power-on sequence: + [type, status, direction, delay] + 0 stands for null; 1 for VCC power (1.8 V); 2 for VCI power (3.3 V); 3 for reset pin; 4 for interrupt pin. + 0 stands for power-off or pull-down; 1 for power-on or pull-up; 2 for no operation. + 0 stands for input; 1 for output; 2 for no operation. + indicates the delay, in milliseconds. For example, 20 indicates 20 ms delay. + */ + powerOnSeq = [4, 0, 1, 0, + 3, 0, 1, 10, + 3, 1, 2, 60, + 4, 2, 0, 0]; + suspendSeq = [3, 0, 2, 10]; + resumeSeq = [3, 1, 2, 10]; + powerOffSeq = [3, 0, 2, 10, + 1, 0, 2, 20]; + } + } + chip0 :: touchChip { + match_attr = "zsj_sample_5p5"; + chipInfo = "ZIDN45100"; + chipVersion = 0; + } + } + } + } + } + } + ``` + +3. Add the touchscreen driver. + + Implement the touchscreen-specific APIs in **divers/framework/model/input/driver/touchscreen/touch_gt911.c**. The following uses the APIs for obtaining and parsing device data as an example. You can implement the related APIs to match your development. + + ```c + /* Parse the touch reporting data read from the touchscreen into coordinates. */ + static void ParsePointData(ChipDevice *device, FrameData *frame, uint8_t *buf, uint8_t pointNum) + { + int32_t resX = device->driver->boardCfg->attr.resolutionX; + int32_t resY = device->driver->boardCfg->attr.resolutionY; + + for (int32_t i = 0; i < pointNum; i++) { + frame->fingers[i].y = (buf[GT_POINT_SIZE * i + GT_X_LOW] & ONE_BYTE_MASK) | + ((buf[GT_POINT_SIZE * i + GT_X_HIGH] & ONE_BYTE_MASK) << ONE_BYTE_OFFSET); + frame->fingers[i].x = (buf[GT_POINT_SIZE * i + GT_Y_LOW] & ONE_BYTE_MASK) | + ((buf[GT_POINT_SIZE * i + GT_Y_HIGH] & ONE_BYTE_MASK) << ONE_BYTE_OFFSET); + frame->fingers[i].valid = true; + } + } + /* Obtain the touch reporting data from the device. */ + static int32_t ChipDataHandle(ChipDevice *device) + { + int32_t ret; + uint8_t touchStatus = 0; + uint8_t pointNum; + uint8_t buf[GT_POINT_SIZE * MAX_SUPPORT_POINT] = {0}; + InputI2cClient *i2cClient = &device->driver->i2cClient; + uint8_t reg[GT_ADDR_LEN] = {0}; + FrameData *frame = &device->driver->frameData; + reg[0] = (GT_BUF_STATE_ADDR >> ONE_BYTE_OFFSET) & ONE_BYTE_MASK; + reg[1] = GT_BUF_STATE_ADDR & ONE_BYTE_MASK; + ret = InputI2cRead(i2cClient, reg, GT_ADDR_LEN, &touchStatus, 1); + if (ret < 0 || touchStatus == GT_EVENT_INVALID) { + return HDF_FAILURE; + } + OsalMutexLock(&device->driver->mutex); + (void)memset_s(frame, sizeof(FrameData), 0, sizeof(FrameData)); + if (touchStatus == GT_EVENT_UP) { + frame->realPointNum = 0; + frame->definedEvent = TOUCH_UP; + goto exit; + } + reg[0] = (GT_X_LOW_BYTE_BASE >> ONE_BYTE_OFFSET) & ONE_BYTE_MASK; + reg[1] = GT_X_LOW_BYTE_BASE & ONE_BYTE_MASK; + pointNum = touchStatus & GT_FINGER_NUM_MASK; + if (pointNum <= 0 || pointNum > MAX_SUPPORT_POINT) { + HDF_LOGE("%s: pointNum is invalid, %d", __func__, pointNum); + (void)ChipCleanBuffer(i2cClient); + OsalMutexUnlock(&device->driver->mutex); + return HDF_FAILURE; + } + frame->realPointNum = pointNum; + frame->definedEvent = TOUCH_DOWN; + /* Read the touch reporting data from the register. */ + (void)InputI2cRead(i2cClient, reg, GT_ADDR_LEN, buf, GT_POINT_SIZE * pointNum); + /* Parse the touch reporting data. */ + ParsePointData(device, frame, buf, pointNum); + exit: + OsalMutexUnlock(&device->driver->mutex); + if (ChipCleanBuffer(i2cClient) != HDF_SUCCESS) { + return HDF_FAILURE; + } + return HDF_SUCCESS; + } + + static struct TouchChipOps g_sampleChipOps = { + .Init = ChipInit, + .Detect = ChipDetect, + .Resume = ChipResume, + .Suspend = ChipSuspend, + .DataHandle = ChipDataHandle, + }; + + static TouchChipCfg *ChipConfigInstance(struct HdfDeviceObject *device) + { + TouchChipCfg *chipCfg = (TouchChipCfg *)OsalMemAlloc(sizeof(TouchChipCfg)); + if (chipCfg == NULL) { + HDF_LOGE("%s: instance chip config failed", __func__); + return NULL; + } + (void)memset_s(chipCfg, sizeof(TouchChipCfg), 0, sizeof(TouchChipCfg)); + /* Parse the touchscreen private configuration. */ + if (ParseTouchChipConfig(device->property, chipCfg) != HDF_SUCCESS) { + HDF_LOGE("%s: parse chip config failed", __func__); + OsalMemFree(chipCfg); + chipCfg = NULL; + } + return chipCfg; + } + + static ChipDevice *ChipDeviceInstance(void) + { + ChipDevice *chipDev = (ChipDevice *)OsalMemAlloc(sizeof(ChipDevice)); + if (chipDev == NULL) { + HDF_LOGE("%s: instance chip device failed", __func__); + return NULL; + } + (void)memset_s(chipDev, sizeof(ChipDevice), 0, sizeof(ChipDevice)); + return chipDev; + } + + static void FreeChipConfig(TouchChipCfg *config) + { + if (config->pwrSeq.pwrOn.buf != NULL) { + OsalMemFree(config->pwrSeq.pwrOn.buf); + } + if (config->pwrSeq.pwrOff.buf != NULL) { + OsalMemFree(config->pwrSeq.pwrOff.buf); + } + OsalMemFree(config); + } + + static int32_t HdfSampleChipInit(struct HdfDeviceObject *device) + { + TouchChipCfg *chipCfg = NULL; + ChipDevice *chipDev = NULL; + HDF_LOGE("%s: enter", __func__); + if (device == NULL) { + return HDF_ERR_INVALID_PARAM; + } + /* Parse the touchscreen private configuration. */ + chipCfg = ChipConfigInstance(device); + if (chipCfg == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + /* Instantiate the touchscreen device. */ + chipDev = ChipDeviceInstance(); + if (chipDev == NULL) { + goto freeCfg; + } + chipDev->chipCfg = chipCfg; + chipDev->ops = &g_sampleChipOps; + chipDev->chipName = chipCfg->chipName; + chipDev->vendorName = chipCfg->vendorName; + + /* Register the touchscreen device with the platform driver. */ + if (RegisterChipDevice(chipDev) != HDF_SUCCESS) { + goto freeDev; + } + HDF_LOGI("%s: exit succ, chipName = %s", __func__, chipCfg->chipName); + return HDF_SUCCESS; + + freeDev: + OsalMemFree(chipDev); + freeCfg: + FreeChipConfig(chipCfg); + return HDF_FAILURE; + } + + struct HdfDriverEntry g_touchSampleChipEntry = { + .moduleVersion = 1, + .moduleName = "HDF_TOUCH_SAMPLE", + .Init = HdfSampleChipInit, + }; + + HDF_INIT(g_touchSampleChipEntry); + ``` + +4. Call the Input HDI APIs. + + The following sample code shows how an upper-layer input system service calls Input HDI APIs. + + ```c + #include "input_manager.h" + #define DEV_INDEX 1 + + IInputInterface *g_inputInterface; + InputReportEventCb g_callback; + + /* Define the callback for data reporting. */ + static void ReportEventPkgCallback(const EventPackage **pkgs, uint32_t count) + { + if (pkgs == NULL || count > MAX_PKG_NUM) { + return; + } + for (uint32_t i = 0; i < count; i++) { + HDF_LOGI("%s: pkgs[%d] = 0x%x, 0x%x, %d", __func__, i, pkgs[i]->type, pkgs[i]->code, pkgs[i]->value); + } + } + + int InputServiceSample(void) + { + uint32_t devType = INIT_DEFAULT_VALUE; + + /* Obtain the input driver APIs. */ + int ret = GetInputInterface(&g_inputInterface); + if (ret != INPUT_SUCCESS) { + HDF_LOGE("%s: get input interfaces failed, ret = %d", __func__, ret); + return ret; + } + + INPUT_CHECK_NULL_POINTER(g_inputInterface, INPUT_NULL_PTR); + INPUT_CHECK_NULL_POINTER(g_inputInterface->iInputManager, INPUT_NULL_PTR); + /* Open an input device. */ + ret = g_inputInterface->iInputManager->OpenInputDevice(DEV_INDEX); + if (ret) { + HDF_LOGE("%s: open input device failed, ret = %d", __func__, ret); + return ret; + } + + INPUT_CHECK_NULL_POINTER(g_inputInterface->iInputController, INPUT_NULL_PTR); + /* Obtain the type of the input device. */ + ret = g_inputInterface->iInputController->GetDeviceType(DEV_INDEX, &devType); + if (ret) { + HDF_LOGE("%s: get device type failed, ret: %d", __FUNCTION__, ret); + return ret; + } + HDF_LOGI("%s: device1's type is %u\n", __FUNCTION__, devType); + + /* Register the data reporting callback for the input device. */ + g_callback.ReportEventPkgCallback = ReportEventPkgCallback; + INPUT_CHECK_NULL_POINTER(g_inputInterface->iInputReporter, INPUT_NULL_PTR); + ret = g_inputInterface->iInputReporter->RegisterReportCallback(DEV_INDEX, &g_callback); + if (ret) { + HDF_LOGE("%s: register callback failed, ret: %d", __FUNCTION__, ret); + return ret; + } + HDF_LOGI("%s: wait 10s for testing, pls touch the panel now", __FUNCTION__); + OsalMSleep(KEEP_ALIVE_TIME_MS); + + /* Unregister the callback for the input device. */ + ret = g_inputInterface->iInputReporter->UnregisterReportCallback(DEV_INDEX); + if (ret) { + HDF_LOGE("%s: unregister callback failed, ret: %d", __FUNCTION__, ret); + return ret; + } + + /* Close the input device. */ + ret = g_inputInterface->iInputManager->CloseInputDevice(DEV_INDEX); + if (ret) { + HDF_LOGE("%s: close device failed, ret: %d", __FUNCTION__, ret); + return ret; + } + return 0; + } + ``` diff --git a/en/device-dev/driver/driver-peripherals-usb-des.md b/en/device-dev/driver/driver-peripherals-usb-des.md index f2b3ba9b44..782684f470 100644 --- a/en/device-dev/driver/driver-peripherals-usb-des.md +++ b/en/device-dev/driver/driver-peripherals-usb-des.md @@ -1,224 +1,452 @@ # USB +## Introduction -## Overview +### Function Overview -USB host development aims to provide host-related functions, including protocol encapsulation, device management, and driver installation and uninstall. +The universal serial bus (USB) consists of a USB host and multiple USB devices. The USB host implement data transfer and port management in the USB bus, and the USB device can connect to various peripherals. Therefore, USB driver development is divided into USB host driver development and USB device driver development. -USB device development aims to provide device-related functions, including device management, configuration management, and I/O management. These functions implement creation, configuration, and data communication of USB devices. +The USB module of OpenHarmony supports the development of USB services, provides USB-related functions, provides interfaces to read and write USB device data of third-party function drivers in user mode, creates and deletes USB devices, obtains notification events, enables or disables event listening, implements non-isochronous and isochronous data transfer over USB pipes, and sets custom USB attributes. - The following figures show the USB host and device driver models. +The USB DriverDevelop Kit (DDK) is the USB driver development kit provided by the Framework of the OpenHarmony Driver Foundation (HDF). This kit consists of the USB Host DDK and USB Device DDK. It supports the development of USB device drivers based on the user mode and provides rich USB driver development capabilities that help you to efficiently develop USB drivers. + +### Basic Concepts + +- Pipe + + A pipe is a model for data transfer between the USB host and a device endpoint. Once a USB device is powered on, a pipe, that is, the default control pipe, is established. The USB host obtains the description, configuration, and status of the USB device through the pipe, and configures the device as requested. Pipes and endpoints are associated and share the same attributes, such as the supported transfer type, maximum packet length, and data transfer direction. + +- Endpoint + + The minimum unit that transfers and receives data in a USB device. It supports unidirectional or bidirectional data transfer. One USB device may include several endpoints, and different endpoints are distinguished by endpoint numbers and directions. Different endpoints can support different data transfer types, access intervals, and maximum packet sizes. All endpoints except endpoint 0 support data transfer in only one direction. Endpoint 0 is a special endpoint that supports bidirectional control transfer. + +- Interface + + The application implements device control and data transfer through exchanging data with the device. Because a pipe supports only one data transfer type, multiple pipes are usually required to complete data exchange in this process. A collection of pipes that are used together to control a device is called an interface. + +- Descriptor + + A data structure used to describe device attributes. The first byte indicates the descriptor size (number of bytes), and the second byte indicates the descriptor type. + +### Working Principles + +#### USB Host DDK + +The USB Host DDK provides the capability of developing USB drivers on the host. Based on functions, APIs of the USB Host DDK are classified into three types: DDK initialization, **interface** object operation, and **request** object operation. **Figure 1** USB host driver model ![](figures/USB_host_driver_model.png "USB host driver model") - +- The USB Interface Pool module manages USB interfaces. It applies for and reclaims USB interface objects, which are used to record device port information and resources. The module manages USB interfaces by USB port. In addition, it provides USB DDK APIs to read and write USB data. + +- The USB Protocol Layer module provides USB protocol encapsulation, translates and parses device I/O and control commands based on the USB protocol, manages device descriptors, and matches descriptors based on the enum information reported by the USB device. This module creates the corresponding USB interface objects and adds them to the USB Interface Pool module for management. + +- The Device I/O Manager module manages USB I/O requests and provides synchronous and asynchronous I/O management mechanisms. For the asynchronous I/O management mechanism, the module records the asynchronous I/O requests and processes the requests to be sent through the APIs provided by the Raw API Library module. After receiving the processing result from the USB controller, the I/O request receiving thread parses the processing result and reports it to the upper-layer caller. + +- The Raw API Library module abstracts underlying OS capabilities, defines unified OS capability APIs, and provides the USB RAW APIs needed to implement more complex driver functions. + +- The OS Adapter module encapsulates operations related to platforms (Linux and LiteOS). It compiles encapsulation APIs depending on the configuration of the specific platform. On the Linux platform, all USB FS access operations are encapsulated in this module. On the LiteOS platform, all device access operations based on the FreeBSD USB framework are encapsulated in this module. + +- The PNP Notify module dynamically monitors USB status changes. This module updates the device information when a device is added or removed. Meanwhile, it reports all USB device information to the PNP Notify Manager module on the UHDF side through the KHDF to load or uninstall third-party function drivers. + +#### USB Device DDK + +The USB Device DDK provides the capability of developing USB drivers on the device side. For example, with the dynamic registration and deregistration capabilities, you can dynamically add and combine USB ports based on the actual requirement; with the dynamic instantiation capability, you can create device instances and transmission channels based on dynamically delivered device, configuration, interface, and endpoint descriptors. In addition, the following functions are supported: sending and receiving data in user mode, isolating multiple logical devices from each other on a physical device, and accessing different logical devices from different application processes at the same time. + **Figure 2** USB device driver model ![](figures/USB_device_driver_model.png "USB device driver model") -The USB driver model offers the following APIs: +- The SDK IF module divides USB devices logically by device, interface, and pipe, and encapsulates functions including configuration management, device management, and I/O management. This module also provides APIs for device driver development, such as creating and obtaining devices, receiving events, and sending and receiving data. -- The USB host Driver Development Kit (DDK) provides driver capability APIs that can be directly called in user mode. The APIs can be classified into the DDK initialization class, interface operation class, and request operation class by function. These APIs can be used to perform DDK initialization, bind/release and open/close an interface, allocate/release a request, and implement synchronous or asynchronous transfer. +- The Configuration Manager module parses the .hcs file for the USB descriptor information, which will be used for creating USB devices. In addition, the module provides operations such as reading, creating, deleting, and modifying custom USB attributes. -- The USB device DDK provides device management, I/O management, and configuration management APIs, which can be used to create or delete a device, obtain or open an interface, and perform synchronous or asynchronous transfer. +- The Device Manager module parses USB descriptor information and creates USB devices accordingly. It also provides functions such as adding or deleting USB devices, obtaining USB device status, and obtaining USB device interface information. +- The IO Manager module reads and writes data, including common events and data read and write events. It supports data read and write in synchronous and asynchronous modes. -### Available APIs +- The Adapter IF module encapsulates device node operations of composite device configuration drivers and common function drivers to provide unified device management APIs for the upper layer. -The tables below describe the APIs provided by the USB host driver model. +- The Adapter module is provided by the composite device configuration driver and common function driver. - **Table 1** usb_ddk_interface.h +## Development Guidelines -| API| Description| -| -------- | -------- | -| int32_t UsbInitHostSdk(struct UsbSession \*\*session); | Initializes the USB host driver DDK.| -| int32_t UsbExitHostSdk(const struct UsbSession
    \*session); | Exits the USB host driver DDK.| -| const struct UsbInterface \*UsbClaimInterface(const
    struct UsbSession \*session, uint8_t busNum, uint8_t
    usbAddr, uint8_t interfaceIndex); | Obtains a USB interface.| -| int UsbReleaseInterface(const struct UsbInterface
    \*interfaceObj); | Releases a USB interface.| -| int UsbAddOrRemoveInterface(const struct UsbSession
    \*session, uint8_t busNum, uint8_t usbAddr, uint8_t
    interfaceIndex, UsbInterfaceStatus status); | Adds or removes a USB interface.| -| UsbInterfaceHandle \*UsbOpenInterface(const struct
    UsbInterface \*interfaceObj); | Opens a USB interface.| -| int32_t UsbCloseInterface(const UsbInterfaceHandle
    \*interfaceHandle); | Closes a USB interface.| -| int32_t UsbSelectInterfaceSetting(const
    UsbInterfaceHandle \*interfaceHandle, uint8_t
    settingIndex, struct UsbInterface \*\*interfaceObj); | Sets a USB interface.| -| int32_t UsbGetPipeInfo(const UsbInterfaceHandle
    \*interfaceHandle, uint8_t settingIndex, uint8_t pipeId,
    struct UsbPipeInfo \*pipeInfo); | Obtains USB pipe information.| -| int32_t UsbClearInterfaceHalt(const
    UsbInterfaceHandle \*interfaceHandle, uint8_t
    pipeAddress); | Clears the state of the pipe with the specified index.| -| struct UsbRequest \*UsbAllocRequest(const
    UsbInterfaceHandle \*interfaceHandle, int isoPackets
    , int length); | Allocates a request object.| -| int UsbFreeRequest(const struct UsbRequest
    \*request); | Releases a request object.| -| int UsbSubmitRequestAsync(const struct UsbRequest
    \*request); | Sends an asynchronous request.| -| int32_t UsbFillRequest(const struct UsbRequest
    \*request, const UsbInterfaceHandle \*interfaceHandle,
    const struct UsbRequestParams \*params); | Fills in a request.| -| sint UsbCancelRequest(const struct UsbRequest
    \*request); | Cancels an asynchronous request.| -| int UsbSubmitRequestSync(const struct UsbRequest
    \*request); | Sends a synchronous request.| - - **Table 2** usb_raw_api.h - -| API| Description| -| -------- | -------- | -| int UsbRawInit(struct UsbSession \*\*session); | Initializes the USB raw APIs.| -| int UsbRawExit(const struct UsbSession \*session); | Exits the USB raw APIs.| -| UsbRawHandle \*UsbRawOpenDevice(const struct
    UsbSession \*session, uint8_t busNum, uint8_t
    usbAddr); | Opens a USB device.| -| int UsbRawCloseDevice(const UsbRawHandle
    \*devHandle); | Closes a USB device.| -| int UsbRawSendControlRequest(const struct
    UsbRawRequest \*request, const UsbRawHandle
    \*devHandle, const struct UsbControlRequestData
    \*requestData); | Performs a control transfer synchronously.| -| int UsbRawSendBulkRequest(const struct
    UsbRawRequest \*request, const UsbRawHandle
    \*devHandle, const struct UsbRequestData
    \*requestData); | Performs a bulk transfer synchronously.| -| int UsbRawSendInterruptRequest(const struct
    UsbRawRequest \*request, const UsbRawHandle
    \*devHandle, const struct UsbRequestData
    \*requestData); | Performs an interrupt transfer synchronously.| -| int UsbRawGetConfigDescriptor(const UsbRawDevice
    \*rawDev, uint8_t configIndex, struct
    UsbRawConfigDescriptor \*\*config); | Obtains the configuration descriptor of a device.| -| void UsbRawFreeConfigDescriptor(const struct
    UsbRawConfigDescriptor \*config); | Releases the memory space of a configuration descriptor.| -| int UsbRawGetConfiguration(const UsbRawHandle
    \*devHandle, int \*config); | Obtains the configuration in use.| -| int UsbRawSetConfiguration(const UsbRawHandle
    \*devHandle, int config); | Sets the configuration in use.| -| int UsbRawGetDescriptor(const struct UsbRawRequest
    \*request, const UsbRawHandle \*devHandle, const struct
    UsbRawDescriptorParam \*param, const unsigned char
    \*data); | Obtains descriptor information.| -| UsbRawDevice \*UsbRawGetDevice(const UsbRawHandle
    \*devHandle); | Obtains the device pointer based on the device handle.| -| int UsbRawGetDeviceDescriptor(const UsbRawDevice
    \*rawDev, struct
    UsbDeviceDescriptor \*desc); | Obtains the device descriptor of the specified USB device.| -| int UsbRawClaimInterface(const UsbRawHandle
    \*devHandle, int
    interfaceNumber); | Declares the interface on the specified device handle.| -| int UsbRawReleaseInterface(const UsbRawHandle
    \*devHandle, in
    t interfaceNumber); | Releases the previously declared interface.| -| int UsbRawResetDevice(const UsbRawHandle
    \*devHandle); | Resets a device.| -| struct UsbRawRequest \*UsbRawAllocRequest(const
    UsbRawHandle
    \*devHandle, int isoPackets, int length); | Allocates a transfer request with the specified number of sync packet descriptors.| -| int UsbRawFreeRequest(const struct UsbRawRequest
    \*request); | Releases the previously allocated transfer request.| -| int UsbRawFillBulkRequest(const struct UsbRawRequest
    \*request, const UsbRawHandle \*devHandle, const struct
    UsbRawFillRequestData \*fillData); | Fills in a bulk transfer request.| -| int UsbRawFillControlSetup(const unsigned char \*setup,
    const struct UsbControlRequestData \*requestData); | Fills in a control setup packet.| -| int UsbRawFillControlRequest(const struct UsbRawRequest
    \*request, const UsbRawHandle \*devHandle, const struct
    UsbRawFillRequestData \*fillData); | Fills in a control transfer request.| -| int UsbRawFillInterruptRequest(const struct UsbRawRequest
    \*request, const UsbRawHandle \*devHandle, const struct
    UsbRawFillRequestData \*fillData); | Fills in an interrupt transfer request.| -| int UsbRawFillIsoRequest(const struct UsbRawRequest
    \*request, const UsbRawHandle \*devHandle, const struct
    UsbRawFillRequestData \*fillData); | Fills in an isochronous transfer request.| -| int UsbRawSubmitRequest(const struct UsbRawRequest
    \*request); | Submits a transfer request.| -| int UsbRawCancelRequest(const struct UsbRawRequest
    \*request); | Cancels a transfer request.| -| int UsbRawHandleRequests(const UsbRawHandle
    \*devHandle); | Handles a transfer request event.| - -The tables below describe the APIs provided by the USB device driver model. - - **Table 3** usbfn_device.h - -| API| Description| -| -------- | -------- | -| const struct UsbFnDevice \*UsbFnCreateDevice(const
    char \*udcName, const struct UsbFnDescriptorData
    \*descriptor); | Creates a USB device.| -| int UsbFnRemoveDevice(struct UsbFnDevice
    \*fnDevice); | Deletes a USB device.| -| const struct UsbFnDevice \*UsbFnGetDevice(const char
    \*udcName); | Obtains a USB device.| +The USB driver development in kernel mode is complex. Therefore, you need to have a deep understanding of the USB protocol. The USB DDK is introduced to help you to develop USB drivers in user mode more conveniently. - **Table 4** usbfn_interface.h +### When to Use -| API| Description| -| -------- | -------- | -| int UsbFnStartRecvInterfaceEvent(struct
    UsbFnInterface \*interface, uint32_t eventMask,
    UsbFnEventCallback callback, void \*context); | Starts receiving events.| -| int UsbFnStopRecvInterfaceEvent(struct
    UsbFnInterface \*interface); | Stops receiving events.| -| UsbFnInterfaceHandle UsbFnOpenInterface(struct UsbFnInterface \*interface); | Opens an interface.| -| int UsbFnCloseInterface(UsbFnInterfaceHandle handle); | Closes an interface.| -| int UsbFnGetInterfacePipeInfo(struct UsbFnInterface
    \*interface, uint8_t pipeId, struct UsbFnPipeInfo \*info); | Obtains pipe information.| -| int UsbFnSetInterfaceProp(const struct UsbFnInterface
    \*interface, const char \*name, const char \*value); | Sets custom properties.| +The USB Host DDK comes with two modes, namely, common mode and expert mode. In common mode, you can directly read and write USB data by using USB DDK APIs without knowing details about data transfer at the bottom layer. In expert mode, you can use USB RAW APIs to directly access the USB channel interfaces provided by the OS platform to implement more complex functions. The USB Device DDk provides functions such as USB device management, interface definition, and USB data request. - **Table 5** usbfn_request.h +### Available APIs -| API| Description| -| -------- | -------- | -| struct UsbFnRequest
    \*UsbFnAllocCtrlRequest(UsbFnInterfaceHandle handle,
    uint32_t len); | Allocates a control transfer request.| -| struct UsbFnRequest \*UsbFnAllocRequest(UsbFnInterfaceHandle handle,
    uint8_t pipe, uint32_t len); | Allocates a data request.| -| int UsbFnFreeRequest(struct UsbFnRequest \*req); | Releases a request.| -| int UsbFnSubmitRequestAsync(struct UsbFnRequest
    \*req); | Sends an asynchronous request.| -| int UsbFnSubmitRequestSync(struct UsbFnRequest
    \*req, uint32_t timeout); | Sends a synchronous request.| -| int UsbFnCancelRequest(struct UsbFnRequest \*req); | Cancels a request.| +The following table lists the APIs related to USB host driver development (common mode). For details about the API definitions, see the [source code](https://gitee.com/openharmony/drivers_peripheral/blob/master/usb/interfaces/ddk/host/usb_ddk_interface.h). + **Table 1** APIs for USB host driver development (common mode) -## How to Develop +| API| Description| +| -------- | -------- | +| int32_t UsbInitHostSdk(struct UsbSession \*\*session); | Initializes the USB host driver DDK.| +| const struct UsbInterface \*UsbClaimInterface(const
    struct UsbSession \*session, uint8_t busNum, uint8_t
    usbAddr, uint8_t interfaceIndex); | Obtains a USB interface.| +| UsbInterfaceHandle \*UsbOpenInterface(const struct
    UsbInterface \*interfaceObj); | Opens a USB interface.| +| int32_t UsbGetPipeInfo(const UsbInterfaceHandle
    \*interfaceHandle, uint8_t settingIndex, uint8_t pipeId,
    struct UsbPipeInfo \*pipeInfo); | Obtains USB pipe information.| +| struct UsbRequest \*UsbAllocRequest(const
    UsbInterfaceHandle \*interfaceHandle, int32_t isoPackets
    , int32_t length); | Allocates a request object.| +| int32_t UsbFillRequest(const struct UsbRequest
    \*request, const UsbInterfaceHandle \*interfaceHandle,
    const struct UsbRequestParams \*params); | Fills in a request.| +| int32_t UsbSubmitRequestSync(const struct UsbRequest
    \*request); | Sends a synchronous request.| -The USB driver is developed based on the Hardware Driver Foundation (HDF), platform, and Operating System Abstraction Layer (OSAL) APIs. A unified driver model is provided for USB devices, irrespective of the operating system and chip architecture. This document uses a serial port as an example to describe how to develop drivers for the USB host and USB device. +The following table lists the APIs related to USB host driver development (expert mode). For details about the API definitions, see the [source code](https://gitee.com/openharmony/drivers_peripheral/blob/master/usb/interfaces/ddk/host/usb_raw_api.h). + **Table 2** APIs for USB host driver development (expert mode) -### Developing Driver Using Host DDK APIs +| API| Description| +| -------- | -------- | +| int32_t UsbRawInit(struct UsbSession \*\*session); | Initializes the USB raw APIs.| +| UsbRawHandle \*UsbRawOpenDevice(const struct
    UsbSession \*session, uint8_t busNum, uint8_t
    usbAddr); | Opens a USB device.| +| int32_t UsbRawSendControlRequest(const struct
    UsbRawRequest \*request, const UsbRawHandle
    \*devHandle, const struct UsbControlRequestData
    \*requestData); | Performs a control transfer synchronously.| +| int32_t UsbRawSendBulkRequest(const struct
    UsbRawRequest \*request, const UsbRawHandle
    \*devHandle, const struct UsbRequestData
    \*requestData); | Performs a bulk transfer synchronously.| +| int32_t UsbRawSendInterruptRequest(const struct
    UsbRawRequest \*request, const UsbRawHandle
    \*devHandle, const struct UsbRequestData
    \*requestData); | Performs an interrupt transfer synchronously.| +| int32_t UsbRawGetConfigDescriptor(const UsbRawDevice
    \*rawDev, uint8_t configIndex, struct
    UsbRawConfigDescriptor \*\*config); | Obtains the configuration descriptor of a device.| +| int32_t UsbRawFillInterruptRequest(const struct UsbRawRequest
    \*request, const UsbRawHandle \*devHandle, const struct
    UsbRawFillRequestData \*fillData); | Fills in an interrupt transfer request.| +| int32_t UsbRawFillIsoRequest(const struct UsbRawRequest
    \*request, const UsbRawHandle \*devHandle, const struct
    UsbRawFillRequestData \*fillData); | Fills in an isochronous transfer request.| +| int32_t UsbRawSubmitRequest(const struct UsbRawRequest
    \*request); | Submits a transfer request.| +| int32_t UsbRawCancelRequest(const struct UsbRawRequest
    \*request); | Cancels a transfer request.| +| int32_t UsbRawHandleRequests(const UsbRawHandle
    \*devHandle); | Handles a transfer request event.| + +The following table lists the APIs for USB device management on the device side. For details about the API definitions, see the [source code](https://gitee.com/openharmony/drivers_peripheral/blob/master/usb/interfaces/ddk/device/usbfn_device.h). + + **Table 3** APIs for USB device management on the device side + +| API| Description| +| -------- | -------- | +| const struct UsbFnDevice \*UsbFnCreateDevice(const
    char \*udcName, const struct UsbFnDescriptorData
    \*descriptor); | Creates a USB device.| +| int32_t UsbFnRemoveDevice(struct UsbFnDevice
    \*fnDevice); | Deletes a USB device.| +| const struct UsbFnDevice \*UsbFnGetDevice(const char
    \*udcName); | Obtains a USB device.| -1. Configure the driver mapping table. +The following table lists the APIs for USB interface definition on the device side. For details about the API definitions, see the [source code](https://gitee.com/openharmony/drivers_peripheral/blob/master/usb/interfaces/ddk/device/usbfn_interface.h). -2. Initialize the USB host DDK. + **Table 4** APIs for USB interface definition on the device side -3. Obtain a **UsbInterface** object. +| API| Description| +| -------- | -------- | +| int32_t UsbFnStartRecvInterfaceEvent(struct
    UsbFnInterface \*interface, uint32_t eventMask,
    UsbFnEventCallback callback, void \*context); | Starts receiving events.| +| int32_t UsbFnStopRecvInterfaceEvent(struct
    UsbFnInterface \*interface); | Stops receiving events.| +| UsbFnInterfaceHandle UsbFnOpenInterface(struct UsbFnInterface \*interface); | Opens an interface.| +| int32_t UsbFnCloseInterface(UsbFnInterfaceHandle handle); | Closes an interface.| +| int32_t UsbFnGetInterfacePipeInfo(struct UsbFnInterface
    \*interface, uint8_t pipeId, struct UsbFnPipeInfo \*info); | Obtains pipe information.| +| int32_t UsbFnSetInterfaceProp(const struct UsbFnInterface
    \*interface, const char \*name, const char \*value); | Sets custom properties.| -4. Open the **UsbInterface** object to obtain the **UsbInterfaceHandle** object. +The following table lists the APIs for USB data request on the device side. For details about the API definitions, see the [source code](https://gitee.com/openharmony/drivers_peripheral/blob/master/usb/interfaces/ddk/device/usbfn_request.h). -5. Obtain pipe information of the specified **pipeIndex** based on the **UsbInterfaceHandle** object. + **Table 5** APIs for USB data request on the device side -6. Allocate an I/O request for the **UsbInterfaceHandle** object. +| API| Description| +| -------- | -------- | +| struct UsbFnRequest
    \*UsbFnAllocCtrlRequest(UsbFnInterfaceHandle handle,
    uint32_t len); | Allocates a control transfer request.| +| struct UsbFnRequest \*UsbFnAllocRequest(UsbFnInterfaceHandle handle,
    uint8_t pipe, uint32_t len); | Allocates a data request.| +| int32_t UsbFnFreeRequest(struct UsbFnRequest \*req); | Releases a request.| +| int32_t UsbFnSubmitRequestAsync(struct UsbFnRequest
    \*req); | Sends an asynchronous request.| +| int32_t UsbFnSubmitRequestSync(struct UsbFnRequest
    \*req, uint32_t timeout); | Sends a synchronous request.| +| int32_t UsbFnCancelRequest(struct UsbFnRequest \*req); | Cancels a request.| + + +### How to Develop + +USB drivers are developed based on the Hardware Driver Foundation (HDF), platform, and Operating System Abstraction Layer (OSAL) APIs. A unified driver model is provided for USB devices, irrespective of the operating system and chip architecture. This section uses the serial port as an example to describe how to develop USB host and USB device drivers. + +#### Developing Driver Using Host DDK APIs + +1. Configure USB host driver information in the .hcs file of private device data. + + ```cpp + root { + module = "usb_pnp_device"; + usb_pnp_config { + match_attr = "usb_pnp_match"; + usb_pnp_device_id = "UsbPnpDeviceId"; + UsbPnpDeviceId { + idTableList = [ + "host_acm_table" + ]; + host_acm_table { + // Driver module name, which must be the same as the value of moduleName in the driver entry structure. + moduleName = "usbhost_acm"; + // Service name of the driver, which must be unique. + serviceName = "usbhost_acm_pnp_service"; + // Keyword for matching private driver data. + deviceMatchAttr = "usbhost_acm_pnp_matchAttr"; + // Data length starting from this field, in bytes. + length = 21; + // USB driver matching rule: vendorId+productId+interfaceSubClass+interfaceProtocol+interfaceNumber. + matchFlag = 0x0303; + // Vendor ID. + vendorId = 0x12D1; + // Product ID. + productId = 0x5000; + // The least significant 16 bits of the device sequence number. + bcdDeviceLow = 0x0000; + // The most significant 16 bits of the device sequence number. + bcdDeviceHigh = 0x0000; + // Device class code allocated by the USB. + deviceClass = 0; + // Child class code allocated by the USB. + deviceSubClass = 0; + // Device protocol code allocated by the USB. + deviceProtocol = 0; + // Interface type. You can enter multiple types as needed. + interfaceClass = [0]; + // Interface subtype. You can enter multiple subtypes as needed. + interfaceSubClass = [2, 0]; + // Protocol that the interface complies with. You can enter multiple protocols as needed. + interfaceProtocol = [1, 2]; + // Interface number. You can enter multiple interface numbers as needed. + interfaceNumber = [2, 3]; + } + } + } + } + ``` -7. Fill in the I/O request based on the input parameters. +2. Initialize the USB host driver DDK. -8. Submit the I/O request in synchronous or asynchronous mode. + ```cpp + int32_t UsbInitHostSdk(struct UsbSession **session); + ``` +3. Obtain the **UsbInterface** object after initialization. -### Developing Driver Using Host Raw APIs + ```cpp + const struct UsbInterface *UsbClaimInterface(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr, uint8_t interfaceIndex); + ``` -1. Configure the driver mapping table. +4. Open the **UsbInterface** object to obtain the **UsbInterfaceHandle** object. -2. Initialize the host raw data, open the USB device, obtain the descriptor, and then obtain interface and endpoint information based on the descriptor. + ```cpp + UsbInterfaceHandle *UsbOpenInterface(const struct UsbInterface *interfaceObj); + ``` -3. Allocate a request and fill in the request based on the transfer type. +5. Obtain pipe information of the specified **pipeIndex** based on the **UsbInterfaceHandle** object. -4. Submit the I/O request in synchronous or asynchronous mode. + ```cpp + int32_t UsbGetPipeInfo(const UsbInterfaceHandle *interfaceHandle, uint8_t settingIndex, uint8_t pipeId, struct UsbPipeInfo *pipeInfo); + ``` +6. Pre-allocate an I/O request for the **UsbInterfaceHandle** object. -### Developing Driver Using Device DDK APIs + ```cpp + struct UsbRequest *UsbAllocRequest(const UsbInterfaceHandle *interfaceHandle, int32_t isoPackets, int32_t length); + ``` -1. Construct a descriptor. +7. Fill in the I/O request based on the input parameters. -2. Instantiate a USB device using the descriptor constructed. + ```cpp + int32_t UsbFillRequest(const struct UsbRequest *request, const UsbInterfaceHandle *interfaceHandle, const struct UsbRequestParams *params); + ``` -3. Call **UsbFnDeviceGetInterface** to obtain an interface, call **UsbFnInterfaceGetPipeInfo** to obtain pipe information based on the interface, call **UsbFnInterfaceOpen** to open the interface to obtain the handle, and call **UsbFnRequestAlloc** to obtain the request based on the handle and pipe ID. +8. Submit the I/O request in synchronous or asynchronous mode. -4. Call **UsbFnInterfaceStartRecvEvent** to receive events such as Enable and Setup, and respond to the events in **UsbFnEventCallback**. + ```cpp + int32_t UsbSubmitRequestSync(const struct UsbRequest *request); // Send a synchronous I/O request. + int32_t UsbSubmitRequestAsync(const struct UsbRequest *request); // Send an asynchronous I/O request. + ``` -5. Send and receive data in synchronous or asynchronous mode. +#### Developing Driver Using Host Raw APIs +1. Configure USB host driver information in the .hcs file of private device data. For details, see step 1 in the previous section. -## Development Example +2. Initialize the host raw data, open the USB device, obtain the descriptor, and then obtain interface and endpoint information based on the descriptor. -The following examples help you better understand the development of the USB serial port driver. + ```cpp + int32_t UsbRawInit(struct UsbSession **session); + ``` + +3. Open the USB device. + + ```cpp + UsbRawHandle *UsbRawOpenDevice(const struct UsbSession *session, uint8_t busNum, uint8_t usbAddr); + ``` + +4. Obtain the device descriptor, and obtain the interface and endpoint information based on the descriptor. + + ```cpp + int32_t UsbRawGetConfigDescriptor(const UsbRawDevice *rawDev, uint8_t configIndex, struct UsbRawConfigDescriptor **config); + ``` + +5. Allocate a request and fill in the request based on the transfer type. + + ```cpp + int32_t UsbRawFillBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); // Populate the request for bulk transfer. + int32_t UsbRawFillControlSetup(const unsigned char *setup, const struct UsbControlRequestData *requestData); + int32_t UsbRawFillControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); // Populate the request for control transfer. + int32_t UsbRawFillInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); // Populate the request for interrupt transfer. + int32_t UsbRawFillIsoRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRawFillRequestData *fillData); // Populate the request for isochronous transfer. + ``` + +6. Submit the I/O request in synchronous or asynchronous mode. + + ```cpp + int32_t UsbRawSendControlRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbControlRequestData *requestData); // Send a synchronous request for control transfer. + int32_t UsbRawSendBulkRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData); // Send a synchronous request for bulk transfer. + int32_t UsbRawSendInterruptRequest(const struct UsbRawRequest *request, const UsbRawHandle *devHandle, const struct UsbRequestData *requestData); // Send a synchronous request for interrupt transfer. + int32_t UsbRawSubmitRequest(const struct UsbRawRequest *request); // Send an asynchronous I/O request. + ``` + +#### Developing Driver Using Device DDK APIs + +1. Construct a descriptor in the device function code. + + ```cpp + static struct UsbFnFunction g_acmFunction = { // Function descriptor + .enable = true, + .funcName = "f_generic.a", + .strings = g_acmStrings, + .fsDescriptors = g_acmFsFunction, + .hsDescriptors = g_acmHsFunction, + .ssDescriptors = g_acmSsFunction, + .sspDescriptors = NULL, + }; + struct UsbFnFunction *g_functions[] = { + #ifdef CDC_ECM + &g_ecmFunction, + #endif + #ifdef CDC_ACM + &g_acmFunction, + #endif + NULL + }; + static struct UsbFnConfiguration g_masterConfig = { // Configuration descriptor + .configurationValue = 1, + .iConfiguration = USB_FUNC_CONFIG_IDX, + .attributes = USB_CFG_BUS_POWERED, + .maxPower = POWER, + .functions = g_functions, + }; + static struct UsbFnConfiguration *g_configs[] = { + &g_masterConfig, + NULL, + }; + static struct UsbDeviceDescriptor g_cdcMasterDeviceDesc = { // Device descriptor + .bLength = sizeof(g_cdcMasterDeviceDesc), + .bDescriptorType = USB_DDK_DT_DEVICE, + .bcdUSB = CpuToLe16(BCD_USB), + .bDeviceClass = 0, + .bDeviceSubClass = 0, + .bDeviceProtocol = 0, + .bMaxPacketSize0 = USB_MAX_PACKET_SIZE, + .idVendor = CpuToLe16(DEVICE_VENDOR_ID), + .idProduct = CpuToLe16(DEVICE_PRODUCT_ID), + .bcdDevice = CpuToLe16(DEVICE_VERSION), + .iManufacturer = USB_FUNC_MANUFACTURER_IDX, + .iProduct = USB_FUNC_PRODUCT_IDX, + .iSerialNumber = USB_FUNC_SERIAL_IDX, + .bNumConfigurations = 1, + }; + static struct UsbFnDeviceDesc g_masterFuncDevice = { // Descriptor entry + .deviceDesc = &g_cdcMasterDeviceDesc, + .deviceStrings = g_devStrings, + .configs = g_configs, + }; + ``` + +2. Create a USB device. Call **UsbFnDeviceCreate** and pass in the UDC controller and **UsbFnDescriptorData** structure to create a USB device. + + ```cpp + if (useHcs == 0) { // Descriptor written in the code. + descData.type = USBFN_DESC_DATA_TYPE_DESC; + descData.descriptor = &g_acmFuncDevice; + } else { // Descriptor compiled by using the .hcs file. + descData.type = USBFN_DESC_DATA_TYPE_PROP; + descData.property = acm->device->property; + } + // Create a USB device. + fnDev = (struct UsbFnDevice *) UsbFnCreateDevice(acm->udcName, &descData); + ``` + +3. Call **UsbFnGetInterface** to obtain a **UsbInterface** object, and call **UsbFnGetInterfacePipeInfo** to obtain the USB pipe information. + + ```cpp + // Obtain an interface. + fnIface = (struct UsbFnInterface *)UsbFnGetInterface(fnDev, i); + // Obtain the pipe information. + UsbFnGetInterfacePipeInfo(fnIface, i, &pipeInfo); + // Obtain a handle. + handle = UsbFnOpenInterface(fnIface); + // Obtain a control (EP0) request. + req = UsbFnAllocCtrlRequest(acm->ctrlIface.handle, + sizeof(struct UsbCdcLineCoding) + sizeof(struct UsbCdcLineCoding)); + // Obtain the request. + req = UsbFnAllocCtrlRequest(acm->ctrlIface.handle, + sizeof(struct UsbCdcLineCoding) + sizeof(struct UsbCdcLineCoding)); + ``` + +4. Call **UsbFnStartRecvInterfaceEvent** to receive events, and call **UsbFnEventCallback** to respond to the events. + + ```cpp + // Start receiving events. + ret = UsbFnStartRecvInterfaceEvent(acm->ctrlIface.fn, 0xff, UsbAcmEventCallback, acm); + // Process the event in the callback. + static void UsbAcmEventCallback(struct UsbFnEvent *event) + { + struct UsbAcmDevice *acm = NULL; + if (event == NULL || event->context == NULL) { + HDF_LOGE("%s: event is null", __func__); + return; + } + acm = (struct UsbAcmDevice *)event->context; + switch (event->type) { + case USBFN_STATE_BIND: + HDF_LOGI("%s: receive bind event", __func__); + break; + case USBFN_STATE_UNBIND: + HDF_LOGI("%s: receive unbind event", __func__); + break; + case USBFN_STATE_ENABLE: + HDF_LOGI("%s: receive enable event", __func__); + AcmEnable(acm); + break; + case USBFN_STATE_DISABLE: + HDF_LOGI("%s: receive disable event", __func__); + AcmDisable(acm); + acm->enableEvtCnt = 0; + break; + case USBFN_STATE_SETUP: + HDF_LOGI("%s: receive setup event", __func__); + if (event->setup != NULL) { + AcmSetup(acm, event->setup); + } + break; + case USBFN_STATE_SUSPEND: + HDF_LOGI("%s: receive suspend event", __func__); + AcmSuspend(acm); + break; + case USBFN_STATE_RESUME: + HDF_LOGI("%s: receive resume event", __func__); + AcmResume(acm); + break; + default: + break; + } + } + ``` -### Developing Driver Using Host DDK APIs +5. Send and receive data in synchronously or asynchronously. - -``` -root { - module = "usb_pnp_device"; - usb_pnp_config { - match_attr = "usb_pnp_match"; - usb_pnp_device_id = "UsbPnpDeviceId"; - UsbPnpDeviceId { - idTableList = [ - "host_acm_table" - ]; - host_acm_table { - // Driver module name, which must be the same as the value of moduleName in the driver entry structure. - moduleName = "usbhost_acm"; - // Service name of the driver, which must be unique. - serviceName = "usbhost_acm_pnp_service"; - // Keyword for matching private driver data. - deviceMatchAttr = "usbhost_acm_pnp_matchAttr"; - // Data length starting from this field, in bytes. - length = 21; - // USB driver matching rule: vendorId+productId+interfaceSubClass+interfaceProtocol+interfaceNumber. - matchFlag = 0x0303; - // Vendor ID. - vendorId = 0x12D1; - // Product ID. - productId = 0x5000; - // The least significant 16 bits of the device sequence number. - bcdDeviceLow = 0x0000; - // The most significant 16 bits of the device sequence number. - bcdDeviceHigh = 0x0000; - // Device class code allocated by the USB. - deviceClass = 0; - // Child class code allocated by the USB. - deviceSubClass = 0; - // Device protocol code allocated by the USB. - deviceProtocol = 0; - // Interface type. You can enter multiple types as needed. - interfaceClass = [0]; - // Interface subtype. You can enter multiple subtypes as needed. - interfaceSubClass = [2, 0]; - // Protocol that the interface complies with. You can enter multiple protocols as needed. - interfaceProtocol = [1, 2]; - // Interface number. You can enter multiple interface numbers as needed. - interfaceNumber = [2, 3]; - } - } + ```cpp + notify = (struct UsbCdcNotification *)req->buf; + ... + if (memcpy_s((void *)(notify + 1), length, data, length) != EOK) { + return HDF_FAILURE; } -} + ret = UsbFnSubmitRequestAsync(req); // Send data asynchronously. + ``` + +### Development Example +The following example helps you better understand the development of the USB serial port driver. + +#### Developing Driver Using Host DDK APIs + +```cpp #include "usb_serial.h" #include "hdf_base.h" #include "hdf_log.h" @@ -231,53 +459,52 @@ root { #define HDF_LOG_TAG USB_HOST_ACM #define STR_LEN 512 -static struct UsbRequest *g_syncRequest = NULL; +static struct UsbRequest *g_syncRequest = NULL; // Define a USB request. static struct UsbRequest *g_ctrlCmdRequest = NULL; static bool g_acmReleaseFlag = false; static uint8_t *g_acmReadBuffer = NULL; ... -static int SerialCtrlMsg(struct AcmDevice *acm, uint8_t request, +static int32_t SerialCtrlMsg(struct AcmDevice *acm, uint8_t request, uint16_t value, void *buf, uint16_t len) { - int ret; + int32_t ret; uint16_t index = acm->intPipe->interfaceId; struct UsbControlParams controlParams; - struct UsbRequestParams params; + struct UsbRequestParams params; // Define a UsbRequestParams object. if (acm == NULL || buf == NULL) { - HDF_LOGE("%s:invalid param", __func__); return HDF_ERR_IO; } if (acm->ctrlReq == NULL) { + // Pre-allocate the IO Request object to be sent to UsbInterfaceHandle. acm->ctrlReq = UsbAllocRequest(acm->ctrDevHandle, 0, len); if (acm->ctrlReq == NULL) { - HDF_LOGE("%s: UsbAllocRequest failed", __func__); return HDF_ERR_IO; } } controlParams.request = request; - controlParams.target = USB_REQUEST_TARGET_INTERFACE; - controlParams.reqType = USB_REQUEST_TYPE_CLASS; - controlParams.direction = USB_REQUEST_DIR_TO_DEVICE; + controlParams.target = USB_REQUEST_TARGET_INTERFACE; // Interface object + controlParams.reqType = USB_REQUEST_TYPE_CLASS; // Request type + controlParams.direction = USB_REQUEST_DIR_TO_DEVICE; // Data transfer from the host to the device controlParams.value = value; controlParams.index = index; controlParams.data = buf; controlParams.size = len; - params.interfaceId = USB_CTRL_INTERFACE_ID; + params.interfaceId = USB_CTRL_INTERFACE_ID; // Define the default ID of the USB control interface. params.pipeAddress = acm->ctrPipe->pipeAddress; params.pipeId = acm->ctrPipe->pipeId; - params.requestType = USB_REQUEST_PARAMS_CTRL_TYPE; - params.timeout = USB_CTRL_SET_TIMEOUT; + params.requestType = USB_REQUEST_PARAMS_CTRL_TYPE; // Control type. + params.timeout = USB_CTRL_SET_TIMEOUT; // Set the timeout interval. params.ctrlReq = UsbControlSetUp(&controlParams); + // Fill in the pre-allocated I/O request based on UsbRequestParams. ret = UsbFillRequest(acm->ctrlReq, acm->ctrDevHandle, ¶ms); - if (HDF_SUCCESS != ret) { - HDF_LOGE("%s: failed, ret=%d ", __func__, ret); + if (ret != HDF_SUCCESS) { return ret; } - ret = UsbSubmitRequestSync(acm->ctrlReq); // Send an I/O request synchronously. - if (HDF_SUCCESS != ret) { - HDF_LOGE("UsbSubmitRequestSync failed, ret=%d ", ret); + // Send an I/O request synchronously. + ret = UsbSubmitRequestSync(acm->ctrlReq); + if (ret != HDF_SUCCESS) { return ret; } if (!acm->ctrlReq->compInfo.status) { @@ -290,8 +517,8 @@ static struct UsbInterface *GetUsbInterfaceById(const struct AcmDevice *acm, uint8_t interfaceIndex) { struct UsbInterface *tmpIf = NULL; - tmpIf = (struct UsbInterface *)UsbClaimInterface(acm->session, acm->busNum, - acm->devAddr, interfaceIndex); // Obtain the UsbInterface object. + // Obtain a UsbInterface object. + tmpIf = (struct UsbInterface *)UsbClaimInterface(acm->session, acm->busNum, acm->devAddr, interfaceIndex); return tmpIf; } ... @@ -299,9 +526,9 @@ static struct UsbPipeInfo *EnumePipe(const struct AcmDevice *acm, uint8_t interfaceIndex, UsbPipeType pipeType, UsbPipeDirection pipeDirection) { uint8_t i; - int ret; - struct UsbInterfaceInfo *info = NULL; - UsbInterfaceHandle *interfaceHandle = NULL; + int32_t ret; + struct UsbInterfaceInfo *info = NULL; // Define a UsbInterfaceInfo object. + UsbInterfaceHandle *interfaceHandle = NULL; // Define a USB interface operation handle (that is, the void * type). if (pipeType == USB_PIPE_TYPE_CONTROL) { info = &acm->ctrIface->info; @@ -310,19 +537,20 @@ static struct UsbPipeInfo *EnumePipe(const struct AcmDevice *acm, else { info = &acm->iface[interfaceIndex]->info; + // Obtain the device handle based on interfaceIndex. interfaceHandle = InterfaceIdToHandle(acm, info->interfaceIndex); } for (i = 0; i <= info->pipeNum; i++) { struct UsbPipeInfo p; - ret = UsbGetPipeInfo(interfaceHandle, info->curAltSetting, i, &p);// Obtain information about the pipe with index i. + // Obtain the pipeInfo object whose index is i. + ret = UsbGetPipeInfo(interfaceHandle, info->curAltSetting, i, &p); if (ret < 0) { continue; } if ((p.pipeDirection == pipeDirection) && (p.pipeType == pipeType)) { - struct UsbPipeInfo *pi = OsalMemCalloc(sizeof(*pi)); + struct UsbPipeInfo *pi = OsalMemCalloc(sizeof(*pi)); // Allocate and initialize the memory. if (pi == NULL) { - HDF_LOGE("%s: Alloc pipe failed", __func__); return NULL; } p.interfaceId = info->interfaceIndex; @@ -338,7 +566,6 @@ static struct UsbPipeInfo *GetPipe(const struct AcmDevice *acm, { uint8_t i; if (acm == NULL) { - HDF_LOGE("%s: invalid params", __func__); return NULL; } for (i = 0; i < acm->interfaceCnt; i++) { @@ -346,6 +573,7 @@ static struct UsbPipeInfo *GetPipe(const struct AcmDevice *acm, if (!acm->iface[i]) { continue; } + // Obtain pipe information of the control pipe. p = EnumePipe(acm, i, pipeType, pipeDirection); if (p == NULL) { continue; @@ -362,40 +590,32 @@ static int32_t UsbSerialDriverBind(struct HdfDeviceObject *device) errno_t err; struct AcmDevice *acm = NULL; if (device == NULL) { - HDF_LOGE("%s: device is null", __func__); return HDF_ERR_INVALID_OBJECT; } acm = (struct AcmDevice *)OsalMemCalloc(sizeof(*acm)); if (acm == NULL) { - HDF_LOGE("%s: Alloc usb serial device failed", __func__); return HDF_FAILURE; } + // Initialize the mutex. &acm->lock indicates the pointer pointing to the mutex. if (OsalMutexInit(&acm->lock) != HDF_SUCCESS) { - HDF_LOGE("%s:%d OsalMutexInit failed", __func__, __LINE__); goto error; } info = (struct UsbPnpNotifyServiceInfo *)device->priv; if (info != NULL) { - HDF_LOGD("%s:%d busNum=%d,devAddr=%d,interfaceLength=%d", - __func__, __LINE__, info->busNum, info->devNum, info->interfaceLength); acm->busNum = info->busNum; acm->devAddr = info->devNum; acm->interfaceCnt = info->interfaceLength; err = memcpy_s((void *)(acm->interfaceIndex), USB_MAX_INTERFACES, (const void*)info->interfaceNumber, info->interfaceLength); if (err != EOK) { - HDF_LOGE("%s:%d memcpy_s failed err=%d", - __func__, __LINE__, err); goto lock_error; } } else { - HDF_LOGE("%s:%d info is NULL!", __func__, __LINE__); goto lock_error; } acm->device = device; device->service = &(acm->service); acm->device->service->Dispatch = UsbSerialDeviceDispatch; - HDF_LOGD("UsbSerialDriverBind=========================OK"); return HDF_SUCCESS; lock_error: @@ -408,14 +628,14 @@ error: return HDF_FAILURE; } ... -static int AcmAllocReadRequests(struct AcmDevice *acm) +static int32_t AcmAllocReadRequests(struct AcmDevice *acm) { - int ret; + int32_t ret; struct UsbRequestParams readParams; - for (int i = 0; i < ACM_NR; i++) { - acm->readReq[i] = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), 0, acm->readSize); // Allocate the readReq I/O request to be sent. + for (int32_t i = 0; i < ACM_NR; i++) { + // Allocate the readReq I/O request to be sent. + acm->readReq[i] = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), 0, acm->readSize); if (!acm->readReq[i]) { - HDF_LOGE("readReq request failed"); goto error; } readParams.userData = (void *)acm; @@ -423,14 +643,14 @@ static int AcmAllocReadRequests(struct AcmDevice *acm) readParams.pipeId = acm->dataInPipe->pipeId; readParams.interfaceId = acm->dataInPipe->interfaceId; readParams.callback = AcmReadBulk; - readParams.requestType = USB_REQUEST_PARAMS_DATA_TYPE; + readParams.requestType = USB_REQUEST_PARAMS_DATA_TYPE; /* Data type */ readParams.timeout = USB_CTRL_SET_TIMEOUT; readParams.dataReq.numIsoPackets = 0; readParams.dataReq.direction = (acm->dataInPipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & 0x1; readParams.dataReq.length = acm->readSize; - ret = UsbFillRequest(acm->readReq[i], InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), &readParams); // Fills in the readReq object to be sent. - if (HDF_SUCCESS != ret) { - HDF_LOGE("%s: UsbFillRequest failed, ret=%d n", __func__, ret); + // Fill in the readReq IO Request object to be sent based on readParams. + ret = UsbFillRequest(acm->readReq[i], InterfaceIdToHandle(acm, acm->dataInPipe->interfaceId), &readParams); + if (ret != HDF_SUCCESS) { goto error; } } @@ -441,13 +661,13 @@ error: return HDF_ERR_MALLOC_FAIL; } -static int AcmAllocNotifyRequest(struct AcmDevice *acm) +static int32_t AcmAllocNotifyRequest(struct AcmDevice *acm) { - int ret; + int32_t ret; struct UsbRequestParams intParams = {}; - acm->notifyReq = UsbAllocRequest(InterfaceIdToHandle(acm, acm->intPipe->interfaceId), 0, acm->intSize); // Allocate the interrupt I/O request object to be sent. + // Allocate the interrupt I/O request to be sent. + acm->notifyReq = UsbAllocRequest(InterfaceIdToHandle(acm, acm->intPipe->interfaceId), 0, acm->intSize); if (!acm->notifyReq) { - HDF_LOGE("notifyReq request failed"); return HDF_ERR_MALLOC_FAIL; } intParams.userData = (void *)acm; @@ -460,9 +680,9 @@ static int AcmAllocNotifyRequest(struct AcmDevice *acm) intParams.dataReq.numIsoPackets = 0; intParams.dataReq.direction = (acm->intPipe->pipeDirection >> USB_PIPE_DIR_OFFSET) & DIRECTION_MASK; intParams.dataReq.length = acm->intSize; - ret = UsbFillRequest(acm->notifyReq, InterfaceIdToHandle(acm, acm->intPipe->interfaceId), &intParams); // Fill in the interrupt I/O request. - if (HDF_SUCCESS != ret) { - HDF_LOGE("%s: UsbFillRequest failed, ret=%d n", __func__, ret); + // Fill in the interrupt I/O request. + ret = UsbFillRequest(acm->notifyReq, InterfaceIdToHandle(acm, acm->intPipe->interfaceId), &intParams); + if (ret != HDF_SUCCESS) { goto error; } return HDF_SUCCESS; @@ -474,8 +694,9 @@ error: static void AcmReleaseInterfaces(struct AcmDevice *acm) { - for (int i = 0; i < acm->interfaceCnt; i++) { + for (int32_t i = 0; i < acm->interfaceCnt; i++) { if (acm->iface[i]) { + // Release a USB interface object. UsbReleaseInterface(acm->iface[i]); acm->iface[i] = NULL; } @@ -488,31 +709,33 @@ static void AcmReleaseInterfaces(struct AcmDevice *acm) static int32_t AcmClaimInterfaces(struct AcmDevice *acm) { - for (int i = 0; i < acm->interfaceCnt; i++) { - acm->iface[i] = GetUsbInterfaceById((const struct AcmDevice *)acm, acm->interfaceIndex[i]); // Obtain the UsbInterface object. + for (int32_t i = 0; i < acm->interfaceCnt; i++) { + // Obtain a UsbInterface object. + acm->iface[i] = GetUsbInterfaceById((const struct AcmDevice *)acm, acm->interfaceIndex[i]); if (acm->iface[i] == NULL) { - HDF_LOGE("%s: interface%d is null", __func__, acm->interfaceIndex[i]); goto error; } } - acm->ctrIface = GetUsbInterfaceById((const struct AcmDevice *)acm, USB_CTRL_INTERFACE_ID); // Obtain the UsbInterface object corresponding to the control interface. + // Obtain the UsbInterface object corresponding to the control interface. + acm->ctrIface = GetUsbInterfaceById((const struct AcmDevice *)acm, USB_CTRL_INTERFACE_ID); if (acm->ctrIface == NULL) { - HDF_LOGE("%s: GetUsbInterfaceById null", __func__); goto error; } return HDF_SUCCESS; error: + // Release the UsbInterface object cyclically based on acm->interfaceCnt. AcmReleaseInterfaces(acm); return HDF_FAILURE; } static void AcmCloseInterfaces(struct AcmDevice *acm) { - for (int i = 0; i < acm->interfaceCnt; i++) { + for (int32_t i = 0; i < acm->interfaceCnt; i++) { if (acm->devHandle[i]) { + // Close a USB device object. UsbCloseInterface(acm->devHandle[i]); acm->devHandle[i] = NULL; } @@ -525,51 +748,51 @@ static void AcmCloseInterfaces(struct AcmDevice *acm) static int32_t AcmOpenInterfaces(struct AcmDevice *acm) { - for (int i = 0; i < acm->interfaceCnt; i++) { + for (int32_t i = 0; i < acm->interfaceCnt; i++) { if (acm->iface[i]) { - acm->devHandle[i] = UsbOpenInterface(acm->iface[i]); // Open the UsbInterface object obtained. + // Open the UsbInterface object obtained. + acm->devHandle[i] = UsbOpenInterface(acm->iface[i]); if (acm->devHandle[i] == NULL) { - HDF_LOGE("%s: UsbOpenInterface null", __func__); goto error; } } } acm->ctrDevHandle = UsbOpenInterface(acm->ctrIface); if (acm->ctrDevHandle == NULL) { - HDF_LOGE("%s: ctrDevHandle UsbOpenInterface null", __func__); goto error; } return HDF_SUCCESS; error: + // Disable all UsbInterface objects. AcmCloseInterfaces(acm); return HDF_FAILURE; } static int32_t AcmGetPipes(struct AcmDevice *acm) { - acm->dataInPipe = GetPipe(acm, USB_PIPE_TYPE_BULK, USB_PIPE_DIRECTION_IN);// Obtain pipe information of dataInPipe. + // Obtain pipe information of dataInPipe. + acm->dataInPipe = GetPipe(acm, USB_PIPE_TYPE_BULK, USB_PIPE_DIRECTION_IN); if (acm->dataInPipe == NULL) { - HDF_LOGE("dataInPipe is NULL"); goto error; } - acm->dataOutPipe = GetPipe(acm, USB_PIPE_TYPE_BULK, USB_PIPE_DIRECTION_OUT); // Obtain pipe information of dataOutPipe. + // Obtain pipe information of dataOutPipe. + acm->dataOutPipe = GetPipe(acm, USB_PIPE_TYPE_BULK, USB_PIPE_DIRECTION_OUT); if (acm->dataOutPipe == NULL) { - HDF_LOGE("dataOutPipe is NULL"); goto error; } - acm->ctrPipe = EnumePipe(acm, acm->ctrIface->info.interfaceIndex, USB_PIPE_TYPE_CONTROL, USB_PIPE_DIRECTION_OUT); // Obtain pipe information of the control pipe. + // Obtain pipe information of the control pipe. + acm->ctrPipe = EnumePipe(acm, acm->ctrIface->info.interfaceIndex, USB_PIPE_TYPE_CONTROL, USB_PIPE_DIRECTION_OUT); if (acm->ctrPipe == NULL) { - HDF_LOGE("ctrPipe is NULL"); goto error; } - acm->intPipe = GetPipe(acm, USB_PIPE_TYPE_INTERRUPT, USB_PIPE_DIRECTION_IN); // Obtain pipe information of the interrupt pipe. + //Obtain pipe information of the interrupt pipe. + acm->intPipe = GetPipe(acm, USB_PIPE_TYPE_INTERRUPT, USB_PIPE_DIRECTION_IN); if (acm->intPipe == NULL) { - HDF_LOGE("intPipe is NULL"); goto error; } @@ -577,10 +800,10 @@ static int32_t AcmGetPipes(struct AcmDevice *acm) acm->writeSize = acm->dataOutPipe->maxPacketSize; acm->ctrlSize = acm->ctrPipe->maxPacketSize; acm->intSize = acm->intPipe->maxPacketSize; - return HDF_SUCCESS; error: + // Release all pipe information on the device. AcmFreePipes(acm); return HDF_FAILURE; } @@ -602,29 +825,26 @@ static int32_t AcmAllocRequests(struct AcmDevice *acm) int32_t ret; if (AcmWriteBufAlloc(acm) < 0) { - HDF_LOGE("%s: AcmWriteBufAlloc failed", __func__); return HDF_ERR_MALLOC_FAIL; } - for (int i = 0; i < ACM_NW; i++) { + for (int32_t i = 0; i < ACM_NW; i++) { struct AcmWb *snd = &(acm->wb[i]); - snd->request = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataOutPipe->interfaceId), 0, acm->writeSize); // Allocate the I/O request object to be sent. + // Allocate the I/O request to be sent. + snd->request = UsbAllocRequest(InterfaceIdToHandle(acm, acm->dataOutPipe->interfaceId), 0, acm->writeSize); snd->instance = acm; if (snd->request == NULL) { - HDF_LOGE("%s:%d snd request failed", __func__, __LINE__); goto error_alloc_write_req; } } - ret = AcmAllocNotifyRequest(acm); // Allocate and fill in the interrupt I/O request object. + ret = AcmAllocNotifyRequest(acm); // Allocate and fill in the interrupt I/O request. if (ret != HDF_SUCCESS) { - HDF_LOGE("%s:%d AcmAllocNotifyRequest failed", __func__, __LINE__); goto error_alloc_int_req; } - ret = AcmAllocReadRequests(acm); // Allocate and fill in the readReq I/O request object. + ret = AcmAllocReadRequests(acm); // Allocate and fill in the readReq I/O request. if (ret) { - HDF_LOGE("%s:%d AcmAllocReadRequests failed", __func__, __LINE__); goto error_alloc_read_req; } @@ -645,57 +865,56 @@ static int32_t AcmInit(struct AcmDevice *acm) struct UsbSession *session = NULL; if (acm->initFlag == true) { - HDF_LOGE("%s:%d: initFlag is true", __func__, __LINE__); return HDF_SUCCESS; } - ret = UsbInitHostSdk(NULL); // Initialize the Host DDK. + // Initialize the USB Host DDK. + ret = UsbInitHostSdk(NULL); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: UsbInitHostSdk failed", __func__); return HDF_ERR_IO; } acm->session = session; + // Obtain UsbInterface objects based on acm->interfaceIndex[i]. ret = AcmClaimInterfaces(acm); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AcmClaimInterfaces failed", __func__); goto error_claim_interfaces; } + // Open UsbInterface objects based on acm->iface[i]. ret = AcmOpenInterfaces(acm); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AcmOpenInterfaces failed", __func__); goto error_open_interfaces; } + // Obtain the pointer to the pipe information. ret = AcmGetPipes(acm); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AcmGetPipes failed", __func__); goto error_get_pipes; } ret = AcmAllocRequests(acm); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: AcmAllocRequests failed", __func__); goto error_alloc_reqs; } - acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); - acm->lineCoding.bCharFormat = CHARFORMAT; + acm->lineCoding.dwDTERate = CpuToLe32(DATARATE); // Convert to little-endian data. + acm->lineCoding.bCharFormat = CHARFORMAT; // 8 acm->lineCoding.bParityType = USB_CDC_NO_PARITY; acm->lineCoding.bDataBits = USB_CDC_1_STOP_BITS; acm->initFlag = true; - - HDF_LOGD("%s:%d========OK", __func__, __LINE__); return HDF_SUCCESS; error_alloc_reqs: AcmFreePipes(acm); error_get_pipes: + // Disable all UsbInterface objects. AcmCloseInterfaces(acm); error_open_interfaces: + // Release all UsbInterface objects. AcmReleaseInterfaces(acm); error_claim_interfaces: + // Exit the USB DDK on the host. acm->session indicates the pointer pointing to the session context. UsbExitHostSdk(acm->session); acm->session = NULL; return ret; @@ -704,7 +923,6 @@ error_claim_interfaces: static void AcmRelease(struct AcmDevice *acm) { if (acm->initFlag == false) { - HDF_LOGE("%s:%d: initFlag is false", __func__, __LINE__); return; } @@ -712,9 +930,9 @@ static void AcmRelease(struct AcmDevice *acm) AcmFreePipes(acm); AcmCloseInterfaces(acm); AcmReleaseInterfaces(acm); + // Exit the USB DDK on the host. UsbExitHostSdk(acm->session); acm->session = NULL; - acm->initFlag = false; } @@ -724,15 +942,15 @@ static int32_t UsbSerialDriverInit(struct HdfDeviceObject *device) struct AcmDevice *acm = NULL; if (device == NULL) { - HDF_LOGE("%s: device is null", __func__); return HDF_ERR_INVALID_OBJECT; } acm = (struct AcmDevice *)device->service; + // Initialize the mutex. &acm->readLock indicates the pointer pointing to the mutex. OsalMutexInit(&acm->readLock); OsalMutexInit(&acm->writeLock); - HDF_LOGD("%s:%d busNum=%d,devAddr=%d", - __func__, __LINE__, acm->busNum, acm->devAddr); + HDF_LOGD("%s:%d busNum=%d,devAddr=%d", __func__, __LINE__, acm->busNum, acm->devAddr); + // Allocate space for the USB serial port device information and assign a value. ret = UsbSerialDeviceAlloc(acm); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: Serial Device alloc failed", __func__); @@ -740,9 +958,6 @@ static int32_t UsbSerialDriverInit(struct HdfDeviceObject *device) acm->initFlag = false; g_acmReleaseFlag = false; - - HDF_LOGD("%s:%d init ok!", __func__, __LINE__); - return ret; } @@ -751,30 +966,29 @@ static void UsbSerialDriverRelease(struct HdfDeviceObject *device) struct AcmDevice *acm = NULL; if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); return; } acm = (struct AcmDevice *)device->service; if (acm == NULL) { - HDF_LOGE("%s: acm is null", __func__); return; } g_acmReleaseFlag = true; if (acm->initFlag == true) { - HDF_LOGE("%s:%d AcmRelease", __func__, __LINE__); AcmRelease(acm); } + // Release the USB serial port device information. UsbSeriaDevicelFree(acm); + // Release the mutex. OsalMutexDestroy(&acm->writeLock); OsalMutexDestroy(&acm->readLock); OsalMutexDestroy(&acm->lock); OsalMemFree(acm); acm = NULL; - HDF_LOGD("%s:%d exit", __func__, __LINE__); } +// Perform Bind, Init, and Release operations on the driver. struct HdfDriverEntry g_usbSerialDriverEntry = { .moduleVersion = 1, .moduleName = "usbhost_acm", // Driver module name, which must be the same as that configured in the .hcs file. @@ -782,14 +996,12 @@ struct HdfDriverEntry g_usbSerialDriverEntry = { .Init = UsbSerialDriverInit, .Release = UsbSerialDriverRelease, }; -HDF_INIT(g_usbSerialDriverEntry); +HDF_INIT(g_usbSerialDriverEntry); // Driver entry. ``` +#### Developing Driver Using Host Raw APIs -### Developing Driver Using Host Raw APIs - - -``` +```cpp root { module = "usb_pnp_device"; usb_pnp_config { @@ -836,7 +1048,9 @@ root { } } } +``` +```cpp #include "usb_serial_rawapi.h" #include #include "osal_mem.h" @@ -846,7 +1060,7 @@ root { #include "hdf_log.h" #include "hdf_usb_pnp_manage.h" -#define HDF_LOG_TAG USB_HOST_ACM_RAW_API +#define HDF_LOG_TAG USB_HOST_ACM_RAW_API // Labels that can be queried in logs. #define USB_CTRL_REQ_SIZE 64 #define USB_IO_THREAD_STACK_SIZE 8192 #define USB_RAW_IO_SLEEP_MS_TIME 100 @@ -858,51 +1072,46 @@ struct OsalMutex g_stopIoLock; static bool g_rawAcmReleaseFlag = false; ...... -static int UsbGetConfigDescriptor(UsbRawHandle *devHandle, struct UsbRawConfigDescriptor **config) +static int32_t UsbGetConfigDescriptor(UsbRawHandle *devHandle, struct UsbRawConfigDescriptor **config) { UsbRawDevice *dev = NULL; - int activeConfig; - int ret; + int32_t activeConfig; + int32_t ret; if (devHandle == NULL) { - HDF_LOGE("%s:%d devHandle is NULL", - __func__, __LINE__); return HDF_ERR_INVALID_PARAM; } + // Obtain the configuration of the active device. ret = UsbRawGetConfiguration(devHandle, &activeConfig); - if (ret) { - HDF_LOGE("%s:%d UsbRawGetConfiguration failed, ret=%d", - __func__, __LINE__, ret); + if (ret != HDF_SUCCESS) { return HDF_FAILURE; } - HDF_LOGE("%s:%d activeConfig=%d", __func__, __LINE__, activeConfig); + + // Obtain the device pointer based on the specified device handle. dev = UsbRawGetDevice(devHandle); if (dev == NULL) { - HDF_LOGE("%s:%d UsbRawGetDevice failed", - __func__, __LINE__); return HDF_FAILURE; } + // Obtain the device configuration descriptor based on the specified device ID. ret = UsbRawGetConfigDescriptor(dev, activeConfig, config); - if (ret) { - HDF_LOGE("UsbRawGetConfigDescriptor failed, ret=%dn", ret); - return HDF_FAILURE; + if (ret != HDF_SUCCESS) { + HDF_LOGE("UsbRawGetConfigDescriptor failed, ret=%d\n", ret); } - - return HDF_SUCCESS; + return ret; } ... -static int UsbAllocWriteRequests(struct AcmDevice *acm) +static int32_t UsbAllocWriteRequests(struct AcmDevice *acm) { - int i; + int32_t i; for (i = 0; i < ACM_NW; i++) { struct AcmWb *snd = &acm->wb[i]; + // Allocate a transfer request with the specified number of sync packet descriptors. snd->request = UsbRawAllocRequest(acm->devHandle, 0, acm->dataOutEp->maxPacketSize); snd->instance = acm; if (snd->request == NULL) { - HDF_LOGE("%s: UsbRawAllocRequest failed", __func__); return HDF_ERR_MALLOC_FAIL; } } @@ -918,17 +1127,14 @@ static int32_t UsbSerialDriverBind(struct HdfDeviceObject *device) errno_t err; if (device == NULL) { - HDF_LOGE("%s: device is null", __func__); return HDF_ERR_INVALID_OBJECT; } acm = (struct AcmDevice *)OsalMemCalloc(sizeof(*acm)); if (acm == NULL) { - HDF_LOGE("%s: Alloc usb serial device failed", __func__); return HDF_FAILURE; } if (OsalMutexInit(&acm->lock) != HDF_SUCCESS) { - HDF_LOGE("%s:%d OsalMutexInit failed", __func__, __LINE__); goto error; } @@ -940,19 +1146,15 @@ static int32_t UsbSerialDriverBind(struct HdfDeviceObject *device) err = memcpy_s((void *)(acm->interfaceIndex), USB_MAX_INTERFACES, (const void*)info->interfaceNumber, info->interfaceLength); if (err != EOK) { - HDF_LOGE("%s:%d memcpy_s failed err=%d", - __func__, __LINE__, err); goto lock_error; } } else { - HDF_LOGE("%s:%d info is NULL!", __func__, __LINE__); goto lock_error; } device->service = &(acm->service); device->service->Dispatch = UsbSerialDeviceDispatch; acm->device = device; - HDF_LOGD("UsbSerialDriverBind=========================OK"); return HDF_SUCCESS; lock_error: @@ -965,16 +1167,16 @@ error: return HDF_FAILURE; } ... -static int UsbAllocReadRequests(struct AcmDevice *acm) +static int32_t UsbAllocReadRequests(struct AcmDevice *acm) { struct UsbRawFillRequestData reqData; - int size = acm->dataInEp->maxPacketSize; - int ret; + int32_t size = acm->dataInEp->maxPacketSize; + int32_t ret; - for (int i = 0; i < ACM_NR; i++) { + for (int32_t i = 0; i < ACM_NR; i++) { + // Allocate a transfer request with the specified number of sync packet descriptors. acm->readReq[i] = UsbRawAllocRequest(acm->devHandle, 0, size); if (!acm->readReq[i]) { - HDF_LOGE("readReq request failed"); return HDF_ERR_MALLOC_FAIL; } @@ -985,10 +1187,9 @@ static int UsbAllocReadRequests(struct AcmDevice *acm) reqData.timeout = USB_CTRL_SET_TIMEOUT; reqData.length = size; + // Fill the required information in the bulk transfer request. ret = UsbRawFillBulkRequest(acm->readReq[i], acm->devHandle, &reqData); - if (ret) { - HDF_LOGE("%s: FillBulkRequest failed, ret=%d n", - __func__, ret); + if (ret != HDF_SUCCESS) { return HDF_FAILURE; } } @@ -996,15 +1197,15 @@ static int UsbAllocReadRequests(struct AcmDevice *acm) return HDF_SUCCESS; } ... -static int UsbAllocNotifyRequest(struct AcmDevice *acm) +static int32_t UsbAllocNotifyRequest(struct AcmDevice *acm) { struct UsbRawFillRequestData fillRequestData; - int size = acm->notifyEp->maxPacketSize; - int ret; + int32_t size = acm->notifyEp->maxPacketSize; + int32_t ret; + // Allocate a transfer request with the specified number of sync packet descriptors. acm->notifyReq = UsbRawAllocRequest(acm->devHandle, 0, size); if (!acm->notifyReq) { - HDF_LOGE("notifyReq request failed"); return HDF_ERR_MALLOC_FAIL; } @@ -1015,9 +1216,9 @@ static int UsbAllocNotifyRequest(struct AcmDevice *acm) fillRequestData.userData = (void *)acm; fillRequestData.timeout = USB_CTRL_SET_TIMEOUT; + // Fill the required information in the interrupt transfer request. ret = UsbRawFillInterruptRequest(acm->notifyReq, acm->devHandle, &fillRequestData); - if (ret) { - HDF_LOGE("%s: FillInterruptRequest failed, ret=%d", __func__, ret); + if (ret != HDF_SUCCESS) { return HDF_FAILURE; } @@ -1031,62 +1232,55 @@ static int32_t UsbSerialInit(struct AcmDevice *acm) int32_t ret; if (acm->initFlag == true) { - HDF_LOGE("%s:%d: initFlag is true", __func__, __LINE__); return HDF_SUCCESS; } + // Initialize the USB DDK in expert mode. ret = UsbRawInit(NULL); - if (ret) { - HDF_LOGE("%s:%d UsbRawInit failed", __func__, __LINE__); + if (ret != HDF_SUCCESS) { return HDF_ERR_IO; } acm->session = session; + // Open a USB device object. devHandle = UsbRawOpenDevice(session, acm->busNum, acm->devAddr); if (devHandle == NULL) { - HDF_LOGE("%s:%d UsbRawOpenDevice failed", __func__, __LINE__); ret = HDF_FAILURE; goto err_open_device; } acm->devHandle = devHandle; + // Obtain the configuration of the active device, device pointer, and configuration descriptor. ret = UsbGetConfigDescriptor(devHandle, &acm->config); - if (ret) { - HDF_LOGE("%s:%d UsbGetConfigDescriptor failed", __func__, __LINE__); + if (ret != HDF_SUCCESS) { ret = HDF_FAILURE; goto err_get_desc; } ret = UsbParseConfigDescriptor(acm, acm->config); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s:%d UsbParseConfigDescriptor failed", __func__, __LINE__); ret = HDF_FAILURE; goto err_parse_desc; } ret = AcmWriteBufAlloc(acm); if (ret < 0) { - HDF_LOGE("%s:%d AcmWriteBufAlloc failed", __func__, __LINE__); ret = HDF_FAILURE; goto err_alloc_write_buf; } ret = UsbAllocWriteRequests(acm); if (ret < 0) { - HDF_LOGE("%s:%d UsbAllocWriteRequests failed", __func__, __LINE__); ret = HDF_FAILURE; goto err_alloc_write_reqs; } ret = UsbAllocNotifyRequest(acm); if (ret) { - HDF_LOGE("%s:%d UsbAllocNotifyRequests failed", __func__, __LINE__); goto err_alloc_notify_req; } ret = UsbAllocReadRequests(acm); if (ret) { - HDF_LOGE("%s:%d UsbAllocReadRequests failed", __func__, __LINE__); goto err_alloc_read_reqs; } ret = UsbStartIo(acm); if (ret) { - HDF_LOGE("%s:%d UsbAllocReadRequests failed", __func__, __LINE__); goto err_start_io; } @@ -1097,18 +1291,14 @@ static int32_t UsbSerialInit(struct AcmDevice *acm) ret = UsbRawSubmitRequest(acm->notifyReq); if (ret) { - HDF_LOGE("%s:%d UsbRawSubmitRequest failed", __func__, __LINE__); goto err_submit_req; } acm->initFlag = true; - - HDF_LOGD("%s:%d=========================OK", __func__, __LINE__); - return HDF_SUCCESS; err_submit_req: - UsbStopIo(acm); + UsbStopIo(acm); // Stop the I/O thread and release all resources. err_start_io: UsbFreeReadRequests(acm); err_alloc_read_reqs: @@ -1123,9 +1313,9 @@ err_parse_desc: UsbRawFreeConfigDescriptor(acm->config); acm->config = NULL; err_get_desc: - (void)UsbRawCloseDevice(devHandle); + (void)UsbRawCloseDevice(devHandle); // Close the USB device object. err_open_device: - UsbRawExit(acm->session); + UsbRawExit(acm->session); // Exit the expert mode of the USB DDK. return ret; } @@ -1133,7 +1323,6 @@ err_open_device: static void UsbSerialRelease(struct AcmDevice *acm) { if (acm->initFlag == false) { - HDF_LOGE("%s:%d: initFlag is false", __func__, __LINE__); return; } @@ -1151,6 +1340,7 @@ static void UsbSerialRelease(struct AcmDevice *acm) UsbReleaseInterfaces(acm); UsbRawFreeConfigDescriptor(acm->config); acm->config = NULL; + // Exit the expert mode of the USB DDK. UsbRawExit(acm->session); acm->initFlag = false; @@ -1162,7 +1352,6 @@ static int32_t UsbSerialDriverInit(struct HdfDeviceObject *device) int32_t ret; if (device == NULL) { - HDF_LOGE("%s:%d device is null", __func__, __LINE__); return HDF_ERR_INVALID_OBJECT; } acm = (struct AcmDevice *)device->service; @@ -1176,9 +1365,6 @@ static int32_t UsbSerialDriverInit(struct HdfDeviceObject *device) acm->initFlag = false; g_rawAcmReleaseFlag = false; - - HDF_LOGD("%s:%d init ok!", __func__, __LINE__); - return ret; } @@ -1186,20 +1372,17 @@ static void UsbSerialDriverRelease(struct HdfDeviceObject *device) { struct AcmDevice *acm = NULL; if (device == NULL) { - HDF_LOGE("%s: device is NULL", __func__); return; } acm = (struct AcmDevice *)device->service; if (acm == NULL) { - HDF_LOGE("%s: acm is null", __func__); return; } g_rawAcmReleaseFlag = true; if (acm->initFlag == true) { - HDF_LOGE("%s:%d UsbSerialRelease", __func__, __LINE__); UsbSerialRelease(acm); } UsbSeriaDevicelFree(acm); @@ -1208,12 +1391,11 @@ static void UsbSerialDriverRelease(struct HdfDeviceObject *device) OsalMutexDestroy(&acm->lock); OsalMemFree(acm); acm = NULL; - HDF_LOGD("%s:%d exit", __func__, __LINE__); } struct HdfDriverEntry g_usbSerialRawDriverEntry = { .moduleVersion = 1, - ..moduleName = "usbhost_acm_rawapi", // Driver module name, which must be the same as that configured in the .hcs file. + .moduleName = "usbhost_acm_rawapi", // Driver module name, which must be the same as that configured in the .hcs file. .Bind = UsbSerialDriverBind, .Init = UsbSerialDriverInit, .Release = UsbSerialDriverRelease, @@ -1221,100 +1403,133 @@ struct HdfDriverEntry g_usbSerialRawDriverEntry = { HDF_INIT(g_usbSerialRawDriverEntry); ``` +#### Developing Driver Using Device DDK APIs -### Developing Driver Using Device DDK APIs +The core code of the USB ACM device is stored in **drivers\peripheral\usb\gadget\function\acm\cdcacm.c**. The following sample code implements driver development by using the Device DDK APIs. To develop a driver, you must create a device based on the descriptor, obtain the interface, open the interface to obtain the pipe information, receive events, and then perform USB communication (such as read and write). When the device is uninstalled, you need to close the interface, stop receiving events, and remove the device. -The core code of the USB Abstract Control Model (ACM) device is available in **drivers\peripheral\usb\gadget\function\acm\cdcacm.c**. The following is an example. +1. Create a USB device. - -``` -1. Create a device. -static int32_t AcmCreateFuncDevice(struct UsbAcmDevice *acm, - struct DeviceResourceIface *iface) -{ - struct UsbFnDevice *fnDev = NULL; -struct UsbFnDescriptorData descData; -uint8_t useHcs; - ... -if (useHcs == 0) { - descData.type = USBFN_DESC_DATA_TYPE_DESC; - descData.descriptor = &g_masterFuncDevice; -} else { - descData.type = USBFN_DESC_DATA_TYPE_PROP; - descData.property = device->property; -} -/* Create a device. */ - fnDev = (struct UsbFnDevice *)UsbFnDeviceCreate(acm->udcName, &descData); - if (fnDev == NULL) { - HDF_LOGE("%s: create usb function device failed", __func__); - return HDF_FAILURE; - } - ... -} -2. Obtain an interface and open the interface for pipe information. -static int32_t AcmParseEachPipe(struct UsbAcmDevice *acm, struct UsbAcmInterface *iface) -{ - ... - for (i = 0; i < fnIface->info.numPipes; i++) { - struct UsbFnPipeInfo pipeInfo; -/* Obtain pipe information. */ - ret = UsbFnInterfaceGetPipeInfo(fnIface, i, &pipeInfo); + ```cpp + static int32_t AcmCreateFuncDevice(struct UsbAcmDevice *acm, struct DeviceResourceIface *iface) + { + struct UsbFnDevice *fnDev = NULL; + struct UsbFnDescriptorData descData; + uint8_t useHcs; + ... + if (useHcs == 0) { // The descriptor is sourced from the code. + descData.type = USBFN_DESC_DATA_TYPE_DESC; + descData.descriptor = &g_masterFuncDevice; + } else {// The descriptor is sourced from the .hcs file. + descData.type = USBFN_DESC_DATA_TYPE_PROP; + descData.property = device->property; + } + /* Create a device. */ + fnDev = (struct UsbFnDevice *)UsbFnDeviceCreate(acm->udcName, &descData); + if (fnDev == NULL) { + return HDF_FAILURE; + } ... } - return HDF_SUCCESS; -} -/* Obtain the interface and open the interface to obtain the handle. */ -static int32_t AcmParseEachIface(struct UsbAcmDevice *acm, struct UsbFnDevice *fnDev) -{ - ... - for (i = 0; i < fnDev->numInterfaces; i++) { - /* Obtain an interface.*/ - fnIface = (struct UsbFnInterface *)UsbFnDeviceGetInterface(fnDev, i); + ``` + +2. Obtain an interface and open the interface to obtain the pipe information. + + ```cpp + static int32_t AcmParseEachPipe(struct UsbAcmDevice *acm, struct UsbAcmInterface *iface) + { ... - /* Open the interface. */ - handle = UsbFnInterfaceOpen(fnIface); + for (i = 0; i < fnIface->info.numPipes; i++) { + struct UsbFnPipeInfo pipeInfo; + /* Obtain pipe information. */ + ret = UsbFnInterfaceGetPipeInfo(fnIface, i, &pipeInfo); + ... + } + return HDF_SUCCESS; + } + /* Obtain an interface and open the interface to obtain the handle. */ + static int32_t AcmParseEachIface(struct UsbAcmDevice *acm, struct UsbFnDevice *fnDev) + { ... + for (i = 0; i < fnDev->numInterfaces; i++) { + /* Obtain an interface.*/ + fnIface = (struct UsbFnInterface *)UsbFnGetInterface(fnDev, i); + ... + /* Open the interface. */ + handle = UsbFnInterfaceOpen(fnIface); + ... + } + return HDF_SUCCESS; } - return HDF_SUCCESS; -} -3. Receive events. -static int32_t AcmAllocCtrlRequests(struct UsbAcmDevice *acm, int num) -{ - ... + ``` + +3. Receive events (EP0 control transfer). + + ```cpp + static int32_t AcmAllocCtrlRequests(struct UsbAcmDevice *acm, int32_t num) + { + ... req = UsbFnCtrlRequestAlloc(acm->ctrlIface.handle, sizeof(struct UsbCdcLineCoding) + sizeof(struct UsbCdcLineCoding)); - ... -} -static int32_t AcmDriverInit(struct HdfDeviceObject *device) -{ -... -/* Start to receive events.*/ - ret = UsbFnInterfaceStartRecvEvent(acm->ctrlIface.fn, 0xff, UsbAcmEventCallback, acm); - ... -} + ... + } + static int32_t AcmDriverInit(struct HdfDeviceObject *device) + { + ... + /* Start to receive events.*/ + ret = UsbFnInterfaceStartRecvEvent(acm->ctrlIface.fn, 0xff, UsbAcmEventCallback, acm); + ... + } + ``` + 4. Perform USB communication (read and write). -static int32_t AcmSendNotifyRequest(struct UsbAcmDevice *acm, uint8_t type, - uint16_t value, void *data, uint32_t length) -{ -... -/* Send an asynchronous request.*/ - ret = UsbFnRequestSubmitAsync(req); - ... -} -5. Close the interface, stop receiving events, and remove the device. -static int32_t AcmReleaseFuncDevice(struct UsbAcmDevice *acm) -{ -int32_t ret; -/* Close the interface. */ - (void)UsbFnInterfaceClose(acm->ctrlIface.handle); -(void)UsbFnInterfaceClose(acm->dataIface.handle); -/* Stop receiving events. */ -(void)UsbFnInterfaceStopRecvEvent(acm->ctrlIface.fn); -/* Remove the device. */ - ret = UsbFnDeviceRemove(acm->fnDev); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: remove usb function device failed", __func__); + + ```cpp + static int32_t AcmSendNotifyRequest(struct UsbAcmDevice *acm, uint8_t type, + uint16_t value, void *data, uint32_t length) + { + ... + /* Send an asynchronous request.*/ + ret = UsbFnRequestSubmitAsync(req); + ... } - return ret; -} -``` + ``` + +5. Close the interface, stop receiving events, and delete the device. + + ```cpp + static int32_t AcmReleaseFuncDevice(struct UsbAcmDevice *acm) + { + int32_t ret; + /* Close the interface. */ + (void)UsbFnInterfaceClose(acm->ctrlIface.handle); + (void)UsbFnInterfaceClose(acm->dataIface.handle); + /* Stop receiving the Event EP0 control transfer. */ + (void)UsbFnInterfaceStopRecvEvent(acm->ctrlIface.fn); + /* Delete the device. */ + ret = UsbFnDeviceRemove(acm->fnDev); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: remove usb function device failed", __func__); + } + return ret; + } + ``` + +## References + +- Code repositories: + + **[drivers\_hdf\_core](https://gitee.com/openharmony/drivers_hdf_core)** + + [drivers\_peripheral](https://gitee.com/openharmony/drivers_peripheral) + + [drivers\_interface](https://gitee.com/openharmony/drivers_interface) + +- Code paths: + + USB driver model adaptation for LiteOS: //drivers/hdf_core/adapter/khdf/liteos/model/usb + + USB DDK driver loading: //drivers/hdf_core/framework/model/usb + + USB HDI server implementation: //drivers/peripheral/usb/hdi_service + + USB HDI external APIs: //out/{product_name}/gen/drivers/interface/usb/v1_0 diff --git a/en/device-dev/driver/driver-peripherals-vibrator-des.md b/en/device-dev/driver/driver-peripherals-vibrator-des.md index 6a6164eef3..b9b12e2462 100644 --- a/en/device-dev/driver/driver-peripherals-vibrator-des.md +++ b/en/device-dev/driver/driver-peripherals-vibrator-des.md @@ -2,9 +2,9 @@ ## Overview -### Introduction +### Function -Developed on the Hardware Driver Foundation (HDF), the vibrator driver model makes vibrator driver development easier. The motor driver model shields the interaction between the device driver and the system and provides unified and stable driver interface capabilities for the hardware service layer. It also provides open interfaces and interface parsing capabilities for developers to develop vibrator drivers and deploy vibrators in different OSs.
    The figure below shows the vibrator driver model. +The vibrator driver model is developed based on OpenHarmony Hardware Driver Foundation (HDF) to facilitate vibrator driver development. The vibrator driver model shields the interaction between the device driver and the system, and provides unified and stable driver interface capabilities for the hardware service layer. It also provides open interfaces and interface parsing capabilities for developing vibrator drivers and deploying vibrators in different OSs.
    The figure below shows the vibrator driver model. **Figure 1** Vibrator driver model @@ -12,15 +12,25 @@ Developed on the Hardware Driver Foundation (HDF), the vibrator driver model mak ### Basic Concepts -The system controls device vibration by invoking the vibrator. There are two vibration modes: +Vibrators can be classified into the following types based on vibration mechanism: + +- Rotor vibrator + + The rotor vibrator uses magnetic field caused by current to drive the rotor to rotate and produce vibration. Rotor vibrators include ordinary rotor vibrators and coin rotor vibrators. The rotor vibrators cannot start or stop quickly or implement multiple vibration modes. However, they have small footprint and are cost-efficient. + +- Linear vibrator + + The linear vibrator drives the spring mass for linear movement and produce vibration. Linear vibrators include longitudinal and transverse linear vibrators. The linear vibrators start and stop quickly, produce different vibration inductions, and have good sense of direction. + +The system calls the vibrator driver APIs to control the vibration of the device. There are two vibration modes: - One-shot vibration - The vibrator vibrates for a specified duration. + The vibrator vibrates once for a given duration. - Periodic vibration - The vibrator vibrates with a preset effect. For example, if **haptic.clock.timer** is set to **[600, 600, 200, 600]**, the vibrator waits for 600 ms, vibrates for 600 ms, waits for 200 ms, and vibrates for 600 ms. + The vibrator vibrates at preset intervals. For example, if **haptic.clock.timer** is set to **[600, 600, 200, 600]**, the vibrator waits for 600 ms, vibrates for 600 ms, waits for 200 ms, and vibrates for 600 ms. ### Working Principles @@ -30,18 +40,18 @@ The figure below shows how a vibrator driver is loaded. ![How vibrator driver works](figures/vibrator_working.png) -The following uses the vibrator driver on the Hi3516D V300 development board of the standard system as an example to describe the driver loading and running process. +The following describes how a vibrator module driver loads and starts on a Hi3516DV300 that runs the standard system. -1. The vibrator driver reads the vibrator management configuration information from **Vibrator Host** in the **device_info.hcs** file. -2. The HCS parser parses the vibrator management configuration and associates it with the vibrator abstract driver. -3. The vibrator chipset driver reads the vibrator data configuration from the **linear_vibrator_config.hcs** file. -4. The HCS parser parses the vibrator data configuration and associates it with the vibrator haptic driver. -5. The vibrator proxy delivers an instruction to the vibrator stub. -6. The vibrator stub calls the vibrator controller. -7. The vibrator host initializes the vibrator abstract driver interfaces. -8. The vibrator haptic driver starts a thread to parse the vibrator haptic module. -9. The vibrator haptic driver calls the **Start** interface in the vibrator abstract driver. -10. The vibrator abstract driver calls the **Start** interface in the vibrator chipset driver. +1. The Device Manager reads the vibrator management configuration from the **device_info.hcs** file. +2. The HDF Configuration Source (HCS) Parser parses the vibrator management configuration and loads the vibrator abstract driver. +3. The Device Manager reads the Vibrator data configuration from the **linear_vibrator_config.hcs** file. +4. The HCS Parser parses the vibrator data configuration and loads the haptic driver. +5. The Vibrator Proxy obtains the vibrator HDI service instance and sends it to the Vibrator Stub over Inter-Process Communication (IPC). +6. The Vibrator Stub processes IPC-related service logic and calls the Light Controller after parameter deserialization. +7. The Vibrator Controller implements the HDI APIs and calls the Vibrator abstract driver APIs over IPC. +8. The haptic driver starts a thread to parse the vibrator haptic module. +9. The haptic driver calls **Start()** in the vibrator abstract driver. +10. The vibrator abstract driver calls **Start()** in the vibrator differentiated driver to control the vibrator device to vibrate with a given effect. ## Development Guidelines @@ -51,17 +61,17 @@ You can set different vibration effects as needed, for example, customizing vibr ### Available APIs -The vibrator driver model supports static HDF Configuration Source (HCS) configuration and dynamic parameter configuration. The vibrator hardware service calls **StartOnce()** to trigger continuous vibration and calls **Start()** to trigger vibration with a specified effect. The table below lists the APIs provided by the vibrator driver model for the hardware service layer. +The vibrator driver model supports static HCS and dynamic parameter configuration. The vibrator hardware service calls **StartOnce()** to trigger continuous vibration and calls **Start()** to trigger vibration with a specified effect. The following table describes the APIs provided by the vibrator driver model for the hardware service layer. **Table 1** APIs of the vibrator driver model | API | Description | | -------------------------------------- | ------------------------------------------------ | -| int32_t StartOnce(uint32_t duration) | Triggers vibration with a given **duration**. | -| int32_t Start(const char *effectType) | Triggers vibration with a given effect, which is specified by **effectType**. | -| int32_t Stop(enum VibratorMode mode) | Stops vibration. | -| int32_t EnableVibratorModulation(uint32_t duration, int32_t intensity, int32_t frequency) | Triggers vibration with the given **duration**, **frequency**, and **intensity**.| -| int32_t GetVibratorInfo(struct VibratorInfo **vibratorInfo); | Obtains vibrator information, including whether the intensity and frequency can be set and the intensity and frequency range.| +| int32_t (*StartOnce)([in] uint32_t duration) | Triggers a one-short vibration with a given duration.
    **duration** specifies the duration of the one-short vibration. | +| int32_t (*Start)([in] const char *effectType) | Triggers periodic vibrations with a preset effect.
    **effectType** indicates the pointer to the preset effect type. | +| int32_t (*Stop)([in] enum VibratorMode mode) | Stops vibration.
    **mode** indicates the vibration mode, which can be one-short or periodic vibration. | +| int32_t (*EnableVibratorModulation)(uint32_t duration, int32_t intensity, int32_t frequency) | Triggers a vibration with the given duration, frequency, and intensity.
    **duration** indicates the duration of the vibration.
    **intensity** indicates the vibration amplitude.
    **frequency** indicates the vibrator frequency in the vibration period.| +| int32_t (*GetVibratorInfo)([out] struct VibratorInfo **vibratorInfo) | Obtains information about all vibrators whose amplitude and frequency can be set in the system.
    **vibratorInfo** indicates the pointer to the vibrator information obtained.| ### How to Develop @@ -69,25 +79,25 @@ The vibrator driver model provides APIs for the upper-layer hardware service to 1. Develop the vibrator abstract driver based on the driver entry. Specifically, implement the **Bind**, **Init**, **Release**, and **Dispatch** functions, configure resources, and parse the HCS. - - Call **HDF_INIT** to register the driver entry with the HDF. During driver loading, the HDF calls the **Bind** function and then the **Init** function to load the driver. If the **Init** function fails to be called, the HDF calls **Release** to release the driver resources and exit the vibrator driver model. The vibrator driver model uses the HCS as the configuration source code. For details about HCS configuration fields, see [Configuration Management](driver-hdf-manage.md). The driver entry function is defined as follows: + - Call **HDF_INIT** to register the driver entry with the HDF. The HDF calls **Bind** and then **Init** to load the driver. If **Init** fails to be called, the HDF calls **Release** to release the driver resources and exit the vibrator driver model. The vibrator driver model uses the HCS as the configuration source code. For details about HCS fields, see [Configuration Management](driver-hdf-manage.md). The driver entry function is defined as follows: ```c /* Register the entry structure object of the vibrator abstract driver. */ struct HdfDriverEntry g_vibratorDriverEntry = { - .moduleVersion = 1, // Version of the vibrator module. - .moduleName = "HDF_VIBRATOR", // Vibrator module name, which must be the same as moduleName in the device_info.hcs file. - .Bind = BindVibratorDriver, // Function for binding a vibrator. - .Init = InitVibratorDriver, // Function for initializing a vibrator. - .Release = ReleaseVibratorDriver, // Function for releasing vibrator resources. + .moduleVersion = 1, // Vibrator module version. + .moduleName = "HDF_VIBRATOR", // Vibrator module name, which must be the same as moduleName in the device_info.hcs file. + .Bind = BindVibratorDriver, // Bind function for the vibrator driver. + .Init = InitVibratorDriver, // Ini function for the vibrator driver. + .Release = ReleaseVibratorDriver, // Release function for the vibrator driver. }; - + /* Call HDF_INIT to register the driver entry with the HDF. */ HDF_INIT(g_vibratorDriverEntry); ``` - Develop the vibrator abstract driver. Specifically, implement the **Bind**, **Init**, **Release**, and **Dispatch** functions. ```c - /* Message exchange capability of the vibrator driver. */ + /* External service published by the vibrator driver. */ static int32_t DispatchVibrator(struct HdfDeviceIoClient *client, int32_t cmd, struct HdfSBuf *data, struct HdfSBuf *reply) { @@ -152,18 +162,19 @@ The vibrator driver model provides APIs for the upper-layer hardware service to ```c /* Device information HCS. */ vibrator :: host { - hostName = "vibrator_host"; - device_vibrator :: device { - device0 :: deviceNode { - policy = 2; // Policy for publishing the driver service. - priority = 100; // Driver startup priority (0–200). A larger value indicates a lower priority. The default value 100 is recommended. The sequence for loading devices with the same priority is random. - preload = 0; // Whether to load the driver on demand. The value 0 means to load the driver on demand, and 2 means the opposite. - permission = 0664; // Permission for the driver to create a device node. - moduleName = "HDF_VIBRATOR"; // Driver name, which must be the same as moduleName in the driver entry structure. - serviceName = "hdf_misc_vibrator"; // Name of the service provided by the driver. The name must be unique. - deviceMatchAttr = "hdf_vibrator_driver"; // Keyword matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. - } - } + hostName = "vibrator_host"; + device_vibrator :: device { + device0 :: deviceNode { + policy = 2; // Policy for the driver to publish services. + priority = 100; // Priority (0–200) for starting the vibrator driver. A larger value indicates a lower priority. The recommended value is 100. If the priorities are the same, the device loading sequence is not ensured. + preload = 0; // The value 0 means to load the driver by default during the startup of the system. The value 2 means the opposite. + permission = 0664; // Permission for the device node created. + moduleName = "HDF_VIBRATOR"; // Vibrator driver name. It must be the same as moduleName in the driver entry structure. + serviceName = "hdf_misc_vibrator"; // Service published by the vibrator driver. The service name must be unique. + deviceMatchAttr = "hdf_vibrator_driver"; // Keyword matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. + } + } + } ``` 2. Create a vibrator haptic model and parse the haptic HCS. @@ -204,21 +215,21 @@ The vibrator driver model provides APIs for the upper-layer hardware service to - The vibrator haptic model uses the HCS. For details about the HCS fields, see [Configuration Management](driver-hdf-manage.md). - ```hcs + ```c /* Vibrator data configuration template (vibrator_config.hcs). */ root { vibratorConfig { boardConfig { - match_attr = "hdf_vibrator_driver"; // The value must be the same as that of the match_attr field configured for the vibrator. + match_attr = "hdf_vibrator_driver"; // The value must be the same as that of match_attr in the vibrator device configuration file. vibratorAttr { /* The value 0 means a rotor vibrator, and 1 means a linear vibrator. */ - deviceType = 1; // Device type. - supportPreset = 1; // Supported preset type. + deviceType = 1; // Device type. + upportPreset = 1; // Supported preset type. } vibratorHapticConfig { haptic_clock_timer { effectName = "haptic.clock.timer"; - type = 1; // The value 0 means the built-in mode, and 1 means the time sequence. + type = 1; // The value 0 indicates the built-in mode, and 1 indicates the time sequence. seq = [600, 600, 200, 600]; // Time sequence. } haptic_default_effect { @@ -232,12 +243,12 @@ The vibrator driver model provides APIs for the upper-layer hardware service to } ``` -3. Develop the interfaces for starting and stopping vibration. A timer will be created and destroyed based on the vibration effect. +3. Implement the APIs for obtaining vibrator information, triggering and stopping a vibration, and creating and destroying a timer based on the vibration mode. - The vibrator hardware service calls **StartOnce** to start one-shot vibration with a given duration and calls **StartEffect** to start vibration with a specified effect. + The vibrator hardware service calls **StartOnce** to start a one-shot vibration with a given duration and calls **StartEffect** to start vibration with a specified effect. ```c - /* Trigger vibration with a given duration. */ + /* Trigger a one-short vibration with a given duration. */ static int32_t StartOnce(struct HdfSBuf *data, struct HdfSBuf *reply) { uint32_t duration; @@ -259,7 +270,7 @@ The vibrator driver model provides APIs for the upper-layer hardware service to return HDF_SUCCESS; } - /* Trigger vibration with a given effect. */ + /* Trigger a vibration with a given effect. */ static int32_t StartEffect(struct HdfSBuf *data, struct HdfSBuf *reply) { int32_t ret; @@ -313,11 +324,11 @@ The vibrator driver model provides APIs for the upper-layer hardware service to int32_t intensity; int32_t frequency; int32_t ret; - ..... + ..... (void)OsalMutexLock(&drvData->mutex); drvData->mode = VIBRATOR_MODE_ONCE; (void)OsalMutexUnlock(&drvData->mutex); - /* Set the vibration intensity and frequency. */ + /* Set the vibration intensity and frequency. */ ret = drvData->ops.SetParameter(intensity, frequency); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: set parameter failed", __func__); @@ -380,7 +391,7 @@ The vibrator driver model provides APIs for the upper-layer hardware service to } /* Register vibrator information. */ - int32_t RegisterVibratorInfo(struct VibratorInfo *vibratorInfo) + int32_t RegisterVibratorInfo(struct VibratorInfo *vibratorInfo) { struct VibratorDriverData *drvData = GetVibratorDrvData(); @@ -407,29 +418,29 @@ The vibrator driver model provides APIs for the upper-layer hardware service to static int32_t StopModulationParameter() { uint8_t value[DRV2605L_VALUE_BUTT]; - struct Drv2605lDriverData *drvData = NULL; + struct Drv2605lDriverData *drvData = NULL; drvData = GetDrv2605lDrvData(); - CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData, HDF_FAILURE); + CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData, HDF_FAILURE); CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData->drv2605lCfgData, HDF_FAILURE); value[DRV2605L_ADDR_INDEX] = (uint8_t)DRV2605_REG_MODE; value[DRV2605L_VALUE_INDEX] = (uint8_t)DRV2605_MODE_STANDBY; if (WriteDrv2605l(&drvData->drv2605lCfgData->vibratorBus.i2cCfg, value, sizeof(value)) != HDF_SUCCESS) { HDF_LOGE("%s: i2c addr [%0X] write failed", __func__, value[DRV2605L_ADDR_INDEX]); - return HDF_FAILURE; + return HDF_FAILURE; } value[DRV2605L_ADDR_INDEX] = (uint8_t)DRV2605_REG_RTPIN; value[DRV2605L_VALUE_INDEX] = (uint8_t)&drvData->drv2605lCfgData->vibratorAttr.defaultIntensity; if (WriteDrv2605l(&drvData->drv2605lCfgData->vibratorBus.i2cCfg, value, sizeof(value)) != HDF_SUCCESS) { - HDF_LOGE("%s: i2c addr [%0X] write failed", __func__, value[DRV2605L_ADDR_INDEX]); + HDF_LOGE("%s: i2c addr [%0X] write failed", __func__, value[DRV2605L_ADDR_INDEX]); } value[DRV2605L_ADDR_INDEX] = (uint8_t)DRV2605_REG_LRARESON; value[DRV2605L_VALUE_INDEX] = (uint8_t)&drvData->drv2605lCfgData->vibratorAttr.defaultFrequency; if (WriteDrv2605l(&drvData->drv2605lCfgData->vibratorBus.i2cCfg, value, sizeof(value)) != HDF_SUCCESS) { - HDF_LOGE("%s: i2c addr [%0X] write failed", __func__, value[DRV2605L_ADDR_INDEX]); + HDF_LOGE("%s: i2c addr [%0X] write failed", __func__, value[DRV2605L_ADDR_INDEX]); } return HDF_SUCCESS; @@ -439,7 +450,7 @@ The vibrator driver model provides APIs for the upper-layer hardware service to static void SetModulationParameter(int32_t intensity, int32_t frequency) { uint8_t value[DRV2605L_VALUE_BUTT]; - struct Drv2605lDriverData *drvData = NULL; + struct Drv2605lDriverData *drvData = NULL; drvData = GetDrv2605lDrvData(); CHECK_VIBRATOR_NULL_PTR_RETURN_VALUE(drvData, HDF_FAILURE); @@ -453,7 +464,7 @@ The vibrator driver model provides APIs for the upper-layer hardware service to } } else { HDF_LOGD("%s: the setting of intensity 0 is not supported and \ - will be set as the system default intensity", __func__); + will be set as the system default intensity", __func__); } if (frequency != 0) { @@ -472,9 +483,9 @@ The vibrator driver model provides APIs for the upper-layer hardware service to ### Verification -After the driver is developed, develop test cases in the sensor unit test to verify the basic functions of the driver. Use the developer self-test platform as the test environment. +After the driver is developed, develop test cases in the vibrator unit test to verify the basic functionalities of the driver. Use your own platform as the test environment. -``` +```c++ /* Initialize the vibrator interface instance before executing test cases. */ void HdfVibratorTest::SetUpTestCase() { diff --git a/en/device-dev/driver/driver-platform-adc-des.md b/en/device-dev/driver/driver-platform-adc-des.md index 76c73fb3e9..29a7a37872 100644 --- a/en/device-dev/driver/driver-platform-adc-des.md +++ b/en/device-dev/driver/driver-platform-adc-des.md @@ -4,78 +4,69 @@ ### Function -An analog-to-digital converter (ADC) is a device that converts analog signals into digital signals. +An analog-to-digital converter (ADC) converts analog signals into digital signals for storage and computing. In addition to the power cable and ground cable, the ADC requires only one cable to connect to the target device. The following figure shows the physical connection of the ADC. + +**Figure 1** ADC physical connection + +![](figures/ADC_physical_connection.png "ADC_physical_connection") + +The ADC module provides a set of APIs to complete AD conversion, including: -The ADC APIs provide a set of common functions for ADC data transfer, including: - Opening or closing an ADC device - Obtaining the analog-to-digital (AD) conversion result ### Basic Concepts -The ADC converts analog parameters into digital parameters for easy storage and computing. The technical specifications of the ADC include the following: - - Resolution - + The number of binary bits that can be converted by an ADC. A greater number of bits indicates a higher resolution. + - Conversion error - + Difference between the actual and theoretical digital values output by an ADC. It is expressed by a multiple of the least significant bit. Generally, the maximum output error is used. + - Transition time - + Time required by an ADC to perform a complete conversion. ### Working Principles In the Hardware Driver Foundation (HDF), the ADC module uses the unified service mode for API adaptation. In this mode, a service is used as the ADC manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. -The ADC module is divided into the following layers: - -- Interface layer: provides APIs for opening or closing a device and writing data. -- Core layer: provides the capabilities of binding, initializing, and releasing devices. -- Adaptation layer: implements driver-specific functions. - -In addition to the power and ground cables, the ADC requires only one cable to connect to the target device. The figure below shows the physical connection. - -**Figure 1** ADC physical connection - - -![](figures/ADC_physical_connection.png "ADC_physical_connection") - ### Constraints -Currently, the ADC module supports only the kernels (LiteOS) of mini and small systems. +The ADC module can read data only in polling mode. ## Usage Guidelines ### When to Use -An ADC is usually used to convert an analog voltage into a digital parameter, for example, it is used with a microphone to collect sound, used with an NTC resistor to measure temperature, or converts the output of analog sensors into digital parameters. +ADC devices are used to convert analog voltage or current into digital parameters. For example, an ADC can be used with an NTC resistor to measure temperature, or can be used to convert the output of an analog sensor into a digital parameter. ### Available APIs -The table below describes the APIs of the ADC module. For more details, see API Reference. +The following table describes the APIs of the ADC module. For more information, see **//drivers/hdf_core/framework/include/platform/adc_if.h**. **Table 1** APIs of the ADC driver - -| API | Description | +| API | Description | | -------- | ---------------- | -| AdcOpen | Opens an ADC device. | -| AdcClose | Closes an ADC device. | -| AdcRead | Obtains the AD conversion result.| +| DevHandle AdcOpen(uint32_t number) | Opens an ADC device. | +| void AdcClose(DevHandle handle) | Closes an ADC device. | +| int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t \*val) | Obtains the AD conversion result.| ### How to Develop -The figure below shows the general development process. +The following figure illustrates how to use ADC APIs. - **Figure 2** Process of using ADC APIs + **Figure 2** Process of using ADC APIs ![](figures/using-ADC-process.png) -#### Opening an ADC Device. +#### Opening an ADC Device -Call **AdcOpen** to open an ADC device. +Call **AdcOpen()** to open an ADC device. ```c DevHandle AdcOpen(int16_t number); @@ -83,12 +74,11 @@ DevHandle AdcOpen(int16_t number); **Table 2** Description of AdcOpen - | Parameter | Description | | ---------- | ----------------- | | number | ADC device number. | | **Return Value**| **Description** | -| NULL | The operation failed. | +| NULL | The operation fails. | | Device handle | The operation is successful. The handle of the ADC device opened is returned.| Example: Open device 1 of the two ADCs (numbered 0 and 1) in the system. @@ -99,7 +89,7 @@ DevHandle adcHandle = NULL; /* ADC device handle / /* Open ADC device 1. */ adcHandle = AdcOpen(1); if (adcHandle == NULL) { - HDF_LOGE("AdcOpen: failed\n"); + HDF_LOGE("AdcOpen: fail\n"); return; } ``` @@ -112,7 +102,6 @@ int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val); **Table 3** Description of AdcRead - | Parameter | Description | | ---------- | -------------- | | handle | ADC device handle. | @@ -120,7 +109,7 @@ int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val); | val | Pointer to the AD conversion result. | | **Return Value**| **Description**| | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | Example: Obtain the AD conversion result of channel 1. @@ -137,13 +126,12 @@ if (ret != 0) { #### Closing an ADC Device -Call **AdcClose** to close the ADC device after the ADC communication is complete. +Call **AdcClose()** to close the ADC device after the ADC communication is complete. ```c void AdcClose(DevHandle handle); ``` **Table 4** Description of AdcClose - | Parameter | Description | | ------ | ----------- | | handle | ADC device handle.| @@ -158,13 +146,13 @@ AdcClose(adcHandle); /* Close the ADC device. */ ### Example -This following example shows how to use ADC APIs to manage an ADC device on a Hi3516D V300 board. +The following example shows how to use ADC APIs to manage an ADC device on a Hi3516D V300 board. -The basic hardware information is as follows: +The hardware information is as follows: - SoC: hi3516dv300 -- The potentiometer is connected to channel 1 of ADC device 0. +- The potentiometer is connected to channel 1 of ADC 0. Perform continuous read operations on the ADC device to check whether the ADC is functioning. @@ -175,16 +163,17 @@ Example: #include "hdf_log.h" /* Header file for log APIs */ /* Define device 0, channel 1. */ -#define ADC_DEVICE_NUM 0 +#define ADC_DEVICE_NUM 0 #define ADC_CHANNEL_NUM 1 +#define ADC_TEST_NUM 30 /* Main entry of ADC routines. */ static int32_t TestCaseAdc(void) { int32_t i; int32_t ret; - DevHandle adcHandle; - uint32_t readBuf[30] = {0}; + DevHandle adcHandle = NULL; + uint32_t readBuf[ADC_TEST_NUM] = {0}; /* Open the ADC device. */ adcHandle = AdcOpen(ADC_DEVICE_NUM); @@ -194,10 +183,10 @@ static int32_t TestCaseAdc(void) } /* Perform 30 times of AD conversions continuously and read the conversion results. */ - for (i = 0; i < 30; i++) { + for (i = 0; i < ADC_TEST_NUM; i++) { ret = AdcRead(adcHandle, ADC_CHANNEL_NUM, &readBuf[i]); if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Failed to read ADC!:%d", __func__, ret); + HDF_LOGE("%s: ADC read fail!:%d", __func__, ret); AdcClose(adcHandle); return -1; } diff --git a/en/device-dev/driver/driver-platform-adc-develop.md b/en/device-dev/driver/driver-platform-adc-develop.md index 8f4c980a10..314e70aaa7 100644 --- a/en/device-dev/driver/driver-platform-adc-develop.md +++ b/en/device-dev/driver/driver-platform-adc-develop.md @@ -1,38 +1,112 @@ # ADC - ## Overview -An analog-to-digital converter (ADC) is a device that converts analog signals into digital signals. In the Hardware Driver Foundation (HDF), the ADC module uses the unified service mode for API adaptation. In this mode, a device service is used as the ADC manager to handle external access requests in a unified manner, which is reflected in the configuration file. The unified service mode applies to the scenario where there are many device objects of the same type, for example, when the ADC has more than 10 controllers. If the independent service mode is used, more device nodes need to be configured and memory resources will be consumed by services. +### Function - **Figure 1** Unified service mode +An analog-to-digital converter (ADC) is a device that converts analog signals into digital signals. - ![](figures/unified-service-mode.png "ADC Unified Service Mode") +### Basic Concepts +- Resolution -## Available APIs + The number of binary bits that can be converted by an ADC. A greater number of bits indicates a higher resolution. -**AdcMethod**: +- Conversion error + Difference between the actual and theoretical digital values output by an ADC. It is expressed by a multiple of the least significant bit. Generally, the maximum output error is used. -``` +- Transition time + + Time required by an ADC to perform a complete conversion. + + +### Working Principles + +In the Hardware Driver Foundation (HDF), the ADC module uses the unified service mode for API adaptation. In this mode, a device service is used as the ADC manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The following figure illustrates the unified service mode of the ADC module. + +The ADC module is divided into the following layers: + +- Interface layer: provides the capabilities of opening a device, writing data, and closing a device. +- Core layer: binds services, initializes and releases the PlatformManager, and provides the capabilities of adding, deleting, and obtaining controllers. +- Adaptation layer: implements hardware-related functions, such as controller initialization. + +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. + +**Figure 1** Unified service mode + +![](figures/unified-service-mode.png "ADC Unified Service Mode") + +## Usage Guidelines + +### When to Use + +ADC devices are used to convert analog voltage into digital parameters. For example, an ADC can be used with an NTC resistor to measure temperature, or can be used to convert the output of an analog sensor into a digital parameter. Before using ADC devices with OpenHarmony, you need to adapt the ADC driver to OpenHarmony. The following describes how to do it. + +### Available APIs + +To enable the upper layer to successfully operate the hardware by calling the ADC APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/adc/adc_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +Definitions of **AdcMethod** and **AdcLockMethod**: + +```c struct AdcMethod { - int32_t (*read)(struct AdcDevice *device, uint32_t channel, uint32_t *val); - int32_t (*start)(struct AdcDevice *device); - int32_t (*stop)(struct AdcDevice *device); + int32_t (*read)(struct AdcDevice *device, uint32_t channel, uint32_t *val); + int32_t (*start)(struct AdcDevice *device); + int32_t (*stop)(struct AdcDevice *device); }; + +struct AdcLockMethod { + int32_t (*lock)(struct AdcDevice *device); + void (*unlock)(struct AdcDevice *device); +}; + ``` - **Table 1** Description of the callback functions in AdcMethod +At the adaptation layer, **AdcMethod** must be implemented, and **AdcLockMethod** can be implemented based on service requirements. The core layer provides the default **AdcLockMethod**, in which a spinlock is used to protect the critical section. + +```c +static int32_t AdcDeviceLockDefault(struct AdcDevice *device) +{ + if (device == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return OsalSpinLock(&device->spin); +} + +static void AdcDeviceUnlockDefault(struct AdcDevice *device) +{ + if (device == NULL) { + return; + } + (void)OsalSpinUnlock(&device->spin); +} + +static const struct AdcLockMethod g_adcLockOpsDefault = { + .lock = AdcDeviceLockDefault, + .unlock = AdcDeviceUnlockDefault, +}; + +``` + +If spinlock cannot be used, you can use another type of lock to implement **AdcLockMethod**. The custom **AdcLockMethod** will replace the default **AdcLockMethod**. + + **Table 1** Hook functions in **AdcMethod** | Function| Input Parameter| Output Parameter| Return Value| Description| | -------- | -------- | -------- | -------- | -------- | -| read | **device**: structure pointer to the ADC controller at the core layer.
    **channel**: channel ID, which is of the uint32_t type.| **val**: pointer to the signal data to be transmitted. It is of the uint32_t type.| HDF_STATUS| Reads the signal data sampled by the ADC.| +| read | **device**: structure pointer to the ADC controller at the core layer.
    **channel**: channel number, which is of the uint32_t type.| **val**: pointer to the signal data to be transmitted. It is of the uint32_t type.| HDF_STATUS| Reads the signal data sampled by the ADC.| | stop | **device**: structure pointer to the ADC controller at the core layer.| –| HDF_STATUS| Stops an ADC device.| | start | **device**: structure pointer to the ADC controller at the core layer.| –| HDF_STATUS| Starts an ADC device.| +**Table 2** Functions in **AdcLockMethod** + +| Function| Input Parameter| Output Parameter| Return Value| Description| +| -------- | -------- | -------- | -------- | -------- | +| lock | **device**: structure pointer to the ADC device object at the core layer.| –| HDF_STATUS| Acquires the critical section lock.| +| unlock | **device**: structure pointer to the ADC device object at the core layer.| –| HDF_STATUS| Releases the critical section lock.| -## How to Develop +### How to Develop The ADC module adaptation involves the following steps: @@ -44,137 +118,144 @@ The ADC module adaptation involves the following steps: - Add the **deviceNode** information to the **device_info.hcs** file. - (Optional) Add the **adc_config.hcs** file. -3. Instantiate the ADC controller object. +3. Instantiate the core layer APIs. - Initialize **AdcDevice**. - Instantiate **AdcMethod** in the **AdcDevice** object. > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > For details, see [Available APIs](#available-apis). - -4. Debug the driver. - - (Optional) For new drivers, verify basic functions, for example, check the information returned after the driver is attached and check whether signals are successfully collected. + > For details about the functions in **AdcMethod**, see [Available APIs](#available-apis). +### Example -## Development Example +The following uses the Hi3516D V300 driver **//device/soc/hisilicon/common/platform/adc/adc_hi35xx.c** as an example to describe how to perform the ADC driver adaptation. - The following uses **adc_hi35xx.c** as an example to present the information required for implementing device functions. 1. Instantiate the driver entry. - + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - + Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. - + ADC driver entry example: - - Many devices may connect to the ADC. In the HDF, a manager object needs to be created for the ADC. When a device needs to be started, the manager object locates the target device based on the specified parameters. - - The driver of the ADC manager is implemented by the core layer. The **Init** function of the driver layer calls **AdcDeviceAdd** of the core layer to add devices to the ADC manager. Therefore, you do not need to implement this part. - - ``` - static struct HdfDriverEntry g_hi35xxAdcDriverEntry = { - .moduleVersion = 1, - .Init = Hi35xxAdcInit, - .Release = Hi35xxAdcRelease, - .moduleName = "hi35xx_adc_driver", // (Mandatory) This parameter must be the same as that in the .hcs file. + + Multiple devices may connect to the ADC controller. In the HDF, a manager object needs to be created for this type of devices. When a device needs to be started, the manager object locates the target device based on the specified parameters. + + You do not need to implement the driver of the ADC manager, which is implemented by the core layer. However, the **AdcDeviceAdd** function of the core layer must be invoked in the **Init** function to implement the related features. + + ```c + static struct HdfDriverEntry g_hi35xxAdcDriverEntry = { + .moduleVersion = 1, + .Init = Hi35xxAdcInit, + .Release = Hi35xxAdcRelease, + .moduleName = "hi35xx_adc_driver", // (Mandatory) The value must be the same as the module name in the device_info.hcs file. }; - HDF_INIT(g_hi35xxAdcDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. - - // Driver entry of the adc_core.c manager service at the core layer - struct HdfDriverEntry g_adcManagerEntry = { - .moduleVersion = 1, - .Init = AdcManagerInit, - .Release = AdcManagerRelease, - .moduleName = "HDF_PLATFORM_ADC_MANAGER", // The value is device0 in the device_info file. - }; - HDF_INIT(g_adcManagerEntry); - ``` - -2. Add **deviceNode** to the **device_info.hcs** file, and configure the device attributes in the **adc_config.hcs** file. - - The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the driver implementation and the default values or restriction ranges of the **AdcDevice** members at the core layer. - - In the unified service mode, the first device node in the **device_info** file must be the ADC manager. The parameters must be set as follows: - - | Parameter| Value| - | -------- | -------- | - | moduleName | **HDF_PLATFORM_ADC_MANAGER**| - | serviceName | –| - | policy | **0**, which indicates that no service is published.| - | deviceMatchAttr | Reserved.| - - Configure ADC controller information from the second node. This node specifies a type of ADC controllers rather than an ADC controller. In this example, there is only one ADC device. If there are multiple ADC devices, add the **deviceNode** information to the **device_info** file and add the corresponding device attributes to the **adc_config** file for each device. - - - **device_info.hcs** configuration example - - - ``` + HDF_INIT(g_hi35xxAdcDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. + + /* Driver entry of the adc_core.c manager service at the core layer */ + struct HdfDriverEntry g_adcManagerEntry = { + .moduleVersion = 1, + .Init = AdcManagerInit, + .Release = AdcManagerRelease, + .moduleName = "HDF_PLATFORM_ADC_MANAGER", // The value must be that of device0 in the device_info.hcs file. + }; + HDF_INIT(g_adcManagerEntry); + ``` + +2. Add the **deviceNode** information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file and configure the device attributes in **adc_config.hcs**. + + The **deviceNode** information is related to the driver entry registration. The device attribute values are closely related to the driver implementation and the default values or value ranges of the **AdcDevice** members at the core layer. + + In the unified service mode, the first device node in the **device_info.hcs** file must be the ADC manager. The parameters must be set as follows: + + | Parameter| Value| + | -------- | -------- | + | moduleName | **HDF_PLATFORM_ADC_MANAGER**| + | serviceName | –| + | policy | **0**, which indicates that no service is published.| + | deviceMatchAttr | Reserved.| + + Configure ADC controller information from the second node. This node specifies a type of ADC controllers rather than an ADC controller. In this example, there is only one ADC device. If there are multiple ADC devices, add the **deviceNode** information to the **device_info.hcs** file and add the corresponding device attributes to the **adc_config** file for each device. + + - **device_info.hcs** example + + ```c root { device_info { - platform :: host { - device_adc :: device { - device0 :: deviceNode { - policy = 0; - priority = 50; - permission = 0644; - moduleName = "HDF_PLATFORM_ADC_MANAGER"; - serviceName = "HDF_PLATFORM_ADC_MANAGER"; - } - device1 :: deviceNode { - policy = 0; // The value 0 indicates that no service is published. - priority = 55; // Driver startup priority. - permission = 0644; // Permission to create device nodes for the driver. - moduleName = "hi35xx_adc_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. - serviceName = "HI35XX_ADC_DRIVER"; // (Mandatory) Unique name of the service published by the driver. - deviceMatchAttr = "hisilicon_hi35xx_adc";// (Mandatory) Private data of the controller. The value must be the same as that of the corresponding controller in adc_config.hcs. - // The specific controller information is configured in adc_config.hcs. - } - } + platform :: host { + device_adc :: device { + device0 :: deviceNode { + policy = 0; + priority = 50; + permission = 0644; + moduleName = "HDF_PLATFORM_ADC_MANAGER"; + serviceName = "HDF_PLATFORM_ADC_MANAGER"; + } + device1 :: deviceNode { + policy = 0; // The value 0 indicates that no service is published. + priority = 55; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "hi35xx_adc_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. + serviceName = "HI35XX_ADC_DRIVER"; // (Mandatory) Unique name of the service published by the driver. + deviceMatchAttr = "hisilicon_hi35xx_adc"; // (Mandatory) Private data of the controller. The value must be the same as that of the controller in adc_config.hcs. + // The specific controller information is in adc_config.hcs. + } + } + } } - } } ``` - - **adc_config.hcs** configuration example - - ``` + - **adc_config.hcs** example + + The following uses Hi3516D V300 as an example. Some fields are unique to Hi3516D V300. You can delete or add fields as required. + + ```c root { - platform { - adc_config_hi35xx { - match_attr = "hisilicon_hi35xx_adc"; - template adc_device { - regBasePhy = 0x120e0000;// Physical base address of the register. - regSize = 0x34; // Bit width of the register. - deviceNum = 0; // Device number. - validChannel = 0x1; // Valid channel. - dataWidth = 10; // Bit width of the received signal. - scanMode = 1; // Scan mode. - delta = 0; // Delta parameter. - deglitch = 0; - glitchSample = 5000; - rate = 20000; + platform { + adc_config_hi35xx { + match_attr = "hisilicon_hi35xx_adc"; + template adc_device { + regBasePhy = 0x120e0000; // Physical base address of the register. + regSize = 0x34; // Bit width of the register. + deviceNum = 0; // Device number. + validChannel = 0x1; // Valid channel. + dataWidth = 10; // Data width after AD conversion, that is, the resolution. + scanMode = 1; // Scan mode. + delta = 0; // Error range of the conversion result. + deglitch = 0; // Setting of the deglitch. + glitchSample = 5000; // Deglitch time window. + rate = 20000; // Conversion rate. + } + device_0 :: adc_device { + deviceNum = 0; + validChannel = 0x2; + } + } } - device_0 :: adc_device { - deviceNum = 0; - validChannel = 0x2; - } - } - } } ``` -3. Initialize the **AdcDevice** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **AdcMethod** in **AdcDevice** (so that the underlying driver functions can be called). - - Defining a custom structure + After the **adc_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. - To the driver, the custom structure holds parameters and data. The **DeviceResourceIface()** function provided by the HDF reads **adc_config.hcs** to initialize the custom structure and passes some important parameters, such as the device number and bus number, to the **AdcDevice** object at the core layer. + For example, if the **adc_config.hcs** file is in **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/adc/**, add the following statement to **hdf.hcs** of the product: - + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/adc/adc_config.hcs" // Relative path of the configuration file ``` + + This example is based on the Hi3516D V300 development board that runs the LiteOS. The corresponding **hdf.hcs** file is in **vendor/hisilicon/hispark_taurus/hdf_config/hdf.hcs** and **//device/hisilicon/hispark_taurus/sdk_liteos/hdf_config/hdf.hcs**. You can modify the file as required. + +3. Initialize the **AdcDevice** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **AdcMethod** in **AdcDevice** (so that the underlying driver functions can be called). + + - Define a custom structure. + + To the driver, the custom structure holds parameters and data. The DeviceResourceIface() function provided by the HDF reads **adc_config.hcs** to initialize the custom structure and passes some important parameters, such as the device number and bus number, to the **AdcDevice** object at the core layer. + + ```c struct Hi35xxAdcDevice { - struct AdcDevice device; // (Mandatory) Control object at the core layer. For details, see the description of AdcDevice. + struct AdcDevice device; // (Mandatory) Control object at the core layer. It must be the first member of the custom structure. For details, see the following description. volatile unsigned char *regBase; // (Mandatory) Register base address. volatile unsigned char *pinCtrlBase; uint32_t regBasePhy; // (Mandatory) Physical base address of the register. - uint32_t regSize; // (Mandatory) Bit width of the register. + uint32_t regSize; // (Mandatory) Register bit width. uint32_t deviceNum; // (Mandatory) Device number. uint32_t dataWidth; // (Mandatory) Data bit width of received signals. uint32_t validChannel; // (Mandatory) Valid channel. @@ -185,7 +266,7 @@ The ADC module adaptation involves the following steps: uint32_t rate; // (Mandatory) Sampling rate. }; - // AdcDevice is the core layer controller structure. The **Init()** function assigns values to the members of AdcDevice. + /* AdcDevice is the core layer controller structure. The **Init()** function assigns values to the members of AdcDevice. */ struct AdcDevice { const struct AdcMethod *ops; OsalSpinlock spin; @@ -196,25 +277,27 @@ The ADC module adaptation involves the following steps: }; ``` - - Instantiating **AdcMethod** in **AdcDevice**
    This example does not provide the implementation of the **AdcLockMethod** callback. For details, see I2C driver development. Other members are initialized by the **Init** function. + - Instantiate the hook function structure **AdcMethod** of **AdcDevice**. - - ``` + The **AdcLockMethod** is not implemented in this example. To instantiate the structure, refer to the I2C driver development. Other members are initialized in the **Init** function. + + ```c static const struct AdcMethod g_method = { .read = Hi35xxAdcRead, .stop = Hi35xxAdcStop, .start = Hi35xxAdcStart, }; ``` - - **Init** function - **Input parameter**: + - Implement the **Init** function. + + Input parameter: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. - **Return value**: + Return value: - **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. | Status| Description| | -------- | -------- | @@ -225,19 +308,19 @@ The ADC module adaptation involves the following steps: | HDF_SUCCESS | Transmission successful.| | HDF_FAILURE | Transmission failed.| - **Function description**: + Function description: - Initializes the custom structure object and **AdcDevice**, and calls the **AdcDeviceAdd** function at the core layer. + Initializes the custom structure object and **AdcDevice**, and calls the **AdcDeviceAdd** function at the core layer. - ``` + ```c static int32_t Hi35xxAdcInit(struct HdfDeviceObject *device) { int32_t ret; struct DeviceResourceNode *childNode = NULL; ... - // Traverse and parse all nodes in adc_config.hcs and call the **Hi35xxAdcParseInit** function to initialize the devices separately. + /* Traverse and parse all nodes in adc_config.hcs and call the **Hi35xxAdcParseInit** function to initialize the devices separately. */ DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - ret = Hi35xxAdcParseInit(device, childNode);// The function definition is as follows: + ret = Hi35xxAdcParseInit(device, childNode); // The function definition is as follows: ... } return ret; @@ -245,87 +328,111 @@ The ADC module adaptation involves the following steps: static int32_t Hi35xxAdcParseInit(struct HdfDeviceObject *device, struct DeviceResourceNode *node) { - int32_t ret; - struct Hi35xxAdcDevice *hi35xx = NULL; // (Mandatory) Custom structure object. - (void)device; - - hi35xx = (struct Hi35xxAdcDevice *)OsalMemCalloc(sizeof(*hi35xx)); // (Mandatory) Allocate memory. - ... - ret = Hi35xxAdcReadDrs(hi35xx, node); // (Mandatory) Fill the default values in the adc_config file to the structure. - ... - hi35xx->regBase = OsalIoRemap(hi35xx->regBasePhy, hi35xx->regSize);// (Mandatory) Address mapping. - ... - hi35xx->pinCtrlBase = OsalIoRemap(HI35XX_ADC_IO_CONFIG_BASE, HI35XX_ADC_IO_CONFIG_SIZE); - ... - Hi35xxAdcDeviceInit(hi35xx); // (Mandatory) Initialize the ADC. - hi35xx->device.priv = (void *)node; // (Mandatory) Store device attributes. - hi35xx->device.devNum = hi35xx->deviceNum;// (Mandatory) Initialize AdcDevice members. - hi35xx->device.ops = &g_method; // (Mandatory) Attach the AdcMethod instance object. - ret = AdcDeviceAdd(&hi35xx->device); // (Mandatory) Call this function to set the structure of the core layer. The driver accesses the platform core layer only after a success signal is returned. - ... - return HDF_SUCCESS; + int32_t ret; + struct Hi35xxAdcDevice *hi35xx = NULL; // (Mandatory) Custom structure object. + (void)device; + + hi35xx = (struct Hi35xxAdcDevice *)OsalMemCalloc(sizeof(*hi35xx)); // (Mandatory) Allocate memory. + ... + ret = Hi35xxAdcReadDrs(hi35xx, node); // (Mandatory) Use the default values in the adc_config file to fill in the structure. The function definition is as follows. + ... + hi35xx->regBase = OsalIoRemap(hi35xx->regBasePhy, hi35xx->regSize); // (Mandatory) Address mapping. + ... + hi35xx->pinCtrlBase = OsalIoRemap(HI35XX_ADC_IO_CONFIG_BASE, HI35XX_ADC_IO_CONFIG_SIZE); + ... + Hi35xxAdcDeviceInit(hi35xx); // (Mandatory) Initialize the ADC. + hi35xx->device.priv = (void *)node; // (Mandatory) Save device attributes. + hi35xx->device.devNum = hi35xx->deviceNum;// (Mandatory) Initialize AdcDevice. + hi35xx->device.ops = &g_method; // (Mandatory) Attach the AdcMethod instance object. + ret = AdcDeviceAdd(&hi35xx->device)); // (Mandatory) Call this function to set the structure at the core layer. The driver can access the platform core layer only after a success signal is returned. + ... + return HDF_SUCCESS; __ERR__: - if (hi35xx != NULL) { // If the operation fails, execute the initialization function reversely. - if (hi35xx->regBase != NULL) { - OsalIoUnmap((void *)hi35xx->regBase); - hi35xx->regBase = NULL; + if (hi35xx != NULL) { // If the operation fails, deinitialize related functions. + if (hi35xx->regBase != NULL) { + OsalIoUnmap((void *)hi35xx->regBase); + hi35xx->regBase = NULL; + } + AdcDeviceRemove(&hi35xx->device); + OsalMemFree(hi35xx); } - AdcDeviceRemove(&hi35xx->device); - OsalMemFree(hi35xx); + return ret; } - return ret; + + static int32_t Hi35xxAdcReadDrs(struct Hi35xxAdcDevice *hi35xx, const struct DeviceResourceNode *node) + { + int32_t ret; + struct DeviceResourceIface *drsOps = NULL; + + /* Obtain the drsOps method. */ + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + HDF_LOGE("%s: invalid drs ops", __func__); + return HDF_ERR_NOT_SUPPORT; + } + /* Read the configuration parameters in sequence and fill them in the structure. */ + ret = drsOps->GetUint32(node, "regBasePhy", &hi35xx->regBasePhy, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read regBasePhy failed", __func__); + return ret; + } + ret = drsOps->GetUint32(node, "regSize", &hi35xx->regSize, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read regSize failed", __func__); + return ret; + } + ··· + return HDF_SUCCESS; } ``` - - **Release** function - **Input parameter**: + - Implement the **Release** function. - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + Input parameter: - **Return value**: + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. - No value is returned. + Return value: - **Function description**: + No value is returned. - Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + Function description: - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > All forced conversion operations for obtaining the corresponding object can be successful only when the **Init** function has the value assignment operations. + Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. - - ``` + ```c static void Hi35xxAdcRelease(struct HdfDeviceObject *device) { - const struct DeviceResourceNode *childNode = NULL; - ... - // Traverse and parse all nodes in adc_config.hcs and perform the release operation on each node. - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - Hi35xxAdcRemoveByNode(childNode);// The function definition is as follows: - } + const struct DeviceResourceNode *childNode = NULL; + ... + /* Traverse and parse all nodes in adc_config.hcs and perform the release operation on each node. */ + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + Hi35xxAdcRemoveByNode(childNode);// The function definition is as follows: + } } static void Hi35xxAdcRemoveByNode(const struct DeviceResourceNode *node) { - int32_t ret; - int32_t deviceNum; - struct AdcDevice *device = NULL; - struct Hi35xxAdcDevice *hi35xx = NULL; - struct DeviceResourceIface *drsOps = NULL; - - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - ... - ret = drsOps->GetUint32(node, "deviceNum", (uint32_t *)&deviceNum, 0); - ... - // You can call the AdcDeviceGet function to obtain the AdcDevice object based on deviceNum and call the AdcDeviceRemove function to release the AdcDevice object. - device = AdcDeviceGet(deviceNum); - if (device != NULL && device->priv == node) { - AdcDevicePut(device); - AdcDeviceRemove(device); // (Mandatory) Remove the AdcDevice object from the driver manager. - hi35xx = (struct Hi35xxAdcDevice *)device;// (Mandatory) Obtain the custom object through forced conversion and release the operation. - OsalIoUnmap((void *)hi35xx->regBase); - OsalMemFree(hi35xx); + int32_t ret; + int32_t deviceNum; + struct AdcDevice *device = NULL; + struct Hi35xxAdcDevice *hi35xx = NULL; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + ... + ret = drsOps->GetUint32(node, "deviceNum", (uint32_t *)&deviceNum, 0); + ... + /* You can use AdcDeviceGet() to obtain the AdcDevice object based on deviceNum and use AdcDeviceRemove() to release the AdcDevice object. */ + device = AdcDeviceGet(deviceNum); + if (device != NULL && device->priv == node) { + AdcDevicePut(device); + AdcDeviceRemove(device); // (Mandatory) Remove the AdcDevice object from the driver manager. + hi35xx = (struct Hi35xxAdcDevice *)device; // (Mandatory) Obtain the custom object through forcible conversion and perform the Release operation. To perform this operation, the device must be the first member of the custom structure. + OsalIoUnmap((void *)hi35xx->regBase); + OsalMemFree(hi35xx); + } + return; } - return ``` diff --git a/en/device-dev/driver/driver-platform-dac-des.md b/en/device-dev/driver/driver-platform-dac-des.md index 4cffd91b86..c13d9ddcf6 100644 --- a/en/device-dev/driver/driver-platform-dac-des.md +++ b/en/device-dev/driver/driver-platform-dac-des.md @@ -2,18 +2,19 @@ ## Overview -### DAC +### Function -A digit-to-analog converter (DAC) is a device that converts a digital signal into an analog signal in electronics. +A digit-to-analog converter (DAC) is a device that converts a digital signal into an analog signal in electronics. DAC devices are used to: -The DAC APIs provide a set of methods for DAC data transfer, including: +- Provide the output channel for the process control computer system and connect to the executor to implement automatic control of the production process. +- Serve as an important module in the analog-to-digital converter using feedback technologies. + +The DAC module provides a set of methods for DAC data transfer, including: - Opening or closing a DAC device - Setting the target digital-to-analog (DA) value ### Basic Concepts -The DAC module provides the output channel for the process control computer system. It connects to the executor to implement automatic control of the production process. It is also an important module in the analog-to-digital converter using feedback technologies. - - Resolution The number of binary bits that can be converted by a DAC. A greater number of bits indicates a higher resolution. @@ -32,7 +33,7 @@ The DAC module provides the output channel for the process control computer syst ### Working Principles -In the Hardware Driver Foundation (HDF), the DAC module uses the unified service mode for API adaptation. In this mode, a service is used as the DAC manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The figure below shows the unified service mode. +In the Hardware Driver Foundation (HDF), the DAC module uses the unified service mode for API adaptation. In this mode, a service is used as the DAC manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type. If the independent service mode is used, more device nodes need to be configured and memory resources will be consumed by services. The following figure illustrates the unified service mode of the DAC module. The DAC module is divided into the following layers: @@ -40,9 +41,7 @@ The DAC module is divided into the following layers: - Core layer: provides the capabilities of binding, initializing, and releasing devices. - Adaptation layer: implements driver-specific functions. ->![](../public_sys-resources/icon-note.gif) **NOTE** -> -> The core layer can call the functions of the interface layer and uses a hook to call functions of the adaptation layer. In this way, the adaptation layer can indirectly call the functions of the interface layer, but the interface layer cannot call the functions of the adaptation layer. +![](../public_sys-resources/icon-note.gif)**NOTE**
    The core layer can call the functions of the interface layer and uses the hook to call functions of the adaptation layer. In this way, the adaptation layer can indirectly call the functions of the interface layer, but the interface layer cannot call the functions of the adaptation layer. **Figure 1** Unified service mode @@ -50,7 +49,7 @@ The DAC module is divided into the following layers: ### Constraints -Currently, the DAC module supports only the kernels (LiteOS) of mini and small systems. +The DAC module supports only the kernel (LiteOS-A) for mini and small systems. ## Usage Guidelines @@ -60,11 +59,11 @@ The DAC module converts digital signals into analog signals in the form of curre ### Available APIs -The table below describes the APIs of the DAC module. For more details, see API Reference. +The following table describes the APIs of the DAC module. For more information about the APIs, see **//drivers/hdf_core/framework/include/platform/dac_if.h**. **Table 1** DAC driver APIs -| API | Description | +| API | Description | | ------------------------------------------------------------------ | ------------ | | DevHandle DacOpen(uint32_t number) | Opens a DAC device. | | void DacClose(DevHandle handle) | Closes a DAC device. | @@ -72,12 +71,11 @@ The table below describes the APIs of the DAC module. For more details, see API ### How to Develop -The figure below shows the general development process. +The following figure illustrates how to use DAC APIs. **Figure 2** Process of using DAC APIs - -![](figures/using-DAC-process.png) +![Process of using a DAC](figures/using-DAC-process.png "Process of using a DAC") #### Opening a DAC Device @@ -93,13 +91,13 @@ DevHandle DacOpen(uint32_t number); | --------- | ---------------- | | number | DAC device number. | | **Return Value**| **Description** | -| NULL | The operation failed. | +| NULL | The operation fails. | | Device handle | The operation is successful. The handle of the DAC device opened is returned.| -Example: Open device 1 of the two DAC devices (numbered 0 and 1) in the system. +Open device 1 of the two DAC devices (numbered 0 and 1) in the system. ```c++ -DevHandle dacHandle = NULL; /* DAC device handle / +DevHandle dacHandle = NULL; // DAC device handle. /* Open DAC device 1. */ dacHandle = DacOpen(1); @@ -109,7 +107,7 @@ if (dacHandle == NULL) { } ``` -#### Setting a Target DA Value +#### Setting a DA Value ```c++ int32_t DacWrite(DevHandle handle, uint32_t channel, uint32_t val); @@ -124,16 +122,16 @@ int32_t DacWrite(DevHandle handle, uint32_t channel, uint32_t val); | val | DA value to set. | | **Return Value**| **Description**| | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | ```c++ /* Write the target DA value through the DAC_CHANNEL_NUM channel. */ - ret = DacWrite(dacHandle, DAC_CHANNEL_NUM, val); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: tp DAC write reg fail!:%d", __func__, ret); - DacClose(dacHandle); - return -1; - } +ret = DacWrite(dacHandle, DAC_CHANNEL_NUM, val); +if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: tp DAC write reg fail!:%d", __func__, ret); + DacClose(dacHandle); + return -1; +} ``` #### Closing a DAC Device @@ -168,8 +166,8 @@ The procedure is as follows: You can obtain the operation result by printing the log information based on the **val**. ```c++ -#include "dac_if.h" /* Header file for DAC APIs */ -#include "hdf_log.h" /* Header file for log APIs */ +#include "dac_if.h" /* Header file for DAC APIs. */ +#include "hdf_log.h" /* Header file for log APIs. */ /* Define device 0, channel 1. */ #define DAC_DEVICE_NUM 0 diff --git a/en/device-dev/driver/driver-platform-dac-develop.md b/en/device-dev/driver/driver-platform-dac-develop.md index 61ddbd1caf..f033d06226 100644 --- a/en/device-dev/driver/driver-platform-dac-develop.md +++ b/en/device-dev/driver/driver-platform-dac-develop.md @@ -6,7 +6,10 @@ A digit-to-analog converter (DAC) is a device that converts a digital signal into an analog signal in electronics. -The DAC module supports development of digital-to-analog conversion. The DAC module provides the output channel for the process control computer system. It connects to the executor to implement automatic control of the production process. It is also an important module in the analog-to-digital converter using feedback technologies. +The DAC module supports development of digital-to-analog conversion. The DAC devices can be used to: + +- Provide the output channel for the process control computer system and connect to the executor to implement automatic control of the production process. +- Serve as an important module in the analog-to-digital converter using feedback technologies. ### Basic Concepts @@ -28,54 +31,96 @@ The DAC module supports development of digital-to-analog conversion. The DAC mod ### Working Principles -In the Hardware Driver Foundation (HDF), the DAC module uses the unified service mode for API adaptation. In this mode, a device service is used as the DAC manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The figure below shows the unified service mode. +In the Hardware Driver Foundation (HDF), the DAC module uses the unified service mode for API adaptation. In this mode, a device service is used as the DAC manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The DAC module uses the unified service mode, as shown in Figure 1. The DAC module is divided into the following layers: - -- Interface layer: provides APIs for opening or closing a device and writing data. +- Interface layer: provides the capabilities of opening and closing a device and writing data. - Core layer: provides the capabilities of binding, initializing, and releasing devices. -- Adaptation layer: implements other functions. +- Adaptation layer: implements hardware-related functions, such as controller initialization. -![](../public_sys-resources/icon-note.gif) **NOTE**
    The core layer can call the APIs of the interface layer and uses hooks to call APIs of the adaptation layer. In this way, the adaptation layer can indirectly call the APIs of the interface layer, but the interface layer cannot call the APIs of the adaptation layer. +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. -**Figure 1** Unified service mode +>![](../public_sys-resources/icon-note.gif) **NOTE**
    The core layer can call the APIs of the interface layer and uses hooks to call APIs of the adaptation layer. In this way, the adaptation layer can indirectly call the APIs of the interface layer, but the interface layer cannot call the APIs of the adaptation layer. + +**Figure 1** Unified service mode ![](figures/unified-service-mode.png "DAC unified service mode") ### Constraints -Currently, the DAC module supports only the kernels (LiteOS) of mini and small systems. +The DAC module supports only the kernel (LiteOS-A) for mini and small systems. ## Development Guidelines ### When to Use -The DAC module is used for digital-to-analog conversion, audio output, and motor control. The DAC driver is used when the digital signals input by the DAC module are converted into analog signals to output. +The DAC module is used for digital-to-analog conversion, audio output, and motor control. The DAC driver is used when the digital signals input by the DAC module are converted into analog signals to output. Before using DAC devices with OpenHarmony, you need to adapt the DAC driver to OpenHarmony. The following describes how to do it. ### Available APIs -The **DacMethod** structure is used to call the DAC driver APIs. +To enable the upper layer to successfully operate the hardware by calling the DAC APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/dac/dac_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. -**DacMethod**: +Definitions of **DacMethod** and **DacLockMethod**: ```c++ struct DacMethod { - // Hook used to write data. + /* Hook used to write data. */ int32_t (*write)(struct DacDevice *device, uint32_t channel, uint32_t val); - // Hook used to start a DAC device. + /* Hook used to start a DAC device. */ int32_t (*start)(struct DacDevice *device); - // Hook used to stop a DAC device + /* Hook used to stop a DAC device. */ int32_t (*stop)(struct DacDevice *device); }; + +struct DacLockMethod { + int32_t (*lock)(struct DacDevice *device); + void (*unlock)(struct DacDevice *device); +}; +``` +At the adaptation layer, **DacMethod** must be implemented, and **DacLockMethod** can be implemented based on service requirements. The core layer provides the default **DacLockMethod**, in which a spinlock is used to protect the critical section. + +```c +static int32_t DacDeviceLockDefault(struct DacDevice *device) +{ + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return HDF_ERR_INVALID_OBJECT; + } + return OsalSpinLock(&device->spin); +} + +static void DacDeviceUnlockDefault(struct DacDevice *device) +{ + if (device == NULL) { + HDF_LOGE("%s: device is null", __func__); + return; + } + (void)OsalSpinUnlock(&device->spin); +} + +static const struct DacLockMethod g_dacLockOpsDefault = { + .lock = DacDeviceLockDefault, + .unlock = DacDeviceUnlockDefault, +}; ``` -**Table 1** Description of the DacMethod structure +If spinlock cannot be used, you can use another type of lock to implement **DacLockMethod**. The implemented **DacLockMethod** will replace the default **DacLockMethod**. + +**Table 1** Hook functions in **DacMethod** | Function| Input Parameter | Output Parameter| Return Value | Description | | -------- | ------------------------------------------------------------ | ---- | ------------------ | -------------- | | write | **device**: structure pointer to the DAC controller at the core layer.
    **channel**: channel ID, which is of the uint32_t type.
    **val**: data to write, which is of the uint32_t type.| - | HDF_STATUS| Writes the target digit-to-analog (DA) value.| | start | **device**: structure pointer to the DAC controller at the core layer. | - | HDF_STATUS| Starts a DAC device. | -| stop | **device**: structure pointer to the DAC controller at the core layer. | - | HDF_STATUS| Stops a DAC device. | +| stop | **device**: structure pointer to the DAC controller at the core layer. | - | HDF_STATUS| Stops a DAC device. | + +**Table 2** Functions in **DacLockMethod** + +| Function| Input Parameter| Output Parameter| Return Value| Description| +| -------- | -------- | -------- | -------- | -------- | +| lock | **device**: structure pointer to the DAC device object at the core layer.| -| HDF_STATUS| Acquires the critical section lock.| +| unlock | **device**: structure pointer to the DAC device object at the core layer.| -| HDF_STATUS| Releases the critical section lock.| + ### How to Develop @@ -86,31 +131,31 @@ The DAC module adaptation procedure is as follows: 3. Instantiate the core layer APIs. 4. Debug the driver. -### Development Example +### Example -The following presents the information required for implementing device functions. +The following uses the Hi3516D V300 driver **//device/soc/hisilicon/common/platform/dac/dac_hi35xx.c** as an example to describe how to perform the DAC driver adaptation. -1. Instantiate the driver entry. +1. Instantiate the driver entry. + + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the module name must be the same as that in **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. + + Generally, the HDF calls **Init()** to load the driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. - The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - - Generally, the HDF calls the **Init()** function to load the driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. - ```c++ static struct HdfDriverEntry g_dacDriverEntry = { .moduleVersion = 1, .Init = VirtualDacInit, .Release = VirtualDacRelease, .moduleName = "virtual_dac_driver",// (Mandatory) The value must be the same as that in the .hcs file. - }; - HDF_INIT(g_dacDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. + }; + HDF_INIT(g_dacDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. ``` - + 2. Configure attribute files. - - Add the device node description to the **vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. + - Add the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. - The device attribute values are closely related to the driver implementation and the default values or restriction ranges of the **DacDevice** members at the core layer, for example, the number of device channels and the maximum transmission speed. + The device attribute values are closely related to the driver implementation and the default values or value ranges of the **DacDevice** members at the core layer, for example, the number of device channels and the maximum transmission speed. In the unified service mode, the first device node in the **device_info.hcs** file must be the DAC manager. The parameters must be set as follows: @@ -123,14 +168,14 @@ The following presents the information required for implementing device function | serviceName | **HDF_PLATFORM_DAC_MANAGER** | | deviceMatchAttr | Reserved. | - Configure DAC controller information from the second node. This node specifies a type of DAC controllers rather than a specific DAC controller. In this example, there is only one DAC device. If there are multiple DAC devices, you need to add the **deviceNode** information to the **device_info** file and add the corresponding device attributes to the **dac_config** file. + Configure DAC controller information from the second node. This node specifies a type of DAC controllers rather than a specific DAC controller. In this example, there is only one DAC device. If there are multiple DAC devices, add the **deviceNode** information to the **device_info.hcs** file and add the corresponding device attributes to the **dac_config.hcs** file for each device. - **device_info.hcs** configuration example: + **device_info.hcs** example: ```hcs root { device_dac :: device { - // device0 is a DAC manager. + /* device0 is the DAC manager. */ device0 :: deviceNode { policy = 0; priority = 52; @@ -139,21 +184,23 @@ The following presents the information required for implementing device function moduleName = "HDF_PLATFORM_DAC_MANAGER"; } } - // dac_virtual is a DAC controller. + /* dac_virtual is a DAC controller. */ dac_virtual :: deviceNode { policy = 0; priority = 56; permission = 0644; moduleName = "virtual_dac_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. serviceName = "VIRTUAL_DAC_DRIVER"; // (Mandatory) Unique name of the service published by the driver. - deviceMatchAttr = "virtual_dac"; // (Mandatory) Controller private data, which must be same as that of the corresponding controller in dac_config.hcs. + deviceMatchAttr = "virtual_dac"; // (Mandatory) Controller private data, which must be same as that of the controller in dac_config.hcs. } } ``` - Configure the **dac_test_config.hcs** file. - Add a file, for example, **vendor/vendor_hisilicon/hispark_taurus/hdf_config/hdf_test/dac_test_config.hcs** and configure driver parameters. + Add a file to the directory of a product to configure driver parameters. For example, add the **vendor/hisilicon/hispark_taurus/hdf_config/hdf_test/dac_test_config.hcs** file for the hispark_taurus development board. + + The configuration parameters are as follows: ```hcs root { @@ -162,304 +209,352 @@ The following presents the information required for implementing device function match_attr = "virtual_dac"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. template dac_device { deviceNum = 0; // Device number. - validChannel = 0x1; // Valid channel 1. - rate = 20000; // Transmission speed. + validChannel = 0x1; // Valid channel 1. + rate = 20000; // Transmission speed. } device_0 :: dac_device { deviceNum = 0; // Device number. - validChannel = 0x2; // Valid channel 2. + validChannel = 0x2; // Valid channel 2. } } } } ``` -3. Instantiate the core layer APIs. - - - Initializing the **DacDevice** object - - Initialize the **DacDevice** member in the **VirtualDacParseAndInit** function. + After the **dac_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. + + For example, if the path of **dac_config.hcs** is **device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/dac/dac_config.hcs**, add the following statement to **hdf.hcs** of the product: + + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/dac/dac_config.hcs" // Relative path of the file. + ``` + +3. Instantiate the core layer APIs. + + - Initialize the **DacDevice** object. + + Initialize **DacDevice** in the **VirtualDacParseAndInit** function. ```c++ - // Custom structure of the virtual driver + /* Custom structure of the virtual driver. */ struct VirtualDacDevice { - // DAC device structure + /* DAC device structure. */ struct DacDevice device; - // DAC device number + /* DAC device number. */ uint32_t deviceNum; - // Valid channel + /* Valid channel. */ uint32_t validChannel; - // DAC rate + /* DAC rate. */ uint32_t rate; }; - // Parse and initialize the **DacDevice** object of the core layer. + /* Parse and initialize the **DacDevice** object of the core layer. */ static int32_t VirtualDacParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) { - // Define the return values. + /* Define the return values. */ int32_t ret; - // Pointer to the virtual DAC device + /* Pointer to the virtual DAC device. */ struct VirtualDacDevice *virtual = NULL; (void)device; - // Allocate space for this pointer. + /* Allocate space for this pointer. */ virtual = (struct VirtualDacDevice *)OsalMemCalloc(sizeof(*virtual)); if (virtual == NULL) { - // If the value is null, return an error code. + /* If the value is null, return an error code. */ HDF_LOGE("%s: Malloc virtual fail!", __func__); return HDF_ERR_MALLOC_FAIL; } - // Read the content of the attribute file. + /* Read the attribute file. */ ret = VirtualDacReadDrs(virtual, node); if (ret != HDF_SUCCESS) { - // Failed to read the file. + /* Failed to read the file. */ HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); - // Release the space for the virtual DAC device. + /* Release the space for the virtual DAC device. */ OsalMemFree(virtual); - // Set the pointer to 0. + /* Set the pointer to 0. */ virtual = NULL; return ret; } - // Initialize the pointer to the virtual DAC device. + /* Initialize the pointer to the virtual DAC device. */ VirtualDacDeviceInit(virtual); - // Initialize the priv object in DacDevice. + /* Initialize the priv object in DacDevice. */ virtual->device.priv = (void *)node; - // Initialize the devNum object in DacDevice. + /* Initialize the devNum object in DacDevice. */ virtual->device.devNum = virtual->deviceNum; - // Initialize the ops object in DacDevice. + /* Initialize the ops object in DacDevice. */ virtual->device.ops = &g_method; - // Add a DAC device. + /* Add a DAC device. */ ret = DacDeviceAdd(&virtual->device); if (ret != HDF_SUCCESS) { - // Failed to add the device. + /* Failed to add the device. */ HDF_LOGE("%s: add Dac controller failed! ret = %d", __func__, ret); - // Release the space for the virtual DAC device. + /* Release the space for the virtual DAC device. */ OsalMemFree(virtual); - // Set this pointer to null. + /* Set this pointer to null. */ virtual = NULL; return ret; } return HDF_SUCCESS; - } - ``` - - - Defining a custom structure - - The custom structure holds parameters and data for the driver. Define the custom structure based on the function parameters of the device. The **DacTestReadConfig()** provided by the HDF reads the values in the **dac_config.hcs** file, and **DeviceResourceIface()** initializes the custom structure and passes some important parameters, such as the device number and bus number, to the **DacDevice** object at the core layer. - - ```c++ - struct VirtualDacDevice { - struct DacDevice device;// (Mandatory) Control object at the core layer. For details, see the description below. - uint32_t deviceNum; // (Mandatory) Device number. - uint32_t validChannel; // (Mandatory) Valid channel. - uint32_t rate; // (Mandatory) Sampling rate. - }; - - // DacDevice is the core layer controller structure. The Init() function assigns values to the members of DacDevice. - struct DacDevice { - const struct DacMethod *ops; - OsalSpinlock spin; // Spinlock. - uint32_t devNum; // Device number. - uint32_t chanNum; // Device channel number. - const struct DacLockMethod *lockOps; - void *priv; - }; - ``` - - - Instantiating **DacDevice** in **DacMethod**. - - The **VirtualDacWrite**, **VirtualDacStop**, and **VirtualDacStart** functions are instantiated in **dac_virtual.c**. + } + ``` + + + + - Define a custom structure. + + The custom structure holds parameters and data for the driver. Define the custom structure based on the function parameters of the device. The **DacTestReadConfig()** provided by the HDF reads the values in the **dac_config.hcs** file, and **DeviceResourceIface()** initializes the custom structure and passes some important parameters, such as the device number and bus number, to the **DacDevice** object at the core layer. + + ```c++ + struct VirtualDacDevice { + struct DacDevice device;// (Mandatory) Control object at the core layer. For details, see the description below. + uint32_t deviceNum; // (Mandatory) Device number. + uint32_t validChannel; // (Mandatory) Valid channel. + uint32_t rate; // (Mandatory) Sampling rate. + }; + + /* DacDevice is the core layer controller structure. The Init() function assigns values to the members of DacDevice. */ + struct DacDevice { + const struct DacMethod *ops; + OsalSpinlock spin; // Spinlock. + uint32_t devNum; // Device number. + uint32_t chanNum; // Device channel number. + const struct DacLockMethod *lockOps; + void *priv; + }; + ``` + + + - Instantiate **DacDevice** in **DacMethod**. + + The **VirtualDacWrite**, **VirtualDacStop**, and **VirtualDacStart** functions are instantiated in **dac_virtual.c**. + ```c++ static const struct DacMethod g_method = { .write = VirtualDacWrite, // Write data to a DAC device. - .stop = VirtualDacStop, // Stop a DAC device. + .stop = VirtualDacStop, // Stop a DAC device. .start = VirtualDacStart, // Start a DAC device. }; ``` - - ![](../public_sys-resources/icon-note.gif) **NOTE**
    - For details about **DacMethod**, see [Available APIs](#available-apis). - - - **Init** function - - **Input parameter**: - - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. - - **Return value**: - - **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. - - | Status | Description | - | ---------------------- | ------------- | - | HDF_ERR_INVALID_OBJECT | Invalid controller object.| - | HDF_ERR_INVALID_PARAM | Invalid parameter. | - | HDF_ERR_MALLOC_FAIL | Failed to allocate memory. | - | HDF_ERR_IO | I/O error. | - | HDF_SUCCESS | Transmission successful. | - | HDF_FAILURE | Transmission failed. | - - **Function description**: - - Initializes the custom structure object and **DacDevice**, and calls the **AdcDeviceAdd** function at the core layer. - - ```c++ - static int32_t VirtualDacParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) - { - // Define return value parameters. - int32_t ret; - // Pointer to the DAC device. - struct VirtualDacDevice *virtual = NULL; - (void)device; - // Allocate memory of the specified size. - virtual = (struct VirtualDacDevice *)OsalMemCalloc(sizeof(*virtual)); - if (virtual == NULL) { - // Failed to allocate memory. - HDF_LOGE("%s: Malloc virtual fail!", __func__); - return HDF_ERR_MALLOC_FAIL; - } - // Read the node parameters in the .hcs file. - ret = VirtualDacReadDrs(virtual, node); - if (ret != HDF_SUCCESS) { - // Failed to read the node data. - HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); - goto __ERR__; - } - // Initialize the DAC device pointer. - VirtualDacDeviceInit(virtual); - // Pass private node data. - virtual->device.priv = (void *)node; - // Pass the device number. - virtual->device.devNum = virtual->deviceNum; - // Pass the method. - virtual->device.ops = &g_method; - // Add a DAC device. - ret = DacDeviceAdd(&virtual->device); - if (ret != HDF_SUCCESS) { - // Failed to add the DAC device. - HDF_LOGE("%s: add Dac controller failed! ret = %d", __func__, ret); - goto __ERR__; - } - // The DAC device is added. - return HDF_SUCCESS; - __ERR__: - // If the pointer is null - if (virtual != NULL) { - // Release the memory. - OsalMemFree(virtual); - // Set this pointer to null. - virtual = NULL; - } - - return ret; - } - - static int32_t VirtualDacInit(struct HdfDeviceObject *device) - { - // Define return value parameters. - int32_t ret; - // Child node of the device structure - const struct DeviceResourceNode *childNode = NULL; - // Check the input parameter pointer. - if (device == NULL || device->property == NULL) { - // The input parameter pointer is null. - HDF_LOGE("%s: device or property is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - // The input parameter pointer is not null. - ret = HDF_SUCCESS; - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - // Parse the child node. - ret = VirtualDacParseAndInit(device, childNode); - if (ret != HDF_SUCCESS) { - // Failed to parse the child node. - break; - } - } - // The child node is parsed. - return ret; - } - ``` + + >![](../public_sys-resources/icon-note.gif) **NOTE**
    For details about **DacMethod**, see [Available APIs](#available-apis). + - - **Release** function - - **Input parameter**: - - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. - - **Return value**: - - No value is returned. - - **Function description**: + + - Implement the **Init** function. + + Input parameter: + + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. + + Return value: + + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. + + | Status | Description | + | ---------------------- | -------------------------- | + | HDF_ERR_INVALID_OBJECT | Invalid controller object. | + | HDF_ERR_INVALID_PARAM | Invalid parameter. | + | HDF_ERR_MALLOC_FAIL | Failed to allocate memory. | + | HDF_ERR_IO | I/O error. | + | HDF_SUCCESS | Transmission successful. | + | HDF_FAILURE | Transmission failed. | + - Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. - >![](../public_sys-resources/icon-note.gif) **NOTE** - > - >All forced conversion operations for obtaining the corresponding object can be successful only when **Init()** has the corresponding value assignment operations. - + Function description: + + Initializes the custom structure object and **DacDevice**, and calls the **DacDeviceAdd** function at the core layer. + ```c++ - static void VirtualDacRemoveByNode(const struct DeviceResourceNode *node) - { - // Define return value parameters. - int32_t ret; - // Define the DAC device number. - int16_t devNum; - // Pointer to the DacDevice structure. - struct DacDevice *device = NULL; - // Pointer to the VirtualDacDevice structure. - struct VirtualDacDevice *virtual = NULL; - // Pointer to the DeviceResourceIface structure. - struct DeviceResourceIface *drsOps = NULL; - // Obtain device resources through the instance entry. - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - // Check the input parameter pointer. - if (drsOps == NULL || drsOps->GetUint32 == NULL) { - // The pointer is null. - HDF_LOGE("%s: invalid drs ops fail!", __func__); - return; - } - // Obtain data of the devNum node. - ret = drsOps->GetUint16(node, "devNum", (uint16_t *)&devNum, 0); - if (ret != HDF_SUCCESS) { - // Failed to obtain node data. - HDF_LOGE("%s: read devNum fail!", __func__); - return; - } - // Obtain the DAC device number. - device = DacDeviceGet(devNum); - // Check whether the DAC device number and data are null. - if (device != NULL && device->priv == node) { - // Release the DAC device number if the device data is null. - DacDevicePut(device); - // Remove the DAC device number. - DacDeviceRemove(device); - virtual = (struct VirtualDacDevice *)device; - // Release the virtual pointer. - OsalMemFree(virtual); + static int32_t VirtualDacParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) + { + /* Define the return values. */ + int32_t ret; + /* Pointer to the VirtualDacDevice structure. */ + struct VirtualDacDevice *virtual = NULL; + (void)device; + /* Allocate memory of the specified size. */ + virtual = (struct VirtualDacDevice *)OsalMemCalloc(sizeof(*virtual)); + if (virtual == NULL) { + /* Failed to allocate memory. */ + HDF_LOGE("%s: Malloc virtual fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + /* Read the node parameters in the HCS. The function definition is as follows. */ + ret = VirtualDacReadDrs(virtual, node); + if (ret != HDF_SUCCESS) { + /* Failed to read the node data. */ + HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); + goto __ERR__; + } + /* Initialize the DAC device pointer. */ + VirtualDacDeviceInit(virtual); + /* Pass in the private data of the node. */ + virtual->device.priv = (void *)node; + /* Pass in the device number. */ + virtual->device.devNum = virtual->deviceNum; + /* Pass in the method. */ + virtual->device.ops = &g_method; + /* Add a DAC device. */ + ret = DacDeviceAdd(&virtual->device); + if (ret != HDF_SUCCESS) { + /* Failed to add the DAC device. */ + HDF_LOGE("%s: add Dac controller failed! ret = %d", __func__, ret); + goto __ERR__; + } + /* The DAC device is added successfully. */ + return HDF_SUCCESS; + __ERR__: + /* If the pointer is null */ + if (virtual != NULL) { + / Release the memory. */ + OsalMemFree(virtual); + /* Set this pointer to null. */ + virtual = NULL; + } + + return ret; } - return; - } - - static void VirtualDacRelease(struct HdfDeviceObject *device) - { - // Define the child node structure pointer to the DeviceResourceNode. - const struct DeviceResourceNode *childNode = NULL; - // Check whether the input parameter pointer is null. - if (device == NULL || device->property == NULL) { - // The input parameter pointer is null. - HDF_LOGE("%s: device or property is NULL", __func__); - return; + + static int32_t VirtualDacInit(struct HdfDeviceObject *device) + { + /* Define return values. */ + int32_t ret; + /* Child node of the device structure. */ + const struct DeviceResourceNode *childNode = NULL; + /* Check the input parameter pointer. */ + if (device == NULL || device->property == NULL) { + /* The input parameter pointer is null. */ + HDF_LOGE("%s: device or property is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + /* The input parameter pointer is not null. */ + ret = HDF_SUCCESS; + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + /* Parse the child node. */ + ret = VirtualDacParseAndInit(device, childNode); + if (ret != HDF_SUCCESS) { + /* Failed to parse the child node. */ + break; + } + } + /* The child node is parsed. */ + return ret; } - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - // Remove the DAC through the node. - VirtualDacRemoveByNode(childNode); + static int32_t VirtualDacReadDrs(struct VirtualDacDevice *virtual, const struct DeviceResourceNode *node) + { + struct DeviceResourceIface *drsOps = NULL; + + /* Obtain the drsOps method. */ + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetUint16 == NULL) { + HDF_LOGE("%s: Invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + /* Read the configuration parameters in sequence and fill them in the structure. */ + if (drsOps->GetUint32(node, "deviceNum", &virtual->deviceNum, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read deviceNum fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "validChannel", &virtual->validChannel, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read validChannel fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint32(node, "rate", &virtual->rate, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read rate fail!", __func__); + return HDF_ERR_IO; + } + return HDF_SUCCESS; } - } ``` + + + - Implement the **Release** function. + + Input parameter: + + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. + + Return value: + + No value is returned. + + Function description: + + Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + + >![](../public_sys-resources/icon-note.gif) **NOTE**
    + > + >All forced conversion operations for obtaining the corresponding object can be successful only when **Init()** has the corresponding value assignment operations. + + + + ```c++ + static void VirtualDacRemoveByNode(const struct DeviceResourceNode *node) + { + /* Define return values. */ + int32_t ret; + /*Define the DAC device number. */ + int16_t devNum; + /* Pointer to the DacDevice structure. */ + struct DacDevice *device = NULL; + // Pointer to the VirtualDacDevice structure. */ + struct VirtualDacDevice *virtual = NULL; + /* Pointer to the DeviceResourceIface structure. */ + struct DeviceResourceIface *drsOps = NULL; + /* Obtain device resources through the instance entry. */ + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + /* Check the input parameter pointer. */ + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + /* The pointer is null. */ + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return; + } + /* Obtain data of the devNum node. */ + ret = drsOps->GetUint16(node, "devNum", (uint16_t *)&devNum, 0); + if (ret != HDF_SUCCESS) { + /* The information fails to be obtained. */ + HDF_LOGE("%s: read devNum fail!", __func__); + return; + } + /* Obtain the DAC device number. */ + device = DacDeviceGet(devNum); + /* Check whether the DAC device number and data are null. */ + if (device != NULL && device->priv == node) { + /* Release the DAC device number if the device data is null. */ + DacDevicePut(device); + /* Remove the DAC device number. */ + DacDeviceRemove(device); + virtual = (struct VirtualDacDevice *)device; + /* Release the virtual pointer. */ + OsalMemFree(virtual); + } + return; + } + + static void VirtualDacRelease(struct HdfDeviceObject *device) + { + /* Define the child node structure pointer to the DeviceResourceNode. */ + const struct DeviceResourceNode *childNode = NULL; + /* Check whether the input parameter pointer is null. */ + if (device == NULL || device->property == NULL) { + /* The input parameter pointer is null. */ + HDF_LOGE("%s: device or property is NULL", __func__); + return; + } + + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + /* Remove the DAC by node. */ + VirtualDacRemoveByNode(childNode); + } + } + ``` + + + + 4. Debug the driver. (Optional) Verify the basic functions of the new driver, for example, check whether the test cases are successful after the driver is loaded. diff --git a/en/device-dev/driver/driver-platform-gpio-des.md b/en/device-dev/driver/driver-platform-gpio-des.md index 4368a41d46..34d6279ffa 100644 --- a/en/device-dev/driver/driver-platform-gpio-des.md +++ b/en/device-dev/driver/driver-platform-gpio-des.md @@ -1,281 +1,368 @@ # GPIO - ## Overview +### Function + A general-purpose input/output (GPIO) controller manages all GPIO pins by group. Each group of GPIO pins is associated with one or more registers. The GPIO controller manages the pins by reading data from and writing data to the registers. -The GPIO APIs define a set of standard functions for performing operations on GPIO pins, including: +The GPIO module provides APIs for performing operations on GPIO pins, including: - Setting the pin direction, which can be input or output (high impedance is not supported currently) - - Reading and writing the pin level, which can be low or high +- Setting an interrupt service routine (ISR) function and interrupt trigger mode for a pin +- Enabling or disabling interrupts for a pin + +### Basic Concepts + +A GPIO can be used as an input, an output, or both, and is controllable by software. + +- GPIO input -- Setting the interrupt service routine (ISR) function and interrupt trigger mode for a pin + When a GPIO is used as an input, it reads the level state (high or low) of each pin. Common input modes include analog input, floating input, pull-up input, and pull-down input. -- Enabling or disabling pin interrupts +- GPIO output + When a GPIO is used as an output, it sets the pin level. Common output modes include open-drain output, push-pull output, multiplexed open-drain output, and multiplexed push-pull output. -## Available APIs +### Working Principles - **Table 1** GPIO driver APIs +In the Hardware Driver Foundation (HDF), the GPIO module uses the unified service mode for API adaptation. In this mode, a device service is used as the GPIO manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The following figure shows the unified service mode. -| Category| Description| -| -------- | -------- | -| GPIO read/write| - **GpioRead**: reads the pin level.
    - **GpioWrite**: writes the pin level.| -| GPIO settings| - **GpioSetDir**: sets the pin direction.
    - **GpioGetDir**: obtains the pin direction.| -| GPIO interrupt settings| - **GpioSetIrq**: sets the ISR function for a GPIO pin.
    - **GpioUnsetIrq**: cancels the ISR function setting for a GPIO pin.
    - **GpioEnableIrq**: enables interrupts for a pin.
    - **GpioDisableIrq**: disables interrupts for a pin.| +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. -> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    -> All APIs described in this document can be called only in kernel mode. +The GPIO module is divided into the following layers: +- Interface layer: provides APIs for operating GPIO pins. +- Core layer: provides the capabilities of adding and removing the GPIO controller and managing GPIO pins. This layer interacts with the adaptation layer through hook functions to allow the GPIO chip drivers of different vendors to quickly access the HDF. +- Adaptation layer: instantiates hook functions to implement specific features. + +**Figure 1** Unified service mode + +![](figures/unified-service-mode.png) ## Usage Guidelines +### When to Use -### How to Use +As a concept at the software layer, GPIO is used to manage GPIO pin resources. You can use the GPIO APIs to control pins. -The figure below shows the general GPIO development process. In the APIs, a GPIO pin is specified by the pin number. +### Available APIs -**Figure 1** Using GPIO driver APIs +The following table describes the APIs provided by the GPIO module. -![](figures/using-GPIO-process.png "using-gpio-process.png") +**Table 1** GPIO driver APIs +| API | Description | +| ------------------------------------------------------------ | ------------------------------ | +| GpioGetByName(const char *gpioName) | Obtains the GPIO pin number. | +| int32_t GpioRead(uint16_t gpio, uint16_t *val) | Reads the level of a GPIO pin. | +| int32_t GpioWrite(uint16_t gpio, uint16_t val) | Writes the level of a GPIO pin. | +| int32_t GpioGetDir(uint16_t gpio, uint16_t *dir) | Obtains the direction of a GPIO pin. | +| int32_t GpioSetDir(uint16_t gpio, uint16_t dir) | Sets the direction for a GPIO pin. | +| int32_t GpioUnsetIrq(uint16_t gpio, void *arg); | Cancels the ISR function for a GPIO pin. | +| int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg) | Sets an ISR function for a GPIO pin. | +| int32_t GpioEnableIrq(uint16_t gpio) | Enables interrupts for a GPIO pin. | +| int32_t GpioDisableIrq(uint16_t gpio) | Disables interrupts for a GPIO pin. | -### Determining the GPIO Pin Number +>![](../public_sys-resources/icon-note.gif) **NOTE** +> +>All GPIO APIs described in this document can be used in kernel mode and user mode. -The method for determining the GPIO pin number varies depending on the GPIO controller model, parameters, and controller driver of the system on chip (SoC). +### How to Develop -- Hi3516D V300 - A controller manages 12 groups of GPIO pins. Each group contains 8 GPIO pins. The group number ranges from 0 to 11. +The fillowing figure shows how to use the GPIO APIs to manage pins. In the APIs, a GPIO pin is identified by the pin number. - GPIO pin number = GPIO group number x Number of GPIO pins in each group + Offset in the group +**Figure 2** Using GPIO driver APIs - Example: +![](figures/using-GPIO-process.png) - GPIO pin number of GPIO10_3 = 10 x 8 + 3 = 83 - -- Hi3518E V300 - A controller manages 10 groups of GPIO pins. Each group contains 10 GPIO pins. The group number ranges from 0 to 9. +#### Determining the GPIO Pin Number - GPIO pin number = GPIO group number x Number of GPIO pins in each group + Offset in the group +You can determine the GPIO pin number in either of the following ways: - Example: - - GPIO pin number of GPIO7_3 = 7 x 10 + 3 = 73 +- Calculating the pin number based on the system on chip (SoC) + The method for determining the GPIO pin number varies depending on the GPIO controller model, parameters, and controller driver of the SoC. -### Using APIs to Operate GPIO Pins + - Hi3516D V300 -- Set the GPIO pin direction. - Before performing read/write operations on a GPIO pin, call **GpioSetDir()** to set the pin direction. + A controller manages 12 groups of GPIO pins. Each group contains 8 GPIO pins. The group number ranges from 0 to 11. - ```c - int32_t GpioSetDir(uint16_t gpio, uint16_t dir); - ``` + GPIO pin number = GPIO group number x Number of GPIO pins in each group + Offset in the group - **Table 2** Description of GpioSetDir - - | **Parameter**| **Description**| - | -------- | -------- | - | gpio | GPIO pin number.| - | dir | Direction to set.| - | **Return Value**| **Description**| - | 0 | The operation is successful.| - | Negative value| The operation failed.| + Example: -- Read or write the pin level. + GPIO pin number of GPIO10_3 = 10 x 8 + 3 = 83 - Call **GpioRead()** to read the level of a GPIO pin. + - Hi3518E V300 - ```c - int32_t GpioRead(uint16_t gpio, uint16_t *val); - ``` + A controller manages 10 groups of GPIO pins. Each group contains 10 GPIO pins. The group number ranges from 0 to 9. - **Table 3** Description of GpioRead - - | **Parameter**| **Description**| - | -------- | -------- | - | gpio | GPIO pin number.| - | val | Pointer to the level to read.| - | **Return Value**| **Description**| - | 0 | The operation is successful.| - | Negative value| The operation failed.| + GPIO pin number = GPIO group number x Number of GPIO pins in each group + Offset in the group - Call **GpioWrite()** to write the level for a GPIO pin. + Example: + + GPIO pin number of GPIO7_3 = 7 x 10 + 3 = 73 + +- Obtaining the pin number based on the pin alias + + Use **GpioGetByName()** to obtain the pin number based on the pin alias. The global pin number is returned. ```c - int32_t GpioWrite(uint16_t gpio, uint16_t val); - ``` - - **Table 4** Description of GpioWrite - - | **Parameter**| **Description**| - | -------- | -------- | - | gpio | GPIO pin number.| - | val | Level to write.| - | **Return Value**| **Description**| - | 0 | The operation is successful.| - | Negative value| The operation failed.| - - Sample code: - - - ``` - int32_t ret; - uint16_t val; - /* Set the direction of GPIO pin 3 to output. */ - ret = GpioSetDir(3, GPIO_DIR_OUT); - if (ret != 0) { - HDF_LOGE("GpioSerDir: failed, ret %d\n", ret); - return; - } - /* Write the low level GPIO_VAL_LOW for GPIO pin 3. */ - ret = GpioWrite(3, GPIO_VAL_LOW); - if (ret != 0) { - HDF_LOGE("GpioWrite: failed, ret %d\n", ret); - return; - } - /* Set the direction of GPIO pin 6 to input. */ - ret = GpioSetDir(6, GPIO_DIR_IN); - if (ret != 0) { - HDF_LOGE("GpioSetDir: failed, ret %d\n", ret); - return; - } - /* Read the level of GPIO pin 6. */ - ret = GpioRead(6, &val); + GpioGetByName(const char *gpioName); ``` -- Set the ISR function for a GPIO pin. +#### Setting the GPIO Pin Direction - Call **GpioSetIrq()** to set the ISR function for a GPIO pin. +Before performing read/write operations on a GPIO pin, use **GpioSetDir()** to set the pin direction. - ```c - int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg); - ``` - - **Table 5** Description of GpioSetIrq - - | **Parameter**| **Description**| - | -------- | -------- | - | gpio | GPIO pin number.| - | mode | Interrupt trigger mode.| - | func | ISR function to set.| - | arg | Pointer to the parameters passed to the ISR function.| - | **Return Value**| **Description**| - | 0 | The operation is successful.| - | Negative value| The operation failed.| - - > ![icon-caution.gif](../public_sys-resources/icon-caution.gif) **CAUTION**
    - > Only one ISR function can be set for a GPIO pin. If **GpioSetIrq** is called repeatedly, the previous IRS function will be replaced. - - If the ISR function is no longer required, call **GpioUnsetIrq()** to cancel it. +```c +int32_t GpioSetDir(uint16_t gpio, uint16_t dir); +``` - ```c - int32_t GpioUnsetIrq(uint16_t gpio, void *arg); - ``` +**Table 2** Description of GpioSetDir - **Table 6** Description of GpioUnsetIrq - - | **Parameter**| **Description**| - | -------- | -------- | - | gpio | GPIO pin number.| - | arg | Pointer to the GPIO interrupt parameters.| - | **Return Value**| **Description**| - | 0 | The operation is successful.| - | Negative value| The operation failed.| +| **Parameter** | **Description** | +| ---------- | ------------------ | +| gpio | GPIO pin number.| +| dir | Direction to set. | +| **Return Value**| **Description** | +| 0 | The operation is successful. | +| Negative value | The operation failed. | - After the ISR function is set, call **GpioEnableIrq()** to enable interrupts for the GPIO pin. +Example: Set the direction of GPIO pin 3 to output. - ```c - int32_t GpioEnableIrq(uint16_t gpio); - ``` +```c +int32_t ret; - **Table 7** Description of GpioEnableIrq - - | **Parameter**| **Description**| - | -------- | -------- | - | gpio | GPIO pin number.| - | **Return Value**| **Description**| - | 0 | The operation is successful.| - | Negative value| The operation failed.| +ret = GpioSetDir(3, GPIO_DIR_OUT); // Set GPIO pin 3 as an output. +if (ret != 0) { + HDF_LOGE("GpioSerDir: failed, ret %d\n", ret); + return ret; +} +``` - > ![icon-caution.gif](../public_sys-resources/icon-caution.gif) **CAUTION**
    - > The configured ISR function can be responded only after interrupts are enabled for the GPIO pin. +#### Obtaining the GPIO Pin Direction - You can call **GpioDisableIrq** to disable interrupts for the pin. +Use **GpioGetDir()** to obtain the GPIO pin direction. - ```c - int32_t GpioDisableIrq(uint16_t gpio); - ``` +```c +int32_t GpioGetDir(uint16_t gpio, uint16_t *dir); +``` - **Table 8** Description of GpioDisableIrq - - | **Parameter**| **Description**| - | -------- | -------- | - | gpio | GPIO pin number.| - | **Return Value**| **Description**| - | 0 | The operation is successful.| - | Negative value| The operation failed.| +**Table 3** Description of GpioGetDir - Sample code: +| **Parameter** | **Description** | +| ---------- | ------------------ | +| gpio | GPIO pin number.| +| dir | Pointer to the direction value obtained. | +| **Return Value**| **Description** | +| 0 | The operation is successful. | +| Negative value | The operation failed. | - - ``` - /* Set the ISR function. */ - int32_t MyCallBackFunc(uint16_t gpio, void *data) - { - HDF_LOGI("%s: gpio:%u interrupt service in! data=%p\n", __func__, gpio, data); - return 0; - } - - int32_t ret; - /* Set the ISR function to MyCallBackFunc, with input parameter of NULL and the interrupt trigger mode of rising edge. */ - ret = GpioSetIrq(3, OSAL_IRQF_TRIGGER_RISING, MyCallBackFunc, NULL); - if (ret != 0) { - HDF_LOGE("GpioSetIrq: failed, ret %d\n", ret); - return; - } - - /* Enable interrupts for GPIO pin 3. */ - ret = GpioEnableIrq(3); - if (ret != 0) { - HDF_LOGE("GpioEnableIrq: failed, ret %d\n", ret); - return; - } - - /* Disable interrupts for GPIO pin 3. */ - ret = GpioDisableIrq(3); - if (ret != 0) { - HDF_LOGE("GpioDisableIrq: failed, ret %d\n", ret); - return; - } - - /* Cancel the ISR function setting for GPIO pin 3. */ - ret = GpioUnsetIrq(3, NULL); - if (ret != 0) { - HDF_LOGE("GpioUnSetIrq: failed, ret %d\n", ret); - return; - } - ``` +Example: Obtain the direction of GPIO pin 3. +```c +int32_t ret; +uin16_t dir; -## Example +ret = GpioGetDir(3, &dir); // Obtain the direction of GPIO pin 3. +if (ret != 0) { + HDF_LOGE("GpioGetDir: failed, ret %d\n", ret); + return ret; +} +``` -The procedure is as follows: +#### Reading the GPIO Pin Level -1. Select an idle GPIO pin, for example, pin GPIO10\_3 on a Hi3516D V300 development board. +Use **GpioRead()** to read the level of a GPIO pin. - The pin number is 83. +```c +int32_t GpioRead(uint16_t gpio, uint16_t *val); +``` - GPIO pin number of GPIO10_3 = 10 x 8 + 3 = 83 +**Table 4** Description of GpioRead - You can select an idle GPIO pin as required. +| **Parameter** | **Description** | +| ---------- | -------------------- | +| gpio | GPIO pin number. | +| val | Pointer to the level value read. | +| **Return Value**| **Description** | +| 0 | The operation is successful. | +| Negative value | The operation failed. | -2. Set the ISR function for the pin, with the trigger mode of rising edge and failing edge. - -3. Write high and low levels to the pin alternately, and observe the execution of the ISR function. +Example: Read the level of GPIO pin 3. + +```c +int32_t ret; +uint16_t val; + +ret = GpioRead(3, &val); // Read the level of GPIO pin 3. +if (ret != 0) { + HDF_LOGE("GpioRead: failed, ret %d\n", ret); + return ret; +} +``` + +#### Writing the GPIO Pin Level + +Use **GpioWrite()** to write the level for a GPIO pin. + +```c +int32_t GpioWrite(uint16_t gpio, uint16_t val); +``` + +**Table 5** Description of GpioWrite + +| **Parameter** | **Description** | +| ---------- | ------------------ | +| gpio | GPIO pin number.| +| val | Level to write. | +| **Return Value**| **Description** | +| 0 | The operation is successful. | +| Negative value | The operation failed. | + +Example: Write a low level value to the register of GPIO pin 3. + +```c +int32_t ret; + +ret = GpioWrite(3, GPIO_VAL_LOW); // Write a low level value to the register of GPIO pin 3. +if (ret != 0) { + HDF_LOGE("GpioRead: failed, ret %d\n", ret); + return ret; +} ``` + +#### Setting an ISR Function for a GPIO Pin + +Use **GpioSetIrq()** to set an ISR function for a GPIO pin. + +```c +int32_t GpioSetIrq(uint16_t gpio, uint16_t mode, GpioIrqFunc func, void *arg); +``` + +**Table 6** Description of GpioSetIrq + +| **Parameter** | **Description** | +| ---------- | ------------------------ | +| gpio | GPIO pin number. | +| mode | Interrupt trigger mode. | +| func | ISR function to set. | +| arg | Pointer to the parameters passed to the ISR function.| +| **Return Value**| **Description** | +| 0 | The operation is successful. | +| Negative value | The operation failed. | + +> ![icon-caution.gif](../public_sys-resources/icon-caution.gif) **CAUTION**
    +> Only one ISR function can be set for a GPIO pin. If **GpioSetIrq** is called repeatedly, the previous IRS function will be replaced. + +#### Canceling the ISR Function for a GPIO Pin + +If the ISR function is no longer required, call **GpioUnsetIrq()** to cancel it. + +```c +int32_t GpioUnsetIrq(uint16_t gpio, void *arg); +``` + +**Table 7** Description of GpioUnsetIrq + +| **Parameter** | **Description** | +| ---------- | -------------- | +| gpio | GPIO pin number. | +| arg | Pointer to the GPIO interrupt parameters. | +| **Return Value**| **Description**| +| 0 | The operation is successful. | +| Negative value | The operation failed. | + +#### Enabling Interrupts for a GPIO Pin + +After the ISR function is set, call **GpioEnableIrq()** to enable interrupts for the GPIO pin. + +```c +int32_t GpioEnableIrq(uint16_t gpio); +``` + +**Table 8** Description of GpioEnableIrq + +| **Parameter** | **Description** | +| ---------- | -------------- | +| gpio | GPIO pin number. | +| **Return Value**| **Description**| +| 0 | The operation is successful. | +| Negative value | The operation failed. | + +> ![icon-caution.gif](../public_sys-resources/icon-caution.gif) **CAUTION**
    +> The configured ISR function can be responded only after interrupts are enabled for the GPIO pin. + +#### Disabling Interrupts for a GPIO Pin + +Use **GpioDisableIrq()** to disable interrupts for a pin. + +```c +int32_t GpioDisableIrq(uint16_t gpio); +``` +**Table 9** Description of GpioDisableIrq + +| **Parameter** | **Description** | +| ---------- | -------------- | +| gpio | GPIO pin number. | +| **Return Value**| **Description**| +| 0 | The operation is successful. | +| Negative value | The operation failed. | + +Example: + +```c +/* Set an ISR function. */ +int32_t MyCallBackFunc(uint16_t gpio, void *data) +{ + HDF_LOGI("%s: gpio:%u interrupt service in data\n", __func__, gpio); + return 0; +} + +int32_t ret; +/* Set the ISR function to MyCallBackFunc, with input parameter of NULL and the interrupt trigger mode of rising edge. */ +ret = GpioSetIrq(3, OSAL_IRQF_TRIGGER_RISING, MyCallBackFunc, NULL); +if (ret != 0) { + HDF_LOGE("GpioSetIrq: failed, ret %d\n", ret); + return ret; +} + +/* Enable interrupts for GPIO pin 3. */ +ret = GpioEnableIrq(3); +if (ret != 0) { + HDF_LOGE("GpioEnableIrq: failed, ret %d\n", ret); + return ret; +} + +/* Disable interrupts for GPIO pin 3. */ +ret = GpioDisableIrq(3); +if (ret != 0) { + HDF_LOGE("GpioDisableIrq: failed, ret %d\n", ret); + return ret; +} + +/* Cancel the ISR function for GPIO pin 3. */ +ret = GpioUnsetIrq(3, NULL); +if (ret != 0) { + HDF_LOGE("GpioUnSetIrq: failed, ret %d\n", ret); + return ret; +} +``` + +## Example + +The following example shows how to trigger an interrupt for a GPIO pin. The procedure is as follows: + +1. Select an idle GPIO pin, for example, pin GPIO10_3 on a Hi3516D V300 development board. The pin number of GPIO10_3 is 83. You can select an idle GPIO pin as required. +2. Set an ISR function for the pin, with the interrupt trigger mode of rising edge and falling edge. +3. Write high and low levels to the pin alternately, and observe the execution of the ISR function. + +Sample code: + +```c #include "gpio_if.h" #include "hdf_log.h" #include "osal_irq.h" @@ -286,7 +373,7 @@ static uint32_t g_irqCnt; /* ISR function */ static int32_t TestCaseGpioIrqHandler(uint16_t gpio, void *data) { - HDF_LOGE("%s: irq triggered! on gpio:%u, data=%p", __func__, gpio, data); + HDF_LOGE("%s: irq triggered! on gpio:%u, in data", __func__, gpio); g_irqCnt++; /* If the ISR function is triggered, the global interrupt counter is incremented by 1. */ return GpioDisableIrq(gpio); } diff --git a/en/device-dev/driver/driver-platform-gpio-develop.md b/en/device-dev/driver/driver-platform-gpio-develop.md index 4e8b93552c..76077fc64d 100644 --- a/en/device-dev/driver/driver-platform-gpio-develop.md +++ b/en/device-dev/driver/driver-platform-gpio-develop.md @@ -1,216 +1,255 @@ # GPIO - ## Overview -In the Hardware Driver Foundation (HDF), the general-purpose input/output (GPIO) module uses the service-free mode for API adaptation. The service-free mode applies to the devices that do not provide user-mode APIs or the operating system (OS) that does not distinguish the user mode and the kernel mode. In the service-free mode, **DevHandle** (a void pointer) directly points to the kernel-mode address of the device object. +### Function - **Figure 1** Service-free mode +A general-purpose input/output (GPIO) controller manages all GPIO pins by group. Each group of GPIO pins is associated with one or more registers. The GPIO controller manages the pins by reading data from and writing data to the registers. - ![](figures/service-free-mode.png "service-free-mode") +### Basic Concepts +A GPIO can be used as an input, an output, or both, and is controllable by software. -## Available APIs +- GPIO input -**GpioMethod**: + When a GPIO is used as an input, it reads the level state (high or low) of each pin. Common input modes include analog input, floating input, pull-up input, and pull-down input. +- GPIO output -``` + When a GPIO is used as an output, it sets the pin level. Common output modes include open-drain output, push-pull output, multiplexed open-drain output, and multiplexed push-pull output. + +### Working Principles + +In the Hardware Driver Foundation (HDF), the GPIO module uses the unified service mode for API adaptation. In this mode, a device service is used as the GPIO manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The following figure shows the unified service mode. + +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. + +The GPIO module is divided into the following layers: + +- Interface layer: provides APIs for operating GPIO pins. +- Core layer: provides the capabilities of adding and removing a GPIO controller and managing GPIO pins. This layer interacts with the adaptation layer through hook functions to allow the GPIO chip drivers of different vendors to quickly access the HDF. +- Adaptation layer: instantiates hook functions to implement specific features. + +**Figure 1** Unified service mode + +![](figures/unified-service-mode.png) + +## Development Guidelines + +### When to Use + +As a concept at the software layer, GPIO is used to manage GPIO pin resources. You can use the APIs provided by the GPIO module to control pins. Before using your GPIO driver with OpenHarmony, you need to perform GPIO driver adaptation. The following sections describe how to adapt the GPIO driver. + +### Available APIs + +To enable the upper layer to successfully operate GPIO pins by calling the GPIO APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/gpio/gpio_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +**GpioMethod**: + +```c struct GpioMethod { - int32_t (*request)(struct GpioCntlr *cntlr, uint16_t local);// Reserved - int32_t (*release)(struct GpioCntlr *cntlr, uint16_t local);// Reserved - int32_t (*write)(struct GpioCntlr *cntlr, uint16_t local, uint16_t val); - int32_t (*read)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *val); - int32_t (*setDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t dir); - int32_t (*getDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *dir); - int32_t (*toIrq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *irq);// Reserved - int32_t (*setIrq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t mode, GpioIrqFunc func, void *arg); - int32_t (*unsetIrq)(struct GpioCntlr *cntlr, uint16_t local); - int32_t (*enableIrq)(struct GpioCntlr *cntlr, uint16_t local); - int32_t (*disableIrq)(struct GpioCntlr *cntlr, uint16_t local); + int32_t (*request)(struct GpioCntlr *cntlr, uint16_t local); // Reserved. + int32_t (*release)(struct GpioCntlr *cntlr, uint16_t local); // Reserved. + int32_t (*write)(struct GpioCntlr *cntlr, uint16_t local, uint16_t val); + int32_t (*read)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *val); + int32_t (*setDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t dir); + int32_t (*getDir)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *dir); + int32_t (*toIrq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t *irq); // Reserved. + int32_t (*setIrq)(struct GpioCntlr *cntlr, uint16_t local, uint16_t mode, GpioIrqFunc func, void *arg); + int32_t (*unsetIrq)(struct GpioCntlr *cntlr, uint16_t local); + int32_t (*enableIrq)(struct GpioCntlr *cntlr, uint16_t local); + int32_t (*disableIrq)(struct GpioCntlr *cntlr, uint16_t local); } ``` - **Table 1** Description of the callback functions in GpioMethod +**Table 1** Hook functions in **GpioMethod** | Function| Input Parameter| Output Parameter| Return Value| Description| | -------- | -------- | -------- | -------- | -------- | -| write | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.
    **val**: input level, which is of the uint16_t type.| –| HDF_STATUS| Writes the level of a GPIO pin.| -| read | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| **val**: pointer to the output level, which is of the uint16_t type.| HDF_STATUS| Reads the level of a GPIO pin.| +| write | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.
    **val**: level value to write, which is of the uint16_t type.| –| HDF_STATUS| Writes the level for a GPIO pin.| +| read | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| **val**: level value read, which is of the uint16_t type.| HDF_STATUS| Reads the level of a GPIO pin.| | setDir | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.
    **dir**: pin direction to set, which is of the uint16_t type.| –| HDF_STATUS| Sets the direction (input or output) for a GPIO pin.| -| getDir | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| **dir**: pointer to the pin direction obtained, which is of the uint16_t type.| HDF_STATUS| Obtains the input or output direction of a GPIO pin.| -| setIrq | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.
    **mode**: trigger mode, which can be edge or level of the uint16_t type.
    **func**: pointer to the interrupt request (IRQ) handler.
    **arg**: void pointer to the input parameters of the IRQ handler.| –| HDF_STATUS| Sets an IRQ for a GPIO pin.| -| unsetIrq | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| –| HDF_STATUS| Cancels the IRQ settings for a GPIO pin.| +| getDir | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| **dir**: pin direction read, which is of the uint16_t type.| HDF_STATUS| Obtains the input or output direction of a GPIO pin.| +| setIrq | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.
    **mode**: interrupt trigger mode, which can be edge or level. The value is of the uint16_t type.
    **func**: pointer to the interrupt request (IRQ) handler.
    **arg**: void pointer to the input parameters of the IRQ handler.| –| HDF_STATUS| Sets an IRQ function for a GPIO pin.| +| unsetIrq | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| –| HDF_STATUS| Cancels the IRQ function for a GPIO pin.| | enableIrq | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| –| HDF_STATUS| Enables interrupts for a GPIO pin.| | disableIrq | **cntlr**: structure pointer to the GPIO controller at the core layer.
    **local**: GPIO port number, which is of the uint16_t type.| –| HDF_STATUS| Disables interrupts for a GPIO pin.| +### How to Develop -## How to Develop - -The GPIO controller manages all pins by group. The related parameters are defined in attribute files. You need to instantiate the driver entry and APIs for the vendor driver to access the HDF. - -The GPIO module adaptation involves the following steps: +The GPIO module adaptation procedure is as follows: 1. Instantiate the driver entry. - - Instantiate the **HdfDriverEntry** structure. - - Call **HDF_INIT** to register the **HdfDriverEntry** instance with the HDF. - 2. Configure attribute files. - - Add the **deviceNode** information to the **device_info.hcs** file. - - (Optional) Add the **gpio_config.hcs** file. - 3. Instantiate the GPIO controller object. - - Initialize **GpioCntlr**. - - Instantiate **GpioMethod** in the **GpioCntlr** object. - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > For details about the functions in **GpioMethod**, see [Available APIs](#available-apis). - 4. Debug the driver. - - (Optional) For new drivers, verify the basic functions, such as the GPIO status control and response to interrupts. +### Example -## Development Example +The following uses the **//device_soc_hisilicon/common/platform/gpio/gpio_hi35xx.c** driver of the Hi3516D V300 development board as an example to describe the driver adaptation. -The following uses **gpio_hi35xx.c** as an example to present the information required for implementing device functions. +1. Instantiate the driver entry. -1. Instantiate the driver entry. - - The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf\_device\_desc.h**), and the value of **moduleName** must be the same as that in **device\_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers are collected to form a segment address space similar to an array for the upper layer to invoke. Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. GPIO driver entry example: - - ``` + + ```c struct HdfDriverEntry g_gpioDriverEntry = { - .moduleVersion = 1, - .Bind = Pl061GpioBind, // Bind does not need to be implemented for GPIO. It is an empty method in this example. You can add related operations as required. - .Init = Pl061GpioInit, // See the Init function. - .Release = Pl061GpioRelease, // See the Release function. - .moduleName = "hisi_pl061_driver",// (Mandatory) The value must be the same as that of moduleName in the .hcs file. + .moduleVersion = 1, + .Bind = Pl061GpioBind, // GPIO does not use the Bind function, which is an empty implementation in this example. You can add related operations as required. + ..Init = Pl061GpioInit, // See the Init function. + .Release = Pl061GpioRelease, // See the Release function. + .moduleName = "hisi_pl061_driver", // (Mandatory) The value must be the same as that of moduleName in the .hcs file. }; - // Call HDF_INIT to register the driver entry with the HDF. - HDF_INIT(g_gpioDriverEntry); + HDF_INIT(g_gpioDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. ``` - -2. Add the **deviceNode** information to the **device_info.hcs** file, and configure the device attributes in the **gpio_config.hcs** file. - - The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the default values or value ranges of the **GpioCntlr** members at the core layer. - In this example, there is only one GPIO controller. If there are multiple GPIO controllers, you need to add the **deviceNode** information to the **device_info** file and add the corresponding device attributes to the **gpio_config** file for each controller. - - - **device_info.hcs** configuration example - - ``` + +2. Configure attribute files. + + Add the deviceNode information to the **device_info.hcs** file. The deviceNode information is closely related to driver entry registration. In this example, there is only one GPIO controller. If there are multiple GPIO controllers, add the deviceNode information to the **device_info.hcs** file for each controller. The device attribute values are closely related to the default values or value ranges of the **GpioCntlr** members at the core layer, and are configured in **gpio_config.hcs**. + + - **device_info.hcs** example + + Add the deviceNode information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. + + ```c root { - device_info { - platform :: host { - hostName = "platform_host"; - priority = 50; - device_gpio :: device { - device0 :: deviceNode { - policy = 0; // No service is published. - priority = 10; // Driver startup priority. - permission = 0644; // Permission to create device nodes for the driver. - moduleName = "hisi_pl061_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. - deviceMatchAttr = "hisilicon_hi35xx_pl061"; // (Mandatory) Private data of the controller. The value must be the same as the controller information in gpio_config.hcs. - // Add private information about all controllers in this file. + device_info { + platform :: host { + hostName = "platform_host"; + priority = 50; + device_gpio :: device { + device0 :: deviceNode { + policy = 0; // The value 0 indicates that no service needs to be published. + priority = 10; // Driver startup priority. + permission = 0644; // Permission for the device node created. + oduleName = "hisi_pl061_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. + deviceMatchAttr = "hisilicon_hi35xx_pl061"; // (Mandatory) Private data of the controller. The value must be the same as the controller information in gpio_config.hcs. + // The private information about all controllers is in the gpio_config.hcs file. + } + } } } - } - } } ``` - - **gpio_config.hcs** configuration example - - ``` + + - **gpio_config.hcs** example + + Configure the device attributes in the **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/gpio/gpio_config.hcs** file. The parameters are as follows: + + ```c root { - platform { - gpio_config { - controller_0x120d0000 { - match_attr = "hisilicon_hi35xx_pl061"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. - groupNum = 12; // (Mandatory) GPIO group number. - bitNum = 8; // (Mandatory) Number of GPIO pins in each group. - regBase = 0x120d0000; // (Mandatory) Physical base address. - regStep = 0x1000; // (Mandatory) Register offset step. - irqStart = 48; // (Mandatory) Enable interrupts. - irqShare = 0; // (Mandatory) Whether to share an interrupt. - } + platform { + gpio_config { + controller_0x120d0000 { + match_attr = "hisilicon_hi35xx_pl061"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. + groupNum = 12; // (Mandatory) GPIO group number. + bitNum = 8; // (Mandatory) Number of GPIO pins in each group. + regBase = 0x120d0000; // (Mandatory) Physical base address. + regStep = 0x1000; // (Mandatory) Register offset step. + irqStart = 48; // (Mandatory) Enable interrupts. + irqShare = 0; // (Mandatory) Whether to share interrupt. The value 1 means to share interrupt; the value 0 means the opposite. + } + ... + } } } - } ``` -3. Initialize the **GpioCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Init** and **Release**) to instantiate **GpioMethod** in **GpioCntlr** (so that the underlying driver functions can be called). - - Defining a custom structure + After the **gpio_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. + + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/gpio/gpio_config.hcs" // Relative path of the gpio_config.hcs file. + ``` + +3. Instantiate the GPIO controller object. + + Initialize the **GpioCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **GpioMethod** in **GpioCntlr** (so that the underlying driver functions can be called). + + - Define a custom structure. To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **gpio_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the GPIO group number and the number of pins, to the **GpioCntlr** object at the core layer. - - ``` - struct Pl061GpioCntlr { - struct GpioCntlr cntlr;// (Mandatory) Control object at the core layer. The details are as follows: - volatile unsigned char *regBase;// (Mandatory) Register base address. - uint32_t phyBase; // (Mandatory) Physical base address. - uint32_t regStep; // (Mandatory) Register offset step. - uint32_t irqStart; // (Mandatory) Enable interrupts. - uint16_t groupNum; // (Mandatory) Parameter of the GPIO port number. - uint16_t bitNum; // (Mandatory) Parameter of the GPIO port number. - uint8_t irqShare; // (Mandatory) Whether to share an interrupt. - struct Pl061GpioGroup *groups; // (Optional) Set based on the actual requirements. + ```c + // Define the GPIO group information. + struct Pl061GpioGroup { + struct GpioCntlr cntlr // (Mandatory) Control object of the core layer. + volatile unsigned char *regBase; // (Mandatory) Register base address. + unsigned int index; + unsigned int irq; + OsalIRQHandle irqFunc; + OsalSpinlock lock; + uint32_t irqSave; + bool irqShare; + struct PlatformDumper *dumper; + char *dumperName; }; - struct Pl061GpioGroup { // Register address, IRQ number and function, and lock. - volatile unsigned char *regBase; - unsigned int index; - unsigned int irq; - OsalIRQHandle irqFunc; - OsalSpinlock lock; + + struct Pl061GpioData { + volatile unsigned char *regBase; // (Mandatory) Register base address. + uint32_t phyBase; // (Mandatory) Physical base address. + uint32_t regStep;; // (Mandatory) Register offset step. + uint32_t irqStart; // (Mandatory) Enable interrupts. + uint16_t groupNum; // (Mandatory) Parameter of the GPIO port number. + uint16_t bitNum; // (Mandatory) Parameter of the GPIO port number. + uint8_t irqShare; // (Mandatory) Whether to share interrupt. + struct Pl061GpioGroup *groups; // (Optional) Set as required. + struct GpioInfo *gpioInfo; + void *priv; }; + struct GpioInfo { + struct GpioCntlr *cntlr; + char name[GPIO_NAME_LEN]; + OsalSpinlock spin; + uint32_t irqSave; + struct GpioIrqRecord *irqRecord; + }; // GpioCntlr is the controller structure at the core layer. The Init function assigns values to the members of GpioCntlr. struct GpioCntlr { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - struct GpioMethod *ops; - struct DListHead list; - OsalSpinlock spin; - uint16_t start; - uint16_t count; - struct GpioInfo *ginfos; - void *priv; + struct PlatformDevice device; + struct GpioMethod *ops; + uint16_t start; + uint16_t count; + struct GpioInfo *ginfos; + bool isAutoAlloced; + void *priv; }; ``` - - Instantiating the **GpioMethod** structure in **GpioCntlr** (other members are initialized by **Init**) - - ``` - // The members of the GpioMethod structure are all callbacks. You need to implement the functions listed in Table 1. + - Instantiate the **GpioMethod** structure in **GpioCntlr**. + + ```c + // The members of the GpioMethod structure are hook functions. You need to implement them by referring to Table 1. static struct GpioMethod g_method = { .request = NULL, .release = NULL, - .write = Pl061GpioWrite, // Write the pin level. - .read = Pl061GpioRead, // Read the pin level. - .setDir = Pl061GpioSetDir, // Set the pin direction. - .getDir = Pl061GpioGetDir, // Obtain the pin direction. - .toIrq = NULL, - .setIrq = Pl061GpioSetIrq, // Set an IRQ for a pin. Skip it if this capability is not available. - .unsetIrq = Pl061GpioUnsetIrq, // Cancel the IRQ settings for a pin. Skip it if this capability is not available. - .enableIrq = Pl061GpioEnableIrq, // Enable interrupts for a pin. Skip it if this capability is not available. - .disableIrq = Pl061GpioDisableIrq,// Disable interrupts for a pin. Skip it if this capability is not available. + .write = Pl061GpioWrite, // Write the pin level. + .read = Pl061GpioRead, // Read the pin level. + .setDir = Pl061GpioSetDir, // Set the pin direction. + .getDir = Pl061GpioGetDir, // Obtain the pin direction. + .toIrq = NULL, + .setIrq = Pl061GpioSetIrq, // Set an IRQ function for a pin. Skip it if this capability is not available. + .unsetIrq = Pl061GpioUnsetIrq, // Cancel the IRQ function for a pin. Skip it if this capability is not available. + .enableIrq = Pl061GpioEnableIrq, // Enable interrupts for a pin. Skip it if this capability is not available. + .disableIrq = Pl061GpioDisableIrq, // Disable interrupts for a pin. Skip it if this capability is not available. }; ``` - - **Init** function + - Implement the **Init** function. - **Input parameter**: + Input parameters: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. - **Return value**: + Return value: - **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. + + **Table 2** HDF_STATUS - **Table 2** HDF_STATUS - | Status| Description| | -------- | -------- | | HDF_ERR_INVALID_OBJECT | Invalid controller object.| @@ -220,76 +259,185 @@ The following uses **gpio_hi35xx.c** as an example to present the information re | HDF_SUCCESS | Initialization successful.| | HDF_FAILURE | Initialization failed.| - **Function description**: + Function description: - Initializes the custom structure object and **GpioCntlr**, calls the **GpioCntlrAdd** function at the core layer, and (optional) connects to the virtual file system (VFS). + Initializes the custom structure object and **GpioCntlr**, calls **GpioCntlrAdd()** at the core layer, and (optional) accesses the virtual file system (VFS). + ```c + static struct Pl061GpioData g_pl061 = { + .groups = NULL, + .groupNum = PL061_GROUP_MAX, + .bitNum = PL061_BIT_MAX, + }; + + static int32_t Pl061GpioInitGroups(struct Pl061GpioData *pl061) + { + int32_t ret; + uint16_t i; + struct Pl061GpioGroup *groups = NULL; + + if (pl061 == NULL) { + return HDF_ERR_INVALID_PARAM; + } + + groups = (struct Pl061GpioGroup *)OsalMemCalloc(sizeof(*groups) * pl061->groupNum); + if (groups == NULL) { + return HDF_ERR_MALLOC_FAIL; + } + pl061->groups = groups; + + for (i = 0; i < pl061->groupNum; i++) { + // Initialize related information. + groups[i].index = i; + groups[i].regBase = pl061->regBase + i * pl061->regStep; + groups[i].irq = pl061->irqStart + i; + groups[i].irqShare = pl061->irqShare; + groups[i].cntlr.start = i * pl061->bitNum; + groups[i].cntlr.count = pl061->bitNum; + groups[i].cntlr.ops = &g_method; + groups[i].cntlr.ginfos = &pl061->gpioInfo[i * pl061->bitNum]; + + if ((ret = OsalSpinInit(&groups[i].lock)) != HDF_SUCCESS) { + goto ERR_EXIT; + } + + ret = GpioCntlrAdd(&groups[i].cntlr); // Add related information to the HDF core. + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: err add controller(%hu:%hu):%d", __func__, + groups[i].cntlr.start, groups[i].cntlr.count, ret); + (void)OsalSpinDestroy(&groups[i].lock); + goto ERR_EXIT; + } + } + return HDF_SUCCESS; + + ERR_EXIT: + while (i-- > 0) { + GpioCntlrRemove(&groups[i].cntlr); + (void)OsalSpinDestroy(&groups[i].lock); + } + pl061->groups = NULL; + OsalMemFree(groups); + return ret; + } - ``` static int32_t Pl061GpioInit(struct HdfDeviceObject *device) { - ... - struct Pl061GpioCntlr *pl061 = &g_pl061;// Use static global variables to complete initialization. - // static struct Pl061GpioCntlr g_pl061 = { - // .groups = NULL, - // .groupNum = PL061_GROUP_MAX, - // .bitNum = PL061_BIT_MAX, - //}; - ret = Pl061GpioReadDrs(pl061, device->property);// Use the attribute values read from the gpio_config.hcs file to initialize the members of the custom structure object. - ... - pl061->regBase = OsalIoRemap(pl061->phyBase, pl061->groupNum * pl061->regStep);// Create address mapping. - ... - ret = Pl061GpioInitCntlrMem(pl061); // Allocate memory. - ... - pl061->cntlr.count = pl061->groupNum * pl061->bitNum;// (Mandatory) Calculate the number of pins. - pl061->cntlr.priv = (void *)device->property; // (Mandatory) Store device attributes. - pl061->cntlr.ops = &g_method; // (Mandatory) Attach the GpioMethod instance. - pl061->cntlr.device = device; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and GpioCntlr. - ret = GpioCntlrAdd(&pl061->cntlr); // (Mandatory) Call this function to fill the structure of the core layer. The driver accesses the platform core layer only after a success signal is returned. - ... - Pl061GpioDebugCntlr(pl061); - #ifdef PL061_GPIO_USER_SUPPORT // (Optional) Access the user-level VFS if it is supported. - if (GpioAddVfs(pl061->bitNum) != HDF_SUCCESS) { - HDF_LOGE("%s: add vfs fail!", __func__); - } - #endif - ... + int32_t ret; + struct Pl061GpioData *pl061 = &g_pl061; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property null!", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + pl061->gpioInfo = OsalMemCalloc(sizeof(struct GpioInfo) * GPIO_MAX_INFO_NUM); + if (pl061->gpioInfo == NULL) { + HDF_LOGE("%s: failed to calloc gpioInfo!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = Pl061GpioReadDrs(pl061, device->property);// Use the attribute values read from the gpio_config.hcs file to initialize the members of the custom structure object. + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: failed to read drs:%d", __func__, ret); + return ret; + } + + if (pl061->groupNum > PL061_GROUP_MAX || pl061->groupNum <= 0 || + pl061->bitNum > PL061_BIT_MAX || pl061->bitNum <= 0) { + HDF_LOGE("%s: err groupNum:%hu, bitNum:%hu", __func__, pl061->groupNum, pl061->bitNum); + return HDF_ERR_INVALID_PARAM; + } + + pl061->regBase = OsalIoRemap(pl061->phyBase, pl061->groupNum * pl061->regStep);// Create address mapping. + if (pl061->regBase == NULL) { + HDF_LOGE("%s: err remap phy:0x%x", __func__, pl061->phyBase); + return HDF_ERR_IO; + } + + ret = Pl061GpioInitGroups(pl061); // Initialize the group information and add it to the HDF core layer. + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: err init groups:%d", __func__, ret); + OsalIoUnmap((void *)pl061->regBase); + pl061->regBase = NULL; + return ret; + } + pl061->priv = (void *)device->property; + device->priv = (void *)pl061; + Pl061GpioDebug(pl061); + + #ifdef PL061_GPIO_USER_SUPPORT + if (GpioAddVfs(pl061->bitNum) != HDF_SUCCESS) { + HDF_LOGE("%s: add vfs fail!", __func__); + } + #endif + HDF_LOGI("%s: dev service:%s init success!", __func__, HdfDeviceGetServiceName(device)); + return HDF_SUCCESS; } ``` - - **Release** function - **Input parameter**: + - Implement the **Release** function. + + Input parameters: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs configuration file information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. - **Return value**: + Return value: No value is returned. - **Function description**: + Function description: - Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + Releases the memory and deletes the controller. This function assigns values to **Release()** in the driver entry structure. If the HDF fails to call **Init()** to initialize the driver, **Release()** is called to release driver resources. - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > All forced conversion operations for obtaining the corresponding object can be successful only when **Init()** has the corresponding value assignment operations. + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > + > All forced conversion operations for obtaining the corresponding object can be successful only when the **Init** function has the value assignment operations. - - ``` + ```c + static void Pl061GpioUninitGroups(struct Pl061GpioData *pl061) + { + uint16_t i; + struct Pl061GpioGroup *group = NULL; + + for (i = 0; i < pl061->groupNum; i++) { + group = &pl061->groups[i]; + GpioDumperDestroy(&pl061->groups[i]); + GpioCntlrRemove(&group->cntlr); // Remove from the HDF core layer. + } + + OsalMemFree(pl061->groups); + pl061->groups = NULL; + } + static void Pl061GpioRelease(struct HdfDeviceObject *device) { - struct GpioCntlr *cntlr = NULL; - struct Pl061GpioCntlr *pl061 = NULL; - ... - cntlr = GpioCntlrFromDevice(device);// (Mandatory) Obtain the control object at the core layer through forced conversion. - // return (device == NULL) ? NULL : (struct GpioCntlr *)device->service; - ... - #ifdef PL061_GPIO_USER_SUPPORT - GpioRemoveVfs();// Reverse operation of GpioAddVfs in Init. - #endif - GpioCntlrRemove(cntlr); // (Mandatory) Remove the device information and services from the core layer. - pl061 = ToPl061GpioCntlr(cntlr); // return (struct Pl061GpioCntlr *)cntlr; - Pl061GpioRleaseCntlrMem(pl061); // (Mandatory) Release the lock and memory. - OsalIoUnmap((void *)pl061->regBase);// (Mandatory) Unmap the addresses. - pl061->regBase = NULL; + struct Pl061GpioData *pl061 = NULL; + + HDF_LOGI("%s: enter", __func__); + if (device == NULL) { + HDF_LOGE("%s: device is null!", __func__); + return; + } + + #ifdef PL061_GPIO_USER_SUPPORT + GpioRemoveVfs(); + #endif + + pl061 = (struct Pl061GpioData *)device->priv; + if (pl061 == NULL) { + HDF_LOGE("%s: device priv is null", __func__); + return; + } + + Pl061GpioUninitGroups(pl061); + OsalMemFree(pl061->gpioInfo); + pl061->gpioInfo = NULL; + OsalIoUnmap((void *)pl061->regBase); + pl061->regBase = NULL; } ``` + +4. Debug the driver. + + (Optional) For new drivers, verify the basic functions, such as the GPIO status control and response to interrupts. diff --git a/en/device-dev/driver/driver-platform-i2c-des.md b/en/device-dev/driver/driver-platform-i2c-des.md index 9ba71d0900..2373c1e253 100644 --- a/en/device-dev/driver/driver-platform-i2c-des.md +++ b/en/device-dev/driver/driver-platform-i2c-des.md @@ -1,115 +1,78 @@ -# I2C +# I2C -## Overview -The Inter-Integrated Circuit \(I2C\) is a simple, bidirectional, and synchronous serial bus that uses merely two wires. +## Overview -In an I2C communication, one controller communicates with one or more devices through the serial data line \(SDA\) and serial clock line \(SCL\), as shown in the figure below. +### Function -I2C data transfer must begin with a **START** condition and end with a **STOP** condition. Data is transmitted byte-by-byte from the most significant bit to the least significant bit. +The Inter-Integrated Circuit (I2C) is a simple, bidirectional, and synchronous serial bus that uses merely two wires. It is widely used in short-distance communication due to simple connection and low cost. + +### Working Principles + +In I2C communication, one controller communicates with one or more devices through the serial data line (SDA) and serial clock line (SCL), as shown in the figure below. + +I2C data transfer must begin with a **START** condition and end with a **STOP** condition. Data is transmitted byte-by-byte from the most significant bit to the least significant bit. Each I2C node is recognized by a unique address and can serve as either a controller or a device. When the controller needs to communicate with a device, it writes the device address to the bus through broadcast. A device matching this address sends a response to set up a data transfer channel. -The I2C APIs define a set of common functions for I2C data transfer, including: +The I2C module provides a set of APIs for I2C data transfer, including: +- Opening or closing an I2C controller +- Performing custom transfer via a message array + + **Figure 1** I2C physical connection -- I2C controller management: opening or closing an I2C controller -- I2C message transfer: custom transfer by using a message array + ![](figures/physical-connection-diagram-for-i2c.png "physical-connection-diagram-for-i2c") -**Figure 1** Physical connection diagram for I2C
    ![](figures/physical-connection-diagram-for-i2c.png "physical-connection-diagram-for-i2c") +## Usage Guidelines +### When to Use -## Available APIs +The I2C is used in communication with the sensors, executors, and input/output devices that support the I2C protocol. -**Table 1** APIs available for the I2C driver +### Available APIs - - - - - - - - - - - - - - - - - - -

    Capability

    -

    Function

    -

    Description

    -

    I2C controller management

    -

    I2cOpen

    -

    Opens an I2C controller.

    -

    I2cClose

    -

    Closes an I2C controller.

    -

    I2C message transfer

    -

    I2cTransfer

    -

    Performs a custom transfer.

    -
    +The following table describes the APIs provided by the I2C module. For more information about the APIs, see **//drivers/hdf_core/framework/include/platform/i2c_if.h**. ->![](../public_sys-resources/icon-note.gif) **NOTE**
    ->All functions provided in this document can be called only in kernel mode. +**Table 1** I2C driver APIs -## Usage Guidelines +| API | Description| +| -------- | -------- | +| DevHandle I2cOpen(int16_t number) | Opens an I2C controller.| +| void I2cClose(DevHandle handle) | Closes an I2C controller.| +| int32_t I2cTransfer(DevHandle handle, struct I2cMsg \*msgs, int16_t count) | Transfers data.| -### How to Use +### How to Use -The figure below illustrates how to use the APIs. +The following figure illustrates how to use I2C APIs. -**Figure 2** Using I2C driver APIs +**Figure 2** Process of using I2C APIs ![](figures/using-I2C-process.png "process-of-using-an-i2c-device") -### Opening an I2C Controller - -Call the **I2cOpen()** function to open an I2C controller. - -DevHandle I2cOpen\(int16\_t number\); - -**Table 2** Description of I2cOpen - - - - - - - - - - - - - - - - - - - -

    Parameter

    -

    Description

    -

    number

    -

    I2C controller ID.

    -

    Return Value

    -

    Description

    -

    NULL

    -

    Failed to open the I2C controller.

    -

    Device handle

    -

    Handle of the I2C controller.

    -
    - -This example assumes that the system has eight I2C controllers \(numbered from 0 to 7\) and I2C controller 3 is to open. +#### Opening an I2C Controller + +Call **I2cOpen()** to open an I2C controller. + +```c +DevHandle I2cOpen(int16_t number); ``` -DevHandle i2cHandle = NULL; /* I2C controller handle */ -/* Open an I2C controller. */ + **Table 2** Description of I2cOpen + +| **Parameter**| **Description**| +| -------- | -------- | +| number | I2C controller number.| +| Return Value| **Description**| +| NULL | The operation fails.| +| Device handle| The operation is successful. The handle of the I2C controller opened is returned.| + +Example: Open controller 3 of the eight I2C controllers (numbered 0 and 7) in the system. + +```c +DevHandle i2cHandle = NULL; /* I2C controller handle. */ + +/* Open I2C controller 3. */ i2cHandle = I2cOpen(3); if (i2cHandle == NULL) { HDF_LOGE("I2cOpen: failed\n"); @@ -117,70 +80,45 @@ if (i2cHandle == NULL) { } ``` -### Performing I2C Communication - -Call the **I2cTransfer()** function to transfer messages. - -int32\_t I2cTransfer\(DevHandle handle, struct I2cMsg \*msgs, int16\_t count\); - -**Table 3** Description of I2cTransfer - - - - - - - - - - - - - - - - - - - - - - - - - -

    Parameter

    -

    Description

    -

    handle

    -

    Handle of an I2C controller.

    -

    msgs

    -

    Message array of the data to transfer.

    -

    count

    -

    Length of the message array.

    -

    Return Value

    -

    Description

    -

    Positive integer

    -

    Number of message structures that are successfully transmitted.

    -

    Negative value

    -

    Failed to perform the message transfer.

    -
    - -The type of an I2C message transfer is defined by **I2cMsg**. Each message structure indicates a read or write operation. Multiple read or write operations can be performed by using a message array. +#### Performing I2C Communication + +Call **I2cTransfer()** to transfer data. + +```c +int32_t I2cTransfer(DevHandle handle, struct I2cMsg \*msgs, int16_t count); ``` + + **Table 3** Description of I2cTransfer + +| **Parameter**| **Description**| +| -------- | -------- | +| handle | Handle of the I2C controller.| +| msgs | Pointer to the message array to transfer.| +| count | Number of messages in the message array to transfer.| +| Return Value| **Description**| +| Positive integer| The operation is successful. The number of messages that are successfully transferred is returned.| +| Negative value| The operation fails.| + +The I2C message type is defined by **I2cMsg**. Each message structure indicates a read or write operation. A message array specifies multiple read and write operations to perform. + +Example of read and write operations: + + +```c int32_t ret; uint8_t wbuff[2] = { 0x12, 0x13 }; uint8_t rbuff[2] = { 0 }; -struct I2cMsg msgs[2]; /* Custom message array for transfer */ -msgs[0].buf = wbuff; /* Data to write */ -msgs[0].len = 2; /* The length of the data to write is 2. */ -msgs[0].addr = 0x5A; /* The address of the device to write the data is 0x5A. */ -msgs[0].flags = 0; /* The flag is 0, indicating the write operation. */ -msgs[1].buf = rbuff; /* Data to read */ -msgs[1].len = 2; /* The length of the data to read is 2. */ -msgs[1].addr = 0x5A; /* The address of the device to read is 0x5A. */ -msgs[1].flags = I2C_FLAG_READ /* I2C_FLAG_READ is configured, indicating the read operation. */ -/* Perform a custom transfer to transfer two messages. */ +struct I2cMsg msgs[2]; /* Custom message array to transfer. */ +msgs[0].buf = wbuff; /* Data to write. */ +msgs[0].len = 2; /* The length of the data to write is 2. */ +msgs[0].addr = 0x5A; /* The address of the device to write the data is 0x5A. */ +msgs[0].flags = 0; /* The flag 0 indicates a write operation. */ +msgs[1].buf = rbuff; /* Data to read. */ +msgs[1].len = 2; /* The length of the data to read is 2. */ +msgs[1].addr = 0x5A; /* The address of the device to read is 0x5A. */ +msgs[1].flags = I2C_FLAG_READ /* I2C_FLAG_READ is set. */ +/* Transfer two messages. */ ret = I2cTransfer(i2cHandle, msgs, 2); if (ret != 2) { HDF_LOGE("I2cTransfer: failed, ret %d\n", ret); @@ -188,78 +126,74 @@ if (ret != 2) { } ``` ->![](../public_sys-resources/icon-caution.gif) **CAUTION**
    ->- The device address in the **I2cMsg** structure does not contain the read/write flag bit. The read/write information is transferred by the read/write control bit in the member variable **flags**. ->- The **I2cTransfer** function does not limit the number of message structures and the data length of each message structure, which are determined by the I2C controller. ->- The **I2cTransfer** function may cause the system to sleep and therefore cannot be called in the interrupt context. +> ![icon-caution.gif](../public_sys-resources/icon-caution.gif) **CAUTION**
    +> - The device address in the **I2cMsg** structure does not contain the read/write flag bit. The read/write information is passed by the read/write control bit in **flags**. +> +> - The I2C controller determines the maximum number of messages to be transferred at a time and the maximum length of each message to transfer. +> +> - The **I2cTransfer** function may cause the system to sleep and therefore cannot be called in the interrupt context. -### Closing an I2C Controller -Call the **I2cClose()** function to close the I2C controller after the communication is complete. +#### Closing an I2C Controller -void I2cClose\(DevHandle \*handle\); +Call **I2cClose()** to close the I2C controller after the communication is complete. -**Table 4** Description of I2cClose +```c +void I2cClose(DevHandle handle); +``` - - - - - - - - - -

    Parameter

    -

    Description

    -

    handle

    -

    Handle of the I2C controller to close.

    -
    + **Table 4** Description of I2cClose +| Parameter| Description| +| -------- | -------- | +| handle | Handle of the I2C controller to close.| -``` -I2cClose(i2cHandle); /* Close the I2C controller. */ +Example: + +```c +I2cClose(i2cHandle); /* Close an I2C controller. */ ``` -## Usage Example -This example describes how to use I2C APIs with an I2C device on a development board. +### Example -This example shows a simple register read/write operation on TouchPad on a Hi3516D V300 development board. The basic hardware information is as follows: +The following example describes how to use I2C APIs to implement simple read/write operations on TouchPad from a Hi3516D V300 development board. -- SoC: hi3516dv300 +The basic hardware information is as follows: -- Touch IC: The I2C address is 0x38, and the bit width of Touch IC's internal register is 1 byte. +- SoC: Hi3516D V300 -- Schematic diagram: TouchPad is mounted to I2C controller 3. The reset pin of Touch IC is GPIO3. +- Touch IC: The I2C address is 0x38, and the bit width of touch IC internal register is 1 byte. -In this example, first we reset Touch IC. \(The development board supplies power to Touch IC by default after being powered on, and this use case does not consider the power supply\). Then, we perform a read/write operation on an internal register to test whether the I2C channel is normal. +- Hardware connection: The TouchPad is connected to I2C controller 3. The reset pin of the touch IC is GPIO 3. ->![](../public_sys-resources/icon-note.gif) **NOTE**
    ->The example focuses on I2C device access and verifies the I2C channel. The read and write values of the device register are not concerned. The behavior caused by the read and write operations on the register is determined by the device itself. +In this example, reset the touch IC (the development board supplies power to the touch IC by default after being powered on) and perform read/write operations on the internal register to test whether the I2C channel is functioning. -Example: +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    +> This example focuses on access to the I2C device and verifies the I2C channel, rather than the specific data read from or written to the device register and the result caused by the read and write operations on the register. -``` -#include "i2c_if.h" /* Header file of I2C APIs */ -#include "gpio_if.h" /* Header file of GPIO APIs */ -#include "hdf_log.h" /* Header file for log APIs */ -#include "osal_io.h" /* Header file of I/O read and write APIs */ -#include "osal_time.h" /* Header file of delay and sleep APIs */ +The sample code is as follows: + +```c +#include "i2c_if.h" /* Header file of I2C APIs. */ +#include "gpio_if.h" /* Header file of GPIO APIs. */ +#include "hdf_log.h" /* Header file of log APIs. */ +#include "osal_io.h" /* Header file of I/O read and write APIs. */ +#include "osal_time.h" /* Header file of delay and sleep APIs. */ /* Define a TP device structure to store I2C and GPIO hardware information. */ struct TpI2cDevice { - uint16_t rstGpio; /* Reset pin */ - uint16_t busId; /* I2C bus ID */ - uint16_t addr; /* I2C device address */ - uint16_t regLen; /* Register bit width */ - DevHandle i2cHandle; /* I2C controller handle */ + uint16_t rstGpio; /* Reset pin. */ + uint16_t busId; /* I2C bus number. */ + uint16_t addr; /* I2C device address. */ + uint16_t regLen; /* Register bit width. */ + DevHandle i2cHandle; /* I2C controller handle. */ }; /* I2C pin I/O configuration. For details, see the SoC register manual. */ -#define I2C3_DATA_REG_ADDR 0x112f008c /* Address of the SDA pin configuration register of I2C controller 3 -#define I2C3_CLK_REG_ADDR 0x112f0090 /* Address of the SCL pin configuration register of I2C controller 3 -#define I2C_REG_CFG 0x5f1 /* Configuration values of SDA and SCL pins of I2C controller 3 +#define I2C3_DATA_REG_ADDR 0x112f008c /* Address of the SDA pin configuration register of I2C controller 3. */ +#define I2C3_CLK_REG_ADDR 0x112f0090 /* Address of the SCL pin configuration register of I2C controller 3. */ +#define I2C_REG_CFG 0x5f1 /* Configuration values of SDA and SCL pins of I2C controller 3. */ static void TpSocIoCfg(void) { @@ -268,7 +202,7 @@ static void TpSocIoCfg(void) OSAL_WRITEL(I2C_REG_CFG, IO_DEVICE_ADDR(I2C3_CLK_REG_ADDR)); } -/* Initialize the reset pin of the TP. Pull up the pin for 20 ms, pull down the pin for 50 ms, and then pull up the pin for 20 ms to complete the resetting. */ +/* Initialize the reset pin of the TP. Pull up the pin for 20 ms, pull down the pin for 50 ms, and then pull up the pin for 20 ms to complete the reset. */ static int32_t TestCaseGpioInit(struct TpI2cDevice *tpDevice) { int32_t ret; @@ -322,7 +256,7 @@ static int TpI2cReadWrite(struct TpI2cDevice *tpDevice, unsigned int regAddr, /* Fill in the I2cMsg message structure. */ msgs[0].addr = tpDevice->addr; - msgs[0].flags = 0; /* The flag is 0, indicating the write operation. */ + msgs[0].flags = 0; /* The flag 0 indicates a write operation. */ msgs[0].len = tpDevice->regLen; msgs[0].buf = regBuf; @@ -338,14 +272,14 @@ static int TpI2cReadWrite(struct TpI2cDevice *tpDevice, unsigned int regAddr, return HDF_SUCCESS; } -/* TP register read function */ +/* TP register read function. */ static inline int TpI2cReadReg(struct TpI2cDevice *tpDevice, unsigned int regAddr, unsigned char *regData, unsigned int dataLen) { return TpI2cReadWrite(tpDevice, regAddr, regData, dataLen, 1); } -/* TP register write function */ +/* TP register write function. */ static inline int TpI2cWriteReg(struct TpI2cDevice *tpDevice, unsigned int regAddr, unsigned char *regData, unsigned int dataLen) { @@ -361,7 +295,7 @@ static int32_t TestCaseI2c(void) unsigned char bufRead[7] = {0}; static struct TpI2cDevice tpDevice; - /* I/O pin function configuration */ + /* Configuration of I/O pin functions. */ TpSocIoCfg(); /* Initialize TP device information. */ @@ -371,7 +305,7 @@ static int32_t TestCaseI2c(void) tpDevice.regLen = 1; tpDevice.i2cHandle = NULL; - /* Initialize the GPIO pin. */ + /* Initialize the GPIO pin. */ ret = TestCaseGpioInit(&tpDevice); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: gpio init fail!:%d", __func__, ret); @@ -412,4 +346,3 @@ static int32_t TestCaseI2c(void) return ret; } ``` - diff --git a/en/device-dev/driver/driver-platform-i2c-develop.md b/en/device-dev/driver/driver-platform-i2c-develop.md index 9366b4b550..2b36f75b55 100644 --- a/en/device-dev/driver/driver-platform-i2c-develop.md +++ b/en/device-dev/driver/driver-platform-i2c-develop.md @@ -1,195 +1,255 @@ # I2C - ## Overview -The Inter-Integrated Circuit (I2C) bus is a simple and bidirectional two-wire synchronous serial bus developed by Philips. In the Hardware Driver Foundation (HDF), the I2C module uses the unified service mode for API adaptation. In this mode, a device service is used as the I2C manager to handle external access requests in a unified manner, which is reflected in the configuration file. The unified service mode applies to the scenario where there are many device objects of the same type, for example, when the I2C module has more than 10 controllers. If the independent service mode is used, more device nodes need to be configured and memory resources will be consumed by services. +### Function + +The Inter-Integrated Circuit (I2C) is a simple, bidirectional, and synchronous serial bus that uses merely two wires. It is widely used in short-distance communication due to simple connection and low cost. + +### Working Principles + +In the Hardware Driver Foundation (HDF), the I2C module uses the unified service mode for API adaptation. In this mode, a device service is used as the I2C manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The following figure illustrates the unified service mode. + +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. + +The I2C module is divided into the following layers: + +- Interface layer: provides the capabilities of opening and closing a device and transferring data. +- Core layer: binds services, initializes and releases the PlatformManager, and provides the capabilities of adding, deleting, and obtaining controllers. +- Adaptation layer: implements hardware-related functions, such as controller initialization. **Figure 1** Unified service mode - ![image](figures/unified-service-mode.png "I2C Unified Service Mode") +![image](figures/unified-service-mode.png "I2C Unified Service Mode") -## Available APIs +## Usage Guidelines -**I2cMethod** and **I2cLockMethod** +### When to Use +The I2C is used in communication with the sensors, executors, and input/output devices that support the I2C protocol. Before using I2C devices with OpenHarmony, you need to adapt the I2C driver to OpenHarmony. The following describes how to do it. -``` +### Available APIs + +To enable the upper layer to successfully operate the hardware by calling the I2C APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/i2c/i2c_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +**I2cMethod** and **I2cLockMethod**: + +```c struct I2cMethod { -int32_t (*transfer)(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count); + int32_t (*transfer)(struct I2cCntlr *cntlr, struct I2cMsg *msgs, int16_t count); +}; + +struct I2cLockMethod {// Structure for the lock operation. + int32_t (*lock)(struct I2cCntlr *cntlr); + void (*unlock)(struct I2cCntlr *cntlr); }; -struct I2cLockMethod {// Lock mechanism operation structure - int32_t (*lock)(struct I2cCntlr *cntlr); // Add a lock. - void (*unlock)(struct I2cCntlr *cntlr); // Release the lock. +``` + +At the adaptation layer, **I2cMethod** must be implemented, and **I2cLockMethod** can be implemented based on service requirements. The core layer provides the default **I2cLockMethod**, in which a mutex is used to protect the critical section. + +```c +static int32_t I2cCntlrLockDefault(struct I2cCntlr *cntlr) +{ + if (cntlr == NULL) { + return HDF_ERR_INVALID_OBJECT; + } + return OsalMutexLock(&cntlr->lock); +} + +static void I2cCntlrUnlockDefault(struct I2cCntlr *cntlr) +{ + if (cntlr == NULL) { + return; + } + (void)OsalMutexUnlock(&cntlr->lock); +} + +static const struct I2cLockMethod g_i2cLockOpsDefault = { + .lock = I2cCntlrLockDefault, + .unlock = I2cCntlrUnlockDefault, }; ``` - **Table 1** Description of the callback functions in I2cMethod +If a mutex cannot be used (for example, an I2C API is called in the interrupt context, which does not allow sleep, but a mutex may cause sleep), you can use another type of lock to implement **I2cLockMethod**. The implemented **I2cLockMethod** will replace the default **I2cLockMethod**. + + **Table 2** Function in **I2cMethod** | Function| Input Parameter| Output Parameter| Return Value| Description| | -------- | -------- | -------- | -------- | -------- | -| transfer | **cntlr**: structure pointer to the I2C controller at the core layer.

    **msgs**: structure pointer to the messages to transfer.
    **count**: number of messages. The value is of the uint16_t type.| –| HDF_STATUS| Transfers user messages.| +| transfer | **cntlr**: structure pointer to the I2C controller at the core layer.
    **msgs**: structure pointer to the messages to transfer.
    **count**: number of messages. The value is of the uint16_t type.| –| HDF_STATUS| Transfers user messages.| + + **Table 2** Functions in **I2cLockMethod** +| Function| Input Parameter| Output Parameter| Return Value| Description| +| -------- | -------- | -------- | -------- | -------- | +| lock | **cntlr**: structure pointer to the I2C controller at the core layer.| –| HDF_STATUS| Acquires the critical section lock.| +| unlock | **cntlr**: structure pointer to the I2C controller at the core layer.| –| HDF_STATUS| Releases the critical section lock.| -## How to Develop +### How to Develop The I2C module adaptation involves the following steps: 1. Instantiate the driver entry. + - Instantiate the **HdfDriverEntry** structure. - Call **HDF_INIT** to register the **HdfDriverEntry** instance with the HDF. 2. Configure attribute files. + - Add the **deviceNode** information to the **device_info.hcs** file. - (Optional) Add the **i2c_config.hcs** file. 3. Instantiate the I2C controller object. + - Initialize **I2cCntlr**. - Instantiate **I2cMethod** and **I2cLockMethod** in **I2cCntlr**. - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** - > + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    > For details, see [Available APIs](#available-apis). - -4. Debug the driver.
    - (Optional) For new drivers, verify basic functions, for example, check whether data is successfully transmitted and the information returned after the virtual file system (VFS) is mounted. +4. Debug the driver. + + (Optional) For new drivers, verify basic functions, for example, check whether data is successfully transferred and the information returned after the virtual file system (VFS) is mounted. -## Development Example +### Example -The following uses **i2c_hi35xx.c** as an example to present the information required for implementing device functions. +The following uses the Hi3516D V300 driver **//device/soc/hisilicon/common/platform/i2c/i2c_hi35xx.c** as an example to describe how to perform the I2C driver adaptation. 1. Instantiate the driver entry. - + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - - Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init()** fails to be called, the HDF calls **Release()** to release driver resources and exit. - + + Generally, the HDF calls **Bind()** and then **Init()** to load a driver. If **Init()** fails to be called, the HDF calls **Release()** to release driver resources and exit. + I2C driver entry example: - - An I2C controller may be connected with multiple devices. You need to create a manager object in the HDF and publish a manager service to handle external access requests in a unified manner. Before a device is used, the manager service must be obtained first. Then, the manager service locates the target device based on the specified parameters. - - The driver of the I2C manager is implemented by the core layer. Vendors do not need to care about the implementation of this part. However, the **Init** function must call the **I2cCntlrAdd** function of the core layer to implement corresponding features. - - ``` - struct HdfDriverEntry g_i2cDriverEntry = { + + Multiple devices may connect to the I2C controller. In the HDF, a manager object needs to be created for this type of devices, and a manager service is published to handle external access requests uniformly. When a device needs to be started, the manager service locates the target device based on the specified parameters. + + You do not need to implement the driver of the I2C manager, which is implemented by the core layer. However, the **I2cCntlrAdd** function of the core layer must be invoked in the **Init** function to implement the related features. + + ```c + struct HdfDriverEntry g_i2cDriverEntry = { .moduleVersion = 1, .Init = Hi35xxI2cInit, .Release = Hi35xxI2cRelease, .moduleName = "hi35xx_i2c_driver", // (Mandatory) The value must be the same as that in the config.hcs file. - }; - HDF_INIT(g_i2cDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. - - // Driver entry of the i2c_core.c manager service at the core layer - struct HdfDriverEntry g_i2cManagerEntry = { + }; + HDF_INIT(g_i2cDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. + + /* Driver entry of the manager service i2c_core.c at the core layer. */ + struct HdfDriverEntry g_i2cManagerEntry = { .moduleVersion = 1, .Bind = I2cManagerBind, .Init = I2cManagerInit, .Release = I2cManagerRelease, - .moduleName = "HDF_PLATFORM_I2C_MANAGER", // This parameter corresponds to device0 in the device_info file. - }; - HDF_INIT(g_i2cManagerEntry); - ``` - - + .moduleName = "HDF_PLATFORM_I2C_MANAGER", // The value must be the same as that of device0 in the device_info.hcs file. + }; + HDF_INIT(g_i2cManagerEntry); + ``` -2. Add the **deviceNode** information to the **device_info.hcs** file and configure the device attributes in the **i2c_config.hcs** file. +2. Add the **deviceNode** information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file and configure the device attributes in **i2c_config.hcs**. - The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the driver implementation and the default values or value ranges of the **I2cCntlr** members at the core layer. + The **deviceNode** information is related to the driver entry registration. The device attribute values are closely related to the driver implementation and the default values or value ranges of the **I2cCntlr** members at the core layer. - In the unified service mode, the first device node in the **device_info** file must be the I2C manager. The table below lists the settings of its parameters. - - **Table 2** Settings of the I2C manager + In the unified service mode, the first device node in the **device_info.hcs** file must be the I2C manager. The table below lists the settings of its parameters. + **Table 3** Settings of the I2C manager + | Parameter| Value| | -------- | -------- | | moduleName | **HDF_PLATFORM_I2C_MANAGER**| | serviceName | **HDF_PLATFORM_I2C_MANAGER**| | policy | **1** or **2**, depending on whether the service is published to the user mode.| - | deviceMatchAttr | Reserved| - - Configure I2C controller information from the second node. This node specifies a type of I2C controllers rather than a specific I2C controller. The controllers are distinguishes by **busID** and **reg_pbase**, which can be seen in the **i2c_config** file. - - - **device_info.hcs** configuration example - - - ``` - root { - device_info { - match_attr = "hdf_manager"; - device_i2c :: device { - device0 :: deviceNode { - policy = 2; - priority = 50; - permission = 0644; - moduleName = "HDF_PLATFORM_I2C_MANAGER"; - serviceName = "HDF_PLATFORM_I2C_MANAGER"; - deviceMatchAttr = "hdf_platform_i2c_manager"; - } - device1 :: deviceNode { - policy = 0; // The value 0 indicates that no service needs to be published. - priority = 55; // Driver startup priority. - permission = 0644; // Permission for the driver to create a device node. - moduleName = "hi35xx_i2c_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. - serviceName = "HI35XX_I2C_DRIVER"; // (Mandatory) Unique name of the service published by the driver. - deviceMatchAttr = "hisilicon_hi35xx_i2c"; // (Mandatory) Used to configure the private data of the controller. The value must be the same as the controller information in i2c_config.hcs. - //The specific controller information is stored in i2c_config.hcs. - } - } - } - } - ``` - - - **i2c_config.hcs** configuration example - - - ``` - root { - platform { - i2c_config { - match_attr = "hisilicon_hi35xx_i2c"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. - template i2c_controller { // Template configuration. In the template, you can configure the common parameters shared by service nodes. - bus = 0; // (Mandatory) I2C identifier. - reg_pbase = 0x120b0000; // (Mandatory) Physical base address. - reg_size = 0xd1; // (Mandatory) Register bit width. - irq = 0; // (Optional) Configured based on your requirements. - freq = 400000; // (Optional) Configured based on your requirements. - clk = 50000000; // (Optional) Configured based on your requirements. - } - controller_0x120b0000 :: i2c_controller { - bus = 0; - } - controller_0x120b1000 :: i2c_controller { - bus = 1; - reg_pbase = 0x120b1000; - } - ... - } - } - } - ``` + | deviceMatchAttr | This parameter is reserved.| + + Configure I2C controller information from the second node. This node specifies a type of I2C controllers rather than a specific I2C controller. The controllers are distinguished by **busID** and **reg_pbase**, which can be seen in the **i2c_config.hcs** file. + + - **device_info.hcs** example + + ```c + root { + device_info { + match_attr = "hdf_manager"; + device_i2c :: device { + device0 :: deviceNode { + policy = 2; + priority = 50; + permission = 0644; + moduleName = "HDF_PLATFORM_I2C_MANAGER"; + serviceName = "HDF_PLATFORM_I2C_MANAGER"; + deviceMatchAttr = "hdf_platform_i2c_manager"; + } + device1 :: deviceNode { + policy = 0; // The value 0 indicates that no service is published. + priority = 55; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "hi35xx_i2c_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. + serviceName = "HI35XX_I2C_DRIVER"; // (Mandatory) Unique name of the service published by the driver. + deviceMatchAttr = "hisilicon_hi35xx_i2c"; // (Mandatory) Private data of the controller. The value must be the same as the controller information in i2c_config.hcs. + //The specific controller information is in i2c_config.hcs. + } + } + } + } + ``` + + - **i2c_config.hcs** example + + ```c + root { + platform { + i2c_config { + match_attr = "hisilicon_hi35xx_i2c"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. + template i2c_controller { // Template configuration. In the template, you can configure the common parameters shared by service nodes. + bus = 0; // (Mandatory) I2C identifier. + reg_pbase = 0x120b0000; // (Mandatory) Physical base address. + reg_size = 0xd1; // (Mandatory) Register bit width. + irq = 0; // (Optional) Interrupt request (IRQ) number. The interrupt feature of the controller determines whether an IRQ number is required. + freq = 400000; // (Optional) Frequency used in hardware controller initialization. + clk = 50000000; // (Optional) Controller clock. The controller clock initialization process determines whether a controller clock is required. + } + controller_0x120b0000 :: i2c_controller { + bus = 0; + } + controller_0x120b1000 :: i2c_controller { + bus = 1; + reg_pbase = 0x120b1000; + } + ... + } + } + } + ``` + + After the **i2c_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. + + For example, if the path of **i2c_config.hcs** is **device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/i2c/i2c_config.hcs**, add the following statement to **hdf.hcs** of the product: + + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/i2c/i2c_config.hcs" // Relative path of the file. + ``` 3. Initialize the **I2cCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **I2cMethod** in **I2cCntlr** (so that the underlying driver functions can be called). - - Defining a custom structure + + - Define a custom structure. To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **i2c_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the device number and bus number, to the **I2cCntlr** object at the core layer. - - ``` - // Custom structure + ```c + /* Custom structure. */ struct Hi35xxI2cCntlr { struct I2cCntlr cntlr; // (Mandatory) Control object at the core layer. For details, see the following description. - OsalSpinlock spin; // (Mandatory) You need to implement lock() and unlock() based on this variable. - volatile unsigned char *regBase; // (Mandatory) Register base address. + OsalSpinlock spin; // (Mandatory) Lock or unlock an I2C operation function. + volatile unsigned char *regBase;// (Mandatory) Register base address. uint16_t regSize; // (Mandatory) Register bit width. int16_t bus; // (Mandatory) The value can be read from the i2c_config.hcs file. - uint32_t clk; // (Optional) Customized. - uint32_t freq; // (Optional) Customized. - uint32_t irq; // (Optional) Customized. - uint32_t regBasePhy; // (Mandatory) Physical base address of the register. + uint32_t clk; // (Optional) Set it as required. + uint32_t freq; // (Optional) Set it as required. + uint32_t irq; // (Optional) Set it as required. + uint32_t regBasePhy // (Mandatory) Physical base address of the register. }; - // I2cCntlr is a controller structure at the core layer. The Init function assigns values to the members of I2cCntlr. + /* I2cCntlr is the core layer controller structure. The **Init()** function assigns values to the members of I2cCntlr. */ struct I2cCntlr { struct OsalMutex lock; void *owner; @@ -199,31 +259,32 @@ The following uses **i2c_hi35xx.c** as an example to present the information req const struct I2cLockMethod *lockOps; }; ``` - - Instantiating **I2cMethod** and **I2cLockMethod** (other members are initialized by **Init**) - - ``` - // Example in i2c_hi35xx.c + - Instantiate **I2cMethod** and **I2cLockMethod**. Other members are initialized by **Init**. + + ```c + /* Example in i2c_hi35xx.c */ static const struct I2cMethod g_method = { .transfer = Hi35xxI2cTransfer, }; static const struct I2cLockMethod g_lockOps = { - .lock = Hi35xxI2cLock, // Lock function - .unlock = Hi35xxI2cUnlock, // Unlock function + .lock = Hi35xxI2cLock, // Acquires the lock. + .unlock = Hi35xxI2cUnlock, // Release the lock. }; ``` - - **Init** function - **Input parameter**: + - Implement the **Init** function. + + Input parameter: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. - **Return value**: + Return value: - **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. - **Table 3** HDF_STATUS + **Table 4** HDF_STATUS | Status| Description| | -------- | -------- | @@ -234,16 +295,15 @@ The following uses **i2c_hi35xx.c** as an example to present the information req | HDF_SUCCESS | Transmission successful.| | HDF_FAILURE | Transmission failed.| - **Function description**: + Function description: - Initializes the custom structure object and **I2cCntlr**, calls the **I2cCntlrAdd** function at the core layer, and mounts the VFS (optional). + Initialize the custom structure object and **I2cCntlr**, call **I2cCntlrAdd()** at the core layer, and connect to the VFS (optional). - - ``` + ```c static int32_t Hi35xxI2cInit(struct HdfDeviceObject *device) { ... - // Traverse and parse all nodes in i2c_config.hcs and call Hi35xxI2cParseAndInit to initialize the devices separately. + /* Traverse and parse all nodes in i2c_config.hcs and call Hi35xxI2cParseAndInit to initialize the devices separately. */ DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { ret = Hi35xxI2cParseAndInit(device, childNode);// The function is defined as follows. ... @@ -254,25 +314,25 @@ The following uses **i2c_hi35xx.c** as an example to present the information req static int32_t Hi35xxI2cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) { struct Hi35xxI2cCntlr *hi35xx = NULL; - ... + ... // Check whether the input parameter is null. hi35xx = (struct Hi35xxI2cCntlr *)OsalMemCalloc(sizeof(*hi35xx)); // Allocate memory. - ... + ... // Verify the return value. hi35xx->regBase = OsalIoRemap(hi35xx->regBasePhy, hi35xx->regSize); // Address mapping. - ... - Hi35xxI2cCntlrInit(hi35xx); // (Mandatory) Initialize the I2C device. + ... // Verify the return value. + Hi35xxI2cCntlrInit(hi35xx); // (Mandatory) Initialize the I2C device. - hi35xx->cntlr.priv = (void *)node; // (Mandatory) Device attributes. - hi35xx->cntlr.busId = hi35xx->bus; // (Mandatory) Initialize busId in I2cCntlr. - hi35xx->cntlr.ops = &g_method; // (Mandatory) Hook the I2cMethod instance. - hi35xx->cntlr.lockOps = &g_lockOps; // (Mandatory) Hook the I2cLockMethod instance. - (void)OsalSpinInit(&hi35xx->spin); // (Mandatory) Initialize the lock. - ret = I2cCntlrAdd(&hi35xx->cntlr); // (Mandatory) Call this function to set the structure of the core layer. The driver accesses the platform core layer only after a success signal is returned. + hi35xx->cntlr.priv = (void *)node; // (Mandatory) Device attributes. + hi35xx->cntlr.busId = hi35xx->bus; // (Mandatory) Initialize busId in I2cCntlr. + hi35xx->cntlr.ops = &g_method; // (Mandatory) Hook the I2cMethod instance. + hi35xx->cntlr.lockOps = &g_lockOps; // (Mandatory) Hook the I2cLockMethod instance. + (void)OsalSpinInit(&hi35xx->spin); // (Mandatory) Initialize the lock. + ret = I2cCntlrAdd(&hi35xx->cntlr); // (Mandatory) Call this function to add the controller object to the core layer of the platform. The driver can access the core layer of the platform only after a success signal is returned. ... #ifdef USER_VFS_SUPPORT (void)I2cAddVfsById(hi35xx->cntlr.busId);// (Optional) Mount the user-level VFS if required. #endif return HDF_SUCCESS; - __ERR__: // If the operation fails, execute the initialization functions reversely. + __ERR__: // If the operation fails, roll back the operations that have been performed in the function (such as unmapping I/O and releasing memory) and return an error code. if (hi35xx != NULL) { if (hi35xx->regBase != NULL) { OsalIoUnmap((void *)hi35xx->regBase); @@ -284,26 +344,26 @@ The following uses **i2c_hi35xx.c** as an example to present the information req return ret; } ``` - - **Release** function - **Input parameter**: + - Implement the **Release** function. + + Input parameter: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. - **Return value**: + Return value: No value is returned. - **Function description**: + Function description: Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. - - ``` + ```c static void Hi35xxI2cRelease(struct HdfDeviceObject *device) { ... - // Release each node separately, like Hi35xxI2cInit. + /* Release each node separately, like Hi35xxI2cInit. */ DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { Hi35xxI2cRemoveByNode(childNode);// The function is defined as follows: } @@ -312,12 +372,12 @@ The following uses **i2c_hi35xx.c** as an example to present the information req static void Hi35xxI2cRemoveByNode(const struct DeviceResourceNode *node) { ... - // (Mandatory) Call the I2cCntlrGet function to obtain the I2cCntlr object based on bus ID of the device, and call the I2cCntlrRemove function to release the I2cCntlr object. + /* (Mandatory) Call I2cCntlrGet() to obtain the pointer to the I2cCntlr object based on the bus number of the device, and call I2cCntlrRemove() to remove the I2cCntlr object from the core layer of the platform. */ cntlr = I2cCntlrGet(bus); if (cntlr != NULL && cntlr->priv == node) { ... I2cCntlrRemove(cntlr); - // (Mandatory) Unmap the addresses and release the lock and memory. + /* (Mandatory) Unmap the register address and release the lock and memory. */ hi35xx = (struct Hi35xxI2cCntlr *)cntlr; OsalIoUnmap((void *)hi35xx->regBase); (void)OsalSpinDestroy(&hi35xx->spin); diff --git a/en/device-dev/driver/driver-platform-i3c-des.md b/en/device-dev/driver/driver-platform-i3c-des.md index 1108e71375..fa2dcf1cbd 100644 --- a/en/device-dev/driver/driver-platform-i3c-des.md +++ b/en/device-dev/driver/driver-platform-i3c-des.md @@ -8,7 +8,7 @@ Improved Inter-Integrated Circuit (I3C) is a simple and cost-efficient two-wire I3C is a two-wire bidirectional serial bus, optimized for multiple sensor target devices and controlled by only one I3C controller at a time. It is backward compatible with Inter-Integrated circuit (I2C) target devices, but features higher speed and lower power consumption. Moreover, I3C supports in-band interrupts (IBIs), hot-joins of target devices, and controller switchover. The IBIs over the serial bus eliminates the need for an extra interrupt line to complete interrupts in I2C. I2C devices, I3C target devices, and the I3C secondary controller can co-exist on the same I3C bus. -The I3C driver APIs provide a set of common functions for I3C transfer, including: +The I3C module provides a set of common APIs for I3C transfer, including: - Opening and closing an I3C controller - Obtaining and setting I3C controller parameters - Performing custom I3C message transfer by using a message array @@ -17,17 +17,14 @@ The I3C driver APIs provide a set of common functions for I3C transfer, includin ### Basic Concepts - IBI - + When there is no start signal on the serial clock (SCL) line, the I3C target device can pull down the serial data (SDA) line to make the controller send an SCL start signal, which initiates an IBI request. If multiple target devices send interrupt requests at the same time, the I3C controller arbitrates the requests based on the target device addresses. The request with a lower address is responded first. - + - Dynamic Address Assignment (DAA) The I3C controller can dynamically allocate addresses to target devices to avoid address conflicts. Before addresses are allocated, each I3C device connected to a I3C bus must be uniquely identified in either of the following ways: - - - The device has an I2C compliant static address that can be used by the host. - - The device has a 48-bit temporary ID. - - The host must use a 48-bit temporary ID unless the device has a static IP address. + 1) The device has an I2C compliant static address that can be used by the host. + 2) The device has a 48-bit temporary ID. The host must use a 48-bit temporary ID unless the device has a static IP address. - Common Command Code (CCC) @@ -43,49 +40,54 @@ The I3C driver APIs provide a set of common functions for I3C transfer, includin ### Working Principles -In the Hardware Driver Foundation (HDF), the I3C module uses the unified service mode for API adaptation. In this mode, a service is used as the I3C manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type, for example, when there are more than 10 I3C controllers. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. +In the Hardware Driver Foundation (HDF), the I3C module uses the unified service mode for API adaptation. In this mode, a service is used as the I3C manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type, for example, when there are more than 10 I3C controllers. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. -Multiple devices, such as I2C target device, I3C target device, and I3C secondary controller, can be connected to an I3C bus. However, the I3C bus must have only one controller. +Compared with I2C, I3C features higher speed and lower power consumption, supports IBIs, hot-joins of target devices, and controller switchover. I3C is also backward compatible with I2C target devices. Multiple devices, such as I2C target device, I3C target device, and I3C secondary controller, can be connected to an I3C bus. However, the I3C bus must have only one controller. + +**Figure 1** I3C physical connection -**Figure 1** I3C physical connection ![](figures/I3C_physical_connection.png "I3C_physical_connection") ### Constraints -Currently, the I3C module supports only the kernels (LiteOS) of mini and small systems. +The I3C module supports only the kernel (LiteOS-A) for mini and small systems and cannot be used in user mode. ## Usage Guidelines ### When to Use I3C can connect to one or more I3C or I2C target devices. It is used to: + - Communicate with sensors, such as gyroscopes, barometers, and image sensors that support the I3C protocol. - Communicate with devices with other ports (such as UART serial ports) through software or hardware protocols. ### Available APIs -**Table 1** I3C driver APIs +The following table describes the APIs provided by the I3C module. For more information about the APIs, see **//drivers/hdf_core/framework/include/platform/i3c_if.h**. +**Table 1** I3C driver APIs -| API | Description | +| API | Description | | ------------- | ----------------- | -| I3cOpen | Opens an I3C controller. | -| I3cClose | Closes an I3C controller. | -| I3cTransfer | Performs custom transfer. | -| I3cSetConfig | Sets the I3C controller. | -| I3cGetConfig | Obtains the I3C controller configuration. | -| I3cRequestIbi | Requests an IBI. | -| I3cFreeIbi | Releases an IBI. | - ->![](../public_sys-resources/icon-note.gif) **NOTE**
    +| DevHandle I3cOpen(int16_t number) | Opens an I3C controller. | +| void I3cClose(DevHandle handle) | Closes an I3C controller. | +| int32_t I3cTransfer(DevHandle handle, struct I3cMsg \*msg, int16_t count, enum TransMode mode) | Performs custom transfer. | +| int32_t I3cSetConfig(DevHandle handle, struct I3cConfig \*config) | Sets the I3C controller. | +| int32_t I3cGetConfig(DevHandle handle, struct I3cConfig \*config) | Obtains I3C controller configuration.| +| int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t payload) | Requests an IBI. | +| int32_t I3cFreeIbi(DevHandle handle, uint16_t addr) | Releases an IBI. | + +>![](../public_sys-resources/icon-note.gif) **NOTE** +> >All APIs described in this document can be called only in kernel mode. ### How to Develop -The figure below illustrates the use of I3C driver APIs. +The following figure illustrates how to use the I3C APIs. + +**Figure 2** Process of using I3C driver APIs -**Figure 2** Process of using I3C driver APIs -![](figures/I3C_usage_flowchart.png "I3C_usage_flowchart") +![](figures/using-I3C-process.png) #### Opening an I3C Controller @@ -98,10 +100,10 @@ DevHandle I3cOpen(int16_t number); | Name | Description | | ---------- | ------------------- | -| number | I3C controller number. | +| number | I3C controller number. | | **Return Value**| **Description** | -| NULL | The operation failed. | -| Controller handle| The operation is successful. The handle of the I3C controller opened is returned. | +| NULL | The operation fails. | +| Controller handle| The operation is successful. The handle of the I3C controller opened is returned.| Example: Open I3C controller 1 of the eight I3C controllers numbered from 0 to 7 in the system. @@ -116,64 +118,13 @@ if (i3cHandle == NULL) { } ``` -#### Performing I3C Communication - -Call **I3cTransfer()** to transfer messages. -```c -int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msgs, int16_t count, enum TransMode mode); -``` - -**Table 3** Description of I3cTransfer - - -| Name | Description | -| ---------- | -------------------------------------------- | -| handle | I3C controller handle. | -| msgs | Pointer to the message array of the data to transfer. | -| count | Length of the message array. | -| mode | Transmission mode. The value **0** indicates I2C mode, **1** indicates I3C mode, and **2** indicates CCC transmission. | -| **Return Value**| **Description** | -| Positive integer | The operation is successful. The number of message structures that are successfully transmitted is returned. | -| Negative value | The operation failed. | - -The I3C messages are of the I3cMsg type. Each message structure indicates a read or write operation. A message array can be used to perform multiple read or write operations. - -```c -int32_t ret; -uint8_t wbuff[2] = { 0x12, 0x13 }; -uint8_t rbuff[2] = { 0 }; -struct I3cMsg msgs[2]; /* Custom message array for transfer. */ -msgs[0].buf = wbuff; /* Data to write. */ -msgs[0].len = 2; /* Length of the data to write. */ -msgs[0].addr = 0x3F; /* Address of the device to which the data is written. */ -msgs[0].flags = 0; /* Transfer flag. A write operation is performed by default. */ -msgs[1].buf = rbuff; /* Data to read. */ -msgs[1].len = 2; /* Length of the data to read. */ -msgs[1].addr = 0x3F; /* Address of the device from which the data is read. */ -msgs[1].flags = I3C_FLAG_READ /* I3C_FLAG_READ is set. */ -/* Transfer two messages in I2C mode. */ -ret = I3cTransfer(i3cHandle, msgs, 2, I2C_MODE); -if (ret != 2) { - HDF_LOGE("I3cTransfer: failed, ret %d\n", ret); - return; -} -``` - ->![](./public_sys-resources/icon-caution.gif) **Caution**
    ->- The device address in the **I3cMsg** structure does not contain the read/write flag bit. The read/write information is passed by the read/write control bit in the member variable **flags**. ->- The **I3cTransfer()** function does not limit the number of message structures or the length of data in each message structure. The I3C controller determines these two limits. ->- Using **I3cTransfer()** may cause the system to sleep. Do not call it in the interrupt context. - #### Obtaining the I3C Controller Configuration -Call **I3cGetConfig()** to obtain the configuration of an I3C controller. - ```c int32_t I3cGetConfig(DevHandle handle, struct I3cConfig *config); ``` -**Table 4** Description of I3cGetConfig - +**Table 3** Description of I3cGetConfig | Name | Description | | ---------- | -------------- | @@ -181,7 +132,7 @@ int32_t I3cGetConfig(DevHandle handle, struct I3cConfig *config); | config | Pointer to the I3C controller configuration. | | **Return Value**| **Description**| | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | The following is an example of obtaining the I3C controller configuration: @@ -197,14 +148,11 @@ if (ret != HDF_SUCCESS) { #### Setting an I3C Controller -Call **I3cSetConfig()** to set an I3C controller. - ```c int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config); ``` -**Table 5** Description of I3cSetConfig - +**Table 4** Description of I3cSetConfig | Name | Description | | ---------- | -------------- | @@ -212,7 +160,7 @@ int32_t I3cSetConfig(DevHandle handle, struct I3cConfig *config); | config | Pointer to the I3C controller configuration. | | **Return Value**| **Description**| | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | The following is an example of setting an I3C controller: @@ -228,9 +176,54 @@ if (ret != HDF_SUCCESS) { } ``` -#### Requesting an IBI +#### Performing I3C Communication + +Call **I3cTransfer()** to transfer messages. +```c +int32_t I3cTransfer(DevHandle handle, struct I3cMsg *msgs, int16_t count, enum TransMode mode); +``` + +**Table 5** Description of I3cTransfer + +| Name | Description | +| ---------- | -------------------------------------------- | +| handle | I3C controller handle. | +| msgs | Pointer to the message array of the data to transfer. | +| count | Length of the message array. | +| mode | Transmission mode. The value **0** indicates I2C mode, **1** indicates I3C mode, and **2** indicates CCC transmission.| +| **Return Value**| **Description** | +| Positive integer | The operation is successful. The number of message structures that are successfully transmitted is returned. | +| Negative value | The operation fails. | + +The I3C messages are of the I3cMsg type. Each message structure indicates a read or write operation. A message array can be used to perform multiple read or write operations. + +```c +int32_t ret; +uint8_t wbuff[2] = { 0x12, 0x13 }; +uint8_t rbuff[2] = { 0 }; +struct I3cMsg msgs[2]; /* Custom message array for transfer. */ +msgs[0].buf = wbuff; /* Data to write. */ +msgs[0].len = 2; /* Length of the data to write. */ +msgs[0].addr = 0x3F; /* Address of the device to which the data is written. */ +msgs[0].flags = 0; /* Transfer flag. A write operation is performed by default. */ +msgs[1].buf = rbuff; /* Data to read. */ +msgs[1].len = 2; /* Length of the data to read. */ +msgs[1].addr = 0x3F; /* Address of the device from which the data is read. */ +msgs[1].flags = I3C_FLAG_READ /* I3C_FLAG_READ is set. */ +/* Transfer two messages in I2C mode. */ +ret = I3cTransfer(i3cHandle, msgs, 2, I2C_MODE); +if (ret != 2) { + HDF_LOGE("I3cTransfer: failed, ret %d\n", ret); + return; +} +``` + +>![](./public_sys-resources/icon-caution.gif) **Caution**
    +>- The device address in the **I3cMsg** structure does not contain the read/write flag bit. The read/write information is passed by the read/write control bit in **flags**. +>- The I3C controller determines the maximum number of messages to transfer at a time and the maximum length of each message. +>- Using **I3cTransfer()** may cause the system to sleep. Do not call it in the interrupt context. -Call **I3cRequestIbi()** to request an IBI. +#### Requesting an IBI ```c int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t payload); @@ -238,7 +231,6 @@ int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t **Table 6** Description of I3cRequestIbi - | Name | Description | | ---------- | -------------- | | handle | I3C controller handle. | @@ -247,7 +239,7 @@ int32_t I3cRequestIbi(DevHandle handle, uint16_t addr, I3cIbiFunc func, uint32_t | payload | IBI payload. | | **Return Value**| **Description**| | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | The following is an example: @@ -287,22 +279,19 @@ int32_t I3cTestRequestIbi(void) #### Releasing an IBI -Call **I3cFreeIbi()** to release an IBI. - ```c int32_t I3cFreeIbi(DevHandle handle, uint16_t addr); ``` **Table 7** Description of I3cFreeIbi - | Name | Description | | ---------- | -------------- | | handle | I3C controller handle. | | addr | I3C device address. | | **Return Value**| **Description**| | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | The following is an example: @@ -319,7 +308,6 @@ void I3cClose(DevHandle handle); **Table 8** Description of I3cClose - | Name | Description | | ---------- | -------------- | | handle | I3C controller handle. | @@ -330,17 +318,15 @@ The following is an example: I3cClose(i3cHandle); /* Close the I3C controller. */ ``` -## Development Example - -This following example shows how to use I3C APIs to manage an I3C device on a Hi3516D V300 development board. +## Example -Because the Hi3516D V300 SoC has no I3C controller, this example describes how to perform simple transfer operations on a virtual driver on a Hi3516D V300. The basic information is as follows: +The following example presents how to use I3C APIs to manage an I3C device on a Hi3516D V300 development board.
    The basic hardware information is as follows: - SoC: Hi3516D V300 -- Virtual: The I3C address is 0x3f, and the register bit width is 1 byte. +- Virtual I3C device: The I3C address is 0x3f, and the register bit width is 1 byte. -- The virtual I3C devices are connected to virtual I3C controllers 18 and 19. +- The virtual I3C device is connected to I3C controllers 18 and 19. Perform simple I3C transfer to test whether the I3C channels are normal. @@ -349,7 +335,7 @@ The sample code is as follows: ```c #include "i3c_if.h" /* Header file for I3C standard APIs */ #include "hdf_log.h" /* Header file for log APIs */ -##include "osal_io.h" /* Header file for I/O read and write APIs */ +##include "osal_io.h" /* Header file for I/O read and write APIs */ #include "osal_time.h" /* Header file for delay and sleep APIs */ /* Define a device structure to hold information. */ diff --git a/en/device-dev/driver/driver-platform-i3c-develop.md b/en/device-dev/driver/driver-platform-i3c-develop.md index 41119331f1..4df734722d 100644 --- a/en/device-dev/driver/driver-platform-i3c-develop.md +++ b/en/device-dev/driver/driver-platform-i3c-develop.md @@ -6,7 +6,9 @@ Improved Inter-Integrated Circuit (I3C) is a simple and cost-efficient two-wire bidirectional synchronous serial bus protocol developed by the Mobile Industry Processor Interface (MIPI) Alliance. -I3C is a two-wire bidirectional serial bus, optimized for multiple sensor target devices and controlled by only one I3C controller at a time. It is backward compatible with Inter-Integrated circuit (I2C) target devices, but features higher speed and lower power consumption and supports in-band interrupts (IBIs), hot-joins of target devices, and controller switchover. +I3C is a two-wire bidirectional serial bus, optimized for multiple sensor target devices and controlled by only one I3C controller at a time. It is backward compatible with Inter-Integrated circuit (I2C) target devices, but features higher speed and lower power consumption and supports in-band interrupts (IBIs), hot-joins of target devices, and controller switchover. + +The IBIs over the serial bus eliminates the need for an extra interrupt line to complete interrupts in I2C. I2C devices, I3C target devices, and the I3C secondary controller can co-exist on the same I3C bus. ### Basic Concepts @@ -16,16 +18,16 @@ I3C is a two-wire bidirectional serial bus, optimized for multiple sensor target - Dynamic Address Assignment (DAA) - The I3C controller can dynamically allocate addresses to target devices to avoid address conflicts. Before addresses are allocated, each I3C device connected to a I3C bus must be uniquely identified in either of the following ways: + The I3C controller can dynamically allocate addresses to target devices to avoid address conflicts. Before addresses are allocated, each I3C device connected to an I3C bus must be uniquely identified in either of the following ways: - The device has an I2C compliant static address that can be used by the host. - - The device has a 48-bit temporary ID. + - The device has a 48-bit temporary ID. The host must use a 48-bit temporary ID unless the device has a static IP address. - Common Command Code (CCC) - All I3C devices support CCC. The CCC can be sent to a specific I3C target device or all I3C target devices. + All I3C devices support CCC. The CCC can be sent to an I3C target device or all I3C target devices. - Bus Characteristic Register (BCR) @@ -38,21 +40,23 @@ I3C is a two-wire bidirectional serial bus, optimized for multiple sensor target ### Working Principles -In the Hardware Driver Foundation (HDF), the I3C module uses the unified service mode for API adaptation. In this mode, a service is used as the I3C manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type, for example, when there are more than ten I3C controllers. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The figure below illustrates the unified service mode. +In the Hardware Driver Foundation (HDF), the I3C module uses the unified service mode for API adaptation. In this mode, a service is used as the I3C manager to handle external access requests in a unified manner. The unified service mode applies when the system has multiple device objects of the same type, for example, when there are more than 10 I3C controllers. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The following figure illustrtes the unified service mode. The I3C module is divided into the following layers: -- Interface layer: provides APIs for opening or closing a controller, transmitting messages, and obtaining and setting controller parameters. -- Core layer: provides the capabilities of binding, initializing, and releasing devices. -- Adaptation layer: implements other functions. +- Interface layer: provides the capabilities of opening a device, writing data, and closing a device. +- Core layer: binds services, initializes and releases the PlatformManager, and provides the capabilities of adding, deleting, and obtaining controllers. The core layer also provides capabilities of adding, deleting, and obtaining the devices connected to the I3C bus and interrupt callbacks. +- Adaptation layer: implements hardware-related functions, such as controller initialization. + +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. - **Figure 1** Unified service mode + **Figure 1** Unified service mode ![image1](figures/unified-service-mode.png) ### Constraints -Currently, the I3C module supports only the kernels (LiteOS) of mini and small systems. +The I3C module supports only the kernel (LiteOS-A) for mini and small systems. ## Development Guidelines @@ -63,12 +67,13 @@ I3C can connect to one or more I3C or I2C target devices. It is used to: - Communicate with sensors, such as gyroscopes, barometers, and image sensors that support the I3C protocol. - Communicate with devices with other ports (such as UART serial ports) through software or hardware protocols. -### Available APIs - -**I3cMethod**: +Before using I3C devices with OpenHarmony, you need to adapt the I3C driver to OpenHarmony. The following describes how to do it. +### Available APIs +To enable the upper layer to successfully operate the hardware by calling the I3C APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/i3c/i3c_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. +**I3cMethod**: ```c struct I3cMethod { int32_t (*sendCccCmd)(struct I3cCntlr *cntlr, struct I3cCccCmd *ccc); @@ -81,16 +86,17 @@ struct I3cMethod { }; ``` -**Table 1** Description of the callback functions in I3cMethod +**Table 1** Hook functions in **I3cMethod** |Function|Input Parameter|Output Parameter|Return Value|Description| |-|-|-|-|-| |sendCccCmd| **cntlr**: structure pointer to an I3C controller at the core layer.
    **ccc**: pointer to the CCC to send.| **ccc**: pointer to the CCC sent.| HDF_STATUS|Sends a CCC.| -|Transfer| **cntlr**: structure pointer to an I3C controller at the core layer.
    **msgs**: structure pointer to the messages to transfer.
    **count**: length of the message array, which is of the int16_t type.| **msgs**: structure pointer to the messages transferred.| HDF_STATUS|Transfers user messages in I3C mode.| -|i2cTransfer| **cntlr**: structure pointer to an I3C controller at the core layer.
    **msgs**: structure pointer to the messages to transfer.
    **count**: length of the message array, which is of the int16_t type.| **msgs**: structure pointer to the messages transferred.| HDF_STATUS|Transfers user messages in I2C mode.| -|setConfig| **cntlr**: structure pointer to an I3C controller at the core layer.
    **config**: pointer to the controller configuration.| –| HDF_STATUS|Sets an I3C controller.| -|getConfig| **cntlr**: structure pointer to an I3C controller at the core layer.| **config**: pointer to the controller configuration.| HDF_STATUS|Obtains the I3C controller configuration.| -|requestIbi| **device**: structure pointer to an I3C device at the core layer.| –| HDF_STATUS|Requests an IBI for an I3C device.| -|freeIbi| **device**: structure pointer to an I3C device at the core layer.| –| HDF_STATUS|Releases the IBI for an I3C device.| +|Transfer | **cntlr**: structure pointer to an I3C controller at the core layer.
    **msgs**: structure pointer to the messages to transfer.
    **count**: number of messages to transfer, which is of the int16_t type.| **msgs**: structure pointer to the messages transferred.| HDF_STATUS| Transfers user messages in I3C mode.| +|i2cTransfer | **cntlr**: structure pointer to an I3C controller at the core layer.
    **msgs**: structure pointer to the messages to transfer.
    **count**: number of messages to transfer, which is of the int16_t type.| **msgs**: structure pointer to the messages transferred.| HDF_STATUS| Transfers user messages in I2C mode.| +|setConfig| **cntlr**: structure pointer to an I3C controller at the core layer.
    **config**: pointer to the controller configuration.| –| HDF_STATUS| Sets an I3C controller.| +|getConfig| **cntlr**: structure pointer to an I3C controller at the core layer.| **config**: pointer to the controller configuration.| HDF_STATUS| Obtains the I3C controller configuration.| +|requestIbi| **device**: structure pointer to an I3C device at the core layer.| –| HDF_STATUS| Requests an IBI for an I3C device.| +|freeIbi| **device**: structure pointer to an I3C device at the core layer.| –| HDF_STATUS| Releases the IBI for an I3C device.| + ### How to Develop The I3C module adaptation involves the following steps: @@ -108,65 +114,65 @@ The I3C module adaptation involves the following steps: 3. Instantiate the I3C controller object. - Initialize **I3cCntlr**. - - Instantiate **I3cMethod** in **I3cCntlr**. For details, see [Available APIs](#available-apis). + - Instantiate **I3cMethod** in **I3cCntlr**. For details, see the description of **I3cMethod** below. 4. Register an interrupt handler. Registers an interrupt handler for the controller to implement the device hot-join and IBI features. - - -## Development Example +### Example 1. Instantiate the driver entry. - The driver entry must be a global variable of the **HdfDriverEntry** type (which is defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **//drivers/hdf_core/framework/include/core/hdf_device_desc.h**), and the module name must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. + Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. - + I3C driver entry example: - - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > The system may have multiple I3C controllers. Therefore, you need to create a manager object in the HDF and publish a manager service to uniformly handle external access requests. Then, the manager service locates the controller to open based on the specified parameters. - > - > The core layer implements the driver of the I3C manager service. You do not need to care about the implementation. However, the **I3cCntlrAdd()** function at the core layer must be called in the implementation of **Init()** to implement related features. - + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > + > Multiple devices may connect to the I3C controller. In the HDF, a manager object needs to be created for this type of devices, and a manager service is published to handle external access requests uniformly. When a device needs to be started, the manager service locates the target device based on the specified parameters. + > + > You do not need to implement the driver of the I3C manager, which is implemented by the core layer. However, the **I3cCntlrAdd** function of the core layer must be invoked in the **Init** function to implement the related features. + ```c static struct HdfDriverEntry g_virtualI3cDriverEntry = { .moduleVersion = 1, .Init = VirtualI3cInit, .Release = VirtualI3cRelease, - .moduleName = "virtual_i3c_driver",// (Mandatory) The value must be the same as that in the .hcs file. + .moduleName = "virtual_i3c_driver", // (Mandatory) The value must be the same as that in the .hcs file. }; - HDF_INIT(g_virtualI3cDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. + HDF_INIT(g_virtualI3cDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. - /* Driver entry of the i3c_core.c manager service at the core layer */ + /* Driver entry of the i3c_core.c manager service at the core layer. */ struct HdfDriverEntry g_i3cManagerEntry = { .moduleVersion = 1, .Init = I3cManagerInit, .Release = I3cManagerRelease, - .moduleName = "HDF_PLATFORM_I3C_MANAGER",// Correspond to device0 in the device_info file. + .moduleName = "HDF_PLATFORM_I3C_MANAGER", // The value must be the same as that of device0 in the device_info.hcs file. }; HDF_INIT(g_i3cManagerEntry); ``` 2. Configure attribute files. - Add **deviceNode** to the **device_info.hcs** file, and configure the device attributes in the **i3c_config.hcs** file. The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the driver implementation and the default values or restriction ranges of the **I3cCntlr** members at the core layer. + Add the **deviceNode** information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file and configure the device attributes in **i3c_config.hcs**. - In the unified service mode, the first device node in the **device_info** file must be the I3C manager. The I3C manager parameters must be set as follows. + The **deviceNode** information is related to the driver entry registration. The device attribute values are closely related to the driver implementation and the default values or value ranges of the **I3cCntlr** members at the core layer. + + In the unified service mode, the first device node in the **device_info.hcs** file must be the I3C manager. The I3C manager parameters must be set as follows: |Parameter|Value| |-|-| |moduleName |HDF_PLATFORM_I3C_MANAGER| - |serviceName|Reserved| + |serviceName|Reserved.| |policy|0| - |cntlrMatchAttr| Reserved | + |cntlrMatchAttr| Reserved.| - Configure I3C controller information from the second node. This node specifies a type of I3C controllers rather than a specific I3C controller. In this example, there is only one I3C controller. If there are multiple I3C controllers, add the **deviceNode** information to the **device_info** file and add the corresponding device attributes to the **i3c_config** file for each controller. + Configure I3C controller information from the second node. This node specifies a type of I3C controllers rather than a specific I3C controller. In this example, there is only one I3C controller. If there are multiple I3C controllers, add the **deviceNode** information to the **device_info.hcs** file and add the corresponding device attributes to the **i3c_config** file for each controller. - - **device_info.hcs** configuration example + - **device_info.hcs** example ```c root { @@ -180,17 +186,17 @@ The I3C module adaptation involves the following steps: } } i3c_virtual :: deviceNode { - policy = 0; // The value 0 indicates that no service is published. - priority = 56; // Driver startup priority. - permission = 0644; // Permission to create device nodes for the driver. - moduleName = "virtual_i3c_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. - serviceName = "VIRTUAL_I3C_DRIVER"; // (Mandatory) Unique name of the service published by the driver. - deviceMatchAttr = "virtual_i3c"; // (Mandatory) Controller private data, which must be same as that of the corresponding controller in i3c_config.hcs. - } // The specific controller information is in i3c_config.hcs. + policy = 0; // The value 0 indicates that no service is published. + priority = 56; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "virtual_i3c_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. + serviceName = "VIRTUAL_I3C_DRIVER"; // (Mandatory) Unique name of the service published by the driver. + deviceMatchAttr = "virtual_i3c"; // (Mandatory) Controller private data, which must be same as that of the controller in i3c_config.hcs. + } // The specific controller information is in i3c_config.hcs. } ``` - - i3c_config.hcs configuration example + - i3c_config.hcs example ```c root { @@ -216,208 +222,245 @@ The I3C module adaptation involves the following steps: } } ``` + After the **i3c_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. + + For example, if the path of **i3c_config.hcs** is **device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/i3c/i3c_config.hcs**, add the following statement to **hdf.hcs** of the product: + + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/i3c/i3c_config.hcs" // Relative path of the file. + ``` + + 3. Instantiate the I3C controller object. - Initialize the **I3cCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **I3cMethod** in **I3cCntlr** (so that the underlying driver functions can be called). - - Instantiate **I3cMethod** in **I3cCntlr**. The **I3cLockMethod** callback structure is not implemented in this example. To instantiate the structure, refer to the I2C driver development. Other members are initialized in **Init()**. - - - Defining a custom structure - - To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **i3c_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the device number and bus number, to the **I3cCntlr** object at the core layer. - - ```c - struct VirtualI3cCntlr { - struct I3cCntlr cntlr; // (Mandatory) Control object at the core layer. For details, see the following description. - volatile unsigned char *regBase; //(Mandatory) Register base address. - uint32_t regBasePhy; // (Mandatory) Physical base address of the register. - uint32_t regSize; // (Mandatory) Bit width of the register. - uint16_t busId; // (Mandatory) Bus number. - uint16_t busMode; - uint16_t IrqNum; - uint32_t i3cMaxRate; - uint32_t i3cRate; - uint32_t i2cFmRate; - uint32_t i2cFmPlusRate; - }; - - /* I3cCntlr is the controller structure at the core layer. The Init function assigns values to the members of I3cCntlr. - struct I3cCntlr { - OsalSpinlock lock; - void *owner; - int16_t busId; - struct I3cConfig config; - uint16_t addrSlot[(I3C_ADDR_MAX + 1) / ADDRS_PER_UINT16]; - struct I3cIbiInfo *ibiSlot[I3C_IBI_MAX]; - const struct I3cMethod *ops; - const struct I3cLockMethod *lockOps; - void *priv; - }; - ``` - - -- **Init** function - - **Input parameter**: - - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs configuration file information. - - **Return value**: - - **HDF_STATUS**
    The table below lists some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. - - | Status| Description| - | -------- | -------- | - | HDF_ERR_INVALID_OBJECT | Invalid controller object.| - | HDF_ERR_MALLOC_FAIL | Failed to allocate memory.| - | HDF_ERR_INVALID_PARAM | Invalid parameter.| - | HDF_ERR_IO | I/O error.| - | HDF_SUCCESS | Transmission successful.| - | HDF_FAILURE | Transmission failed.| - - **Function description**: - - Initializes the custom structure object and **I3cCntlr**, and calls the **I3cCntlrAdd** function to add the I3C controller to the core layer. - - ```c - static int32_t VirtualI3cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) - { - int32_t ret; - struct VirtualI3cCntlr *virtual = NULL; // (Mandatory) Custom structure object. - (void)device; - - virtual = (struct VirtualI3cCntlr *)OsalMemCalloc(sizeof(*virtual)); // (Mandatory) Allocate memory. - if (virtual == NULL) { - HDF_LOGE("%s: Malloc virtual fail!", __func__); - return HDF_ERR_MALLOC_FAIL; - } - - ret = VirtualI3cReadDrs(virtual, node); // (Mandatory) Fill the default values defined in the i3c_config file to the structure. - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); - goto __ERR__; - } - ... - virtual->regBase = OsalIoRemap(virtual->regBasePhy, virtual->regSize);// (Mandatory) Address mapping. - ret = OsalRegisterIrq(hi35xx->softIrqNum, OSAL_IRQF_TRIGGER_NONE, I3cIbiHandle, "I3C", virtual); // (Mandatory) Register an interrupt handler. - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: register irq failed!", __func__); - return ret; - } - ... - VirtualI3cCntlrInit(virtual); // (Mandatory) Initialize the I3C device. - virtual->cntlr.priv = (void *)node; // (Mandatory) Set the storage device attributes. - virtual->cntlr.busId = virtual->busId; // (Mandatory) Initialize I3cCntlr. - virtual->cntlr.ops = &g_method; // (Mandatory) Attach the I3cMethod instance. - (void)OsalSpinInit(&virtual->spin); - ret = I3cCntlrAdd(&virtual->cntlr); // (Mandatory) Call this function to add the controller to the core layer. If a success signal is returned, the driver is completely connected to the core layer. - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: add i3c controller failed! ret = %d", __func__, ret); - (void)OsalSpinDestroy(&virtual->spin); - goto __ERR__; - } - - return HDF_SUCCESS; - __ERR__: // If the controller fails to be added, deinitialize related functions. - if (virtual != NULL) { - OsalMemFree(virtual); - virtual = NULL; - } - - return ret; - } - - static int32_t VirtualI3cInit(struct HdfDeviceObject *device) - { - int32_t ret; - const struct DeviceResourceNode *childNode = NULL; - - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or property is NULL", __func__); - return HDF_ERR_INVALID_OBJECT; - } - - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - ret = VirtualI3cParseAndInit(device, childNode); - if (ret != HDF_SUCCESS) { - break; - } - } - - return ret; - } - ``` - - - -- **Release** function - - **Input parameter**: - - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. - - **Return value**: + Initialize the **I3cCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init**, and **Release**) to instantiate I3cMethod in I3cCntlr (so that the underlying driver functions can be called). - No value is returned. - - **Function description**: + Instantiate **I3cMethod** in **I3cCntlr**.
    The **I3cLockMethod** hook function structure is not implemented in this example. To instantiate the structure, refer to the I2C driver development. Other members are initialized in **Init()**. - Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + - Define a custom structure. - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > All forced conversion operations for obtaining the corresponding object can be successful only when the **Init** function has the value assignment operations. + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > + > To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **i3c_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the device number and bus number, to the **I3cCntlr** object at the core layer. - ```c - static void VirtualI3cRemoveByNode(const struct DeviceResourceNode *node) - { - int32_t ret; - int16_t busId; - struct I3cCntlr *cntlr = NULL; - struct VirtualI3cCntlr *virtual = NULL; - struct DeviceResourceIface *drsOps = NULL; - - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (drsOps == NULL || drsOps->GetUint32 == NULL) { - HDF_LOGE("%s: invalid drs ops fail!", __func__); - return; - } - - ret = drsOps->GetUint16(node, "busId", (uint16_t *)&busId, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read busId fail!", __func__); - return; - } - ... - /* Call I3cCntlrGet() to obtain the I3cCntlr object based on the cntlrNum of the device, and then call I3cCntlrRemove() to release the I3cCntlr object. */ - cntlr = I3cCntlrGet(busId); - if (cntlr != NULL && cntlr->priv == node) { - I3cCntlrPut(cntlr); - I3cCntlrRemove(cntlr); // (Mandatory) Remove the I3cCntlr object from the manager driver. - virtual = (struct VirtualI3cCntlr *)cntlr; // (Mandatory) Obtain the custom object through a forced conversion and perform the release operation. - (void)OsalSpinDestroy(&virtual->spin); - OsalMemFree(virtual); - } - return; - } - - static void VirtualI3cRelease(struct HdfDeviceObject *device) - { - const struct DeviceResourceNode *childNode = NULL; - - HDF_LOGI("%s: enter", __func__); - - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or property is NULL", __func__); + ```c + struct VirtualI3cCntlr { + struct I3cCntlr cntlr; // (Mandatory) Control object at the core layer. For details, see the following description. + volatile unsigned char *regBase; // (Mandatory) Register base address. + uint32_t regBasePhy // (Mandatory) Physical base address of the register. + uint32_t regSize; // (Mandatory) Register bit width. + uint16_t busId; // (Mandatory) Bus number. + uint16_t busMode; + uint16_t IrqNum; + uint32_t i3cMaxRate; + uint32_t i3cRate; + uint32_t i2cFmRate; + uint32_t i2cFmPlusRate; + }; + + /* I3cCntlr is the controller structure at the core layer. The Init function assigns values to the members of I3cCntlr. */ + struct I3cCntlr { + OsalSpinlock lock; + void *owner; + int16_t busId; + struct I3cConfig config; + uint16_t addrSlot[(I3C_ADDR_MAX + 1) / ADDRS_PER_UINT16]; + struct I3cIbiInfo *ibiSlot[I3C_IBI_MAX]; + const struct I3cMethod *ops; + const struct I3cLockMethod *lockOps; + void *priv; + }; + ``` + + - Implement the **Init** function. + + **Input parameter**: + + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. + + **Return value**: + + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. + + + |Status|Description| + |:-|:-:| + |HDF_ERR_INVALID_OBJECT|Invalid controller object.| + |HDF_ERR_INVALID_PARAM |Invalid parameter.| + |HDF_ERR_MALLOC_FAIL |Failed to allocate the memory.| + |HDF_ERR_IO |I/O error.| + |HDF_SUCCESS |Transmission successful.| + |HDF_FAILURE |Transmission failed.| + + **Function description**: + + Initializes the custom structure object and **I3cCntlr**, and calls the **I3cCntlrAdd** function to add the I3C controller to the core layer. + + ```c + static int32_t VirtualI3cParseAndInit(struct HdfDeviceObject *device, const struct DeviceResourceNode *node) + { + int32_t ret; + struct VirtualI3cCntlr *virtual = NULL; // (Mandatory) Custom structure object. + (void)device; + + virtual = (struct VirtualI3cCntlr *)OsalMemCalloc(sizeof(*virtual)); // (Mandatory) Allocate memory. + if (virtual == NULL) { + HDF_LOGE("%s: Malloc virtual fail!", __func__); + return HDF_ERR_MALLOC_FAIL; + } + + ret = VirtualI3cReadDrs(virtual, node); // (Mandatory) Use the default values in the i3c_config file to fill in the structure. For details about the function definition, see the following. + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: Read drs fail! ret:%d", __func__, ret); + goto __ERR__; + } + ... + virtual->regBase = OsalIoRemap(virtual->regBasePhy, virtual->regSize);// (Mandatory) Address mapping. + ret = OsalRegisterIrq(hi35xx->softIrqNum, OSAL_IRQF_TRIGGER_NONE, I3cIbiHandle, "I3C", virtual); // (Mandatory) Register an interrupt handler. + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: register irq failed!", __func__); + return ret; + } + ... + VirtualI3cCntlrInit(virtual); // (Mandatory) Initialize the I3C device. + virtual->cntlr.priv = (void *)node; // (Mandatory) Set the storage device attributes. + virtual->cntlr.busId = virtual->busId; // (Mandatory) Initialize I3cCntlr. + virtual->cntlr.ops = &g_method; // (Mandatory) Attach the I3cMethod instance. + (void)OsalSpinInit(&virtual->spin); + ret = I3cCntlrAdd(&virtual->cntlr); // (Mandatory) Call this function to add the controller to the core layer. The driver can access the platform core layer only when a success signal is returned. + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: add i3c controller failed! ret = %d", __func__, ret); + (void)OsalSpinDestroy(&virtual->spin); + goto __ERR__; + } + + return HDF_SUCCESS; + __ERR__: // If the controller fails to be added, deinitialize related functions. + if (virtual != NULL) { + OsalMemFree(virtual); + virtual = NULL; + } + + return ret; + } + + static int32_t VirtualI3cInit(struct HdfDeviceObject *device) + { + int32_t ret; + const struct DeviceResourceNode *childNode = NULL; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return HDF_ERR_INVALID_OBJECT; + } + + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + ret = VirtualI3cParseAndInit(device, childNode); + if (ret != HDF_SUCCESS) { + break; + } + } + + return ret; + } + + static int32_t VirtualI3cReadDrs(struct VirtualI3cCntlr *virtual, const struct DeviceResourceNode *node) + { + struct DeviceResourceIface *drsOps = NULL; + + /* Obtain the drsOps method. */ + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetUint16 == NULL) { + HDF_LOGE("%s: Invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + /* Read the configuration parameters in sequence and fill them in the structure. */ + if (drsOps->GetUint16(node, "busId", &virtual->busId, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read busId fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint16(node, "busMode", &virtual->busMode, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read busMode fail!", __func__); + return HDF_ERR_IO; + } + if (drsOps->GetUint16(node, "IrqNum", &virtual->IrqNum, 0) != HDF_SUCCESS) { + HDF_LOGE("%s: Read IrqNum fail!", __func__); + return HDF_ERR_IO; + } + ··· + return HDF_SUCCESS; + } + ``` + + - Implement the **Release** function. + + **Input parameter**: + + **HdfDeviceObject**, an interface parameter provided by the driver, contains the .hcs information. + + **Return value**: + + No value is returned. + + **Function description**: + + Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + + > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** + > + > All forced conversion operations for obtaining the corresponding object can be successful only when the **Init** function has the value assignment operations. + + ```c + static void VirtualI3cRemoveByNode(const struct DeviceResourceNode *node) + { + int32_t ret; + int16_t busId; + struct I3cCntlr *cntlr = NULL; + struct VirtualI3cCntlr *virtual = NULL; + struct DeviceResourceIface *drsOps = NULL; + + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return; + } + + ret = drsOps->GetUint16(node, "busId", (uint16_t *)&busId, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read busId fail!", __func__); + return; + } + ... + /* Call I3cCntlrGet() to obtain the I3cCntlr object based on the cntlrNum of the device, and then call I3cCntlrRemove() to release the I3cCntlr object. */ + cntlr = I3cCntlrGet(busId); + if (cntlr != NULL && cntlr->priv == node) { + I3cCntlrPut(cntlr); + I3cCntlrRemove(cntlr); // (Mandatory) Remove the I3cCntlr object from the manager driver. + virtual = (struct VirtualI3cCntlr *)cntlr; // (Mandatory) Obtain the custom object through a forced conversion and perform the release operation. + (void)OsalSpinDestroy(&virtual->spin); + OsalMemFree(virtual); + } return; } - ... - // Traverse and parse all nodes in i3c_config.hcs and perform the release operation on each node. - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { - VirtualI3cRemoveByNode(childNode); // See the description of VirtualI3cRemoveByNode for more details. + + static void VirtualI3cRelease(struct HdfDeviceObject *device) + { + const struct DeviceResourceNode *childNode = NULL; + + HDF_LOGI("%s: enter", __func__); + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is NULL", __func__); + return; + } + ... + /* Traverse and parse all nodes in i3c_config.hcs and perform the release operation on each node. */ + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { + VirtualI3cRemoveByNode(childNode); // See the description of VirtualI3cRemoveByNode for more details. + } } - } - ``` + ``` 4. Register an interrupt handler. @@ -445,12 +488,10 @@ The I3C module adaptation involves the following steps: HDF_LOGD("%s: Reserved address which is not supported!", __func__); break; } - + return HDF_SUCCESS; } - ``` - - ```c + static int32_t I3cIbiHandle(uint32_t irq, void *data) { struct VirtualI3cCntlr *virtual = NULL; diff --git a/en/device-dev/driver/driver-platform-mmc-develop.md b/en/device-dev/driver/driver-platform-mmc-develop.md index 6b9f16227b..e07e4a4e53 100644 --- a/en/device-dev/driver/driver-platform-mmc-develop.md +++ b/en/device-dev/driver/driver-platform-mmc-develop.md @@ -1,50 +1,86 @@ # MMC - ## Overview -In the Hardware Driver Foundation (HDF), the MultiMedia Card (MMC) uses the independent service mode for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. +### Function - **Figure 1** Independent service mode +A multimedia card (MMC) is a small-sized and large-capacity flash memory card used for solid-state non-volatile storage. - ![image](figures/independent-service-mode.png "MMC independent service mode") +Nowadays, MMC refers to a standard driver interface to solid-state storage cards. Memory devices that comply with this standard can be called MMCs. An MMC consists of the MMC controller, MMC bus, and memory card, which can be an MMC, Secure Digital (SD) card, Secure Digital Input Output (SDIO) card, or TransFlash (TF) card. +The MMC, SD, and SDIO buses have similar bus specifications, which have evolved from the MMC bus specifications. The MMC features multimedia storage; the SD focuses on security and data protection; the SDIO, evolving from the SD, provides the interface regardless of the specific form of the peer end (Wi-Fi, Bluetooth, or GPS device). -## Available APIs +### Basic Concepts -**MmcCntlrOps**: +- SD card + Introduced as an improvement over the MMC, the SD cards can protect their contents from erasure or modification, prevent unauthorized access, and protect copyrighted content using digital rights management. The size of a standard SD card is 24 mm x 32 mm x 2.1 mm, which is a little thicker than an MMC card. The SD cards are forward compatible with MMC cards, that is, all devices that support SD cards also support MMC cards. -``` +- SDIO + + SDIO is an interface designed as an extension for the SD card standard. It introduces the low-speed transfer standard, which supports low-speed I/O with the minimum hardware overhead. The SDIO interface is compatible with the SD cards. + +### Working Principles + +In the Hardware Driver Foundation (HDF), the MMC uses the independent service mode (see Figure 1) for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. + +In the independent service mode, the core layer does not publish a service for the upper layer. Therefore, a service must be published for each controller. To achieve this purpose: + +- You need to implement the **Bind()** function in **HdfDriverEntry** to bind services. +- The **policy** field of **deviceNode** in the **device_info.hcs** file must be **1** or **2**, but not **0**. + +The MMC module is divided into the following layers: + +- Interface layer: provides APIs for opening an MMC device, checking whether the MMC controller has devices, and closing an MMC device. +- Core layer: provides the capabilities of adding or removing an MMC controller, performing device management, and providing common controller services. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. + +**Figure 1** Independent service mode + +![img1](figures/independent-service-mode.png) + +## Development Guidelines + +### When to Use + +The MMC is used to store multimedia files. Before using your MMC device with OpenHarmony, you need to perform MMC driver adaptation. + +### Available APIs + +To enable the upper layer to successfully operate the MMC controller by calling the MMC APIs, hook functions are defined in **//drivers/hdf_core/framework/model/storage/include/mmc/mmc_corex.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +**MmcCntlrOps**: + +```c struct MmcCntlrOps { - int32_t (*request)(struct MmcCntlr *cntlr, struct MmcCmd *cmd); - int32_t (*setClock)(struct MmcCntlr *cntlr, uint32_t clock); - int32_t (*setPowerMode)(struct MmcCntlr *cntlr, enum MmcPowerMode mode); - int32_t (*setBusWidth)(struct MmcCntlr *cntlr, enum MmcBusWidth width); - int32_t (*setBusTiming)(struct MmcCntlr *cntlr, enum MmcBusTiming timing); - int32_t (*setSdioIrq)(struct MmcCntlr *cntlr, bool enable); - int32_t (*hardwareReset)(struct MmcCntlr *cntlr); - int32_t (*systemInit)(struct MmcCntlr *cntlr); - int32_t (*setEnhanceStrobe)(struct MmcCntlr *cntlr, bool enable); - int32_t (*switchVoltage)(struct MmcCntlr *cntlr, enum MmcVolt volt); - bool (*devReadOnly)(struct MmcCntlr *cntlr); - bool (*devPlugged)(struct MmcCntlr *cntlr); - bool (*devBusy)(struct MmcCntlr *cntlr); - int32_t (*tune)(struct MmcCntlr *cntlr, uint32_t cmdCode); - int32_t (*rescanSdioDev)(struct MmcCntlr *cntlr); + int32_t (*request)(struct MmcCntlr *cntlr, struct MmcCmd *cmd); + int32_t (*setClock)(struct MmcCntlr *cntlr, uint32_t clock); + int32_t (*setPowerMode)(struct MmcCntlr *cntlr, enum MmcPowerMode mode); + int32_t (*setBusWidth)(struct MmcCntlr *cntlr, enum MmcBusWidth width); + int32_t (*setBusTiming)(struct MmcCntlr *cntlr, enum MmcBusTiming timing); + int32_t (*setSdioIrq)(struct MmcCntlr *cntlr, bool enable); + int32_t (*hardwareReset)(struct MmcCntlr *cntlr); + int32_t (*systemInit)(struct MmcCntlr *cntlr); + int32_t (*setEnhanceStrobe)(struct MmcCntlr *cntlr, bool enable); + int32_t (*switchVoltage)(struct MmcCntlr *cntlr, enum MmcVolt volt); + bool (*devReadOnly)(struct MmcCntlr *cntlr); + bool (*devPlugged)(struct MmcCntlr *cntlr); + bool (*devBusy)(struct MmcCntlr *cntlr); + int32_t (*tune)(struct MmcCntlr *cntlr, uint32_t cmdCode); + int32_t (*rescanSdioDev)(struct MmcCntlr *cntlr); }; ``` - **Table 1** Description of callback functions in MmcCntlrOps +**Table 1** Hook functions in **MmcCntlrOps** | Function| Input Parameter| Return Value| Description| | -------- | -------- | -------- | -------- | | doRequest | **cntlr**: structure pointer to the MMC controller at the core layer.
    **cmd**: structure pointer to the command to execute.| HDF_STATUS| Processes the request.| | setClock | **cntlr**: structure pointer to the MMC controller at the core layer.
    **clock**: clock frequency to set.| HDF_STATUS| Sets the clock frequency.| -| setPowerMode | **cntlr**: structure pointer to the MMC controller at the core layer.
    **mode**: power consumption mode, which is an enumerated value.| HDF_STATUS| Sets the power consumption mode.| -| setBusWidth | **cntlr**: structure pointer to the MMC controller at the core layer.
    **width**: bus width, which is an enumerated value.| HDF_STATUS| Sets the bus width.| -| setBusTiming | **cntlr**: structure pointer to the MMC controller at the core layer.
    **timing**: bus timing, which is an enumerated value.| HDF_STATUS| Sets the bus timing.| -| setSdioIrq | **cntlr**: structure pointer to the MMC controller at the core layer.
    **enable**: whether to enable Secure Digital Input Output (SDIO) interrupts.| HDF_STATUS| Enables or disables SDIO interrupts.| +| setPowerMode | **cntlr**: structure pointer to the MMC controller at the core layer.
    **mode**: power consumption mode. For details, see **MmcPowerMode**.| HDF_STATUS| Sets the power consumption mode.| +| setBusWidth | **cntlr**: structure pointer to the MMC controller at the core layer.
    **width**: bus width. For details, see **MmcBusWidth**.| HDF_STATUS| Sets the bus width.| +| setBusTiming | **cntlr**: structure pointer to the MMC controller at the core layer.
    **timing**: bus timing. For details, see **MmcBusTiming**.| HDF_STATUS| Sets the bus timing.| +| setSdioIrq | **cntlr**: structure pointer to the MMC controller at the core layer.
    **enable**: whether to enable SDIO interrupts.| HDF_STATUS| Enables or disables SDIO interrupts.| | hardwareReset | **cntlr**: structure pointer to the MMC controller at the core layer.| HDF_STATUS| Resets hardware.| | systemInit | **cntlr**: structure pointer to the MMC controller at the core layer.| HDF_STATUS| Performs system initialization.| | setEnhanceStrobe | **cntlr**: structure pointer to the MMC controller at the core layer.
    **enable**: whether to enable the enhanced strobe feature.| HDF_STATUS| Sets the enhanced strobe feature.| @@ -52,170 +88,161 @@ struct MmcCntlrOps { | devReadOnly | **cntlr**: structure pointer to the MMC controller at the core layer.| Boolean value| Checks whether the device is read-only.| | cardPlugged | **cntlr**: structure pointer to the MMC controller at the core layer.| Boolean value| Checks whether the device is removed.| | devBusy | **cntlr**: structure pointer to the MMC controller at the core layer.| Boolean value| Checks whether the device is being used.| -| tune | **cntlr**: structure pointer to the MMC controller at the core layer.
    **cmdCode**: command code of the uint32_t type.| HDF_STATUS| Tunes the oscillator circuit frequency.| +| tune | **cntlr**: structure pointer to the MMC controller at the core layer.
    **cmdCode**: command code, which is of the uint32_t type.| HDF_STATUS| Tunes the oscillator circuit frequency.| | rescanSdioDev | **cntlr**: structure pointer to the MMC controller at the core layer.| HDF_STATUS| Scans and adds an SDIO device.| +### How to Develop -## How to Develop - -The MMC module adaptation involves the following steps: +The MMC module adaptation procedure is as follows: 1. Instantiate the driver entry. - - Instantiate the **HdfDriverEntry** structure. - - Call **HDF_INIT** to register the **HdfDriverEntry** instance with the HDF. - 2. Configure attribute files. - - Add the **deviceNode** information to the **device_info.hcs** file. - - (Optional) Add the **mmc_config.hcs** file. - 3. Instantiate the MMC controller object. - - Initialize **MmcCntlr**. - - Instantiate **MmcCntlrOps** in the **MmcCntlr** object. - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > For details about the functions in **MmcCntlrOps**, see [Available APIs](#available-apis). - 4. Debug the driver. - (Optional) For new drivers, verify the basic functions, for example, check the information returned after the **MmcCntlrOps** instance is attached and whether the device starts successfully. - - -## Development Example +### Example -The following uses **himci.c** as an example to present the information required for implementing device functions. +The following uses the **//device_soc_hisilicon/common/platform/mmc/himci_v200/himci.c** driver of the Hi3516D V300 development board as an example to describe the driver adaptation. 1. Instantiate the driver entry. The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. - MMC driver entry example: - - ``` + MMC driver entry example: + + ```c struct HdfDriverEntry g_mmcDriverEntry = { .moduleVersion = 1, - .Bind = HimciMmcBind, // See the Bind function. - .Init = HimciMmcInit, // See the Init function. - .Release = HimciMmcRelease, // See the Release function. - .moduleName = "hi3516_mmc_driver",// (Mandatory) The value must be the same as that of moduleName in the .hcs file. + .Bind = HimciMmcBind, // See the Bind function. + .Init = HimciMmcInit, // See the Init function. + .Release = HimciMmcRelease, // See the Release function. + .moduleName = "hi3516_mmc_driver", // (Mandatory) The value must be the same as that of moduleName in the .hcs file. }; - HDF_INIT(g_mmcDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. + HDF_INIT(g_mmcDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. ``` -2. Add the **deviceNode** information to the **device_info.hcs** file and configure the device attributes in the **mmc_config.hcs** file. - - The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the default values or value ranges of the **MmcCntlr** members at the core layer. - - If there are multiple devices, you need to add the **deviceNode** information to the **device_info** file and add the device attributes to the **mmc_config** file for each device. - - - **device_info.hcs** configuration example - - - ``` - root { - device_info { - match_attr = "hdf_manager"; - platform :: host { - hostName = "platform_host"; - priority = 50; - device_mmc:: device { - device0 :: deviceNode { - policy = 2; - priority = 10; - permission = 0644; - moduleName = "hi3516_mmc_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. - serviceName = "HDF_PLATFORM_MMC_0"; // (Mandatory) Unique name of the service published by the driver. - deviceMatchAttr = "hi3516_mmc_emmc";// (Mandatory) Private data of the controller. The value must be the same as the controller information in mmc_config.hcs. - } - device1 :: deviceNode { - policy = 1; - priority = 20; - permission = 0644; - moduleName = "hi3516_mmc_driver"; - serviceName = "HDF_PLATFORM_MMC_1"; - deviceMatchAttr = "hi3516_mmc_sd"; // The MMC is an SD card. - } - device2 :: deviceNode { - policy = 1; - priority = 30; - permission = 0644; - moduleName = "hi3516_mmc_driver"; - serviceName = "HDF_PLATFORM_MMC_2"; - deviceMatchAttr = "hi3516_mmc_sdio";// The MMC is an SDIO card. - } - } - } - } - } - ``` - - - **mmc_config.hcs** configuration example - - - ``` - root { - platform { - mmc_config { - template mmc_controller { // Template configuration. In the template, you can configure the common parameters shared by device nodes. - match_attr = ""; - voltDef = 0; // 3.3V - freqMin = 50000; // (Mandatory) Minimum frequency - freqMax = 100000000; // (Mandatory) Maximum frequency - freqDef = 400000; // (Mandatory) Default frequency - maxBlkNum = 2048; // (Mandatory) Maximum block number - maxBlkSize = 512; // (Mandatory) Maximum number of blocks - ocrDef = 0x300000; // (Mandatory) Working voltage. - caps2 = 0; // (Mandatory) Attribute register. For details, see MmcCaps2 in mmc_caps.h. - regSize = 0x118; // (Mandatory) Register bit width - hostId = 0; // (Mandatory) Host ID - regBasePhy = 0x10020000;// (Mandatory) Physical base address of the register - irqNum = 63; // (Mandatory) Interrupt number - devType = 2; // (Mandatory) Device type, which can be eMMC, SD, SDIO, or COMBO. - caps = 0x0001e045; // (Mandatory) Attribute register. For details, see MmcCaps in mmc_caps.h. - } - controller_0x10100000 :: mmc_controller { - match_attr = "hi3516_mmc_emmc";// (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. - hostId = 0; - regBasePhy = 0x10100000; - irqNum = 96; - devType = 0; // The MMC is an eMMC card. - caps = 0xd001e045; - caps2 = 0x60; - } - controller_0x100f0000 :: mmc_controller { - match_attr = "hi3516_mmc_sd"; - hostId = 1; - regBasePhy = 0x100f0000; - irqNum = 62; - devType = 1; // The MMC is an SD card. - caps = 0xd001e005; - } - controller_0x10020000 :: mmc_controller { - match_attr = "hi3516_mmc_sdio"; - hostId = 2; - regBasePhy = 0x10020000; - irqNum = 63; - devType = 2; // The MMC is an SDIO card. - caps = 0x0001e04d; - } - } - } - } - ``` - -3. Initialize the **MmcCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init**, and **Release**) to instantiate **MmcCntlrOps** in **MmcCntlr** (so that the underlying driver functions can be called). - - - Defining a custom structure +2. Configure attribute files. - To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **mmc_config.hcs** file to initialize the members in the custom structure and passes important parameters to the **MmcCntlr** object at the core layer. + Add the deviceNode information to the **device_info.hcs** file. The deviceNode information is related to the driver entry registration. The following example uses three MMC controllers as an example. If there are more MMC controllers, add the deviceNode information to the **device_info.hcs** file for each controller. The device attribute values configured in **mmc_config.hcs** are closely related to the default values or value ranges of the **MmcCntlr** members at the core layer. + + - **device_info.hcs** example: + + Add the deviceNode information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. + + ```c + root { + device_info { + match_attr = "hdf_manager"; + platform :: host { + hostName = "platform_host"; + priority = 50; + device_mmc:: device { + device0 :: deviceNode { // DeviceNode of the driver. + policy = 2; // The value 2 means to publish services for both kernel- and user-mode processes. + priority = 10; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "hi3516_mmc_driver"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. + serviceName = "HDF_PLATFORM_MMC_0"; // (Mandatory) Unique name of the service published by the driver. + deviceMatchAttr = "hi3516_mmc_emmc"; // (Mandatory) Private data of the controller. The value must be the same as the controller information in mmc_config.hcs. + } + device1 :: deviceNode { + policy = 1; + priority = 20; + permission = 0644; + moduleName = "hi3516_mmc_driver"; + serviceName = "HDF_PLATFORM_MMC_1"; + deviceMatchAttr = "hi3516_mmc_sd"; // The MMC is an SD card. + } + device2 :: deviceNode { + policy = 1; + priority = 30; + permission = 0644; + moduleName = "hi3516_mmc_driver"; + serviceName = "HDF_PLATFORM_MMC_2"; + deviceMatchAttr = "hi3516_mmc_sdio"; // The MMC is an SDIO card. + } + ... + } + } + } + } + ``` - + - **mmc_config.hcs** example + + Configure the device attributes in the **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/mmc/mmc_config.hcs** file. The parameters are as follows: + + ```c + root { + platform { + mmc_config { + template mmc_controller { // Template configuration. If the template is used to configure device node information, the default values in the template will be used for the fields that are not declared for the node. + match_attr = ""; + voltDef = 0; // MMC default voltage. The value 0 stands for 3.3 V, 1 for 1.8 V, and 2 for 1.2 V. + freqMin = 50000; // (Mandatory) Minimum frequency. + freqMax = 100000000; // (Mandatory) Maximum frequency. + freqDef = 400000; // (Mandatory) Default frequency. + maxBlkNum = 2048; // (Mandatory) Maximum block number. + maxBlkSize = 512; // (Mandatory) Maximum block size. + ocrDef = 0x300000; // (Mandatory) working voltage. + caps2 = 0; // (Mandatory) Attribute register. For details, see MmcCaps2 in mmc_caps.h. + regSize = 0x118; // (Mandatory) Register size. + hostId = 0; // (Mandatory) Host number. + regBasePhy = 0x10020000; // (Mandatory) Physical base address of the register. + irqNum = 63; // (Mandatory) IRQ number. + devType = 2; // (Mandatory) Device type, which can be eMMC, SD, SDIO, or COMBO. + caps = 0x0001e045; // (Mandatory) Attribute register. For details, see MmcCaps in mmc_caps.h. + } + controller_0x10100000 :: mmc_controller { + match_attr = "hi3516_mmc_emmc"; // (Mandatory) The value must be the same as deviceMatchAttr in device_info.hcs. + hostId = 0; + regBasePhy = 0x10100000; + irqNum = 96; + devType = 0; // The device is an eMMC card. + caps = 0xd001e045; + caps2 = 0x60; + } + controller_0x100f0000 :: mmc_controller { + match_attr = "hi3516_mmc_sd"; + hostId = 1; + regBasePhy = 0x100f0000; + irqNum = 62; + devType = 1; // The device is an SD card. + caps = 0xd001e005; + } + controller_0x10020000 :: mmc_controller { + match_attr = "hi3516_mmc_sdio"; + hostId = 2; + regBasePhy = 0x10020000; + irqNum = 63; + devType = 2; // The device is an SDIO card. + caps = 0x0001e04d; + } + } + } + } + ``` + + After the **mmc_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. + + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/mmc/mmc_config.hcs" // Relative path of the file. ``` + +3. Instantiate the MMC controller object. + + Initialize the **MmcCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **MmcCntlrOps** in **MmcCntlr** (so that the underlying driver functions can be called). + + - Define a custom structure. + + To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **mmc_config.hcs** file to initialize the members in the custom structure and passes important parameters to the **MmcCntlr** object at the core layer. + + ```c struct HimciHost { - struct MmcCntlr *mmc;// (Mandatory) Core layer structure - struct MmcCmd *cmd; // (Mandatory) Core layer structure used to pass commands. For details about related commands, see MmcCmdCode. - //(Optional) Set parameters based on actual requirements. - void *base; + struct MmcCntlr *mmc; // (Mandatory) Core layer control object. + struct MmcCmd *cmd // (Mandatory) Core layer structure used to pass commands. For details about related commands, see MmcCmdCode. + void *base; // Register base address used for address mapping. enum HimciPowerStatus powerStatus; uint8_t *alignedBuff; uint32_t buffLen; @@ -260,37 +287,39 @@ The following uses **himci.c** as an example to present the information required }; ``` - - Instantiating **MmcCntlrOps** in **MmcCntlr** (other members are initialized by **Bind**) + - Instantiate **MmcCntlrOps** in **MmcCntlr**. - - ``` + ```c static struct MmcCntlrOps g_himciHostOps = { - .request = HimciDoRequest, - .setClock = HimciSetClock, - .setPowerMode = HimciSetPowerMode, - .setBusWidth = HimciSetBusWidth, - .setBusTiming = HimciSetBusTiming, - .setSdioIrq = HimciSetSdioIrq, - .hardwareReset = HimciHardwareReset, - .systemInit = HimciSystemInit, - .setEnhanceStrobe= HimciSetEnhanceStrobe, - .switchVoltage = HimciSwitchVoltage, - .devReadOnly = HimciDevReadOnly, - .devPlugged = HimciCardPlugged, - .devBusy = HimciDevBusy, - .tune = HimciTune, - .rescanSdioDev = HimciRescanSdioDev, + .request = HimciDoRequest, + .setClock = HimciSetClock, + .setPowerMode = HimciSetPowerMode, + .setBusWidth = HimciSetBusWidth, + .setBusTiming = HimciSetBusTiming, + .setSdioIrq = HimciSetSdioIrq, + .hardwareReset = HimciHardwareReset, + .systemInit = HimciSystemInit, + .setEnhanceStrobe = HimciSetEnhanceStrobe, + .switchVoltage = HimciSwitchVoltage, + .devReadOnly = HimciDevReadOnly, + .devPlugged = HimciCardPlugged, + .devBusy = HimciDevBusy, + .tune = HimciTune, + .rescanSdioDev = HimciRescanSdioDev, }; ``` - - **Bind** function + + - Implement the **Bind** function. **Input parameter**: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. **Return value**: - **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. + + **Table 2** HDF_STATUS description | Status| Description| | -------- | -------- | @@ -303,10 +332,9 @@ The following uses **himci.c** as an example to present the information required **Function description**: - Initializes the custom structure **HimciHost** object and **MmcCntlr**, and calls the **MmcCntlrAdd** function at the core layer. **MmcCntlr**, **HimciHost**, and **HdfDeviceObject** assign values with each other so that other functions can be converted successfully. + Initializes the **HimciHost** object and **MmcCntlr**, and calls the **MmcCntlrAdd** function at the core layer to add the MMC controllers. - - ``` + ```c static int32_t HimciMmcBind(struct HdfDeviceObject *obj) { struct MmcCntlr *cntlr = NULL; @@ -315,34 +343,34 @@ The following uses **himci.c** as an example to present the information required cntlr = (struct MmcCntlr *)OsalMemCalloc(sizeof(struct MmcCntlr)); host = (struct HimciHost *)OsalMemCalloc(sizeof(struct HimciHost)); - host->mmc = cntlr; // (Mandatory) Prerequisites for conversion between HimciHost and MmcCntlr. - cntlr->priv = (void *)host; // (Mandatory) Prerequisites for conversion between HimciHost and MmcCntlr. - cntlr->ops = &g_himciHostOps; // (Mandatory) Attach the MmcCntlrOps instance. - cntlr->hdfDevObj = obj; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and MmcCntlr. - obj->service = &cntlr->service; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and MmcCntlr. - ret = MmcCntlrParse(cntlr, obj); // (Mandatory) Initialize MmcCntlr. If the initialization fails, execute goto _ERR. - ... - ret = HimciHostParse(host, obj); // (Mandatory) Initialize HimciHost. If the initialization fails, execute goto _ERR. + host->mmc = cntlr; // (Mandatory) Prerequisites for conversion between HimciHost and MmcCntlr. + cntlr->priv = (void *)host; // (Mandatory) Prerequisites for conversion between HimciHost and MmcCntlr. + cntlr->ops = &g_himciHostOps; // (Mandatory) Attach the MmcCntlrOps instance to MmcCntlr. + cntlr->hdfDevObj = obj; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and MmcCntlr. + obj->service = &cntlr->service; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and MmcCntlr. + ret = MmcCntlrParse(cntlr, obj); // (Mandatory) Initialize MmcCntlr. If the initialization fails, execute goto _ERR. + ... + ret = HimciHostParse(host, obj); // (Mandatory) Initialize HimciHost. If the initialization fails, execute goto _ERR. ... - ret = HimciHostInit(host, cntlr); // Customized initialization. If the initialization fails, execute goto _ERR. + ret = HimciHostInit(host, cntlr); // Customized initizlization. If the initialization fails, goto _ERR. ... - ret = MmcCntlrAdd(cntlr); // Call the functions at the core layer. If the operation fails, execute goto _ERR. + ret = MmcCntlrAdd(cntlr); // Call MmcCntlrAdd at the core layer. If the operation fails, execute goto _ERR. ... - (void)MmcCntlrAddDetectMsgToQueue(cntlr);// Add the card detection message to the queue. + (void)MmcCntlrAddDetectMsgToQueue(cntlr); // Add the card detection message to the queue. HDF_LOGD("HimciMmcBind: success."); return HDF_SUCCESS; - _ERR: + ERR: HimciDeleteHost(host); HDF_LOGD("HimciMmcBind: fail, err = %d.", ret); return ret; } ``` - - **Init** function + - Implement the **Init** function. **Input parameter**: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. **Return value**: @@ -352,8 +380,7 @@ The following uses **himci.c** as an example to present the information required Implements **ProcMciInit**. - - ``` + ```c static int32_t HimciMmcInit(struct HdfDeviceObject *obj) { static bool procInit = false; @@ -368,11 +395,12 @@ The following uses **himci.c** as an example to present the information required return HDF_SUCCESS; } ``` - - **Release** function + + - Implement the **Release** function. **Input parameter**: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. **Return value**: @@ -380,19 +408,22 @@ The following uses **himci.c** as an example to present the information required **Function description**: - Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + Releases the memory and deletes the controller. This function assigns values to **Release()** in the driver entry structure. If the HDF fails to call **Init()** to initialize the driver, **Release()** is called to release driver resources. > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    > All forced conversion operations for obtaining the corresponding object can be successful only when **Init()** has the corresponding value assignment operations. - - static void HimciMmcRelease(struct HdfDeviceObject *obj) + ```c + static void HimciMmcRelease(struct HdfDeviceObject *obj) { struct MmcCntlr *cntlr = NULL; ... - cntlr = (struct MmcCntlr *)obj->service; // Forcibly convert HdfDeviceObject to MmcCntlr by using service. For details about the value assignment, see the Bind function. + cntlr = (struct MmcCntlr *)obj->service; // Forcibly convert HdfDeviceObject to MmcCntlr by using service. For details about the value assignment, see the Bind function. ... - HimciDeleteHost((struct HimciHost *)cntlr->priv);// Customized memory release function. A forced conversion from MmcCntlr to HimciHost is involved in the process. + HimciDeleteHost((struct HimciHost *)cntlr->priv); // Memory release function customized. Forced conversion between MmcCntlr and HimciHost is involved. } + ``` +4. Debug the driver. + (Optional) For new drivers, verify basic functions, for example, check the information returned after the driver is attached and whether data is successfully transmitted. diff --git a/en/device-dev/driver/driver-platform-pin-des.md b/en/device-dev/driver/driver-platform-pin-des.md index 607807085a..fc520123f5 100644 --- a/en/device-dev/driver/driver-platform-pin-des.md +++ b/en/device-dev/driver/driver-platform-pin-des.md @@ -1,103 +1,106 @@ -# Pin +# Pin +## Overview -## Overview +### Function -### Pin +The pin module, also called pin controller, manages pin resources of the system on a chip (SoC) and implements the pin multiplexing function. -The pin module, also called pin controller, manages pin resources of system on a chip (SoC) vendors and provides the pin multiplexing function. -The module defines a set of common methods for managing pins, including: - - Obtaining or releasing the pin description handle: The kernel compares the pin name passed in with the pin names of each controller in the linked list. If a match is found, a pin description handle is obtained. After the operation on the pin is complete, the pin description handle will be released. -- Setting or obtaining the pull type of a pin: The pull type can be pull-up, pull-down, or floating. -- Setting or obtaining the pull strength of a pin: You can set the pull strength as required. -- Setting or obtaining the functions of a pin to implement pin multiplexing +The pin module provides a set of APIs for pin management, including: -### Basic Concepts -Pin, as a software concept, provides APIs for uniformly managing the pins from different SoC vendors, providing the pin multiplexing function, and configuring the electrical features of pins. +- Obtaining or releasing a pin description handle +- Setting or obtaining the pull type (pull-up, pull-down, or floating) of a pin +- Setting or obtaining the pull strength of a pin +- Setting or obtaining the function of a pin to implement pin multiplexing + +### Basic Concepts + +Pin is a software concept designed to uniformly manage SoC pins, implement pin multiplexing, and set electrical features of pins. - SoC - An SOC is a chip that integrates microprocessors, analog IP cores, digital IP cores, and memory for specific purposes. + An SoC is a chip that integrates microprocessors, analog IP cores, digital IP cores, and memory for specific purposes. - Pin multiplexing - When the number of pins of a chip cannot handle the increasing connection requests, you can set the software registers to make the pins to work in different states. + When the number of pins of a chip cannot handle the increasing connection requests, you can set software registers to make the pins to work in different states. + +### Working Principles -### Working Principles +In the Hardware Driver Foundation (HDF), the pin module uses the unified service mode for API adaptation. In this mode, a device service is used as the pin manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. -In the HDF, the pin module does not support the user mode and therefore does not need to publish services. It uses the service-free mode in interface adaptation. The service-free mode applies to the devices that do not provide user-mode APIs or the OS that does not distinguish the user mode and the kernel mode. The **DevHandle**, a void pointer, directly points to the kernel mode address of the device object. +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. The pin module is divided into the following layers: -- Interface layer: provides APIs for obtaining a pin, setting or obtaining the pull type, pull strength, and functions of a pin, and releasing a pin. -- Core layer: provides the capabilities of matching pin resources and adding, removing, and managing pin controllers. The core layer interacts with the adaptation layer by using hooks. -- Adaptation layer: instantiates hooks to implement specific functions. -**Figure 1** Service-free mode -![](figures/service-free-mode.png "pin service-free mode") +- Interface layer: provides APIs for obtaining a pin, setting or obtaining the pull type, pull strength, and function of a pin, and releasing a pin. +- Core layer: provides the capabilities of matching pin resources, adding and removing a pin controller, and managing pins. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. -### Constraints +**Figure 1** Unified service mode +![Unified service mode](figures/unified-service-mode.png) - Currently, the pin module supports only the kernels (LiteOS) of mini and small systems. +### Constraints - ## Usage Guidelines +The pin module supports only the LiteOS-A kernel of the small system. - ### When to Use +## Usage Guidelines - The pin module is a software concept and is used to manage pin resources. You can set the functions, pull type, and pull strength of pins to implement pin multiplexing. +### When to Use -### Available APIs +The pin module is a software concept used to manage pin resources. You can set the function, pull type, and pull strength of pins to implement pin multiplexing. -The table below describes the APIs of the pin module. For more details, see API Reference. +### Available APIs + +The following table describes the APIs of the pin module. **Table 1** Pin driver APIs - -| **API** | **Description** | +| **API** | **Description** | | ------------------------------------------------------------ | ---------------- | -| DevHandle PinGet(const char *pinName); | Obtains the pin description handle.| -| void PinPut(DevHandle handle); | Releases the pin description handle.| -| int32_t PinSetPull(DevHandle handle, enum PinPullType pullType); | Sets the pull type of a pin.| -| int32_t PinGetPull(DevHandle handle, enum PinPullType *pullType); | Obtains the pull type of a pin.| -| int32_t PinSetStrength(DevHandle handle, uint32_t strength); | Sets the pull strength of a pin.| -| int32_t PinGetStrength(DevHandle handle, uint32_t *strength); | Obtains the pull strength of a pin.| -| int32_t PinSetFunc(DevHandle handle, const char *funcName); | Sets the pin function. | -| int32_t PinGetFunc(DevHandle handle, const char **funcName); | Obtains the pin functions. | +| DevHandle PinGet(const char *pinName) | Obtains a pin description handle.| +| void PinPut(DevHandle handle) | Releases the pin description handle.| +| int32_t PinSetPull(DevHandle handle, enum PinPullType pullType) | Sets the pull type of a pin.| +| int32_t PinGetPull(DevHandle handle, enum PinPullType *pullType) | Obtains the pull type of a pin.| +| int32_t PinSetStrength(DevHandle handle, uint32_t strength) | Sets the pull strength of a pin.| +| int32_t PinGetStrength(DevHandle handle, uint32_t *strength) | Obtains the pull strength of a pin.| +| int32_t PinSetFunc(DevHandle handle, const char *funcName) | Sets the pin function.| +| int32_t PinGetFunc(DevHandle handle, const char **funcName) | Obtains the pin function. | ->![](../public_sys-resources/icon-note.gif) **NOTE**
    ->All APIs described in this document can be called only in the kernel space. +>![](../public_sys-resources/icon-note.gif) **NOTE** +> +>All the pin APIs described in this document can be used in kernel mode and user mode. -### How to Develop +### How to Develop -The figure below illustrates how to use the APIs. +The following figure illustrates how to use pin driver APIs. - **Figure 2** Using the pin driver APIs - + **Figure 2** Using pin driver APIs
    ![](figures/using-pin-process.png "Process of using the pin module") -#### Obtaining the Pin Description Handle +#### Obtaining a Pin Description Handle -Before performing an operation on a pin, call **PinGet** to obtain the pin description handle. This API returns the pin description handle that matches the input pin name. +Before performing an operation on a pin, use **PinGet()** to obtain the pin description handle based on the pin name. -``` +```c DevHandle PinGet(const char *pinName); ``` **Table 2** Description of PinGet - - | Parameter | Description | | ---------- | ----------------------- | | pinName | Pointer to the pin name. | -| **Return Value**| **Description** | -| NULL | Failed to obtain the pin description handle.| -| handle | Pin description handle obtained. | +| **Return Value**| **Description** | +| NULL | The operation fails.| +| handle | The operation is successful. The pin description handle obtained is returned. | -Example: Obtain the handle of P18. +Example: Obtain the pin description handle of P18. -``` -DevHandle handle = NULL; /* Pin description handle */ -char pinName = "P18"; /* Pin name. */ +```c +DevHandle handle = NULL; // Pin description handle. + +char pinName = "P18"; // Pin name. handle = PinGet(pinName); if (handle == NULL) { HDF_LOGE("PinGet: get handle failed!\n"); @@ -107,29 +110,28 @@ if (handle == NULL) { #### Setting the Pull Type of a Pin -Call **PinSetPull** to set the pull type of a pin. +Use **PinSetPull()** to set the pull type of a pin. -``` +```c int32_t PinSetPull(DevHandle handle, enum PinPullType pullType); ``` **Table 3** Description of PinSetPull - - -| Parameter | Description | +| Parameter | Description | | ---------- | ----------------------- | | handle | Pin description handle. | | pullType | Pull type to set. | -| **Return Value**| **Description** | +| **Return Value**| **Description** | | 0 | The operation is successful.| -| Negative value | The operation failed.| +| Negative value | The operation fails.| Example: Set the pull type to pull-up. -``` +```c int32_t ret; enum PinPullType pullTypeNum; + /* Set the pull type of a pin. */ pullTypeNum = 1; ret = PinSetPull(handle, pullTypeNum); @@ -141,29 +143,28 @@ if (ret != HDF_SUCCESS) { #### Obtaining the Pull Type of a Pin -Call **PinGetPull** to obtain the pull type of a pin. +Use **PinGetPull()** to obtain the pull type of a pin. -``` +```c int32_t PinGetPull(DevHandle handle, enum PinPullType *pullType); ``` **Table 4** Description of PinGetPull - - | Parameter | Description | | ---------- | ------------------------- | | handle | Pin description handle. | | pullType | Pointer to the pull type obtained.| -| **Return Value**| **Description** | +| **Return Value**| **Description** | | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | Example: Obtain the pull type of a pin. -``` +```c int32_t ret; enum PinPullType pullTypeNum; + /* Obtain the pull type of a pin. */ ret = PinGetPull(handle, &pullTypeNum); if (ret != HDF_SUCCESS) { @@ -174,27 +175,25 @@ if (ret != HDF_SUCCESS) { #### Setting the Pull Strength of a Pin -Call **PinSetStrength** to set the pull type of a pin. +Use **PinSetStrength()** to set the pull type of a pin. -``` +```c int32_t PinSetStrength(DevHandle handle, uint32_t strength); ``` **Table 5** Description of PinSetStrength - - | Parameter | Description | | ---------- | ----------------------- | | handle | Pin description handle. | | strength | Pull strength to set. | -| **Return Value**| **Description** | +| **Return Value**| **Description** | | 0 | The operation is successful.| -| Negative value | The operation failed.| +| Negative value | The operation fails.| Example: Set the pull strength of the pin to 2. -``` +```c int32_t ret; uint32_t strengthNum; /* Set the pull strength of the pin. */ @@ -208,29 +207,28 @@ if (ret != HDF_SUCCESS) { #### Obtaining the Pull Strength of a Pin -Call **PinGetStrength** to obtain the pull strength set. +Use **PinGetStrength()** to obtain the pull strength of a pin. -``` +```c int32_t PinGetStrength(DevHandle handle, uint32_t *strength); ``` **Table 6** Description of PinGetStrength - - | Parameter | Description | | ---------- | ------------------------- | | handle | Pin description handle. | | strength | Pointer to the pull strength obtained.| -| **Return Value**| **Description** | +| **Return Value**| **Description** | | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | Example: Obtain the pull strength of a pin. -``` +```c int32_t ret; uint32_t strengthNum; + /* Obtain the pull strength of the pin. */ ret = PinGetStrength(handle, &strengthNum); if (ret != HDF_SUCCESS) { @@ -241,31 +239,30 @@ if (ret != HDF_SUCCESS) { #### Setting the Pin Function -The pin function refers to the pin multiplexing function. The function of each pin is different. For details about the pin functions, see [pin_config.hcs](https://gitee.com/openharmony/device_soc_hisilicon/blob/master/hi3516dv300/sdk_liteos/hdf_config/pin/pin_config.hcs). +The pin function refers to the multiplexed pin function. The function of each pin is different. For details about the pin function name, see **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/pin/pin_config.hcs**. -Call **PinSetFunc** to set the pin function. +Use **PinSetFunc()** to set the pin function. -``` +```c int32_t PinSetFunc(DevHandle handle, const char *funcName); ``` **Table 7** Description of PinSetFunc - - | Parameter | Description | | ---------- | ------------------- | | handle | Pin description handle. | | funcName | Pointer to the pin function to set. | -| **Return Value**| **Description** | +| **Return Value**| **Description** | | 0 | The operation is successful.| -| Negative value | The operation failed.| +| Negative value | The operation fails.| Example: Set the pin function to LSADC_CH1 (ADC channel 1). -``` +```c int32_t ret; char funcName = "LSADC_CH1"; + /* Sets the pin function. */ ret = PinSetFunc(handle, funcName); if (ret != HDF_SUCCESS) { @@ -276,31 +273,30 @@ if (ret != HDF_SUCCESS) { #### Obtaining the Pin Function -Call **PinGetFunc** to obtain the pin function set. +Use **PinGetFunc()** to obtain the pin function. -``` +```c int32_t PinGetFunc(DevHandle handle, const char **funcName); ``` **Table 8** Description of PinGetFunc - - | Parameter | Description | | ---------- | --------------------- | | handle | Pin description handle. | | funcName | Pointer to the function name obtained.| -| **Return Value**| **Description** | +| **Return Value**| **Description** | | 0 | The operation is successful. | -| Negative value | The operation failed. | +| Negative value | The operation fails. | Example: Obtain the pin function. -``` +```c int32_t ret; -char *funcName; +char *funcName = NULL; + /* Obtain the pin function. */ -ret = PinGetFunc(handle,&funcName); +ret = PinGetFunc(handle, &funcName); if (ret != HDF_SUCCESS) { HDF_LOGE("PinGetFunc: failed, ret %d\n", ret); return ret; @@ -309,16 +305,14 @@ if (ret != HDF_SUCCESS) { #### Releasing a Pin Description Handle -After the operations on a pin are complete, call **PinPut** to release the pin description handle. +After the operations on a pin are complete, use **PinPut()** to release the pin description handle. -``` +```c void PinPut(DevHandle handle); ``` **Table 9** Description of PinPut - - | Parameter | Description | | ---------- | -------------- | | handle | Pin description handle. | @@ -327,13 +321,14 @@ void PinPut(DevHandle handle); Example: Release a pin description handle. -``` +```c PinPut(handle); ``` -## Development Example +## Example + +The following uses the Hi3516D V300 development board as an example. The procedure is as follows: -The procedure is as follows: 1. Pass in the pin name to obtain the pin description handle. 2. Set the pull type of the pin. If the operation fails, release the pin description handle. 3. Obtain the pull type of the pin. If the operation fails, release the pin description handle. @@ -343,9 +338,9 @@ The procedure is as follows: 6. Obtain the pin function. If the operation fails, release the pin description handle. 7. Release the pin description handle if no operation needs to be performed on the pin. -``` -#include "hdf_log.h" /* Header file for log APIs */ -#include "pin_if.h" /* Header file for standard pin APIs */ +```c +#include "hdf_log.h" /* Header file of the HDF log APIs. */ +#include "pin_if.h" /* Header file of standard pin APIs. */ int32_t PinTestSample(void) { @@ -361,7 +356,7 @@ int32_t PinTestSample(void) /* Obtain the pin description handle. */ handle = PinGet(pinName); if (handle == NULL) { - HDF_LOGE("PinGet: failed!\n"); + HDF_LOGE("PinGet: pin get failed!\n"); return; } /* Set the pull type to pull-up for the pin. */ @@ -407,4 +402,5 @@ ERR: /* Release the pin description handle. */ PinPut(handle); return ret; -} \ No newline at end of file +} +``` diff --git a/en/device-dev/driver/driver-platform-pin-develop.md b/en/device-dev/driver/driver-platform-pin-develop.md index 9417dc54ae..9f34c362f6 100644 --- a/en/device-dev/driver/driver-platform-pin-develop.md +++ b/en/device-dev/driver/driver-platform-pin-develop.md @@ -1,49 +1,54 @@ # Pin - ## Overview -### Pin -The pin, also called pin controller, manages pin resources of system on a chip (SoC) vendors and provides the pin multiplexing function. +### Function + +The pin module, also called pin controller, manages pin resources of the system on a chip (SoC) and implements the pin multiplexing function. ### Basic Concepts -Pin, as a software concept, provides APIs for uniformly managing the pins from different SoC vendors, providing the pin multiplexing function, and configuring the electrical features of pins. +Pin is a software concept designed to uniformly manage SoC pins, implement pin multiplexing, and set electrical features of pins. - SoC - An SOC is a chip that integrates microprocessors, analog IP cores, digital IP cores, and memory for specific purposes. + An SoC is a chip that integrates microprocessors, analog IP cores, digital IP cores, and memory for specific purposes. - Pin multiplexing - When the number of pins of a chip cannot handle the increasing connection requests, you can set the software registers to make the pins to work in different states. + When the number of pins of a chip cannot handle the increasing connection requests, you can set software registers to make the pins to work in different states. ### Working Principles -In the HDF, the pin module does not support the user mode and therefore does not need to publish services. The pin module uses the service-free mode (as shown in Figure 1) in interface adaptation. The service-free mode applies to the devices that do not provide user-mode APIs or the OS that does not distinguish the user mode and the kernel mode. The **DevHandle**, a void pointer, directly points to the kernel mode address of the device object. +In the Hardware Driver Foundation (HDF), the pin module uses the unified service mode for API adaptation. In this mode, a device service is used as the pin manager to handle access requests from the devices of the same type in a unified manner. The unified service mode applies to the scenario where there are many device objects of the same type. If the independent service mode is used in this case, more device nodes need to be configured and more memory resources will be consumed. The following figure shows the unified service mode. + +In the unified service mode, the core layer manages all controllers in a unified manner and publishes a service for the interface layer. That is, the driver does not need to publish a service for each controller. The pin module is divided into the following layers: -- Interface layer: provides APIs for obtaining a pin, setting or obtaining the pull type, pull strength, and functions of a pin, and releasing a pin. -- Core layer: provides the capabilities of matching pin resources and adding, removing, and managing pin controllers. The core layer interacts with the adaptation layer by using hooks. -- Adaptation layer: instantiates hooks to implement specific functions. -**Figure 1** Service-free mode +- Interface layer: provides APIs for obtaining a pin, setting or obtaining the pull type, pull strength, and function of a pin, and releasing a pin. +- Core layer: provides APIs for matching pin resources, adding and removing a pin controller, and managing pins. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. -![](figures/service-free-mode.png) +**Figure 1** Unified service mode + +![](figures/unified-service-mode.png) ### Constraints -Currently, the pin module supports only the kernels (LiteOS) of mini and small systems. +The pin module supports only the LiteOS-A kernel of the small system. ## Development Guidelines ### When to Use -The pin module is used to manage pin resources. When the devices from SoC vendors interconnect with the HDF, the pin driver needs to be adapted. +The pin module is used to manage pin resources. Before using the SoC with the HDF, you need to perform PIN driver adaptation. ### Available APIs -The **PinCntlrMethod** structure defines callbacks to be invoked to call the functions of the pin driver. +To enable the upper layer to successfully operate pins by calling the pin driver APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/pin/pin_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +**PinCntlrMethod**: ```c struct PinCntlrMethod { @@ -56,385 +61,410 @@ struct PinCntlrMethod { }; ``` -**Table 1** Callbacks in the PinCntlrMethod structure +**Table 1** Hook functions in PinCntlrMethod -| API | Input Parameter | Output Parameter | Return Value| Description| +| Function | Input Parameter | Output Parameter | Return Value| Description| | ------------ | ------------------------------------------- | ------ | ---- | ---- | -| SetPinPull | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.
    **pullType**: pull type of the pin. It is an enum constant.| -|HDF_STATUS|Sets the pull type of a pin.| -| GetPinPull | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.| **pullType**: pointer to the pull type of the pin.| HDF_STATUS| Obtains the pull type of a pin.| -| SetPinStrength | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.
    **strength**: pull strength of the pin. It is a uint32_t variable.| -| HDF_STATUS| Sets the pull strength of a pin.| -| GetPinStrength | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.| **strength**: pointer to the pull strength of the pin.| HDF_STATUS| Obtains the pull strength of a pin.| -| SetPinFunc | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.
    **funcName**: char pointer to the pin function.| -| HDF_STATUS| Sets the pin function.| -| GetPinFunc | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.| **funcName**: char double pointer to the pin function.| HDF_STATUS| Obtains the pin function.| +| SetPinPull | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.
    **pullType**: pull type of the pin.| -|HDF_STATUS|Sets the pull type of a pin.| +| GetPinPull | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable. | **pullType**: pointer to the pull type obtained.| HDF_STATUS| Obtains the pull type of a pin.| +| SetPinStrength | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.
    **strength**: pull type to set, which is a uint32_t variable.| -| HDF_STATUS| Sets the pull strength of a pin.| +| GetPinStrength | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable. | **strength**: pointer to the pull strength obtained.| HDF_STATUS| Obtains the pull strength of a pin.| +| SetPinFunc | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable.
    **funcName**: pointer to the pin function to set. It is a character constant.| -| HDF_STATUS| Sets the pin function.| +| GetPinFunc | **cntlr**: structure pointer to the pin controller at the core layer.
    **index**: pin index, which is a uint32_t variable. | **funcName**: double pointer to the PIN function obtained. It is a character constant.| HDF_STATUS| Obtains the pin function.| ### How to Develop The pin module adaptation procedure is as follows: -1. Instantiate the driver entry. -2. Configure attribute files. -3. Instantiate the core layer APIs. -4. Debug the driver. - -### Development Example +- Instantiate the driver entry. +- Configure attribute files. +- Instantiate the pin controller object. +- Debug the driver. -1. Instantiate the driver entry. +### Example - - Instantiate the **HdfDriverEntry** structure. +The following uses the **//device_soc_hisilicon/common/platform/pin/pin_hi35xx.c** driver of the Hi3516D V300 development board as an example to describe the pin driver adaptation. - Instantiate the driver entry. The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. +1. Instantiate the driver entry. - - Call **HDF_INIT** to register the **HdfDriverEntry** instance with the HDF. + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. + Generally, the HDF calls **Bind()** and then **Init()** to load a driver. If **Init()** fails to be called, the HDF calls **Release()** to release driver resources and exit. - Generally, the HDF calls the **Init** function to load the driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. + PIN driver entry example: - ```c - static struct HdfDriverEntry g_hi35xxPinDriverEntry = { - .moduleVersion = 1, - .Bind = Hi35xxPinBind, - .Init = Hi35xxPinInit, - .Release = Hi35xxPinRelease, - .moduleName = "hi35xx_pin_driver", // (Mandatory) The value must be the same as that of moduleName in the .hcs file. - }; - HDF_INIT(g_hi35xxPinDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. - ``` + ```c + static struct HdfDriverEntry g_hi35xxPinDriverEntry = { + .moduleVersion = 1, + .Bind = Hi35xxPinBind, + .Init = Hi35xxPinInit, + .Release = Hi35xxPinRelease, + .moduleName = "hi35xx_pin_driver", // (Mandatory) The value must be the same as that of moduleName in the .hcs file. + }; + HDF_INIT(g_hi35xxPinDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. + ``` 2. Configure attribute files. - - Add the device node description to the **vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. - - ```c - root { - device_info { - platform :: host { - hostName = "platform_host"; - priority = 50; - device_pin :: device { - device0:: deviceNode { // Set an HDF device node for each pin controller. - policy = 0; // Policy for publishing services. - priority = 10; // Driver startup priority. - permission = 0644; // Permission to create device nodes for the driver. - /* (Mandatory) Driver name, which must be the same as the moduleName in the driver entry. */ - moduleName = "hi35xx_pin_driver"; - /* (Mandatory) Set the controller private data, which must be same as that in pin_config.hcs. */ - deviceMatchAttr = "hisilicon_hi35xx_pin_0"; - } - device1 :: deviceNode { - policy = 0; - priority = 10; - permission = 0644; - moduleName = "hi35xx_pin_driver"; - deviceMatchAttr = "hisilicon_hi35xx_pin_1"; - } - ... - } - } - } - } - ``` - - Add the **pin_config.hcs** file. - - Configure the device attributes in the **device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/pin/pin_config.hcs** file. The parameters are set as follows: - ```c - root { - platform { - pin_config_hi35xx { - template pin_controller { // (Mandatory) Template configuration. In the template, you can configure the common parameters shared by device nodes. - number = 0; // (Mandatory) Controller ID. - regStartBasePhy = 0; // (Mandatory) Start physical base address of the register. - regSize = 0; // (Mandatory) Register bit width. - PinCount = 0; // (Mandatory) Number of pins. - match_attr = ""; - template pin_desc { - pinName = ""; // (Mandatory) Name of the pin. - init = 0; // (Mandatory) Default value of the register. - F0 = ""; // (Mandatory) Function 0. - F1 = ""; // Function 1. - F2 = ""; // Function 2. - F3 = ""; // Function 3. - F4 = ""; // Function 4. - F5 = ""; // Function 5. - } - } - controller_0 :: pin_controller { - number = 0; - regStartBasePhy = 0x10FF0000; - regSize = 0x48; - pinCount = 18; - match_attr = "hisilicon_hi35xx_pin_0"; - T1 :: pin_desc { - pinName = "T1"; - init = 0x0600; - F0 = "EMMC_CLK"; - F1 = "SFC_CLK"; - F2 = "SFC_BOOT_MODE"; - } - ... // Correspond to the pins of the pin controller. Add pins according to actual situation. - } - ... // Each pin controller corresponds to a controller node. If there are multiple pin controllers, add the corresponding controller nodes one by one. - } - } - } - ``` + Add the deviceNode information to the **device_info.hcs** file. The deviceNode information is related to the driver entry registration. The following example uses two pin controllers as an example. If there are more pin controllers, add the deviceNode information to the **device_info.hcs** file for each controller. The device attribute values configured in **pin_config.hcs** are closely related to the driver implementation and default values or value ranges of the **PinCntlr** members at the core layer. + + - **device_info.hcs** example + + Add the deviceNode information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. + + ```c + root { + device_info { + platform :: host { + hostName = "platform_host"; + priority = 50; + device_pin :: device { + device0 :: deviceNode { // Used to manage pins and release services in a unified manner. + policy = 2; // The value 2 means to publish services for both kernel- and user-mode processes. + priority = 8; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "HDF_PLATFORM_PIN_MANAGER"; + serviceName = "HDF_PLATFORM_PIN_MANAGER"; + } + device1:: deviceNode { // Configure an HDF device node for each pin controller. + policy = 0; + priority = 10; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "hi35xx_pin_driver"; // (mandatory) Driver name, which must be the same as moduleName in the driver entry. + deviceMatchAttr = "hisilicon_hi35xx_pin_0"; // (Mandatory) Controller private data, which must be the same as that of the controller in pin_config.hcs. + } + device2 :: deviceNode { + policy = 0; + priority = 10; + permission = 0644; + moduleName = "hi35xx_pin_driver"; + deviceMatchAttr = "hisilicon_hi35xx_pin_1"; + } + ... + } + } + } + } + ``` + + - **pin_config.hcs** example: + + Configure the device attributes in the **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/pin/pin_config.hcs** file. The parameters are as follows: + + ```c + root { + platform { + pin_config_hi35xx { + template pin_controller { // (Mandatory) Template configuration. If the template is used to configure device node information, the default values in the template will be used for the fields that are not declared for the node. + number = 0; // (Mandatory) PIN controller number. + regStartBasePhy = 0; // (Mandatory) Start address of the physical base address of the register. + regSize = 0; // (Mandatory) Register size. + pinCount = 0; // (Mandatory) Number of pins. + match_attr = ""; + template pin_desc { + pinName = ""; // (Mandatory) Pin name. + init = 0; // (Mandatory) Default value of the register. + F0 = ""; // (Mandatory) Function 0. + F1 = ""; // Function 1. + F2 = ""; // Function 2. + F3 = ""; // Function 3. + F4 = ""; // Function 4. + F5 = ""; // Function 5. + } + } + controller_0 :: pin_controller { + number = 0; + regStartBasePhy = 0x10FF0000; + regSize = 0x48; + pinCount = 18; + match_attr = "hisilicon_hi35xx_pin_0"; + T1 :: pin_desc { + pinName = "T1"; + init = 0x0600; + F0 = "EMMC_CLK"; + F1 = "SFC_CLK"; + F2 = "SFC_BOOT_MODE"; + } + ... // Add each pin under the pin controller. + } + ... // Each pin controller corresponds to a controller node. If there are multiple pin controllers, add the controller nodes one by one. + } + } + } + ``` + + After the **pin_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. + + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/pin/pin_config.hcs" // Relative path of the file. + ``` 3. Instantiate the pin controller object. - - Initialize the **PinCntlr** object. - - Call **Hi35xxPinCntlrInit** to initialize the **PinCntlr** members. - - ```c - struct Hi35xxPinDesc { - // Pin name. - const char *pinName; - // Initial value. - uint32_t init; - // Index of the pin. - uint32_t index; - // Pull type of the pin. - int32_t pullType; - // Pull strength of the pin. - int32_t strength; - // Array of pin function names. - const char *func[HI35XX_PIN_FUNC_MAX]; - }; - - struct Hi35xxPinCntlr { - // Pin controller. - struct PinCntlr cntlr; - // Pointer to the pin description structure. - struct Hi35xxPinDesc *desc; - // Register mapping address. - volatile unsigned char *regBase; - // ID of the pin controller. - uint16_t number; - // Start address of the register physical base addresses. - uint32_t regStartBasePhy; - // Register bit width. - uint32_t regSize; - // Number of pins. - uint32_t pinCount; - }; - - // PinCntlr is the controller structure at the core layer. The Init function assigns values to PinCntlr. - struct PinCntlr { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - struct PinCntlrMethod *method; - struct DListHead node; // Node in the linked list. - OsalSpinlock spin; // Spinlock. - uint16_t number; // ID of the pin controller. - uint16_t pinCount; // Number of pins. - struct PinDesc *pins; - void *priv; // Private data. - }; - - // Initialize PinCntlr. - static int32_t Hi35xxPinCntlrInit(struct HdfDeviceObject *device, struct Hi35xxPinCntlr *hi35xx) - { - struct DeviceResourceIface *drsOps = NULL; - int32_t ret; - // Read the pin controller attributes from the .hcs file. - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetUint16 == NULL) { - HDF_LOGE("%s: invalid drs ops fail!", __func__); - return HDF_FAILURE; - } - ret = drsOps->GetUint16(device->property, "number", &hi35xx->number, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read number failed", __func__); - return ret; - } - - ret = drsOps->GetUint32(device->property, "regStartBasePhy", &hi35xx->regStartBasePhy, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read regStartBasePhy failed", __func__); - return ret; - } - ret = drsOps->GetUint32(device->property, "regSize", &hi35xx->regSize, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read regSize failed", __func__); - return ret; - } - ret = drsOps->GetUint32(device->property, "pinCount", &hi35xx->pinCount, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read pinCount failed", __func__); - return ret; - } - // Assign the values read to the members of the pin controller to initialize the pin controller. - hi35xx->cntlr.pinCount = hi35xx->pinCount; - hi35xx->cntlr.number = hi35xx->number; - hi35xx->regBase = OsalIoRemap(hi35xx->regStartBasePhy, hi35xx->regSize); // Pin controller mapping. - if (hi35xx->regBase == NULL) { - HDF_LOGE("%s: remap Pin base failed", __func__); - return HDF_ERR_IO; - } - hi35xx->desc = (struct Hi35xxPinDesc *)OsalMemCalloc(sizeof(struct Hi35xxPinDesc) * hi35xx->pinCount); - hi35xx->cntlr.pins = (struct PinDesc *)OsalMemCalloc(sizeof(struct PinDesc) * hi35xx->pinCount); - return HDF_SUCCESS; - } - ``` - - - Instantiate the callback structure **PinCntlrMethod** in **PinCntlr**. Other members are initialized by using the **Init** function. - - ```c - // The members of the PinCntlrMethod structure are all callbacks. Vendors need to implement the corresponding functions according to Table 1. - static struct PinCntlrMethod g_method = { - .SetPinPull = Hi35xxPinSetPull, // Set the pull type. - .GetPinPull = Hi35xxPinGetPull, // Obtain the pull type. - .SetPinStrength = Hi35xxPinSetStrength, // Set the pull strength. - .GetPinStrength = Hi35xxPinGetStrength, // Obtain the pull strength. - .SetPinFunc = Hi35xxPinSetFunc, // Set the pin functions. - .GetPinFunc = Hi35xxPinGetFunc, // Obtain the pin functions. - }; - ``` - - - **Init** function - - **Input parameter**: - - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. - - **Return value**: - - **HDF\_STATUS**
    The table below describes some status. For more details, see **HDF\_STATUS** in **/drivers/framework/include/utils/hdf\_base.h**. - - | **Status** | **Description** | - | ---------------------- | -------------- | - | HDF_ERR_INVALID_OBJECT | Invalid controller object.| - | HDF_ERR_MALLOC_FAIL | Failed to allocate memory. | - | HDF_ERR_INVALID_PARAM | Invalid parameter. | - | HDF_ERR_IO | I/O error. | - | HDF_SUCCESS | Initialization successful. | - | HDF_FAILURE | Initialization failed. | - - **Function description**: - - Initializes the custom structure object and **PinCntlr** members, and connects to the pin controller by calling the **PinCntlrAdd** function. - - ```c - static int32_t Hi35xxPinReadFunc(struct Hi35xxPinDesc *desc, const struct DeviceResourceNode *node, struct DeviceResourceIface *drsOps) - { - int32_t ret; - uint32_t funcNum = 0; - // Read the pin function names of the pin controller child nodes from the .hcs file. - ret = drsOps->GetString(node, "F0", &desc->func[funcNum], "NULL"); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read F0 failed", __func__); - return ret; - } - - funcNum++; - ret = drsOps->GetString(node, "F1", &desc->func[funcNum], "NULL"); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read F1 failed", __func__); - return ret; - } - - funcNum++; - ... - return HDF_SUCCESS; - } - - static int32_t Hi35xxPinParsePinNode(const struct DeviceResourceNode *node, struct Hi35xxPinCntlr *hi35xx, int32_t index) - { - int32_t ret; - struct DeviceResourceIface *drsOps = NULL; - // Read the pin attributes of the pin controller child nodes from the .hcs file. - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetString == NULL) { - HDF_LOGE("%s: invalid drs ops fail!", __func__); - return HDF_FAILURE; - } - ret = drsOps->GetString(node, "pinName", &hi35xx->desc[index].pinName, "NULL"); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read pinName failed", __func__); - return ret; - } - ... - ret = Hi35xxPinReadFunc(&hi35xx->desc[index], node, drsOps); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s:Pin read Func failed", __func__); - return ret; - } - hi35xx->cntlr.pins[index].pinName = hi35xx->desc[index].pinName; - hi35xx->cntlr.pins[index].priv = (void *)node; - ... - return HDF_SUCCESS; - } - - static int32_t Hi35xxPinInit(struct HdfDeviceObject *device) - { - ... - struct Hi35xxPinCntlr *hi35xx = NULL; - ... - ret = Hi35xxPinCntlrInit(device, hi35xx); // Initialize the pin controller. - ... - DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { // Traverses each child node of the pin controller. - ret = Hi35xxPinParsePinNode(childNode, hi35xx, index); // Parse child nodes. - ... - } - - hi35xx->cntlr.method = &g_method; // Instantiate method. - ret = PinCntlrAdd(&hi35xx->cntlr); // Connect to the controller. - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: add Pin cntlr: failed", __func__); - ret = HDF_FAILURE; - } - return HDF_SUCCESS; - } - ``` - - - **Release** function - - **Input parameter**: - - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. - - **Return value**: - - No value is returned. - - **Function description**: - - Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, **Release** can be called to release driver resources. - - ```c - static void Hi35xxPinRelease(struct HdfDeviceObject *device) - { - int32_t ret; - uint16_t number; - struct PinCntlr *cntlr = NULL; - struct Hi35xxPinCntlr *hi35xx = NULL; - struct DeviceResourceIface *drsOps = NULL; - - if (device == NULL || device->property == NULL) { - HDF_LOGE("%s: device or property is null", __func__); - return; - } - // Read the pin controller ID from the .hcs file. - drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); - if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetString == NULL) { - HDF_LOGE("%s: invalid drs ops", __func__); - return; - } - ret = drsOps->GetUint16(device->property, "number", &number, 0); - if (ret != HDF_SUCCESS) { - HDF_LOGE("%s: read cntlr number failed", __func__); - return; - } - - cntlr = PinCntlrGetByNumber(number); // Obtain the pin controller based on the controller ID. - PinCntlrRemove(cntlr); - hi35xx = (struct Hi35xxPinCntlr *)cntlr; - if (hi35xx != NULL) { - if (hi35xx->regBase != NULL) { - OsalIoUnmap((void *)hi35xx->regBase); - } - OsalMemFree(hi35xx); - } - } - ``` + Initialize the **PinCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **PinCntlrMethod** in **PinCntlr** (so that the underlying driver functions can be called). + + - Define a custom structure. + + To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **pin_config.hcs** file to initialize the members in the custom structure and passes important parameters to the object at the core layer. + + Initialize **PinCntlr** in **Hi35xxPinCntlrInit**. + + ```c + // Custom pin description structure. + struct Hi35xxPinDesc { + const char *pinName; // Pin name. + uint32_t init; // Initial value. + uint32_t index; // Pin index. + int32_t pullType; // Pull type of the pin. + int32_t strength; // Pull strength of the pin. + const char *func[HI35XX_PIN_FUNC_MAX]; // Array of pin function names. + }; + + /* Custom structure. + struct Hi35xxPinCntlr { + struct PinCntlr cntlr // Core layer control object. + struct Hi35xxPinDesc *desc; // Pointer to the pin description structure. + volatile unsigned char *regBase; // Register base address used for address mapping. + uint16_t number; // Pin controller number. + uint32_t regStartBasePhy; // Start address of the register physical base address. + uint32_t regSize; // Register size. + uint32_t pinCount; // Number of pins. + }; + + // PinCntlr is the controller structure at the core layer. The Init function assigns values to the members of PinCntlr. + struct PinCntlr { + struct IDeviceIoService service; // Driver service. + struct HdfDeviceObject *device; // Driver device object. + struct PinCntlrMethod *method; // Hook functions. + struct DListHead node; // Linked list node. + OsalSpinlock spin; // Spinlock. + uint16_t number; // Pin controller number. + uint16_t pinCount; // Number of pins. + struct PinDesc *pins; // Pin resources. + void *priv; // Private data. + }; + + // Initialize the pin controller. + static int32_t Hi35xxPinCntlrInit(struct HdfDeviceObject *device, struct Hi35xxPinCntlr *hi35xx) + { + struct DeviceResourceIface *drsOps = NULL; + int32_t ret; + // Read the pin controller attributes from the .hcs file. + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetUint16 == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + ret = drsOps->GetUint16(device->property, "number", &hi35xx->number, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read number failed", __func__); + return ret; + } + + if (hi35xx->number > HI35XX_PIN_MAX_NUMBER) { + HDF_LOGE("%s: invalid number:%u", __func__, hi35xx->number); + return HDF_ERR_INVALID_PARAM; + } + ret = drsOps->GetUint32(device->property, "regStartBasePhy", &hi35xx->regStartBasePhy, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read regStartBasePhy failed", __func__); + return ret; + } + ret = drsOps->GetUint32(device->property, "regSize", &hi35xx->regSize, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read regSize failed", __func__); + return ret; + } + ret = drsOps->GetUint32(device->property, "pinCount", &hi35xx->pinCount, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read pinCount failed", __func__); + return ret; + } + if (hi35xx->pinCount > PIN_MAX_CNT_PER_CNTLR) { + HDF_LOGE("%s: invalid number:%u", __func__, hi35xx->number); + return HDF_ERR_INVALID_PARAM; + } + // Assign the values read to the members of the pin controller to initialize the pin controller. + hi35xx->cntlr.pinCount = hi35xx->pinCount; + hi35xx->cntlr.number = hi35xx->number; + hi35xx->regBase = OsalIoRemap(hi35xx->regStartBasePhy, hi35xx->regSize); // Pin controller mapping. + if (hi35xx->regBase == NULL) { + HDF_LOGE("%s: remap Pin base failed", __func__); + return HDF_ERR_IO; + } + hi35xx->desc = (struct Hi35xxPinDesc *)OsalMemCalloc(sizeof(struct Hi35xxPinDesc) * hi35xx->pinCount); + if (hi35xx->desc == NULL) { + HDF_LOGE("%s: memcalloc hi35xx desc failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + hi35xx->cntlr.pins = (struct PinDesc *)OsalMemCalloc(sizeof(struct PinDesc) * hi35xx->pinCount); + if (hi35xx->desc == NULL) { + HDF_LOGE("%s: memcalloc hi35xx cntlr pins failed", __func__); + return HDF_ERR_MALLOC_FAIL; + } + return HDF_SUCCESS; + } + ``` + + - Instantiate the **PinCntlrMethod** structure in **PinCntlr**. + + ```c + static struct PinCntlrMethod g_method = { + .SetPinPull = Hi35xxPinSetPull, // Set the pull type. + .GetPinPull = Hi35xxPinGetPull, // Obtain the pull type. + .SetPinStrength = Hi35xxPinSetStrength, // Set the pull strength. + .GetPinStrength = Hi35xxPinGetStrength, // Obtain the pull strength. + .SetPinFunc = Hi35xxPinSetFunc, // Set the pin functions. + .GetPinFunc = Hi35xxPinGetFunc, // Obtain the pin functions. + }; + ``` + + - Implement the **Init** function. + + Input Parameter + + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. + + Return value: + + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. + + | **State** | **Description** | + | ---------------------- | -------------- | + | HDF_ERR_INVALID_OBJECT | Invalid controller object.| + | HDF_ERR_MALLOC_FAIL | Failed to allocate memory. | + | HDF_ERR_INVALID_PARAM | Invalid parameter. | + | HDF_ERR_IO | I/O error. | + | HDF_SUCCESS | Initialization successful. | + | HDF_FAILURE | Initialization failed. | + + Function description: + + Initializes the custom structure object and **PinCntlr** members, and calls **PinCntlrAdd()** to add the pin controller to the core layer. + + ```c + static int32_t Hi35xxPinReadFunc(struct Hi35xxPinDesc *desc, const struct DeviceResourceNode *node, struct DeviceResourceIface *drsOps) + { + int32_t ret; + uint32_t funcNum = 0; + // Read the pin function names of the pin controller child nodes from the .hcs file. + ret = drsOps->GetString(node, "F0", &desc->func[funcNum], "NULL"); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read F0 failed", __func__); + return ret; + } + + funcNum++; + ret = drsOps->GetString(node, "F1", &desc->func[funcNum], "NULL"); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read F1 failed", __func__); + return ret; + } + + funcNum++; + ... + return HDF_SUCCESS; + } + + static int32_t Hi35xxPinParsePinNode(const struct DeviceResourceNode *node, struct Hi35xxPinCntlr *hi35xx, int32_t index) + { + int32_t ret; + struct DeviceResourceIface *drsOps = NULL; + // Read the pin attributes of the pin controller child nodes from the .hcs file. + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetString == NULL) { + HDF_LOGE("%s: invalid drs ops fail!", __func__); + return HDF_FAILURE; + } + ret = drsOps->GetString(node, "pinName", &hi35xx->desc[index].pinName, "NULL"); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read pinName failed", __func__); + return ret; + } + ... + ret = Hi35xxPinReadFunc(&hi35xx->desc[index], node, drsOps); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s:Pin read Func failed", __func__); + return ret; + } + hi35xx->cntlr.pins[index].pinName = hi35xx->desc[index].pinName; + hi35xx->cntlr.pins[index].priv = (void *)node; + ... + return HDF_SUCCESS; + } + + static int32_t Hi35xxPinInit(struct HdfDeviceObject *device) + { + ... + struct Hi35xxPinCntlr *hi35xx = NULL; + ... + ret = Hi35xxPinCntlrInit(device, hi35xx); // Initialize the pin controller. + ... + DEV_RES_NODE_FOR_EACH_CHILD_NODE(device->property, childNode) { // Traverse each child node of the pin controller. + ret = Hi35xxPinParsePinNode(childNode, hi35xx, index); // Parse child nodes. + ... + } + + hi35xx->cntlr.method = &g_method; // Attach the PinCntlrMethod instance. + ret = PinCntlrAdd(&hi35xx->cntlr); // Add the controller. + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: add Pin cntlr: failed", __func__); + ret = HDF_FAILURE; + } + return HDF_SUCCESS; + } + ``` + + - Implement the **Release** function. + + Input parameters: + + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. + + Return value: + + No value is returned. + + Function description: + + Releases the memory and deletes the controller. This function needs to assign values to **Release()** in the driver entry structure. If the HDF fails to call **Init()** to initialize the driver, **Release()** is called to release driver resources. + + ```c + static void Hi35xxPinRelease(struct HdfDeviceObject *device) + { + int32_t ret; + uint16_t number; + struct PinCntlr *cntlr = NULL; + struct Hi35xxPinCntlr *hi35xx = NULL; + struct DeviceResourceIface *drsOps = NULL; + + if (device == NULL || device->property == NULL) { + HDF_LOGE("%s: device or property is null", __func__); + return; + } + // Read the pin controller number from the .hcs file. + drsOps = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); + if (drsOps == NULL || drsOps->GetUint32 == NULL || drsOps->GetString == NULL) { + HDF_LOGE("%s: invalid drs ops", __func__); + return; + } + ret = drsOps->GetUint16(device->property, "number", &number, 0); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: read cntlr number failed", __func__); + return; + } + + cntlr = PinCntlrGetByNumber(number); // Obtain the pin controller based on the controller number. + PinCntlrRemove(cntlr); + hi35xx = (struct Hi35xxPinCntlr *)cntlr; + if (hi35xx != NULL) { + if (hi35xx->regBase != NULL) { + OsalIoUnmap((void *)hi35xx->regBase); + } + OsalMemFree(hi35xx); + } + } + ``` + 4. Debug the driver. (Optional) Verify basic functionalities of new drivers. For example, verify the information returned when the driver is loaded and whether data is successfully transmitted. diff --git a/en/device-dev/driver/driver-platform-pwm-des.md b/en/device-dev/driver/driver-platform-pwm-des.md index 9ea0bedfd6..0814751514 100644 --- a/en/device-dev/driver/driver-platform-pwm-des.md +++ b/en/device-dev/driver/driver-platform-pwm-des.md @@ -1,417 +1,409 @@ # PWM - ## Overview -Pulse width modulation (PWM) is a technology that digitally encodes analog signal levels and converts them into pulses. It can be used for motor control and backlight brightness adjustment. - -The PWM APIs provide a set of functions for operating a PWM device, including those for: -- Opening or closing a PWM device handle +### Function -- Setting the PWM period, signal ON-state time, and polarity +Pulse width modulation (PWM) is a technology that digitally encodes analog signal levels and converts them into pulses. -- Enabling and disabling a PWM device +The PWM module provides a set of APIs for operating a PWM device, including: +- Opening or closing a PWM device +- Setting the PWM period, signal ON-state time, and polarity +- Enabling or disabling a PWM device - Obtaining and setting PWM parameters +### Basic Concepts -### PwmConfig Structure +A pulse (electrical pulse) is a burst of current or voltage, characterized by sudden change and discontinuity. There are many types of pulses. Common pulses include triangular, sharp, rectangular, square, trapezoidal, and zigzag pulses. Main pulse parameters include the repetition period **T** (**T** = 1/**F**, where **F** is the pulse repetition frequency), pulse amplitude **U**, rise time **ts** at the leading edge, fall time **t** at the trailing edge, and pulse width **tk**. - **Table 1** PwmConfig structure +### Working Principles -| Parameter| Description| -| -------- | -------- | -| duty | Time that a signal is in the ON state, in ns.| -| period | Time for a signal to complete an on-and-off cycle, in ns.| -| number | Number of square waves to generate.
    - Positive value: indicates the number of square waves to generate.
    - **0**: indicates that square waves are generated continuously.| -| polarity | PWM signal polarity, which can be positive or reverse.| -| status | PWM device status, which can be enabled or disabled.| +In the Hardware Driver Foundation (HDF), the PWM uses the independent service mode (see Figure 1) for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. +In the independent service mode, the core layer does not publish a service for the upper layer. Therefore, a service must be published for each controller. To achieve this purpose: -## Available APIs +- You need to implement the **Bind()** function in **HdfDriverEntry** to bind services. +- The **policy** field of **deviceNode** in the **device_info.hcs** file can be **1** or **2**, but not **0**. - **Table 2** PWM driver APIs +The PWM module is divided into the following layers: -| Category| Description| -| -------- | -------- | -| Operating PWM handles| - **PwmOpen**: opens the device handle of a PWM device.
    - **PwmClose**: closes the device handle of a PWM device.| -| Enabling or disabling PWM| - **PwmEnable**: enables a PWM device.
    - **PwmDisable**: disables a PWM device.| -| Setting PWM| - **PwmSetPeriod**: sets the PWM period.
    - **PwmSetDuty**: sets the signal ON-state time.
    - **PwmSetPolarity**: sets the PWM signal polarity.| -| Setting or obtaining PWM configuration| - **PwmSetConfig**: sets PWM device parameters.
    - **PwmGetConfig**: obtains PWM device parameters.| +- Interface layer: provides APIs for opening or closing a PWM device, setting the PWM period, signal ON-state time, PWM device polarity, or PWM device parameters, obtaining PWM device parameters, and enabling or disabling a PWM device +- Core layer: provides the capabilities of adding or removing a PWM controller and managing PWM devices. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. -> ![icon-note.gif](../public_sys-resources/icon-note.gif) **NOTE**
    -> All APIs described in this document can be called only in the kernel space. +**Figure 1** Independent service mode +![image1](figures/independent-service-mode.png "PWM independent service mode") ## Usage Guidelines +### When to Use + +The PWM module is used for controlling vibrators and adjusting backlight brightness in smart devices. -### How to Use +### Available APIs -The figure below illustrates how to use the APIs. +**Table 1** describes the **PwmConfig** structure, which defines the PWM device attributes. **Table 2** describes the APIs provided by the PWM module. -**Figure 1** Using the PWM driver APIs +**Table 1** PwmConfig structure -![](figures/using-PWM-process.png) +| Parameter| Description| +| -------- | -------- | +| duty | Time that a signal is in the ON state, in ns.| +| period | Time for a signal to complete an on-and-off cycle, in ns.| +| number | Number of square waves to generate.
    - Positive value: indicates the number of square waves to generate.
    - **0**: indicates that square waves are generated continuously.| +| polarity | PWM signal polarity, which can be normal or reverted.
    A signal with normal polarity starts high for the duration of the duty cycle and goes low for the remaining of the period.
    A signal with inverted polarity starts low for the duration of the duty cycle and goes high for the remaining of the period.| +| status | PWM device status, which can be enabled or disabled.| +**Table 2** PWM driver APIs -### Opening a PWM Device Handle +| API | | +| ------------------------------------------------------------ | ------------------- | +| DevHandle PwmOpen(uint32_t num) | Opens a PWM device. | +| void PwmClose(DevHandle handle) | Closes a PWM device. | +| int32_t PwmSetPeriod(DevHandle handle, uint32_t period) | Sets the PWM period. | +| int32_t PwmSetDuty(DevHandle handle, uint32_t duty) | Sets the signal ON-state time.| +| int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity) | Sets the PWM signal polarity. | +| int32_t PwmEnable(DevHandle handle) | Enables a PWM device. | +| int32_t PwmDisable(DevHandle handle) | Disables a PWM device. | +| int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config) | Sets PWM device parameters. | +| int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config) | Obtains PWM device parameters. | -Before performing operations on a PWM device, call **PwmOpen** to open the device handle. +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> +> All the PWM APIs described in this document can be used in kernel mode and user mode. +### How to Develop -``` +The following figure shows how to use PWM APIs. + +**Figure 2** Using PWM APIs + +![image2](figures/using-PWM-process.png) + +#### Opening a PWM Device + +Before performing operations on a PWM device, use **PwmOpen()** to obtain the device handle. + +```c DevHandle PwmOpen(uint32_t num); ``` - **Table 3** Description of PwmOpen +**Table 3** Description of PwmOpen | **Parameter**| **Description**| | -------- | -------- | | num | PWM device number. | | **Return Value** | **Description** | -| handle | The operation is successful. The handle of the PWM device obtained is returned.| -| NULL | The operation failed. | - -Example: Open the device handle of PWM device 0. +| handle | The operation is successful. The PWM device handle is returned.| +| NULL | The operation fails. | +Example: Open PWM device 0. -``` -uint32_t num = 0; /* PWM device number. */ +```c +uint32_t num = 0; // PWM device number. DevHandle handle = NULL; -/* Obtain the PWM device handle. */ -handle = PwmOpen(num); +handle = PwmOpen(num); // Open PWM device 0 and obtain the device handle. if (handle == NULL) { - /* Error handling. */ + HDF_LOGE("PwmOpen: open pwm_%u failed.\n", num); + return; } ``` +#### Closing a PWM Device -### Closing a PWM Device Handle - -Call **PwmClose()** to close a PWM device handle to release resources. +Use **PwmClose()** to close a PWM device to release resources. - -``` -voidPwmClose(DevHandle handle); +```c +void PwmClose(DevHandle handle); ``` - **Table 4** Description of PwmClose +**Table 4** Description of PwmClose | **Parameter**| **Description**| | -------- | -------- | -| handle | PWM device handle to close. | +| handle | Handle of the PWM device to close. | - -``` -/* Close a PWM device handle. */ -PwmClose(handle); +```c +PwmClose(handle); // Close the PWM device and destroy the PWM device handle. ``` +#### Enabling a PWM Device -### Enabling a PWM Device - -Call **PwmEnable()** to enable a PWM device. - - -``` +```c int32_t PwmEnable(DevHandle handle); ``` - **Table 5** Description of PwmEnable +**Table 5** Description of PwmEnable | **Parameter**| **Description**| | -------- | -------- | | handle | PWM device handle. | -| **Return Value** | **Description** | -| 0 | The operation is successful. | -| Negative number | The operation failed. | +| **Return Value** | **Description**| +| HDF_SUCCESS | The operation is successful. | +| Negative number | The operation fails. | - -``` +```c int32_t ret; -/* Enable a PWM device. */ -ret = PwmEnable(handle); -if (ret != 0) { - /* Error handling. */ +ret = PwmEnable(handle); // Enable the PWM device. +if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmEnable: enable pwm failed, ret:%d\n", ret); + return ret; } ``` +#### Disabling a PWM Device -### Disabling a PWM Device - -Call **PwmDisable()** to disable a PWM device. - - -``` +```c int32_t PwmDisable(DevHandle handle); ``` - **Table 6** Description of PwmDisable +**Table 6** Description of PwmDisable | **Parameter**| **Description**| | -------- | -------- | | handle | PWM device handle. | -| **Return Value** | **Description** | -| 0 | The operation is successful. | -| Negative number | The operation failed. | +| **Return Value** | **Description**| +| HDF_SUCCESS | The operation is successful. | +| Negative number | The operation fails. | - -``` +```c int32_t ret; -/* Disable a PWM device. */ -ret = PwmDisable(handle); -if (ret != 0) { - /* Error handling. */ +ret = PwmDisable(handle); // Disable the PWM device. +if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmDisable: disable pwm failed, ret:%d\n", ret); + return ret; } ``` +#### Setting the PWM Period -### Setting the PWM Period - -Call **PwmSetPeriod()** to set the PWM period. - - -``` +```c int32_t PwmSetPeriod(DevHandle handle, uint32_t period); ``` - **Table 7** Description of PwmSetPeriod +**Table 7** Description of PwmSetPeriod | **Parameter**| **Description**| | -------- | -------- | | handle | PWM device handle. | | period | PWM period to set, in ns.| -| **Return Value**| **Description** | -| 0 | The operation is successful. | +| **Return Value**| **Description** | +| HDF_SUCCESS | The operation is successful. | | Negative number | The operation fails. | - -``` +```c int32_t ret; -/* Set the PWM period to 50000000 ns. */ -ret = PwmSetPeriod(handle, 50000000); -if (ret != 0) { - /* Error handling. */ +ret = PwmSetPeriod(handle, 50000000); // Set the PWM period to 50,000,000 ns. +if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetPeriod: pwm set period failed, ret:%d\n", ret); + return ret; } ``` +#### Setting the Signal ON-State Time -### Setting the PWM Signal ON-State Time - -Call **PwmSetDuty()** to set the time that the PWM signal is in the ON state. - - -``` +```c int32_t PwmSetDuty(DevHandle handle, uint32_t duty); ``` - **Table 8** Description of PwmSetDuty +**Table 8** Description of PwmSetDuty | **Parameter**| **Description**| | -------- | -------- | | handle | PWM device handle. | -| duty | Time that the signal is in the ON state, in ns.| -| **Return Value**| **Description** | -| 0 | The operation is successful. | -| Negative number | The operation failed. | +| duty | Time that a signal is in the ON state, in ns.| +| **Return Value**| **Description** | +| HDF_SUCCESS | The operation is successful. | +| Negative number | The operation fails. | -``` +```c int32_t ret; -/* Set the signal ON-state time to 25000000 ns. */ -ret = PwmSetDuty(handle, 25000000); -if (ret != 0) { - /* Error handling. */ +ret = PwmSetDuty(handle, 25000000); // Set the signal ON-state time to 25,000,000 ns. +if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetDuty: pwm set duty failed, ret:%d\n", ret); + return ret; } ``` +#### Setting the PWM Signal Polarity -### Setting the PWM Signal Polarity - -Call **PwmSetPolarity()** to set the signal polarity for a PWM device. - - -``` +```c int32_t PwmSetPolarity(DevHandle handle, uint8_t polarity); ``` - **Table 9** Description of PwmSetPolarity +**Table 9** Description of PwmSetPolarity | **Parameter**| **Description**| | -------- | -------- | | handle | PWM device handle. | | polarity | Polarity to set, which can be **PWM\_NORMAL\_POLARITY** or **PWM\_INVERTED\_POLARITY**.| -| **Return Value**| **Description** | -| 0 | The operation is successful. | -| Negative number | The operation failed. | +| **Return Value**| **Description** | +| HDF_SUCCESS | The operation is successful. | +| Negative number | The operation fails. | -``` +```c int32_t ret; -/* Set the PWM polarity to PWM_INVERTED_POLARITY. */ -ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); -if (ret != 0) { - /* Error handling. */ +ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); // Set the PWM signal polarity to inverted. +if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetPolarity: pwm set polarity failed, ret:%d\n", ret); + return ret; } ``` +#### Setting PWM Device Parameters -### Setting PWM Device Parameters - -Call **PwmSetConfig()** to set PWM device parameters. - - -``` +```c int32_t PwmSetConfig(DevHandle handle, struct PwmConfig *config); ``` - **Table 10** Description of PwmSetConfig +**Table 10** Description of PwmSetConfig | **Parameter**| **Description**| | -------- | -------- | -| handle | PWM device handle to close. | -| \*config | Pointer to PWM parameters. | -| **Return Value**| **Description** | -| 0 | The operation is successful. | -| Negative number | The operation failed. | - +| handle | PWM device handle. | +| \*config | Pointer to the PWM parameters to set. | +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful. | +| Negative number | The operation fails. | -``` +```c int32_t ret; struct PwmConfig pcfg; -pcfg.duty = 25000000; /* Set the signal ON-state time to 25000000 ns. */ -pcfg.period = 50000000; /* Set the PWM period to 50000000 ns. */ -pcfg.number = 0; /* Generate square waves continuously. */ -pcfg.polarity = PWM_INVERTED_POLARITY; /* Set the PWM polarity to PWM_INVERTED_POLARITY. */ -pcfg.status = PWM_ENABLE_STATUS; /* Set the running status to Enabled. */ - -/* Set PWM device parameters. */ -ret = PwmSetConfig(handle, &pcfg); -if (ret != 0) { - /* Error handling. */ -} -``` +The pcfg.duty = 25000000; // Set the signal ON-state time to 25,000,000 ns. +pcfg.period = 50000000; // Set the PWM period to 50,000,000 ns. +pcfg.number = 0; // Generate square waves continuously. +pcfg.polarity = PWM_INVERTED_POLARITY; // Set the PWM signal polarity to inverted. +pcfg.status = PWM_ENABLE_STATUS; // Enable PWM. -### Obtaining PWM Device Parameters - -Call **PwmGetConfig()** to obtain PWM device parameters. +ret = PwmSetConfig(handle, &pcfg); // Set PWM device parameters. +if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetConfig: pwm set config failed, ret:%d\n", ret); + return ret; +} +``` +#### Obtaining PWM Device Parameters -``` +```c int32_t PwmGetConfig(DevHandle handle, struct PwmConfig *config); ``` - **Table 11** Description of PwmGetConfig +**Table 11** Description of PwmGetConfig | **Parameter**| **Description**| | -------- | -------- | -| handle | PWM device handle to close. | -| \*config | Pointer to PWM parameters. | -| **Return Value**| **Description** | -| 0 | The operation is successful. | -| Negative number | The operation failed. | - +| handle | PWM device handle. | +| \*config | Pointer to the PWM parameters obtained. | +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful. | +| Negative number | The operation fails. | -``` +```c int32_t ret; struct PwmConfig pcfg; -/* Obtain PWM device parameters. */ -ret = PwmGetConfig(handle, &pcfg); -if (ret != 0) { - /* Error handling. */ +ret = PwmGetConfig(handle, &pcfg); // Obtain PWM device parameters. +if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmGetConfig: pwm get config failed, ret:%d\n", ret); + return ret; } ``` +## Example -## Development Example +The following uses the Hi3516D V300 development board as an example to describe how to use the PWM. The procedure is as follows: -The following example shows how to use the APIs to implement a PWM driver and manage the PWM device. +1. Open a PWM device and obtain the PWM device handle. +2. Set the PWM device period. +3. Set the signal ON-state time for the PWM device. +4. Set the signal polarity for the PWM device. +5. Obtain the PWM device parameters. +6. Enable the PWM device. +7. Set the PWM device parameters. +8. Disable the PWM device. +9. Close the PWM device. +```c +#include "pwm_if.h" // Header file of PWM standard APIs. +#include "hdf_log.h" // Header file of the HDF log APIs. -``` -void PwmTestSample(void) +static int32_t PwmTestSample(void) { int32_t ret; uint32_t num; + uint32_t period DevHandle handle = NULL; struct PwmConfig pcfg; - pcfg.duty = 20000000; /* Set the signal ON-state time to 20000000 ns. */ - pcfg.period = 40000000; /* Set the PWM period to 40000000 ns. */ - pcfg.number = 100; /* Generate 100 square waves. */ - pcfg.polarity = PWM_NORMAL_POLARITY; /* Set the polarity to PWM_NORMAL_POLARITY. */ - pcfg.status = PWM_ENABLE_STATUS; /* Set the running status to Enabled. */ + pcfg.duty = 20000000; // Set the signal ON-state time to 20,000,000 ns. + pcfg.period = 40000000; // Set the PWM period to 40,000,000 ns. + pcfg.number = 100; // Generate 100 square waves continuously. + pcfg.polarity = PWM_NORMAL_POLARITY; // Set the PWM signal polarity to normal. + pcfg.status = PWM_ENABLE_STATUS; // Enable the PWM device. - /* Enter the PWM device number. */ - num = 1; + num = 1; // PWM device number. - /* Open the PWM device handle. */ - handle = PwmOpen(num); + handle = PwmOpen(num); // Open a PWM device. if (handle == NULL) { - HDF_LOGE("PwmOpen: failed!\n"); + HDF_LOGE("PwmOpen: open pwm_%u failed!\n", num); return; } - /* Set the PWM period to 50000000 ns.*/ - ret = PwmSetPeriod(handle, 50000000); - if (ret != 0) { - HDF_LOGE("PwmSetPeriod: failed, ret %d\n", ret); - goto _ERR; + ret = PwmSetPeriod(handle, 50000000); // Set the PWM period to 50,000,000 ns. + if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetPeriod: pwm set period failed, ret %d\n", ret); + goto ERR; } - /* Set the signal ON-state time to 25000000 ns. */ - ret = PwmSetDuty(handle, 25000000); - if (ret != 0) { - HDF_LOGE("PwmSetDuty: failed, ret %d\n", ret); - goto _ERR; + ret = PwmSetDuty(handle, 25000000); // Set the signal ON-state time to 25,000,000 ns. + if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetDuty: pwm set duty failed, ret %d\n", ret); + goto ERR; } - /* Set the PWM polarity to PWM_INVERTED_POLARITY. */ - ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); - if (ret != 0) { - HDF_LOGE("PwmSetPolarity: failed, ret %d\n", ret); - goto _ERR; + ret = PwmSetPolarity(handle, PWM_INVERTED_POLARITY); // Set the PWM signal polarity to inverted. + if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetPolarity: pwm set polarity failed, ret %d\n", ret); + goto ERR; } - /* Obtain PWM device parameters. */ - ret = PwmGetConfig(handle, &pcfg); - if (ret != 0) { - HDF_LOGE("PwmGetConfig: failed, ret %d\n", ret); - goto _ERR; + ret = PwmGetConfig(handle, &pcfg); // Obtain PWM device parameters. + if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmGetConfig: get pwm config failed, ret %d\n", ret); + goto ERR; } - /* Enable the PWM device. */ - ret = PwmEnable(handle); - if (ret != 0) { - HDF_LOGE("PwmEnable: failed, ret %d\n", ret); - goto _ERR; + ret = PwmEnable(handle); // Enable the PWM device. + if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmEnable: enable pwm failed, ret %d\n", ret); + goto ERR; } - /* Set PWM device parameters. */ - ret = PwmSetConfig(handle, &pcfg); - if (ret != 0) { - HDF_LOGE("PwmSetConfig: failed, ret %d\n", ret); - goto _ERR; + ret = PwmSetConfig(handle, &pcfg); // Set PWM device parameters. + if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmSetConfig: set pwm config failed, ret %d\n", ret); + goto ERR; } - /* Disable the PWM device. */ - ret = PwmDisable(handle); - if (ret != 0) { - HDF_LOGE("PwmDisable: failed, ret %d\n", ret); - goto _ERR; + ret = PwmDisable(handle); // Disable the PWM device. + if (ret != HDF_SUCCESS) { + HDF_LOGE("PwmDisable: disable pwm failed, ret %d\n", ret); + goto ERR; } -_ERR: - /* Close the PWM device handle. */ - PwmClose(handle); +ERR: + PwmClose(handle); // Close the PWM device. + return ret; } ``` diff --git a/en/device-dev/driver/driver-platform-pwm-develop.md b/en/device-dev/driver/driver-platform-pwm-develop.md index 73fe496394..c2d2fe59ab 100644 --- a/en/device-dev/driver/driver-platform-pwm-develop.md +++ b/en/device-dev/driver/driver-platform-pwm-develop.md @@ -1,208 +1,224 @@ # PWM - ## Overview -In the Hardware Driver Foundation (HDF), the Pulse Width Modulator (PWM) uses the independent service mode for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. +### Function - **Figure 1** Independent service mode +Pulse Width Modulation (PWM) is a technology that performs digital coding on analog signal levels and converts them into pulses. It is widely used in fields, such as measurement, communication, and power control and conversion. The PWM module is used for controlling vibrators and adjusting backlight brightness in smart devices. - ![image](figures/independent-service-mode.png "PWM independent service mode") +### Basic Concepts +A pulse (electrical pulse) is a burst of current or voltage, characterized by sudden change and discontinuity. There are many types of pulses. Common pulses include triangular, sharp, rectangular, square, trapezoidal, and zigzag pulses. Main pulse parameters include the repetition period **T** (**T** = 1/**F**, where **F** is the pulse repetition frequency), pulse amplitude **U**, rise time **ts** at the leading edge, fall time **t** at the trailing edge, and pulse width **tk**. -## Available APIs +### Working Principles -**PwmMethod**: +In the Hardware Driver Foundation (HDF), the PWM uses the independent service mode (see Figure 1) for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. +In the independent service mode, the core layer does not publish a service for the upper layer. Therefore, a service must be published for each controller. To achieve this purpose: -``` +- You need to implement the **Bind()** function in **HdfDriverEntry** to bind services. +- The **policy** field of **deviceNode** in the **device_info.hcs** file can be **1** or **2**, but not **0**. + +The PWM module is divided into the following layers: + +- Interface layer: provides APIs for opening or closing a PWM device, setting the PWM period, signal ON-state time, PWM device polarity, or PWM device parameters, obtaining PWM device parameters, and enabling or disabling a PWM device +- Core layer: provides the capabilities of adding or removing a PWM controller and managing PWM devices. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. + +**Figure 1** Independent service mode + +![image](figures/independent-service-mode.png "PWM independent service mode") + +## Development Guidelines + +### When to Use + +Before using your PWM device with OpenHarmony, you need to perform PWM driver adaptation. + +### Available APIs + +To enable the upper layer to successfully operate the PWM controller by calling the PWM APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/pwm/pwm_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +**PwmMethod**: + +```c struct PwmMethod { - int32_t (*setConfig)(struct PwmDev *pwm, struct PwmConfig *config); - int32_t (*open)(struct PwmDev *pwm); - int32_t (*close)(struct PwmDev *pwm); + int32_t (*setConfig)(struct PwmDev *pwm, struct PwmConfig *config); + int32_t (*open)(struct PwmDev *pwm); + int32_t (*close)(struct PwmDev *pwm); }; ``` - **Table 1** Description of callback functions in PwmMethod +**Table 1** Hook functions in **PwmMethod** | Function| Input Parameter| Return Value| Description| | -------- | -------- | -------- | -------- | -| setConfig | **pwm**: structure pointer to the PWM controller at the core layer.
    **config**: structure pointer to the attributes to set.| HDF_STATUS| Sets attributes.| -| open | **pwm**: structure pointer to the PWM controller at the core layer.| HDF_STATUS| Opens a device.| -| close | **pwm**: structure pointer to the PWM controller at the core layer.| HDF_STATUS| Closes a device.| - +| setConfig | **pwm**: structure pointer to the PWM controller at the core layer.
    **config**: structure pointer to the device attributes to set.| HDF_STATUS| Sets device attributes.| +| open | **pwm**: structure pointer to the PWM controller at the core layer.| HDF_STATUS| Opens a PWM device.| +| close | **pwm**: structure pointer to the PWM controller at the core layer.| HDF_STATUS| Closes a PWM device.| -## How to Develop +### How to Develop -The PWM module adaptation involves the following steps: +The PWM module adaptation procedure is as follows: 1. Instantiate the driver entry. - - Instantiate the **HdfDriverEntry** structure. - - Call **HDF_INIT** to register the **HdfDriverEntry** instance with the HDF. - 2. Configure attribute files. - - Add the **deviceNode** description to the **device_info.hcs** file. - - (Optional) Add the **pwm_config.hcs** file. - 3. Instantiate the PWM controller object. - - Initialize **PwmDev**. - - Instantiate **PwmMethod** in the **PwmDev** object. - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > For details about the functions in **PwmMethod**, see [Available APIs](#available-apis). - 4. Debug the driver. - (Optional) For new drivers, verify the basic functions, such as the PWM status control and response to interrupts. - +### Example -## Development Example - -The following uses **pwm_hi35xx.c** as an example to present the information required for implementing device functions. +The following uses the **//device_soc_hisilicon/common/platform/pwm/pwm_hi35xx.c** driver of the Hi3516D V300 development board as an example to describe the PWM driver adaptation. 1. Instantiate the driver entry. - The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. - - In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - - Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. + Generally, the HDF calls **Bind()** and then **Init()** to load a driver. If **Init()** fails to be called, the HDF calls **Release()** to release driver resources and exit. PWM driver entry example: - - ``` + + ```c struct HdfDriverEntry g_hdfPwm = { .moduleVersion = 1, - .moduleName = "HDF_PLATFORM_PWM",// (Mandatory) The value must be the same as that of moduleName in the .hcs file. - .Bind = HdfPwmBind, - .Init = HdfPwmInit, - .Release = HdfPwmRelease, + .moduleName = "HDF_PLATFORM_PWM", // (Mandatory) The value must be the same as that of moduleName in the .hcs file. + .Bind = HdfPwmBind, // See the Bind function. + .Init = HdfPwmInit, // See the Init function. + .Release = HdfPwmRelease, // See the Release function. }; - // Call HDF_INIT to register the driver entry with the HDF. - HDF_INIT(g_hdfPwm); + HDF_INIT(g_hdfPwm); // Call HDF_INIT to register the driver entry with the HDF. ``` -2. Add the **deviceNode** information to the **device_info.hcs** file and configure the device attributes in the **pwm_config.hcs** file. +2. Configure attribute files. + + Add the deviceNode information to the **device_info.hcs** file. The deviceNode information is related to the driver entry registration. The following example uses two PWM controllers as an example. If there are more PWM controllers, add the deviceNode information to the **device_info.hcs** file for each controller. The device attribute values configured in **pwm_config.hcs** are closely related to default values or value ranges of the **PwmDev** members at the core layer. - The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the default values or value ranges of the **PwmDev** members at the core layer. If there are multiple devices, you need to add the **deviceNode** information to the **device_info** file and add the device attributes to the **pwm_config** file for each device. + - **device_info.hcs** example - - **device_info.hcs** configuration example + Add the deviceNode information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. - - ``` + ```c root { - device_info { - platform :: host { - hostName = "platform_host"; - priority = 50; - device_pwm :: device { // Configure an HDF device node for each PWM controller. - device0 :: deviceNode { - policy = 1; // Publish services for kernel-mode processes. - priority = 80; // Driver startup priority. - permission = 0644; // Permission for the driver to create a device node. - moduleName = "HDF_PLATFORM_PWM"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. - serviceName = "HDF_PLATFORM_PWM_0"; // (Mandatory) Unique name of the service published by the driver. - deviceMatchAttr = "hisilicon_hi35xx_pwm_0";// (Mandatory) Used to configure the private data of the controller. - // The value must be the same as the controller information in pwm_config.hcs. + device_info { + platform :: host { + hostName = "platform_host"; + priority = 50; + device_pwm ::device { // Configure an HDF device node for each PWM controller. + device0 :: deviceNode { + policy = 1; // The value 1 means to publish services only to the kernel-mode processes. + priority = 80; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "HDF_PLATFORM_PWM"; // (Mandatory) Driver name, which must be the same as moduleName in the driver entry. + serviceName = "HDF_PLATFORM_PWM_0"; // (Mandatory) Unique name of the service published by the driver. + deviceMatchAttr = "hisilicon_hi35xx_pwm_0"; // Controller private data, which must be the same as that of the controller in pwm_config.hcs. + } + device1 :: deviceNode { + policy = 1; + priority = 80; + permission = 0644; + moduleName = "HDF_PLATFORM_PWM"; + serviceName = "HDF_PLATFORM_PWM_1"; + deviceMatchAttr = "hisilicon_hi35xx_pwm_1"; + } + ... + } } - device1 :: deviceNode { - policy = 1; - priority = 80; - permission = 0644; - moduleName = "HDF_PLATFORM_PWM"; - serviceName = "HDF_PLATFORM_PWM_1"; - deviceMatchAttr = "hisilicon_hi35xx_pwm_1"; - } - } } - } } ``` - - **pwm_config.hcs** configuration example - - ``` + - **pwm_config.hcs** example + + Configure the device attributes in the **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/pwm/pwm_config.hcs** file. The parameters are as follows: + + ```c root { - platform { - pwm_config { - template pwm_device { // (Mandatory) Template configuration. In the template, you can configure the common parameters shared by service nodes. - serviceName = ""; - match_attr = ""; - num = 0; // (Mandatory) Device number - base = 0x12070000; // (Mandatory) Used for address mapping - } - device_0x12070000 :: pwm_device { // Add the HDF node and device node information for each device. - match_attr = "hisilicon_hi35xx_pwm_0";// (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. - } - device_0x12070020 :: pwm_device { - match_attr = "hisilicon_hi35xx_pwm_1"; - num = 1; - base = 0x12070020; // (Mandatory) Used for address mapping - } + platform { + pwm_config { + template pwm_device { // (Mandatory) Template configuration. If the template is used to configure device node information, the default values in the template will be used for the fields that are not declared for the node. + serviceName = ""; + match_attr = ""; + num = 0; // (Mandatory) Device number. + base = 0x12070000; // (Mandatory) Base address used for address mapping. + } + device_0x12070000 :: pwm_device { // Add the HDF node and device node information for each device. + match_attr = "hisilicon_hi35xx_pwm_0"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. + } + device_0x12070020 :: pwm_device { + match_attr = "hisilicon_hi35xx_pwm_1"; + num = 1; + base = 0x12070020; // (Mandatory) Base address used for address mapping. + } + } } - } } ``` -3. Initialize the **wmDev** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init**, and **Release**) to instantiate **PwmMethod** in **PwmDev** (so that the underlying driver functions can be called). + After the **pwm_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. - - Defining a custom structure + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/pwm/pwm_config.hcs" // Relative path of the file. + ``` - To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **pwm_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the device number, to the object at the core layer. +3. Instantiate the PWM controller object. - - ``` + Initialize the **PwmDev** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **PwmMethod** in **PwmDev** (so that the underlying driver functions can be called). + + - Define a custom structure. + + To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **pwm_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the PWM device number, to the object at the core layer. + + ```c struct HiPwm { - struct PwmDev dev; // (Mandatory) Core layer structure - volatile unsigned char *base; - struct HiPwmRegs *reg; // Device attribute structure, which can be customized. - bool supportPolarity; + struct PwmDev dev; // (Mandatory) Control object at the core layer. + volatile unsigned char *base; // (Mandatory) Register base address used for address mapping. + struct HiPwmRegs *reg; // Device attribute structure, which can be customized. + bool supportPolarity; // Whether polarity is supported. }; - - // PwmDev is the controller structure at the core layer. The Init function assigns values to the members of PwmDev. - struct PwmDev { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - struct PwmConfig cfg; // Attribute structure. For details, see the description of PwmConfig. - struct PwmMethod *method; // Hook function template - bool busy; - uint32_t num; // Device number - OsalSpinlock lock; - void *priv; // Private data. Generally, the start address of the custom structure is stored to facilitate invoking of the structure. + + struct PwmDev { // PwmDev is the core layer controller structure. The Bind function assigns values to the members of PwmDev. + struct IDeviceIoService service; // Driver service. + struct HdfDeviceObject *device; // Driver device object. + struct PwmConfig cfg; // Device attribute structure. For details, see the following definition. + struct PwmMethod *method; // Hook functions. + bool busy; // Whether the device is busy. + uint32_t num; // Device number. + OsalSpinlock lock; // Spinlock. + void *priv; // Private data. }; - struct PwmConfig { - uint32_t duty // Time that a signal is in the ON state, in ns. - uint32_t period; // Time for a signal to complete an on-and-off cycle, in ns. - uint32_t number; // Number of square waves to generate. - uint8_t polarity; // Polarity - // ------------------- | -------------- - // PWM_NORMAL_POLARITY | Normal polarity - // PWM_INVERTED_POLARITY | Inverted polarity - // - uint8_t status; // Running status - // ------------------ | ----------------- - // PWM_DISABLE_STATUS | Disabled - // PWM_ENABLE_STATUS | Enabled + + struct PwmConfig { // PWM device attributes. + uint32_t duty; // Time that a signal is in the ON state, in ns. + uint32_t period; // Time for a signal to complete an on-and-off cycle, in ns. + uint32_t number; // Number of square waves to generate. + uint8_t polarity; // Polarity + // ------------------- | -------------- + // PWM_NORMAL_POLARITY | Normal polarity + // PWM_INVERTED_POLARITY | Inverted polarity + // + uint8_t status; // Running status. + // ------------------ | ----------------- + // PWM_DISABLE_STATUS | Disabled + // PWM_ENABLE_STATUS | Enabled }; ``` - - Instantiating **PwmMethod** in **PwmDev** (other members are initialized by **Init**) + - Instantiate the **PwmMethod** structure in **PwmDev**. - - ``` - // The following uses pwm_hi35xx.c as an example. Fill the hook function. - struct PwmMethod g_pwmOps = { - .setConfig = HiPwmSetConfig,// Set attributes. + ```c + struct PwmMethod g_pwmOps = { // Instantiate the hook functions in pwm_hi35xx.c. + .setConfig = HiPwmSetConfig, // Set device attributes. }; ``` - - **Init** function + + - Implement the **Init** function. **Input parameter**: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. **Return value**: - **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. | Status| Description| | -------- | -------- | @@ -215,58 +231,58 @@ The following uses **pwm_hi35xx.c** as an example to present the information req **Function description**: - Initializes the custom structure object and **PwmDev**, and calls the **PwmDeviceAdd** function at the core layer. + Initializes the custom structure object and **PwmDev** members, and calls **PwmDeviceAdd()** to add the PWM controller to the core layer. - - ``` - // The Bind function is empty. It can be combined with the Init function or implement related operations based on service requirements. + ```c + // In this example, Bind() is an empty function. You can add operations as required or implement related features in Init(). static int32_t HdfPwmBind(struct HdfDeviceObject *obj) { - (void)obj; - return HDF_SUCCESS; + (void)obj; + return HDF_SUCCESS; } - + static int32_t HdfPwmInit(struct HdfDeviceObject *obj) { - int ret; - struct HiPwm *hp = NULL; - ... - hp = (struct HiPwm *)OsalMemCalloc(sizeof(*hp)); - ... - ret = HiPwmProbe(hp, obj); // (Mandatory) The implementation is as follows: - ... - return ret; + int ret; + struct HiPwm *hp = NULL; + ... + hp = (struct HiPwm *)OsalMemCalloc(sizeof(*hp)); + ... + ret = HiPwmProbe(hp, obj); // (Mandatory) The implementation is as follows. + ... + return ret; } - + static int32_t HiPwmProbe(struct HiPwm *hp, struct HdfDeviceObject *obj) { uint32_t tmp; struct DeviceResourceIface *iface = NULL; - iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE);// Initialize the custom structure HiPwm. + iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); // Initialize the custom structure HiPwm. ... - hp->reg = (struct HiPwmRegs *)hp->base; // Initialize the custom structure HiPwm. - hp->supportPolarity = false; // Initialize the custom structure HiPwm. - hp->dev.method = &g_pwmOps; // Attach the PwmMethod instance. - hp->dev.cfg.duty = PWM_DEFAULT_DUTY_CYCLE; // Initialize PwmDev. - hp->dev.cfg.period = PWM_DEFAULT_PERIOD; // Initialize PwmDev. - hp->dev.cfg.polarity = PWM_DEFAULT_POLARITY; // Initialize PwmDev. - hp->dev.cfg.status = PWM_DISABLE_STATUS; // Initialize PwmDev. - hp->dev.cfg.number = 0; // Initialize PwmDev. - hp->dev.busy = false; // Initialize PwmDev. - if (PwmDeviceAdd(obj, &(hp->dev)) ) != HDF_SUCCESS) { // Call the core layer function to initialize devices and services. + hp->reg = (struct HiPwmRegs *)hp->base; // Initialize the custom structure HiPwm. + hp->supportPolarity = false; // Initialize the custom structure HiPwm. + hp->dev.method = &g_pwmOps; // Attach the PwmMethod instance. + hp->dev.cfg.duty = PWM_DEFAULT_DUTY_CYCLE; // Initialize PwmDev. + hp->dev.cfg.period = PWM_DEFAULT_PERIOD; // Initialize PwmDev. + hp->dev.cfg.polarity = PWM_DEFAULT_POLARITY; // Initialize PwmDev. + hp->dev.cfg.status = PWM_DISABLE_STATUS; // Initialize PwmDev. + hp->dev.cfg.number = 0; // Initialize PwmDev. + hp->dev.busy = false; // Initialize PwmDev. + if (PwmDeviceAdd(obj, &(hp->dev)) ) != HDF_SUCCESS) { // Call the core layer function to initialize devices and services. OsalIoUnmap((void *)hp->base); return HDF_FAILURE; } return HDF_SUCCESS; } ``` - - **Release** function + + - Implement the **Release** function. **Input parameter**: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. **Return value**: @@ -274,17 +290,20 @@ The following uses **pwm_hi35xx.c** as an example to present the information req **Function description**: - Releases the memory and deletes the controller. This function assigns values to the **Release** function in the driver entry structure. If the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + Releases the memory and deletes the controller. This function assigns values to **Release()** in the driver entry structure. If the HDF fails to call **Init()** to initialize the driver, **Release()** is called to release driver resources. - - ``` + ```c static void HdfPwmRelease(struct HdfDeviceObject *obj) { struct HiPwm *hp = NULL; ... - hp = (struct HiPwm *)obj->service;// A forced conversion from HdfDeviceObject to HiPwm is involved. - ... - PwmDeviceRemove(obj, &(hp->dev));// (Mandatory) Call the core layer functions to release PwmDev devices and services. A forced conversion from HiPwm to PwmDev is involved in the process. - HiPwmRemove(hp); // Release HiPwm. + hp = (struct HiPwm *)obj->service; // A forced conversion from HdfDeviceObject to HiPwm is involved. + ... + PwmDeviceRemove(obj, &(hp->dev)); // (Mandatory) Call the core layer functions to release PwmDev devices and services. A forced conversion from HiPwm to PwmDev is involved in the process. + HiPwmRemove(hp); // Release HiPwm. } ``` + +4. Debug the driver. + + (Optional) For new drivers, verify the basic functions, such as the PWM status control and response to interrupts. diff --git a/en/device-dev/driver/driver-platform-uart-des.md b/en/device-dev/driver/driver-platform-uart-des.md index 3ddb92b532..c73c19d71a 100644 --- a/en/device-dev/driver/driver-platform-uart-des.md +++ b/en/device-dev/driver/driver-platform-uart-des.md @@ -1,328 +1,353 @@ # UART - ## Overview -The Universal Asynchronous Receiver/Transmitter (UART) is a universal serial data bus used for asynchronous communication. It enables bi-directional communication between devices in full-duplex mode. +### Function -UART is widely used to print information for debugging or to connect to various external modules such as GPS and Bluetooth. +The Universal Asynchronous Receiver/Transmitter (UART) is a universal serial data bus used for asynchronous communication. It enables bi-directional communication between devices in full-duplex mode. A UART is connected to other modules through two wires (as shown in Figure 1) or four wires (as shown in Figure 2). - - TX: TX pin of the transmitting UART. It is connected to the RX pin of the peer UART. - - RX: RX pin of the receiving UART. It is connected to the TX pin of the peer UART. - - RTS: Request to Send signal pin. It is connected to the CTS pin of the peer UART and is used to indicate whether the local UART is ready to receive data. - - CTS: Clear to Send signal pin. It is connected to the RTS pin of the peer UART and is used to indicate whether the local UART is allowed to send data to the peer end. - **Figure 1** Two-wire UART communication + - TX: UART transmitter. It is connected to the RX of the peer UART. + - RX: UART receiver. It is connected to the TX of the peer UART. + - RTS: Request to Send signal, indicating whether the local UART is ready to receive data. It is connected to the CTS of the peer UART. + - CTS: Clear to Send signal, indicating whether the local UART is allowed to send data to the peer end. It is connected to the RTS of the peer UART. - ![](figures/2-wire-uart-communication.png "2-wire-uart-communication") +**Figure 1** Two-wire UART communication - **Figure 2** Four-wire UART communication +![image1](figures/2-wire-uart-communication.png "2-wire-uart-communication") - ![](figures/4-wire-uart-communication.png "4-wire-uart-communication") +**Figure 2** Four-wire UART communication -- The transmitting and receiving UARTs must ensure that they have the same settings on particular attributes such as the baud rate and data format (start bit, data bit, parity bit, and stop bit) before they start to communicate. During data transmission, a UART sends data to the peer end over the TX pin and receives data from the peer end over the RX pin. When the size of the buffer used by a UART for storing received data reaches the preset threshold, the RTS signal of the UART changes to **1** (data cannot be received), and the peer UART stops sending data to it because its CTS signal does not allow it to send data. + ![image2](figures/4-wire-uart-communication.png "4-wire-uart-communication") -- The UART interface defines a set of common functions for operating a UART port, including obtaining and releasing device handles, reading and writing data of a specified length, and obtaining and setting the baud rate, as well as the device attributes. +The UART transmitter and receiver must have the same settings on particular attributes, such as the baud rate and data format (start bit, data bits, parity bit, and stop bit) before they start to communicate. A UART sends data to the peer end over the TX and receives data from the peer end over the RX. When the size of the buffer used by a UART for storing received data reaches the preset threshold, the RTS signal of the UART changes to **1** (data cannot be received), and the peer UART stops sending data to it because its CTS signal does not allow it to send data. +The UART module provides APIs for operating UART ports, including: -## Available APIs +- Opening or closing a UART device +- Reading or writing data +- Setting or obtaining the baud rate of a UART device +- Setting or obtaining UART device attributes - **Table 1** UART driver APIs +### Basic Concepts -| API| Description| -| -------- | -------- | -| UartOpen | Obtains a UART device handle.| -| UartClose | Releases a UART device handle.| -| UartRead | Reads data of the specified length from a UART device.| -| UartWrite | Writes data of the specified length to a UART device.| -| UartGetBaud | Obtains the UART baud rate.| -| UartSetBaud | Sets the UART baud rate.| -| UartGetAttribute | Obtains UART device attributes.| -| UartSetAttribute | Sets UART device attributes.| -| UartSetTransMode | Sets the UART transmission mode.| +- Asynchronous communication + + In asynchronous communication, data is transmitted in frames of characters or bytes. Frames are sent and received one by one through the transmission line. The transmitter and receiver have their own clocks to control data sending and receiving. The two clock sources are independent and not synchronized with each other. + + When data is sent one character at a time, the time interval between two characters is not fixed, but the time interval between two adjacent bits in a character frame is fixed. + +- Full-duplex transmission + + A duplex communication mode allows data to be transmitted in both directions at the same time. A duplex communication channel is equivalent to two simplex communication channels operating in opposite directions at the same time. In full-duplex mode, signals can be transmitted bidirectionally at the same time. + +### Working Principles -> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    -> All APIs described in this document can be called only in kernel mode. +In the Hardware Driver Foundation (HDF), the UART uses the independent service mode (see Figure 3) for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. +In the independent service mode, the core layer does not publish a service for the upper layer. Therefore, a service must be published for each controller. To achieve this purpose: + +- You need to implement the **Bind()** function in **HdfDriverEntry** to bind services. +- The **policy** field of **deviceNode** in the **device_info.hcs** file can be **1** or **2**, but not **0**. + +The UART module is divided into the following layers: + +- Interface layer: provides APIs for opening or closing a UART device, reading or writing data of the specified length, setting or obtaining the baud rate or attributes of a UART device, and setting the transmission mode. +- Core layer: provides the capabilities of adding or removing a UART controller, and managing UART devices. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. + +**Figure 3** Independent service mode + +![image3](figures/independent-service-mode.png) ## Usage Guidelines +### When to Use -### How to Use +The UART module is widely used to implement low-speed serial communication between devices, for example, output the printing information. It can also connect to a variety of external GPS and Bluetooth devices. -The figure below illustrates how to use the APIs. +### Available APIs - **Figure 3** Using UART driver APIs +**Table 1** UART driver APIs - ![](figures/using-UART-process.png) +| API| Description| +| -------- | -------- | +| DevHandle UartOpen(uint32_t port) | Opens a UART device.| +| void UartClose(DevHandle handle) | Closes a UART device.| +| int32_t UartRead(DevHandle handle, uint8_t *data, uint32_t size) | Reads data of the specified length from a UART device.| +| int32_t UartWrite(DevHandle handle, uint8_t *data, uint32_t size) | Writes data of the specified length to a UART device.| +| int32_t UartGetBaud(DevHandle handle, uint32_t *baudRate) | Obtains the UART baud rate.| +| int32_t UartSetBaud(DevHandle handle, uint32_t baudRate) | Sets the UART baud rate.| +| int32_t UartGetAttribute(DevHandle handle, struct UartAttribute *attribute) | Obtains UART device attributes.| +| int32_t UartSetAttribute(DevHandle handle, struct UartAttribute *attribute) | Sets UART device attributes.| +| int32_t UartSetTransMode(DevHandle handle, enum UartTransMode mode) | Sets the UART transmission mode.| +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> +> All the UART APIs described in this document can be used in kernel mode and user mode. -### Opening a UART Device Handle +### How to Develop -Before performing UART communication, call **UartOpen** to obtain a UART device handle. This function returns the pointer to the UART device handle with the specified port number. +The following figure illustrates how to use the UART APIs. - -``` +**Figure 4** Using UART driver APIs + +![image4](figures/using-UART-process.png) + + +#### Opening a UART Device + +Before performing UART communication, use **UartOpen()** to obtain a UART device handle based on the port number. + +```c DevHandle UartOpen(uint32_t port); ``` - **Table 2** Description of UartOpen +**Table 2** Description of UartOpen -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| port | UART port number.| -| **Return Value**| **Description**| -| NULL | The operation failed.| -| Device handle| The operation is successful. The obtained UART device handle is returned.| +| port | UART port number.| +| **Return Value**| **Description**| +| NULL | The operation fails.| +| Device handle| The operation is successful. The obtained UART device handle is returned.| + +Example: Obtain the device handle of UART port 1. + +```c +DevHandle handle = NULL; // UART device handle. +uint32_t port = 1; // UART device port number. - Example: Obtain the device handle of UART port 3. - -``` -DevHandle handle = NULL; /* UART device handle */ -uint32_t port = 3; /* UART port number */ handle = UartOpen(port); if (handle == NULL) { - HDF_LOGE("UartOpen: failed!\n"); + HDF_LOGE("UartOpen: open uart_%u failed!\n", port); return; } ``` +#### Setting the UART Baud Rate -### Setting the UART Baud Rate - -Call **UartSetBaud()** to set the UART baud rate. +Use **UartSetBaud()** to set the UART baud rate. - -``` +```c int32_t UartSetBaud(DevHandle handle, uint32_t baudRate); ``` - **Table 3** Description of UartSetBaud +**Table 3** Description of UartSetBaud -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle.| -| baudRate | Baud rate to set.| -| **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| handle | UART device handle.| +| baudRate | Baud rate to set.| +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| Example: Set the UART baud rate to **9600**. - -``` +```c int32_t ret; -/* Set the UART baud rate to 9600. */ -ret = UartSetBaud(handle, 9600); -if (ret != 0) { + +ret = UartSetBaud(handle, 9600); // Set the UART baud rate. +if (ret != HDF_SUCCESS) { HDF_LOGE("UartSetBaud: failed, ret %d\n", ret); + return ret; } ``` +#### Obtaining the UART Baud Rate -### Obtaining the UART Baud Rate - -Call **UartGetBaud()** to obtain the UART baud rate. +Use **UartGetBaud()** to obtain the UART baud rate. - -``` +```c int32_t UartGetBaud(DevHandle handle, uint32_t *baudRate); ``` - **Table 4** Description of UartGetBaud +**Table 4** Description of UartGetBaud -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle.| -| baudRate | Pointer to the UART baud rate obtained.| -| **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| handle | UART device handle.| +| baudRate | Pointer to the UART baud rate obtained.| +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| Example: Obtain the UART baud rate. - -``` +```c int32_t ret; uint32_t baudRate; -/* Obtain the UART baud rate. */ -ret = UartGetBaud(handle, &baudRate); -if (ret != 0) { + +ret = UartGetBaud(handle, &baudRate); // Obtain the UART baud rate. +if (ret != HDF_SUCCESS) { HDF_LOGE("UartGetBaud: failed, ret %d\n", ret); + return ret; } ``` +#### Setting UART Device Attributes -### Setting UART Device Attributes +Use **UartSetAttribute()** to set UART device attributes. -Call **UartSetAttribute()** to set UART device attributes. - - -``` +```c int32_t UartSetAttribute(DevHandle handle, struct UartAttribute *attribute); ``` - **Table 5** Description of UartSetAttribute +**Table 5** Description of UartSetAttribute -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle.| -| attribute | Pointer to the UART device attributes to set.| -| **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| handle | UART device handle.| +| attribute | Pointer to the UART device attributes to set.| +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| Example: Set UART device attributes. - -``` +```c int32_t ret; struct UartAttribute attribute; -attribute.dataBits = UART_ATTR_DATABIT_7; /* Enable 7 bits to be transferred each time. */ -attribute.parity = UART_ATTR_PARITY_NONE; /* Disable parity check. */ -attribute.stopBits = UART_ATTR_STOPBIT_1; /* Set the stop bit to 1. */ -attribute.rts = UART_ATTR_RTS_DIS; /* Disable the RTS signal. */ -attribute.cts = UART_ATTR_CTS_DIS; /* Disable the CTS signal. */ -attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN; /* Enable RX FIFO. */ -attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN; /* Enable TX FIFO. */ -/* Set UART device attributes. */ -ret = UartSetAttribute(handle, &attribute); -if (ret != 0) { + +attribute.dataBits = UART_ATTR_DATABIT_7; // Transfer 7 bits each time. +attribute.parity = UART_ATTR_PARITY_NONE; // Disable parity check for the data to transfer. +attribute.stopBits = UART_ATTR_STOPBIT_1; // Set the stop bit to 1. +attribute.rts = UART_ATTR_RTS_DIS; // Disable RTS. +attribute.cts = UART_ATTR_CTS_DIS; // Disable CTS. +attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN; // Enable RX FIFO. +attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN; // Enable TX FIFO. + +ret = UartSetAttribute(handle, &attribute); // Set UART device attributes. +if (ret != HDF_SUCCESS) { HDF_LOGE("UartSetAttribute: failed, ret %d\n", ret); +turn ret; } ``` +#### Obtaining UART Device Attributes -### Obtaining UART Device Attributes - -Call **UartGetAttribute()** to obtain the current UART device attributes. +Use **UartGetAttribute()** to obtain the UART device attributes. - -``` +```c int32_t UartGetAttribute(DevHandle handle, struct UartAttribute *attribute); ``` - **Table 6** Description of UartGetAttribute +**Table 6** Description of UartGetAttribute -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle.| -| attribute | Pointer to the UART device attributes obtained.| -| **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| handle | UART device handle.| +| attribute | Pointer to the UART device attributes obtained.| +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| Example: Obtain UART device attributes. - -``` +```c int32_t ret; struct UartAttribute attribute; -/* Obtain UART device attributes. */ -ret = UartGetAttribute(handle, &attribute); -if (ret != 0) { + +ret = UartGetAttribute(handle, &attribute); // Obtain the attributes of the UART device. +if (ret != HDF_SUCCESS) { HDF_LOGE("UartGetAttribute: failed, ret %d\n", ret); + return ret; } ``` +#### Setting the UART Transmission Mode -### Setting the UART Transmission Mode +Use **UartSetTransMode()** to set the UART transmission mode. -Call **UartSetTransMode()** to set the UART transmission mode. - - -``` +```c int32_t UartSetTransMode(DevHandle handle, enum UartTransMode mode); ``` - **Table 7** Description of UartSetTransMode +**Table 7** Description of UartSetTransMode -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle.| -| mode | UART transmission mode to set.| -| **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| handle | UART device handle.| +| mode | UART transmission mode to set.| +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| Example: Set the UART transmission mode to **UART_MODE_RD_BLOCK**. - -``` +```c int32_t ret; -/* Set the UART transmission mode. */ -ret = UartSetTransMode(handle, UART_MODE_RD_BLOCK); -if (ret != 0) { + +ret = UartSetTransMode(handle, UART_MODE_RD_BLOCK); // Sets the UART transmission mode. +if (ret != HDF_SUCCESS) { HDF_LOGE("UartSetTransMode: failed, ret %d\n", ret); + return ret; } ``` +#### Writing Data to a UART Device -### Writing Data to a UART Device +Use **UartWrite()** to write data of the specified length to a UART device. -Call **UartWrite()** to write data of the specified length to a UART device. - - -``` +```c int32_t UartWrite(DevHandle handle, uint8_t *data, uint32_t size); ``` - **Table 8** Description of UartWrite +**Table 8** Description of UartWrite -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle.| -| data | Pointer to the data to write.| -| size | Length of the data to write.| -| **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| handle | UART device handle.| +| data | Pointer to the data to write.| +| size | Length of the data to write.| +| **Return Value**| **Description**| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| Example: Write data to a UART device. - -``` +```c int32_t ret; uint8_t wbuff[5] = {1, 2, 3, 4, 5}; -/* Write 5-byte data to the UART device. */ -ret = UartWrite(handle, wbuff, 5); -if (ret != 0) { + +ret = UartWrite(handle, wbuff, 5); // Write data of the specified length to the UART device. +if (ret != HDF_SUCCESS) { HDF_LOGE("UartWrite: failed, ret %d\n", ret); + return ret; } ``` +#### Reading Data from a UART Device -### Reading Data from a UART Device - -Call **UartRead()** to read data of the specified length from a UART device. +Use **UartRead()** to read data of the specified length from a UART device. - -``` +```c int32_t UartRead(DevHandle handle, uint8_t *data, uint32_t size); ``` - **Table 9** Description of UartRead +**Table 9** Description of UartRead -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle.| -| data | Pointer to the buffer for receiving the data.| -| size | Length of the data to read.| -| **Return Value**| **Description**| -| Non-negative value| The operation is successful. The length of the data read is returned.| -| Negative value| The operation failed.| +| handle | UART device handle.| +| data | Pointer to the buffer for receiving the data.| +| size | Length of the data to read.| +| **Return Value**| **Description**| +| Non-negative value| The operation is successful. The length of the data read is returned.| +| Negative value| The operation fails.| Example: Read data of the specified length from a UART device. - -``` +```c int32_t ret; uint8_t rbuff[5] = {0}; -/* Read 5-byte data from the UART device. */ -ret = UartRead(handle, rbuff, 5); + +ret = UartRead(handle, rbuff, 5); // Read data of the specified length from the UART device. if (ret < 0) { HDF_LOGE("UartRead: failed, ret %d\n", ret); + return ret; } ``` @@ -330,94 +355,115 @@ if (ret < 0) { > Data is successfully read from the UART device if a non-negative value is returned. If **0** is returned, no valid data can be read from the UART device. A value greater than **0** indicates the length of the data read from the UART device. The data length must be less than or equal to the value of **size** and cannot exceed the maximum length of the data to read at a time specified by the UART controller in use. -### Closing a UART Device Handle +#### Closing a UART Device -Call **UartClose()** to close a UART device handle. +Use **UartClose()** to close a UART device. - -``` +```c void UartClose(DevHandle handle); ``` This function releases the resources requested by **UartOpen**. - **Table 10** Description of UartClose +**Table 10** Description of UartClose -| Parameter| Description| +| Parameter| Description| | -------- | -------- | -| handle | UART device handle to close.| +| handle | UART device handle to close.| -Example: Close a UART device handle. +Example: Close a UART device. - +```c +UartClose(handle); // Close a UART device to release resources. ``` -UartClose(handle); /* Close the UART device handle. */ -``` - ## Example - The following example shows how to open a UART device handle, set the baud rate, device attributes, and transmission mode, read data from or write data into the UART device, and then close the UART device handle. - -``` +The following uses the Hi3516D V300 development board as an example to describe how to manage the UART device. The procedure is as follows: + +1. Open a UART device based on the port number. The handle of the UART device opened is returned. +2. Set the baud rate of the UART device. +3. Obtain the baud rate of the UART device. +4. Set the attributes of the UART device. +5. Obtain the attributes of the UART device. +6. Set the transmission mode of the UART device. +7. Transfer data of the specified length. +8. Receive data of the specified length. +9. Closes the UART device. + +```c #include "hdf_log.h" #include "uart_if.h" void UartTestSample(void) { int32_t ret; - uint32_t port; + uint32_t port; + uint32_t baud; DevHandle handle = NULL; uint8_t wbuff[5] = { 1, 2, 3, 4, 5 }; uint8_t rbuff[5] = { 0 }; struct UartAttribute attribute; - attribute.dataBits = UART_ATTR_DATABIT_7; /* Enable 7 bits to be transferred each time. */ - attribute.parity = UART_ATTR_PARITY_NONE; /* Disable parity check. */ - attribute.stopBits = UART_ATTR_STOPBIT_1; /* Set the stop bit to 1. */ - attribute.rts = UART_ATTR_RTS_DIS; /* Disable the RTS signal. */ - attribute.cts = UART_ATTR_CTS_DIS; /* Disable the CTS signal. */ - attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN; /* Enable RX FIFO. */ - attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN; /* Enable TX FIFO. */ - /* Enter the UART port number. */ - port = 1; - /* Open the UART device handle based on the port number. */ - handle = UartOpen(port); + + attribute.dataBits = UART_ATTR_DATABIT_7; // Transfer 7 bits each time. + attribute.parity = UART_ATTR_PARITY_NONE; // Disable parity check. + attribute.stopBits = UART_ATTR_STOPBIT_1; // Set the stop bit to 1. + attribute.rts = UART_ATTR_RTS_DIS; // Disable RTS. + attribute.cts = UART_ATTR_CTS_DIS; // Disable CTS. + attribute.fifoRxEn = UART_ATTR_RX_FIFO_EN; // Enable RX FIFO. + attribute.fifoTxEn = UART_ATTR_TX_FIFO_EN; // Enable TX FIFO. + + port = 1; // UART device port number. + + handle = UartOpen(port); // Open a UART device. if (handle == NULL) { - HDF_LOGE("UartOpen: failed!\n"); + HDF_LOGE("UartOpen: open uart_%u failed!\n", port); return; } - /* Set the UART baud rate to 9600. */ - ret = UartSetBaud(handle, 9600); - if (ret != 0) { - HDF_LOGE("UartSetBaud: failed, ret %d\n", ret); - goto _ERR; + + ret = UartSetBaud(handle, 9600); // Set the UART baud rate to 9600. + if (ret != HDF_SUCCESS) { + HDF_LOGE("UartSetBaud: set baud failed, ret %d\n", ret); + goto ERR; } - /* Set UART device attributes. */ - ret = UartSetAttribute(handle, &attribute); - if (ret != 0) { - HDF_LOGE("UartSetAttribute: failed, ret %d\n", ret); - goto _ERR; + + ret = UartGetBaud(handle, &baud); // Obtain the UART baud rate. + if (ret != HDF_SUCCESS) { + HDF_LOGE("UartGetBaud: get baud failed, ret %d\n", ret); + goto ERR; + } + + ret = UartSetAttribute(handle, &attribute); // Set the attributes of the UART device. + if (ret != HDF_SUCCESS) { + HDF_LOGE("UartSetAttribute: set attribute failed, ret %d\n", ret); + goto ERR; + } + + ret = UartGetAttribute(handle, &attribute); // Obtain the attributes of the UART device. + if (ret != HDF_SUCCESS) { + HDF_LOGE("UartGetAttribute: get attribute failed, ret %d\n", ret); + goto ERR; } - /* Set the UART transmission mode to non-blocking mode. */ - ret = UartSetTransMode(handle, UART_MODE_RD_NONBLOCK); - if (ret != 0) { - HDF_LOGE("UartSetTransMode: failed, ret %d\n", ret); - goto _ERR; + + ret = UartSetTransMode(handle, UART_MODE_RD_NONBLOCK); // Set the UART transmission mode to non-block mode. + if (ret != HDF_SUCCESS) { + HDF_LOGE("UartSetTransMode: set trans mode failed, ret %d\n", ret); + goto ERR; } - /* Write 5-byte data to the UART device. */ - ret = UartWrite(handle, wbuff, 5); - if (ret != 0) { - HDF_LOGE("UartWrite: failed, ret %d\n", ret); - goto _ERR; + + ret = UartWrite(handle, wbuff, 5); // Write 5-byte data to the UART device. + if (ret != HDF_SUCCESS) { + HDF_LOGE("UartWrite: write data failed, ret %d\n", ret); + goto ERR; } - /* Read 5-byte data from the UART device. */ - ret = UartRead(handle, rbuff, 5); + + ret = UartRead(handle, rbuff, 5); // Read 5-byte data from the UART device. if (ret < 0) { - HDF_LOGE("UartRead: failed, ret %d\n", ret); - goto _ERR; + HDF_LOGE("UartRead: read data failed, ret %d\n", ret); + goto ERR; } -_ERR: - /* Close the UART device handle. */ - UartClose(handle); +ERR: + UartClose(handle); // Close the UART device. + return ret; } ``` diff --git a/en/device-dev/driver/driver-platform-uart-develop.md b/en/device-dev/driver/driver-platform-uart-develop.md index cf3393d015..eb08e87a54 100644 --- a/en/device-dev/driver/driver-platform-uart-develop.md +++ b/en/device-dev/driver/driver-platform-uart-develop.md @@ -1,256 +1,293 @@ # UART - ## Overview -In the Hardware Driver Foundation (HDF), the Universal Asynchronous Receiver/Transmitter (UART) uses the independent service mode for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. +### Function - **Figure 1** Independent service mode +The Universal Asynchronous Receiver/Transmitter (UART) is a universal serial data bus used for asynchronous communication. It enables bi-directional communication between devices in full-duplex mode. - ![image](figures/independent-service-mode.png) +A UART is connected to other modules through two wires (as shown in Figure 1) or four wires (as shown in Figure 2). + - TX: UART transmitter. It is connected to the RX of the peer UART. + - RX: UART receiver. It is connected to the TX of the peer UART. + - RTS: Request to Send signal, indicating whether the local UART is ready to receive data. It is connected to the CTS of the peer UART. + - CTS: Clear to Send signal, indicating whether the local UART is allowed to send data to the peer end. It is connected to the RTS of the peer UART. -## Available APIs +**Figure 1** Two-wire UART communication -**UartHostMethod**: +![image1](figures/2-wire-uart-communication.png "2-wire-uart-communication") +**Figure 2** Four-wire UART communication -``` + ![image2](figures/4-wire-uart-communication.png "4-wire-uart-communication") + +The UART transmitter and receiver must have the same settings on particular attributes, such as the baud rate and data format (start bit, data bits, parity bit, and stop bit) before they start to communicate. A UART sends data to the peer end over the TX and receives data from the peer end over the RX. When the size of the buffer used by a UART for storing received data reaches the preset threshold, the RTS signal of the UART changes to **1** (data cannot be received), and the peer UART stops sending data to it because its CTS signal does not allow it to send data. + +### Basic Concepts + +- Asynchronous communication + + In asynchronous communication, data is transmitted in frames of characters or bytes. Frames are sent and received one by one through the transmission line. The transmitter and receiver have their own clocks to control data sending and receiving. The two clock sources are independent and not synchronized with each other. + + When data is sent one character at a time, the time interval between two characters is not fixed, but the time interval between two adjacent bits in a character frame is fixed. + +- Full-duplex transmission + + A duplex communication mode allows data to be transmitted in both directions at the same time. A duplex communication channel is equivalent to two simplex communication channels operating in opposite directions at the same time. In full-duplex mode, signals can be transmitted bidirectionally at the same time. + +### Working Principles + +In the Hardware Driver Foundation (HDF), the UART uses the independent service mode (see Figure 3) for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. + +In the independent service mode, the core layer does not publish a service for the upper layer. Therefore, a service must be published for each controller. To achieve this purpose: + +- You need to implement the **Bind()** function in **HdfDriverEntry** to bind services. +- The **policy** field of **deviceNode** in the **device_info.hcs** file can be **1** or **2**, but not **0**. + +The UART module is divided into the following layers: + +- Interface layer: provides APIs for opening or closing a UART device, reading or writing data of the specified length, setting or obtaining the baud rate or attributes of a UART device, and setting the transmission mode. +- Core layer: provides the capabilities of adding or removing a UART controller, and managing UART devices. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. + +**Figure 3** Independent service mode + +![image3](figures/independent-service-mode.png) + +## Development Guidelines + +### When to Use + +The UART module is widely used to implement low-speed serial communication between devices, for example, output the printing information. It can also connect to a variety of external GPS and Bluetooth devices. Before using your UART devices with OpenHarmony, you need to perform UART driver adaptation. + +### Available APIs + +To enable the upper layer to successfully operate the PWM controller by calling the UART APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/uart/uart_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +**UartHostMethod**: + +```c struct UartHostMethod { - int32_t (*Init)(struct UartHost *host); - int32_t (*Deinit)(struct UartHost *host); - int32_t (*Read)(struct UartHost *host, uint8_t *data, uint32_t size); - int32_t (*Write)(struct UartHost *host, uint8_t *data, uint32_t size); - int32_t (*GetBaud)(struct UartHost *host, uint32_t *baudRate); - int32_t (*SetBaud)(struct UartHost *host, uint32_t baudRate); - int32_t (*GetAttribute)(struct UartHost *host, struct UartAttribute *attribute); - int32_t (*SetAttribute)(struct UartHost *host, struct UartAttribute *attribute); - int32_t (*SetTransMode)(struct UartHost *host, enum UartTransMode mode); - int32_t (*pollEvent)(struct UartHost *host, void *filep, void *table); + int32_t (*Init)(struct UartHost *host); + int32_t (*Deinit)(struct UartHost *host); + int32_t (*Read)(struct UartHost *host, uint8_t *data, uint32_t size); + int32_t (*Write)(struct UartHost *host, uint8_t *data, uint32_t size); + int32_t (*GetBaud)(struct UartHost *host, uint32_t *baudRate); + int32_t (*SetBaud)(struct UartHost *host, uint32_t baudRate); + int32_t (*GetAttribute)(struct UartHost *host, struct UartAttribute *attribute); + int32_t (*SetAttribute)(struct UartHost *host, struct UartAttribute *attribute); + int32_t (*SetTransMode)(struct UartHost *host, enum UartTransMode mode); + int32_t (*pollEvent)(struct UartHost *host, void *filep, void *table); }; ``` - **Table 1** Description of the callback functions in UartHostMethod +**Table 1** Hook functions in UartHostMethod | Function| Input Parameter| Output Parameter| Return Value| Description| | -------- | -------- | -------- | -------- | -------- | | Init | **host**: structure pointer to the UART controller at the core layer.| –| HDF_STATUS| Initializes a UART device.| | Deinit | **host**: structure pointer to the UART controller at the core layer.| –| HDF_STATUS| Deinitializes a UART device.| -| Read | **host**: structure pointer to the UART controller at the core layer.
    **size**: data size, which is of the uint32_t type.| **data**: pointer to the data read. The value is of the uint8_t type. | HDF_STATUS| Reads data.| -| Write | **host**: structure pointer to the UART controller at the core layer.
    **data**: pointer to the data to write. The value is of the uint8_t type.
    **size**: data size, which is of the uint32_t type. | –| HDF_STATUS| Writes data.| -| SetBaud | **host**: structure pointer to the UART controller at the core layer.
    **baudRate**: pointer to the baud rate to set. The value is of the uint32_t type. | –| HDF_STATUS| Sets the baud rate.| -| GetBaud | **host**: structure pointer to the UART controller at the core layer.| **baudRate**: pointer to the baud rate obtained. The value is of the uint32_t type. | HDF_STATUS| Obtains the current baud rate.| -| GetAttribute | **host**: structure pointer to the UART controller at the core layer.| **attribute**: structure pointer to the attribute obtained. For details, see **UartAttribute** in **uart_if.h**. | HDF_STATUS| Obtains UART attributes.| -| SetAttribute | **host**: structure pointer to the UART controller at the core layer.
    **attribute**: structure pointer to the attribute to set. | –| HDF_STATUS| Sets UART attributes.| -| SetTransMode | **host**: structure pointer to the UART controller at the core layer.
    **mode**: transfer mode to set. For details, see **UartTransMode** in **uart_if.h**.| –| HDF_STATUS| Sets the UART transfer mode.| -| PollEvent | **host**: structure pointer to the UART controller at the core layer.
    **filep**: void pointer to a file.
    **table**: void pointer to poll_table.| –| HDF_STATUS| Polls for pending events.| - +| Read | **host**: structure pointer to the UART controller at the core layer.
    **size**: size of the data to read, which is of the uint32_t type.| **data**: pointer to the data read, which is of the uint8_t type. | HDF_STATUS| Reads data.| +| Write | **host**: structure pointer to the UART controller at the core layer.
    **data**: pointer to the data to write, which is of the uint8_t type.
    **size**: size of the data to write, which is of the uint32_t type.| –| HDF_STATUS| Writes data.| +| SetBaud | **host**: structure pointer to the UART controller at the core layer.
    **baudRate**: baud rate to set, which is of the uint32_t type.| –| HDF_STATUS| Sets the baud rate.| +| GetBaud | **host**: structure pointer to the UART controller at the core layer.| **baudRate**: pointer to the baud rate obtained, which is of the uint32_t type.| HDF_STATUS| Obtains the baud rate.| +| GetAttribute | **host**: structure pointer to the UART controller at the core layer.| **attribute**: structure pointer to the attributes obtained. For details, see **UartAttribute** in **uart_if.h**.| HDF_STATUS| Obtains UART attributes.| +| SetAttribute | **host**: structure pointer to the UART controller at the core layer.
    **attribute**: structure pointer to the attributes to set.| –| HDF_STATUS| Sets UART attributes.| +| SetTransMode | **host**: structure pointer to the UART controller at the core layer.
    **mode**: transmission mode to set. For details, see **UartTransMode** in **uart_if.h**.| –| HDF_STATUS| Sets the UART transmission mode.| +| PollEvent | **host**: structure pointer to the UART controller at the core layer.
    **filep**: void pointer to a file.
    **table**: void pointer to the poll_table.| –| HDF_STATUS| Polls for the pending events.| -## How to Develop +### How to Develop -The UART module adaptation involves the following steps: +The UART module adaptation procedure is as follows: 1. Instantiate the driver entry. - - Instantiate the **HdfDriverEntry** structure. - - Call **HDF_INIT** to register the **HdfDriverEntry** instance with the HDF. - 2. Configure attribute files. - - Add the **deviceNode** information to the **device_info.hcs** file. - - (Optional) Add the **uart_config.hcs** file. - 3. Instantiate the UART controller object. - - Initialize **UartHost**. - - Instantiate **UartHostMethod** in the **UartHost** object. - > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE**
    - > For details about the functions in **UartHostMethod**, see [Available APIs](#available-apis). - 4. Debug the driver. - (Optional) For new drivers, verify the basic functions, such as the UART status control and response to interrupts. +### Example - -## Development Example - -The following uses **uart_hi35xx.c** as an example to present the information required for implementing device functions. +The following uses the **//device_soc_hisilicon/common/platform/uart/uart_hi35xx.c** driver of the Hi3516D V300 development board as an example to describe the UART driver adaptation. 1. Instantiate the driver entry. - The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. - - In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - - Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. + Generally, the HDF calls **Bind()** and then **Init()** to load a driver. If **Init()** fails to be called, the HDF calls **Release()** to release driver resources and exit. UART driver entry example: - - ``` + + ```c struct HdfDriverEntry g_hdfUartDevice = { .moduleVersion = 1, - .moduleName = "HDF_PLATFORM_UART", // (Mandatory) The value must be the same as that in the .hcs file. - .Bind = HdfUartDeviceBind, // See the Bind function. - .Init = HdfUartDeviceInit, // See the Init function. - .Release = HdfUartDeviceRelease, //See the Release function. + .moduleName = "HDF_PLATFORM_UART", // (Mandatory) The value must be the same as that of moduleName in the .hcs file. + .Bind = HdfUartDeviceBind, // See the Bind function. + .Init = HdfUartDeviceInit, // See the Init function. + .Release = HdfUartDeviceRelease, // See the Release function. }; - // Call HDF_INIT to register the driver entry with the HDF. - HDF_INIT(g_hdfUartDevice); + HDF_INIT(g_hdfUartDevice); // Call HDF_INIT to register the driver entry with the HDF. ``` -2. Add the **deviceNode** information to the **device_info.hcs** file and configure the device attributes in the **uart_config.hcs** file. - - The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the default values or value ranges of the **UartHost** members at the core layer. - - In this example, there is only one UART controller. If there are multiple UART controllers, you need to add the **deviceNode** information to the **device_info** file and add the corresponding device attributes to the **uart_config** file for each controller. - - - **device_info.hcs** configuration example: - - - ``` - root { - device_info { - match_attr = "hdf_manager"; - platform :: host { - hostName = "platform_host"; - priority = 50; - device_uart :: device { - device0 :: deviceNode { - policy = 1; // The driver publishes services only for kernel-mode processes. - priority = 40; // Driver startup priority. - permission = 0644; // Permission for the driver to create a device node. - moduleName = "HDF_PLATFORM_UART"; // Driver name, which must be the same as moduleName in the HdfDriverEntry structure. - serviceName = "HDF_PLATFORM_UART_0"; // Unique name of the service published by the driver. The name is in the HDF_PLATFORM_UART_X format. X indicates the UART controller number. - deviceMatchAttr = "hisilicon_hi35xx_uart_0"; // Keyword for matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. - } - device1 :: deviceNode { - policy = 2; // The driver publishes services for both kernel- and user-mode processes. - permission = 0644; - priority = 40; - moduleName = "HDF_PLATFORM_UART"; - serviceName = "HDF_PLATFORM_UART_1"; - deviceMatchAttr = "hisilicon_hi35xx_uart_1"; - } - ... - } - } - } - } - ``` - - - **uart_config.hcs** configuration example - - - ``` - root { - platform { - template uart_controller { // Template configuration. In the template, you can configure the common parameters shared by device nodes. - match_attr = ""; - num = 0; // (Mandatory) Device number. - baudrate = 115200; // (Mandatory) Baud rate. Set the value based on service requirements. - fifoRxEn = 1; // (Mandatory) Enable FIFOs to be received. - fifoTxEn = 1; // (Mandatory) Enable FIFOs to be transferred. - flags = 4; // (Mandatory) Flag signal. - regPbase = 0x120a0000; // (Mandatory) Used for address mapping. - interrupt = 38; // (Mandatory) Interrupt number. - iomemCount = 0x48; // (Mandatory) Used for address mapping. - } - controller_0x120a0000 :: uart_controller { - match_attr = "hisilicon_hi35xx_uart_0";// (Mandatory) The value must be the same as that of deviceMatchAttr of the corresponding device in device_info.hcs. - } - controller_0x120a1000 :: uart_controller { - num = 1; - baudrate = 9600; - regPbase = 0x120a1000; - interrupt = 39; - match_attr = "hisilicon_hi35xx_uart_1"; - } - ... - //(Optional) Add more controller data. The node information must have been added in the device_info.hcs file. - } - } - ``` - -3. Initialize the **UartHost** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init**, and **Release**) to instantiate **UartHostMethod** in **UartHost** (so that the underlying driver functions can be called). - - - Defining a custom structure - - To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **uart_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the device number, to the **UartHost** object at the core layer. +2. Configure attribute files. - + Add the deviceNode information to the **device_info.hcs** file. The deviceNode information is related to the driver entry registration. The following example uses two UART controllers as an example. If there are more UART controllers, add the deviceNode information to the **device_info.hcs** file for each controller. The device attribute values configured in **uart_config.hcs** are closely related to default values or value ranges of the **UartHost** members at the core layer. + + - **device_info.hcs** example: + + Add the deviceNode information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. + + ```c + root { + device_info { + match_attr = "hdf_manager"; + platform :: host { + hostName = "platform_host"; + priority = 50; + device_uart :: device { + device0 :: deviceNode { + policy = 1; // The value 1 means to publish services only to the kernel-mode processes. + priority = 40; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "HDF_PLATFORM_UART"; // Driver name, which must be the same as moduleName in the HdfDriverEntry structure. + serviceName = "HDF_PLATFORM_UART_0"; // Unique name of the service published by the driver. The name is in the HDF_PLATFORM_UART_X format. X indicates the UART controller number. + deviceMatchAttr = "hisilicon_hi35xx_uart_0";// Keyword for matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. + } + device1 :: deviceNode { + policy = 2; // The value 2 means to publish services for both kernel- and user-mode processes. + permission = 0644; + priority = 40; + moduleName = "HDF_PLATFORM_UART"; + serviceName = "HDF_PLATFORM_UART_1"; + deviceMatchAttr = "hisilicon_hi35xx_uart_1"; + } + ... + } + } + } + } + ``` + + - **uart_config.hcs** example + + Configure the device attributes in the **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/uart/uart_config.hcs** file. The parameters are as follows: + + ```c + root { + platform { + template uart_controller { // Template configuration. If the template is used to configure device node information, the default values in the template will be used for the fields that are not declared for the node. + match_attr = ""; + num = 0; // (Mandatory) Port number. + baudrate = 115200; // (Mandatory) Baud rate. + fifoRxEn = 1; // (Mandatory) Enable RX FIFO. + fifoTxEn = 1; // (Mandatory) Enable TX FIFO. + flags = 4; // (Mandatory) flag signal. + regPbase = 0x120a0000; // (Mandatory) Register physical base address used for address mapping. + interrupt = 38; // (Mandatory) Interrupt number. + iomemCount = 0x48; // (Mandatory) Used for address mapping. + } + controller_0x120a0000 :: uart_controller { + match_attr = "hisilicon_hi35xx_uart_0"; // (Mandatory) The value must be the same as that of deviceMatchAttr of the device in device_info.hcs. + } + controller_0x120a1000 :: uart_controller { + num = 1; + baudrate = 9600; + regPbase = 0x120a1000; + interrupt = 39; + match_attr = "hisilicon_hi35xx_uart_1"; + } + ... // Add node information for more UART devices. + } + } + ``` + + After the **uart_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. + + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/uart/uart_config.hcs" // Relative path of the file. ``` - struct UartPl011Port { // Interface structure - int32_t enable; - unsigned long physBase; // Physical address - uint32_t irqNum; // Interrupt number - uint32_t defaultBaudrate; // Default baud rate - uint32_t flags; // Flags related to the following three macros + +3. Instantiate the UART controller object. + + Initialize the **UartHost** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **UartHostMethod** in **UartHost** (so that the underlying driver functions can be called). + + - Define a custom structure. + + To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **uart_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the UART port number, to the object at the core layer. + + ```c + struct UartPl011Port { // Pin description structure customized. + int32_t enable; + unsigned long physBase; // Physical base address. + uint32_t irqNum; // IRQ number. + uint32_t defaultBaudrate; // Default baud rate. + uint32_t flags; // Flag signals related to the following three macros. #define PL011_FLG_IRQ_REQUESTED (1 << 0) #define PL011_FLG_DMA_RX_REQUESTED (1 << 1) #define PL011_FLG_DMA_TX_REQUESTED (1 << 2) - struct UartDmaTransfer *rxUdt; // DMA transfer - struct UartDriverData *udd; // The data structure is defined as follows: + struct UartDmaTransfer *rxUdt; // DMA transfer. + struct UartDriverData *udd; }; - struct UartDriverData { // Structure related to data transfer - uint32_t num; - uint32_t baudrate; // Baud rate (configurable) - struct UartAttribute attr; // Attributes, such as the data bit and stop bit, related to data transfer. - struct UartTransfer *rxTransfer; // Buffer (FIFO structure) - wait_queue_head_t wait; // Queuing signal related to conditional variables - int32_t count; // Data count - int32_t state; // UART controller state + struct UartDriverData { // Structure related to data transfer + uint32_t num; // Port number. + uint32_t baudrate; // Baud rate (configurable). + struct UartAttribute attr; // Attributes, such as the data bits and stop bit of the data to transfer. + struct UartTransfer *rxTransfer; // Buffer structure (FIFO structure) + wait_queue_head_t wait; // Queuing signal related to conditional variables + int32_t count; // Data count. + int32_t state; // UART controller state. #define UART_STATE_NOT_OPENED 0 #define UART_STATE_OPENING 1 #define UART_STATE_USEABLE 2 #define UART_STATE_SUSPENDED 3 - uint32_t flags; // Status flags + uint32_t flags; // Status flags. #define UART_FLG_DMA_RX (1 << 0) #define UART_FLG_DMA_TX (1 << 1) #define UART_FLG_RD_BLOCK (1 << 2) - RecvNotify recv; // Pointer to the function that receives serial port data. - struct UartOps *ops; // Custom function pointer structure. For details, see device/hisilicon/drivers/uart/uart_pl011.c. - void *private; // It stores the pointer to the start address of UartPl011Port for easy invocation. + RecvNotify recv; // Pointer to the function that receives serial port data. + struct UartOps *ops; // Custom function pointer structure. + void *private; // Private data. }; // UartHost is the controller structure at the core layer. The Init function assigns values to the members of UartHost. struct UartHost { - struct IDeviceIoService service; - struct HdfDeviceObject *device; - uint32_t num; - OsalAtomic atom; - void *priv; // It stores the pointer to the start address of the vendor's custom structure for easy invocation. - struct UartHostMethod *method; // Hook at the core layer. You need to implement and instantiate its member functions. + struct IDeviceIoService service; // Driver service. + struct HdfDeviceObject *device; // Driver device object. + uint32_t num; // Port number. + OsalAtomic atom; // Atomic quantity. + void *priv; // Private data. + struct UartHostMethod *method; // Callback functions. }; ``` - - Instantiating **UartHostMethod** in **UartHost** (other members are initialized by **Bind**) + - Instantiate **UartHostMethod** in **UartHost**. - - ``` - // Example in uart_hi35xx.c: instantiate the hook. + ```c + // Instantiate the hook functions in uart_hi35xx.c. struct UartHostMethod g_uartHostMethod = { - .Init = Hi35xxInit, - .Deinit = Hi35xxDeinit, - .Read = Hi35xxRead, - .Write = Hi35xxWrite, - .SetBaud = Hi35xxSetBaud, - .GetBaud = Hi35xxGetBaud, - .SetAttribute = Hi35xxSetAttribute, - .GetAttribute = Hi35xxGetAttribute, - .SetTransMode = Hi35xxSetTransMode, - .pollEvent = Hi35xxPollEvent, + .Init = Hi35xxInit, // Initialize the device. + .Deinit = Hi35xxDeinit, // Deinitialize the device. + .Read = Hi35xxRead, // Receive data. + .Write = Hi35xxWrite, // Write data. + .SetBaud = Hi35xxSetBaud, // Set the baud rate. + .GetBaud = Hi35xxGetBaud, // Obtain the baud rate. + .SetAttribute = Hi35xxSetAttribute, // Set device attributes. + .GetAttribute = Hi35xxGetAttribute, //Obtain device attributes. + .SetTransMode = Hi35xxSetTransMode, // Set the transmission mode. + .pollEvent = Hi35xxPollEvent, // Polling for pending events. }; ``` - - **Bind** function + - Implement the **Bind** function. - **Input parameter**: + Input parameter: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. - **Return value**: + Return value: - **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **/drivers/framework/include/utils/hdf_base.h** file. + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. + + **Table 2** HDF_STATUS - **Table 2** Description of HDF_STATUS - | Status| Description| | -------- | -------- | | HDF_ERR_INVALID_OBJECT | Invalid controller object.| @@ -260,89 +297,85 @@ The following uses **uart_hi35xx.c** as an example to present the information re | HDF_SUCCESS | Initialization successful.| | HDF_FAILURE | Initialization failed.| - **Function description**: + Function description: Initializes the custom structure object and **UartHost**. - - ``` + ```c //uart_hi35xx.c static int32_t HdfUartDeviceBind(struct HdfDeviceObject *device) { ... - return (UartHostCreate(device) == NULL)? HDF_FAILURE: HDF_SUCCESS;// (Mandatory) Call UartHostCreate. + return (UartHostCreate(device) == NULL) ? HDF_FAILURE : HDF_SUCCESS; // (Mandatory) Call UartHostCreate. } + // Description of UartHostCreate() in uart_core.c struct UartHost *UartHostCreate(struct HdfDeviceObject *device) { - struct UartHost *host = NULL; // Create UartHost. - ... - host = (struct UartHost *)OsalMemCalloc(sizeof(*host));// Allocate memory. + struct UartHost *host = NULL // Create UartHost. + ... + host = (struct UartHost *)OsalMemCalloc(sizeof(*host)); // Allocate memory. ... - host->device = device; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and UartHost. - device->service = &(host->service; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and UartHost. - host->device->service->Dispatch = UartIoDispatch; // Assign values to Dispatch of service. - OsalAtomicSet(&host->atom, 0); // Initialize or set the atomic services. + host->device = device; // (Mandatory) Prerequisites for conversion between HdfDeviceObject and UartHost. + device->service = &(host->service); // (Mandatory) Prerequisites for conversion between HdfDeviceObject and UartHost. + host->device->service->Dispatch = UartIoDispatch; // Assign values to Dispatch() of service. + OsalAtomicSet(&host->atom, 0); // Initialize or set the atomic service. host->priv = NULL; host->method = NULL; return host; } ``` - - **Init** function + - Implement the **Init** function. - **Input parameter**: + Input parameter: - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. - **Return value**: + Return value: - **HDF_STATUS** + HDF_STATUS - **Function description**: + Function description: - Initializes the custom structure object and **UartHost**, calls the **artAddDev** function at the core layer, and connects to the VFS. + Initialize the custom structure and **UartHost**, calls **UartAddDev()** at the core layer to add the UART controller, and accesses the VFS. - - ``` + ```c int32_t HdfUartDeviceInit(struct HdfDeviceObject *device) { int32_t ret; struct UartHost *host = NULL; HDF_LOGI("%s: entry", __func__); ... - host = UartHostFromDevice(device);// Forcibly convert to UartHost by using service. The values are assigned by Bind(). - ... - ret = Hi35xxAttach(host, device); // Initialize the UartHost object. - ... - host->method = &g_uartHostMethod; // Attach the UartHostMethod instance. + host = UartHostFromDevice(device); // Forcibly convert to UartHost by using service. The values are assigned by Bind(). + ... + ret = Hi35xxAttach(host, device); // Initialize the UartHost object. + ... + host->method = &g_uartHostMethod; // Attach the UartHostMethod instance. return ret; } // Initialize UartHost. static int32_t Hi35xxAttach(struct UartHost *host, struct HdfDeviceObject *device) { int32_t ret; - // udd and port are customized structure objects. Implement the related functions as required. - struct UartDriverData *udd = NULL; + struct UartDriverData *udd = NULL; // udd and port are custom structure objects. You can implement features as required. struct UartPl011Port *port = NULL; ... - // Steps 1 to 7 instantiate and assign values to the udd object, and then assign values to UartHost. - udd = (struct UartDriverData *)OsalMemCalloc(sizeof(*udd));// Step 1 + // Steps 1 to 7 assign values to the udd object and then UartHost. + udd = (struct UartDriverData *)OsalMemCalloc(sizeof(*udd)); // Step 1 ... - port = (struct UartPl011Port *)OsalMemCalloc(sizeof(struct UartPl011Port));// Step 2 + port = (struct UartPl011Port *)OsalMemCalloc(sizeof(struct UartPl011Port)); // Step 2 ... - udd->ops = Pl011GetOps(); // Step 3 Hook the functions for starting or stopping a device, setting attributes, and sending data. - udd->recv = PL011UartRecvNotify;// Step 4 Hook the data receiving notification function (conditional lock mechanism). - udd->count = 0; // Step 5 - port->udd = udd; // Step 6 Enable conversion between UartPl011Port and UartDriverData. - ret = UartGetConfigFromHcs(port, device->property);// Pass the attributes of HdfDeviceObject to the custom structure. - // The sample code is as follows: + udd->ops = Pl011GetOps(); // Step 3 Hook the functions for opening or closing a device, setting device attributes, and sending data. + udd->recv = PL011UartRecvNotify; // Step 4 Hook the data receiving notification function (conditional lock mechanism). + udd->count = 0; // Step 5. + port->udd = udd; // Step 6 Prerequisites for conversion between UartPl011Port and UartDriverData. + ret = UartGetConfigFromHcs(port, device->property); // Pass the attributes of HdfDeviceObject to the custom structure to perform related operations. The sample code is as follows: ... - udd->private = port; // Step 7 - - host->priv = udd; // (Mandatory) Enable conversion between UartHost and UartDriverData. - host->num = udd->num; // (Mandatory) UART device number - UartAddDev(host); // (Mandatory) Function (in uart_dev.c) used to register a character device node to the VFS so that the UART can be accessed through the virtual file node in user mode. + udd->private = port; // Step 7 + host->priv = udd; // (Mandatory) Prerequisites for conversion between UartHost and UartDriverData. + host->num = udd->num; // (Mandatory) UART device number. + UartAddDev(host); // (Mandatory) Function in uart_dev.c at the core layer used to register a character device node to the VFS so that the UART can be accessed through the virtual file node in user mode. return HDF_SUCCESS; } @@ -352,7 +385,7 @@ The following uses **uart_hi35xx.c** as an example to present the information re struct UartDriverData *udd = port->udd; struct DeviceResourceIface *iface = DeviceResourceGetIfaceInstance(HDF_CONFIG_SOURCE); ... - // Extract the values based on the request and assign the values to the custom structure. + // Extract the values based on the request and assign the values to the custom structures. if (iface->GetUint32(node, "num", &udd->num, 0) != HDF_SUCCESS) { HDF_LOGE("%s: read busNum fail", __func__); return HDF_FAILURE; @@ -361,36 +394,35 @@ The following uses **uart_hi35xx.c** as an example to present the information re return 0; } ``` - - **Release** function - **Input parameter**: + - Implement the **Release** function. - **HdfDeviceObject**, an interface parameter exposed by the driver, contains the .hcs information. + Input parameter: - **Return value**: + **HdfDeviceObject**, a device object created by the HDF for each driver, holds device-related private data and service APIs. + + Return value: No value is returned. - **Function description**: + Function description: - Releases the memory and deletes the controller. This function assigns values to the **Release** API in the driver entry structure. When the HDF fails to call the **Init** function to initialize the driver, the **Release** function can be called to release driver resources. + Releases the memory and deletes the controller. This function assigns values to **Release()** in the driver entry structure. When the HDF fails to call **Init()** to initialize the driver, **Release()** is called to release driver resources. > ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** - > > All forced conversion operations for obtaining the corresponding object can be successful only when **Init()** has the corresponding value assignment operations. - - ``` + ```c void HdfUartDeviceRelease(struct HdfDeviceObject *device) { struct UartHost *host = NULL; ... - host = UartHostFromDevice(device); // Forcibly convert HdfDeviceObject to UartHost by using service. For details about the value assignment, see the Bind function. - ... - if (host->priv != NULL) { - Hi35xxDetach(host); // Customized memory release function. - } - UartHostDestroy(host); // Call the function of the core layer to release the host. + host = UartHostFromDevice(device); // Forcible conversion from HdfDeviceObject to UartHost through the service member. For details about the value assignment, see the Bind function. + ... + if (host->priv != NULL) { + Hi35xxDetach(host); // Customized memory release function. For details, see the following. + } + UartHostDestroy(host); // Call the core layer function to release the host. } static void Hi35xxDetach(struct UartHost *host) @@ -398,13 +430,13 @@ The following uses **uart_hi35xx.c** as an example to present the information re struct UartDriverData *udd = NULL; struct UartPl011Port *port = NULL; ... - udd = host->priv; // The conversion from UartHost to UartDriverData is involved. - ... - UartRemoveDev (host); // Remove the VFS. - port = udd->private; // The conversion from UartDriverData to UartPl011Port is involved. - if (port != NULL) { - if (port->physBase != 0) { - OsalIoUnmap((void *)port->physBase);// Unmap addresses. + udd = host->priv; // The conversion from UartHost to UartDriverData is involved. + ... + UartRemoveDev (host); // Remove the VFS. + port = udd->private; // The conversion from UartDriverData to UartPl011Port is involved. + if (port != NULL) { + if (port->physBase != 0) { + OsalIoUnmap((void *)port->physBase); // Unmap addresses. } OsalMemFree(port); udd->private = NULL; @@ -413,3 +445,7 @@ The following uses **uart_hi35xx.c** as an example to present the information re host->priv = NULL; } ``` + +4. Debug the driver. + + (Optional) For new drivers, verify basic functions, for example, check the information returned after the driver is attached and whether data is successfully transmitted. diff --git a/en/device-dev/driver/driver-platform-watchdog-des.md b/en/device-dev/driver/driver-platform-watchdog-des.md index aa00d54869..5482f8542d 100644 --- a/en/device-dev/driver/driver-platform-watchdog-des.md +++ b/en/device-dev/driver/driver-platform-watchdog-des.md @@ -1,49 +1,83 @@ # Watchdog +## Overview -## **Overview** +### Function -A watchdog, also called a watchdog timer, is a hardware timing device used to facilitate automatic correction of temporary hardware faults or recover from system malfunctions. If an error occurs in the main program of the system and the watchdog timer is not cleared in time, the watchdog timer sends a reset signal to restore the system to the normal state. +A watchdog, also called a watchdog timer, is a hardware timing device used to facilitate automatic correction of temporary hardware faults or recover from system malfunctions. Generally, it has an input to feed the watchdog and an output to the reset pin of the system. If an error occurs in the main program of the system and the watchdog timer is not cleared in time, the watchdog timer sends a reset signal to restore the system to the normal state. +The watchdog module provides APIs for watchdog operations, including: -## Available APIs +- Opening or closing a watchdog +- Starting or stopping a watchdog +- Setting or obtaining the watchdog timeout period +- Obtaining the watchdog status +- Feeding a watchdog -**Table 1** Watchdog APIs +### Basic Concepts -| API| Description| -| -------- | -------- | -| WatchdogOpen | Opens a watchdog.| -| WatchdogClose | Closes a watchdog.| -| WatchdogStart | Starts a watchdog.| -| WatchdogStop | Stops a watchdog.| -| WatchdogSetTimeout | Sets the watchdog timeout duration.| -| WatchdogGetTimeout | Obtains the watchdog timeout duration.| -| WatchdogGetStatus | Obtains the watchdog status.| -| WatchdogFeed | Feeds a watchdog or resets a watchdog timer.| - -> ![](../public_sys-resources/icon-note.gif) **NOTE** -> -> All watchdog APIs provided in this document can be called only in kernel mode. +When the system works properly, a signal is output to the watchdog to prevent it from timing out. This operation is called watchdog feeding. If the watchdog is not fed within the specified time, the watchdog times out and a reset signal is sent to the system to reset the system. + +### Working Principles + +In the Hardware Driver Foundation (HDF), the PWM uses the independent service mode (see Figure 1) for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. + +In the independent service mode, the core layer does not publish a service for the upper layer. Therefore, a service must be published for each controller. To achieve this purpose: + +- You need to implement the **Bind()** function in **HdfDriverEntry** to bind services. +- The **policy** field of **deviceNode** in the **device_info.hcs** file can be **1** or **2**, but not **0**. + +The watchdog module is divided into the following layers: + +- Interface layer: provides APIs for opening or closing a watchdog, starting or stopping a watchdog, setting or obtaining the watchdog timeout period, and feeding a watchdog +- Core layer: provides the capabilities of adding or removing a watchdog controller and managing watchdog devices. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. + +**Figure 1** Independent service mode +![image1](figures/independent-service-mode.png "Watchdog independent service mode") ## Usage Guidelines +### When to Use -### How to Use +Watchdogs are used to automatically detect the software exceptions that cannot be directly observed and reset the system when an exception is detected. -The figure below shows how to use the watchdog APIs. +### Available APIs -Figure 1 Using watchdog APIs +The following table describes the APIs provided by the watchdog module. -![image](figures/using-watchdog-process.png) +**Table 1** Watchdog APIs +| API| Description| +| -------- | -------- | +| int32_t WatchdogOpen(int16_t wdtId, DevHandle *handle) | Opens a watchdog.| +| void WatchdogClose(DevHandle handle) | Closes a watchdog.| +| int32_t WatchdogStart(DevHandle handle) | Starts a watchdog.| +| int32_t WatchdogStop(DevHandle handle) | Stops a watchdog.| +| int32_t WatchdogSetTimeout(DevHandle handle, uint32_t seconds) | Sets the watchdog timeout duration.| +| int32_t WatchdogGetTimeout(DevHandle handle, uint32_t *seconds) | Obtains the watchdog timeout duration.| +| int32_t WatchdogGetStatus(DevHandle handle, int32_t *status) | Obtains the watchdog status.| +| int32_t WatchdogFeed(DevHandle handle) | Feeds a watchdog or resets a watchdog timer.| + +> ![icon-note.gif](public_sys-resources/icon-note.gif) **NOTE** +> +> All watchdog APIs described in this document can be used in kernel mode and user mode. -### Opening a Watchdog +### How to Develop -Use **WatchdogOpen()** to open a watchdog. A system may have multiple watchdogs. You need to specify the ID of the watchdog to open. +The following figure shows how to use the watchdog driver APIs. -``` -DevHandle WatchdogOpen(int16_t wdtId); +**Figure 2** Using watchdog driver APIs + +![image2](figures/using-watchdog-process.png) + +#### Opening a Watchdog + +Before operating a watchdog, you need to use **WatchdogOpen()** to open a watchdog. A system may have multiple watchdogs. You need to specify the ID of the watchdog to open. + +```c +DevHandle WatchdogOpen(int16_t wdtId, DevHandle *handle); ``` **Table 2** Description of WatchdogOpen @@ -51,24 +85,26 @@ DevHandle WatchdogOpen(int16_t wdtId); | **Parameter**| **Description**| | -------- | -------- | | wdtId | Watchdog ID.| +| handle | Pointer to the watchdog device handle obtained.| | **Return Value**| **Description**| -| NULL | The operation failed.| -| **DevHandle** pointer| The operation is successful. The pointer to the watchdog device handle is returned.| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| +```c +int16_t wdtId = 0; +int32_t ret; +DevHandle *handle = NULL; -``` -DevHandle handle = NULL; -handle = WatchdogOpen(0); /* Open watchdog 0.*/ -if (handle == NULL) { - HDF_LOGE("WatchdogOpen: failed, ret %d\n", ret); - return; +ret = WatchdogOpen(wdtId, handle); // Open watchdog 0. +if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogOpen: open watchdog_%hd failed, ret:%d\n", wdtId, ret); + return ret; } ``` +#### Obtaining the Watchdog Status -### Obtaining the Watchdog Status - -``` +```c int32_t WatchdogGetStatus(DevHandle handle, int32_t *status); ``` @@ -79,25 +115,24 @@ int32_t WatchdogGetStatus(DevHandle handle, int32_t *status); | handle | Watchdog device handle.| | status | Pointer to the watchdog status obtained.| | **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| - -``` +```c int32_t ret; int32_t status; -/* Obtain the watchdog status. */ -ret = WatchdogGetStatus(handle, &status); -if (ret != 0) { - HDF_LOGE("WatchdogGetStatus: failed, ret %d\n", ret); - return; + +ret = WatchdogGetStatus(handle, &status); // Obtain the watchdog status. +if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogGetStatus: watchdog get status failed, ret:%d\n", ret); + return ret; } ``` +#### Setting the Timeout Duration -### Setting the Timeout Duration -``` +```c int32_t WatchdogSetTimeout(DevHandle *handle, uint32_t seconds); ``` @@ -108,25 +143,22 @@ int32_t WatchdogSetTimeout(DevHandle *handle, uint32_t seconds); | handle | Pointer to the watchdog device handle.| | seconds | Timeout duration to set, in seconds.| | **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| - +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| -``` +```c int32_t ret; -uint32_t timeOut = 60; -/* Set the timeout duration to 60 seconds. */ -ret = WatchdogSetTimeout(handle, timeOut); -if (ret != 0) { - HDF_LOGE("WatchdogSetTimeout: failed, ret %d\n", ret); - return; + +ret = WatchdogSetTimeout(handle, 2); // Set the timeout duration to 2 seconds. +if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogSetTimeout: watchdog set timeOut failed, ret:%d\n", ret); + return ret; } ``` +#### Obtaining the Timeout Duration -### Obtaining the Timeout Duration - -``` +```c int32_t WatchdogGetTimeout(DevHandle *handle, uint32_t *seconds); ``` @@ -135,27 +167,25 @@ int32_t WatchdogGetTimeout(DevHandle *handle, uint32_t *seconds); | **Parameter**| **Description**| | -------- | -------- | | handle | Pointer to the watchdog device handle.| -| seconds | Pointer to the timeout duration, in seconds.| +| seconds | Pointer to the watchdog timeout duration obtained.| | **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| +```c + int32_t ret; + uint32_t timeOut; -``` -int32_t ret; -uint32_t timeOut; -/* Obtain the timeout duration, in seconds. */ -ret = WatchdogGetTimeout(handle, &timeOut); -if (ret != 0) { - HDF_LOGE("WatchdogGetTimeout: failed, ret %d\n", ret); - return; -} + ret = WatchdogGetTimeout(handle, &timeOut); // Obtain the watchdog timeout duration. + if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogGetTimeout: watchdog get timeOut failed, ret:%d\n", ret); + return ret; + } ``` +#### Starting a Watchdog -### Starting a Watchdog - -``` +```c int32_t WatchdogStart(DevHandle handle); ``` @@ -165,24 +195,22 @@ int32_t WatchdogStart(DevHandle handle); | -------- | -------- | | handle | Watchdog device handle.| | **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| - +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| -``` +```c int32_t ret; -/* Start the watchdog. */ -ret = WatchdogStart(handle); -if (ret != 0) { - HDF_LOGE("WatchdogStart: failed, ret %d\n", ret); - return; + +ret = WatchdogStart(handle); // Start a watchdog. +if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogStart: start watchdog failed, ret:%d\n", ret); + return ret; } ``` +#### Feeding a Watchdog -### Feeding a Watchdog - -``` +```c int32_t WatchdogFeed(DevHandle handle); ``` @@ -192,24 +220,22 @@ int32_t WatchdogFeed(DevHandle handle); | -------- | -------- | | handle | Watchdog device handle.| | **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| - +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| -``` +```c int32_t ret; -/* Feed the watchdog. */ -ret = WatchdogFeed(handle); -if (ret != 0) { - HDF_LOGE("WatchdogFeed: failed, ret %d\n", ret); - return; + +ret = WatchdogFeed (handle); // Feed a watchdog. +if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogFeed: feed watchdog failed, ret:%d\n", ret); + return ret; } ``` +#### Stopping a Watchdog -### Stopping a Watchdog - -``` +```c int32_t WatchdogStop(DevHandle handle); ``` @@ -219,26 +245,24 @@ int32_t WatchdogStop(DevHandle handle); | -------- | -------- | | handle | Watchdog device handle.| | **Return Value**| **Description**| -| 0 | The operation is successful.| -| Negative value| The operation failed.| - +| HDF_SUCCESS | The operation is successful.| +| Negative value| The operation fails.| -``` +```c int32_t ret; -/* Stop the watchdog. */ -ret = WatchdogStop(handle); -if (ret != 0) { - HDF_LOGE("WatchdogStop: failed, ret %d\n", ret); - return; + +ret = WatchdogStop(handle); // Stop a watchdog. +if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogStop: stop watchdog failed, ret:%d\n", ret); + return ret; } ``` +#### Closing a Watchdog -### Closing a Watchdog +After all operations are complete, use **WatchdogClose()** to close the watchdog. -If a watchdog is no longer required, call **WatchdogClose()** to close it. - -``` +```c void WatchdogClose(DevHandle handle); ``` @@ -248,29 +272,26 @@ void WatchdogClose(DevHandle handle); | -------- | -------- | | handle | Watchdog device handle.| - +```c +WatchdogClose(handle); // Close a watchdog. ``` -/* Close the watchdog. */ -ret = WatchdogClose(handle); -``` - ## Example -The following example provides the complete development process. +The following uses the Hi3516D V300 development board as an example to describe how to operate the watchdog. The procedure is as follows: -1. Open a watchdog, set the timeout duration, and start the watchdog. +1. Open a watchdog. You need to pass in the watchdog ID. The device handle of the watchdog opened is returned. +2. Set the timeout duration for the watchdog. +3. Obtain the timeout duration of the watchdog. +4. Start the watchdog. +5. Feed the watchdog. +6. Stop the watchdog. +7. Close the watchdog. -2. Feed the watchdog periodically to ensure that the system is not reset due to timer expiry. -3. Stop feeding the watchdog and check whether the system is reset after the timer expires. - -Sample code: - -``` -#include "watchdog_if.h" -#include "hdf_log.h" -#include "osal_irq.h" -#include "osal_time.h" +```c +#include "watchdog_if.h" /* Header file of the standard watchdog APIs. */ +#include "hdf_log.h" /* Header file of the HDF log APIs. */ +#include "osal_time.h" /* Header file of the delay and sleep APIs. */ #define WATCHDOG_TEST_TIMEOUT 2 #define WATCHDOG_TEST_FEED_TIME 6 @@ -279,14 +300,16 @@ static int32_t TestCaseWatchdog(void) { int32_t i; int32_t ret; + int16_t wdtId = 0; + int32_t status; uint32_t timeout; - DevHandle handle = NULL; + DevHandle *handle = NULL; /* Open watchdog 0. */ - handle = WatchdogOpen(0); - if (handle == NULL) { - HDF_LOGE("Open watchdog failed!"); - return -1; + ret = WatchdogOpen(wdtId, handle); + if (ret != HDF_SUCCESS) { + HDF_LOGE("WatchdogOpen: open watchdog_%hd failed, ret:%d\n", wdtId, ret); + return ret; } /* Set the timeout duration. */ @@ -297,13 +320,19 @@ static int32_t TestCaseWatchdog(void) return ret; } - /* Obtain the timeout duration. */ + /* Obtain the timeout duration. */ ret = WatchdogGetTimeout(handle, &timeout); if (ret != HDF_SUCCESS) { HDF_LOGE("%s: get timeout fail! ret:%d\n", __func__, ret); WatchdogClose(handle); return ret; } + /* Check whether the timeout duration obtained is the same as the timeout duration set. */ + if (timeout != WATCHDOG_TEST_TIMEOUT) { + HDF_LOGE("%s: set:%u, but get:%u", __func__, WATCHDOG_TEST_TIMEOUT, timeout); + WatchdogClose(handle); + return HDF_FAILURE; + } HDF_LOGI("%s: read timeout back:%u\n", __func__, timeout); /* Start the watchdog. The timer starts. */ @@ -313,6 +342,19 @@ static int32_t TestCaseWatchdog(void) WatchdogClose(handle); return ret; } + /* Obtain the watchdog status and determine whether to start the watchdog. */ + status = WATCHDOG_STOP; + ret = WatchdogGetStatus(handle, &status); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get status fail! ret:%d", __func__, ret); + WatchdogClose(handle); + return ret; + } + if (status != WATCHDOG_START) { + HDF_LOGE("%s: status is:%d after start", __func__, status); + WatchdogClose(handle); + return HDF_FAILURE; + } /* Feed the watchdog every other second. */ for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) { @@ -328,15 +370,26 @@ static int32_t TestCaseWatchdog(void) /* Because the interval for feeding the watchdog is shorter than the timeout duration, the system does not reset, and logs can be printed normally. */ HDF_LOGI("%s: no reset ... feeding test OK!!!\n", __func__); - /* Stop feeding the watchdog to make the timer expire. */ - for (i = 0; i < WATCHDOG_TEST_FEED_TIME; i++) { - HDF_LOGI("%s: waiting dog buck %d times... \n", __func__, i); - OsalSleep(1); + ret = WatchdogStop(handle); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: stop fail! ret:%d", __func__, ret); + WatchdogClose(handle); + return ret; + } + /* Obtain the watchdog status and determine whether to close the watchdog. */ + status = WATCHDOG_START; + ret = WatchdogGetStatus(handle, &status); + if (ret != HDF_SUCCESS) { + HDF_LOGE("%s: get status fail! ret:%d", __func__, ret); + WatchdogClose(handle); + return ret; + } + if (status != WATCHDOG_STOP) { + HDF_LOGE("%s: status is:%d after stop", __func__, status); + WatchdogClose(handle); + return HDF_FAILURE; } - - /* The system resets when the timer expires. Theoretically, this log is not displayed. */ - HDF_LOGI("%s: dog hasn't back!!! \n", __func__, i); WatchdogClose(handle); - return -1; + return HDF_SUCCESS; } ``` diff --git a/en/device-dev/driver/driver-platform-watchdog-develop.md b/en/device-dev/driver/driver-platform-watchdog-develop.md index 67095216d8..72691eb5d0 100644 --- a/en/device-dev/driver/driver-platform-watchdog-develop.md +++ b/en/device-dev/driver/driver-platform-watchdog-develop.md @@ -1,187 +1,198 @@ # Watchdog - ## Overview -A watchdog, also called a watchdog timer, is a hardware timing device used to facilitate automatic correction of temporary hardware faults or recover from system malfunctions. +### Function -In the Hardware Driver Foundation (HDF), the watchdog uses the independent service mode for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. +A watchdog, also called a watchdog timer, is a hardware timing device used to facilitate automatic correction of temporary hardware faults or recover from system malfunctions. Generally, it has an input to feed the watchdog and an output to the reset pin of the system. If an error occurs in the main program of the system and the watchdog timer is not cleared in time, the watchdog timer sends a reset signal to restore the system to the normal state. - **Figure 1** Independent service mode +### Basic Concepts - ![image](figures/independent-service-mode.png "Watchdog independent service mode") +When the system works properly, a signal is output to the watchdog to prevent it from timing out. This operation is called watchdog feeding. If the watchdog is not fed within the specified time, the watchdog times out and a reset signal is sent to the system to reset the system. +### Working Principles -## Available APIs +In the Hardware Driver Foundation (HDF), the watchdog module uses the independent service mode (see Figure 1) for API adaptation. In this mode, each device independently publishes a service to process external access requests. When receiving an access request, the HDF DeviceManager extracts parameters from the request to call the internal APIs of the target device. In the independent service mode, the HDF DeviceManager provides service management capabilities. However, you need to configure a node for each device, which increases memory usage. -**WatchdogMethod**: +In the independent service mode, the core layer does not publish a service for the upper layer. Therefore, a service must be published for each controller. To achieve this purpose: +- You need to implement the **Bind()** function in **HdfDriverEntry** to bind services. +- The **policy** field of **deviceNode** in the **device_info.hcs** file can be **1** or **2**, but not **0**. -``` +The watchdog module is divided into the following layers: + +- Interface layer: provides APIs for opening or closing a watchdog, starting or stopping a watchdog, setting or obtaining the watchdog timeout period, and feeding a watchdog +- Core layer: provides the capabilities of adding or removing a watchdog controller and managing watchdog devices. The core layer interacts with the adaptation layer through hook functions. +- Adaptation layer: instantiates the hook functions to implement specific features. + +**Figure 1** Independent service mode + +![image](figures/independent-service-mode.png "Watchdog independent service mode") + +## Development Guidelines + +### When to Use + +Watchdogs are used to automatically detect the software exceptions that cannot be directly observed and reset the system when an exception is detected. Before using your watchdogs with OpenHarmony, you need to perform watchdog driver adaptation. The following describes how to do it. + +### **Available APIs** + +To enable the upper layer to successfully operate the watchdog controller by calling the watchdog APIs, hook functions are defined in **//drivers/hdf_core/framework/support/platform/include/watchdog/watchdog_core.h** for the core layer. You need to implement these hook functions at the adaptation layer and hook them to implement the interaction between the interface layer and the core layer. + +**WatchdogMethod**: + +```c struct WatchdogMethod { - int32_t (*getStatus)(struct WatchdogCntlr *wdt, int32_t *status); - int32_t (*setTimeout)(struct WatchdogCntlr *wdt, uint32_t seconds); - int32_t (*getTimeout)(struct WatchdogCntlr *wdt, uint32_t *seconds); - int32_t (*start)(struct WatchdogCntlr *wdt); - int32_t (*stop)(struct WatchdogCntlr *wdt); - int32_t (*feed)(struct WatchdogCntlr *wdt); - int32_t (*getPriv)(struct WatchdogCntlr *wdt); // (Optional) If WatchdogCntlr has the priv member, instantiate priv. - void (*releasePriv)(struct WatchdogCntlr *wdt);// (Optional) + int32_t (*getStatus)(struct WatchdogCntlr *wdt, int32_t *status); + int32_t (*setTimeout)(struct WatchdogCntlr *wdt, uint32_t seconds); + int32_t (*getTimeout)(struct WatchdogCntlr *wdt, uint32_t *seconds); + int32_t (*start)(struct WatchdogCntlr *wdt); + int32_t (*stop)(struct WatchdogCntlr *wdt); + int32_t (*feed)(struct WatchdogCntlr *wdt); + int32_t (*getPriv)(struct WatchdogCntlr *wdt); // (Optional) If WatchdogCntlr has the priv member, instantiate priv. + void (*releasePriv)(struct WatchdogCntlr *wdt); // (Optional) }; ``` - **Table 1** Description of the callback functions in WatchdogMethod +**Table 1** Hook functions in WatchdogMethod | Function| Input Parameter| Output Parameter| Return Value| Description| | -------- | -------- | -------- | -------- | -------- | -| getStatus | **wdt**: structure pointer to the watchdog controller at the core layer.| **status**: int32_t pointer to the watchdog status (started or stopped).| HDF_STATUS| Obtains the watchdog status.| -| start | **wdt**: structure pointer to the watchdog controller at the core layer.| –| HDF_STATUS| Starts a watchdog.| -| stop | **wdt**: structure pointer to the watchdog controller at the core layer.| –| HDF_STATUS | Stops a watchdog.| -| setTimeout | **wdt**: structure pointer to the watchdog controller at the core layer.
    **seconds**: Timeout duration to set, in seconds. The value is of the uint32_t type. | – | HDF_STATUS | Sets the timeout duration for a watchdog. | -| getTimeout | **wdt**: structure pointer to the watchdog controller at the core layer.| **seconds**: Pointer to the watchdog timeout duration obtained. The value is of the uint32_t type. | HDF_STATUS| Obtains the timeout duration of a watchdog.| +| getStatus | **wdt**: structure pointer to the watchdog controller at the core layer.| status: pointer to the watchdog status (opened or closed) obtained. The value is of the int32_t type.| HDF_STATUS| Obtains the watchdog status.| +| setTimeout | **wdt**: structure pointer to the watchdog controller at the core layer.
    **seconds**: watchdog timeout duration to set.| –| HDF_STATUS| Sets the watchdog timeout duration, in seconds. Ensure that the actual running time of the watchdog complies with the value set.| +| getTimeout | **wdt**: structure pointer to the watchdog controller at the core layer. | **seconds**: pointer to the timeout duration obtained. The value is of the uint32_t type. | HDF_STATUS| Obtains the watchdog timeout duration. | +| start | **wdt**: structure pointer to the watchdog controller at the core layer. | – | HDF_STATUS| Starts a watchdog. | +| stop | **wdt**: structure pointer to the watchdog controller at the core layer. | – | HDF_STATUS| Stops a watchdog. | | feed | **wdt**: structure pointer to the watchdog controller at the core layer.| –| HDF_STATUS| Feeds a watchdog. | +| getPriv | **wdt**: structure pointer to the watchdog controller at the core layer.| –| HDF_STATUS| Obtains the private data of the watchdog driver.| +| releasePriv | **wdt**: structure pointer to the watchdog controller at the core layer.| –| HDF_STATUS| Releases the private data of the watchdog driver.| + +### How to Develop +The watchdog module adaptation procedure is as follows: + +1. Instantiate the driver entry. +2. Configure attribute files. +3. Instantiate the watchdog controller object. +4. Debug the driver. -## How to Develop +### Example -The watchdog module adaptation involves the following steps: +The following uses the **//device_soc_hisilicon/common/platform/watchdog/watchdog_hi35xx.c** driver of the Hi3516D V300 development board as an example to describe the watchdog driver adaptation. 1. Instantiate the driver entry. - - Instantiate the **HdfDriverEntry** structure. - - Call **HDF_INIT** to register the **HdfDriverEntry** instance with the HDF. -2. Configure attribute files. - - Add the **deviceNode** information to the **device_info.hcs** file. - - (Optional) Add the **watchdog_config.hcs** file. + The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF framework, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. + Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. -3. Instantiate the watchdog controller object. - - Initialize **WatchdogCntlr**. - - Instantiate **WatchdogMethod** in the **WatchdogCntlr** object. - + Watchdog driver entry example: - > ![](../public_sys-resources/icon-note.gif) **NOTE** - > - > For details about the functions in **WatchdogMethod**, see [Available APIs](#available-apis). + ```c + struct HdfDriverEntry g_watchdogDriverEntry = { + .moduleVersion = 1, + .Bind = Hi35xxWatchdogBind, // See the Bind function. + .Init = Hi35xxWatchdogInit, // See the Init function. + .Release = Hi35xxWatchdogRelease, // See the Release function. + .moduleName = "HDF_PLATFORM_WATCHDOG", // (Mandatory) The value must be the same as that of moduleName in the .hcs file. + }; + HDF_INIT(g_watchdogDriverEntry); // Call HDF_INIT to register the driver entry with the HDF. + ``` -4. Debug the driver. - - (Optional) For new drivers, verify basic functions, for example, check the information returned after the driver is attached and whether the watchdog timer is successfully set. +2. Configure attribute files. + Add the deviceNode information to the **device_info.hcs** file. The deviceNode information is related to the driver entry registration. The following example uses one watchdog controller as an example. If there are more watchdog controllers, add the deviceNode information to the **device_info.hcs** file for each controller. The device attribute values configured in **watchdog_config.hcs** are closely related to default values or value ranges of the **WatchdogCntlr** members at the core layer. + + - **device_info.hcs** example: + + Add the deviceNode information to the **//vendor/hisilicon/hispark_taurus/hdf_config/device_info/device_info.hcs** file. + + ```c + root { + device_info { + match_attr = "hdf_manager"; + device_watchdog :: device { // Device node. + device0 :: deviceNode { // DeviceNode of the driver. + policy = 2; // The value 2 means to publish services for both kernel- and user-mode processes. + priority = 20; // Driver startup priority. + permission = 0644; // Permission for the device node created. + moduleName = "HDF_PLATFORM_WATCHDOG"; // (Mandatory) Driver name, which must be the same as that of moduleName in the driver entry structure. + serviceName = "HDF_PLATFORM_WATCHDOG_0"; // (Mandatory) Unique name of the service released by the driver. + deviceMatchAttr = "hisilicon_hi35xx_watchdog_0"; // (Mandatory) Controller private data, which must be the same as the value of match_attr in watchdog_config.hcs. + } + } + } + } + ``` -## Development Example + - **watchdog_config.hcs** example: + + Configure the device attributes in the **//device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/watchdog/watchdog_config.hcs** file. The parameters are as follows: + + ```c + root { + platform { + template watchdog_controller { // (Mandatory) Template configuration. If the template is used to configure device node information, the default values in the template will be used for the fields that are not declared for the node. + id = 0; // Watchdog ID. + match_attr = ""; + regBase = 0x12050000; // (Mandatory) Physical base address used for address mapping. + regStep = 0x1000; // (Mandatory) Register offset step used for address mapping. + } + controller_0x12050000 :: watchdog_controller { // (Mandatory) Keyword for matching the private data of the device driver. + match_attr = "hisilicon_hi35xx_watchdog_0"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. + } + // Add node information for each watchdog device. + ... + } + } + ``` -The following uses **watchdog_hi35xx.c** as an example to present the information required for implementing device functions. + After the **watchdog_config.hcs** file is configured, include the file in the **hdf.hcs** file. Otherwise, the configuration file cannot take effect. -1. Instantiate the driver entry. - - The driver entry must be a global variable of the **HdfDriverEntry** type (defined in **hdf_device_desc.h**), and the value of **moduleName** must be the same as that in **device_info.hcs**. In the HDF, the start address of each **HdfDriverEntry** object of all loaded drivers is collected to form a segment address space similar to an array for the upper layer to invoke. - - Generally, the HDF calls the **Bind** function and then the **Init** function to load a driver. If **Init** fails to be called, the HDF calls **Release** to release driver resources and exit. - - Watchdog driver entry example: - - ``` - struct HdfDriverEntry g_watchdogDriverEntry = { - .moduleVersion = 1, - .Bind = Hi35xxWatchdogBind, // See the Bind function. - .Init = Hi35xxWatchdogInit, // See the Init function. - .Release = Hi35xxWatchdogRelease, // See the Release function. - .moduleName = "HDF_PLATFORM_WATCHDOG",// (Mandatory) The value must be the same as that of moduleName in the .hcs file. - }; - HDF_INIT(g_watchdogDriverEntry);// Call HDF_INIT to register the driver entry with the HDF. - ``` - -2. Add the **deviceNode** information to the **device_info.hcs** file and configure the component attributes in the **watchdog_config.hcs** file. - - The **deviceNode** information is related to registration of the driver entry. The device attribute values are closely related to the default values or value ranges of the **WatchdogCntlr** members at the core layer. - - In this example, there is only one watchdog controller. If there are multiple watchdog controllers, you need to add the **deviceNode** information to the **device_info** file and add the corresponding device attributes to the **watchdog_config** file for each controller. - - - **device_info.hcs** configuration example: - - - ``` - root { - device_info { - match_attr = "hdf_manager"; - device_watchdog :: device {// Device node. - device0:: deviceNode { // Device node of the driver. - policy = 1; // Policy for the driver to provide services. - priority = 20; // Driver startup priority. - permission = 0644; // Permission to create device nodes for the driver. - moduleName = "HDF_PLATFORM_WATCHDOG"; - // (Mandatory) Driver name. The value must be the same as that of moduleName in the driver entry structure. - serviceName = "HDF_PLATFORM_WATCHDOG_0"; - // (Mandatory) Unique name of the service published by the driver. - deviceMatchAttr = "hisilicon_hi35xx_watchdog_0"; - // (Mandatory) Keyword matching the private data of the driver. The value must be the same as that of match_attr in the private data configuration table of the driver. - } - } - } - } - ``` - - - **watchdog_config.hcs** configuration example: - - - ``` - root { - platform { - template watchdog_controller {// (Mandatory) Template configuration. In the template, you can configure the common parameters shared by device nodes. - id = 0; - match_attr = ""; - regBase = 0x12050000; // (Mandatory) Used for address mapping. - regStep = 0x1000; // (Mandatory) Used for address mapping. - } - controller_0x12050000 :: watchdog_controller {// (Mandatory) Keyword for matching the private data of the device driver. - match_attr = "hisilicon_hi35xx_watchdog_0"; // (Mandatory) The value must be the same as that of deviceMatchAttr in device_info.hcs. - } - // Configure this parameter when there are multiple watchdogs. - ... - } - } - ``` - -3. Initialize the **WatchdogCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init**, and **Release**) to instantiate **WatchdogMethod** in **WatchdogCntlr** (so that the underlying driver functions can be called). - - Defining a custom structure - - To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **watchdog_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the index and the number of pins, to the **WatchdogCntlr** object at the core layer. - - + ```c + #include "../../../../device/soc/hisilicon/hi3516dv300/sdk_liteos/hdf_config/watchdog/watchdog_config.hcs" // Relative path of the file. ``` + +3. Instantiate the watchdog controller object. + + Initialize the **WatchdogCntlr** object at the core layer, including defining a custom structure (to pass parameters and data) and implementing the **HdfDriverEntry** member functions (**Bind**, **Init** and **Release**) to instantiate **WatchdogMethod** in **WatchdogCntlr** (so that the underlying driver functions can be called). + + - Define a custom structure. + + To the driver, the custom structure holds parameters and data. The **DeviceResourceIface** method provided by the HDF reads the values in the **watchdog_config.hcs** file to initialize the members in the custom structure and passes important parameters, such as the watchdog ID, to the object at the core layer. + + ```c struct Hi35xxWatchdog { - struct WatchdogCntlr wdt; // (Mandatory) Carrier that connects the upper and underlying layers. For details, see the following description. - OsalSpinlock lock; - volatile unsigned char *regBase;// [Mandatory] Used for address mapping. - uint32_t phyBase; // (Mandatory) Used for address mapping. - uint32_t regStep; // (Mandatory) Used for address mapping. + struct WatchdogCntlr wdt; // (Mandatory) Control object of the core layer. For details, see the following description. + OsalSpinlock lock; // (Mandatory) You need to implement the spinlock for your watchdog. + volatile unsigned char *regBase; // (Mandatory) Register base address used for address mapping. + uint32_t phyBase; // (Mandatory) Physical base address used for address mapping. + uint32_t regStep; // (Mandatory) Register offset step used for address mapping. }; - // WatchdogCntlr is the core layer controller structure. The Init function assigns values to the members of WatchdogCntlr. - struct WatchdogCntlr { - struct IDeviceIoService service;// Driver service. - struct HdfDeviceObject *device; // Driver device. - OsalSpinlock lock; // This variable is called by the HDF core layer to implement the spinlock function. - struct WatchdogMethod *ops; // Callbacks. - int16_t wdtId // ID of the watchdog device. - void *priv; // Pointer to the driver's private data. + + struct WatchdogCntlr { // WatchdogCntlr is the controller structure at the core layer. The Init function assigns values to WatchdogCntlr. + struct IDeviceIoService service; // Driver service. + struct HdfDeviceObject *device; // Driver device object. + OsalSpinlock lock; // Spinlock. + struct WatchdogMethod *ops; // Hook functions. + int16_t wdtId; // Watchdog ID. + void *priv; // Private data. }; ``` - - - Instantiating **WatchdogMethod** in **WatchdogCntlr** (other members are initialized by **Init** and **Bind**) - - ``` - static struct WatchdogMethod g_method = { - .getStatus = Hi35xxWatchdogGetStatus, - .start = Hi35xxWatchdogStart, - .stop = Hi35xxWatchdogStop, - .setTimeout = Hi35xxWatchdogSetTimeout, - .getTimeout = Hi35xxWatchdogGetTimeout, - .feed = Hi35xxWatchdogFeed, + - Instantiate **WatchdogMethod** in **WatchdogCntlr**. + + ```c + static struct WatchdogMethod g_method = { // Instantiate the hook functions. + .getStatus = Hi35xxWatchdogGetStatus, // Obtain the watchdog status. + .start = Hi35xxWatchdogStart, // Start the watchdog. + .stop = Hi35xxWatchdogStop, // Stop the watchdog. + .setTimeout = Hi35xxWatchdogSetTimeout, // Set the watchdog timeout duration. + .getTimeout = Hi35xxWatchdogGetTimeout, //Obtain the watchdog timeout duration. + .feed = Hi35xxWatchdogFeed, // Feed the watchdog. }; ``` - - **Init** and **Bind** functions + - Implement the **Init** and **Bind** functions. Input parameter: @@ -189,15 +200,13 @@ The following uses **watchdog_hi35xx.c** as an example to present the informatio Return value: - HDF_STATUS + **HDF_STATUS**
    The table below describes some status. For more information, see **HDF_STATUS** in the **//drivers/hdf_core/framework/include/utils/hdf_base.h** file. + + **Table 2** Description of HDF_STATUS - The table below lists some status. For more information, see **HDF_STATUS** in the /drivers/framework/include/utils/hdf_base.h file. - - **Table 2** HDF_STATUS - | Status| Description| | -------- | -------- | - | HDF_ERR_INVALID_OBJECT | Failed to locate the watchdog device.| + | HDF_ERR_INVALID_OBJECT | Invalid controller object.| | HDF_ERR_MALLOC_FAIL | Failed to allocate memory.| | HDF_ERR_IO | I/O error.| | HDF_SUCCESS | Initialization successful.| @@ -205,42 +214,41 @@ The following uses **watchdog_hi35xx.c** as an example to present the informatio Function description: - Initializes the custom structure object and **WatchdogCntlr**, and calls the **WatchdogCntlrAdd** function at the core layer. - - - ``` + Initializes the custom structure object and **WatchdogCntlr**, and calls **WatchdogCntlrAdd()** at the core layer to add the watchdog controller. + + ```c // Generally, the Init function initializes the members of the Hi35xxWatchdog structure based on the attribute values in **HdfDeviceObject**. - // In this example, the Bind function initializes the Hi35xxWatchdog structure. + // In watchdog_hi35xx.c, it is implemented by the Bind function. static int32_t Hi35xxWatchdogInit(struct HdfDeviceObject *device) { - (void)device; - return HDF_SUCCESS; + (void)device; + return HDF_SUCCESS; } - + static int32_t Hi35xxWatchdogBind(struct HdfDeviceObject *device) { - int32_t ret; - struct Hi35xxWatchdog *hwdt = NULL; - ... - hwdt = (struct Hi35xxWatchdog *)OsalMemCalloc(sizeof(*hwdt));// Apply for memory for the Hi35xxWatchdog structure. - ... - hwdt->regBase = OsalIoRemap(hwdt->phyBase, hwdt->regStep); // Address mapping - ... - hwdt->wdt.priv = (void *)device->property;// (Optional) Assign the device attribute values to priv. However, priv is not called subsequently. - //If the priv member is required, instantiate getPriv() and releasePriv() of WatchdogMethod. - hwdt->wdt.ops = &g_method; // (Mandatory) Assign the instantiated objects to the ops members so that the top layer can invoke the WatchdogMethod functions. - hwdt->wdt.device = device; // (Mandatory) Enable conversion between HdfDeviceObject and WatchdogcCntlr. - ret = WatchdogCntlrAdd(&hwdt->wdt); // (Mandatory) Call this function to initialize the structure of the core layer. The driver accesses the platform core layer only after a success signal is returned. - if (ret != HDF_SUCCESS) { // If the operation fails, release the resources used by Init(). - OsalIoUnmap((void *)hwdt->regBase); - OsalMemFree(hwdt); - return ret; - } - return HDF_SUCCESS; + int32_t ret; + struct Hi35xxWatchdog *hwdt = NULL; + ... + hwdt = (struct Hi35xxWatchdog *)OsalMemCalloc(sizeof(*hwdt)); // Allocate memory for the Hi35xxWatchdog structure pointer. + ... + hwdt->regBase = OsalIoRemap(hwdt->phyBase, hwdt->regStep); // Address mapping. + ... + hwdt->wdt.priv = (void *)device->property; // (Mandatory) Use the device attributes to assign values to privr, but priv is not called later. + //If the priv member is required, instantiate getPriv() and releasePriv() of WatchdogMethod. + hwdt->wdt.ops = &g_method; // (Mandatory) Hook the WatchdogMethod instance. + hwdt->wdt.device = device; // (Mandatory) Enable conversion between HdfDeviceObject and WatchdogcCntlr. + ret = WatchdogCntlrAdd(&hwdt->wdt); // (Mandatory) Call this function to initialize the core layer structure. The driver can access the platform core layer only after a success signal is returned. + if (ret != HDF_SUCCESS) { // If the operation fails, remove the mapping and release the resources requested by the Init function. + OsalIoUnmap((void *)hwdt->regBase); + OsalMemFree(hwdt); + return ret; + } + return HDF_SUCCESS; } ``` - - - **Release** function + + - Implement the **Release** function. Input parameter: @@ -252,28 +260,29 @@ The following uses **watchdog_hi35xx.c** as an example to present the informatio Function description: - Releases driver resources. This function assigns values to **Release()** in the driver entry structure. When the HDF fails to call the **Init** function to initialize the driver, **Release()** can be called to release driver resources. The **Release()** function must contain the operations for releasing the memory and deleting the controller. + Releases driver resources. This function assigns values to **Release()** in the driver entry structure. When the HDF fails to call **Init()** to initialize the driver, **Release()** is called to release driver resources. The **Release()** function must contain the operations for releasing the memory and deleting the controller. - All forced conversion operations for obtaining the corresponding object can be successful only when **Init()** has the corresponding value assignment operations. - - - ``` + ```c static void Hi35xxWatchdogRelease(struct HdfDeviceObject *device) { - struct WatchdogCntlr *wdt = NULL; - struct Hi35xxWatchdog *hwdt = NULL; - ... - wdt = WatchdogCntlrFromDevice(device);// Use service to convert HdfDeviceObject to WatchdogCntlr. - // return (device == NULL) ? NULL : (struct WatchdogCntlr *)device->service; - if (wdt == NULL) { - return; - } - WatchdogCntlrRemove(wdt); // Core layer function used to execute wdt->device->service = NULL and release cntlr->lock. - hwdt = (struct Hi35xxWatchdog *)wdt; // Convert WatchdogCntlr to HimciHost. - if (hwdt->regBase != NULL) { // Unmap addresses. - OsalIoUnmap((void *)hwdt->regBase); - hwdt->regBase = NULL; - } - OsalMemFree(hwdt); // Release the memory occupied by the vendor-defined objects. + struct WatchdogCntlr *wdt = NULL; + struct Hi35xxWatchdog *hwdt = NULL; + ... + wdt = WatchdogCntlrFromDevice(device); // (Mandatory) Obtain WatchdogCntlr through device. + ... + if (wdt == NULL) { + return; + } + WatchdogCntlrRemove(wdt); // (Mandatory) Call WatchdogCntlrRemove to release the WatchdogCntlr object. + hwdt = (struct Hi35xxWatchdog *)wdt; // Convert WatchdogCntlr to Hi35xxWatchdog. + if (hwdt->regBase != NULL) { // (Mandatory) Remove the address mapping. + OsalIoUnmap((void *)hwdt->regBase); + hwdt->regBase = NULL; + } + OsalMemFree(hwdt); // (Mandatory) Release the memory occupied by the custom object. } ``` + +4. Debug the driver. + + (Optional) For new drivers, verify basic functions, for example, check the information returned after the driver is attached and whether data is successfully transmitted. diff --git a/en/device-dev/driver/figures/4-wire-uart-communication.png b/en/device-dev/driver/figures/4-wire-uart-communication.png index 6ac63e41108abd4776621356c3034fc52b6f436f..b5e82f09cd764b0cd9dc835e55f8f878b77eb91e 100644 GIT binary patch literal 8192 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 diff --git a/en/device-dev/driver/figures/light_driver_model.png b/en/device-dev/driver/figures/light_driver_model.png index a2adb1c908d3a263299248c95ad5c1e1f202e61f..b08018af22fb7d3207dc75b597decf63bb3b4cdb 100644 GIT binary patch delta 12284 zcmc(lWmr^U+pblV6c`$bff12rDCuSZ5s*}oMx>+#X;>gNw6sV!igd%!rKEIsNp}nk zu$S+&Y@)cMXGQs=w#<_vCk?(kbHA!M}O z40lrrDqp>tYG%o7kGUh$Bg=f^@JO7NaCBg;)ml{;q5NFH$!4yh}6n}?fc zWVsxuOyh^gzRpYv%yKA8exMu|7Vun%nXII+q-mPVs7YM6uy<#w;`&JdM3!7R>~@DymmB|Q zs?|td9j|E@LXS@by&8LsDeHzFAAj`g{M5(WU2Bo7djcg(c|=E z&Fn|zpuY~#&6i1hoeVV#K38=UM!?*DSi025)#pMEi_${IExx*kqT4?!X7N~3z8rRy zd7OUOUr*sR4cZ>gRj#bcn)}$TV9{oghzv;@(S)1_Z`ToK}kzUOJmmz9WO?yvARr|6l zhFKYPVKa}KVvt)SPKo;ZQ@?JwKSg9j;-CfV24&J7guYg|I@_I#5Sphh8sl-@(@)=9 ziIRfaeg{mpM!(yod!HTl=CUtPmH!;>zY=2?#-yx5>Y&{QmelJd)2L!GyC4X%R@Onc3@ zH$L;l24d&SVerc}MF#It0;8{nB0Y-pNFCAq0i zO3P@fCZ5K3y^2jKrsFJR8_Beq;I=b~(?*H9?(GyM=dc;pVU6QaU>;EEFLvHfr29;o z57^FB4-LPBWI!c65Y}SgUQ(^Bj4dp#|1mz?YKENrvxk^p7kw|aYX<8~h%yynNqM3V zu8cS{MM;paa-=l&PriF}4lK*99aUe6k@&VY=szV!Qs*~U`<~l)VSi6X)Xrx}c&FPZ ziA)&f*?JT&Q(^`1U;(Tt3S{tEN8eX~`JcR#HUc=px(>WtRfh;{9r_TK1sURf1AB)} zW#AlL^QE|9Pjvt2A)7oJ(&L71GbV-wKmvy>m(4W1&-^&zFLM(Ox43e=YL9w2u2a-M zS*z8bOd|Oo1f<$-PISe8MN=d6$fU}4 zwwAa3!Bm`j0SYpvrbQ4B*gGGR{yU0@)9if|c(9QQ3d_vj#O+asL9W;9j~ApLD#E_mpxXKn+{@-A_Y*Dl<|2o{LbT&At6(2ib60|F=I_QlziNU;HX z7DC!rt&5^7z`38H^|HHz;a_vEYL&Wyi1uruD3<;MXjyuBS-KVG;_%T`Y>#Z((kV5a z#msKX7dJ!BVE1Py(}){^M~7J-GlC=BTvgV5{Wy~lBe3~-M4;kA0%qWNz2C`mr!2VS zt0hBL5l4XO<;mts)QaiJzW2UoRaVPUVl&1}s;n;#An5YZYx1hQ`mN@(>~mI;j=nuT zZ@#^@v{yB|NZt49K5tj@S?w2gHp%@}rG5kcW&eh{H?}9yY18-HZceM>B}{)~5V$$E zEW-8(fJK#R-kg>IyHSCfalZ!|Z!Wj5y`#bcWFB4oNryV@TwLun49I={FXxTo%Gpg`MZ( zimq}md(6Z{^WGq6F$(u%qKr0Ni!wf?Ca5QK4a%pfEt z>3y&n2xm|-gK_oP4APCCe}TziK9U}8_Xg|#+ayXIVWF|}BaRG<#})$~I+;gBg!ZcA zA>8zH!wM9#IJFp<=lR|)5cNpF@{5s0Lqr{gtj9xYypeph^X|Y^E$)Hs=_+g6I-Tm^ zQrMT5V8i<`l1XO7!H?E>eH7Ww8#e=`j;xa5;o=$~3`|71$>n`6v#yYNCV#locs}oA z7*U+caB~nmPa&T_TAS^_(Y0_BTiU}nZ02WZLM= zx1l7y7i1lS*%1@dca(lq_9JFEOfSjtdE$0PYOj8{Xx&hr427J6-uZ`A?-rXW(Zk2}$$F%tW_ovVvcS z9Ki>WXi9tIDQQktpnJJ9%)9Pu@LJYUzGIRQ?1)L?DEna@XS;A*pmXihBN%qGNhJmi;}MVeyGoAzp58;`stoRHuOo@#&-#THcA|JE1>KL{1L3En zYMpBGq^~i+MT3Z-9xau-M(eSQIpJTlmq{x4;+V9i$9=Oui!-p~ zRUDDX5Wqg*+I(doRg>|sbmP}evO<|zThGePJ0B#wfX+0*%babD^ELh&{¤n_N7=8iipP3YBJ7{ko~4NWV4_0rxo!Ys!-R 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 axCV|z--$5@=Kj0`eksYnL=?*!fBrvObE?q* delta 12634 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 diff --git a/en/device-dev/driver/figures/using-I3C-process.png b/en/device-dev/driver/figures/using-I3C-process.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9e19716387232216989f4f7cd3970aeb39ef6b GIT binary patch literal 16073 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 literal 16854 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%0DcErj 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 literal 15514 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 diff --git a/en/device-dev/driver/figures/using-UART-process.png b/en/device-dev/driver/figures/using-UART-process.png index 3259fd96752d1244da00eb9be85651997943d316..d4acf5276d878a09438eaada4e4c7441f227fae2 100644 GIT binary patch literal 9475 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 diff --git a/en/device-dev/driver/figures/using-watchdog-process.png b/en/device-dev/driver/figures/using-watchdog-process.png index 7a2bc982174295faea3be1c0e51d05bcdf69b523..6ad4752401bd7fc60680e552015ba2d70d6796ec 100644 GIT binary patch literal 13941 zcmbuGby$>-g6~NYkP;E;9$LC%=#W%exG92knWDTFTbc3lb7;$HNbDA}cN#5)wa_qKu@b zyU|`I<_9g=`f4!wTM327CL$7aXycqr_#deQll{?Nm%c_J$RL$9wZ%4i5=I?J9bQeX zLqNpK&cYHTIR?g}m(t~yexXkTWi=tSF(gJoBX{oeTRhkm-p$B(BJsw8YRUS?TiClP z1K475**Q%*i@=jq9qOQ1EQXUji`V7sDQUa&v_T01K5s@f?KcHYr4-Pm%L&Xd!=vz( z)a`?GKbp~XJbgw+lk{c!aXDJ2To?lrzZ9F~e|wWl!!U<~tcBy5=snf2XWea;b;8<~ z=(ffg$2yEMujsyaJ_@Lcwx#`1`i?Dg^{rxigdJiZ)P2oYLSeksaB*&bwb6pis41)< z;(My_a0mO&M>%KPlpN9;ay_53vBuel2IBCDhms4r#8z^#{2U_>b}xHoK=z&IZ7%T) z%yrrGH!UWc(FzfEZ~NAm$1JuhhS3HX459)_63f@j8>yb`H(y;3NQlR}{fP}H)maM; zY^IN;TL03pI%+2HzPt6Hl(^Q7&Fyag0|=+IRfN3FMxN<}^uh!=D4b^xj|cD+5H zgLa_wqHdhgFB#>8*^`{mRiadqfcIRVH-|j*@6Y!QGQUr^!WLtxUsu`LQB1d%|NOGh z&y%EB6GWMY=UR6Y=qcbd`{EDYzJUERcKu%hw&ch8d4BYmVosx{`F9SpMr8O;yKuBo zA4h}VU;gy|NiW@x7A6fI5Ug<|WR#Dg{0$A}Y2F#8HKE<>A9R(XWfkv@UAN=^BfXS% zlGjzh@%9Tu4J@QhDl0JgDOyp;?e~)F=nKvnkmyOqhAc^nNh>TY$7=8~5lSByA)B2? zzR`k-fKdYfFy^Q0i`{#cpLXmw?&b3t?j_fD0*(@~q)hYaQJ?Um^^&-*rk2`2x5bTZvpMe2eU(qyDMq zudhSj%8hNXXTWk=Wir4QVpk@TY4ea_q=h}JW-cWag^N|BfYtjB7#yf|a1~ zHwN?N=2r~oe45@eGP!V`v#ciwN=*H7(_gBj0wCvV&K9-~tUaRu)5Y4}JI}JpaEEWc zxeFHu1}aYEK~NT29*H##qqH1LljQcg?}9&BUyNbHQf6M8OxC$&tLc=+zJ`NrJeZ~` z=c2p{c4oySW$jxo(PCaRl^&mw?70=V9xQXp5*(CbgMM-G{r250b{sihA~a>KmJb2v z6PDRbYMYkrSbhx(8T@q=q1ByaOOf)$|5s&f2O<426kneFz_Q80q z26`KX_$kLb%CDjs?cu2T6d+De2?76e{Du)u4mP9?K95!Rg`*Mi3q8E$^_~u{Z)XhH zL7Z#9S7yOMgDK18I;8m6LxENqu~Z^IkoQzPyesD?d1&xs#GBHD_2GnG7r$A%fRFUG znZ%qrR1x%ZN=TsIaEUSAi`VVrifl}}W0Lj{bIYlr;k7xZrq8N~3EBL{+cbm4!q4$- zHNs_vbX-jpitiC3mJ4ZGqszx3$Gg}FGQsZKqgAD~NpYVu41Y1 z^L)!qEyHv+B7K}9FR$IUEYEU%LZeB$+$T>{Q%kh1Y(=tCxmAc!2xF>c1RPgIHXRd+ zCyKYQpI6YCH;f>td@m*WON|RS+()ulw2E!&n(xljZ_RJ`w-&z@dGc=( ze=hGs*$v7yYmLU$nDSr1iAcVw8F3CWmH}x8cubdFup^%kfk3|Rxi;1h0+t%52gu~! zl((=M*DWGoq(+e~21~zAj0?`b_LdxiC#iEk=8!0cS^m$E`FjrC)qIZ5cK1ISDr3k-{v$hMS*_!FLv{*gZH0}?@=B2~@M=1OIXZa5xo**q{ zUk)A-F#V+Qg2C}t7TCQ^hCqSALw#Lgpb6cNtjgEw}^ zd0zdbs$qZKUj6Q)ORismf}$a$qmC}Fyd9wz6lC{uoVDoou;MW#NPk;{~N^i5v4X~bT)M%z%9z`)PDX8)J4S2|&_sOG6)2Cfka?09+p57Z}H zdH?r3W)=l^vM(Fh8xcqkI)m(ooz`wy*)HXLBYZjov#wFj=9gXcgu7m?PZ{UxojmuX zVukmuXDd{_o3L!3-f%XNpXiCqWTiyC~~pjh5|_zu&19W)^Rgads=+&)O;s*zcQEjTdvZ}V}rXF{9Yzs z4Do$!_tv1afkm#`Y2oWi)Xr4j#8f4VCjV??Z6pJgqJ>3n^^`w!&~x1~mCw9>ZJmN; z+-hy^;$U8C>$iAiQ7zO_r^Ms}74~Eov;l49=pERH zL`-uzbY)WI+FT=nzT!l^_uXQsr{T_etrorqdo#$0T!?vP>7!(Uga-|Waqn$S-9XDD zo#p%fdp>$f!=2|6EqkeL5w0%}D8+!Y%%ypem0iEPZ}k)ptBQ4eNNcwApliV?0Rb?P z^hAyEOeN0T40I()_!2z4-0Ge|hV*H7={Fk^kt5p~K!gn# zo?b|?-UAwww5u398IX*Ph~W%FPcg&#i$7bJ9W_|;HeyI3Tc6uQQO{Z_#4{LS;s|B9 z8qw0)Zysg|v6dj@ZItP{fQrh?w=2dH{ zA4^A9m8-Y!&;I3IhijgjD82Wme|kAYk~?O#vitmRFobBpVvgH+a0}-cc7Mc&YzwQKRsosz3cO{=WvW4t2g!5cELro>S9;)VS_KH!{E1H6J-jCxo z@H`?*yV@a{*>}>kbaq8lCF}D-P9;<(RZpJV*n$a{1CkT1*h`aSZBMXf?in(9B=r39 znJ~ZiiB~9&60OJs(x#SvNqZT%GsB?mw8dLA`M;kg@mV5G9fjLyjiEQ;J}KV2%qqqmE!ySwww3025P9; zljCo6^0v2xYT^uDP(PxugURyDf$W>CF63++4mUiz-#?D8N)VbYy33Y0eNqd8hvpvxA2gB<53bG9Pl6Z>sQW3Qt%^}Yp|i%U zV2ZD~_vc4COC&v?&h*K3pD5qPwq6j2C^#W*EP zm}qOk7O3r$%DYxzg_anKfRpnF)A|AN8Sy;?)Z_p=zlQeXKq*sR0A`_Nv)SZlo0U&o zktLjFwbe))(8RcpF|8$PY{Ple`M=|>F=M*jabn=@E)_V))OF!~+`-i1*tc|=SGV^Y z5bRhQX;dJ;#%!H9Im5A}{Q=uuhCB}566kZgKu@U-sI{B3%^;DlK*gx(O$gl#soX!7 zfS6l5Z@MkvQR@3w^1YiJ=WoHAKe9$W`K;|rkQ$2>0?3OF?tjvk{yog^2+6wDL|Z&I zbrMfXjF`aW*mt4dbKigU8xASE7c^Z(et(`Fd%6qf<}SY+eiGY z|8AW{CH7mh*KY`$g>u@cquo&fabQ1l@=e+J?I~ht@wH z0i{IC{&jQJeUO2FgmTR+66Vl4Zn62CCbwZLJ}%$v8z9I2AD;goynOABb07^k-q_)> zG@Uhgz^%&#y;_u))K~(sM<{Oa_stKAfEk9f`t`wnSQCoMi<;}ZJM6L;*fUF0#sMd5 zOUO0G@#0)Xp3;q=50hiH!wg$@426r7tRA3A>VF-d#+z3yj?s*N{3&Xl3K!u~cRaKZ zjjz_G?_`f;2-vLU5SYSD%`0?)x`&J-vZp5iFh3*^zfKOLbwHi$z7#_Ls5=X7rkqggPA5* z0qjjn4hZ&&rF2Fe10wi5(Sy||zB`KHHXUHP$|j&YGn(~s$u-~HVQ`swntI>%thZl; z{@>KW6vf`1kW=rJ*Tp53uVlcu(}={0XLg9`skG z_0=UuL^^_Xw?3IS`y$-7w=b^lVFxGa~)H!DD{B6Zux;|Xpd<}k+_bO4!L9S`L>AkY2hQO@mydYYj=vaZu z?_)YTI?KInwJMxFkq_gW)dx#;0oLe0TWE2=;EEECHBkyIkk?Y(D))0kALX`_OHoE< zlCX|tWoG;3i_rGrQTB(^vcp~K3an4U=VtCxE0oIiM4+Q3>A7pZ@7E4jq&6!7eQ8^3 zxueS`q$I*r2Q!@OjCmh^~t;l4Vtj+{0kDWXD)ATLk^H5j8)?I6dgXe zN>5TgN4DNi0vH2t69TJC-=;FS&GSf<6}<1lp3sg&pS@mbyLwxOS=KW!^2y8})3OVx zMMl6p7SO+Yj1r5V+e4oJ0)2EVRTq(0T-M7G_dovKHJHx-?nUj5WeX4Imr_`K{P@yp zT9POGR%!@sZS>{N?Dl*sc^_c7JNRL=hZ&!79Wq2V9iqB*&Fp`?Z;$mrm-l61a;xFB zBNC^7#*K>$Q9$(rGcQr$I8=~aqvp&=6D^v#^*?@bss_gBg9a@0aNY^nf`IO~We|_Ti;;4y2 z?yjVwhG>hpYorp}K_Tho<*z`+KOXULLPOUhZX}c7?w1a; z$ZnU;i_FPR&NY0rZHP<-x4GBEmu=QUEtT!t_S>EBqM)V%(-k+YRn$*#$Ydj&ei6+M z4h8*4ugLR?$x`iE>f(1ObCt6ErWa8{v832{tsJNa+twg)Mo=@Z6?CgKV(mrNfX-aK z8N0`IP528r%MD4!G|O@pX|33Y$3K}3V5m<@@&P%4ufAO zx^7kPw}8kR2`uKq5$>#dnoYreASTKeZ5){(8Ey4*DYpitxuj~$PyD&#NXxi{d9^O!BT7kfpJJr3 z*}%~qy>5341ShW6ZAa$a7IR61s!Y6L^7Vbn9+BumVr^3P)4!`NoZ=d!Lo-AGZZnDt zeqXIvO3A|oMe9v`=C|yT9z9&0ed=d8CsiVL>(nH!u@9@r?((ZOX^JEjSLO$L1Wt{> zR*wCg>msemlj(Q! zGLOpTw)+UWQ6lZMu3=k>lWIKk!E@w!JQQ;rxbv78I5as?jR1 zkM#uKx@=wyxF4Z6mKtQU#}_DTtfYGDUNJ_JFaV0Re_qxvc?S;b6T4X806e=LNzEDa zH3{atwCE_!pyk=N2p26}K4x6lYA}lq$dYlCLCOt)kgUpbF!s*V30jDFWV2KrZ@-X1 zVMA3Ku`wL~U5%UX$wL}r05ITA`q5IEDJ#0XLD zuoJ1)L-&RvoMOqZim2HP-d@Z9g?4pTmf|k}w?9tI%$?o`S!Zc%s_vwR1-C6c^+X$8 z4*x0QYdcv?d-0KC_4AO=us}xuv?a&B^7p0JMWYx#Mkw?~d0FaW`3)u2kD<%g#G|y4 zzOa7GeX?1T*hAa-y~);~Wod(dQ2s0R(Hq<_dt83JyZ zFkse91N)m@yQ0%)Y5aDjzS1A!(hpdEpu5SNm&O&6{j)%VvdDp3fsdA**M|~R>xU3$TroJkM>^pwPn#;-LZ~sv;+5Dd zQnN$BYaEVJGIEn~KpZ%3oTM12MYSp5A}&RlAr#RcaY7wr0p+Tgll*BV-!V5*SU9_l zv9XCKU08mYTEz_+usI7{c5#9%TPFdD8csrBlSu*p@^^mQ`IHtHNpSfb0NdZrwpX7I zK0FWT15O+`AT0puwys*{KB&Y#wuTE6S?sKq-s5it7JI4QO6b%6^MDcM+uANzMu zT-rHk<119>tM$J>ucX2-*lSqqD{d!*WtS3cTOmb@&B@OLtcwgPiFeJq+ur zW6?5g?f(L-e^_t-$(|PUT}2)$^UTpKc`bj8cRUwkB!$SrF}{Peb)f!xv0&zYPx4Ao znkVjmUz-0Xh~WJMaCkSCrtV$4l>(>xt3%LiUM5#Ge0_?*7@j`L^oA@mGRm-sJWIz2 zbI{ZxH8>5Gf=#!YH^16AhmSU!2f2hk^b0YZoZ@c~Qe?EKK<$xhuIy^7e&LN1--ic| zSf(-IHxm$XzZEFbhm)tqdVfw!=^#5)^aum`hlFjdVJ$>UX%!Q1Ol#(#c}rvvrVwXS zl1r#NI?yKIWB)1GrLIQTh|kmyiapL(dzBU*B?tajHN)PshXUat6Ch-v$Q=fH1x$~a z2V6G&3MiM%R(uWc0efuY)tfT12*G&{r>+=E<}GYu!JJXaYrl=%_fm`SuFIk5GJ6yI z5$iVz03HDfE{MrRl4|r+*?RqmZ^PwKy(+2idje%)lj#sQHJ6(N+617g*X-f5f40|g z&D@(Cc%_ly5hhw-Cj4Ap5u_)Zl3t);1p!g_G53nHG2>>~dJ7)H1S?h~tAXVL5ZNi7 z=DDsHLDU4f?iGU)n*e&d9>N%zMrqYbN=S)6xdc++Y!Dj!0BbT=w(ree)$umeR;O9i z)-!4=I`DiMTK2wJm{D8w_Q@xFdY0a>&uyM=NCQM2qc`{>vkwtQ_3y@Z8jgL}a67Hs zmnm=?venfxJAIoc_@Sp^(wTELju5k33$`mkd@9kG)PmsEcGpcDvhqD(Vc?_gh{4I_ z=^B&FMabAYnZaRs;fLD?oQ?xd=288cG~8Mmmo|zbBEK^{6!&oTuJC~;gDz_YC=aCi zmRM?*b(&oL0vcGHrJGJJ$?J&3m zvZ643V85|0)9872wn94(NCj`;w7l5eu{(0*85OuQ&mhh@12(LaqNGgv8c!j?^kc50 z2%+hm{JUm}A^=nG?cBVC0zO*L+pMD1xr&<-|0}PxLsMIbic(bQ2*ilbaxy$T&Jf5S zAUW8Sehq97WTwl?<1!S?$1IT6%raA z>xSHwzlcRw{RgD-A+CpsUnCi=$)H(BM zahGd9CUnd90|E3-bbyzjbP6$EAc9*H6iK4RRGMq})i>~w@Rf>K-s`t>A3rtcz;cJY z`F=*EcA~684#YXh%IA<%Iye(?k`17#;Y2>%)&-JyV&AP9+`xmWHS|y8uL~6;kEFy6 zev3<+9f;T4eP!$T#vbPPVU5YpoB7JrBgL8kHz;_Tvsb^f8X_gz8sT3!TeaRAfNC** zX!_nKxir89P1`p^8l*;Ec7zmzzZS#luiJOq4~H_Y-$2TrZ?V2aFroxFTcN~$v_M>|1yR0f}k94QY4 zxEjv*I3=}~Dq7us?fXX;$Yj0B^*8>Zvd&DMcI5vii2jEgu90SIm)j0h19h=C#S`D@ zjB-__BB&mCR6 zMLO@t_ThGJ5L~;3#b)?0(qD{lkg6I&Wa?|a=fEhB9z9E!FZ68{8g16d^?gdS*`nrI z2H48eR}ILW8#HEQT8WQbhcs3gx+X?gk8p46lez^r=TGRrI->d-_M88is`{_kgFgOO zvG>=oj;IIli4z`)!%+L=2VXH)`}y3sgSYo zRNbq09udp|9}DV2AS7G=#F!m-P9aj1E__GiTD3C{c|(M!+!!~&(2-drq#LKGO|Y@C zm7o{Lpgt<4m4+SwP2g>^oJid zntyE_zN9}&JH=bJpx~JzlQddfTYOwT+t}xp-*6KS7FPiG{f+{d0NM%xd>7{OC7^Ri zK8I|Fvr=6w{SA%Zemok(TYh;`orUSSlwb?xGguIr2ki6+=j>y`d9f?Ey<3BW9KTk` zVY|J+)yA;T@TVh<(Myy_^kW)up9iGR7(2?amVn=CZFPW6?{jJn9v(`s?r}LG+^aAm z`4teX{^GSu1gw~Zo4B*v`?&eEah-z)*ViZj?<79OqRs+}>L(rYa+55yHvY%z{M!<5 z$E_7IuZoqkuR<2pGEbVS2OpB;gpjDOmIpN+z`^?+8i(}F`FXVi8#kcRBTlJ(a2{U! zFylKxfmH6A4R2<^uVP#W@u!p=nYVGgN-wx;7t=+>I6s&Y^slepy-n^iJ@Q-D5^ zZC9q^fy8yu31#|7IE};yWUZM?9O_hXP`nwYrtZrNZ6C#dirEnzGYh7IyoD zr{^m*oNh6^Uxt!T)At7`zIy>e9^ot9;w((yt+Z$GTdwZbJM>#cVRw2t4Qsc)a3OP$ z@d*hH%|lzgK8Hzbd&lMYh6%G2Lt8v0(tvqbAyoo@6HuqH^YZ_->bq`F{7I0GjOVc1 zQQ(@_X~B;t_98|8w@R8I4S1uK>}|~_7jMQ^88FdLo<}aX)8+ol=j$8W9fAE|PtA}h zcY_0rz)x30=|yp8iuq3f)ZXpa%Nu3!YxTFTeq4BBBL7gUTD;W%YH3!(@d=3GUjYgs zQ~mWvxH3XI%2=kOS1l)*zX{Mz%-sCIP#~H^6cfAL^kdy1kALDbP(nJ;HFqDNoGx8T z^%|zFl6t87RBIg>9ScLH0`!GUYKcIZx^r1K)9jZGXZ7*cua4Ggt$Wzp!LiiCdxpRv59N2H>en4xut zrZp_b^}p1B&{7!aDF9oxCnVm@`SKLHobwz~^DiJ~$7zO7U=%|^M+>(g`j$GUy<#;! zioT4yE;hz4yyw`vv4w=TCZzE1YmTU0rMxDkU)gd6;BceES7b{ax#I8QzBY$-6Zvp` zaj*&1|8B&{))CTM^WLXAOHB@k3WSGC{-p#o!ve{4$A?hb=1ks3!5kCwen&ATc``pTiphP1e9meay# zuuS|p0=Z=GB%YDTvqGVdm`!0n7)69`2-3-JV-);gHHjLuI`{1cbjVScO^iZVpXqb8 zSiDa+&h-u;!8{?_VDRPaR>QxvhHi+GMvp|&|EqH~{5O)zOLE%Ghbuv!FnVVEq(&=Z z`g=O!{V?PjkpDl+<_E@aAV0Lk|AAGD>(O>khD53deDW8w0BP&`a=CG)i0`3%?n9S6 z!Le+9isJo>66xdi2Q5AizrkLFKb2p3rpq#;Vr0q6Jk5g}r8_-%K~smg0MaursU`$) z@~qm|(b+8Bpt;Ni#%ZNhr?*L7ht@=T1u5IAPmWNYrH6(Uxdmh`QS+w7ECy!(I(e~~ z;gzKs)1Vu@x#zZz&+#Su7aUQfqR`of&`AIPh`QTe*=O%fzx2A;g-ZG28>R41VP;aW zNRtf(0fw?fgvco4c#3v-^+HuQjNQDqdsI08(}!?724IT*-S;t`x688s!vOtkj@I2Q zD~dniQ5WOE2o0kq_d_Y{#u7;-_U1-Kb=9L>(kAfHJVROjP!b)OsE{m;TM95-948hm zPJgY@Svc_9!7flC8Z*@42nXPQo*VEzqfO?Fo6$Xucu$f5<(CJ|6duZKdr^Tah4Y+# z6|jO4bRZhfHx!D2z=HC18~? z8WoPm9Y>=-%wa9<@*ZLBfpP|bwMNAg1rp%*00Y;6^s?-6=;~E(Jc^Ojgun=ou`%;2Z0Sm;f0y^v_Rj+w;zp;wTVSFb zJqK`5dd?lFcN(3pYXNWJ;k@iGAi-BuPQ9_G>UE|S^a414wvd83FQT1(Lz7K*ghW*4AaW?AEx6P70Z}_ls1N3oP0DvI(?M*r8)wz z=OjQaxc_+h+bLcZ9+E4tq7hTy_!UFEW5*H3K%z1Ti7zkCTs6dFbB7(D0RTr+tYOnU|xM+eP?QwsD_(}KW4aMFlI)TV|;0?u1|TK z`9*8EJ$aD&d>wv*D>BmbnR6-DOYk_F40+2;*RI+0-XWC0+_YssjB_=%V8N9lGbMi4 zZRp(>>CGLj4#&Pxj7a1lxOiZln?;AY_ky*00t`qzUMBr@G){8jM{61^Si4eP7Hy`Y z#n3(4cp^N0U=;XXe;7>#!-aqY`KJu^>amVHOCR-)FW`z4UvEc5whyh5gDegQQRk_MZa}^e+;IRdw0vxd{67jQLm781){nv zyL5cIQ2WWLV3tX%M2m3ARMh#ABzYguiH}K;gV45X*Q@D|G9i}mYuEQ4?Q#zjcGhGg zZM740)CwFYcGEOICrH(JseX+*88Dj4WCSWy9iD?2Vq@Bx^Q{sv3j7C^av#CB?sttj zwQHkF>)S~`P}XxI-%Z>)@bWgTV%ct#c;z{5hFpm{j`GYdo>Sb4%qQw}Dohk>Re}G2 zN9hoF;M*@3SXHf42iJbr@ss8fK9IfHqQVi}1eoI>3kAYDUwQ1@kc9Bt5z|cwrNFD9 zq2cw1J$`rA3s#@&Gq+c9u~)`kR}3WLo{<|%z;?!9?p~OJks~hYsBV6&LZ~@Rc}QHB zo})wuZ1RaZGMnYxH@(2L>>)^gh3b330}>|pH7Da=g)s7ae*qF>Ye1_$e3j>&RQqig z$-(E97@_hN)J{1Tba%;<8n?~u{--CajPw5~z5S;KVmW?h@Jmb@BDDLCe5|Hxco6V= dNDl&oXS-Yb`7PEI@KrG+MOjsuQYn*<{|BpFAD{pL literal 8425 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[icon-note.gif](public_sys-resources/icon-caution.gif) **CAUTION**
    + >This command will reset the local workspace and delete files or directories that are not managed by gitee. Exercise caution when performing this operation. + ```shell + repo forall -c 'git reset --hard;git clean -fdx' + ``` + + 4. Run the prebuilts script to install the compiler and binary tool. + + ```shell + bash build/prebuilts_download.sh + ``` + + diff --git a/en/device-dev/faqs/faqs-startup.md b/en/device-dev/faqs/faqs-startup.md index a74cda50e9..a9a319ce0f 100644 --- a/en/device-dev/faqs/faqs-startup.md +++ b/en/device-dev/faqs/faqs-startup.md @@ -148,7 +148,7 @@ Improper caps configuration leads to a configuration error. The error informatio [ 4.620014] [pid=1 0][Init][ERROR][init_service_manager.c:818]GetServiceSecon secon section not found, skip [ 4.620216] [pid=1 0][Init][ERROR][init_service_manager.c:818]GetServiceSecon secon section not found, skip [ 4.620608] [pid=1 0][Init][ERROR][init_capability.c:119]service=mmi_uinput_service not support caps = CAP_DC_OVERRIDE caps 41 -``` + ``` **Possible Cause** 1. The caps configuration is not supported by the kernel. @@ -191,6 +191,42 @@ None. Enter the hdc shell mode on the device. Then, run the **sandbox -s service_name** command to move the current service to the sandbox, and run shell commands such as **ls** to view the sandbox directory. For details, see the [sandbox command description](../subsystems/subsys-boot-init-plugin.md). +### Timestamp in the Ready Phase of Some Bootevent Events Is 0 + +**Symptom** + +In manual bootevent mode, after device startup is completed and the **dump_service all bootevent** command is executed, the timestamps in the ready phase of some events are 0. + +**Possible Cause** + +1. The service does not send the bootevent event. +2. The service sends the bootevent event, but does not have the related permission. + +**Solution** + +1. For case 1, make sure the related service sends the bootevent in the code. +2. For case 2, make sure the service has the permission to set the bootevent parameter. + +### Failed to Boot from Partition A/B + +**Symptom** + +After the image is burnt, the system cannot be started, and information similar to the following can be found in the serial port log: + +``` +wait for file:/dev/block/platform/fe310000.sdhci/by-name/system_b failed after 5 second. +Mount /dev/block/platform/fe310000.sdhci/by-name/system_b to /usr failed 2 +``` + +**Possible Cause** + +As indicated by the log, partition B is used as the boot partition. However, it is not found during startup, resulting in the startup failure. This issue occurs because the active slot value in the misc partition is set to 2 (partition B), but partition B is not burnt. + +**Solution** + +1. Clear the misc partition by burning the corresponding partition with an empty misc image, erase the active slot value, and restart the system from the default partition. +2. Burn the **system_b** and **vendor_b** images to the development board by using the partition table configured with partition B. Then, the development board can boot from partition B. + ## Application Spawning ### Failed to Start appspawn @@ -221,11 +257,15 @@ Applications fail to be started by running the cold start command. 1. Cold start is not enabled. 2. The parameter of the cold start command is incorrect. +3. The socket request times out. +4. SELinux is enabled. **Solution** -1. For case 1, run **param get appspawn.cold.boot** to check the cold start switch and run **param set appspawn.cold.boot true** to enable cold start. +1. For case 1, run **param get startup.appspawn.cold.boot** to check the cold start switch and run **param set startup.appspawn.cold.boot 1** to enable cold start. 2. For case 2, correct the parameter of the cold start command. +3. For case 3, run the **param set persist.appspawn.client.timeout 5** command to set the timeout period to 5. +4. For case 4, run the **setenforce 0** command to disable SELinux. ### Failed to Create the Application Sandbox diff --git a/en/device-dev/guide/device-camera-control-example.md b/en/device-dev/guide/device-camera-control-example.md index dbe3e57443..6507f3def8 100644 --- a/en/device-dev/guide/device-camera-control-example.md +++ b/en/device-dev/guide/device-camera-control-example.md @@ -1,64 +1,64 @@ # Use Case
    -This use case takes **camera\_sample** \(contained in the source code\) as an example for photographing, recording, and previewing on the development board. +This use case takes **camera\_sample** \(contained in the source code\) as an example for photographing, recording, and previewing on the development board. -- You can obtain source code of the sample from **applications/sample/camera/media/camera\_sample.cpp**. -- Before running the sample camera, you need to compile, burn, and run the image. For details, see [Hi3516 Development Board](../quick-start/quickstart-lite-introduction-hi3516#section26131214194212). +- You can obtain source code of the sample from **applications/sample/camera/media/camera\_sample.cpp**. +- Before running the sample camera, you need to compile, burn, and run the image. For details, see [Quick Start Overview](../quick-start/quickstart-overview.md). >![](../public_sys-resources/icon-note.gif) **NOTE**
    - >After the development board is started, the home screen is loaded and displayed above the media layer by default. To prevent covering **camera\_sample**, you should remove the home screen during compilation or packaging. - >How to Remove: In **build/lite/components/applications.json**, comment out or delete the **//applications/sample/camera/launcher:launcher\_hap** line from the **target** field of **camera\_sample\_app**. + >After the development board is started, the home screen is loaded and displayed above the media layer by default. To prevent covering **camera\_sample**, you should remove the home screen during compilation or packaging. + >How to Remove: In **build/lite/components/applications.json**, comment out or delete the **//applications/sample/camera/launcher:launcher\_hap** line from the **target** field of **camera\_sample\_app**. -- The compilation result of the sample code is stored in **out/hi3516dv300/ipcamera\_hi3516dv300\_liteos/dev\_tools/bin**. To ensure that the code can be executed on the development board, you can copy the file to a TF card through a card reader, or modify the compilation script of **camera\_sample** to copy the compilation result to **rootfs.img**. +- The compilation result of the sample code is stored in **out/hi3516dv300/ipcamera\_hi3516dv300\_liteos/dev\_tools/bin**. To ensure that the code can be executed on the development board, you can copy the file to a TF card through a card reader, or modify the compilation script of **camera\_sample** to copy the compilation result to **rootfs.img**. - Modify the first **output\_dir** in the source code path **applications/sample/camera/media/BUILD.gn**. + Modify the first **output\_dir** in the source code path **applications/sample/camera/media/BUILD.gn**. - - Before: **output\_dir = "$root\_out\_dir/dev\_ools"** - - After: **output\_dir = "$root\_out\_dir/"** + - Before: **output\_dir = "$root\_out\_dir/dev\_ools"** + - After: **output\_dir = "$root\_out\_dir/"** - Recompile the source code repository and burn the code into the development board. Then you can find the **camera\_sample** file in the **bin** directory of the board. + Recompile the source code repository and burn the code into the development board. Then you can find the **camera\_sample** file in the **bin** directory of the board. >![](../public_sys-resources/icon-notice.gif) **NOTICE**
    - >You should insert a TF card \(up to 128 GB supported\) for photographing and video recording before system startup. This way, the TF card will be automatically mounted to the **/sdcard** directory. If you insert the TF card after the system is started, you have to manually mount the TF card. + >You should insert a TF card \(up to 128 GB supported\) for photographing and video recording before system startup. This way, the TF card will be automatically mounted to the **/sdcard** directory. If you insert the TF card after the system is started, you have to manually mount the TF card. >To view the photos and videos in the TF card, copy them to a computer. If you just want to preview photos and videos, you do not need to insert a TF card. - Perform the following steps to run the sample: -1. Run the **cd** command to go to the end path of the executable program and start **camera\_sample** by running the command in the following figure. +1. Run the **cd** command to go to the end path of the executable program and start **camera\_sample** by running the command in the following figure. - **Figure 1** Starting camera\_sample + **Figure 1** Starting camera\_sample ![](figures/starting-camera_sample.png "starting-camera_sample") - The control commands are displayed as shown in the preceding figure. Press **S** to stop the current operation \(including video recording and preview\), and press **Q** to exit the program. + The control commands are displayed as shown in the preceding figure. Press **S** to stop the current operation \(including video recording and preview\), and press **Q** to exit the program. -2. Press **1** to take a photo in JPG format. The photo is saved in the **/sdcard** directory and named **Capture\***. +2. Press **1** to take a photo in JPG format. The photo is saved in the **/sdcard** directory and named **Capture\***. - **Figure 2** Serial port logs displayed after the photographing command is executed + **Figure 2** Serial port logs displayed after the photographing command is executed ![](figures/serial-port-logs-displayed-after-the-photographing-command-is-executed.png "serial-port-logs-displayed-after-the-photographing-command-is-executed") To view the saved file, exit the program and enter the file system. To start the program again, return to the previous step. - **Figure 3** Saved files + **Figure 3** Saved files ![](figures/saved-files.png "saved-files") -3. Press **2** to start recording. The video file is in MP4 format and saved in the **/sdcard** directory with the name **Record\***. Press **S** to stop recording. +3. Press **2** to start recording. The video file is in MP4 format and saved in the **/sdcard** directory with the name **Record\***. Press **S** to stop recording. - **Figure 4** Serial port logs displayed after the recording command is executed + **Figure 4** Serial port logs displayed after the recording command is executed ![](figures/serial-port-logs-displayed-after-the-recording-command-is-executed.png "serial-port-logs-displayed-after-the-recording-command-is-executed") -4. Press **3** to start preview. The preview is displayed on the screen. Press **S** to stop preview. +4. Press **3** to start preview. The preview is displayed on the screen. Press **S** to stop preview. - **Figure 5** Serial port logs displayed after the preview command is executed + **Figure 5** Serial port logs displayed after the preview command is executed ![](figures/serial-port-logs-displayed-after-the-preview-command-is-executed.png "serial-port-logs-displayed-after-the-preview-command-is-executed") The following figure shows the preview. - **Figure 6** Preview effect + **Figure 6** Preview effect ![](figures/preview-effect.jpg "preview-effect") -5. Press **Q** to exit. +5. Press **Q** to exit. - **Figure 7** Serial port logs displayed after the exit command is executed + **Figure 7** Serial port logs displayed after the exit command is executed ![](figures/serial-port-logs-displayed-after-the-exit-command-is-executed.png "serial-port-logs-displayed-after-the-exit-command-is-executed") diff --git a/en/device-dev/guide/device-camera-visual-run.md b/en/device-dev/guide/device-camera-visual-run.md index fd583adfc2..2d2d4a3de1 100644 --- a/en/device-dev/guide/device-camera-visual-run.md +++ b/en/device-dev/guide/device-camera-visual-run.md @@ -1,8 +1,8 @@ # Running on the Device -Before you install the application and run it on the development board, install the DevEco Device Tool by following operations provided in [HUAWEI DevEco Device Tool User Guide](https://device.harmonyos.com/en/docs/ide/user-guides/service_introduction-0000001050166905). Burn OpenHarmony into the development board, and run it on the board. For details about how to compile, burn, and run an image, see the [Hi3516 Development Board](../quick-start/Readme-EN.md). After the image is running normally and the system is started properly, perform the following steps to install or uninstall the application: +Before you install the application and run it on the development board, install the DevEco Device Tool by following operations provided in [HUAWEI DevEco Device Tool User Guide](https://device.harmonyos.com/en/docs/ide/user-guides/service_introduction-0000001050166905). Burn OpenHarmony into the development board, and run it on the board. For details about how to compile, burn, and run an image, see the [Quick Start Overview](../quick-start/quickstart-overview.md). After the image is running normally and the system is started properly, perform the following steps to install or uninstall the application: -1. Store the compiled unsigned application installation package and installation tool in an SD card and insert the SD card into the development board slot. The installation tool is in **dev\_tools** of the directory where the image file is generated. +1. Store the compiled unsigned application installation package and installation tool in an SD card and insert the SD card into the development board slot. The installation tool is in **dev\_tools** of the directory where the image file is generated. 2. Run the following command to disable signature verification, which is enabled by default for application installation: ``` @@ -15,11 +15,11 @@ Before you install the application and run it on the development board, install ./sdcard/dev_tools/bin/bm install -p /sdcard/airquality.hap ``` - The **dev\_tools** directory stores the installation tool, and **airquality.hap** is the application installation package. Replace it with actual the package name. + The **dev\_tools** directory stores the installation tool, and **airquality.hap** is the application installation package. Replace it with actual the package name. 4. After the application is installed, touch the application icon on the home screen to enter the application. - **Figure 1** Home screen + **Figure 1** Home screen ![](figures/home-screen.png "home-screen") 5. \(Optional\) Uninstall the application. diff --git a/en/device-dev/guide/device-outerdriver-demo.md b/en/device-dev/guide/device-outerdriver-demo.md index 3fc094240b..5ff943c22f 100644 --- a/en/device-dev/guide/device-outerdriver-demo.md +++ b/en/device-dev/guide/device-outerdriver-demo.md @@ -20,13 +20,13 @@ The input driver model mainly consists of the device manager, common drivers, an In addition, the input driver model implements functions for reporting input data and parsing input device configurations. -For details about the input driver model, see [Touchscreen Overview](../driver/driver-peripherals-touch-des.md#section175431838101617). +For details about the input driver model, see [Touchscreen Overview](../driver/driver-peripherals-touch-des.md). ## Setting Up the Environment Follow the instructions in [Quick Start Overview](../quick-start/quickstart-overview.md). ->![](../public_sys-resources/icon-notice.gif) **NOTICE:** +>![](../public_sys-resources/icon-notice.gif) **NOTICE** >This development example applies to standard, small, and mini OpenHarmony systems. The following sections use the standard system as an example. You can refer to the specific guide for your system to set up the environment. ## Developing a Touchscreen Driver @@ -37,9 +37,9 @@ Complete the following tasks to adapt a touchscreen IC based on the input driver Configure the touchscreen driver description required for registering the driver with the HDF, for example, whether the driver is loaded and what is the loading priority. -You can configure the device driver description in the configuration file at **./drivers/adapter/khdf/linux/hcs/device\_info/device\_info.hcs**. +You can configure the device driver description in the configuration file at **./drivers/adapter/khdf/linux/hcs/device\_info/device\_info.hcs**. -The **device\_info.hcs** file contains all necessary information for registering drivers in the input driver model with the HDF. You do not need to make any modification for the information unless otherwise required in special scenarios. The private configuration data of each driver uses the **deviceMatchAttr** field to match the **match\_attr** field in the **input\_config.hcs** file. +The **device\_info.hcs** file contains all necessary information for registering drivers in the input driver model with the HDF. You do not need to make any modification for the information unless otherwise required in special scenarios. The private configuration data of each driver uses the **deviceMatchAttr** field to match the **match\_attr** field in the **input\_config.hcs** file. The input-related fields in the configuration file are as follows. For details about these fields, see [Driver Development](../driver/driver-hdf-development.md). @@ -91,21 +91,21 @@ Pay attention to the following fields in the configuration file: **preload**: specifies whether to load the driver. -**moduleName**: This value must be the same as the **moduleName** value in the driver entry structure. +**moduleName**: This value must be the same as the **moduleName** value in the driver entry structure. **serviceName**: This value is used by the HDF to create a device node name. -**deviceMatchAttr**: This value must be the same as the **match\_attr** value in the private configuration data. +**deviceMatchAttr**: This value must be the same as the **match\_attr** value in the private configuration data. -After the device descriptions are configured, the HDF matches the configuration with the code registered with the driver entry structure based on the **moduleName** field, ensuring that drivers can be loaded properly. If multiple drivers are configured, the **priority** field determines the loading sequence of each driver. +After the device descriptions are configured, the HDF matches the configuration with the code registered with the driver entry structure based on the **moduleName** field, ensuring that drivers can be loaded properly. If multiple drivers are configured, the **priority** field determines the loading sequence of each driver. ### Configuring the Touchscreen The private data includes the power-on and power-off sequence, and the platform hardware information includes the GPIO port that connects the touchscreen to the main board. -You can configure the touchscreen in the configuration file at **./drivers/adapter/khdf/linux/hcs/input/input\_config.hcs**. +You can configure the touchscreen in the configuration file at **./drivers/adapter/khdf/linux/hcs/input/input\_config.hcs**. -The **input\_config.hcs** file consists of the private configuration data of both the common driver and chip driver. Information of this file is read and parsed by the driver code. The configuration in the file includes the board-level hardware information and private configuration of the touchscreen. You can tailor the configuration during your development. +The **input\_config.hcs** file consists of the private configuration data of both the common driver and chip driver. Information of this file is read and parsed by the driver code. The configuration in the file includes the board-level hardware information and private configuration of the touchscreen. You can tailor the configuration during your development. ``` root { @@ -197,7 +197,7 @@ root { } ``` -In the example, **touchConfig** contains the **touch0** configuration, which describes the **boardConfig** and **chipConfig** configuration information. The **boardConfig** field provides the board-level hardware information of Hi3516D V300, and the **chipConfig** field provides the private configuration data of the touchscreen. To use another touchscreen, you can change the value of the **chipConfig** field. You can also configure multiple touchscreens for your product. In this example, **touch0** represents the hardware interface and chip configuration of the default touchscreen. If you need to configure a secondary touchscreen, add a **touch1** block parallel to **touch0**. +In the example, **touchConfig** contains the **touch0** configuration, which describes the **boardConfig** and **chipConfig** configuration information. The **boardConfig** field provides the board-level hardware information of Hi3516D V300, and the **chipConfig** field provides the private configuration data of the touchscreen. To use another touchscreen, you can change the value of the **chipConfig** field. You can also configure multiple touchscreens for your product. In this example, **touch0** represents the hardware interface and chip configuration of the default touchscreen. If you need to configure a secondary touchscreen, add a **touch1** block parallel to **touch0**. ### Adapting to the Private Drivers of the Touchscreen @@ -207,7 +207,7 @@ The input driver model consists of three parts of drivers. To develop a brand-ne 1. Implement differentiated APIs for the touchscreen to adapt to the input chip driver. - You can obtain the sample code at **./drivers/framework/model/input/driver/touchscreen/touch\_gt911.c**. + You can obtain the sample code at **./drivers/framework/model/input/driver/touchscreen/touch\_gt911.c**. ``` static struct TouchChipOps g_gt911ChipOps = { // IC options of the touchscreen @@ -267,7 +267,7 @@ The input driver model consists of three parts of drivers. To develop a brand-ne 2. Initialize the input chip driver and register the driver with the HDF. - You can obtain the sample code at **./drivers/framework/model/input/driver/touchscreen/touch\_gt911.c**. + You can obtain the sample code at **./drivers/framework/model/input/driver/touchscreen/touch\_gt911.c**. ``` static int32_t HdfGoodixChipInit(struct HdfDeviceObject *device) @@ -304,7 +304,7 @@ The input driver model consists of three parts of drivers. To develop a brand-ne 1. Compile the Makefile. - Open the file at **./drivers/adapter/khdf/linux/model/input/Makefile**. + Open the file at **./drivers/adapter/khdf/linux/model/input/Makefile**. Add the following content: @@ -313,7 +313,7 @@ The input driver model consists of three parts of drivers. To develop a brand-ne $(INPUT_ROOT_DIR)/touchscreen/touch_gt911.o ``` - **touch\_gt911.o** is the content added in this example. + **touch\_gt911.o** is the content added in this example. 2. Build source code and burn images. For details, see the related sections in [Quick Start Overview](../quick-start/quickstart-overview.md). diff --git a/en/device-dev/guide/device-wlan-led-control.md b/en/device-dev/guide/device-wlan-led-control.md index 03613ab721..22535b4011 100644 --- a/en/device-dev/guide/device-wlan-led-control.md +++ b/en/device-dev/guide/device-wlan-led-control.md @@ -16,7 +16,7 @@ Based on the Hi3861 platform, the OpenHarmony WLAN module provides abundant peri #define LED_TEST_GPIO 9 ``` - >![](../public_sys-resources/icon-note.gif) **NOTE:** + >![](../public_sys-resources/icon-note.gif) **NOTE** > >For details about the schematic diagram of the development board, contact the Hi3861 customer service personnel. diff --git a/en/device-dev/kernel/Readme-EN.md b/en/device-dev/kernel/Readme-EN.md index 0dcbb0d34e..243ae9fb87 100644 --- a/en/device-dev/kernel/Readme-EN.md +++ b/en/device-dev/kernel/Readme-EN.md @@ -1,4 +1,4 @@ -# Kernel +# Kernel - Kernel - [Kernel Overview](kernel-overview.md) @@ -13,7 +13,7 @@ - [Mutex](kernel-mini-basic-ipc-mutex.md) - [Queue](kernel-mini-basic-ipc-queue.md) - [Semaphore](kernel-mini-basic-ipc-sem.md) - - [Time Management](kernel-basic-mini-time.md) + - [Time Management](kernel-mini-basic-time.md) - [Software Timer](kernel-mini-basic-soft.md) - [Doubly Linked List](kernel-mini-basic-list.md) - Extended Components @@ -65,6 +65,7 @@ - [Virtual File System](kernel-small-bundles-fs-virtual.md) - [Supported File Systems](kernel-small-bundles-fs-support.md) - [File System Adaptation](kernel-small-bundles-fs-new.md) + - [Plimitsfs](kernel-small-plimits.md) - Debugging and Tools - Shell - [Introduction to the Shell](kernel-small-debug-shell-overview.md) diff --git a/en/device-dev/kernel/figures/create_delete_plimits.png b/en/device-dev/kernel/figures/create_delete_plimits.png new file mode 100644 index 0000000000000000000000000000000000000000..6c338727abdc94c6b388acd38e5c867706d528b3 GIT binary patch literal 58087 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 z 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 literal 0 HcmV?d00001 diff --git a/en/device-dev/kernel/figures/memory_limiter.png b/en/device-dev/kernel/figures/memory_limiter.png new file mode 100644 index 0000000000000000000000000000000000000000..032eab63bf16c1cf97deec94adfae287698d8220 GIT binary patch literal 84103 zcmdSBWk6K%w>Byw4bmyy-7TR*H^R`}T@r#c(o)hOH6Y!MbR%8TN_Th1y9fX0ocG-O z>3+N)V9zjnezATlp0(Dq2~$>-LPI7(e(~Z3nvAr#%8M7UDKB2U^hAUQ{$f?C_6E4X zIIBp3UX+ax?*MOJS-e+x|KdeuG|IgZ9Pl2=QCiFS#f#V7&>xrtrq{qXo^oZx--F%t z_x~d3Vq1_Q9A~NpGtY_PARrcmW@k5av|KGVSx+@;*wkuYl{C4w9JW}bH+%s9u?6GA zM>6|co{5b94SFRG_jTafcWJbxU-;8cT~>zvQ48EyF7iMO5F!Qe>tj3m1Pk;9^xbLZ zhhNnHc^zv)Z;JKr9>jhQ98RSF+_X-BobumaMh%kx&n*-J!FlY!EwL=+tBWfqd!~Us zZE>=Q{e;2uK_ABDvDM+NRe&L4nnOXfz=io{Pm;TCDNI8AWsuyd>kd9kgksd^CZ%86?3AA}Rx@sTg1RLxoZO@`eP zX~JYK^-**3=Wnuwd41#cUL~UW%kWqH_O+i4M9uYdXmvd z6UEV5@0~Q4dgU2^1y{j3GBdu&N$;MzLh3k<9?)Ov(V&}NRxaltAihMn^z@4CRz#%u zkp+1^I1SIw?jmkUI-wi~^55(QeR!l$=h^Wu!eK=a@|TakDmj|8&ZfC__DdTjC40VQ z|B36MZxb!4x4F71XBHY8wA8CFakd}`TXCVtf2|JTt$31L9^rPuN!=XjP≦6v`+% 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 LlNYTNHt_!+!uO#& literal 0 HcmV?d00001 diff --git a/en/device-dev/kernel/figures/newip-connections.png b/en/device-dev/kernel/figures/newip-connections.png index c4edde138f8cd92cfe8828a4467c49d0b3e5bf65..85aa191ccb599cfdc0a01c2750ccdc09cc345b0b 100644 GIT binary patch literal 11103 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

    4R%cvwJPc%u7M)B;~XqL z^^m`NP{wY^pXB%=+nd6bnKV*-z1pM%IVkg|@6*K4^t9HJtRLs$av(ja^s`UZ!&RzR zkI82+HKznHtktT-m4}CzUkXx~Ix{hec-{pyS4pi%GIOieUFv9ApuRkUI)LcJ<6Ykz z3L>Zktny5+sp%B~8kW_d(@(ek224W2AfqYH&aO0)@XTl%;k3?R>^m7jPGltgYmMcv zwOsU5S%wf9HjN)ax(r}mjt}&`@FTBo8JU$1ztW(O;g8|%Ttyuk3eMaP-sRRV?-^Zf z#Fb(5oZMfpvP7|?k2m15Lpnj4PPKz_^bmkJ{Ul5$@rHP=#p{T%r>BQ_1WFFl?8}Z6 z0ww|XS~vgx{YxktDa%ldt~eKGw~UsB*A?%|hO8#HPKlA~CCBr2<&soFcv(z@8+Hy0 zD}H|J4^AMmr#{|iRq#oS0Jxk9thK=VTUKLpQJ{}3#J|_?T%^+$I+T&5Sy8UsYogLV?sjhAw>^#flcBQ9GJPv1%=JVNBvig zZjv1Fzz>ce1T?)9(0CU#KP!e5^4H&dd8g!ic^J$|^yg4!-&Bo;iN(*`RxFT9cF{}E z;pWLdGXXo$WgVXDX?Aj<=at4s+y7XDk;7ntuLH0`?mjFb_5DI+EyxKRu^UY+Mr85v zNy_?5d*jDg+rRpi%`4wQy z(*f#3@+PZ>Y2Rg`eB5_Tsb)_#$;nl9hsZD@7ObnA77OJ`m)ve-jI)u&(ngRxz=(E+ zdFn=J5o#T3GC=Nf@^)VERBAHIW@YZYNT8UjSnG`W9eO=c8 diff --git a/en/device-dev/kernel/figures/newip-development.png b/en/device-dev/kernel/figures/newip-development.png index e5e2b90263058fc847a711b3acffe627e94081f4..fd84b4e7a853822ec61d3dc8a25d18f8417de44e 100644 GIT binary patch literal 187332 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

    M2x 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%0DQ+sd7YfA@5 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∨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

    b|Txd#M+6|rA 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 z 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 diff --git a/en/device-dev/kernel/figures/newip-header.png b/en/device-dev/kernel/figures/newip-header.png index 9190bb298de56b73f98ffd142af014ded382c07b..828c8b843715fa85f918a65abe042cebc7922140 100644 GIT binary patch literal 23206 zcmce-Wl)_>6edV;m*DR1?hxEvg2Tn(;_d`@4X(iwA;IIpgMon|$w-TK+DX>u`F= zM-VWVhH|4S;mESF`D^a6Hm2kZTtokKq9%088?;Ws1+}>S=^rYc7<9Cy+O+yLo%V(? zBa&>yBjf2iPG54<-8a12hS3!K40EqK*{9lXIw$xq#xHzxJU3?45Wb0nK9M&$K60O5 z;QL6VK#xLYM5q6n1ONXui%PJD9}F{ca&mm)!a<)}FC<5LsqzGJGBPsN(j^`8R70zu z(zK7-B(qx<0n+4M!U+HKk2KJ{pgv?F#_|94{XfxETNhL9wJjVi(E05xBi&k(I8?9d z$WIFQmr7Xd_zaSQ!j$m3I(mLpx;gt!<7l|z)iVxV#{cHVFzj)qt_otJ)$`oBy)Y>X z#_`fPQb4j0ZFe2s%ggK92=R}3&=z3|?8G8&@XV1}C`+Af=y}cwT1si#*H7(eP6&72;0`^pSYAQYF_@^URKa-=+#De$bk&=hl`|Z!E z1?=!doe?d|c$zwiZDQnA+BER%tu*k9_jQaUEhmW$uNvIZ4K1-8{nnj)&X-87Ha(&@ zQz_!mj&Lwx8+4HF3j7_r|8V)}a`qIWo>9-E(dUQM)>DWRXa$iL`H8uon5QLI zfqgi+-;Df0oDHa?^`aWWoXLPtes%y0vITQKAV#Zh5I!EgG5cAMK~yKo7A7NdopW*d zcV*~0tcQR;dz&Fs^xGqGrt%9-MfT9SzeZ z)J&!5NsA#(6WqCpD3yBjHpa*r5Qm(zigxc!IDXmyE9LyEDpu(8Tr}3*+be3p5|YsA zK%pfFj<9OeyTMDSte*uYrj8-Ro=Nu6vy3$u9>oJ2rqo*CDIsRX8;Z$qG}*(R_K{G; zp*Y%00%O9{+OoTq(kK1F^pz-Z6X?-hFzEG)UMvV-xV0RceRwdhjOU${5jj5;SNOtw zHe*rlRyW@CN6%DEJj_v)0-g$Y4A|hT)#n>{wgun4F<-iJ5 ztDr+eBkjDrzaL6iCddG4JUCoQgZcRSqB&4#mcR)Rm4GXf3UOjd1+#7LI{o~TAimt# z7Sr87pT3+VoIE5BrH&!Gm>VGF|2=J3tzQ1OW>|XsNjZ>z=P>$W%lA>|SxBQx)wPfq zPa33n$U(*P!!BoZ3xuwk^+ABkg_sPRyP;M zp#Mp<74SjB(MS-Qy|T!pfzhsCF=OllmS6B-q|?Utxb{%2M-xA)FyoQL+}qbzrIy(psoyrt3lPtLGs@Y-wi!1#>r&K-eE4Jb|$53nKg7Vrjd?k4YTGkx4l`14O zZ$b_F+RKZHSasT-F>3uYm5{9(!rcl==tyEV51qUQAxbx26Uy`><*aC03H|BW8GGna z*k0lR`?&x*(1yySSqVe6z=y>L08@^C_JhpHvo)#XGJWX_5#dA#OiQagrR=Z{_ie2BKVO3FFm7?X(6{Znue+2sCGo1MHOQ zlMqG#sn*-w(xaCvEZ4(B&zdl^97@b44}32EGYOjur}>0VplyQg^wB@4GWnzyA1t4s zru?_ssv4%ZDfpm;aMUADYS-F?5|zA$Ulr|0DI!7JVOzClB*pw@Z^nt)Wh%5!L@L|H zs&$wvjkcMr%P9$R=R5E0&gpP?_qyR*{oc|M%K>>sKGUEe7LB~aTO`|0Ld_~UhqAua zwTq)_7YvY6C+1l|r&@9rC4P;Kci1u=_G)h9hjTVhZIR06IlLwKI!}BNwzaht4e%gu zp5>)E3 zmMC>Y_wwXxEnejS5|<+ytYU5VlW>>ZhvuU$?B%0RyZW4^r4AAgl@E|$nQ*=96*-ek zA>sbE>~^}eI@{rNL+=s6?D=l`U5(#UT+J>6FHmB|K9l{`apV!vc+NYGBS3AUJO)PH z(u$wIR4u{77(rlF!^@4)Miv7(Y$3#1|4Lp{O$#=2XTSe+{iof4R8PIUjAyho?U#cS|`GUSRQcx&CS>x>r z_RY4pLzVt+Tff%wzVv<&cF7Og_u!*lw~-6kWZX3QXZFCbK@r+oKv&pM7pD03prhFc z^;|!hp{iKW`dO!{IYbOK7U9oK{}U!aKotMQL-AeGdtDI)DeFpR)SO^)p8vtsDppA{ zrkCcdng?vD={~UGvh{VXVn(o(?)kMDL#_)yypkEG{kIO3h%$3RwVKHgsci4B{B*!KnsD1E}yeK>Jhi`ZB(0aPAGBDU|9apnWH3@o;+z7n?) zm{>RDSSF`3{eBW9=7feJ+i#lut7wp%wHo~wU{Yf`!B7UL%FfU;nr_R^Cy3K#G~CaR z!`+LYF4Q&R%~ClAp5^h^;Ll>i%-}pRpk{wI$hzf0{c&no+G9b5=hTomXZJbZ53{D6 zY{R?UN)vOzauy9hntN8ZVDSyB*D#Hlq#HX&u`=zu1um7Fj~_Z?f+~)C zR#0|F(>8e+Q`$DYKa)WA^zluQG^=$?UY#6351l&t_C9qK+-E57q4ea@&0(@aQN5aV zxQJcqPmZl4a|Mi$W#Wuc!RDSAB5Qk?SF6GgsPUGL4e7^PdL2_Mi&__4u%_%4MU-cU z%e5#@O!K@5GknCP40@P+iDV{N;1X6N^D0oI3u^H3uFrmwb7o);zjGt!aIGKBxoGpk zI@)g2U?{rEyqmk5c!RucXZ1()dT`MT!?@5YHnP6J_SsoTfTHh}`%`qWhTH>`R>E;W z1|xLu*b=sZufCCRH%d*bNYVyek@fAMhZMUf13f!Wtb343a4{Dj!5ORT6eYzuUPNf? zrcZP>3pL%>jY+u2v$ljsyC;#fI0T8cbCE6FltK>k*xi{nNxK98jBZawihSMjtzp3#EvH* zf2q2(iJtc>X@bN|cTMYL(^t$&0+e3HsQY+D;rNK}Bs{ObB7GD^&v%rdwwy-(Ih5!0 z!BD(ofHS3v-^fo^{XfTx|gaN)w;%tO}*gBFtN-szi;&Y3|S8@N0TcoUGoy z;Avn3r)tN}8V+uoqJ&v%FD}kty_7N6`CLb|iXU%CsT;R1Dr8vB7BQKqmK@Mr*;8oW zU!}JUFNF=kne^KVRAyia6e=p!Dt&zzWcl1BOBV0)o{q?`4y2e0Or53n>a90ZL~pc7 zyd+*3P_6bJECNJg4>@;089-1j6j{vcJ43ZqGALb;&coUJOdBvFMPmOqH*e>`pWfx> z=H`B0prN6eX;xZ03&_Xz6|^nw(TZQ>ETJ|z^?&9?PsQSYWlQI-ypuS}5Zk|t!@7Lz z1fU)hZKT-mUwz~hkHnGCWx>0EvX+>axSXw?f)W;P*7y?C1kIi7q2|O#X$udU^^Nw- z(8zs6m67shfh6fJ!{VgQS4*-{xFCWVgs*)oF{^QorF*+dPF5}*0LDB;L+l2#deiapJUUvNS5<`e8;EuNRa&xKeS$7D)q zi!E!V1bb>j95t$6<gYgwS6kJsa^?{Z+S!A?`$wwF0V{*NOQux=pbBynuO>YOo*0^! z?zZrk8@~p;RZ9qGO{jv+S4Q$wC1XwOngaebs*%0<5RWbOsb1R+{eBY>Z68 z8Pc9Od!@?L(Cn;*5e>j?R$AUrPS#Q@;1bSa_y%KZkD_iSbxz#F;guTi{86v~=~_h7 z08->|92H#}&Ym=@OQvYS?nMbq(^_waRvlH&kf!P*)?~M&cuPw%8P}XSisw$J#9C@$ z7=QM!?~~1Gua@~uQ6jPM80*z3YH`Y}Ni{#epmo5-&F-165QydgYRFW7jUCz~pk0S= zP(br~?K;5&Rev6ysULAKi|;&H8=qz1OfQf82#3$`IHFc1B30~MK;C&*z(4H&r)?{R z;Mg8anrU@(XA)oFLwY{mubi@^2;G=cG#iB9hlfVHaOO=%I&F4gN$O|C$yl%||A$bv zyPgB|#y;!t3_V(q_BbbL=|}_c)byKp(z?llzf<)X!F9h#S7{E$VQpCZjz?T-cj19i ze8IsiG`lS|gssCEW4RSSZuney_~GBmb=d_tH(Zg6bKhhFP=5hGTq;Ir-o(SuhBZE1 zOMeRm{6&uqJT#T}7IMgz=pWRG*Y>;mZRwFtMNwuh_0vzb0_=cX`3o%Q7I$eyfWqp? zw=61XHrDbQDH=4Do+7V&tKx-@{E$Yfi;jnWa~*}!xid>rWQkxlIv<=pcwE-OhXz5>0XEvwt6DV>ECROU zNM90*wWAF3QjEj$y5M&BeZ+mKxsySXhm1Xp#oC;v!7)WNG!?+zrvHk$4nTVJ(2_JZ zN}*Y`RL(wU0aCE0PJ-2!YpxR>x&@m8szCrWk8DIxJo{0|-#SshQvINumP56$Xazi< z70W?={B$ZVW}H1I5@`1SrcC26DD6uZ+ zAg6Ic0In!P?{I)nlTl$~wwc?U38HJF62W9}{rmXu1fc_w!*U+(7{??f_=~k}Y^eXO zPJGnq#x8^4I5?jALp_p*0)EJ?rdHzEGGX8Ss(*8oz8r&i599{M6L`%065`^w=N`9O zHpL6UeCwYQ>8%bYIA*iH?gup%n35FHL=+K$%uau4b;ndy=`6H9p_?mstQF-FTq0S( z1>pCx{2yKKRJ2=J9GZgk#&1x(tZAQ4hz4@Q5n8MC42uR*W|3i1b2CI2a0AI^PVZs#(4;Ur+UbacjU#A5Zy@Xh!|3iX;`4gxZ+9W~tE7Xrl%OpJr`s;__x0J6eBdrph(JotqTus)oK!N`rcS zZh_$&0{;hrvHU)*MCS3DK{>Y+XaQ_2!)T;Xq`P>(22|C? z`Evp}8t~$n-a;nB+PWQ8!<9jPtGlqm@Yi+z{xU|of@UO;p+fn_=6CBNX!aB^F8WsxIC8US2UlK z%UaT;@bIKSkyvSmhj)ZVv3rAPPeAr|JbJ3oXsQ8d^L zehjHq8B*iSjZA(OyVsFqWx?nNIhogYmf;!xDotl@Jy?Mt?B{^E#3BFykl;z9uga8k zbW%|2^L^fE&u-k#maeeD_0VV$Z!=6V*i`|zwL*Ewm6NYEBi|52MTNQVjTb86nra;z zhjl*q1Miv!6hG8H#cHwP2rB?iZEO(#50Q&eqnQ}%yd|;Xr>H@i&PpH2B&z1wYC(qp z4?lljO)IN$V2X*mKe5fjDZPUG$ugE^Yh0Uy0=4>Y)W!>xr_M{AKZ^tVL;EuVzAclz zPOAk0MFJ52W1v#y7SHSWVp?`zp75xZO_UZ7203l8!p*;&=i$8k-X^P3$cJow-_`z| zz?Ep`?i!7HGrOHP0#k3l&Yjn37@T)(YF!~Am;=&yS z)i|u7z{>ltNsr6mg);5>IPTqAof;s?o>jwhMQ1i59`AI^@Z#kWmf^>o6zHzi&@1<|FSDk)Hi0>~P?b+y;W2oHGFC846 zd`D4A<-ueyN(5^=!8dAN+vHPVN%(D8CxiT=I{AKr(QE#A>Z}GIt-_LblTikhz zt#YUOah-cbSts>q-0^?>Wu4gec7WGOK^=9;%>@NCI4|n}pO2!5u3%;_q$o17e9>;> zU7sVa#v$dS6a)Q*iLs(p$OqP0Mp`jH3yQ^I&~AZ7ixETsdL)Q~0>%Hknb1qI)1An> zOh_Jg9KQBSm~x?%G-S{uZF8p=3&G7{67iC{%RhCo2Y`FMmm-TusqZ-V%$7U*b>BOzgzh({njy3Ey zJO~^sY1i2e`-RivlA^Hhi+;$>2!?^DK{V&ZFiac09IM3Fm*R<&T8vXqe`1uh7{@f-Rqv~g&Y3=p_or2yu znDM?olNfQj(C<-@oRj0y&>r$3BA zP8@QP9wUk&klm2^G$?i0!-8jvvFiGm00Aa(&IhyQ1xJ*%-x+wJhivSX&J)W{dhJFp5+OEtwR{DS>aJn|at={eFd0x??V9VP0O zQ$h>FA+*>FG5k*KV$9V+f+LQ@fbbQygj^@d0<%0<4-QFWePBh1Dqk$*C&t#ns@M8n zLOJ9QDURzM0+ns4Cc^Zxtw;n03ayl*C^2q~Np{-g56?931iXaCRSTz_PPEIs%ZR%t z+20xx^iHT{AOfC0^S#J zulBH|y2BK0V@Wne$`(48MI-LTPrluB!E)WU&toZsoaflaO5;o%;f^`)ihR&F1N^fB%iQ+q8ILv8;qRUgpg%u|6jA}f-#73s{-0d+mN4QVD$|IuR%KyR!Y34|dr*E>9 z`+WxpDI^?fk99oie)kb}g7uO|8Th*_UU)T&dK+3TdCs`o>g}oL&K$=1xo-cMEd0ce z=zxbXvk*tjSRebSxF|cxwFk_aJZD#%LvOTqUwT>Rl2g3cQS{@j>9XzW4(x!RteD%= z-+Z!AyZx+?!j_Mk1^=X*<1UA%l}&J@9?EV+^dx)rnuckSyPu_xDZCa_tl8Q27A+9w zXF|aY4MTF zlu~7H3Q>pO`FQ?E=y1iE!|&w)jp)xix@;v0+ar}%Q?gjra3Q9b55uPaq?1IF)j@RRt(+xjx%ULMmMfGhLr>EN?8DZgCR~T^Ol{{eTVs*1C z{D06j3L(py65?H|E^lMe-*fsiA1=j-D9Q3u3*t%KVdu`y0L(}e({E!(mm7ou{R~nK z^UL~aGacH4KJ52fvWw)obdbU;D82tYJO#4PotF!=ADFir=&{P2%4&@Pw-%(oHZ{lU#Z{N%|6Tpchl$zxM5;){XxaO3Ayn;WxtRZJ z`YM7D7ZTFTTYydG90I~Xug%mSLUS_toRgR~U--^GU26lWrV-ePsXjLsQ}dLiD%{Ss z*D8S^1~!ts8 zvKu}8AjG2aT&%xK=+on`K&@xy_gfFiQg6z|N25vbR|=#c<$bbg>vFet^zyxyjdHom zlTCObOmpM6*shxHCs^qE%w$0ivt&1P*1@0}o;ki(7&ZO<+<|zBvz#!(A^&brPN7t~ zbp+9G=tG>dv+Lt8-c;-bi#r2**UCJoJ>j|z6_?;s!}08iaATt#+e54=vgU)$!$la- z;R%;1uD(T6YNbJ3G^W*^FYC+Ga1n*ub5LXNz|(rG9fVW!cq^=>yNNCwV*}xh01$fN zdh}C6ZC}w8Wj(se_ps5u#U89oLy*6buxxxwc_qNoP~I$K{%3O|k_{!iJvHW3Bbxng z!FcTb9-Lr%8qzfZes9}3R7}ELUqMlhTge>&FNKZNZM`(X)9OdDvJ7mjvva;D8y>^d zkR7g*QI}TmUHqaH;{8y&C>05KD8BSpR1Mi5ac@xX<$xkmi^59{NN)+5G>TN6m7vev z=~>_r@SvMW(LWYkn>xF|)Kr{2Q6MQV8KRT>+-oX|^5A~w2^@3G#V&<~2%Ox&jg2Bj-!<7>Q+M6DM<7*x~_D}s$u>ugCcv)^VqEMak zL`^_U8g*L$LxvT^Wec{P_vEK9Gjmz!#?en=;R}isRE`e$Y~bYN?b(855L`}_Id`vV zuX?ontq9g&-1~;{Zno;U$GBI@$H$d1tvoVTzetnHW@`4%xazWTqG!|}h9YZ(aQ59% z!44FsQ?i^#x%FxmjX^TDy8dX+=!bY~xqCALY9S6pVF%^e3VYj*Mdb=9Eyr$>yV@Lo_)0TohEk2lhus2xD>;zwS8amac z0KUSyI9TY#nC!u}!uEy2A;wU&3OZ;O>lqV*6Hl z50HMpHfe(m00oHLvH*VO3xH`l{DH8^i}ACU`hSL34GHJV-as0ALK zShyldm0S@K+G2bC(G|B6m9hLisW&!H1FgL44M}26W^xy*`4njo-bI(`oD1SI1iK{u zY__|K%2V8bK>NHoI%8l;DJc%*XKs?P7-%g{$fcR_F?QV30me{o5gi6r!ozw`{KA8N z5^bL-`3F2YkGjHG*uBr&Li>6!%cSM8u`vx)#^nzLm$c%Y%4IVb}$g3I-z?*%u*5<1CSeOw_7-iP*TElPEekg5^3 zvG=dCU|(kOkba`#jqvf36{)zzkM*NAJXiGo)ujzzW`(XW{anIJy zF1@$ljsQEY=T{3P^U_spexZ@stcP>@kK|e#MsfCmsWaalYL=pRu7+@K8pub-PS&i3 zP1SWoSJ@^S_J8-`>oc?N7L za{Fumd9aq&13z3-tKKN+fN{mGC)Ev%vrEQ1Oyv(J5sDK7K-HsytDzhg{Tig98_jen z@sOn2pe#DH)B^dL)<#8*$WAo61^0oiki2GsX<}-j%+U2-Y)_3tL#;#?Xu~C}%%(1>VVx?J^X`PvA$h52(;tvRnT`Af zVtsAx8|Ajs^IODOu}MR9EhsgKMS3z%`LSP3k{DnLkLroB>7R}L>-=WOt_6GEyro5X zP5mMhdolJoR5Is*w7Hp7D6X#HvWmA+q83P|k4ho+QZUu7N1`5MeUqz|kF_o70)0{C zKog!8{{RStM$uPmr`HR!(u?iLQKvGTa@j)zJhk5)@IwoKl&;iarEBY3w5_u$o;3#AA-)<+2PA7+$-rxPL zwb$}B^;*3ED}oRq)?|;UCY^itDYnXC@PgOPYg%?NPvWQJ)?AOnc1(_-$6cjJ!`G(9lQBm+o;;VsZCQcRm-?WQ1c%eEpUsffNmpA61b{lgB%>X&U z!8gl%&UC$NUIiLgsITX{vD^A=OQ?rU4nsUY1+vK+J2g| z6W^2>*yS&&X;hM95OOoj*@imemTIz}sPWpeSZ2Lt=Q&#J24I`R1CGUCZP#Li1NV2k zh6-2(ry>725WOQ!empYz#Oe3E&3iXDx`XS%*aq62k0o3_Q**pR2{ZEt()aR(Yw<$Y z5yytU^QC+4R=3vBiQ1U1Exf@OXT>P$e~pAi^j3* z;PqE_5U&aW`o(?ca9L@qaMgygEKG5;elXzd#Zk=*8JIL$Qz11Hz0GleA=)J~a7~0< zs+tFX>}nAEm0fImZY=RcVXPllSW3cJa%TTWd=H0gQ3{18{FvHeXL^Xsj z8f!Z%ow_AMQbYf9_0e@JZJ_F+8;v~)qfFl~fzxui5rr_tN8`6J*tc>#Iu0C2|LtEu zCst65Hi*(wDn)|jF}8wC($Nuy8i+r^}<%C9rgywF;psE!{t$vzzv^XgN+P=c((s3ujj(-&Mua{sP7%uranCPdND+=1Qgth8Ur;0D2 z_}(IYseNWNR<{GgF(i~28DNRG^Pgw7N_rR;26Ys=>{iYKOiyB;8bq_~cuz3OZJj z?Y!L0@Zr!{JUOCMV_9XeCDfAn|Q2HN7IMrUAk_qeIL$(Z<{> zOcWm79vfE)_dn22_2ijr^DJlnDsy-t!tdYk{6sb>JPnl5?d33;;csf8Rh8>l(7-bt zHV119F*f>9sZ-S6dGRv?3lf@&wykH$6-s{w>T9RrVE;VGcmFJk%*sLi;bT2WhY5MB;9Q58*F@H>2QBF!`B<0#sx#0|NrVuB-c}*K zZr9;N3)0!XA-OBlQ%hx7$4i}8swxB8e3#6Lf+zn()1W-le^IT&?;=`X#H!7>7kzUV z$FVCalnGE=MFi>vu6_gbf=U|dKlUg~kKAacL+hR!i&RFdX{OW)Y?!D8l7J_6yDsDU z9OVXlg3H>OsqqJ7MV}XHyn_0_rL1~d?^I}2+Ws@Wq3*DACoY{8%huARwo_Wk;Hybx z{m*V@fGN5a891NfFjg)I+)7*1-YIo>VYw@#njdL!{bXY~tB4GOCUF~hJ^MQHOHvk{ z(WWnBrPWkiuQPQ6LKD#qa}0kJ)amn*QIdo~pw8mWe1A7p2&WinIow=$(&@kT`r8b? ztHwx)h+CuYZIKBA*qD$Y_1sR5;LX?X3Mj?Uw3U36?Pu^!T;`(UyJQ;OMO|Cx+M|Ek zHJ>r+*h=2F*X)WpkbH>}FazMf28ATUoniMgL-5TPDD;Sgj~wDS=SuGIM)*pEw#^BRA;5nj9C zL3;PHn);)G&RU9=z~uPxtD+3uek^HLNw}&~1<7FRLjqK7QmHhcDwS#KoSoegk+Z=r_9re6XpO0;v#_ z$0Ns_6FxhN$|IVBCXPlsll_v;d})}MCE|r{BWSQC46@XO-hItKpEFhg}?0>$=l|cV1cHyZUMjg&RbG32%)0-|`MM z^kwGtwhRdr_1c5HxCR}nxf4Y77vL%PTHukPc~zqi7Jf&7>?!=vwdLVbrkI$F30RnG zpi6BaR89io^??V8#DMVdT6C2Rgx9ET#rEK|bEVAo3KP^If(}+sxKHx}6=QpfPEcln z$CG-pA_aK3*pE$YzRuW>7V!m3lK(@IXdOVi&7aJd%6)ecksKw;x;;(u*4U;^p~t_s%-3k`qq6l@DEnGY^jj-SQpe z@*uyoSkXK$y%-K&NP8`wDwGh^J|M6zgvm~cK!DDF_P{EA1?Oy9=yDj zIw?WiD6$a1|GArg|MwL`FM2XAh3;Uu3_xp>u&AP8k6^MMja)2Z&lSBkRVOCvrCm|j zjL7w2lqw~e&6~@_=1BuWP1*HrI|KL95S9S<{YNBRj__!o)8jc@pTs&h=M%W7Vt)Zi zdjVAMM9`yIFCBqG!jNkb!N700uI)!(Pf&5LSzjoOjur8wgjsSJ$x}4I5go=q{f7o` z6%T7!UQh`;67`{DRG)gHq9Mvd3y1U(iH$ zwPo|T`6mW+o2Bn{5KvB_gI~<~0(j#+tGs{?^s|Yx15OR^R&B<_4`^jwNR^pF#sC8w zftzB^+x8V6max`tI+O%~H#-_cFaOrNnxX344HAdGI$SQHS?cBSw=-Mkuf}X?TW&f- za9miDiKe{kfQj|ut8aiyAp3+8Hw}!TvlYUw{*jD)3CE)QOrm(7cnb!VA zWlE^H6KWrzvIi#g;)q{c(UOG9@P3LXztI~h2X`f&{Tzg5I!|Dm`Mp1nbYY8yIm=M5 zmNxAoH}TVa)H(rj_4XH`JwMF>u7`}lO8$WnF`-7@wOZD(M1E!AH#QU#nZ)N(w%wtx zLb3xkJ?;oP#xWP-&2auF!>)cf-fjYmgvn#M`=GTo*1r+dnZME?$-OVf`EF8g-Gsmt z2BmvGXh?V5B5_qdGJq-z*~rCC{J6i?@;& zBo;Q|8=-*f`oO{BT^5(M7NQ>Q#O|1Eq2pgqS){XdN#pD( zhphBEOzM4J8nGVlkE9q79U0bl{;&bjzz(?Ga-PMpKkeduyY8UfS|z)NQguFIWM&Sn zyOgj@wzL*;Bagxt#z?LY0Gd%Ic^aqMy_j6f0EXz2;Nt467YPks(2JBwg(er+5dk@s z)lEyjIV>J1*2UVIbt0ESv_-NqE6IYFE)5~+>6jTv*J4Sp8oEvCTJEU87gaJbhv^xp zJ9&;9(JrnGcj?}o%V@8L`poN1Dglc+kqub6c?KTlIL75$mBLa7=MPq*h=RNuqfLKy zrd`HMFNdl)+H{fHA+I8TU88N2GT!O%3b(zec2oMS~_&d*`^jE5}I5 zEWV4>mYNbC!l$h!dy6+m6IvPj!6qMMHSJX8I>=!USB2o(?8blh={+DP2hAs_s?fTy zfyl8TVNpIDV`li1r)*rem_i6)dnz;gNQbNLLCX1gUmG`Zd)-pz8Y{-Uy6wcPh@+{@ zcQU_!({}6mP85)q?KuFr$OytY*(QV8GR@Kx{#w~+&QfO`dT#JS>R->+(w@hB%3j3- z(7z99myClkZXnhKoG|OiKcWg7-B>GLU%!`C8cju? zTbfh0`!`nNwCwA}o~Sd_^m;$`7p#q=4?pmt@-AOli01s67ewlC>Gj!H&S9XUj8s_+=u-lZs@fG zK8eFbWRg&QYhPH^l9sK7#RW-htw~^ao)gX_w3znQdcYcUKh>PIITh!w| z`8N9oF>n(0V)H)FgXcGd`9bvtdn~#RsDRn4uZ&mfTch=`5bL#Vf}4Ya{fdsJmXowj-Io;C`V=F>uk$`55B-&a?oj{P$! zd(j#HP>c55-)`l>Y8&DTlTaab;5?6G7P=hTrs=LOhZ;><4D&l;o86U;V^p)%~ciZamA{GM~MC4Lg%;%6r z2*`86b>6;ULIK>#5k1@lTL6Jt>UJRkhMYsmi*7wxh|xRBxjo`VGw3s#~UG+V**zA-D^WElHv)gntl#%mvc< z>o}gkVY79P+$*|umVRRKtM}+gAacVYVojj-o15iKGnHQPMv|N9>&+hbL;9r$O18T&kw6GYMV2G8Lj>|!#=J~`i0|)%ci8pUiFd-Hq;zIjeWE}5# zWUL(#)tckHIR}JsbmT_5ZHKlce4MPBonNhAqlvSk0eTIzIvf=dt;}^hL~A0dqg987 z+`GcFwM3}#2> zJ*dsDYctu=2S|z9(;^fn3hD{{MBbHbu^XXdW#^s*5tF>Dc9S>y>@ zURn`yB#7cukVvPri2uK8Ije^#)V&MqMg^4=kOmP%=?3XWN=iBg5DAANhwg3|kZy2@ zp@)VUx&)arONP@5Otu)^9zJJDPm>gY0XNqIr`_a^{s!bd$5@ zdpj*@c@j1SU|!#4yiAAf_vwkW$?5GU7R>biM$>-P`$+l}ycMv3b;~7h*ihke z|H{{zn-bYgtcEw(*<1fo#aZ=rE0-1RU7XF9=E&7@kp=(gNO341$K)tQ5{gYNsgcIU zCm*@pDa|+J%aZg=d)Dt^Lre{vPX)}=#NtTMY`NEQ;ya)UDkROYs=@yZW;ZzPmhF0@ zSEF3>b1kU#U%+ zNlppDgxcR2+9Ikn6ou|PRDmjntm@z@Ng&$j@Aq0~FPa}0h2QN)g0B=gnP?BMe z1D=R=9i!BZv+D$}Zjf$zxoF*N>2R&sjh{0iqmJa^5)hC-mOoK98)CvGZktJS>)T7Z zCO00(t?yiAGYtKnnX$qBIwKZ(9PdY_MMA54u=`51cJFacuIlu}4@&t?K89Vh_rOmS zFDso+r`+0g{Z!?nkwTGA{cM^b_~zE5)Xpj+pFbW!`}{5kCKcRo<+%>?KHbgty_9^8 zlvHbrw&Vf^X5Z;tUbUmB0bp(CKM3MK3wvfDO;QtV!177f)4SyoDb%Z8aWPxF0(tP+{lvLB2ChVC=?kzAjLj6#gDO0ncgcuBqYGG58aY*r`GqNl0CoBGfRb}wqRytQr zU09NZa_~m$%Cew?AR>`?GQ*LgR%9cXdzSRA_Y<)T4(WL2GYyQBL8q5=j1~T(#4st& zY7`OeA|vr(bd^Pg(+vVQ&$NnwxxsPuU`jF+|#MaDG zjOfSVrV)eHqK|-1G9@-#zzImZG^Eciqu2IpQ^=)h4j-$9S%Yi^{ zFs(3$n)9yn!mSSKXbR^)c(d?u;7ek`r-h)x{&!)N6pm>S_4)5?xa-WFSWYIB%7fb; z&SIq)?TwEj(E?wCYbk$&z03{`qbN_X+)T>VVE5TKma-I{v`OWk1NiWm)JJFciywCO zsob^ZsX6N|=Z(l=P30}x;2S1UFxBK)v#l;$TgY4amz8c=YhxKpkhR;IGDJ$S$UA7U z;)oPRxiimdz%ljv&na;CV@P-SJJAXas-#mel5^ym+Wzi#@TOJG+mDuX#0RN!aC6~} z>y-HRF+;ya3eg&m8zfis9gY+S-PV&P?_+^LBYF+>3x>zWQu_AZ_W)JjN$jr4y*5SW(ee?ugG&*OBg zJk21ahltPN1+!)QfAq*m``e*{!605+*U}nz^!1w`Hr{AVbKSgpu|8&nguw7>9J%ay ztqKug`T1VzKcKRY@i5ibXXZwCt_MXc>l&W6|1MATLwo2kgO*Lz5LWDF^h^syy30lP zb;1u!O%io%m*kbIh~MMc=77#B`q@oc+=JtBM3JmYwoX99xncXHd1DFKMG6I1!w17^uKcTGUwJN~ z@su*l)+c+mm2h%NO;*tBxz<;45(ckF9hiff5sPw5OmH)wMZ`zIQ^m$25p$@<`|54t z>F|r3e5%4_yP$A+JuD ztR-d$&}eM#3kE~fDXx@K#P7zIDlyM;k+&mn)M?ti`yPiYwnVmL#Ve@Bb_cXeKFV&6 z{UGgF4Y!?wO=5vBa7K_;!omi~P7x)&lM-mEMjvfZau|c~EFF~6a3x`=Oxe?LG0g{& zuJHALz;4Fq_FpATz^$cM^LI0ZAsZEr1`SK-Sm|MIwX=Hf^MVLCO9e+l0J) z#ZJ;J1ymPCL!%3Wn)~TqRB>xlk*Ai}?(Lym$MH)h8t{vY1RJyrpREcM$^$d(u_hY$ zAfCu?uEk+`!lj#`y~PO$tEfD1)`YwrRduCWKx0c+ySx}kIlneb-tJgkmuIVTk?D?} z2(W{ALc7y;2;9(quB)etU~!e_VeD3_<{a9tpql zX2?=wpA(6nRU6KsZt?i$a%%DBhO~2%qw@DrtM+xZEOm2$MUO0+7ij4T=aL^Kb4q24~eU9X6;6SGmdMWuRT?mo*OU06~b4m@5Ef~Ldc#du# zmbV3dfgT{yfq&3=T981ff%j#{*OiV1N!wRLRz(LVUI8K?QgycpKQD6Ff&gRxD)4MZ zqPMgULKaHvGEq1z!*@ZpPrMTFie2ee*@iwEXNkTi@3-zf%w7TVt2rep7*+mM_cIPR zp|tyXOELM{a-%v8{b7s!(}1dP=gZ|@qeD&)RHv5mFX@Uc^{oV!<7l%u2@Ocl-pQ$ z8uYmcJ04dMf|knw6jY^vZ8mQ^OJFM-soplWJI$}9<-*AsY6}XJ9Ukk+EX%nVb+3tu zP+mvGu;+%6Ar$ zQ~_kTdJZV$basQliUfbUV~i>(nIE_9Jv({}wOLL(wdm;IiBoQle85P5*zRb!Xbr1t zU28L)X^~cZQVA5ukgMUY1~<~C;B01Js+Z+Ak7R_?2Z^1BbHMOW#UY*a8$8zB_ge3T zSFu!V$RE(ZlDyq|Q3!D9BJ-uNmxojg|MqZAww|pMkL_9Wj%-?OSA|)?n(S9ZaTvx0 zRz|@F>OV7_Lr!MRwhp#q7B-d8w|00rUaCt}d5A#Fw96D^MEcQ?Pi_c-waiJjo-a?z zo5ch&M>#vms=JptEWI!eMPjsQ0^8k3V6T<{be6hWI%nxkW6C3H^81H-`#l>vW)9?0 zP}i58H(HN#%AQIVL9xtizJ$szSoIGzgy^$3;?}o|=Cmjf)o&Lddpo;&^f(3;!QMPT z68W!TJr5gO>&VK^Y)nTh3>9XDC|qd&#O9q_ZuJyS7-e=oaT{j$zj^Ny@^fyMA0NbTDHo2k zKltsv|KS@`+0`^u6OvVe?F{kQ-W=gCkNu5j2s{wcA$#2?N4;qDFuQBEL&aMHxAgl6 z{O)MU;Z@&agjBLlfIu!9&rw!w9YLD4d|6tO7pEy?;yCuI4rVa1T9O^+J6sw9BDOM{NuYg_Ib1RPx1F>Fc`N-kXLOreS+Y7np3qyw+H2IY-yR+8jI}rG^6C4hY z3w1gyKFWzFiX#s-&WqqGS;X~e1H`zT?3%4U%r4A<4t`kn>%}6*M#Z(IZb9XdcGj== zsjGjt!y&8|Kd1Itolln@Itp^M*bh#cSJo;+I)*LGE~{;lPh2dx!vt1TY(&U2pGo^q zd%XD%fh~R6X>Cj}T-0agU&I-k*+#HyWTM=GIj)5Os#F5nA2E>zlqz!G)sQ8Iu#mKl z$F(E`C8sfXPQ7~r2_NW~-+;l#Q59aKuhkC2q|To8uQz6t1{t2Onp}mKMLz3BObftl z%PB@=Hy>nrJF%X3r+shTHT^kV|JSW+rL2O~_AekP_}ecfEqccrgG&Wsu&W1J`Vak7 zTtW6phuR=8H|G=HSL$AlBl3&~heX87<7ceSV{0P%%Q}ab71IiM>4zjZM>02w?k2yy;9JVN;%>X&C zHZOM`^o8HSW_pMLfb6Z6QR0rS=A#H#%R!FI0ds~>JeiFLAYf48j|6V@)G3=@%gk~6 z0B+ygql}u%=EbA4bJ-8p3}pu4(h2%44F;#u$7m~8%RE%K6r>{aem7DOC8ta zrZw3@oS0avTU!C?s7!{twG|{cw-REXECT1U;1PEn{h7?*<3o~k7)cpDA2U<_v4GPP znGkDkSyz*~Fokbfe+$>Azh(UU)7)%E+u7H0?cH>dl-q31JC}HVYl1MWb68XoZ17V+ zj97hu7u`5-7s4%L4{CH*hRM#Yc^&?0-CHE&7&J87ol)qnTW(UUO&%DG4k1T+m2Ssi zUoD?|u`1W%vSSNkeiCi={_;`>HvB-Hw?bF9+az!9Q`qiW2uA5*uRNsQB?sR%-E+?N#R73>!ud=Ax`Yg zW9~zywQ(t0rm6M4dskri#vZLo1(uQEVbEE;#^sDq(GxJ5SHeqtqf97DEIn<^%7^j0 z@1($bR5W`2{? zEf3^ZdyRrPtIm@++nQQ&zYuB6kKJzFH6Szwjg*!(36+|`q9A;fNy$uXRg{Gv$Q zd;P6vUN8f5#!Yty10+yw_vv*OTO7H}T#jpUF6WSXe=YZ+Hrz*C+_AGYGiqy)P z<(JzBEtdei8fyg^qrN=d@rim_ zd|}+0zu08zk7zOWI`e-l;^K?HTy_mPmTo#ne|6k>un0}J$J4$xZG0>~^C+JjBH126;ozxLq&$#|2*k4S z?K;P<8*NjwLh1BBJ;-OJ-4)@NU2{85P2Q)D>V#mb0T>ryrL*Ji(`dE<={t*;-#b5& zhG1dSM!J`r$oxN_^H>iAJ&y#x4CoQBGC1LfSO&Uq(v^-T(jq literal 22829 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

    NN+_Kq+_IuE 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
    9=>9h2$L!(4D>> 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%0DWd~q>tDlYAFS>tNK>5MELPsoq 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

    iV-du z+V_uPScS{SMiAAP0mbT7u5LTGwi+U-YL?LLtxktI%%GX*NUCZ~3V2T#LDRpyZQL!Y z>M}$}7vcottDUX13?ziNeEfkf-$l45AAaBkYm`5r^f~9{bG8tck-DOgzYT0gJc>%{ z-v6*S%wViQQq>SJuPoYp21#}#cHnVMJmTfMh%kN4WBOrBpxO@~T-z9F?03t2?$4M& z1@Gt#^ZxYM$Cr~XSfmhdhBgfumYV+LOo!R#BDUUP`-oPJZd1`f8Db+iw6c+u`UrTAg zz$Qe}co03-$TY1NAY$ZI9<4ZP--8#(m;HhnvdPiiVSvu6dbt`7)O?-m+R31G)WJg5 z%{ID4o6p&1e;frr>cd0w9Wa%`Mko5pX~R%F94XewH2fBw%epbWg}slO>z{X=!qzRr zsZBH0dr_``grkgv!$fUPbbRe?Ay)?-Z}dJ!De;At$Fk{|Xl<^zmFlxvCymffxvco^fl*8F0Ru`$+*3>4h3)<_GSJ4^LYB@o#dm_(`;NL6d8YG zNGVKRY44wc0zxgo$DMvw_OR2LI5d%8KqOT63jy-s17GPfI(uqL~-gWGy|*fXq-6tp4tZS zn>ztbuacl-lx_1b`NQ1EIbE=Or3hIiF&S2gSN^t_+)yGp_Fr+&CqYS_2TSJfcj&8n zDG*6UW#yqk&B%dWVV~f9{UGY9e0;0qRDpVtvfzz3 zADwiDySQH3mgQ}%u9mu$0CD#3*c4dAkvl--DWjx^0!QFSi5`n7ccbCegnnQOg^hy# z&?ZfFyECWspN4`WcI`z|EIcy2%*w^cMBAV@l%}Bpp^x?3=zM3)1Q1tq71u-#o)T)p zq#B6-nU(bYB|SvQ$?8wVrTsac28DmPiV~xsAjvUeb^YqLii3aO7|PV~2@{8wQ<=Ee zCz$o4R2D3P+#dXZMcSCMBG=JB$Q?LDm)h0^
    &^$UslkpYH9H#>1`_(8y^zk-qj zAgvgjj;5{*y)!MD{5`iddta(QfKU@ z9r}aVk$^as0MJ$d94)Hu)RG+@ONsAsOx!x#I7p=^v1alD&TR~g!>ZW%he}M|H0CAo zHd(CunbPWsd>iH>CDHS)SU2^>V1VNlb1A>l->6DL4}LfNlkT%oO4WQL@Nde3cJ2o8 zv*41)`|SuKfu{?l*{lp7{|4+3K)|uev7#D7WMP8C%3Os1M84I$pza}V+F)ABiHSrn zuP2*0s)6bnTA#?M3E^e zt<43oGHt3&92S=V#_+d{CCw89$-G$J)848-+x?2~#ys2nYw2*WycjdyzqZ45 z2;S)SJDv(caj22@9M?|$FVZEVn&{7IQ6x- z(gOh+FJKPRJftKnO}YI?{0q~INm~bl(?4-Mk&;pm<{xs1lPStINs!ZY(ev{WbMsIt z8er4=uIs^*vr{Fqd%G^UV&Ef{^%@{U7!AZ-(n#N*nq;p{B7m#hCr#(imY}~XbEF&^ zvN{73bj~#5?VD3MIo;P2xrg2W!_8aT#>GJ)&+Yil!loJW)-4qUVP#hHjMv-gR??3? z50BmY; z9raf~?8V}GcQH@SwwI}2qS7@>BhKKOT<_%EB~`U4W5?q&`k=Px0dZFsLGZU+4NA=( z3%^UE)%N8GJt0L0tzo{XkWW0KtHDWS6x4*mWKyPc>JDFw1<3jyX$KdDHu|6~pi}Sb z2yf)+7ic#5O_vQdC^=H+U+q{;c!lfN_j2_+x=U}o|7hTK7`YNwk`Cf?wfgI70h(|%CZKq4u&hL$MA+XZO&fKX$A7?rU1D2oADWQ|T#~wIR?4vAvj<#IZ9*&VIbx+dTP$p-Q6yqq7$$l7YTo^b z&ced+9rP76Hx$<`8am-JyaOc*oSR<&s)0Ah%N&g|==*AL52%2GAnY34+1#4XC(fwj zo$cDLZybI_dHueRga7n@9j&M{_9$tFA-nA@fu%Kx%F9NJJ}m-*B4+5bL*|_zVkW&m zFTS?!h|1=y#k0x696@+k&bviU6D)0#E8(oJFGy>mxHVLT^(-@{VpI9^Eg8i~@df=( ziOUt(TInhBqR0(`u)p+*3wWK=l)n+1xfO3nmv?=4#D)J}B^OKh~w1vV%c zfd+T^PT()3u@lCMERsi;O|w6{-?A0;`>ci1ua+4acYE06@1tKwX%;cZfjjy~ zrvdLRv_FTh{Np67-~epE?y^|798@rwE8L*tyM)21lD4_1l+{Ga#~TtgQHK+0ElXBu=F)p#<&l9 zt|R^Qs@5VL_rOe20j$3A7)&b}P!W~0eLsF3>54*$>rCS3dJ2bbJN+!LY#?3QQ82OV zo9WnlgK5g^Wb@{;U1G_-1I2eg>+^G*xaLBC#0sdtR8ZX}Vb_xYDfW?pEs={DGk=z1 ze(xcZNp2;4<+(_^>{gjsZ>73TRL&G4krjH+G)9$BM%V8`Td=*FV?qQ5>5JufQQMYA zYmmr-$lLOB6kJx{E_P0PuwW~HKA#_yL_&uDW|HHPNVK#wPKkPGKS;**JT$oi&EOas zRhoWCIDWZ9uwbs?@obD}YXvt)t@uG=JhJFH?d*iEhFVurQrN#~FRLHw_I@6=@44X^M8J zGKd8CVEJ&FnAy0!>CDBR95JQc&04S)zkqNY#)XysY~+2B4)0F2-}{&5qS*K#eIQMo z3XRi@Fej}!z+H0Zm-|E$H}Sy~=Nm07;?Qu3!QY+x-bp25g~N=yUyle;t9SN7|IK-X zh*Z+K-$LBfB=TJ&1@;V6K~0$H2MK&yndkvh`^p#3nyR8Vhi#-`dG7q5RE)w$utRE) z)s8@CJ%Qm8`C~<*?ER+V$KD{ZmXmu&Hh#*k*FUKpJ=&@__dVMn&G_!ZaKdUIMTAmv z+gG{XZFJ5OYwH<=qS;rm&)nZ)?qOON*fCU)akiCJ+&jAEHO5K)ga<(p+yp9Sq4?PO~M1-wLa@t8;@sYL*e z5C=f%Z(O0cHMV&R6AVouT80pW@!@)R%g3#Rs*o?DnD7X~qdRM?O_z(DJ! zFC0LEOIDDmfNg|6X8xA17I}RG+doRHq>Ct-tEOUD9u7z*PP-o96Qky+pu7-Pv_)8I zBj$C!4Q)Rj69;89&x!|Z@GR<3K}gy0ajxGQqC+Zzt5eLQfcZ;qScpUr<6;=}T_0Q~ zM25?xTk}kZvAS;rZQ``Zp2(}d^xr>$J?P#5x*Nm3eT?}$52Z5&VDm%Z z>jpXMlSv__L3&BYSN_6n$A1~wL3>bQ+EyQYx`RaR!l1OYH%Z&jiWqZ-#-KiWvX_`B zpprFn9JNh zdsv5jbTkgVZN4sq0GwE%lGDVrkPB`92K#~0hx)1wf{`B`(u$r=Ak!V!!S-*S&MIFK z7UH%JJthMoJT{@;>M#DO!{&``*%Nas6QISt($VIcFnSyirf1>`XX`U0zeQgp&!MRV z$Td-BXeAQZ#B{A{4Hll;fdb2;+>lU=F?*PTIh1=r#`qoX0R1mZF*XpMw8)OvSK|X<^NQ0VJD&@zLg(*Lj6FAR+5{kzO9_ zq>`Y&-v*vjf3_Q<2?(cvcvz_eZM>a@(2>&C^VGfYzXS8k4pg^A$xv5O6|RM2j_L^o z2eVfJv}v#n?l)d%IE^+CVn`;molt%d_qsYFBpzyy$s7vJRlh7KEJ_$UmudF4#w89U zgMnCJf2c8mNzp|<(mgJ*rDz0aMZr|+uWYraMI-FLhOT^6ivuF|pt*&kP&^d;uuQY; z62lA%36)8KvKUQ?)+}*D1L=4rK*)c#lx;p_OCHg=kIoKiFi*KU(*!F+j_c^zhh|@E z8lC%u7;_pBJyT}gmpe%|2qa}CK2Kty#2=oA>C@paF^1ZMQBrzZ|F0=4a3P4cQed_i zb@YR#qwpY~NUh?tnn6McTg}k|gd3X6!^C8;v|dWt?1Q(Ww({*iZc>O5bDWJ!G=z-O1L zB*ad7g+)Jb;)bNX*6z^}pk00%C$WG z%~3QM7dY$)CyJ@8<7Y=*uKD}Ni1M27noj8D_1kb|q?3HR`6s`WyVD+CuM9%!90dla zeK1Hkb>k{zav=71+vw~AF1z%Ji9-BkS{97KB%^=Vw@E^7(5*6Ufv;{^Q(2kM>!3fB zxBYy2j1+SNbR=5(Q|y&UIGRenM(zOjXN=99;%F|`HD!y7F{7q{H>c+>K6n0XV+_-) z#AT6^>+2t69$Ug#BuSF71JrycSGWF9T~kN?i|_h$bS(zc@NSTmKf18+Fm^dl&BwnH zUEbvfVSGD*(=aiT42oE%%R`iQkG=IjkJ+z!&mQul2CqoWY%tr=H2F`}3vbcnpOuw4 zUBF?g)Ii^E=+2u&zMjZ&$r8vyFW8nJ4p@-k^9|AXq88y)_4@d#y7~A%F6gwb0>tbBT+e@!^U_g?B=TZ>W~Uly3`Y`&z~9Yd^UcNLh&aV z5+t+x>zBNK!E^8P{^XeHVUCqy_@NCVI>5_Y)UqZ@rtQ2D1>1GI598{Da9y%E3fym# zCz1|yo3n4S=SyH<_v=0Iz*;=fj)aaoM;;B;Exuyw7i^{^u@J~@jJG-%Q78O@GL<^c zG=w{L(Xy76FpG$wzxRBx{`r?$Cxd?g`{yzqqW&?=WL%x(yn$=2o_pV9tnbGO3m|gB zxc-?WK3*N=(1iESxC7yaMUN-+j3_&X~=icL%(6d8UT29E;O3FgprWy^+YC65)EtybI2%;ax_1K}1R$|8q!{C;B?Hg`9h` zf&jAK;)OS?YD9?7KoR)5ydr+S)8stVU7Kt~X!~D&CwWtTd;h|<>i)0jeT&D~ZS)w* zMRM}$+WJV&70-}p{eh{098{KlIOAH}MRw^qI{~`W8{fRW`!VWsdrpb-;8dXXaM&k) zgDM=WuZzUuHkTxppKeGWW=Ge{cq30@Whk9AIiA3ghJGUWD@cr|+oY|ZZcX9opIE6+ zI(q8{_i97~`EtTPXHMS|4t~hBvS#=KJ=bWyedM@5^}|gOZYbExh+A2E3{}~~tQPDe z0b!62t%7JEwHgI`#8IU*1RHfeWbO(Oo7=O4&tuC9u$!HNNqiz+yyq4!}u;lbhz&_^HA(6qLBu!Tzs-s>^`8Jn4iDc-n<{sZ*rMIg3`QS)?TN0UMYamBxrBSJ>V zTO&d%@~FsNAz_bf@qv8lF5=PiodG>zz3)!-rz1>Vq{bgFS@__e`xP*$<8Dg}-97n7 ztktc^a!>@Brqhe33rc_7VoRn*mGf&|R09D0dZyw_XXQ&--$3YeE!IX};;CvyUx?I6 z%mZn8`=3Hv;>1YPsx#Q|J7N2QvvMt!4N!7QhTq!+M1*3 z37-IWeuD_VUd?&ZxW<+KJX+m-i9u%jmFLz^ngBHwMDnxJqGtrU@2nSm=!T} zylilhbUHMQy!iHOXy8wAjC5-$R_D?^d~1fErZLaVIqmkYEx~G{%+hr0$vPo{eUA)J zzTXG9Mf>O@MZ^Fb3)5;2!`}xNWLl5u6Vo8QJ*xzhY)9@7$67ZBE1;6kL`Yaa^!AKG zx}%=r*6K2#02u$r8BxtKPud#a?kH#Ra85_hV2T$kLMP7e(*4Q0v#l%)`gcQEis&jE zT<*rGUYxpl|;yi6G*Z$P?)aj-99q1 zhM4RaG}JF@)R+`q;bnRyIoa`78kqbf_>~ zJNknk_l#$d3q<}{pDT%xb=(f7ZC~sB^+xGvc@bYq+xd%PTivekYJ&IWBSmZc1wrRo z+(>Q816(O*G#e-XFYRhn{;$Zv_#6FNYa0jugRQTOiYjcoR=T^pk&==U=~P-$ni&wJ zbBH0NYe)$N0Vzd#Xc#&M5F`{~=oAnRDU8AheDgeOeZQXf@2oXzopWFJIcMMd+IwH0 zN${uvWDxGfcPOR3a>xYNh#sw#F~SQK#jbL@Ak9{tvW;T&WI`UD*gI9h zsRkacUD~%WD=z2pLfVv8Xmf$PJy8~%qf##>*n!CO*~OK4i>r7X>7r886+^m3*ua-! zq)5D7#~?PLPeWh?>Xo5?5&1V6Mfu^uH_A5aFkL}(=@U>e3|WT84l{v7K|az9xGyyt z*`&U4{!;^8;9eY|NpIdVZgwH^*ri1{5F8}dZzbM^rSr=CcH(Ur{1>E?bR&ZnTI^|( zEo+G2-*Wr6k=Muqt?wI%`o|fzM(+PXQiDraT!|O$v2R5~X^C75e1qz7I+9@B#4qa5 z2l~QSlC`=X&lKlIbEGI5)pKb2j|xHYyj^+l)&-_S@~#dyd7BJ7Wb{?=4ivwoAgq7UAW#i5PFLy{H`2Z<25!`eWLis!yIk9ByhsPfmu>+5o^EApOk->gQ1z=DnhY*XU_-? zKrY?!a)k@^R3=LkNVKq0omR&AY;ePdDXbw+;)2xRo0Fh5Y%&K>>>9>xM@-hVFa`9N zRYvSKH*Dn}QgckNLaMF&-Bh9o&f$KKa^;r+*|_3oGh@2dFYLpjv8zQNIOT^8gQZL{ zRN_J}qdIu#o816r>)_<22nn`irI1jOsh+?0@BT*K>qHXF6g#s`{$Dh2KVPn@o(=_} zic!d05*n(NU&dv5H*AFf$;*>kVq$i&U$z(ZQ8HXyc&@OX94)rz~*?j z$LIG>jDBzrt|maO#Bh&?TPnAEHY+Tm@fn^ll?-YdA6svh z_-{zVxyn!t2Q9)`dW2t;?RgB*fw1z}dI0^2kGE zG|lm)hjXrz0uV3F+{^8?;hp%Wd~d4NUYf=!VXU(p6@q@?f5aXS)JzTiw8;~^y-)ol z#?V(#P4bAmXu~1kUIvGqhDHiK z8A@pr#Yc7Un72BRmVh9^&;5i7eY~1#IyAKJ;DG0#m*(eX{P8os*Rq6j8yhmZT(B|N zmkNWOHS=zH!S`;<39x3kPj4C$V`~d2^HLmyGwj`}Z>#Ay5{ydPMN)nRbrHI0ef<=o)*u) zx?g{JlX0aEzB|A4HF`MORXilG)WV7RL$Nh{D#`ZCN29xex@FABnXY^U^1Cr?Rlswx zjo$L4r(dPGRwro%Z|!$#V;IJpjJycBePX|{vL-6uc$RP;nYQonFqFH4C3hT0w-uJv z@r&DDX)Wz1gH%=WCtdrHkbAkaVb3_hPd`5IaM=Tyzmy6`g~T2fhQkAYD|AQnFpBWJ zFMWFET3d&ba=NXd+&oU)+kYCA@D3g4&RL=2x=3`Oheyyz`E~HT{s^VgLVENofU2{W z{wuwZRcn}7S7N%;bn)eW?OQ@lX*)Ofw?m5MWIvX}`~s&ba&)e_TKwg@^fa>Ue(3q_ z5QVkLIeu;8@>bWfnZVD|`ntcroIGT+l*z~e>kNuOSJ!Z|Cm^|7jw)+Q^J>9Kg@y%i%D(gv?Gbc^Z=`btJ z-PRAEdC0G74&f0el4QW*>!~lHr_$efA<`kA8nl13agfnMwJI87didy4Yr=dT{}P1- zKl%{)LSnRD3!skw>UOdmKV-uUr2-{KK>g_QzOz{96(ijUL;azKy1ry9%abk5LXlcD47By= z&;#a=&=P`>pn#Cd+%k6&IAvhDR0>Mu8Xk*kPL5Dn>qHqSU-mGM)qU0pkc9g%Bh^6bE7@t- zXBQu8%#s%*g^mn#kwk0P){Ut;y<%@8&z>gp)U^DG^Vi0Bz1o|gVUEU(24j-GO3D2b z(b)3{h6;9685v(YZgsO#1LoG&VlCc!DQ_cQLM8xn~rL(It5|udS$^>O5d6NU=sp(ePWgHFnx*AA6->u|9v=P_w z|EgLF#3Q8qLkp$I#?1k4VG)HfN>J{y{93h$pFDK=7EZr8+-qPx0vu}d&(IY-IRSuD z)w^vYfKKiiZ({|Bb#!fEHLkTLsmT0ZrUFmk59^kT>{SG!k!O-~wzbwP5&UW>bMUzE zi*XKc-!xj_LJWu6p_yViDdIyZp3tLXTiaz=Tecatl-$U*g47&UkMz|q;>?{#%Z>Rc zIniVteTdkBaFfY%>tusr<&I$Kc}WN>u3PmxM+*=)+|-60&@!l1QMdf#Br@7duc4DL zyP)9}Vb1g(+lY7uh%A(Kwo?wR9>S&OC{18J@?@RlP@Tn8(;Q$I7SR(E;U)BKD?8JC zIR>3gXXa_VRD?2(%>jC!j=eH%^qG9x|9(WKs?Ij%+cy%=m9MCFDkzS64scA2|9}_G zJ8aL&stWX=x*pRg@B%$w-6km$r7<*i2d^{f$w|<~msVOp*8A0=#+FFz##aN0>pZO% z)EDYKe0K%rUW_>80QuOawR9$r)q3gZJe3-a+&}g9d}Wi;;>fyBgQzs(8C4!b1z@KZ zv&iIj4%;V?-{>fyFI$JbCs1h$=pTj5P|5=kF17Vis#vATa4&xBGxWz8Y6ujM7D@{~ zSycsklWLb^IY85OoO}q*;qOnuB=TKv=Z^3~oZ8T6G^&>I`NPB#Z@fY}? zGVh1*{6JdhBe)N8W77!$%6rq`hg66-RQ`g|AVuFr3+agze2O*{{{FpXwxV`zc;f;8 z96wFaFe#US4|ecng@#9uRO z-9{Y|ftc;{5KOo2N`|^xXED2vOGf-~ealB(Nuo5)V;ClZH?ubvN*uP{qo6yo+867ItI%t> z$0?DaZFtf|tXNX8bmB+V&}n%HtEgzbj*bD%%R(U(*kT$h#~{f{;okLr96Lns)c7b{ z?Ywn7pz^kR2S2_71TO=+u^N}dsCQm0UE+=6o?A}N9}ND0&pqBg4pk#$pdg)rR1p3M zAccnxc>`-bq_G&v?QfR>sP!xoIcerc+RqjOAnnNRn8$(hm4gfKfqHjXRoPSQ!QeA{ zs(C4hIxe(`@a*&^I7G3Vy)yKL?iZW%gX{1(#4q)SC1vcli{qs1qi6f`l8-ER!G36v zbA>=z<1yF662)lp+ncEG-~JV|6?fN`e0`C9tRtb9w}VWUK)2}^_{ro8HqZB@pM~M$c*f?E+N#==3F6*^ zAfvo))zQp}2in!D(!TiDh8$|pggc*S_Kts&&Bq=0T&+7U@z*Xs224<<{Yz6U@sH9v zAAI83`=)YkYJ{G6zl>T&n%O z)U8`gNI>WParngS;`f9(E|IG07u+Xf8c*cyQ)ixL*WA*-VXS_xNtG1j#L`GJTGBi4 zE}dz=Ip~d`p1tlOOwXqQ?6WNFEc!)zD%;b!t{T}!OE_cq9>>z0rF=Zj_zfQDN4nnM zK&S`}PHpK!HWls6OrK@ZU&u5|ak$_p{mZVX+#UP_%LiyUdOTcHz)#2CLvbDr0Ug#y zFe$fD|8j)IoFGMeyZ@J~>)c(%{U8efVW=`OgiDK<`6jX*punKJ#8c z7lF6pRVQqVvSw@KR_sj&=v4qKJUFe1aRd+6Waum>llHE^mtdTNA_Z(Tc&uzQu+~vZ zi%UoeUifHE^mc4YxWeylepf)B4p8)Udy68aby9<8Eh|Uc2}9JpO<7qmU5ze#ROuYc zab*h8rcIWV-t0s68P220K$!_d?nG-Fg^}CiHJ&!^ywijzfW9T)%*Y0Mx&XNQ4-8`} z6RhAxw~EE9%$;e@e~L)Zo8Ur|Cvr(hxs)T?MFagZ6PbRL4Lv}}lDV~0C69In>|eMQ z_j5eLhXx+F^J5@veCYab&Q?)rb~|zJ6D&XuiC-gN5v0$yW4L$IWrz`ebk*nwC}{GH z1pHH%zT?8b$>W1}pPf(o`=f_YJ+1c!uC>41yke71x1%)?s&rGB#5&bcmY-&RC-FoY zIp-&_W!bIAAnjlg4KWdG3yW!Kye6Gc(gQha3>Tc!Ru3@z@2YKOC4VeevYLQ%4jg;o z6G<{TecH?P1Ee$s@_m6Lo3_pVQ?B{k%6_XPrY`L zooAi!ri)IwJp+E#^8)S;jfx1@2dIU1@boP&6Usi$7#IBWmISi+06|Bc42w{N`|zWC ztSpO3Y)Z}G5jY4dU7&S%t&gKn9$ojqhKWQdSQKd(K@TU*y_1z9(HW`#`V7r0@83ww z?49CLf^4c0`4jA~$2q-b2a^~g2588C_VE)LJy1W)ng&>fzdOne)+=YNQlz>U&;dQT z!@cD6XHJ=ZqXluRTx35LlOqCH!k_OsQn(Tik zzBuHz@_i5`CxVi*aOp2bep-R>E81MA-PrIoYFPx)7C?OdP8L%sM;8^-Vy|+BQtJgL z+=m-|AGrq8&k#b{eV-YFW6J@3M)m5S3`A0$k&d4kBRFbO5)jX=`mi zz+{1!P2SPnH=rMR`$rE=m2)YKLgWIePZnv2Ju&$J#gtGvfMAA-!wcUE|0x-Js6O@& zr-kB#$z|QFkoZ$FfHMM*$MJB^Y0&y!OpZb!5>de)9xKqCH#8m|;)8>xwI6x9KvZB( zEWgFk{+4WosCe4NB07Ma4I_a@*J;mLF5(ltvw6*s9wCk9Tud|wdg1%gPq00L2hm0U z%~FmEqwNVS8UU+RhG{Vje%L(33tNd|C8Ekz67;dsaAZXgj^YS^eNQ^$|40n(M8-+C zhXr_ct{aW4)9Nt6WuSUerEt>y=v0mmbL7$w6uowJ#q=GFUolg>r@!3jwC{ zj*U@*VPRptW%j_zYFb_y-=yr!Yqv>_<%@Ari?O9Zis?w@jIbzIrc`Y2-7SUtd78#v zZ2sTf{%1^wGGp+`&zI&`j-Ghklmq~teiSr%nX<0CinbqA=^ak+-z0Sbv-|vz!Pr0*L zhXfuFdKI#mWbYD2pg~S6$~10CBTSVmpmV zp9ePur+r<6h5lWbaaBOdx#tsuwaI1c8b)wNrvYi~cRH7ctXb0cw?sA1k)v+gTW`?6 zX+wJ^5rtH2642OMBoRi@e`AWK;-hZwe~=7?bdBnxBeuc3Y*D@{E%J`Y zJ7tQ7cenxXsA!t7AIak^>u3Yk!>s*^MuhR#ee7O=ncp+FBMhk%)m-hOs6FIF{uET% zh>Glp3tB9dsFam**%~V;>YjV zVaZ}NKL^ed(%%0|XZ{3efiAGPFT>Q}*XjIoLD{AHtu%V2{IiXhA~d#SRVv_I7b_mJ zk!N*GSnXcga^dbEGA>;WbJ%INeeo&Lijg}p$y0t%i29W(m2t92Ly05iiAMc3&Nem4 zqpA!U9oq%+ZbUn)SE~@wEO&|E@-Hi^A)iR$T?H1^Gy_$k41R{H0d5FCnq4tz9-p?r zA%1&YVUQfI@n?3k)8j6Ug(YcP_6$_|Qt5y5_3d@}9T-wdUEHE~(*B&CZ+h1@(rAnf z{z~16|FDzR@$bmgmi_qCnT}kVbQc`FaQ}U|a#@2g^+Qh>aw}Df%{}pWD}Q-8lg|#@7}P0Ygso)%-UTqYrT=0wcyz-YAq#wS9V8y zTJy`wi^dJr&?nynBVQ~=(?(*m`(HCqP@#Vlv-(()NEpjcn^+)^zE;L7aL~6DY3H2Jo zj0=D?v|Sc^;0SmqpskzMwLuQcZPY*bMX=&Rn;}2Ig`Rx4w*Vza1!XQs>WRo%#l@;g z$53EoV}n_fI4=XpK@V6Q=BRgGa0ZCSoB$8SS^2ykFsZdiFVeo+xq%-I@$}?Iqsgnd z(HC)&Kzd}-(=Qt+8+r7l)hJw!7OF^MA^NSQoJS`qPbLf@6;uLk)32_9lTj&)#_>*LtZBbAYqWbcxOEVgr@t zH`9;&fz|z=Xje#s>dP>)vX?f(sI(m5iUeUv3k?b&lx?lo#%1qo3;e+ZQ6OUv7i?_c zMU#Mh3i|8Iointh;FcLnJ&E9kBb2=RpT9}dfMM3z*!YW-uym!UoSp*IvU@I|%nMMQ zz8gi2ACsq5Ro4ih4ME~sxK~iGSITh0fzh?3W<+TZWtlu$#*G_Ymhdo8){+LwyJY>? zxC4Y`)$p*h>Rh9Akbp!UhczyTsNrG%i90E=Vwtk7|9p$_xb&SmaBh{Xr)cD63=! zkdGj`%zSb97@v?A#JE2Qg3x74yB_)pk4>1d1PT}7+xKeK@QN#2K~+i ziC<;LuxVnfg;3;xWFgS&ZcYuC%ZjKrUR;S68@69>BM!pe`{c1dHbPgsBD*ISz95Yj zZt;hlu(<@Y4Hb`}JeG4HpCU6*9*WwiH<_xyOHX}1nP_lFc7zvWL6wTt;z~^m=4A^l zD>#GMrF{sHZ$f1EVB;&BLfP9|ax$^^aUV{IZBM;zRs?5op}#dfZmIpO>K8%yxPVD< z1lk0ZgnyEPfbkJmfG%GJEi^5=CmG(r2XWsn2Rwf@P^06=><59h_?KNqBICyq&kz9s zGd$@GGkI(Ph*(OYUp7Jch2_zpxi?1jLWTX_hX%l}2X=OP%BD|&BR8LV0W`tX@kmXc zFJOr5B7vL`fu^6MdOp4me@Td~m7OBkXZRZ%DC2pf$FsCeRUkDNC^<5`k!Xe%Wv{NY zT*K^2Pq@V~mj=V)<7;DDj(XQUnF~(;k^u zgiQ!FCM6etcugJnIounKN*y~cG&Ta5!Kh2GZYm^vA#=6HSRLZyQLkmgIx;!`FlTqq z7nl-&*%7|9-%K)Mb#jHQ8v-@P3u^FO)NlV}r6uNF|2pDr!TA4m(5@TUXC`ygy&4eZ zBb4bWH16mpm!c1P*la8Lc~V$BP)Jxj$FQoqzxUpo_;Sw;g5DD2P&Mu_Dp!Z>vDL=L zNC*(cSDf`@-pQ9AM@}0kDH_zPM%3d_OZn*%o{*yXG^U#w=8F3jHGYjexJRexOsQ;q0Xm#Uxo!q{g}WlQ!ks`<%y|Y8YFa#|`(MD?kUd zyo@Fo2KYx$ug4`07@1Vf4amSJW;wLb$ej>$=AiOQPdDwm=#&N>Cd}V)+b&3u0gC>3 z;CsMPQj1*d?jt>Ii5r=0#vDKGT^Q=R4)v`U@3?D6@%!JioN-dRPZwlqR1EnEzF_*Q zSvYE^NT28R*cfy2q0h$nPj6Abk6s5-Oi+Q+mR5YNfXPvm9j%%OWCNYMYDH7_S8-3; zbIbZA`Q4YVsMb&!9s{BMiP{bJ{8+S|-081v7f+$Lq>Aouc=e9MOR?ExrH7A3QY`RL zaPe~eOaw;uxahO`1CdzekLyl);!NTw*s@PXS^qOUavAfgYT?R{6wzAB>AewYr9Y8# z4zoUE#|2@#L{rTDMYJ}VMXgj$$5RpuJkW1G71v>nkl%5YaaSh}SQZcNIsBuwbmd02 zak~HblTl;e<9pV&>L2_alBu2_Qi+}@#7eJwE%*)fO^#}mdiJEO6(%Ni1epv?*c=ea$9 zruQ;+3+&_PYJ+nbz?&@a9BVY<^_x)Y?){b_O1MR3vJ6_TphZ>X;&AsA&SU7$? z5Dlp|xf{JEJo2SG=}tKD@zL5^5EkDF+(u6PLG^v3-wlh(!jiQs$sZZNDH?8GeaZ-l ztmCYt{@D1`eWh*}o2XVp?XzLSaOcLKR%Zjq0irD z-x14sd&|;}-r+S~zE}U$uH*E~HT=&$pDcqmC~ulg^kI$G(^_2hy!z2uorcp42X7}M z6FkvY+e}m#Rx*1ta=B{7{>l&#+ZRpI3~}UZvL^5=gh#On^tHvc-LlOUg=quRzDHJy zQfza{HxEWMO;Oh_cfvX zHq-07C?84&9$g#Gsk0*aX%uJ4;K#BDA(QFIvU3?Lr3H?G&O-@(AnI<}i!4WT@Yyje z4(ltrJ`x12$2Pf2;6im^OwgAN`w_z7y0`AQ2&4@F&FK>uAF2qXm4VH+*o6O^Umsi^V^_|=M7_}w45 zj^=iv0a%2S;#9;C$_T9Y^wASn9iHay`!0SEqA$M&vl7M6GWu2rxY97SKMj+7o}>tt zC~y8uyPq>^H6R-)wv+;*qNhuMA@8sJ>jxsqJa}qL>lo7xXkj-B-tYG{Kb8~JTCj6N z0#MY@pT(vjm)q@s1EWNmYFkSWGgEs7*SGg9+a*>^&NLh?9~hM@K|9&|Ga8i9F6 zRaQ|y)s z9tQ?tNXZVWFQSn=)w8t}ToSuBI(gjg+wzG?(!w945@VN|q|`*lI=#k+Ztn>GK<6}k zOtlar?Hr8kZ53s(x98Rs@zMVAgcVQpc(@cZJ??r8au{I)1^54xNj!TC+#c+5RqrnK zd#kZqKilP&eH*C*EF|A>t{3+&x!LT~Ku1o&;n$})az=GSJSkolB9uy@i!|1 z?{80~BSZWdmcMLo95E;5q*$0uf0A4%qhRa4i$R@itIDLochE^SN^v^Qe-`BalnGBU zKz>(a1q1g2G-9%zuTR78ZkFG;y$9<6n-5gZGf@s(^PexR0Chlw0^}G^&lWCi(v}L3 z((#KyCP0S0+woR2difFS$g`pv1<0SKa#YV-)Q}$hwk76fV3S01|6tJDkk?QW{mB(x z?$6QfiqG}AjJxAD|YwF#1(`>hV7G)+3{}~ zY2tEZ5c{3KSer0Hk4)Zw`$4R+SW5VJ3}xh_+EznlF+u6*SSiDH^9>%h=hy8BiCT$e zgM!+>BGVILHx%h7!Wy-?blxtbjftqbA-%@qxu9@NdvHi#1x?nlH){`rVDb${aBs#= ziL=@DiU(eX>%m|(AXm{5$QQp^?Th-BYD>uO zwk$f>MmT(XO<{PE53bL}tA{BSqJ~m*7CFEF6@G3>C~I;le^$JB^CZljVQ@4;c1vWw zG_sUGT*?}L@(^2{`{{GyalGILR3fINceHRBW6XG>t8AHa{mogF>{18x)zCIn4_Gfz zI}8^DQL3HYLjUd#iL59zQ|qmaG)^uju8JIO0EH>pYv7REq4vOIWl3t0EPv(f929lLc0hF&>F% z+0+MO^)4LgpT|wnTAuy#;XJ)?76V%nLwwIXZw#@<$XN6J?>>_lzLXVL^dDg)wCQLt^Xr@pgInjvQ#EBxr- zV9GM?MRJPStEz`z)%`mtR~tBN!wdkG_d2d+B4jPNSt`DyCw-x@(7iUt&xvGt3ed)Y zT-ufJH^v=cCZoPP3YDJyQGZ5Uw+wa_p^^X5THe{8$C#02*>Zj~nJ`)CW#A{~m|-)p zb$l-Buu(Yw+LUt*)bS9XBU|$D&G);S0&&gnS%iNB>xoS`1gILtg*(^3a5G}ZKM3Oy zyRf60WXT@}+K#_%knPK~A}Y1Pv3LY2tKlO_0Mjx?5*ieBbHy8*GZNPcp6z37_F;ap zpFJn>8q733wdAk=lG~$Q29m^B&y4h046#Q4?C%OcoC$o>^)=}+Uwpn>cpg;^Ro|m! zO56pF=AN8_j5uQ0T>=|EH6D^(=m>~UYWlykGO;)J`uCi(;5qjkyT!)F_8)oEJz`$F zuV>guG|FCllRYlKz+}U#Gb+q(SzTlYVGY(wg%ljm!gQL zIqV0gF3BH=iECOXfr@Xy>&l62gYJs7QtDnB2zL~{5QoJAdU3Pow_laNUETKTy z@U2L=HrC!8ckIgPd#6txGp4*X+a?rmHAGY#z~Z|(B6CrD8lRFt&tQh$-l}_pvh59L z!yqF_&~~gt9A|`C_Osh=Vn>-p z6NV?Gsgmd8nbXJ5*^C{@I$2T*$p#zgs3LxjeR(eDAId9z!9=+x&#Q<$sV$chQ-h}* z59JY-PD5*?A=jrQXiqbg67LHAM;dyjxP|S>RwXOu{d=8Vx>++Hs&TvyiJU$Auqj6l z+Fm*M7e5`6H>1MN2Zg%j5$T{_g}EPQj)g76`D-eJZTM)3yyld9DK{@_PivpV=lhKP z5f(OS3zJ!Vsp(SnfV01jQ+e~eV6j{hcGXjC&u1aS*}wUF&)0LE`l8-0x%&!!D(f^( z!(tncgFIi*w-1Rv^zx&dm@D-}iqe?3NWGBAPpnTN$jr}( z(tkSv;Y_v!5wYTLKDM;9W`4iR`yF+X)i#*TsPCEC@{8n{@?ku^2)FXC+?!Vd85PA~Q{phPT_Oz|4Q(!6&Iijis)}5-;W}BFT=T}U6Wv$3FQ_Ojxe-2| zi#&oAt?Wa;6A@XoyF}x0DLS>D?XCk<-hI%NV>;Kj=|_|~*QVKwV+1(3MxtXinqDtB zcBj52YMRHrO`z>)ZQvN75M7+0F?r`=wLF{Tsbacsr2}#~vd;O599mED z2kq31FrPL{#POzO9WGe#NDmTg^U%vr+NI$N8iBsz1i0^6`=(pPRnJ4{1h0mcCh_44 z&mffe(2Iidj!qvjb@pUC_hjAl9^%E@moxB`{uCCFLqR{B6few5Rud?sE#(IT9J=Dp zz)up0B|fIQ!Z_W|`#5&@dxLNFU?K{i1ieHtm+L&ZK6sBJYk18nxt7Q^eKisb7)l<; zC&V+f^syOIzo_y&QuXt{S8Grt;rbNceIlQGYA6#GpH!_B!-^@SIvz%eQN1(y0v9KC z1U9YgzxTrlt%yrYOB1_$8cu!nq*`Q>S3~k*dOC4P*_okI)yz=;2eudHA6`9XHTYz| ztxtb-f6;DPA?BDDp8t~jHR^~rPYA_p=O}6sZKuzjU|6IEF5@3PW-3npl1GtKfj5wV zDsL7s)`>WMVx*y)tkiT(Re$26R?*BROcN0IDZeZl+|GrT5UmkF?D6x=6d+Ytx~v}m zrJ-#9sG5&5hrQ&kQyt)#M%iV{qyOzlbTCmNk{MZ&Z#-K$N9%uT0y0NcHa$eqc?6B5 zf>Qd@4EOHcT|CuPGedtA7ESSwCx$O;{{){1rM!6tNo*v;hgwT`8n9EhcCZD}!&Z~P z8C8#8dk`*B9aTFUiEyJ|?%=&pT@a=VH79@IkQb-QN{z>Y^#X<%0oT z#R4uoK{2fS*rTK%SKuX)o`|-F zBAn1hZCVOXPXt?t7|#cWpFP0i-k|k7!)VsHcRAduZOM^Ie*4akb!hsQ5eMY?iwLAccyr5JE|-JNdY0 zB-KiR9Fnir=6s%Gh{afkf5a9g6;_hd!-dpM7a4)CV?R-`S$Y8dgejHt1gbT2^^T6R z-E~m4FdW%WF7ynoi9F6p`m(D{SD`(ab{!>Tx6A_SYZ1s~<#c--2MU#eTkdehq3SgJ z=>f@O30{QFY%8D;L2UQR^Qi!{XDmHXBRwRKmPq0CsJ3v5ZYLh)c>egcNaDOxFCjct zpE`T67sp4LfeUPBxf*9%fdrtCdt2 z2TURRGLj=C_2nUqe064xf(jl10R6E2TL%1K4RhU#_a=IPB})v}XwN;omT>*0lBo4t zyo)gfd;v7hM){T&q2(wGDe6s0dslm%PbV8K^uXglb+JrWzF>(*z6e$G8$L5i=YKx% zVX&wpJcO2}Cur;#N%TzExM_K?Uy5qc#lyH$ikutr+^y;rPt6}{4zy_WyJ9Ng>#1S; z4CFiuUndm;+#RE&MAD2k*e_7aU{eJTmZ+v&D@Ipc? z_jeKGX!G@qTU`HeczVQ( z4t6q8oW>BD#R!+j>PMASRM3~x8c+7WMtAncDEW=BJZk;HwP>D*Vl3-UhU9-#nK|y}s{wM2UXnJuPs^N7G(#be z-W$|WzkLSC;Om~sV0F)b8n|rJ;a_fA%<}9q1t3m^potCDRPG+%Y|TI#$`OGSNLFubRv-4@9AAs zz+Tu;Hp(F4+YEG9pv|?pGMlgQRB!kIX=o;z9G&`31}9t3*uf?VPbI*O8nK>o)Zyz) z`0eH*X_e~stVSOF(}Y5z;!IZnJUy-YHWr3*(Oov2rjD3!96<#YQB9+k4>Gqt5{g~r zpG5s1%|`D-iRzy{XX^OXBrewX@2Fw6q@cUM z-ej6x?d*jvnQUzGL(F5l&a|ue@4{^1{}}$reNBYlzOA7CeD9#16khAf*!65w@Zmp! z5+^V91q$Wg`Q^QJ^j=3r`@p`cj*gc+@`lCC+Qm+KKAHO|H0 zJ|t63q~mR`@yDODDoIpA(R*ZF!fd2!N$nr8AiqN(Y%P*(1hEv3F&Q`mc&X zc#qvRBnm?K5_9TO-8<V3 z`WoM{zhT@u^xL1(uw^|MLe9&!WFY1(9@TkihNdv;cl=f64&8i4s(yKAkj=R7L-X#T zXly?C?<^_XdMDYfU#FF>0~`{dYO zKAJ)ehVvf<}0F}Lqscu^gR2K7SMCKf@O1|#I5iVruAV(s~^Q0f8|s41^c zveR3FBVk(SOCn>P<TM*vQ`lIz5a?$8d>U$^K?VkQKLtlH64Z#2!- zr}Gwvb85c-MU+1TDLd%x-pmx+V84kCU*9+QQtt=`4h~)t>Hg}!Y+q;;Q^CId491UR z_zR~tzLrNi<2?r|!Qr`fq93go5_UbN&o*t@vFZm(OpM(C67_Bxo18d!559i%f=mf= zOAPRiXSidfa34>N+(%p67vSYw;RL|c*qSei566j`#c4j!WCCHKr9tRYrF;~bK0OO( zweq97xmYS;*L@H zRY-p217KcpcD#6L`OFxW4%S}=Ucn$aDQxE09nmdh` z3=d|vh!zAdNDKg1X&o1621s3cL5|&{^i^u+qtVmzajHCRc@1s2*E7f^*PH_vI@M$I zRTYyIO?sxeHCUK4rRop4?s3I_d1Cp zGU19`bypJhPZVF%&(>#tyEOP>xJUCGL03ii;TQmicdx(}cN5-EyZHjb4oz>S_gVSN z|6H*?VYebEhXcZ}qBQ=|W~g?VA`ZBf?Y&}4DzjpWYBJ@R5o}!q#QTwGg6UUeN?Ao> zt+K_dM8}&l@|a^~ig~0Tv6yM|GB?~?rC3P?wiVjU#XeMzgr^ENVoDE&al^akDWYnU z0p971?f-+uQ9qBN1HF@l-2}|Gc*wErA|maDV>p_Im*#!X$W%Xkl2r1=#`Cgebj3ED zp8sVTh9-Rwer~8wZ07i+k0Oz?Z#Zj9w`0Glk_DCOdf#m4Sl4qoRf#-xvvi1tai6=m zsE~dA5!2ah`pi7XJG`<)>F-24f7rFwtBIIChZmFW2~c|tHF8aoY<;elomBnKFFqDm zJws75a2o65*DS&U`Pej@sQlR&AAOa03JfXLrb@)r+oDI}_8O?6RK;!QF}CWI{Y#lO zZff~TPXZjG^h!(1GEiT7LjGOjS?Em1q<8%-0Xba{<)?9}fW+nSL17Y{bsQfu^{WVq zGKGOIG`TX{SbTfY)E-ofT79H}W)B;eU5Q+j`1VFbaBF{aRh~=)ngMckqJxb}jO{$0 zffEl65*Yu2gT_hmF?#{5&SgWO5|mRPG%O?>(Fq1DosM} z;W6YScdIS0XcgYQ+0eM2fm9<-?IX!p!bhX7#gT%lRY0H_--BKCQ@9U3BGs5F)j5ar z&5w~2N4&h<)IM^j(!l%i6;4P|mv&haIJ|>+>Q!q5AdR-vz$D0IGu^JyCFY0@OHF^= zFVp{Se#wOWj-oY@Xx|RU9w^`OcIo?Cu@in_-cA*g_JV!!QV#p>VR6#?;L0PAIlVP0 z_$IMqU|e^OI)nj6shJ9YmF~CLD22_+-3yb*aue~GJzl_6K-NNUmMEa+Zfg_U3sgmo zQBtN^hu=>bw<~N0@>bsapO_{V5ay}7QR>!t!YkOd0UWrv%7bh(Rs5@;2&MS=tmt_C8nx34C~ zd|)!qw~ZUegVC4>JQIF)ZNml2`ttI9w-*n$;HDrpNZW=na5QyhURjX7rhj5CGQCq> z3l|m_>vi_w9sOmA-I?;I;r#GKQY&0|{HrL5gO}K52AOiE-DtYNKi?tX89Tf1c5>%k z!;gJBUA^4N3C3;+@(%+NaPgSl$=&W{-`}6&*wPyP5I4&aG48F*3rjcX4Xi=D(u3;^ z+s*1%kR4x<-76-3yoO&pHHgrk2BTMOlC6gth>P`Klx2aQ%qAnC`x*qhpTDe$%9wsW z?8!a5mSbN1#jsKO@Uf-f3+ip)BjwpG=RgH>;vdsH{fYQ&aj~wU?|QznISH#o`p1=< zWTZ@dqb}jE-|EdEs5Z?ikcMS&r@yVIvN`_;=KhTVs`J+kG;cNX%Gq z_2(!jto@$Y$AsSteE>!8Ui-dTs{HMhB_AHs{P>x4Men=6pK3?*i{(qR+)Ws9!^+Ur zf(}Ikn;Nh_&Gk=%p!8?$gST@!F)Sj}+giw8CP5vEZlHfKdi<4{D0>T$#&-_9C+1rA z>#v*84d1L!X^TAMZl12sO33s7AsGsVLidxRYRzo8ki-9EPY4V|W-F;#n{-C$MKqux z%q0)98OKifG^u=;wl`1JAL}KjPJD{yz^6~A ztF#pH$EI(tS|n^zu#XfD6s^7GDoEc5TLN*Px>CAQl7BOl(u2<%66>0o}{Fju$>0QW-#fxaVB@XR;zb8 z9^olra5|Uppjw%L5^=LlXX>RoyG3TS*d=G!>}=wdKCm*V>jpbGVpnzqM!6Au0!`0v zwtHIe;iPovRjnlMuZ#6Zyw^N%+r_nX=QK*HwIZwEXAi?yj3K@up+PVgB(Fi9FtJf- z=bhu*d2*G~^JOygaKKIP^^ws1FpGYI`-xhO3ov>VxY7az%XHfpFybUS;-jA6wA)}d z59>9VrWgIl6q(J@4hK4|Z7CS>#$E3!n9xz8d-Z0d6`Jegb^n!1;K_>89YMglSiab5 zL0&N0K|{^3=q*Ew`ce5MapEVux3eGrWdLshW6mh{JIEwMi}Rg^cr_iQap?BqDJgf> zJ!#5=6kGh2Nk!Z5<>r6avJssOcHrMER9wDGI5kz(-vT?g;^tZ@7K~2N-3pV#GPqKr zk|v)>tHyP@r37g7gqS>b&O*SIsq)Jgix`Bt|{wA0jcAOOg*Jzw7UNn=^h@`3Q z#Izl{AEhlMu^mk)C5(9~LTiMdXg??TC^Na7iS!W@NyRkfFOvzk$M9nO$)GZ84(B&_3c!Yn8Z7EtOpU^G+%;Z}anrf9A0rD+{xl5<#=Y_D13ULPKwa-LHHgqMv#N zY;2~|Xif5z2MCqjNN>r~Y@|Te`%AS2f{X@y18*$a4I;Xb%d;%DtNoX3X|81A)CT1J zDkr(TDqg+iF@ zwlUs#xSqmj>3Tf2Okuz82eU}H zX266Y+;{4mC^^KoonK3Bo{}|AWFT_#z|IWvjbdBOFqLKw07r`NysJei`AVS9Y6_&Q zhOO6{n)ld0?22Clc0SXa(}Wp^3%qP`J>n^sCTbh+J1H4E$BYbgZCg(!9ii1j5|xTz zMfv%?g_^o$S%S4#!eU$mY_V55A3P47`KQ!CH9$3C!rx^QoC2^er&b?kXbo7-raLq* z0ezWJw4)bT33;x|N8tIAXhn1`1jDZGODa)2PECtC&M?yH=0i9med7_JsH>mHwK6D0 zfXM9NP!wYqvBxk{k13iiC?0A`Gmz%XBxu1vj4f@`KTy58%ni7SLy&|NU93gL}8xl`d=sFc+!hVPa;+hKb z+?qmXf6qeHb`#tI$~b7lJe7Izkdk$gXqR0!r2+BUs++Rr+rmC=Qh(2MO$(hs>OyLO zS(T{I)Q0sJ$@!#(3_^2D4B)SIRp{QqPEi)*94n_|%$H)_>xjwE;5ShVac4vQ$0{r? za4`CHl^Vq*E+F9wV*%4_vpET> zkg;a4Nn}!hRlkt+pN4$pMQq`TfB9uOe=|UC&KZ?W(-Im26>LEDT4QF5dSH6WO;1@K z^E*|B+ggdn(J-R{Y_6ubRm{EV>f@dnF|02>ipeA&cszei^y#TUaBq3cycloc9DkGP zl5VRGRQ7?13Z2)kA#Awgy^b6jSC>fy0{EWj0^w}kmpKU1LZfl3oW(GGajT|fMH1n) zwE?()7xr6v%o!o|VDhJ*5@f{C`_JW#n~v-Et?;52f(OR;PmLB8C3cJpKpOY|pDykK zDC)ahi~@*U^o^n`_=Euk3<|D^L>967+s)?1@BI`>`wL9gQvZ>5^%EkgxnL13!GZo? zxt`6I#-K{{FA0yPCSgau-^})lBO6zm->oqU;Y`5iX%(ThoHJsOL%N1hf*M;IyK@u7 z6@8v3!l5#ldrW&}-VjQDb(#p(B^VW~24HX-UCv^lf{(8+(Abf{6C=O(JGG_YAnH6% z+fGu=$8Y+mVjl$oIt~Nz`*+}g8xi7I{VXw$Q`Wa+WPKg8u9+4*WD~KzU1gv18N4Ym z?uEZ6U9%Z?pdj@R?zOv`A~q^?B%)Eapem)0ri3Z+UCU=KmLQBgdkQIn>IV6rh9>#S zI!!diw+QVoZ=yY8yJi!GCuPlJgGOGI4VAAf#snRPf)MXhr?(OYs=IBXMPbC`KuckBXJ?b-vy;D*tf6y5I_I!5cyl+a;?J?Vk zmqhmzH&48-&egTDMjm-*JTxzOt0NpZ#d{=n)eXOHb{Ppb1yQXX@>E$AwWE-JJ zv^(rHU~mmz?Z-4u=S7RPXFiepC-L)<>=uC*A)C>M_HS`%n01+<&zgxBw-=IHWBG`v zE&OGGgMl5h?b%}iu%}psB`JOia(^`$UA+q@n5whPx!&^>3F=>^F=n3w&9t(vJ#=IhvhkH4# z-gy$adh!FVzl(a`U*p6SEf+>V!_U~)e5 z7sj(D3AoLU{--5=u%uUqP9Qq!B$`0YGg}FKEj0v}UbnT=Qqm3*!gemay%+cp=GPnp1r(Hnk`{}y<;Z)owD%HR) z`A9YJ2UEeT>{uGD^{&~XOTb9P#eoF;3VZ3cWsoL5&OioV#;4v)Z9fvKsw$b<-#=T+ zJFO^Lp5DJQGhq}1Xn1evz^{Agh7K6}&=;^-G0b&g;$`jWnSJa;J{b0f%a+Y7!eS>q z?lJgEpskHqJ^j(JIz1)^j0pV@ep0?D4vzkxJ8GHLQwuxr zcpsVV_dafIWC0h{zr%R3r{fGJR3R=e6x$e^#JZcHa|p)w-QnuA{KWV6`3+l>#^C)c z|G?_*2x{pw9Wq4=Bp~qnmggJYka4`hRb7$9@<6;;<&NjP`?e=Jwqkz@~)^E?+X=9Qqvyt-1A+25|5sCeM>_T zi)Gg?EGR>pC1K#163AGJ{m#M)^_kzZIsmmg!gJYKFV4Cv`xkyaUb;)8dESuJu$I|y zd2YrnGS|O#K@6E6NNT2uZ?Vm+qmSOuA=maF55=~5BLa|sStfru9*#jZVFTjdjP4B< z!h>*x`yRxTjIPTUzl=VVFX~sXTRg>0R#{~{^W8F+x5ORH*VI^sTaAvDNwO?5F~X}> zt`Clt?Tkj{_FukjK|;jCa#f8t{*_4f4+UhNs$BeoPq3)zmu}lRfV=pUQ)`PG<$!8_ z*J6#eV6I>QDN*HW&%oO~p_gX{wO&PuAuvAxwhDRq-0~lHD-$-9Q-346;Bn5@Og79l zFp3~#_(hEwq0Dy>(jLvEn!hpCS0fN$^?czZ_D1>kvaYMXZHqv$HTi9^VDCu$e6veC zNA2|21WAr?5Nx8@b6CE~nQTddsnXE42~B-oQ5q*D(k zsO$E-%((~o)hxTH7Mhk4mv9xL6w%m*+Bl#6=LWLSfpOq!HLo{bk5;kduXl=u6a0}t zbHVzvgRWD}hKs-BZ^38nK5^T~P@a^VU^N{@6Fm&avat=y@&tpP*DH%-u5hrCk>x@N@2hMj9e|Fi^7Jgh#aeBX&k~x~dIM(CbY*%4uuFilkf{C=L#^FMgU4_kKsjKTACw z`DasQg>IiZThY3&z~xEu@&wzv`s3@!RRVr_`wvWqHzloW%I?soo`uCGtYbdM9u@N= zhq2(Qcnn+o@|3t6zooO@Lfzh1!g&%uKiEB=MZBj$i%1N>M|S#3vi|I#=a9m9V-Ppt zTR1dFg=|)Gs@bja4Z=`qEEKD`y*0|b;{8bRy8q^ft}LcAVSQ`e0er*!98>9W40bsq z5qa7pdVX$5Yz*|pA)E91`H>06+>$&=y=7|3Q+j3i=74e`Oxcgm^re~o;E<%BAtr0J z?$G(8MzDmC*;W#S1C$f*!+HcRwuTv?YVTFGxFZ|5OI?ixnbuP*<}#$on~}+1)Ozt_ zQ9>(zgTwpddEi~%sz9I(k4~Q;Kv7J_ygMHnZC7l^b1gG9%!jca6q&!a*0&iz2Id{5 zELqZs`lw}^&hz!xdRupVYRg3W38s`|77;4KsEC(^+5V9;O~41cv=KB}BeA6%2gh+t?*A#(|stYj5%DZ;v${b+N%5Ep+uZ#I7cYz*`!i{W{p znV%!QK~7Klu}_frxCSpE#2Xf`&~mogLKgX$jdNmJ>g}QciOAEpSpx*N{~_z~65nXC zww_$BgUuG2GxzAO;M{sFEy623)}w8%Kqacm?*yOT*nC-!`A(pJ?)ib*)3SqwE-(ud z&MkX#ItVASK6xB}1PO`+w)JB`H!Aq0e3xooyTC%oz@F>AK40)QMfQBXi4?&%U0400 z8x}D1K{Ch@Dz~%)6YQnc|BUswfWI-zSbq*P5i=avVBF&;16496KT6y(lnZlzuP^XB zK%=BQlb-&rG+N^F&HOT%UB4LpsgxWd(2VWF$AXj9WI8s?F5rIzyB4JC0P!Ze)C8D~ z%;CI+NHGhR1I$t8&vzF<*4S7#C!OgY7W2Vok;WfQRhl~?;M|4ehhtsxe&HKD*iht^t`%a@K_YHqE6Uf@B&(`O(Ss;8Kk<_5+y%WVq6bXc*{~I_ zwl)exH6F+Cx|kJ{vKyXb19Yd(GB^!FDr(gh(2IEn1M{UJtTsHlVe}j_`Ytp&9OF`s zDp=_p2EotWc;BoCx@VV?C{O#9bimPs6mE?O9MY#T{_hBg%s%sUN73)F8%4n|x!FXgr49iZtWC;oyH*4dq6OWZVq(;^ zw4&g2;AU6j{O(_KU`&HMcOX?yO2$}(mSJ7Ndi_rrM(_`y-*&u&oFl#6YSstunIy%} zcw`mUQI%=enVCC>EfooF^=0N;SP&%>_9m=uX@b9ISX_0J*<)kWzh#Fxvog~| zJ~OFcM9&u35rivyiEnx*@7_D4Ml&Qt^-WY?005p?4|Ejb;#4Dh1D!p3sRmOUvCw}P zXaWcnPZt$O>~g0fej2P(>;vdM$86MW-rjYG zXzNk#V-4Amo0@!0eUoS3pvVm=hUBHF5>|eWk-2&{wJyV~kNa!kNtD%0{T}LpVO#sq zLX@(qiMwT90BV_9SEhginGSImcT5Yqrr;c!b=9@F;2+?hs3@#mKv@_w9_~LF*8-m( zGFO>jqpw$SWG;Mnhb?DrGYUZ#h+EbMU23tF(UnF$j4(rowQWDbwj$B5(-h&sc(+H7 zp6AiZ11yA2Xuloyt!d|mU~EIcTvAv@0e)fqjC8&#Y+FO?v01CJm&qL>ByLv1l4I?L zR9BX%dZnm9H*B`i!NPj=kSXn^OjYn;?;3?Q;Y&gNECq)NywyLpD`JUoK_PQS9cKt#}Nyu-s_G}2l13*IoJ8$%G!P3Druyk4PIVE&k#4xX=og|Gzu5G`%)a|6 zZ9VRF?73#{qZ&DXrQ}w%)_p=OFX`^_Rm{n(5%o@UNp&ndfBS=1uv`3Dei7i~!J;pn zP(U&5Sn8^-3kJT-i@aTg~8f?r6E$sCl za-3W+xeP<`;JC8P*IdD!kc-qQR~>apM-0C=pF!jLn5(<3DUl+i1*us3Ua)2m4Hu>a ziv#D6r&QHDrpRae8SAaK0SZkT+j93@;ET4EZD{LXWbl!fs&Q#|G=(LK=M0ILnD(Vv z_&8`shzFrK{=+^H%IkoTMs7>Ury>Os5py5rNvhNOTBxY1o&@2sJCkRXj5^TP$V^tz^_Y#eICuw}g zwAc9%`hP(4ye}Ss*W*l_6(V6BqN1@BtD*;ohmuZCRP|0r67~5ww5Wc}9DBp!Wxszb zb7*_mfQYv671zO^w31&y(apz)fF_K?N0XECuBQ6UGGDJS%uz1kINIc=j8n2qHcX^8j-c#gxjt4F2%1* z1R%b+y{KnA__fo%d)OplIWaAks%G5cv21+eBgn4A&Qwgy$Y-GH0jnk5#cqeS>f-8w zV3(Rn5hlr|w7b{uBNq93he|$n^B&R2q!Vtx|1=y2n?n zCY}#704jq_!D+1dLbvy9V4yu&fgazZGso$~S88@yEEpp2Pw-5EygMQF_U%5-eOWf4mPnW)LRqn40fQaf+X_`gc zT(t>trbw~9ShdUa7bwT7Gg0=L&s0md(s9i zwh+^tMD>+SQ?G;oizfl*1kqIsZUddrT%fyQC!RawV&bACn^rH$={>pd>NFTqJ$`qI z9xy3;*lv5=<1R@6Et52BF-h+rYYo`H#%gvDwQZgqhtS=zyUU%ox@B_2L_P?$FD;5k zHNW%AJc{pCo)eG1Sw_{Mx*)r};+p?0_9?#)uT**ltCw5QS{PS%%J3n(Dt?-gpij}# z-@1e1Fm_;-&Q|K@S8{iUwP3LrPP%%LyKAu}si5&4L{eSBepBr`nbzh&3&Wg4He(bM z);;mm=Y)UnPUfw_*5OgzlU&T2>tneBes82lt^Zy2`TDq@LbT&*(;`a?&Fs-NqmB$% z%+HR6RPcrgfjD_OL};Ki%U7>n#zOMx*ohhs_82+{&9m(Zlz}0@&s0DR_rSc2XB-{AO=e)YUCBf_Smj8FBsY;j8;* z^&}57799`lTM)-keO!|z(T}!-_JgPXZx>8a0l!bVky(!-ozHH(yq|8dRPv5G%~kz~ z<2ha~o!HnZh)44hEfw9;9713C$$p~)Hq9l(p8WdIeiNI=>PP7%mDo_NG?fPIu*+Vf!@9g>e}BerzJsr8hm6hp2NNV0XFxOsJldOsv<RV$^B-TJFz%DpK*e|DJpQ zjgPjah6Q2!M1|`m=-8@^ z5S4P%H;aUUhGe7m;j{v$R zWXy;+*@y96Z?SMSo>50cMha4h`eGm>`z2Gc-OsaVj>i&JbtDww$rrMM-zGLE7rJYm zyjZ6wEIZaS9x8^vD#N6(Hf$|S7QX9vw=WoYB+@*x-#xN*S9N`!LCC60rJYa!AL-&A zw|aN>MJ}Rd?~MP;FvRgBGVGEa9}Bi3^t- z6TTKL$LG+6?{OnC* z(0?3c%uQlZ-yW4qHqb}FQ9o+(wLVoB+%Na|^oN~u?(0#7MFq5`6jdI7sk`VRuYM9KUfq6Q(va60;cN1DeVlOgpGkd{FRGxP00?QvNp8RW zF#i@5yE>F-9}pBx3@8xNnnAdBTBLu1K9!_&zU!P&km;+4%<>Nx)!~$4y@oSt9l^4f zz}ZjIwrZ$V-O-_|rN&uYLha@!biIF3e3#y~(mv?rfNufUIZZ2>$wteD&Ha0+^ONKi zBmdPR`R^AscD@7r`mht8W8@8H$7Lxa#X$=%#8Z8SQ)dj-`++qJW(b)*$##i7jF9S%iLF>+Swk8bP>Tr3sEZ?8O2Ft#q zmt?l2IH_%nt9Sg0NWY~Kf+bLX`&XYR*;CQXXb&vOV3Ph6-(pooMK}r};k2esi~42u zMvyW>ga0M&t`BtzC+JJi9?!NzA(}_^-`k3Enu1d3B zkm)(yJ%0*yWdY6h@lX&f#-jsO@528~i|OZNrOR!erF?2g&TN|Z3FA3X`p8?F1ykSus2M_k~5%_FM2avNeU?5X$RP<5vk>0`SmIoo5=Uy6z=>Q zHJP3HVSN%tV1RA9dzRaZqZ7Ri^(Q;?Q&O0KuVQRQuYE*l!kxeK{X76#Zr=h&d;`R& zj_(k+AEiFlYYm3oi~o*_y@-qFcg;co+<-@-nIDHZ`z7$V;*b`(EeCvNkT3u1&hS4C zkh6+)CLc377Jf6niw!z+&Zm!cH#kYFUr#sf8eJb~Ir4;p1MJYa28@weNK-C2JBk6N zho8Gd+sTD*^Lp!!=bim^$q0q?0cDI~7Ar+@kul3qXwV?_M;=MB!cFX zL=k6vWSYb^1G-|Z+I)ENi2pYSl3vuUM*m&3gwvzmnD?y2Hea5v7{Cm0)#wINMwmyW zSbBzO@I=l1L-@k|)#zrnL|?C4!-f`vii-dqnd9s|I+uTHtj9L452u0dNc$X=68cf7 z*R^7*c%Kl;K=Gq8(~g%J=xF(ZO%CueA#4KqS>6fj9D?*aB?Z5SH2|YmmAPfx1)(##7;A*ZjR~+=Lv>uT61jJ=wgNBdJtSl4xLiAy*tTH zOg_;!U^rP%9P3@2AuLK#+620?J6PPkNDiSJ9jj$<$C~5zl?~mdYUUL1IcyL{6XYVh zY_S15zFtX%9#DI-Cj@j$H@o+)YZsJRMfS}qZpyCUpC!fxmRnjxm&VZKhYrYNdly+O&4>HYp)Kd!%l9ECrw`o>r-6rY}4+L7O6fZ;T?eT8GKkZCr z?vNQc-7DpQ5&IdQ*5GblQUHWhs6M@Lofe4qK_cwMGxrPFXH815GvJM7{<2WQ_ zm0On&ngYBFk!i0i6B~Mm#CTE*J{5rVKjn??d%PSuYmqnX(E0J8zfSR&i~BvXN?t+z zzyq;e5K)tW#~wtG{Kzo)J-?An)w*ZWyJmrV2d;t^e!-9f&YFk-31{$R~M zFXlz=!pQ&H6#0*BQ&o`H%jOU|n~S8Qc_^YC)>gL~5#hk!h(uKc!jihp&LLfI*HV(h zKp|)bV-P2ilu;jAfgqX7#V+Et7N=~cE^qZ5WzUcuvN|CI4tO(;zn~F}h5@v5-WbHK zCE$>dE~R>Y(NJ6Sf#*D1ffBTw2J3e6nHuQf1ok|)kA`5s6(Q14e;_u)Wu2UT!*Hsi zlvMmlq7~M0VQ2gs1&%Ig)TkEe#36gK6IAitottik1q_uvQ7owB#Q}+HHVFESK;p>#)cfe#w z{j7vjd{eR)@j{ln{YK5aL{?)xE~67DK4v5o`d9JUl+M~DDDh>rDjCD|PTR)OQPOV2 zF-Oz~wn1g4Gxm8eHd-!Wl^hzPONO<91UwrJxgmmd7~^4T3$QszLK{5xHg=s$b@4X# z|*GftJ=` zgf7>`vRLtB3xM`9#Rgd0m%)Fa2Udt@6Vev-d7Z^fzd$ZN2zBB#Mcgzqb!|y=-lSFH zqW#WJM7Hz1?;RGtJ|3w+1cOLd%TqQA81|kcz%9l2PvIjAI(c!K6EOErkJL>+2#C&B zI@_xy4i1Mqgd|`088~rLBhaqtV!= z_L|}BhVnmuestNpM_ds!z@}Of)4vQ!$igJ76pjO~-jq5KA15l?*#41SOi}Y5dgn?0 zWWYFPT@eB@AMkkIZ)?-z8^E;%2FPk7axhZ}c)p@FvuX~VzV7gd$$y>=xoU9Qkg!C- z_yu~(PigJMW2sd(J;8~N2|o4?a)V)=GT%HN_wOhBB-7UTyaVgFzVHyvOt zL*tXJ8N9A4r*~sBo%Ob5E4gDtN6io~w1{L+(VO{`h0T7{(!NrO=m69W<9y%sI&gOG ztV`2s^+flflgi931zd6_WE?1vn2UMntcxr0+;{e-%@8cV@%7-qf}Z|wi0RD0o5)KO z^!oy{#Oy_1aB<#6!MwTKw_i|Fo!yy#vOx(63BeIqriAj%FX`;YN zWd457qB&%-G%?)}JP@K(GzS6Lg$U;uLQHK5f?L0bHa;DR)D!*<{*@^1H3}0$;Wm{4 z>>1j>-+OSGVepnvj8EvpH_)y zg$#ZRx_y0OFDo`6l0ePPPMF{o+$U#Z*+ws|Hnmy zcn0)2sVNYJ?bvty-D1@vJcDWa=Fl)Y1~X5~=SOpC9MBmm#WOL`g+!Z0K@Z33&7eB) zdst{?Q4sS2jTr#|+dJH)m;3Y%vw{C-5GZvs3ONgGx;)u(^HYS~!`VJ3_Vx9~~ zn#;78?7399gNZza&T@RI-a|k2d5)Pt66i)}Ef2lvVlgr7{cc(7P>Z7Gy zk>@y-NzJx{ok6+*{pr_)5*}$^JkE#7gLh+ffj#YHrO$F79Z!f68!8cCexvA6qGkp{ zIP#1a!!~K?voq^b6gqtO;broJ^=fUn(%D2KS~^-Kui6Mu z8sv>X44w*3P(MAkJ>)aw_-Qy7I-MS6D=4$RI(s1t2pkp6XG_8V`7N>t5^*LS z>v-SSl_MeWn?W{Pz2~numH~Q@B=8V7?uO7yoMl(B3)f48%XE_Y+sm!$^PQ%zV~i@Y zPjJ92sTkovEQ^a>kF#{s_jZ7egu_{IleNj_?B7{=*XqbER(Vd>YLoCaOnCm?!k^dg zOPUW0KsCX2@#sIR6MsCu)orX*ayd8PNwDB{_w!Rsd*=045=a$zIe#rIER+noMH}3* zG99WfCeDLkku1hZ-l7VqYkb|tN2Ze=Y0v!i%7iCbFxTxiMxv!lVCoUWT05i5&hWE? z%qRE+p-^?;dn>@um5FXJ^vI0qqeNTP!SKsV^qV;J{X8Y zL37(yop>w4!oQI(;TGexu>9tg$lp6jFV11;=`W^mQd3F4YT>6ue6nV_sE4qXgzI(0+xdOEKvKBza=ch5h%|bERj3XOWVnhQ*^sV@ zU%NXzX%n}rG27vH7xhQbr<>|Pyql(pLG6Aa)p_ucd1{Bq>KPYW$GRm)4p8^t(7|-4 zCo2?)%Nu&kSNekdClE&`XL#U{VjK5&eMx(n%+w10`(Juajw%?ut}z2)_O11DQ{Ul4 zf;`Y_;8%YT7>LQnLW{}&I`aQL7yL5?Ku6iuL8RC*S|h@lJX1}dYcvdPKE0B#L1?<4 z--iSS{V?-|(jG3)WrrCt;c)$z73ykB6XaoKuY=vW(6YxA||tgrChf>>SD-5jvLioN*!vCH0Ydgv0HW{6j3ES|?vO2=30? zFG%XG769jIs8me~sDH*_ZxsmetRa0pMBxhp-EdG_Oh}q0qvy&W8HY8v-X=ThZM@GA zdt1SNswzo?W5GC=8OaBNXd5gv#BW%i4($p`NWi+oc!{{-V}fL zcO1;43A0J1gjc<->W{?Hm)w)#d^6^tB_&BXbLrr z0CjVLADJheqt7OYt3pPDWdLuGO}$)lxVlbH>?4_(>lEi<+=<}^uPb(p!nnB#m23!? z|INr6dj_f*-FVkznU&%9WB35<=z}v^W79xJN3lwsZ`+U=VsDl~q`!}mY<`@>*<#c| zd7L?;mP~$LJA=rMnLfpc?ATB*(t*ee*NGa(9`d5|evenp0Hr@n4QdtamGj2A_Rd;6 zbV(dDll4XRkyP-V$6gOcX4nT)FH#+G_%@_t_7vE%FWy;Gq)s8iME9Ut?Obv|)d?bgeWKzHwqYMAxYEhOzRJ4}(#KxNcb%=(6X z#vjQ?lBGI)J%`LjfQO_kZxEfE;W|&sxwI8mwH`a9u2Wv8;FU?suV6gK&ZeR*@=s5$ ze1nx-)N?!y{^uSJHnME&+`jtgWYE?Sx)pUkTYTs6ld=u#Y8*mc*|JB|6l}sLJFw4? zO-{fKDTAErhLQ_`b(O`uMxsPmTz0H}FaV|0m^K(WMV6{-`$(jM1Omq@3*Zq=#I+yH zcu!Yi+BZ`$hy@BsTStMkuEyzFG@!20l44_u#hwgOSC91PRolKhAx3jLDo;=N4J`xy z$4dRL@wy4^1_?YAj;G^2uQ%*Af~X7VHmM1q>Tp5{X}mj(Z$6J*$gE)tiB&W4J)f3_teepqTmA26Z6UU5)NLGH^#mKN6eG; zG()_T5giI4zjhy54DMc9SF067ZC9DPz520hZt#A9TvAz)bxhegMCYM6+J+~IO#=+W zVfF$(4x~FhIfUjRNm`W4J~ujeU+-YeC1Qle`)J6sd`qleMO#7Cm+C0)YWrUswWisg1Ut-vaT`u{e9Ui z($-UvzC%cln`)+UJ|*DoXpLy1=~gkZudyB~R(P-6i)Bkz+=k`L6!44l){>TW;Vw6} z?TOD+BZiC~AjO@*Fey54GO+!)td~K&uuDvUDy?(4aPj={GTnm)CUf&CnP_nQ+9+lv z#_N9ki7W|cXQsffd7TA_pEvUox2)vp$FmrJJ0?$ouX3Ye?0kLObqybxOh?x-x9gjj zl=An!$b6`Nb%ECrM`NEt(q~9!6ap|lC$1yIK0Y%ADxkRMUUNiDun-uGEGKnv<5ccd zXKzCf+(6qw_5mfE088|;gq=>QDhOM)QuhNa+0iliLIS4fJ$xnS^c4c%9EdNi0at?h z-Q-h|n%ay0o2i)5-uJKILPm3YUL)%lDM_)I8za__8nOwJp0ZR2zpK1%nDeEKlai}y z>Z?P%jsBgzP%zZ>rWZ$5}mH4*3{dv<6! z2Jc8ZFyf+`j_hn4DTsX!xLF@k(OV6}A+-dX$!$5$AFO#kfs3EmmdDoPTYsn;Miby0 z;kLJl5atG`SFLmlHLb`ZFBvt<)mxVXi^VnA)S>9 z=^?P-0bO-?d?(s#=-%d5`MR3FDN9NYhTJFT@vW4D#RbnAq&nR_TEWgF>5TV~WZo}G z>2VklEeUPoYI!HE8$3^>M{5M8zpLnGN-Sc>Fr^4NI=kHi2DSu^G#8F1gXB;@mnE2f zGrWF4?WLryuLJZpI*6ta>2b5V3=wFx`ov#p(rp%SJ(cA%eC;OO^jx+3=6EuaE4S`Z z@TSUhc z-*h%0DsOtD`6rh8P>GC7S7cobV-QR%cg|=ali!pO^%q61&$g=O6}gQye?jau+KwoH z7o!I_&$h3RXq>rEEha87@QXlompvQ$!XU3j>9E+7Nv9$GRyHms&Zyr?RBWx!@6M>4 zq%=T0VS51yM;zz*@#Wg=-a!snh7=#u@h3&U2B=qhT=j%J&zG_3MoSqSWFEHaM z#cl5OWN`E^aT(+D-kE?Wu5VEMotcB;tqm)V2Trw+BwBD9_7sy-U;FGd4#On%mo-$a zbm$;+_PxuE>XE7QHUW{+welt{kX~0(FaAm4+gMD+&&1hV+N5jQl3Vc!?nf&xntfmP zgor&K)-~G|=iL>B`3leFr^}JoQ324NRn*!$>4qo;q4XLZ4ay69em>CT+kBQHH7GMF zc+?i86l;x=%APY_1tBC%P@l*3oS*Pt?A_RXGg^wdP}i9eFTz~9RrxCMz z265Tt13$JLp=>AXduX*J+L=n^QTjU|EE1ZFo}c=CZMM%V^^gA3Smzuof%nj18`}7l z7jW!Hr{`9<;qPFMFK{{(LSK6#u{L#H5e?VHVJUU+N>{l-_X?=rk66wR_H>kn-S<%9 zmy%xfoSWhPC}Z0AToInF*Z(M}{O%{`AjNu0l@qMhF}8z+NJk(T4%~PSZPeBH^z zl{;|zWypD=6vO0oggyzu+I;WUXrU&Es?xYA#`<9d=a+Vh6B^*QolGl|=sjmk)L$NW zn(7JcH_x4L=<39!fsy9LRxkdDs_m6tn3x6wt!X$1!{G#qi>M3VU`Wd|6RihY!c4oz z3~ZjA$;y#r)u;|cPGcMp2UoPBj`*uUoFh~!3San5x>Je%`%%LGEhu`R9n+1JRy5(# zI#Qc&C4E68^l$_rQ-s^HyZAYo*)XtA8f$ZusQ8{6o2oaB&Gy70_J~QDc|9oyjy;VO zFoCSA@z?VFQg}ujp&Et3Iu7me4dmu_s!AO?k%i{L(|S1fn=}S;s(hbjtI0Th&WzCdm)Ew_?qL8uG)>) z%%%Dxmk znJ`$qEe)za4v|{-S!l85DYTW9&i(wo!^NSb8d*azbh3n?#hq$(G5{tu+oG?0hVhlLjL1Zw5p90+; z1;$O^_SM@l*i=+8`T0jrJ+*ugoJQ5*OHn};jqXGf`@IczSVvM)H7&xW&>+fzs2G1Z z44ClE3Dk)!sWvzKo`tH5c(~fcIk(>U^&>uDb0u~y2;mYi{gNw>1&T~d!)y=^w#!Ep z_&gWVEN6gwcqV@WoDml0>k2~R5QP@-d42zjueV@|E9$y+ad!xfySoKxaWqt&-y60Tp=!d$#NOEGJ@yu5@}PGm^2vBT@3KDPD&AvZV4@()xasfuL{oCNK+ zMCYRGk;vGw9i{|AT6@zWvd-e0#l#?9-mVvHi7>T`4vI+q3k+v+a&MnDi-Q%q24iC+ zpqRzttDRWPqXc)0v7lma(99-gAR2t#sc zPN|HcJ@T!14(p&q&i11mq@y0XCik0SWgZ1436IJdh?Y?gy==@w@d2VF5o#c0F1?kp z3}QCKm9toxRP69=A%zvmE&NIN)~tn;eH+IRs29;e+mCJf)9>hYoT0LM;9jD{YwCd! zyv+kue=s%F_lw!}!ipObtP(?zu2sQ0(!YLcIbg}s8|UT7ASeW=-E*e-#(H~R0^qZu ziPejEZI=NFm5SvU3b!=fxq0mQySKlM!PU4a_eY~zc_;Z1pr#aoFaF5wlsS&jxAO~$ zAywTk$i}u5MGc0Ha&y=ZeK+)8kM){vqJ%i!Vw~3dBLqUX$rHmvr?(1f51{JoDo$3b zfO6M;V@Y@>AdNLO;e^#RE)uf+sk?5nQPk=xGnuS3$Vw#kIt%7-07CUzY-PP1^+d#= zt;0lgA0AQmsxjH{k+gF>ob7v{Cr|3f?L32XKzK1V47dW)+WilGRX^7|%ykI#fr;%n z4NTdqX3gHI)cOiHSr-m6ja$D?g#xZu;ZeH2p>cA!xIH%{2aBTlIMk<9>GJ$o6fKr( z4Z2`_dFoUi;i4R%p&5u*{JK%l@Gn`Nhh6PMr>xo9 zqf#*#b&+faq#r622`~@pa^KmR--E}D6}yDG`|yssy9%CBnn++z6lWofhyAMJ?d8aO zOY}!`Dp2d|vi{FP(!0ho7SWjF_mFr}W~5GtrGaVzp;roj``ZS)ca1%j`Dg7RxO_NX zZT%89k?>*Xj~^dQn>SJ^0D@kb?c|8TQl`u4t(aO1f2vytrCZf~`G=;ijJiM}Rl}CB zH|k-kzGVO#Tf9685NWXyonduhx@Ilh$L&{493!6Mt)6DoP?3uK97FrK^gYX>FSXhI zXaC0pYhhtw!ma~L5^75-V%yyz^NlLV$Y22#NA^qYk^u#K4O|)eGkbURSaTe|C>x0r zN|TYGA3(|2&vdM{v<&!y8#tQ#@aaF-hJU?lNgMhi`;_VYALf=iRz%Kt-=hFr4u?VX zjzE*>6eUDSXDd5IWaKdIV1m|T7FF_$c*{iDx@7uWX&U>3e)FtPd#IPzt zCO?+DoBgHb7KgXMiu$+g2Us-KS7gwPF2s}glZ+i zA2i_;-?A;5fj>d3+)#h&jetWW5j$FjF9LkRy+u({N6+SX6is|Ns_Xfthr`FWYnb5E zm{BI|7>;LMYW->Dh>*tIT8x7x8wz%`zV~!7aDWo*H+y^J>dQaZw8n<*(JKAaW~E$> z0BY24SiIh}Z0nQ5zct6GU0pR{-l`}#~V zLG?{(+WauO#ckwfLa(dduX_iAOmhMxZet!Hu zVC>3Z5POft+m(jk=0PcZ=`zz7MvWNQTluTd#cTV2yN0-~C51|;kRa+}(-X_oMRpie znpR?c36zqme@KVvrcP_opeo>o@yW|=_?wtWZF!OK_IS&3N47M2VQ@!SY{=| zF;*!01(TO*)Of>;d!r!eOL1s@4EHSt5kuQpAE`Tb%n$nq(~mz6-cg_`!U)bk)Xf-*Pwl=j@J62O5qoa-NkGWmlr*Xeb$xcdq_16J6eC?iOH3cCj7Yr*$^$- znXX%6Qj9+i=ealSDj8XCi99nX%W-xp`0N#nA0~S`w>S9st)Mxvrx7=$;tJKJU>oZ9 z@31}rCgK{oM6V}}f?gadCWe`0EP2C3AWJIuj^?oJ z(Ml3&cD$(qkJ2j>nu1xS+!;qW#4KKvhZkEdl&aqdESezQiJq+xzJU^FNBwfXi94Z>pJJgdQ4ez zhQSn8*cKyFnlEW+rM`3Sxv)}+St;QZNg34aQ4XC+yk`!Ohf$h1na2melGCyi^sWX> zT*)?kA^oZtKFCEX#Lfd=*(8~Z;WO9t+6Mo#;TNC{68aKBd)Ios?uuPFqVJ9z-b&07 zb_Qi}(!GGu#Ac`K+l51GV_n$YJUdjeQ?tFUxn5K&GL?I~xVc4(g#yEQc#Ya{z!s99 zEkYw{05{PQz3TO(yL}F2MGs_%{K5y-K9=R;ry>6`iyBK&^!;|ACUntT$0&?dZ=rNW zx99vTQ(>)FQ0Jc;R|T9x^jCzbgAr7NAq|tpMpN!nZ^lvykpB%fTP0DLY30-GXRT$Z zCT2O*Yh9RJYU4zfTh&b6sG48RGoZPM7kVu4vQx z0rXGqxWrsH8vP%eBf05E`%zRk&M+q6ZGIQ*A*M=jzO*?FTg^YZ>pmw~A2V0LHH;8% zpA`e|L1)i}+Jh_V^G5PfMeMY)VQV{Xzmza*Ama-1X-ibt=N2y@>yDmVk>*^ukqvU} zv{dN}Qa&BKw|Sq0tg&~HhbyE-I0Z%Z_>5HB4My6#qwT??UYsHyxN$%pQ`{6;>xUoD zkfT7vp^AsCqn(t22l6%GR?6iA8RXTCd{NCV_kr~?P5)D}Kf~oVK<^Ms8^`a{_RbcnyB+lC z`nSe@OA+mRQ^e<$C~2y&##E6n={bYrJKO~Mr_jvI(CH;sbtA_ndM2M9c$ zn+qCu=;E#Yq|zJV)#UI0yh&|4OrN&?6Y`6&I}9&wyik9$Wk!e@MOgbs7p}V({Fo!< z{r=2}p%N338t1c<_*@kSn`})Yt#|yHg#ZVRc%JZ;F43vdP}cMzGzP>)Lq=9{vBua+ zO+XcSF?6=7-5|0O&!aQUHad;*$^nst7cMhmx%s>-40FUz#Uu<(kK#Id3e*`2WREK_p(DK{Co_A*VT2^rW*wYxLEXdaE^jq4M@gb#c_r+#f#QMHi1hjEEv z9PYPRef38ebFDN^PK=xw6pi+-TmD7D?&m(l-o&#rdan$TqHY7PK+lgNV>kHJ!SDFQ z<8=caybf4Pn}HF10h(CWR`A)LouHY{UV{34-Z63qDb)s%MWc}<0Dc}Yf*3K9a#h8a z!jB-I9v?*EZqG@SPui>AbQA6fb#S=6qjK)wBEZ3=Bd3S(Ym983y`k{x{!3WaYo{SX zY6`#&<0p8r5gzHcm*;9~#FO$(H}ZdEV3dk&E=!TBW#NHfvs#y0YfH47HjJL3B7I?@ zELanpI_%=fdW+1y^bHx!W44l$#oUxbd`nL7g_5x;FHLAM`&s}P)_C1e@xi-iYpxc1 z(MMNgB=fl}jCfochSHo)ZD?Hq7n{+PGmD^Ui8Dj?Y9jj(V%q2^&FQI6`$j@MNlyI# z10()lH3Nc5_zs!K{U;FG4O!|s!o9`Yh3ZxMU;rMrWfwJqZ6_W=toY$P^MgD|fIU&j zReB(|-A_co;1KfWi;C z86lrw+WLxFXBo1*Zu`D+S8Nv@B|-cfLLW+RXs4y7LVvFaFcNINUpF4)O_?Uv=fW%y zfrR+QOXnpHO)*mk5ZFR>wiWlq)B_n1UGqXze^gZWLR6SXn!Uu)lCvLwJx8Rm5GJJp z(dYdHZ;g132OiiTLt`63QHW1BLLNYx{FH%Xv(~%GXarL|ZiX)uT=DnUb zGCRsWC2L>m%XNDDkU!KDg55ov7H`L3qmS_n_X_LLeIx~YVt(yOJ5K2ZNzY@8+C__L zAEa7g$ztDfVz7;9Q)$)t!LS#;;Gz>1W@!LD?^;*~&zBb2 z-+zkgbimw~hF4Hk{;AU1_ZaG*rb4%{B1t(I!4rzZS;Nq&PmW+LheDIY9 zQ+Jl%DtUjHmK`mmk@ZO?j^4b~M0|f7hDD_zBu+zA*0=_fJSw$S=4u$Y79(H6xTdd%b96^Ibv>1eq6hv(}?w|9|F{g}q)Q1LofJGzHF7)KVJjeRrAwG(C6tuXlX4Jk)qZ zlrNpTZ!Ba)HTM{QHkWomQBZjuJ^xJ;{r5*RU;;U+Yd%7e6s{XShN4`^U6Q+cZ$@La z_3NZ5bY>sBCh7rpoCxq4j?R<#Hx{M4d%JwzO+bR8^+`xfw*jccabU17fB^ddxp8H= z1#JVz4WcL#x)!>y?r4ooErY0lrQO{a`BdyRG%*ihund1b5YMY)BCCyI%72tmVoUOW z2N?5qN}ZGNf&RW{DCa8~bM(F%u^i)zSc#E!2F6Pj? z)5YT}3rx=Bt&^;A87O5o93tzOpK`7PTQV0j7lsH#Ui0f}xJP5GzDfs#l=Q{QP`IUsHm! z+Cb(As*+3nf5--wpszFP6=RihXZtb)wwulZHG65yLu3qn`<0>CV5S{;0@7t#EM!Cr zH5ux>Gh#RZ;&{8PKSbDkqWIUv?6Pw%p?tcFc~<%wOXy3-K0>J}&}(t&WZ32oO+4?o zma=0sike-&AupOKlU97YO%XN7tL<^=S{j6%QwlZ-<_wCpX1@c6#YF z#;K`4NR&)!XtF;CoLAFWyWh2)7g#_Lm+)XF8G^w})$gu%P478`jn~aM+-2tK!bdy% zOA_>~I=Dg%sHLKU^1YF9&4f!H`NZEwhkT!fksKlz$V!HnH^BdE&H>s8qg4?z;oTk* zLWKl3^bp7@Dr3CunS4o>P&^n{CMtqWd46(#v$jIGBjxqA=-5c~phZA((JC^Ueef^| zU`dnD=bzej34Wgrv{0yEP!@TFa!i%uEK0CxJ}c-(01EmPDwz+Gu(a-T`tqG?1q=Y! zO%gy*_0mPsNWF=<-kXnPJ~zTb@o^My%;ws~m%WV2Gi8%`Hu6ZVB^85(zs#_rSs`Q? zK72afD@jdQB^lxP6xeE1Px<5!)}ZhS8|{m)4FT0pU;erW_ihD>2EwQ_wUev&Au4YH zyV<}^kwW{TQ7Vv53&uH;i4TDM54o99mWLcp?j|FC8@1>Q6xkxasYM!d1sthoPjaS& zUW`lY^GDIi>nqs^suMx|1$6ZEgcP|L`tkbu?-gvKU|sJ{{9k?u{daOS?CQYAE22nh z9d`48FK~t}?D28SmQ+!a>D${U?=G|T)W#F%+(mMbE@$UNB*~)yrMt1SrxX2{R6+0B zM6wwPZS@AuS!vqL(|>sRHn%r9G+y4w1t;|vfRlRzlQ(CQK%TnTbE|*XJtmQ)fKqHj z=AsEYBi$fwEdRjTb2N0wES`z1B1M)?iXYyhOi}$%8s(u0GBoL05a<^H-T+=BJkn zz+mXuD^oX3pK_$8&C!hS*PO=2#&Kx$|I}z!{HWPEa3a~Q4a)}p5i?^Qor~|LVihW( z%;>hk!rtDif3L+(rNhpS$#w-=;nDmK{Gd+)pwSFx@*C*~|5KX7F2k0%CggpoRx~y} zqtIxlcI#u*dRvG!C{45INI#<=McwF$GUC*9*_*ZhNlx;EAM=JZYXD0Zy(a?ka~Zz? zMsU@id);A@|Lq$Z-Ge7A!J!WuV(l-#$xgIp4jagjw=zYBEe+$$Xm?_^9wbiw#ez+g z+=%9b-q_M$iv;5!y`DJ+^G|m|SUYT44b#*%7BOu7{_u1h4B>RWQIyO>z!Nx<2h-^a zSdG`Bswy5kp6sTmkBW=lIlkUFyIOx#tyauihgMKCvz;tHI3$`KFS_v#_QEHrEm-Lr z%9OiP;k}>UDVGKj#MzT1o#=yge};EX6JH&y8nzs@0Y{&IaU=r1)J7%&2%vj@Gee6@ zKBM;}h66Ni#w|`WbI@`tqxNbd{uO*`x$eN=)5ef2y8^-7*Z|S-&P;Zyq{G75IVR00 z*l&l~WQ{?52xJ?Ue4$!M!~rM=B)$+aWos}Z$<^hk$P3cwkw<5po7pQ8{f>l%w4q zMk(rMDSgINg&!}syj_=Ye0mc*R196P_dn@y3UNZ|Pc6kQ@89}64abS0@@M@V&C%p>>=Pvd^vsy;At{Gev9kU@Lf$nDq; zKMhsW&}oCsggNmVvgi6iaIQfJdf8)DoSKr!Nv&MbAUinv(P28{m+xb9)gTPG`4VEf zrEpI`~`evp3KN9%h3ic2u44m<4V8oTtdr z9>|}8z0_i)+JJG?eomk*t-e*_J7UGe|AIEur%t7x4bY97Jj>Kb%?h#vG@fd_L1j2KXaR4ef_WI*^hh*c)7{Nn&@@)pJs@ zelj!X97I9ro4SOAkstNBl|+ENMpP4j$RHWj5dWQf1OGnf|GjUL22l#m4)@4o;xGfH zHbP+u{*9i#p^l>FY#MQVKl`e+Xf&LBt8P1pGnFqd({!2Z4>PTgQbV_jDd9=Ds;ebt{Q#-$X{XBe8ynn{+ za8Vs8+uPNUYVmrEFD%;L+L;5L!s$5Va60){eEhF{1}R0*k$uW73hl#S^#nH&ZnKfx z#tR<pGrH`39-xewR>1IX2(E4ArW*-` z4g7b(kIH(ESJ>$}3LrzzAvlQ1B}BV$W^%`M9U_J>DHH?vctc4~JD|{|2~k>?&gotY zE0r6f>>bB163fb<^qc*52F~CjP0#C)u)mS2Ai*7XWUkWi66q?Ix-a`-pt10X%^ss> zsvHdjtO!wjTJ5R5;2~+*iU5AtFkdgniT@0R+EH~JO=dYK@Y;qZ!*dt}fyrDJG}}Sp z=Ac*q1)k2~#a3gN1%l)mL&<$hYO?&T=yJ_TM{AVds`)>Rmh%c5?*$JKe+YI)zM!mf zli;c??Q8}5ga2T5*(K^*h-6P~v2czzpcy-v3>T5G0P0Q7@zP^%&4<6x$2<20_!Q;+F z2S%TxRh2`#?nv3P?BXi(4PpZMUVPQ$4xlPN9n({?osp?VNA1 zMZvv;1Z#6a1fo|RYTe;&XcQe8eMeQU^JEjlPH0)neJcXU=G*TY*H>Go(!&zqi}aQE7e30C2N)v$=U ze;{5?qON!z*;-yxIe*&*b$Mxd124ozK2HjPiQE^XzlEMP4MK2t22W-EWzGVTlK~zx zt3rt;Ye5!rvJ$JRzB4_O?8I_RBVre0J6&!za-tl4G43unP57NsgKzssht!-6nXyAe zj&OC$8e4(BsB2snUh zk)RhaR#YoOXZe6KV^2rJ#B6xC;a?#$jU?#tx5fDrF$4WuX?qlf8+k0@UmbIAZ6vtg z8{D8OS%^rJ^FdNw1&LHtcRu>MP--bb&_GN6;Dsqy@Yl7JIz0Nh7@z1Dsk!#16!)4) zpB|>4XNPn%XSq<97=)@w)$e~IY-GZ>N6DVmZbD~_x8z&LCakC?9%DK)+Fk*&#>Z(U z=W=h^`y({Jz)-J}%4m$b#@ayYp(ouR?9T~e5j$D`bj2o8POOjoa<`l@tob-IJZ>q+ z^2mB(MZ0E_j2=rXB{cSN*Y$7_oaO2*vf6_F7k=Lva?FG%IoyJfBiNz8x?qz1kVCaJA~9AG(4wgy+U&dqUJQ-NSfa<%FFaQAP5XH> z021N5YUqMj!Oz>8nF%{sy2&^x;U?*%Na!0A`dsF0d!(HvrHRfI-DFckn`3DW%Y#(+-R*odO^_~G)Ys&POcxH7e zf?mh7sM{D3zErOM5QuE~MgCSa%E$v(tlPf$`ExF5)4Tuhvg7_Da}G+Ze_m zS1f`>=tpuEpRJu^fA$HLVO~mz%Zr%!0Y~sj5rI1%dYp&xx|1Di zxodf?K)GX`v~{wRFj%oV%~`?3(4SxWupFOrVPP(lG*aW8*Nqvg%Oz00IJV?opF$;z zA_AfUdD@w&11FKdm0x0|@9T_}~Vxso49F2+=s z@!V2&T+z;p6oK79H<|KMV5{GdqmpGA4o%Y*)(5N|XUV7wDWnQMVi-jc?@!OHu12S| z`F8NTV{z|pm^y+%ShYO}5~1`vl0KiDa!C^Sfd)}5=Z1YvIS-Osv-Yl6$4YbU8t*SyfLxN4lESrlb5rLy)goLfIv1|aZ4BaWZJ8)6u17CaW9E8z}9N$ zg}~Kvk8)w*vuE7{!ZXla3Z3Zzlkc3Ye^cUNL~BN%)cpP3P}pxHBJBXbVM#>pcx7=! z^)jrob($l1lq~TFe5vB(Yuv2$w`x-b>#$jqy6Q5KBp$cVY>=jG+we%ejR*s)OJr41etKpOpraykFvWy{bSjo!bG7Djyy zPnC;VMDHMTUd+^CXD_qXuKzPfH~PC6VjZVu$htV>A4GQVOi^lR`NMWnv9w zkDV9=6Os0=myK6y*VFc%ilj~Hnfs)(@RA^{85fXos^3!LNWY?I!gU<>Ebq>2+|49$ ze*K=75XvDb*)_z@iYQ0E4Bl94E@SKrriI-t#ElYs@wrZcN$}pQ5DuL?^suG(XSv9QB6au+G^& z2!m2W*QFBYGoBLX*1%Kdy&zA~`KF@u7~ag$mzu@~^vVg~=jFmWZ-Y|)$i@E8JP7q( zxjk^0%p?9OoEL_lMLT};R+RFe1qf6*o#T}1h2g>2>!4+~Vh*yOFydnfvvK^SlK z)eWraW~LriO?K}N(82;;QZJgi2V>Y`f+N{tOST_gx_n6seNxMbN4Rv(~=gL+Gxaoby@g7(D*Q{sK*x5gxZF*HtWdHYb-4`US0TBgl5+2RXC2f zOm8;MI$$lu4gwNWI{%WjkJ%%{1ZY8r%Pu?p_07fTO1jeZe^sMm&)Ez*-78SN`b6#H zaSEFCU^zn33_#xtir-?5)iVTA2Q+N3OgcPr@=bU|1ZiBdY`HbSPp%H;$qo;%&Asj2C8nkn-kR zSsXb&7jjAe!>*MF>!FTvS)eOvOrO${ggoeLdOp~*m*_UZJ#sZZuwM7w1i6Gbj#}8-XwN^q(7A@x=bMJ7pV&}x^`qw= zyn*iUbWg3p^h}?p7RP=6LDR#C5e@>Tk#!1D}7N*42-fPxIn-mySFr`SrEJ4;C#QKwh`_Q(lDp3kqV&vUVbNRA11nItU_rU=VdMR|7UIfZ$w%0;5~{;UJO#ZTv!6bNI$wpQtbTc_hJRvA z6}deZ&E3Q$Ab>ORlC%B#@eP^n5Bq#OP^Z(cSHYtEb-Bo^bB(+6W*0Gm932H-OV!x2 zG&uKkX?YyI&H0#l@0KNw?A*93ceDRFvbmm!DLmZoUDfo?-K7{*TkM4P9=PeUS^D_gwyPXGa4yOemVNE#GWLra7 zJkUUE0mysr!hoE3Js}NkW4i+bqduPwzRUOET1DX4^ zg7Q_nOVR=TZ$%izAZ!uw#!_|OA; zjffs>_%FXM1RP3-Hw4pz(bC5^$I#4tyMYZ@?!*)4{^9Zu+@2@wepRwpCnDiM!^GTo zrL$-Aqx9chjBnV(-o*}F&&|7D&nja>pl-0MpKup-+iLrSBq7;Ha?O#=f5`b=;*dD8 zj{GN>#46nin=7J(=}1QFrtfD!qFCO3;Nvx5*JO0a`!+%h5FrcG&v63c`}KaMxiHIgm?manHqKMn^nDWU_pp=ilO}#n2JZ7~_`!72Tg=QNetS={k$xTFadQo!b~9U( zJ%;u0#@+2M2raV8{z2!z7%{3uls|J(CXJ2YJy>R$~usKK5-4fE>w z(&Dx{F7Z42#m;co%=Gu5<5Dlb^apd;IAXAtPE!* z;~I?7q1D{>8tayBnNDW@+{_gP9sl5u?JM{rE`;ybVn(kAhbw`YiGK^V{}#>)_V#a} zZj!aBC8TbVmY~)`X%BVvo@#?nLJ1??IJ0T{x(R)H5wsbZU0*<4x9ANQ3t|p3mJerd zH8ERfDD|S|##Q!W2mW#|0SiOlP3Xxta6vciPhnMWO_8q2ud#6&33NsnV%J#zaJx8t zdc{a@nn-%`kSTNDV#Ss3*FLL$9>_hYb4Q&54ovyHj#8}AiWPl1-agq!ppUVF+$w0d zdpEjQ z*WA8*IxYORh3`p+0_*y!hh2*=-ctLM!zyjf%brv(rDHisS`X$m%%42u>qel#yy13`(*)?WoSX`X-JGqR5(hWhEx%tO2Y6;>bNgLPI*E>3xxlbh3oX2pyCbw13zs-j*Edkvo8UFK5&siixVpB7>&%)i7}$I$yA0X= zl=~CWUX6I_=Yf*X{*oT#fz!ynqV3INZf=gH(gX@7s4J9zbo1bCk6ek}EKZq}j)Z%2 z&8F1*DZ3WeNTKB5z!M^zTkthwIomzf_R z$K_?5_;WB6<}mnhfK6 zo(L<+j3tuJ?qYu+$rZ%F9#4b>PMjI_oo?XX8;uhbQkb0V5pRZy$WjY~5LJ0hANFtw zu7X!=OiiKINftN0Go~;USS@EJ(5zS}T-0J?Be|VPc)By-Ww`w3w<=Z|0og;c-aO9F0F1LE%SxEz@9QMt6H#6yl|mUgdfpDHetAAv^~)aOmyvu5s|7g z{dOT2mh;@40%SNKYrUsW1ZZzB{a74{a=YN{N*-^#L@RWi;GxrKmzK?Xw|2#fL#?Qg zRCuP#|0LzAqst)dK?;Y^YKR;c%GbA3ZZdn9k%0t<_}nu|kLSAQr@Iy7bm1pU@TMhQ zK%ZkPkHC`3&`k7zMm*_RYzl+lNioHiDK zJ+f6>JJ|OcJe>dI;;&b@0oGHqt&@KY4Y}#H*DPi4GeA2>)AAsnu1WL0FD zp zygUF3M1i7)cSLR0PkG%KJX=`y;IswI%wl{M|6fHM>bs%*n(?_nJ(o zJak45pF`g)Oo~FnEb#@J8((&UiAE;l&;k}0#LB885c-F|BJT4U+}hMuA8RB>K)1T@!t=Xdmwt;Iy!7;<5O^m74*8eLUc?tf@efFAzLJqD-OxnO z@)KLzYht)OU`oIN4r@W1$B3du(`8;+?i`(7CWuc$K~IFyk-N!>qTisK@>dcXGp{Z` zMKdlnXuZFLRPKYybzfC^aU6Abqi8oGz1zg4+Ag{nK7QG2;EDaYb$LMjJf%^Dz4OnS zK&L(RjmxEuxqY1M}kW8x?TTZ5yOBG ztkDDKu#7S!IB))BGFqVjS==D6tlj_>d`{;&xJ*N8cGo>~lD}_q*^-+Ri8fo~&XhX` zSmPD0rXD77e}wedDlnImb*JN+yc;x3;$YCMyqGBMBSns_sL!EB%S^bI!=p7rE*FG>exSS4$uqvNR8QGvs~s z&FCz;++)akH`D^9WgrPi==WoJ&wnC@Oo5@0;u7fHEg-+OMsmLztL73GY4AuSd< zTlW4{c@4={B_j!BFh&>av_nm2kJ46XVjD_yL zTI|i4FU0z645S27X*tS?VOYVhn5{O~+=4{S{kBt+ugY3c< zE`vv`x>?f!5k8Db=W1Vlx$u)nWegu6KifQ{i~<;cdBf^H4M_>PJ$ITBvK346^9(|L zGIa__-$TZ{43d?!$QisgfvNYFWeHt1#?;}nDU+v9+wscOf^H0DeziR(w1^d;l2TxA z%Uh27fGlETR8<|?CCrVN@nfTEzC>138dtw6!EfZduJQOz@|~wPc|`dku^4+*f;jmH z;Y-zy>nJYM3(2p9bF=vchcH_$^$hmBv4O;Y9UQhpL?kWGSP9We>R-MDuhOG4tcVgL zL$^(#Q>IJqehOCji@7~f`Gv_q^14IZNJGF4VAH#-U`98d9ugY~{T&5k<&FZZ#ihbO{3mR>nPY{+?HTN`-_2Ek8GWl1 zi{xjN1}?yK?Vj+m7TYtMfAkj>$S#D#<;2s_`xc3Izhrn$@#lJHsHVMKp-BOP;z3l~ z`h$$ir3}Zsk_%ok4*m8~V_cM3Xmog8u9aHP2=Yy>@QO{|N!|y$T6EYnt;EKy*yMO28h;);S za$bZZ7gfRZ3$_ydvKari7At4!^az$#d-XxP7A^gehe>>fg zEdVC5f*LU<#$JuVzC2A@yR+eo1Sbv_0xfhe4YY?4B#`EhlC$~yHk2+Z?b-7F7wDhQ zT^SuG1WtQmvIa#+@(lACI7Dz`mNg zq2WYf(E&VB{&|02FXyHC=pSd=|~L9OtG2 zOva7i(u7HV?yqu=lm4vPmnYk}q5zw3f37+XK4*CTY03zw}DkyD8JV0X}DN(l7}p8oY>-^@um|KfExNy>-z#n z|NinMQnWAj2SFY#G36BHC|TCx3T*gOm~F6r?#nuJSNOai`_Aii(xpf9$B@a`>xMWk z+9wr`*W7Lcw^kvL`3{zYKmdNipR7ypnUC^+6el87E25)2r_0Ndr~dBm*&nGKM;o)V z=y`eZz|Kv^DUHL^-x&=U&cF{u(T=JE^SCe9m7gBSch=(}e%G5IZ96;c*Bc6K-ClNk z(y83lP=x>^%AMEW;dOZAD>Re+$LluUZ#T}5PZrd9qKv;X>ItUFMI?HU9W#iC5dggR z`fVSGL0U9H7cDaU-=9g?j9Vh<@5ry*A$YgoI}(Idf@{(s5CaOK;HH$Vc6ut(ZFch_}+iI zVZUH_Dk5{Q>V8wVn((;)jPuw6dPp>Vx=)OD*q-;|Y1;TUn4SL~4E)#^L3vOUHz7BO zRvA5Tl;r$&C!_WH4DGzdyL<8n4-PURe4+$w4`S&fTFlg~mAwH!h<^zUQ4ED_0v$NS zaHDg|vt8asl{!8;(GX?ndNnDYuOR6{jFwD@(ik~G==4t8_r+W%YSWk3dencW&ifnQ zq171)kcYmjJv5ea&FgDL>^CxGN+$$y+Pj{3BIjwEurgK+x?);@4|^E= zq=&pK#8m45nU>BJE10H&DMof(PL^HxR!#9scC2HkPY&oaB6zzxr-S9$r1n9L2`1YI z*VsrdUp*_JznG+JvVie7F>k!`1{Yt{)V1{^Y^*+)b$X!s(bKuQTi<+kzQ0PSmn$&q z#l@S$J!bq(SI&TgAvh&>)YSOheYuFg`&+4u>5lMe zdmv(h$>%WwTNSJ5{EC1{iw`XuXWUS2)XP_Muv8ENK( znYxJG8h>40(`K#ZFCMBOo?HeKe$Pz6c&2LOyS#o4=2Jr6-1-gjptG8b>xF)a?{Og= z@jq`wrN=divn|ZsW|IPeTTLzDa`BbjNYH1XFcs;7`rOUhcs8V)PYhUYbtJ$)u$S;; zEQv;Lc|6y7eXd2n%U!xfYMk_b>q35-52bjfL$*N<3lX=BH;(D3Q|x$?6HrxEJ6swE z@?XQ;(Pn;$NrW!0Ij|)|Axm@Rz2C8;HZ~HDcp~iOnJ(%2wj`F(DMT0Fe=^^E8Fu={ zXu!wT5kIKMc=@|)X=M{qMfKPWxRG=|5v0myGfs&7aOH%~br=%AcOMLU`_$4Yif_Iq zwjJ8VIFe^cUE6x?_4)!_GPOw_lO*J>!Bhuf-~?_tJF(#!6kZS!!9tRCREirw=^wu8 zeXHpzlAK2Imm-*`_ocy(^^|ys$;sH zJe6==b5CnLZ{usnD~9GPLWlco6}hT|_abxP4P1D-krGDBmx^5aX{5dF+V;vV zXP$=5hK4L!Tp~yNhR&E4HrR(USB_nlN4rIvtUSI7^!E!T4*kXogG28-D9+~Wa)u+Z zRbA_3uWS3Z&1ngJzb_&Q|FkeScj*0nmxPW!tY;rHPJty4B0`Q`H?v@F0yGaH^`2ER z*o^amrR0$&>$U|`M=4tUI(C0AzxZ(pokUL%?#h@cda!NyKTxZLY+NDc^uTI|qVPH= z2J|;(T|MMNx3QkNeznWrO-L`lBQz5!4oG4Qt(6ec!+hk(ifh4C2lPJbKG5rPUd08! zh@O-pDAgt6CIn$6Sn479G|N{N+cefRc9czK)63M>AYS2$C-lj58>;oM8fZkU2lCzPc9tAqg7?EZLzsu$i4yD2lKil)PaLKl_X`gzw|NTFt?&( z4%w(bw9x}U9`x5&1#p~}jL@RSP^_3}RJVTgo!Ic#FyISf&&Q#WCDpq&mEp@ES{GFl ztHjfq*e|#-;H2&DjcW1-wBcR6pV>5Qm;}4rY|p@{dV0ZG6I*rbsnjil@2fOiE|^|) z#F=V>w;DV^ZI&dm*1ro(y5Ensw!*YZej`xmmWR#h8du%*MOo~Zwbo(Vbs=Qe)}r@p z3)pBZUPD_!5ZrxcM_D?Y9!6T?`sK>rB5VbD#bXvFeP5cQjZ-iMtw5P@Jz@ARKZ(D7 zOhlwX;(>B5NHK2Y7~cEt1@}}9Jyc|6LPv!yWAk&><@lakhj2Pi@;lV zP6)p6OE^BG`_it{tPx2D38tJiUkHD!z&oDU+p>iN8QGfCOU`KAl2nzeDu1=ZHo$vyVmwY**H zH0-lWlRLAfe%_F}$LfX~j?W(`*QE7+d13c9Xh4{q820cHeUNF7p+|5M3^CGdTkU~D zlUI^94?|raNc%1oiUq&^f7p7)<^uq{NGpnHKs8&)>WEL^2LoE1MW4a1J&GiyI2lA50re-uWM}pY!ST__ zS;=A+bo1+_y%TS36b2te3yv9CAMX&6=`s(8JNR#E*3C1P^vA)#?-**SDceUdai=t> zWPdQ5`&ec*V~xCqy$BALOVEF8n}eP)6Gzzm?#jcs4NWPBezjZw(Nj6V`BEqMqd6q$ zRgo>}5j`X^XMzP)o*cdQ*nb-7y6n$M`3EuO)EOM)G?Y2W&Kzaxmxu|fB^u-?>~wA0 zH${Ajm|E+s>z>>q0e`6Djg1ECU;o<%VkL+?fzF?`Jk^aO{TgOAmug`AnNDAGL>KsBC6fo!mh3Zq-5nL8;ZmeY z38k^Sr>itx!=0ZG;L5wc3ro4CiiBs%YyIZ}&x$ZwGc|d4!kC`$Cg{<`F5}i+A&fEGj5C@0 z)B6&0rkV`pjvlyQA}pw>(K|n`DXAQ9!`qd-)Z7aRObiN#zMr2f~iazPO9gkIQrsZ_6jk%Ua+4tL@N?kpB&5z^TRmno3g}E?l zFR=yf zq;>jAmZu8Jl99wnHS`Orf0@Cvny{z~%keWAUA;l8!rm1Y5F%rXTCB~L20KA0VcPcusLXHq^gms^iaqy;`|=y&vcNqMeVy+=+H82$ zH|OX-5Wt_)dw_>q%AQD~DCFHm#ByJT{G+6}Z()#ZUeF)#`%pwbpfhNXR()r{K%=iiBo5%KyGGN6p}|kJwAvk8s91sdvNA4U@EBj9Rj0TYK;wm){3FROIf# zzhsZ0ZY}Cs5k3aYbo#6jlNQM;?p^r0O;DBFy%_-c5!A>%18M8Nk;PXpeEYbBp2JOY zD040FJ%HPVK5oBSfp?(AX!*{r=Q%dCYQhtDD78(<+4;7c8otUd5&2Eo&TF-)D22|+ zsTNid3r$B-dk?AuHdCFkahh(@P-nJzTz>^dfMG1YQG@kj!?tqn*{@1qKy?ZK8ARe&3DZ^yDeUhz{hgr zbqD(g+@Qy_QEDw5W0}_*P&(E8a(3!>wgq|`@Ow4Nv7oWLrH(J0K~+Nxh9AYFrrzJ4 zJS3lCw4%)?^(;1m#0fsM+h*SrJBv0#q%oN<%aC#1i}Lmq>N2R&RL-_k!0UhTULGGM zuN5MrtW3QZ2H53$iaG%KC$^`f-OsTIrz6{SPkUO1CVWV_7<<TRZ2hvu-5672mllRXogJHrh{v%xbSkV%l-K`g_PRtS@PiC=owfG<)b>Y#Y zcx+sX#>zzQS=^2@>iN$Lq1jwAL=&S36}B{P72q8K*Jm#IcD|2rca$38U`=aK_@4ZV z;WEiB4D?)6$5@8fWSo&+cl2&NyFDyAJnua3tlG?BUDAdt)5Iz0Vn6sfP?sc9eA{DV3u@Q$Qj7og+(EFPiXEC9w$dP3Ej1X; z$5O@FU##?A-MLkO@i{q_zN_%PhtM94^yk+OOxEKGMy>=?f-0e{J)^;YB?<}KlF}Lp zBTO2we<=1gWP%cp$c+m^pq4ZuBmxXVo1`DYenQcixn^&R!or#x3>uNP=NJ8@Cm!d2 zHVK#*pQex?WTA}R!TYpbkLWmY=VA27pHTXeq!gu;N6S%d?iWKrdTQbJU=}ou>vc%E zM|>?q0@hH94UOeLLbjc3o5AHlR9(_B-J?M}69mobS-tq~P~D$Q*n_c%52fJNn43Nj zyadxNQiAc^nvx!obDEdOfA}&wTv{!tov3?NOWKuUFBv(`PW#B1|L3p3w}Ya-gtY(~ z7c2NJpfa|@8O0o=orYvtl1zZi;7ogK^L7fYpxcC{$X!$2CxL3!wMi52766nV>{WWc zSzcugeo4$sjs6{^RoncB2;$*G#|5zPh~*s?_Z^hqNrHK}Ltf=~knKVz)**8;y_*HK zVUi5t=|^+#ZHIuRIXiwH8v|`ax>V91{P?oWtXHwcmI9kO;_C#p7q5tGI|36)MEM5I z=T|Zm7qs4JfQJm2P^4x5@EQCD(nR7ScL`~u?XRO)F7PO8kct#y*jIq|ihVcN=VqE| zXb?hPO*#^9N5$8lcj{_qP_2c{Z_1PycaTO&V;Y0zAH5&_c*b?a2cWI2lgU+)HiZno zZ)Nsih%HiTe)^j4X3gvEieU5}VzTyHoO?)ZQmdRkEUBy2eOwbwbeWVrlOZrT3X`TT z?8h5_w%;uhbBS!PDib%;3zk0 zOn~7++=dF#70l6$Lfas2!oamOU~2DH;0>IBfHj)B!tHWr#7}%G^{u7CIa@<=5T#|& zlBM!BQh~f^vz&hUMZ4b5dYF-}bjE%2uuN%v-`6HpI6e!~U`aG=kn&BpRNyd`15n~9 z>uiJ^r@1i%9i^TGF6;ldPZ{UdiY*F9vE->5a|iL{(AQr2e^~lYh(74qbK%(Km)Lhd zA+x8c4o|3h{LIV^9Hf}{uj$_0#&?7`9_r!MZGx6BD`xL(AFhT6h!5r7 zZpkvOK~{2-->}sKFjMGTaI$%v|Mrl7VSE^vuYr1Qy3W1G{i4f$mm_%*wz~LXJ+z&M zISXH82sAxy1P=mlI(npxtrLOogc4n`207P4UN8x|lGlhPg;fRy7U0Lv3@Oi?F>vs2H0@ z!KcBopT34YWhJ-Nn7=X-v)H~e<%?h|k2{BcRkrk}VfpdFskjjtS6jZ3%RwpBd|05b z_UbGBn&?s(mNl@!Vn9clb|0L67&i7*H)+CLgnsc+doQlU=JnqQCKkVA{pH|>9Lf3h zh|;JcPt59~p`a6idsSA@HGt$&EHCA_Iu)9s$Rj7Tlrp46(j%=vc_)$+zKHJ-mk$Ti{+A`itKIKG|H&${c! znA zLW)L^8F^-cX60(^5UHdj{q_^g-li9nnyCc8cdq!XglNB?`7KRYGfdV(}x8zTFRS40bfTwX{0p?P$}neZI(A#7U&r z*;JFk9v`QEr}NP+l89hYx7B=dTG2m>e^5dKj*&c59~VT|_a~Si&=o z;1xv4V<&OK?*Jx6i;|tS<@n4n-5oF>0;4*fQ~P;umA^R22BvT)BHrkQAATJSOe7d7 zL1dBSrJYQWNEv6w`J?D3I;dV;(d?2S74bBD{n)%#GO_GU_(m_C^w@YUW-}eh>}GUa3a({;bmROk9&^GO&VYhZeigi3SF{xXOFFP+xzhh<@1D z1-oKju_uu%E``xsW!Ff#j^XbtR+Ngf53$e&BnO`SaJY|~wnz{7#b zC^h)J8D1i|E~&jLF5aSbX&d!TBl#?5GAV1~SBgHG&K6*_dwJp|g8<22(GvG1*+uR! z#_j~^nWK^TIbpS2IerTELpgi;*?CD=Caq`$& zK0Ma)bp2is0{@5;l)*Gn`jP)ESSE0>!fG&)n+GN3|D%*}-$mqa4~V_lj8jkcJ(+lu z9=3HNtQ{vy38nNPcXs>?7b>J*Q;GW`W8|j7Qyao8RgfMs#4H#Jr0=ztgk?#bKw~^9 z4(T;bnr$~&2pu}mKVxt6X93Zx2Q3v~UVn^0PE>5eVpVYEq92g2oDG2e*~fXt*(;N}W<#? z8D+m9s2DR48Q&Uyq&Ihwh;~TlGdpci>Sq$o;ar^!OZ|QWe>-3mJ1LeeuZ2{M2I2JS zK>fi|6F8&Y4e|eFwEuhAuy7>)Np@nyPHYOhNHre8j9c?hcZIPP`>1!X#bAFA&Suhg zzg5g?AR20N==-xeq;Y+KU{&mq07q1O^o)bXD17EJlQMrNq~sVNVaHtYy7*j)?e!6H z^BZTIh(CO;Z3OBGx%-k`1MaCPqTeXcaZgoM1L5wYhN46cpMAeTbs3DaKIyAY9N#58 zk5t(WL+OpQT$c^uQ&j~1oqlUoiqs=@=(Y0fRP5iuBX7>OzH@I^klijgq-6J^C&b8i zxg1Of?Rxro`<8sV-tmC$D2{gYU8^*enj7ovMZ~&UPJk>pFy^uDrqAfM{pdiHuV`MI zeAf%(o(nsuw3RB6gqfu>s|ZA z-nD%uXY7=p?-J}7;k!~4JJ=O}p1WU0HD`S>xc(_s(io%rUPamJfcaW#aZ&XjZiCVNDu=cG> zx`)QIl_okfU1i5F#L~&}k*t&IDqg-f-*MW@{rTbKKX^Y!b6m6c@+V?3(2j5X7BXSw zAI=n%LkwJ$-E@74^^(}F&U)fTI0hM6G7l?8z%s>4afwaJC3oYnGAE}(Cp_bSAy-T! zy~GC|cDz7GJv4k*>AiaJKDbwZym~OQ*vwUOrWiRCvO!TZ=?V);W@R#sQGijxMpx86 zS#ZzKJVPtl?PeS-yWTNn+1@G3lOKL@RPMatyB_zY8u*p{nX!uw6p+mE``>5r1bkPZ z#KL#35zFE`2j3#6&`~<6u-hg-F(fuL z>APd=TUH_o%bF1U+S<+~8n`XAVS9`^n>$?W-11L41lrsIl)Y59YE_1vf&0x- z=P`@1FH4~6ZS-W*uOV`X<-(_l6TT*jPO zLKk@bh;?bWCL79fvU%?|4^NEX*U)DVioobT;1hAO5x}?d&?6DrfSupD^s5?$8uUt4 zY|RGRTUYguxw*o5bLd%js?!~65NWfRD7ZcT5@(u_?29}?H~($(sQM}NjSi~!)GX0P z0`+Ogpjx_dol-N_rJT92#IXbYB74kEw((n!^f~@u6Dt&Bw7qo3JlpHDFJ7gl>(%nFfIA zY7Y^Z(plchZEHox9TU)ps{$ybongV`HLS+*w8e#d{AA^3>Cfcijk|*^168~29$9e1 zdf?46WAIGuhdZNb(cD1W@S*MKexyz3*f`)8`#d=H`vh8+U{FY{@Ex-Lm5{k^U_GcR zl~J~D$ZWl1!PCo}f}q2;k{Ga1m^9FF)QV{WcVd{!trQ877LZPC`^hL?V-idNHB{`a98|50qK@nJREMZ?JIsh&`l=pYb>ZM-TAy`#@|)N)qrE$l?9&|@xbqE# zh*pvZhOI;ihWrk2$w%%`G_lKQ&RfRX3-o zolgwvKN*|XCH!rcFYW-}d@_601@3IQU>Hj?bqjIE;}%xc zrP7Rs>ecKVzXb3Mbhx0Jgn9y{Y8c6PbN|h!hT<)<{4WSh;?uM?Wkw(FCMm99r>QRm_8DywXX&d$V5POs;sMFDja zwNfDT!IB6oZ_C2lEPuTI6n6pL^Cp~b@G+d>`@67C{=*T~u7Oj~fyas|plI?akza^pf^#CQL1j_KL~z(HI<3WdRagkt ze!J9xqau{^D46`q&cyNpD~3|#LWTJO`(!CO{_xY?0Tp6E7)-t+M(Hd{d1A}!6~`j< zc!bHmlzqlW#{`5_F|>bVR3y_2vny@+L|yGJc98Q}Jjq84Rmj}{jX0~seDSy^O>MaN z*WHWRX!F+uQmJmYxU?j_BSE%|nW-LNFaC(U)EMu`en-K7LYUj`6(kcPbC~nRgiOIc z{6y}nGDr19RD`k2C!UV1B~{@qZvA1@oUHPl$4J9pL09d*&r90TVj(L_Ltt&~$}8!E z=;eFe7rf)?Dn+$z*G|Hp}`Rw@D_m<cS;hP0hMOxoI*^z#RmIh6YnM`FE4JGLC_Jjh1CONENLe15s3+wY~dPfOp7P92q# zc2;yWs)FS6N%9*%M$^X-^I7~a&2w9ePRuqcK(3#h^8TALqHC$Pf(1X-%I9c3AMD$! zxcbX=F~;9a38Ym}sCgX7Pty#TxN2+gL#%UU^{#4KTKUP=K4IXgV9SK0ef{e#YJVTt z_VIZ$zxXkI_34)>=7;}Zc@l(xWuSANtRc_~8iM&Qr z_-FrutX?{s?)?hqfuk_BDceZE+Sjjb;ZnLRS*ajR3lprrDzdc^R2a$0+#%^O@W!5M zIvLe_G1WNxkur=$20h8RbP7Xeuf=!Mj_+O0BxFa%X{|zdpt1Ux>jOd;O=W1ukCPoa z;PC2?{F7dC^nU7W1bTsX1=X?bc!IpBe8nnK3~t};`1BSF1HB}Bz)Vhm%|soZiJEm7 zyVs{ytU_1ZPY2wnodZ-OY1Mhx?gUIjie1&|npPWB;A5zK*7)JxKfnnM7gLn26B|1D zmnj9ROp<=mC9`(E2_rqIr(X&l5Aj+-gF53r-mWdNUhN#NT_xqWo+%+l>-+Y zg<6>PL4l>6wRq0&ALHckGgbbEpGbMRB96yhg&V8dgQc4OkJ`kCXK|2NkU!GnAd#c{ zd$XC9iKYSYKy%M@;S`ciu^BOJt8meNZO(idtYU*5G27Up@r32&%4bU_AM%Gazo66p z7iCNX(L`-Puw#7vTjUP%AnZ3rX2`S7nMSJ+_Gw%+4is>#xgFiT_&Q7`hy{iAaetR& zM_A>j^!ri}yd*$?j(!oT8oN#G0W$u%$R?lMHpvVjyEx3-O zEj##dI;vVLOpbOE-y;)l-gBy4`gBiRa|V+gKL;mCkoSdK7Q{O)_)EP<@JU-E(HKEY zRIRtL#+H{iM>~|U&EA<3WAiz9k;YF>2>jX4V1acIav-U*hz^aTrd1?M58LeHo#I-< zRr`ee(}K@L&X{HuZLS)PrUQ5PIv2uT?BT)J;UQJCgG~I6m2z|I10-~Zp??Sou7aXn zEujIiG|rsU0+NWM-Z2Y26md#@N)EF}1+1VRhBPP&i2!n;BvY?yD{kZ32M;a^pOFRz zX>*rY8Gmu{K85w@DV?xP_X5QsGfx{qBav9O&G)}X{y&eBC5WhYVkvkZ+rFi%N`haT zkXsYzE9e!(#LuQf($d!27p3~!Hp$HXm+a#fA4`BqG^Gq^0}RqXH#Jo-IN;ucqdqeo z%pEF8ep@sfy=>gk!dJtlZQk~sLFMIF=^0xJFNF;pb;t-pM>U9stN9>7(4WEQ*d^rG zsTXdBe>P`j&V(K|*dLUtvl0H&2?%ArmI7;1%eKrQO-SDX(~>GiT?VNYakDqoch)!uE3iC}di$^MSXdPEN?1=ouphfU zf8vhx))v?*#(ocr9!Si_Zb<)(zJK0%@Yw~Iz7@M3SF$pqBLjv+=DG?(G4C&(()BpP zS$kfI-6vTv-N-M{aI+_ewTm)jj+n61{TdTw3WdY0>Nte-{oc3rFPac zV0{TxXUGv#L-1N?@uzNOh==qi6td%tvB&Q&)JVsw;z>V}r4BcOyZfa8LiU_-Ypg>x zj=5Wxajk%KkyjR&WupsmX&59D zp~;_*WDfF@VrOLsMN4i|f%L+R$%CZ@fMMT?G>om=0bUuypL89}SOAOJC&}xW+mNF9 zQLEY0bL?oTycEJ~bl0Ge5I*0+X&&L2zt+}te2i$P79Z=YM?S~{zC6;2dev&2@pJwf zpzm*J7`tZjQ8y`qjjDCbey5&k<3sqMc&4?tab9J8ziThz;xTqS>GL05Ycc{O+sgVyW^Y=qgp&~@(#4m0Qb*$xh49uc>lh!L zf`ep-b0uhBI2m|B&$1Nv?k1X=0L2-ohV^ z$)ZNOLJdDJIxlqQjE1VT04XT>ovdCh)rt3qc(t}R3ck*?al~uEmkg#c$2k@yote`0 zTC2e1KB%XHzy5B}#%l=oB7oTvmohqb(J5)58Wc2)MEqfR_8d+5=e?b5>6ne z8+x_)Klq}+^u*#{Cmm;bcWW8G)AS^8EYBKFJtsI+86OR@Xb9o4kOW+h;(R6Z9JJD; zrifLUwzKl)7u6-mYnzzVA*z;&Jo{|v!V*W38TG#I)u~?SLD4&J3BOtje`ozeLUxMm zYmWI>E`@JCA{4$w+<^mvdZdbRx1p(zo(fo_zCVR}3HVrv`EKVbzw{3d<~x>hr4Y_| z%u2maE5%|<4vGz880v*C3QPR*E2t+=&r4*>zl@Z5lNto1TYQFK2J($KOtvZAI*}a@ zThWQKHhs~85l8To0bLGqM^ijKm+ZWMXG{diT_VJ|{ruL_qB`&k7d`=U6)CjWtzR_d zzONju>%I}dGDSo6IE=cQ_#x*tJXWe2lb#xYSs3MKx zF5u|@5|G#kKuohAxV(_TE9GU#TRH<>U=1uAZ(3Lro;iW^~2l5wTC zw?*F8;?4JB;jsma*UyC^0h%ZfTA7jgCz@FWkUIl%gGW7SGoWZJVJ!k%%3GfoDi4qr z%|4_=p>+24z?L**gPeu%igeT%^5MK}c|Qclnu395T8!o4saG74CGoQ{OZnWL*c z;D1lrV%@PsUt8XRZ+fFt8SJEoisw_VCk{zQoOf~vSwdv?R*Kqm&j+L!Kgi8dG@s?W ztdqvDNK=AoF4JylSpj_hWb^hC@vAcSEwZiIJJYQwbY>gE?8Z$f%YrJQX^=pAK8%&Z z#D)uma)+~_N-Psy@&!CVlrlhqa_GM!jo)stfmx?jSFa~39 zzED@Q?rfgf#@?d7=C{>k#R8MX2%yIkMMvZBM@Ozh z8lA1Vnc7$!*y0FY>vKk;RI}HY(Cw)SLq5m=>D(^s^odiC71 zqwqXH5;iNGlKm8|g4(;Qid2{4Be1(RPnRr^j@pLRuG%65s4q;7gdfbU_$co(xi7wd z-a)?15dYxR*+eyvH4Us8;SSDS!X0VgDyq8>caOg-X`Q7$W(GriyEB2MWwr3#7RD%5)Zdx-kF;3pwQQ zHSCwv0W5zW#h>XtJMggpj%-pMCZUzTJkymt1!PJlLLIE=Z)M}oi!i)Lgh3)}1sJRx z?UCXBe()~z6KetbQA{F;$#nPDkb+9;CFXkAkM?9ILOcV+WBvLc3@Q*~K`YU>)XPYS zsFT|p<13y<54oS|-_ z)N3|lIe*y0lJXkdq>OBUO7S0$5z0Wf%-(oU(=Oa0^9vp0 z2r-u@10do}A(-0{?;#nJL$D>`yc z%ocp0XJNuyZ0(i!1lfxibavDI1bJ~jP*5 z1n}|B(Iq8IrTw5I7Z(Uxc>$2#-apSy1mJCA`TT(D;~-X4L|2Vr^>Bkmv*iS-K2Sn- zO!MMgD0E}Xg4f)T;=cSaw=1M*TAhC_jr|W(VO?F8xxP`SKJ7hvB)0qZeEKY>6hDp@ zyD0mImk%uN#h;pw^KL!>eWLU9+QIr=DpD$ed>%P5s8GW-TC}ODIty#o$h#uIs5l
    v&PQPEUSaNQWhUSI5Y{F$@6V9$v_N_Tp=Q#e zwW3G&%8%R~L;AD8My?pM?C{OWiju`#u+kY4amW;fknJY^7vkK3VjkL)R_jz{;&2PI z8^||NiH>(=r-HRi65BsIFc!-F6%N-DBVGBHGxBzGi}ofdF2r(SN^*gi1NG*aCIhNH z7v#7X&%?qk(<|~0m;3zMpHxKRQx~{unO7Czq=jH{(F9V&Sq7!I81!KS|jue78@PlQMm*P~rsrHvCD{llsbLw47 zhZlPxQEU&$7pEffpE|hHIBdaVzA%7AxljxBgT4$ke$>4rHbu)S5!NoFAn#8w$6(eU z835RE{bCLYJK+>;Huf)eQ|gYTaV_1qAUyaF5n8jkETXrd!F|)OcW}<^ZzKZ)sb&T~ znX?^am*0Y#SWCKr|MntLawR^tm{U-HH!UXMgJb#Xq3P49ymCLO>)9a4N#G8e)WK1fLJOq z486mV^EoJaax@B*PuoatH$tC+k_a0YmOGUwXNNpPa}s z*ktfYDnpFz|8vl&1#`&vF8SD$Nkrj0jH~l3AG*K6Vg2q-m)L#n+fNA`?y^|ORih~K z5VD|x4Ciy#<`7AS9MVF1JKM*PhnlwDaTEvFYdHl+$QD~keT8ew+XRpEglxxcFDsqjui;I856rhcx7bP@8KT z_Ea2|EQGEH>j^*%>q4*8|3)koUtbgfLq>+Kco9Tb9gvX8l z#FTqfdA>T460A~|ipic+Hc;+!ne_dL*>`F#B(ncHzyM5^AX%t3?5*d=&>mxgGdD5f zkzx%4Fcxaodi~0+{a@V(jk_Z4V{L5L5d6uO3l-Q0I%k+m9Xu{B+|bpyhC}0B z`NKI^A&4Xx=fD3@-83?DgYqT5XltMBgxR?!k3>wb^N%}kW45K%6UW=ZiTH{_-z2Vc z+AysrlGkcTcdWc68my_zSK8v04Jlc~58&wx@h>n%smmQB_@F(`M+nyp+M=Rj=s}$3 zdgXL7uS%F|G&th6jdyk=x!pMB&+19|Hybad0|1QQFX9%WUQiOcb6oAcnaSc2Uc&z` zDXlJoQCz0>`=%zvi7Gnl9#!WR3)O z4)w)S)h(g)4Q!fMPG6O%HQ>$V*c;*+8Mu^EK!LA04;prXa;y0IAo4V}AZUDMk&f-$_EDp+72?sgBSR`-5 zRVkZM%$ET9J%)}LL;U#wvL>UyeGj5ZS&v5oYPS)D)SNqtn#F%U&g%D%ipL#$EjZo$ zB@*?1ARGIE>lF5E%=wTRGvonsVOK?2W;R5D-XzNKWLb3iRRzKewe|kh3g%iT73xb; zlh$4KkZh(uH*!>-N!F?JicmP>jrcXL=T03F#YEz#$Simg2BynaWp+OReHIjh;(W!vKV zN?`7*+6O)|%-{&qo?Ip!@e9JOB>HOLhGiVQlAAmKqIsn7=LPe(i^YnpqPg_ zM}M#V&z6+fsnR69n}gD~Yzur$VvXIAnvLhSPwO7ih242mVSg0sll@PL^Gjju?&FFI zfvHS8#p!`3zjp~kU-{xUT#RX5MjWa&9#D5exG43*k*IHP*x>*Zah$BUWEeAceV12D zbh4PkEJh`~?ONxMd5LhzUQWdk8+%GQr5!f*naaN-_t1EazBcwQF*+*|{H#!(*9sx+ zrt~2BL>fWWIrw%LAhsRX=vwSKq#68hHHGOVRUX*j$aedsQ|9X?T(W{rBe*sMQ#kt1 zdH&S;e*NuE;Pfmj7|(XWvkMXYzQ=A@-tbcgC5T{!h6lgzQxLcV&cT0hEhE|66DYh{ zMOG_LDmo$lxc%q89byTX@WnrrEHodkn{UX;x&R{uKO<4>Ux zy9S&aN;e!Z3cwuPA8%@cuQ1vgwKb!KH@qVl(}k5FL&{4OF@iex_W1evwFzOt0}?^~ zWUhD|87jB$^d^V-3e^n#=Tkx-H#U)RmhjPxIwgp8nKM7|@yO_sQpiTMCC`TpZd?ti z$b4iY522J!_~b{4lPwyan?=y+!8>Mr{H{0N%;6C&)sNz9g&rJ>b|2-QI8#WI*B zWL?4Mv&D@w{>TuZ;CFNMbtT{t4>wm#>Uc_|b|G^B6@#(2gqlvmJ8~=kxDfjX`uk7kBL9@+`RWdZFvleBOL_7VEy|TzqG%)a zdEGC<2L&OTWi1PNgnN}***Z-+G~fbLjCHDu?<4P%kS$M|Ak z9_`%r*ev9Djk`JwFVuz&CR1mc2Q}byM*ta=4% zT#|eFN4zh}2q*4nPiCLBQ%NUP+MfKBsI%DZX{TaSUc__6E=z|8LUP~Au(qzxl-LSc zJ|j6ya)>M+0fTd-BEs(IOQl3=#4>X8A@pu|fugtkq~xM@3kL^MEJCDUY|0Z#{|p*3 zJ&F1!tl$?3DO+f1{SQAnu2Rms1@Q|86K2-aFLUU?zZR1xzSoyKrW8ZtFf4hrDS7j8 zbh2hU@r{ys-WB0Gd}z?E6LkkBF7;e~(=Glyj;YBtY0`J&&A!?TdE}!kw!|)HfMH7` zB{HN$+GceXkLm<<-JLfW?%sa?tZ>#Ha@4k%M1+V656I-q7t*y=$)Q8_XDi|wS<3q1 zjxYX#-5W7>Y;BL|GpK^N8lrptmYW#H0)vzP{?*O+78rRfEp)O)%TT%g$?b>VtRP|M zpNOhHPyyfH+`1$EGdqp1ISYl0pBg?kqp+MXv`KG9^ORKB#u`T0*!3;;z*NdodYV6D zHLscKU!^8Ogi&yN=X=vUJxwXvhnd}s{=stEO?4HNO`MU5sE?e$D(s?dBjT7k#!dN~ zv%)PR`fFwVa9bs$jI8BxT<$dsCFOKHe73~^(<29_Z%Q4wGw^W#s|ql*|9r7M3$KjT z;fNaUT@^TkP`vvu_mdjXxYp~3%sPkX;~#vv<7DBisn#%%%oLZ6r#sd*OSR*APl|7r z?smkENZQn_dZgGkq7COqNz)}P!*BQKauL?_QRdsXmpj0!oax$~QNDJsc5)Htaeii) zC^0+)R{;Du8DTHmb2E1UvfJ}P2j2yMhPHKEoMq<~d@B3ybOe0=5yzOXQqHJN#(z(E z{zNp+;FpK9w^caY^ZFc%Bc3Rt>whmgzS^SZO4Mg~K=qKZwVjnfw2dSHt<1JaiPWk+ z-w|0Udq97Cb>#3&?Rqc6&sKk^t^!m6NfSL}G?ldY`7;k9mE}`+V&9$W6jZlT7@#f% zQoeB{mv0a!1kJVn@|?TJxVww9HEBzWk(+E0rsWrmq+d_J`K;}A;nQBV)zv?-{ zWoEFfo&n!~f+c{3IqZc+{e&eb=C-@&;21VKJnP=HlI!B#Ma)^ZU3)%Bxx?2nBf6`- zX;1d=@09NqUhxfXcq0TGTvo%im>R!y_tstXq8I62(h>%fWp|R>+gfcgd?oJErtTY- zY<7P#YZJMTg9c%y;clK6RIpUN5lNV2%KtgLB;toy{|CYG+so_678ELZxZh5*x2a^= z*;Do67wU4dz#NpzIHPk&&jJqZOfGt7?ClD*x*-!|u6MW)y1Eu_mhw_Yjjl;K|1^xx zH?ym~LKsLS%&Y&i#=+4a^4FzZq>F$y*W0_eHBKo_ll)pwKa_dMbwj1@*F&Rwt+O&| z5-i5^Nph@(x@*Cmc#UT);cqJr4#l+)ypU-*?yO zhGQSQpB5}z+Ica><2C`mZAfl&x}xgK_4)a;2ihwoOLg1(&3Q6DAcS*vYe&;!xYlfc zI<6p`SP^a@(%Xqo!AQyh%Mpr`8pIp+<_ucxa41V3{Tvf^N*!oy9p?C%p6^6W{4>0} z2W+G{z6F0r(_1*<%@p~b-owLnF1b#v^)Ac(lEIW{%$6?%*jrCbYEdHc_o<1w<&QUD z0L6^qNe$K}S>IJD=hr8~4j{$~`$0rOFlaVLJN-m7{ZvF^Qwmo-c{n)Tj$C*8d;^HO z@vCL}ax_-x?m|K{6r9-dEX7BUoYfW31!B|Lay1Cu= z?5RGtfC&0{@<|ta&R)@zLp^?DO_dFb4Yt0Uv|gk-aUxMS*Tu&TJPrC8XlGBt&Lz3%AoB4THnx* zBt!>NEpUa^$$y(z^SI3ZCu(CWw_Av`bW3_52b-tBxtArI$<3B z50e2py5$3Z!mP-m_@j%7Ap<;;gVBf2GdB`>@X{%ku<1q-wIY(O>{@#78N~7@fPgPq z%xs`(rOr*3SG9%uO+Q3ACR|e{iC#cVfhiOsh*(kmWuw{piHCcsNGxjHzSSyM7jIc| z6Nppt@2`{JAx-HV$}Oe`q}%?3{n02`Qzrai&O^jOA|O--L}xZYP|e;-1O#X?sdnFA zZ2R*$V!n`&bY^VSO39|V8>V=Y)G=I^ zm`^zdYFH~4P2aLddHSAEC zTZ?CqM%mqZmF9G@g^Y3k_u~1~D)v8k_rjZ2kvzt&_{-_DVQ}z%yfavuzp`yn0`$ge zBr~kk-XHK<6JI*I9*UI%F^f69bs?lc%jPk?L;$aK5*-g#^(kdOo6zZ1lZX#qCGqJ3 zSyAG?xttRkqF0IWxK9|(zPzH5CrfWwbWRQu?;A32kH#=P`})xuQcBbb95er~_(C?t zi6pNhy_1-y@wk&#A>&5{#vAqT{v&bT^hRf6%iVllQi^n$o~DuhKy8N`3w0xJ>>@F9 zT~`-IZyP@4MK8%qh6xe(IXewe|D#Zb9(jA~Fnv$LQ`Lrm|x}<7$uj_YQS`yHXMN_e-owX#2ae0l?34x-BuUZ#yq{I$xLTIkA#w7*t%wMfTZQln6DF==5CFrD;M_)gG4e&lg!YKu8EJH!oRwP#99dLf7Glj}3iosX+4)&A|O?592dJM_mjS-R} zPetVX6gqxUEe$cAsIp>!upKvw#CtI}RN1+e{;DWqLX=}E)gbe*SSkwe>gM)l@XsX; z(T)Ykb4Qu*(wF#bfX8t31^&D*W;}@+{hBO^Z~e#S?I88_$fgC)^$$b#?;D?+1(ubj zZvK8tMHBf>q_G6s z%$tzvhotat+f=2gA-bY>PC-bcIpPwy>^(`3*ufXi?NN--8dVo*FfQgi6a>P8TJCAPecl0F#MFi|Am4YfP%%Yn#5}`nrnb-X-o25q&Z)bux~t$%L_?egi8J4^ zT_=cnrq!ckbKEC?6g?@I_X=0z=uk=Yt9uEL53GmnFLrFn_#TF60Fkhs<{2_@yPhxKM~~wj!(Xzal(Y6#dlNAFtIGzd8zlUTT1i@i2_+CQLZhOG8U+`m$XeYScO z>zM8q*mLq4re}Lm5~4%8uPgMwOUTD1bzpz+GM3)m$Kh~0$`4Ej9q2{opmyjX-oNh` zAumvU;#q@7|NR3da~+|+tTX+#``#0neDxTudw7soJ~xqKkqi}n>>3T{2y|VUMKjmv z6n;;FO_~XxmFf|3)gY8#e2kCNl}NBqT#3~R285d?-{5ZhZa5mUrpvPa-z&^#EV0GU z7hAT4pmOvjUR*6kL`Wv;PgfwsRs*uyzBoSn46|M7aAbN>Y~mYjL3+z=ERHuI!9gE# zq>H$+86uC3Vd~BR4uGI!K1gc zI2maRZ7MJsky}n&6Sn17@c3>gj)hx6Mi}39TvKu4_G`?y?trt-I^6?@Ff~S1I)^`RJef z3IFr|eu3^ZKbR_SETDf(zC>OS<|<=rlu!H-&!=j!gC_|Y;cv0#v$DA_GJ0R&fBes% zFw?a`$o1MqeHTMXk2i;*zHj*KHs9_O~rt9+<$#vzfQ?c5D!@bwglSOfo zeNV$1QE7QNyhE4bj}r9t$QRGt#GSjh(ARksdEx%hlO)U{t&JV66ZrJ-H1>FyP_48v zSA7q8fu~@Jz?M0@nL3UX7q-o!#LwCu4OQM zCP8|$=Tv}-z9;tA-@?Nitw?n-hCJym&Ld1;dLFm#Uc`w=1E>&olateeg{cetyj&4e z+JV`7mr$E`00l=*qBJuEY7#tn6!qiIql+l^wuUCv=JK+V&<$}%82xc2i z`(PXzoWqCfMKDw6uXzTx1v9%wlD?nR{~pg;cW**oV7W<=;(G`(&d=fT*-Qi(DRSSF zQZztd!62?oUn2Zx0WAf#?W-ES>mVHKBc^1AD|r975Bq%0 zD92EpZsdlr-LXj6|Bar@{@w645^PEQMe+hq0cv_iC>Z?(ukM|~ZY2pwDjLFNZy(Mx4z#pHa|4#Nk2A-yK2G7P-}PbgAxPi$>Vir|de*m@3>J8$$9{v%izPz=V90 z?rFHY4-Y={BbKcYr@ynK>(~(+fwj{Z%(8_lT_Z)YZ|!%#N8}(aW{Mpp=dgIU8_8Sr zDUMRT>Y9QhMZ2-piS1;vtP{h`JQ#-8;`;n;^c6+Hp7I-eW;MILsGIqOyWQb%RAqUU zz9VlAKObNC`uX9|g%?!U9z?{p186u?gGg6hNb>AaeCs(D&lSRh>N*zRm2|AJ>*!U? zjFrRPMBp=$3Tp68K8cBGiaEsrkQZM*K1XPGVU97|Q-K>}H2&7qwaY@eNlXpqSpyW8 z`q3EY1Z80zrDhw4gI8bSUUwXPjamL+x|_k*I~NllKH~bBM%2{hBg&9$L)Xh#1)=W2 zTf7}igpxGH85MQPZ`;4C2N=1{9cHRDUL}>F9gvIGg_oE(l?xj_(}iM+Z5R@&$MN*T z3|gXn1>^;WA++Mq`S3m74QF7hx(ufW6IJUS=z01JrYc;ZyRs9dz-RO#da(F$2>TQ$ zzc3rHexbA!{A*?~oa?~h94W#Baugf1%!_gU)hsHut=5msH|2~xk=H+st5v&&#TO=w%cCmdDCww>0wLqDNIeD zMIpryu}#QfUneiHeuxobSwG}&GpJ;{1g_IvN-qIt9+2*1MKID)+a&IMZRZ6=Xc_yV ze&H899XkXsdBXgh{yeJRXl$BoK?c?7|MS%(Ix;-}$>asf*|JV3n|R5QGm}--pe*uT zj=bP}2veWlVyP{P;xP}}#t~?L{u7pFP9j*0F!A!W99}SmSHc;*{xpx?94{JU%5aT1 zitB%Rjq%ETl(VV+UA~@jmjvGrSskfNJ^Rir;9{~dq=i1p zgssZea1KRc!Z-XqAs)L!y)h%;KA$*7)vN#pV$oYh$!M_Afo8)A-M#Dh0;IFlAE zATO{uqrMCEGq3PrtQb4>1Y3)Fk9;nQ!UB^OfMxtoY4$z$GwjuNKus) z#s}tqV(>gUi}OXU(Bk3@eMd?TD%x2Xez%C)Fh*VwJeRzTIMpdONIpG->9&1qdiM+i z$#L7%3;!)g_E&Spf%*%W9zKasdmTtHqP4gIcGL4b`P)3|!`z@x`DCRJP47ukdoMcX zU*Rv;%VBAt1{o=P6pcN@`#+2zjcRO_HU3Z7-o6aCKEA`tuDG>56~YU0idrz;QjCie zjR?{t-8aGRj8vsUHY;eqii=&T98rqdQC7_e5oJBNKRbxxJ%qW~B%C~p{dP#}nZqd6 zg6Zuoxr6cCvhZ6r6j5 z*<-#d-{op^`Q^HaVK;fGT5LyA_Y~&OS0ctro9in`s@h_2-EGWHwIeq`8%k0FUD$kz zx_1! z-@g%0|N9$U&#(o5S!ZcQ_@vZg`uROH>{Jk9G18slI^Q%HMFR_Xe(yArJ+!#Kf|$5D zB9Gt1$CsB-w!@rqn;hMn@B_Uk=ELls4w(aZaH$Ty7Ro}qupO?~_Mh1G#=B2r{$3A~ z7|sx0r|%Jostfn<=5i*qH^fr%eMJozco*W*%@%}eQNCH@GxWJUJ*SQXw)l8pM@lI! z&d%UmO$L(F5251dewdLjnC?1^D~zxc?*{`$%%zyF?N@~U8`HR4odzFu9;XY>Bov26 z3D1nAVylrVl&H>9Fx7=qSUE1fe2?2_JJED70fFX{g6Gupz@D~6e10{ISTkY2g`QbS z#R1``@8ZpkL)dG_76dYTD8ebW9({9nF;eIR10{+j@~W%4Czs&DERFlROeCirM8&a0 zSSa&gvhyG=Kbl7C{w*++B&;W5cl!fpaQ|`>0<8H0ec10vt+%@r40m-BcI!oIs3o`4 z3cF6%EdnRV?r%r4pu1wvWnp$#hptCHE={%}Oh@92J(lG-v+_CBYO;J=?5h~U^yNlG zxf1r1WpPFi+lvOU__sy0vz@W1?p%#C^h{I(*57)DzfPTitGUj~&f5wcCLsS@zLuUx z&Hez+KbXh4tSwx<$NgO>Yv-P6obgm)zw-ocEnG!agbn#W;Z8Ljn0QBg19$F6Lef5j z``W>9-9oUhlNaP6BWaDS;Rks8=TYRD7(k82@5<*)CyP9cy?c+3{YmsUC8*d3QO&iP z4y(dGkB$g{t;X7U@UN2>*p9qP*pk_f`F9V|lHd(JY1YH1n8nRKOG7Wd9ygbM!T)u; z0`68iT%T+C-v1@!g*Cz^VHMS27FmF{^Zhuu!wx(u_IXP5Ad;H!O{mB8pP%DgQ3R}6 zV|?YiY;~V2(z|Ey>0UEJT?{v$L?`DI({)8k_ZTkL?uQjK_n2UlNVT$5{Hg^ z92%!SXIUb1}8j9RD5`CPeWT@H;zXI!;}Io(?wdt z3Av|c@NVHOio&g+N&!?#+z_$#RCN71!xde+bgih*$cTlY=Kd@Ed^z{OfV`j%_dON3 z_Tep_-o1e{HRagttigdHF)0%SmJZ^@=SMh`6#!!;aY{-Ch^eKb>(^OSv7&2DlaT2i zjOqo_or>LmRr10bVR1&w5%KMpaH%N`j*K8B!sJ~qUnegpLC?qsm3`;XUX%!bHMYu` z61}V%0+L#>@Z=FL9^M8$9&5~#|H`SsA*uwYPE{bvnt%;~9T^F&FOV0=Zt|3T`KEA4 z%f``DO=vxPjbrrwuRl$pcApP)XpF2q>uR0+-sFYaQ9OG75LYh^p{M6M9{=(;{Aq3& zN5kz2)KW3CtUD`G)k4tr_zf;+SWui=Ep%8Mu}Hs&H=l1J--JLG`Imx>3bYOLaQP1} zaIG=`ss#3B*dz(vM@CK?4tq}F&f}Y?-bL?2N(%C-&e&gd9aCdR5u!nUPQY4;0cCcC zg@zY$2kv0*bPl!{QI4Y|%T`8nMau44T%W#yu`88G_tb)_EESZpQqT+8i)24LsPaX& z`(?Vy%OURcYrOAIUb97|s3`FG&~r?~`K1Rq6;7aBobn6TY^8f^Ss=3c4wj~x5vfkG zggq;ZjRXvp9e1JP{9QbrZ9~~!4_GOPK|+$PFx!G%q1)h~$A>g4o;)(pbNdNi&0WR$ z!Cv$&=b64mU4~}foi;X3DJ$S~|;@ZqGvfX63vCRr{1!*zJT888JwTHOflnPH}DwfG7*_OX7 z&S-2uf(y5ABgl0ppAyks&N2)~ zuRg$3OFF!i$M+R zMC*t{k`<}a5)dc6rm7c?=GjLWJYc~!GDLqzp6p@b7e{e!4((~Kn>T4$k!~K2vbG_d zO56fd7Dw5!S@fJ@VrtmccpGZ_6wOnHZG z=d7Zm3zx|Kh_=;&1dSUxc^$ayuEe#uizxJ3Yj;_*ARHWhfSHag_%gfGJ7-O`y;axn zWT^|Oo{V6^Vm6DZ6nA)jI5PSI4|?L@V5CHPNI=On2N&NxL+5T?DAV_s$1Yo$F6L5z zsdul?yGLJ$ZG^fj^5I)KN4gK9u{wpznM`+OZ5=pACLr2Qn{;1|Yb;k7d+$Nl*gc%i zq_O&~<~X;jlrti8PN3^lE`n{1puEY%`H#uB$P0Ejc>PzrneRiYXuPNKA**Z%htOQK zbe=$Fgfmn(;C)e{>%|n|Q!;|_?mTR>QRG&}uD#}4pSjyf`YBD4j=jPlCR-_wW(&t_2J!=v{g1D>%H;+iKgUB8>^UNOj9`Xj4v5|b?{ zuqD4y@{Yvb^bG7ap|L~nTwKfsQOCvzi=9E1uRf$H53~B5N4Zle_!zFvkKkaS9XEl# z9^-zSyugEj2h)8K$DG#bPMA!0H|hR-7AJg3ch-#3G=pbG8^+qp5un1ZXJcD1QD_x< z5a(`PK>2n(!PsWadu3l_cTVHYWHllj2+z^qmDp+-Mw)TXz}fp(HXa)x)Jsl61AERa zVV0c_sxFAoloG>^+D;4Yf^jEDtK`TF5;61@Z#r zCZ4h}{8NT7|9B9Ij5IAR#K45-#Z)Y?{rD9uPPAa3wJhNr4<3V2xjMy32ls~y1p^7S;4_?RX>0|JgqWq<%1GAV4 zTp0ekKe8TReQ_K-HOQ9~-Lb#s2HxCj!+tjn8hdi9amF?Q?X#mey?ks0jTs4tM5@P! zaV*#hTJ$V}BTSi3>LPVy3G>Yn(AN-Md`0$@_CVFbW3=zm71)bvAys223(WqGk;BS0TpHKty+{d+M%zM=vVxi@hj@-DRzVQFeX; zL!}|mB>c3o2PhPZn+yvXgl3@m;xJA|J3*1_d2hV-+vEkd(svw7zurOhR!8Wq(_LCD z2vv7q;OEhTA15zR%v8}L+nid$=MQ(#9AyV}!nMqYRZP7Qm(zgZsb~1*bYk{e)+;RR|@YULhl}oGYyd=WR8Z z`#g`{EDsuAN^seE7}tJzgR9l?RC|e#7r40wd+e>ginmYBV81`bd$RNDZwqtm50MuL zqg#|>^34d6OhvAx_rv3BKriwLM$UdC@15;O^O0ouX;FOOIUw@jDBe8oL$;q5y$fNS zA-%*b_Mr0m7|t#q8^Pj?O$=&#&!T#lGxQV)&v8f7(zRlmi0@s*e8*l`>Jq+O$)SW# z#hp+w_XwwBji9u={lA_oDhGP7!+`87j59n1H5gbF;{4mSe zjWBGftOxh38uSk}Ako8^;w6nICFbvX*mdjz9{+j|jp6PvkQN~?Fnlbw700HR@bk4& zA$h@uTgCkT4;PTGvyr^OSBgjfr+0YKv3|~q#Y;tKn{UIB@dp@4P=}b*##%y-FqFyG zM0A|Hf+HbD>jO&xVNOPw6NaL5`PF6e1 z+3ZH`?T5HdW5HFK_1DP9DQCIn4dC{fa`>9a)3dTkVzQGA)riVIC~rN82x}v#Ds0r9 z?e4gL33ba6Y4=4*lIVxN*K2ky?ZsR%&w@Xqrc%ZT3F8lg#KHu-r_#D^ngy z@5aNI)2NTPf;`1fdGdEzaYcCTJ&Maymr)k!0zTPYR2TLP-UY*WINFR5=hb6}*9&{E z+gq3Ls4fVy?6?=Ik2uUMOLe}%PBiqF!JDqz@Q&yjEhB#%9Djo0WX(-{hU_Kmy(-y; zP|m%JrMY$-O!9>-#a3}CDX2U8U`JR8Tn+eyMF=;`+TuXhE!^rl05?6t?+l02dt&`d zrNCpj`R)-qcG(GbYv<~+P}D8H!qY1UU{7O)E#&5Yn?921xng*NIHg|;dW&CTY$&%HWz1f5Xz3d{q-R_ z_icd*+@vyI?h8-!at$t?``X;|AkL2T;zU{q?A6xJ_kNqaV1bOGMZEp4C zA_HoJQ1K+I?~kO80W=o}L7me@_!)gylmYiuVE}gP7b?2`)yWG=6lcT~EU@iJJ31Ot;HXOP>l=RjRq_IBv}tM~aK}DurT5Hs z@lYavWE0V{+Sb_9ynyGkr;%jECYlwX>9`vO)zv5nGbG?b*Hf|*6H|n5W)~Lk3?Rv0 zu#$xHe;NR5oQ>FW?<{efnX@$37@xwTBjR|y#Ogc(PNI}LZ7vmq^ zVK`lQTN!{}{cQzV9!%Y1(L4VXmyd*SVA*I(3cBYPaK1box?-Z^ zfd?5e1$d{oyA^9}!z4?R-SyXtb{fm$nC=Q8PMWJf!C7upt zBEXWKn-zZygK5|!I3^LPsmVx)-;bmNSx5@8gQkiMRDxCmZcY!}{}8{3o*Dz4++%__vY$gfOzvN)r^>lj9h zAA~Jg2eqr=(za|i)Yf{V#@!GD;r_o z;4^%jJ_Hxx>Z#>xc@ztD4E<1f`xUMq-vVW-S*2Ai;GN%#*;|zek`{xZcRc!E{U@G} zp2SWa8My9DL}6yKV0Rs^QEZR+>gyOC%)nMt!k5cF!*Z2ZJ}x{OLu2S>1OP#k>TBc$ zC1peG9U$Fj4sW76584JkIC-1u*OLKIX0+(a@9>HjotPzgpG^s~E$*8z-=p z!&ahW)fiiIF5vEb7t(#@S9XPA`BOV67yWl$<66Z|*r>5uk?h9eJKJKEHT8ux6FX8) z!?yxAFAw5SaWcYuykM|C(+8NNSz6%x<*LUXUATGoY zIwJijcKnW#cR5C%-A45`Q>e0dDq2q{#-R7vXIwvQ$DND4@*CuP-W9X>uyh-RZiM-l z-z`0>9Qm3gjREFktOixmv_yE$Im}+3cw3u6Tao<^#XxN>nAtc$pYY%MvB&KG zW%2?KvJyOam0iHoCj&@zGy|W0b2WAl#ue80J`VK(6vln zpx;!G(SePXJ&fda$Y1T?8@LCYDntLhcUWlLzK*=WL?W#i5ZTDB#)!FFC~ViVEin}0{|RiL{T?DicZ-H&0nvmv*u z*{bfsML@r`7ezINw6-_)wGE)9JPcZFB2DyjQ6b-#Bb=+@8jGUtP8{6p0!51Vf}Z!r z>%UE2Fcd5T`Wqu&I6`l|?)+%9-zU3|75*@Jf%6$9RcJWIqiJjk&nPyx985+^MlKFk zR-v)70=b6<@#)oVoJw-!NDZR*{ZV0K`|IQd$JLz|)HWe6SQg^i=eJmDUEXM!}_fxZ9ZpuQhQ-5@HVfP=9M2L(Aj^ zF3xDf+T0E%JUyst+rn$hE<{D8A~~T1J%lOlw?)Hz4S9ilLtX-|$L6ur8w-81H`CK# zPd{!|xlycNzK(SNd&mn4GK4cUV7a>(Ri{s4ua^nr>D{f4ReeNOu$>p~qGA2c3-q3( zlq1nN_X2;KSl)TT4n?EFofot=AupKbV(im9yzE@J^8yLWQ;O=w2+BH(+rv390LGK8h{j+u&}d3qI??(fd&~HG_qTIkdP5{eK>BCR(@^S^X>r#CsFR%w&jA3f;f$-1}SQ)B8cHMm6_mUUbd({hS z!o91#$j#b|U=Md#Xi7nnaE!E!Bn;fVV8O0i|2@`sP}9ej14Ed;PyjQ^(kS%7qTyUq#&#spntd?e!wqvmK#Cu4O%M z1MBT*oLa)ga&Pb$xrO_?G}IhIarnwBEcO>8fOHp=-Ke{04*p*90^9LIcWXW7$NNx_ zvkxJj?yy|8JJpPw-8ajXoZWTclQM`qmx^Gnw7K0^M1k~_RfS1dHja1KA$6+-6j0VT4`hrhmQEqvzlAcYDBe1e@`E?OzIFj&>=>5M|5jo*1M8WwnAWf9d11$+K`; zGyLId8Qd&1e<$(+W2!2tK|3H7hiXosILetooCsNfjK-Ma?y<*l{quWVIT8&=a)^~C zgS-^P4I*&z$`kxDS&40qy5x+@zexsT#eso0cI4NhvvMD7>Avz`YZ_9}ld;{2lwO$K;8J)Ag;LXqh_*(MTH1vLp z{PV~Q-zSXVz$F3-&T9f5+lI;_0~e`Kzj?$FTB_@k6)RdOxF;QHKucK|w7*uge5bI6 zljrvT0095=Nkl0v*|_kSbRSF>p4GR}$9{kEf-uhLx*<5b3LVvnaM2*Z z{|z5z@-^~;Ael)C5Q%YP?7mFBav`bO~h(Iu2^l_&j75LVEG$@>#Hm7j$4oLuDQ zW+N-32n~a`@%-rw`WlZQD=!1lem2l0P_6EN1UKe~kmYRwWh#a_LIZ(MzDW=gx@Ymn zPt!OUNJ&iT3o)F)!|zL8xQ^Gi8Y$-MLy{7+S#%p_KRrczxH+`h*RuW=0byD#Glf;#fTRIA&k0k{1{|*`eebUcH||Z&4BQa&koM zo{RjvUflijFPN+FAn>tvT>l7pVSJ_o$u6r+I3~>Q_OTV1SeQXgoCmjpR6p_rMjt=I z&6X;ZW@L%jCJPyv%JB3?9ngKY9LtE_s3eMlo1L z%NQ{&kMa6p57OK$VH`^~T2EeBx`e~wdMizRIVlO)hVMX3L?mowSYBZ9-Wstr<9Pja z07+Xc2(+&CbJomv%o)bw$LHvZwubJytfa;gs}(lU^>a_?+p zq#Z@)l_k8r--R@PZHNn3D0Ae6$dkA>Ie`2CTfy0hqR+V^f)$B8YgdG)RG_@I2Lo-L z=4|6hfFs z&j=p7bCFkjnu@K{IMd#a)|MVzeZVI3Q{iIr_mUU15nMNi7o*uQU)O9{7S@k#CNy^N;cAQV~q_1?N4k`F+A~v0ZQQalQ)PE4CMq7lLZ%@Nz5%=EC!!MZdRR zew@7U&ycT?7kJP%^G4O|XFR-81a~pk7+(MV9}vP@l45#@JvD~&wF&Uhr=APZ;i&toWOJ1nS{S$S_v_ivCFSiK`9W`&aJC7esO zhdQ5h+Hei4YZbAj_C7vO9EXD%;cRs+cpblj{wOVo3;l>Sq*YCvk#=?o?-tIXYW-L} za0pF<3wXVB0cBy7bJ@x>`W{DK2rk6g>*sMI$`yPX8($tzgqx}U+Maj{{S!BFb$kXR zjg+VM@5OdoUGgcx@md?d_cihYt5H;7;+%xxM^7kK=X!H&q%$!5{e>Hi5oeAwzg@@11VV}7Sl+`T|-#doG4x4XV{X@cf z2s+zP&^v>i1=jIfmYo9`LB51 zx*b}oN~^w4b)k2~4Bp);fvvP?19ZJG-{C_?cPC1k#|XzyVQgp^E#=ABAG8HF8dTTP znB0u)#q9oN@&c<5O_11i2k)<)fSa`r#m}{IkL?V!v+*%LEVdw6TOCRaCkV+4z57Km zGU?CPgb`uXcTY}XC&j!UjqU8LZB4IuoSI$0mBUf65tCY-5M}k(1w-Us zdV}|$t{~fZ9eF`X6*@t6c=+iRW>0M0Kz#lY5$J9V`)Ja=z68T zu|C>hGW6H?qUiooR$)ju+QfIjl=QoQ09mWn_MfDuag%9 zy6-r836K8t2&ZR=tBQKE9_41^*lGPSuR~$!Mdl$OenoyMz z1ZQ(|gtsr@FN>6$LRBcY{uq8=FKldonY=)H$m%0&k|5%yS#M-(@IBYA=C`X|XZfYq)7RM(Xw!Ox6pjb-8j6Xx$K2q_)H{XafM zXPh@o=$i&O3p z_NDC)aEWX4*jN#^SMqUb99-)XYY(yntv7t6W zZQgr!0t<`NXcLkbINjNiXV(@n)sYG(QGaK?Eu27S3$NDv2Fdr57ub816}LlFPB(^c z-Ng8nNt~_AM^;=6f-Tq)pORk~w+!1TL(hBvkP4_b*fGG4|?Dcyl%xwuXF))oj;T0eN9K*O>6xIvhst zF#Zh1`{|=_S0Mk_3c{(y_juBe%hynxkx)iJRtN6<@)G?Aw!wmIvC{KqbI&IG(J}K1 zKaUl`$y9SKd4aH2|mFE(L>=SjU&E5jlHM;!$@^$h8 zJ*%W9_IFW@`Nt_7b}@uH>9q1W;bWfLK}@}SkEPbgm3#hH`6hXRgpp0fD7U!o+K=N6 zP3Y)6jqXNzPtJU(g_h#V!$0F`M~4gA-T7Z`X@QiE1#CJvryL-8KAZ5DfB zN?b9)w%6uX0@A=W3C=+8!@psnD+7Us?93kFJ=khz^B6Qvyv9=k#NOs?5?$~aw-Q?4 z6FX|U(N>!XI~6k8vU4#&w;l{LaBaI2sa^eODrUrmWdKSqk(^fg2b-#!2?IA@CNI!S zpwC@$2C(q{7hKG7hKV|TzFc^a4iX+^n0om$CXYICZ1)Yp{|DrI$O}xkT??eC$Xa32 z2-rWSQ719}>L-ksvMoy3O3RJk{So_>Ci_BF(X-|REY_f-sF;T3^hVXm;zp=Vq10l}oop>q%M z=Gsw&IBIaKQk>FzF!%0{xKii|a}5#l1q%Rf#kl$GXUv>%hmIQQwE{4IT)s|T;8Bsq zgHuEa#yon%v2EF&q^#2zk zFUU~gCZ-&SsvEDdIJ6(GdVI3IAfd5X;Z$-BFW)U-w51iNnwf1xr4E(H4kI(fn8q2! zo$n87?MM|C0_`^?vc@{V3rqI)N2z$evU}MVgvnqBsO=9*;I$Zzmofib;g_q-n zu>C?&EFdp5Yj7cxg4X!UZE&*Rr!mBl z7v?JAwF!CQ)zu={ZaOKvR{pig3#>_{N_Zg!!|z^W?o=%JY&GYG@Bf%^+a`vc#QA~a z*zIn>k-kUQ>a05LD;}Du#j|)R5(RB6}h6Y-Zop%U@K}ul9V{y9tQ^^b7s3P58cgAdp z3xejXCCV6i;anCh#i{mE(}MHfL+G7-gq!D^k&zezPiv~DWTaskdKe?O&Z9JRmAs%G zkcFQ6^EmsP$O{ZRiNQAI66S`IVWCEtb2A*w2qf(2h@T&!EnEvq7C~t4I|W}&(pPvr zM_w>?Ldw7rJ}was+ia{h*5gF(J_OpSujKs|^1_YFs3x4VzMrsGD0j2faTJGCE&Q-2 z>liA}3}E8!E8M%#f|LkH!hM@H!@q~TkchJnmoQf5|5ftBQ0aE){GQ|m1r_KT>_h*X zw|ICu0qT;{;88qsh%QAB`OK}0Eyzp`gSQQjYB(vF1r%fW_9%|*_%9|ekf`vyP<)&4 zZ?P>D&Gw>i>@e)UgY5NfVcW=?BBJ~P7ANbGU49ffneo_att=AP1lYkWp&irD9%HJ% z8*PnELVsNL$$HdOR-t6KEmT!DAumu}>mr(qHweQ(GLWR0BO`ALn{9iMTh)s0tG94> z?j8oKQs82v4arSwEMhuJT;Q(R4JB{I+?7W}|C3$xg+g$z zM06LCuaXxyVXJKhGLWV(Mhd4b-y+_qXg z{_q~B<2L4&AC(pI!c9hANc<*wL6-bN*~AU|o3CJM_9oh!N)Qud3kzfRUbT?Ww}?A! zF|b%qUSNJ8<%sMF!n;SEz%z(O|Me4a5$V5har3v37ihdN;)3P=gQ)DTLV};UkhmZi ztL#`JIr1;&@3skzxb^DKm^iWxc3NzbT6hoko}6-U<&HoX_ZNr5Nl@aE%d zbnMZDsmb z4cvDfKuJRtSA``v#r@`6J!%C9`fn|ovEt=p`xP>+g?2)LQ6 za*K?VloaSaFaRAv;=UY7b~A8CXi_PTb)LcK+;c2m?MG3(H~6Y+3Du&)Q;>p7&UM`D zi-xXnrv!n}y{S$#3qFA6$;Y@eei{YYdk|o+3ciX2)XihiK{>Q5VI6tl>H|!79)OFe zzpn`4e6r!n9GXzRpS(a=iSVnWm+~Vzcj&ko{G3 zO%ZkcI>xHEfJeTu{#~w+7tY_t`NKOloy29r>OsBmgE)782@978(b=%Rx7&c)npzy% z>j6DYWwQOZ$P2s`@`4*jUf71_`|t6zDS|uVOZ2w|VQ#n%dqZtD9tpK9WOrq4BSap%fvdHFP~61s z+#)0uZ5Txr;doCyVaR3T0*f>9!Z^cr3KN56)KOe{{wtTe7OQ|@<*L3U3ss(#MbJ+fP0tx?2b7C%fe&7T@1evO`tf~0sQ6dFaHktXOb7VfW!@g&9{+dTcD`;mf_6& zXM7q-f{U3*bD0%g?xnc>f(jQZy0p}&Q0E4VETpu2k=iwifx?hA1CX5|#5eXuxWCbc zi8(GHvB_2%h^*PM{s;?pPAJbZl)&9{{B*Y+xxreijdTXg%py^F4FqS?&MQf-&G?ayQB{0U$EMnV@eKGlNB3~yju-_w) z;Sq(J$)E9Lun55fgjco%r73?TAtV*U(Unxx+1e9OHd#>nWYhA0M<}JGTYg7es~?A;SCqlgJAU-0G%};O*xzWb4ZccD30|IJ=Ad z4#|&@7sjUBk>o5&Uf|JtkcC@f9cC6La4^z|icNO@_CZ{JdIzVYoT0H^hZT`oE@=1=q7P zyB&~w@iE>^9fqHY7JYx?^ZYL41?EHI3UEnl!OZJLwC?wUfjs3pq3*1hG>Y%S-S<~< z*wqqR6o1$xt5)(LUVgfULQ_RZZ|Ywp!W~b3guEa_eyC{ShxBs`c+j6ih59D<6$)z- zEsyQ*BQG$5Fdrce^Z4n}1hNAxXlzMxlT_R;Wjt3Lo?Ip`tZf8*k-R{$XeBO@?mTlJ zqzy0N;ZQDIH_>@nM0NjOVaG;jCZ54liu;FM^eFC&7G0FvqB_@*7gW^Dk$T}hewpq; zxVb9*t^{N#{>rh{H8!#6n0tu+R8ubZh(7C=$P3Kp<>c6;5+mct!y&N|Q;(K#CT|C{ z<*A63WD^n$`%unppTQlDyr4|K`K_`0C85~;o#X|csV5Q#7w~wb5bm4Uds!GpQ&M70 zH34~HtUnb2rev38pQPWE5tB#Ai3z-#KaB`S0~#Ny*xoRWw>OT#RgcE*dh&vdCQ`{S zo}Ej9*-E}5-Ty)4g;l$6{0=uMA;}6|8atcBlpmKbkQZ1j$ zC*e{m)*0THV&m_7{F_HL2hR&-XNFOg<_i;*)!6e@@&d&u3G)J6fB!QUt9=Ngku6j# zkT&uRZ-h6ES;^|myjqS(fL)N6js$a5vt7zzmsP4OXarH2K zHW{PK!j3UpiSOS{ULZe}vqe~t6V$0jVO!ZtvHPj1!YU#O>FtwvbiWg!R%)B%*l&;* z$PaXF!l)*Eh+9=*kY9&^E62W`th9J~1$FVCNVrw%*AS>Q9Wl4@|;aTw=sU%`E{BT9Y*I^2(3%`fFz~iYwPuCs6+svpYr5wrXR~nNFHjda@(1e~FlNf4AB24K4&u6|C~glfgTXP)8ta!fvI)m z1;PaiIsr!V)S^aQ;q1vwbR z^h4Xt zTNn#91R59{J_?G1!AR{g)LCrB1 zhx$fPALl}2YPIJruc8k#J1_XU=ujQD7PEYdyukX#%D%-oxA+Slwnf0ske*FMcf-^{ zJpQzV_HaXJF}trDPfWf}USP44>>;KO4YoT7_ns)WODn_7Eg2)P2p82ybH`?Go`1ey zzC~VOD`s`0y7BnqPq>K1>R4eLZXN4%JnQBs1K9C<;Bu!Cp}AyJTqF2$D@caFk8b`TTC zUFf$&uMzaomdOj%tdAzl@ym8k@19vpUSJbd3YxHtC`D8EDP;MWa${96KG;~bhKGkU zY|PZT@t{OFp>O_YJRwZwVj{oNV`1;fAh8>ZAD*Low*|MGBO?Xr?C!vW4?p92kp+~= zPgZoLvFvhW2A|$fklo1znVQuLKPY*+i)iUG< z6xZ40uB#t*9O=i{+%?o>Z-p+8;rLbZ!f5L*xEV-^kQc;Yl+=p{cm9dw1qF&VvI1Pi z`Hb~8BVB`?kLh6MB*ITT~*5#nU_D}r(5j^HeqBU0Tz>!;ltD=5#4w0p)0|d zdluGTP_zy}_W1?e@5_gesJ{z;M_$GV#>R#)FkaiY_!4(g@o26I{sv#dI4s_4!pyG#=WcXhr-7)?2;_Uo3v4$>rL7d- zAI+mT-W}STydQxu|6<=^^{;@uFqBO(e?57D{FNQ)_<h z_M#bf(zgmi{p53uRcu|^-R&PqURZB;d3guyAiFE6ir8IK6L!%V$n7S(&o^U>(Z>4= zgvKM)}dHTNC z8ECrtZ{}wvVaV^jjIIN|B0DZn&Q;cgu7wYRy!1KzxBQ*oBHtn}uz5%I?G2cH{YOk6 zb%v%oy^rPbq#y;`63SJd@8P7!>UVyteAmtkO60>d?p4H;ph7lW_6l1MZRv zdI&4-#p3e`9NlR{ppOAic`Aa{5PtL$UVR)#UZ5@bY+GCkuu@|B@J*{iM_C2}$r0qJ zD3GChv-@*fqwng)@F7QN@CCtNPRa(mk943beHW})lSz23EDb6do+@mU`f(;(50XM4 z^IL^EkV9N0uHU-f7IT1h3j>@33$?=S#u2~Dp?)a_@>}cX+C0HO`uFp#J1d%(T_ys z#B)45R}6o1{>p&=Gxxxnks?HVMp|A8772qG$TJ{c615HazLEwEoOdC&Gz;+|4p5a|mn^7= z*Ye$u=K1${J8}#=&2_l5QW;xLmig|sLY!Orfa?c$z(G}tYm7@MS|Pi40k0NXu*Y1J ziWz~=NYFUQyzm0QylBNX9W5wv&qShchaGwOC`jG~KfSLvTtr1dmO!AT2To4B!DMqZ z^w-;6K?dTgZrE2ng%8gMkhfJE(riMIG1{nT7gODa^7Hp`uQvn!1SlBmo#~!=<{n<& zZ$q?&78F->*F(n0Gt#{c!MXz7H}i?#jl96c8C`hnuR!aeJcOz9AumB-i}M2l;^a3< zVVxK_BD!!8+@pS{8` z0bllhR(+Phii{NWx5grr0bB;4gye-w?;fCij}pYh39KMSEb;;(X-a>a?(=JV|F(sz1R8A_mUR^_IKmfy)(%0kfCQ~xnF2^6-OjA zP2<(gdc=A#3?T(E-9WnEJxn&l!Cp%W63f^`7+2N2b|S=951PuWpzZ%nODTo_&m0lgF{kmJeB$@8~_TLS5c62gA=F z;e5J345+}`EROs>l8$O~+x zxuoSjoPG2X7t?LH_`W(Bz#7jI&>?>hGZo~5A0aQuvc`_883OXpV1B9>sSf1N%Q2h$ zSDqDFW=`<*^n{(pD$D!($P28{^~dq)SNQpS3RG0+-E%mBY){W1C2otd$#M7KF7!l>bk}#yZ90Jt3x=QSng8RRD-FvKb+{@$rJvP=9|Jlw}*7^#{owX-O10` z1e~IoBRsrFcTEw7`u7UM9OgL~efb=hvK^qtjtt`NL9tyz6I<%0@a}yNVhEQ>DJVlt zGYA0adPZ6UJa(e$wYlIqd8lVa|L^^gC><@U0LKeE_8eG4M3gCG7dFIQcCRAukl! zQ`}|mjn%7^Q>_D$dt(Wo=en@VXnmuEYA7XLSa`>vu=D`-_*;X|;@_HkZzhzJ#1!CF zb_usm=fK}uMWn_OAuqH=3dswEU080Q7!h)M8h?C0iF^;j-0XV7E@p}6@cP*WBv~+g zBD4j4M@C)+dZ85*%V!BMs0b!UIlr-hPewOh{COV366UhtA4yFm`@ap+RBwMc6T^TwdO!qm|1u0Vu*MPP6LEL(`h~aEU8gEj3*CYSq^0+98(09oyGk1b|g8<(>tU% z{9i?0D0iV8#>NfhR2r+Yrrt;!e~dpY_9KR^s+G}zIa^Wv?lCUsQ*2rG8M8_XqkG7i9-R<=d-@XvcBZ6gqbz`qY!4PMm{6*9Av+5lNZRR z4T#xfHTT!a3xelU^gDuy`?F|>wuGAe z>du91B0$V24nt2~;Yx-*)Kutt(&wK=Uf}SFx;IjqZxfC_h8^ZKCZrX}&nSjboH5>g z660^C(6Y--I4R+R+_MY#>ECT|L1#Tm3zX z`6lr=`}!WPjgH}<9p$GrKEvt(Em$~L;OhH3s1GMhE5+qTj;>qR}^ z(2J7O^+VJA&v-GG1v@EWKa}F3l9D^>9{v&UZWh7fH|;n=_9flT$j^^eRwCQQ0xBDH z&%^QZ1cW-T>b~5Iidx@`Ixpx&1qpjmOm|rcE9_)Fz^o|PiuM30#<5lTX8Q**m@lZ) z*ml-@O+TbnwxfQJA9U&WS9;#$&(gXch{&nK(P(w7KYD@ryUngLT$!Ii-98VfG4hDW z=Um^IbkFFX$IHcb#8_#AM`L1H_w;j1_~m5>LiM$wyxExKdQtB;??sWYT17)I5GiF< zI2`E;by>pLjg=wIwR`DH9WfAfLI%f7gDQn#vrs5 z=bq2vOcK@Fw&P250*Gx^%OIKxv=hk->Yu6%rm_C18pIPxjkoqk8%A{5oP9^yv*ZfLS` zNO49^N)<-VdvUn37Db*mP!*03IpJ89c1%TiX*za$sX$sr77{#jB)3lC#ls#XIO;)> zoBNT2xR?%-`ySxuH$8|jBmZHOeiTonH9b&0^%1YG7r~Wk2En_d+CkPH$M61v&vy>N zmhAP#_eJl)2mfPN@topMgs~>!yJbB^^!Netf~JuT zj*ySd9;aHD)lKv_Wo=EEd-}qG?jz6j6)X`_I*9ojok*~wx@~#xg^dwL60vZFm!~VN zxxRuNB*mSPS5t$u-A+&?{Lb%# zaKPg!LrXsa!|&c=vC^OH#;_RsjQp2ut!o{J&O3L}8E?*wQ5`L5Nb>CwesB~|=i4{c zUBN5@(NPfyw3S)2K#$GC`4ykX<138_aM0swD{c{lw=dkaw1r#dv)=GFG+jA`Pzxo_ z54n4jKe2c$rk0G0pBGT=#m3C)y+uWV5vzb(USJqPOvfMP=jJfg zk_cxVsnuGDo|VNNRnKq)+ZjNc^cG4evwqqmqiXb%;N4a>bK_M4J+=@@(d2h1OJ z77)BtRAHBX8Lu7>B9866LOFn|9m!v$<<(&kRfjtduj8oy@{W6g`}`L2f^WfDJREI7 zkh1|{KGK!h-OC5=+B(n>+FeF^D;h7gU^~^lD|V+^g|j<95f?t+N3GB1wUz+m@Sthx zkJ3vIap8cWh}~J-S0!JHL~&IE4h1+uT_n!PkR7G1V~|r^fW!bkq^SOo;F%z{dK^!m z3?s|i7)or;mWwl**xNFTPw&oRpMwdMxp`W4q>3?u@|$qFFahrLeHli~5aI%9NvhYP zhj6acLZCa3oL;FE4^>__oOitmIYS6}1x)Difxqu|Jn-1`u>z`?1{_+{|~TnNXA-uJf%t6Pn| zW6(X#cH;}89I(1$y+EigmC=WDXfBQyXJEUnAda)$A!JRH(7Esik2{iJZ=k~M1|xd! ze=2!_O=|G9ED%+22^YEw;HPHO_bomt2$Z_SwVd7VTp^H7p+~NT{D{I(^+}|fW z9<^ilD4}XXjhm>DgUg-)OpMoIr>QxtgxA{J+rh!n31NxFXumvxW4q8IDS$k2Tx${iskPXU@ZtgPvakhVFmD>`)OL)!FZmy=f2%k_Jn%c8ETF4Zr;VUZOXh zZD%3|alR!I>u=)zOg~D(jG;+^@rz07dxU})`&|h=Csd4o#M}Fw*kQrmFa4GfP_10c zlB7^~9iMm%E_}k=a50?J1zS0<>b@#$+dd`7IMj^4$N&CcuQ6B{4ojuAs|*U<8Au=9MKB74ba8nDaULd0iC92^lG zpO3cDTR7p*R(^^64*7wit_^n8F5tia=O6Ll!eMOTuWe+phL5722M)Ae!L@T$*lnjs z&&70+1z&#)%DeC5@q8yTybXknP{CIJx-KOcdHEbOE$MLOGkeIxD6kb%ubyBuEf5-f zWdRVPgrpE&g~$K?ANaTTi?~^^aXaV@LUvaW+Fi>t7X9}=z~xM~RP&I)WH(2$o@ zgGo>^x|d$z(Rei?ZFR_xNPj66Sm(Fl*4>M!jB37N3H*z0!NVH+%pO{HI7Gnm-NSA~+OTt+n2na3Fcc5?I`Bwn#;qsUQ0}Ks0E78} z1Y~*E*p<_Txur+w$#sJEhBL24;*FRVf{qU0>5EIq+h)f7h7`qQcILOf%YL*?Oyg2Z z4z}9}fCc+p+1LqttH$tfssYiCTI24%Z;l-_jlc3_6Yl?_I@2aq(#p&oB z{5)TQt-7qiNBPJ&3?*kusTdRb7rh6*njNC*r||G-Eh0(unN zShH82eaH6@rk~$O>vnx8$&%e!lSE1#?)jJSVCD>pw!1=CLTGn!UAXQqKwW(yf;rNN z@OQ}mjJ(LMk=HUu*~ly0I^@Iso7<^oCC(6_k~G1Vy&ahTco+T0W8iJ7#Q`)aB`x^m zx8l~*2RL0C0wYyPiVKuCBots8QHe`8M$w)Z0Xwd-!|tn0@hTC=8;@Wg+p&X+0T$nv zcZx92yM{M26>uf6&grqqME836{mBcgaVOAUOw0m>*Wcj7>`^#M3EsEZa`TH7qg3!I zIaA@ilU*ydvigZl#w+VsBDQ%EOYF~N*U)<)+p`t(;>tR3JaisQ*UI3*zEA$clcj>pYA4G2 zCvm&G071qYkmK$x4ONS+NUf+qN&FU=vu)H^{1?U6ak*8vaQ8Ew)^CG^R45Ws%~#_TVM%2zLxi_Hz`L;w z*ekH_DL}_N7KL@`u#prHp%kb{)vydlY2Oqkdx{WjqPe0w-y#sH$B&_8zaV!0cn+sH zMg?O`??b%1+loDYCXnRx*MwvANu0Ss1?H!Dw8rm4n6VQ0>V9Z^@>hJm-H8yEJ4g?4 zaVeNu1|X-hA5(W9;#`I|6jTGTJH~*DPk~?ZX#A@>MWEu+EUs4tbIoTl${*gTSx89= zfq|qXB*nE6RyK&IAD*K#YdbVKd@n}vQy<&*A$8@wCNf~8gvb`l0MFkHVS>o-JR zxO0#U55ASNcyT2gMw}h#8KedNBYHiL+1)GzMU6&rA${Z#9-TdkKttj4E$dF0)#v0aUXA8_Rrh6KtAkV>!f@!q9B$QxLXUk% zLKmJ%nMh6D4nv`jEnm+jr&K&M(KGuK{`dcQinauA7*Q?r_h3VI#DKKiJ`8+%i>no0 z0-dD{VCs{MBj<19#mif$-fj;SVZ(g+du%K#ns_0l^C|x4|NaS6o!M|#UN>?51>wm_ zfMCaCvoEZc|h2Im!LJB4UdvW~Q6HGOvz@ERn!kN`rny}k)2$P?daOuc4ZpEcn zbOWYd-bQ_b6L=inVmOoK6Ep0txQZ)-2jI(&nUQ7_YC^o=oQ07Gmr&(v303krR&%k> zM0W|>R!ie{C>?wb*U{hB#bPDntvGh`BOaeSfSuOrf@?^3<1KNhAl+x0(%?WjUPe|0 zW^PG1|L!k%(02$f!rDYyS`iK&kvP(G3y-GGp(w}~rncVj3)G+-uL`%6R@{C(iRRob z;4854Dg#~jL>xLZf!9Ah##rSMB--n9O~K7@E>A%knjTe{zFP$^zMwwbaE%flYTh+? z^p`*2?e#*KZ890hn&aw*Taei`O*QQy?6A}o;3~?mN`~HuKYR=a)5Bn^M*dD?Pq34q z7Xzw9nOOe#n9#JH9 zx_0&63S@gD$5^y4KEb(zk+9WQ5?sq_6=jx-&tr5T4{nOfKERr(t9Ccva~wCX3?k82 zSMWViyE9y?Y>B;Xcky7d86{yBREr44i;Af$68aYK@M0~EF;#)Tb3Ld?biRF$(^2&Q zD=|ocTOFvDHi&nR>k-6$M~>p&%5!{=5IzxCB`i{n@yGM%E(?JMJrm2pnvQWO?i|DO z&yR7vsS>G#J=`fe0XygM*D%suqYyD#rljwbxy{p)4PYeaY6~tFFb~ zN{U9<*Y^TH&mM&JCX;b&65Y@?8oe(*<96FlXfa|U#Z$hmE7A^kWAfp1+`n=PDO+q| zq%H|Hvv8C(Ucjl6ShyORuJpR>Y^>qp8;ZiySJ7J@2@gFf$SSPwMIC@E=jUJOMKPgx zU>n|pg}*(<`K+zbqGuJC(1%yjD3;#Npf$*9-R=?JCkk>>&@>N4X~PAymd3$tgYF?H z=o&}w!9DQQm!h1!u@~jGX)j8kJB#}cyUyU+cq1Y$EI0H3gZAd4Wo#0aTco)jdh*Pd zB?Q~JbI-f1dm+v~Bi-9G;m*}rq5U>Npek3^~Z$9l)Q|fwvyFCT>T_oy}pT(osLvf(cf5a zMC9HK8(D{TVgA=AxR@Kv^>bKH!7ctWp1!+-&QKdjuGA><6i2lYl6w_Pzf7WWryYlZ zrBo=VR^7pi`2plPQ4A4I1}f0KRSmYFxc@$$-t9!HgCMRenWv(0>@n_l6(f-9RY^7} zzCm|Q#Ma#=-EW~R!bzYztF?LS{g?F^JaKI19o~QVjQ)QFd4cXJC&`C(*g=dudVt{* z5tL)t`;~;cO(b$#u3+ioV@!56Aj8EJ+R}R1U3(R8-aSNZyg&Gi)J4yrqGF1$eMLAk z{Sj|_;|X7eAZEWUG&R>9QzNg7sIDdaa_=}CmdS@A!Xx~tZM+>F&wjz(-e~e!W(x@@ zS~(!Gv>n&)zrf?`UC7wx2vbc-@Cp0mR9!^Zu|#+nn5-GA&feRQ(|QrT6$uD1Vm)>8 zcZyru4q51X_zd%B^5LtgK>Eu-&!-O8mY!lFFC6;nDl533;bzOAHr)B^60Q_&=W26t zs>_|@F5t;~ip$}4klOH`M1*n*Pt6P=8K-e&AcPjS43DXE3pSZ8)og;1apD*XV|`%CZO_gYj_D$@W&{)C-N>i$ z$sL=_UC)EQO*yVT97X9iOTiJK>vdWdx{tw@Cd|zrgFPe2bAMBUy6#rAF8zuR*ITgF zNPq_5pTJ~7BzZo{GBn;0(H z3PpBradu3oNbi*s*1wd8$@U72TpveQ@ow0wFhUj6g&l*rA4eOHV!yYMU`Hb%d7<&a zODtTgLVBbJ41~QXOMmm*i1M?yFjBTnxHA{4lh^CMDxBS8nlN?eEDndWqbKP*JZB^| zm1Db|8PtS!mzAt_8!D8Pa{YQ`^IcO!y%xF>^_WrCSNA*FuN=A4dIv2g^3Fp zFl2V8zca#}nt>Zqj$A^2T{`7`<27^7&Yl5CuOC8hZ4SarS$|s)XEd!7(Kh!K3nK>+ ztjGM4u!VaCE)bGk+}OO$CeQgzVKq8iU_iE$;$!E8z>LGis<7ELh{gB!F}TO|n*^1w3cVMO zEH5qtiyeg+d-4ufThm~{^)SRme24Yl-I38Tk6-^k4^T(Bl=+vGh7)qS3A^7sg#$i1 zP-8K9-EaI8$qNh!Q2@2yiPJCs6Cdv1#Fc9kxPJXQCllAM;@0c~{PZ8c;K4uvd{?%D zVU1*Um<48_>DmokJ9h@BYTD6#{uX*F4`RE44kcgqAe0!y)v)jM0-ilz!sPAixHhr& z{&!#e3IF+@b2x0L1wI22JX0K;`wx72G=njbYp-9Qz>S-?@Z{59@awxl#H&jGa3ReJ z6+7{B`(fBBDp$J?iq=wm*9pPyoMxC;%(^06<# zf;*?5E4pN~U>=Z)=9zgc+!)2_s%o@$4^vQS!;xJU(B`v(Ws~3eUZLku@<~B$T|F9x zZs6t5|At@x_6f7&eWwn;nKQY};lkSCx4_wxL z^*7iVX^QqSs2Y2R|NXySqCYEDgu1&VpTscfezCKabnoVLZ_7)BJAt|t-8YfnhrGbXC?9(oZsXC5 zSD2l=j;kWE;Y|O=$19jOiP9jg0NJI zH|@Q+@|fbye|wMlD?{iwk%jG4xbWrVASJEDQKA>D61OhE{|cbvjf%DHE8eb!uXY5 z97zdW##5+0n1N6`Ww2d5 zmvQgaJ1pHkhvu3FoH~+@5LdRXm%tb0Wu#%@7me(WNj(4gXS|xe zgqDl|nCr0>xYDrSk&UteiVJ`K8IMNKpnAWH@OT}vySgi4D+gBWUcYSj+T%#^(_UFs z#deP1Yv>>}_Y@k*-c9X2n0@&de7G}=%IZ2aQJ&A(ZX=8{0`fvYd>5`h9Yy=GR2)7= zF|W1;t^I?TynY^S1S;7%gHl4KFpEnPil*>QuR-s?MOWXI#EX8P9lVCvmp z@wZQN=x<Dh$`#E%^Ncq?dqiQLF1{RiDGgS4joH`pMf@1S8}Ty zxB6wz@jhG}9L5mYoAVj+_vX5jI1r!Cg(PidWh~|qAuyAvP?kDh* z<|9W?cQPHR&36f}UPWDb9g4P@tZBw65Z>3`5|2xdXK|;e1}CcKD z$La2uLb{KU?%e|2>l?W<8&70K!o^sTTYb5F-yad4ycE@jFJ&ibf>oMlWdr?zMxtOH+a4C*gm7uKe0bbm@jLNJc z>~q!R3M%e*IA*#&e6o&WYT+8j36oV+p2ETGRQT9yQ~n@)N_Nz;4nuy^ZQLR3K5+UJ zHwK%Ioj_B?0i@Ml#{B(h44mr0u}DuCYEW@3V#}`zDt&tzWoV*;dCe4lkVl4>Mj)W9cjKEJkt+h@;>3Lj#?bAY{9{t zboe>waCR5Hp4(#6Egh#h^1@@Z#CySzV*hW(hGciE-3QUwd==0B?N_{gbcOI6dyaGH zJV&)be7N)q2$GchuzHsU(YqmRa{J;ThD zhjq6k5GEPM-A{kQ&+lf?-r7huKZAyWdziaG^<-)!?APydKygWbOEQ|zk6~<(YAbq2 z4TNonM+Pv|eh}UUDk~EvOc>e7z&#e#BR9|z%bNGHlm~Lq(A$gRKzYIH8?LS;oSEE+ zn~U%9=H)a-tM|dvnqnMb0?WXC$m^QLn_pgI@zO93?XrTthCF2HGsoS6AUXpiXf9$dP39lca**Bxy{ zW#vgkAL+ogyLT}+GK}(F)-WL5H_uV@Uc^jMJarGJ>AHX{yN(X-Z4jBKL#UX{NW-sXysVDVke8e8HDQQcUBmf_oY z_U;wo`#!=y6yM9^;bysh>v4vcERfYci+j(X;KC)soQ;&1SZ<~T46@Pkgk@Nk!%45h3GN9iOK8J!lw?f@HwiJDrui`?_X$}Low6@~% zr2#aR?}w#2%S|$nF?2*wVm&7AzQdc>cQ9VFAHH__oX=SJ#~`O;8ZZCw8V^TDaAda~ z3^l)u4b}_8kmeC3bS+ot$hgWuBRqLBDG|X|s*sYRTw}8Z@kKRc?<(|+FW}>w zC0sq*PBm^b)wiLrGvcr0SGMh~eMBCPRFQvIS7PMuPx$MLNp!T(xMlA)D+ubU>n4VT zqC|Mq{qRLhmRLc2+1CFMAzUtIhPc{3w4dA$55D;3F^OSjC2NEfx8dyId7Nu*A`BtG z?=9p%xnZVUUCZpwGuw$0vRxfv{Qf&1@#}{foFUuS)mGzpyvIsiD-hO0;lspkANn5r z0Sgq@ySk~qrR$lrQQbP&T#FLF2 z@np0fH7P#aGb!`cur<2{9k-t0*FQeM@X>>aa*_Svo)??wR@9?fzM!4P-YpDtwxae} z1FB9|BKBw-&QH%{Ve}%7L^;DqjZH!);&|UY?oM7oXDjK=FvO7xG#*bwas$<1Pi~;? zL>mrmw}q5~9b@e6LWgEXjjg>``2O{Wm<@ zO!xb*N%wcSm=g*sss}`M7xbcTuJoe%H}s;&e`O6(JoQ(6d_pmd?l~d6Hzzl4;^F(h z;NSmn0V(Pfuc`jiF$+Y?v;T#U4{ojNd0)fL>3jI_>mTua^a!>ph*LdJx-jB`KE=x9 zgJ|mL#pOFM@aO;dcf5Z-gMpq7oGMFzkFD-%oac1cflJa!oSh=wsm^Mw7V4g#1P|qP zcK=#0it_UD{i3}n6{zb4ApOi`JbZp17pkhzaH<`b2S+ee7!C&=M!5LOWYV`pUIxos6fdxmdT)jUd?5Jq^BK7oTOix`wcXb0!bzGvnH;6nxCvMfSU{Z1U-l{P4*pHLs zgEuIDwbrzt>+B8mHk`yBGef9JiQJ#lJs9aF6{sT|eCOFuobF5W0^LvLZHK-V+f{0< z&+`=Yk$3e4{`%`Xw5R+d$P4VAq?e8jg>d|!cI2UJ9>L&2$(QS0qbmGWPM`*E?xS~0VM|rLE zB4&>`LRLhFRiXH)s)2x{4op9u!If?nXKGPhn~%b>eAEpu;ra9h98cc^C#pScwin{k z>;J%uyBo*qK^);Bt36jn&iWADu!+@d0@A z`GQ>+MD&pnH$%|TZd{+cj=@H%&FcyOj^9M>zU{CSeW#lWo3vGisY^6Y-MEAz2W4SS zX5l7u?JSS6zFR%zwPEy~EJ3)99@R^NJ}_Hgt79LF`U|%)J<*Hy zCd!k|$8oeY2I;le@L+xp=eujM-$@T@N)&4-78r-+QEkogX$`JC`U`#~Y*WwrnDp=B z2(wMacAs|pw6P4-F&zNN2?Cv=-?vdp^G?~o`)D`4XPPw z?5XN-6QQSvuVCujX|&VzwSS&T;(ej}4J;rps|+K%U1+*Jj#5Vz zvb!AQRSaMkoPnz5dNlW($DJ4N@nYsYPF2_A)X^;L^fcy3lWXq9uo%w-UMW@R9=M2$ ztrQo@$Li{uaEfZDl08n)WXCLUx(mn)O%GpVtScF%2kQv8HIT2=p?_imbLZ+2zn$>G z@=?2-{S{ymoQ}4OS25Zz=!-NFW*Rv^fWF2;xalfUjF;z*H?j>%M-?(S zSs!g^-~#IQ`$O*=c2|&9g1&V)8Yd@k$cgMuc~V|R5msALG5qTP!s~lNTJUZ=|2uY1_3z}vWi0Wkb+eFg-eu>% zZtE^^VZqfj-ki(UEztPolIZErJj5vKdzbe)6~1<1<^$OIRDIeryQdU{3stw4)m zmV}Nxi++>`d{RO>q@$zInhzqr@q7WAxix8ttbhJwF@_m?$2-Odr&$c#>+p##_!M(@_jr|BL=$jCuz5LENDbUDKZus z85!B(`F|*&<}4GlZDE-_4x>QP7ekNl)Ce) z&G5H(sFU0W`iJF=!DxeSxUgVyn;Q}1>c#@nPb+nFOl7FD?~55nlzW|s{B8OH>9b@3 zTk<`Y0_f5Et4QAcg9;2w7PJgi*gc`%{lI!6CLg3GGUw;-ryudJm0t-@(3M69dtK0? ziXYE{;%|uRt~3gcx>LZWWZ%-=Z=Isl4K+f#rdLqir%UeO=tdj0BGUIg#Q_V})su-? zP=Zu$^drBp9LbLqKDYS_BPv}v5@hECRs4riL25rx_$cH*QNNF+Y{> zpVAfh4)YT`|7>t>G1g2aIm;m*cD+;HE7o*<|2U0!xT1AQ*jrZ zb?jiVBh#g9gfYkx07n?}Cb|TKyyP?K<$hq(Y&qCZuGxvmDD zfb{ZSorXH0neOwP`SKTX+H-_26J1_O*-ZDbem*)#kJzU6jDkwB?=8_R_x1jodFt1V zuPLc#QAV2*Njoi9yzM?ZQNf+L8KdDKr^$1*NqbmaGxsRDXD9=!ns2^Y5X|fiz>FGn zh4roIx}?&HHW&TE+Qh}AZZD153}>4Tl}CW3Na7yuo&!}S0%#U;%~ZgWxLp-|jRSr` zn6J~ImN=vBP0@#@XvAK}(%M3??VIl`J~)JzVZK+Wql-~U`T+vPslH+0BpndiK5}T; zEuyt56a6z&YGbBMKWI{Y=z$ssk`PWSh`1gr;z~A9Q}|K~M8T`?QZx9PL@Oh+Poax^ zChO5A@h=&b%BF(B3regiA-UQ?(#eIQ_Q|}ip$NP2SM$1MN8MRc$%UMGXm937svtf& zt2EbxnTOSfYS$}uO~ob)8Tg!vv!!bm1(EqN4B=yjZ2!ohgoh-PYhkPD@4{hX3&N^v= zJ3+0$tk0UL$E3;m3!36!4fdJ+t4uE;HJNWR$M%gMG+vCOfJ;3=dW(TB{OP0VRRLpt z%3}rkLo6y!4w~v5qHP6H;tdu9NAi}w4w@gE*4z{2lAUHk?*8-8Q71>v!Kbsfh~xfE zpr~}vISIN(orbYm2>04MFbTd6y6Zs6zHnW25_q#}P$lSUU#hVO=>Bog3JH1R%PhD+kQ zF*1UgIdo8(r|c(8|8wz>#O}$HTcsQlm;&oDR-~{UnxCX@RtHKQk9)fRAgy- zDri%ycxo75h+NDc)m%~QEpHZAi12Axexc*ZcZuPD24t)yoR!EqhPKAx(^mxJWTr%S zC1-1PM8xU+OnR4`lDys$9T4C9Sv`Qi03j=nnO#~)?pk;`3hsA)%EZ^52+<&NIXmvE0$mM?&iSg(GXC@)N z+pJcTFt075$MbzI&sTi-8rsl-R?{qa->WiDC{GMIr;g4DWlB7+nK6DJkieLUwDrcn zPW_I&D0Hzh)4_Z$y-kpGPkp$e+Pb*&Q|h zB_ew+8uwH1lnwbFZFJevWrH;%eM>5FJxWk7^SY9PGc~(Q*E!1$+2{Ifg|RsKhP0kA z9@6#?4(~%|>l6)1#iFuRkP}|ZPIZq?Md~UR-su~;QeE6VJ)sK9%3YX)3yT^>Lsoa+ zQy_KO;vU7&qXW^z7rif%F1)*LEJt&OW7>`f=^e8m;+$U1y@3JAo(|;ERfBc2{!O~( zu$fv+)EH%XwAhE?EUDyT*{&I>%q8ZjX%H@xUTCr}w=H=x9oIa0lbr=t7w&B5K>r}o zy51;}t^@d0%3zCFwX}Q*Gi_>RHs0NOE9IKOA%Sf=8>Hd<$`cl~q*LtcDa4eP#&1TZN?4jv5jY zX8zdrZ0N+iyXi-&ad$7B<~pWN&T;N*3gHo?c22nmM}v&r0-CJYJC@kio>7&t0Fl&h?r6l{x2wXH?M-L+rI0 zSAaTnDfIEvs~C?l?3&{84%js&Bt(K*Q%rsz+xsB*DtM2MZuj9FT~X4BvM1w7=zh*g7UDT^kk^JsB8Z8 z>Nssb_Ps5xFl+7Q3`l;oR}wBN5?~;EB(j< z?+*YJ@bI5~+1}mOSYC*(;O`w@_n^XC4y+}r^>yTkI=QVM#X_V7*kZ7Fg}rwX`>dND z?oZ>SX5QTI&~WP;Vn;0`7V|1|W}Q%JGU1wwJ z`6s<&FhP%KU7m#U6k$Hog2{n51D)_R0rHTj^I&JS@a*|&Qk=9Vyr%67GSQTcA*}5p z$jBw%kVO$)e|9CxU7UJalYp~HqlGv;wMQ$?(I3)FK@` zbqa&;DDy8M*3{W|;Z4#;W<0szzf)JF4bObY#2Oz{I8kP# zHLX)pQ)mVFkWYIT6RexPqs&BAJWaZbww-=Ic0L>A6?R4t(XN5Jl7fv;H zlUpDnSj=02#Fv&=h^%J;cD`PQ9?1a_r0eW2*2hX#4`hvF6F;3O6_x19SX-6SrCFU+(9F3p{wH5IHwzvcKUwWZ9&sI%L8|&~<+UME;B~-n zl#RF(jDs2-OZSO-zmNd$LqC0%-OqwgxAVidN3xihwmMK3cFZR3uJ#EY#{PpY@Q@1q zRJxVduY^lKhXgzzueaJwl$>zc*Lq)g!cv?{lGh`dh=$MDU^ zyOh7$nv7I<{NrwD9c@5DhM|NcD1x?~AJm)%@wHQ1YdmzWP81bwA&%k^?^hdv=|({T zKK<$WhjzUss`*dE?Ao)na?^=J4VpD6pi5&FS)$a}ew#g?Dt!AI?nGHWBbp-w>)tO{ z%9%5lke6cq;T8`K$M;ZQTW|i`M}r{MGao+VS8QS=ehtj1OwoHwGp{-ydsBdZiHl=Z zfi!T_42HFFfwe@#C5}Jh&F74CTFRhw%u0kFvd$_Muc^&$#7Qn|-m!MQ(=2gnD~*cm zIBimSnO6!JJI=`@erxYRUsbxY^L4#Z%k<7=^t8?uMm@^i&EbF$UtMVfi?*~L5++N>-&^oR881jrM)|$VC6Q%U z$IyJxf-2Ez^DSMy-yOyMQqQfl}8)6&(^zrfp-=IsY~TZn&3x9Gml)1!h*Lpgd6R)iOGZYM9jmZh zXC8#cAH;~$`EyEi1U%vU6Wu(!p_tckUTyCulvn5`vNVH^nSZ;HPWyN@mE4E_BMkw( zS67AKjQ?A0!l@frPLcUA8S5=s;yIFLv!hA+lv65JY8V^3|KE@pRR2G}C3_TLDtiNw7l%fsZ3vC4Grxs`b|=)}MU)tw#C~e+v4fbn)=Xi8sHW zw=H~|{s7`wPwC17pjT86wP;(9W>^RR3h#XgU@2FzKQUKq#a6rVA-hVrftvr z8dveqhm$V7r&*7~6a|PfsX6Z+I>r}@L>qDw}9ni^Ya3#UAvniSJ_ z={;d0B7I6TY0RalQFQH}k1$Ehl;+|f;YUdL4BpbFVuL^}ATfl3U_x7U7_)Y)nPeE} z^tWSr=U@IQKH9pQmQY?G{{jQo)VKU9-Z9XTQuBC~Izxr+0=>AwIbSPTXC1!z4ZFjg z{i-;0O{{r2cKmUupTD-42R?rW-TS4bp=%&S6L2qyKb_OPPrTJtqox{m3x=r@uN zqI#sCEKakxZs9>l>|GA8=PsL0&E*C0j;e|CxJL8{LH^94Z=EGYh@Yh#fJRC`l%V;PAKH{Jb zYL*HhJ&G6pYny5sK=RwGnq^H*<OA$95hJ z(l{BgNB1%n-yegT0ZBVLhXf|48}XRuw+Ac9KS$PVo8!^ow}YvRa=vRnI^$MwJ{;;T zSqIWRT7P*%_s3xCtGnpZbLZx^Y)K0bXj1IVB-pg@lcjt>()tlvAl}r!BozZ9ic-Jf zN2gTlI$zWsY1shGM^H@#I-tp_`L{yMLp=`f@`M2IgQMd~{7gP}ht*Sap8svR$DIGW za%Y~^8j9q=sfBsMDm=f@)4^=zcd+%cH!-UkQIIFu2y6K_sQf9#0`vWqMA9*5mV@zX zs}#r0mr7So-;~#D#o%U*_27MLy~Vhf(X@$_vmy8Q`H!CBFw=c&jJofa%f;=^Z&QHU zQC{VOo)}9%-*<#loYDMI2Y7=?f4;z)9VrO7f4-gKD^l&uJt*)iZQ0pwuVM2+YVLOU zksQ0WBpd}ibX$DyQSk*tA_(#{sRr3W1Fb4Te3xifID78?fm*9HK(w4V$E)bl0O@D5^#&3^j?Vf8XY>y=aa= zU-?oQq#Vm?V!49<>gJ1c??%@8?>f8R3T2!o1l zg=4pR%11wWgw5#4gQR_MMsZ4Da=sw=ARXlv(NoCB3-_^x9lBnw3jSn_NoVEsYw#{uesd@+EwI&EvX7J+!zQBXML z`9n-ldZ2t=iz9HvL6q!K4;r7kD_y#rvD-a7J5=g0yc&$uUi4tLahm-Z{U!7IKEhzvld6P`MR>#lV>MmC-}jG z|C975f!#LX5r?hcc;)hf2+GtK`yZH`?VlQY&&h|p1+K$?dh#u2cJ6wJYYAu?D>5LK zyoA)q%5!yv+lKAT9aD^eeQ3mICWTYqTs?#C%}(|>1}FzI9F^g>;Uj`I!sOf=4S>&o zN8QwSp+b3e9ya3=kF{Y{{h;8%Y=7WfbETiA-hCvkU-G&NvT$Pl^=fyFy+=4XOByx3%0ler5{Au#0pL`dvgcv^jfKRzlTBX^FK_s zvz)vlFO;9Rn87S${RT~8R}^ZJR&3HwQM4ir4TwxMw~hukZUH)_MLs~0$%tJzLY~0M zZO?`uA#-W4_4?nne{rb>eNfvo{USL~{C0`Ywpvek`|lz`W0;+(2dhx^YF9 zi-zDud{BJX4>X^p(4lGgeBx}==ue(`S0(S0b!B270J#EvW8-b0DLDJ&(CV^_cl_FX z&aU9yqk$&L%q<*$L1}64sgZho+ zk^*+v{Ro~Im_1W^F)?Amoc@P0F%+W6TMWt_^H~=67o9g}C@Hw;zN&~NaoF!@`{F3W z2c~+>)Gp(VY|NMVJf_PPh6@_mO8#j86aNq{hL=A^Op60kkAaVW3rm906y(EDJ+AiD zvSFnGS5=XMS>hm8#z8*BfnYiF!|pG{AggyjM~Ndf>nQ&8RE-F(0SFePjZB?^BMKpD z(W{qfxLH*3ikN-<4ly6&Lw>?xMC79kTR1TR=DnuNAp`v%Z%V$z7q7_vadH3HF`hBS zb(dOF+2Of62P)El(TL9B&d}x*im}Pa=huaBh=qM7t;UY#RJ)YN4afVk1+DRG| zr>xx|e!Cm~l)-TSf{42GX{upx()rbH`4$EPqz+J-#hX4P<`f_Zamx12bMfDDlvspRjrpB!Vq6# z4{~G>h;wH$uYzK-%I*>Cm>K?*PP9tXAED7z)(* zg{sYuJ7n-!?Kt=31Ae8sBj$HV56U7xW^9fA`emBk`+qF?pB_9FNrm0gK{#WXpkR?( zcT=N}l%a{9VK`xKpu*IhUGL@$ht98^lBS@$MxxH{9yrJ(Fl&n9;pZhwGuJsa*Vm$6 zve#p1NqnfYRZ`N8rl%Ninx&T{m5A-Bccs|wLa3+=``trR=IjOzIo zAH&egqjow0|KZzT4HEah?ejSVU9pjvpWh+K82#=W zeN4I_Hs!H{D&QcLN3WQ6K4N~e1vxS}oVL&tpL|Eu%_H!BI+(G+IHIfT7N1~E;^l#Y zcxR3fn5WU7H+h)A>BNV*yCP-TqrA-866RL6M>}MK!UB7DSS4tpR)G&66nd92Rlj+8 zgR7~jy}n%67@_u?5o=K8V8@K=IulCTr!=UhtsSN@c=b|Dm$2@Hl-Rl{6h!zdOt(7K<1 zDiEbsE;y3G>%Y2+U`@1{c$BcfGdJ6BJ5wDzjw8AaDH*g|kX*c zxbh7G(t*-0=*_>Eq)n90hssNh(r$}Clk7ZNQ%@LQBlU5Y(h%v$lDlXf5#n9nNt(T`ren^sJuL<__GC6K}K=!F(LBmo8?4c}G%5jR6h`}qfUT<3N5 z^2dH~xAdFD+x&N%pswxBqt=q@%lis0fT)Yk6v&&FzI9a?A#z|dS0MW^$P3z>Byd|( zIf*jE|AIw{S~w3~NM=8j=BY7g?LsEYn>#%#Fm{ zYxJK)pUJBRZ%zF|2xO{9#|{YVz8z(Svh|EzY#!3m`yA%u6MoT3SS;n*n0ITj6$+iu z#B{hrssqUUTNyjAb0V5NVa%-ndY#v6-VBe8mQ3cW#V^gIt-Tj_gvh=k&j5&a|3h$sch zQMAO@r=W1Xf4K@KO2%br*maQBdlq-G|IGblgs(s~lPi zH{y_@asJLS@BY$?5>iSpwTJX7w;jj6)w<_8R0S>U# z)_P4uGJAVnz`O)~L7-AmvUm!1M1gj{siP%Q$-TF(C^zC;c182mUvWL!(CW+XqFOiX zGY8a`gsJAmc|>Z?eO@(XhIU^$Qe_Z;eB(#bB#lHZu=wh(u%a4x6?>;`k;iQH;sS)d+dqlP*3ZoGcRW! zEIs=L*j~*g&(1=`q>D2QqZMoEYw!!3(?|^}ZDdRIZTH~!%jqApVVBg7?FwUrFU`ZC z+IUQFog^n+Xf(k=FO3Mok`mR{TtNz|>w7wxz?z?R?B7Wc!rKrft&0e*E)!}zq`h%Y z$6h{!X-b|b-DhIn#!;T1Cv=2e4qP&SAIwh}q9I6>i}e<${pj}J*UOb(`#O>oO;QKl z2Y~NuZqd?V8XYo$S9jxb4#72#r-bVo5YRio7JGXmh$m-d0}+@F_zb1YxDHB4(x;VB zel0^4ekDidV|?uU4nb+~G!yd~a(HdgMf#W#OYoi0r0ZG0*~Lkpx8-=-G5Uuh34LO; z`qL)Hsgp`jA%*B?AzXPsNg1Rzx@xoRm7e0e zDzqkX`Yj+kthAC@k7h}a++YxsAHT~;A^Xb;3j4i?;-%(G;G0G-QKBPBLj}pcJ5AVd@T*shy?h`(aZ_jJ_W5Lg>@msU8uhP=Oly-y7|2lGAAUn^t z1nj3IvHjGbi1LaJE_b%klvR1@DV7%Bf0$?bqzWeSh@v9is}Y}Tp4QDuc*&E@a!TSm zJk-X8eZlLgiqqo1JF}Z-8a}(CWrn?$vICedNpmM3#bk^&&{!4c;9MS@bp&la&o%Zi z*9BdN7X9#_y>{f;xpCcX&(M7hB+8bCXqLx5+NjG>2=#DoUog>s%2ZthvvT&LgNf$n zW>;uaC04#8?F|rEjMp&!nZVpWKH3XjV zYAas{r6^4J1QHT=yp+|! z!nRmGd28C9YzUu-1o%F_n^{7x1sG!!!YG0hh0flvpHRHDX8E=A20H~f>j5KfJ|M5$ zKI=OFqwD4EQ!tnJQP5)#?Zx}-P1yA%zh6a_=eOt~m*a9f8A&H@NEU`kX_=sc_jrk8_IF)`rPWzH7`>)fw>t8vHYx}SvAqpj=b z=(LLDB+i5cAC57c_ME%IHat$Ib|=H_;A z#xs5rb;rrnQI)Z9A>>bOlNbuWO5Yvzh;#X7E%65VtOEX6pT^12Po|=2Y*$N}Lo-3# z+D^enm#g0`r#n@K;qgRykaNmZuKugL7+G z$-kCpir29|nqxESu#_ta2iAsols!+dhX$*ZpGYGA!JDYuwvLT~Q|KIw0)>&|mA47@ zfd5JB1T+DF(>IGVX}(Wp>kl!I=h4Nln{x?;?4{EbO=zR1{j|bH@3dR2yN!dQw2W#@(X5C6|2;@Sw!0PL$>3) z7K8Pt=Z1T>w@N(x1dpS(dl!!Fd(Xo!bJl_KAP>VB&}7L;&&=PFQjt31q|Z_l*81$| zgQRL-eLz;0@AKB~M;N^{qKxS9ek~WD9OGjdum8sbpNmfp2d1&t?Xg~(NL66iV$@dp zCP!HJvC=gqhH*lq>58w|XzFbKfoyA!AF)^5-!SxYWsh%hRuz|mNC_r$Y2j7t>I z*4BoKiVkn!lf7@;;Kzi$LADL2Al7t@p6sdw1PthURg+sjexOmv{}%INg_jUVf--n< zYZ)9Wl3pr5b%Y|wFN%|+ArQ0hIW82RnaU{^=*knz3kKYg{Lwj=6uwC*<1TTcK>b>A{a0~~92d55d1h-|LC4}9j7kq} ztq_|QfBU@dLhe5vF~}ASX2Fp>B8z{pwsUzr*F;p;ix%-UpB$iF77_u#w6&p^W4)V7 zwO)P!Ow}tr*h7qG=pIEuC~^)>VZW8^IjNF=;lYdAzon^!FcsDxP9G zkm#8C{^*1D`Ov*AhdUFWh8hAKv1Z38!X4_SAhD=zTdC&%Qj3Z44;61{f~OY=;B~3% zw~fX95w78Kk~?LlH$}3Wzs*GK1>XSdRIUjemtm z?Y(Q?2*1c{#B3zt@4_Kh45iGGy!x_f%Xb@F7c3{+WGcz`$()8H-LC~5i-T3VsfLdp z{qt(dxngdpw9ci=)+@ussuz%R$NyO4c&Qo~4A)&Z0Mm`VRbp#oh4|P8sZmu#u3RwYYp~WexkpUY_v0u^7<_JPH(2rb z#}Ddb$mYB!ze;lQ=J_$OA-Wul2cnQaBiOjVZ#&=pZ=k@a!2j$sEiElg-AhY=9Lh=; zo0WZy@mikGbL>K3B&=Wl&7F~z9-HSUBL7Q{NGQUNu6xLF7wbs>KaTf5|N6b=^PWzC!%jrTrBF3@Uqv;M`@MZ{QTWY?&bau zF+iGq*~H}Xw=g1(^Ok*T?b|EJUHL0T`3#St9xXT;}5Z9KzcepX6uj)wMV*{HIDqs~jb#@zV%)bCxkZ^GC@2!R(cc@sDyoEdP zwejS7pdOB6CjeNte+qgKJUq?rn$~sRPfk|da%TP32_1Kg!@d1HwxPA4Av50m`{X$B zPc^WQVP47(%n&^mgcK+E^AmidK!ZFZ37IHTubJ~O?73aa0Vy5_q&}e;rR)#cFqIZg zQKTU-?IeAM9f5g%ds=qQ7)#H=s;S;1a%BA|3SN9tKyE4-ouIg?YLR`Oc|gTx+Bg;` zMzJGxu|9ee;b`G#yHNA%#OH3XGhcCXelf^}tImk#Y~ZsC6bkIyEr!cF2%YWvHLoK< zknk5C^56)ah&u2D-`5 z17rxW8;jqH&#RjO#gQh+BY#-Iyny8^c z5WXOZ<%?onbmH~x4g(A3R*HxVh(18iz&Az~G;NMU`*sU29C=9}>4vhv`)13+n2{myv~aRG6Q4#nO`hn8AwUPrY&) z6~Hj2PDUrOEfuI+eL%vhdu00cl z!!QSLlCULDQ(_l4CS=Ci-SwONaN{8Dz2%V?1FCeXU6 ziYZTuJ;-a^L&WLj+fySYbZ(MIzlu+EDnbLTqL5{GyH$P)E=tUtBDMNs7MMcL{m2PS zZztRHh=(+5?Ntjb$G@12c<7Bw;;n~^u`oSP-FX={;{CcXPEdG7aL*XLXrf*!BB|n( zdz>$x4ryYdZs=o6^CzGyY=)dRCj^?;YUhv&{cy45vtBxL(>Z&B!MONfjh7q1S?=p{ zMbR1&fU&Vqwh4o15_(_+D1w559jl{%qS;^ajK~)k26g6}u~#<%f>uY{dBG1UEa+Gtm`6 z4EMuheUH75^ZW`9g8Y!lp_3LIkOx+jYK450%)5+-Q`AwkeQ^)=UCg^Mg-LIQU?=qm z@Rk6M{3-9&K_nXL&2%lLG)-Crr_G~3Z#zeap(=xo!PP*7ti#d2nr{dcS<6;5XZ}2t zukz=SGES+p2pKq{M=K{t`R*r#G*dPA3jAC{}W)nuI}-xRYZ=w zb8%=?k8>OPOQ*>Zl(qWoiPPd@BivP?89`Z3pjF$WD=v)7pX@1({SIL4(zBieG=^%y z*}V~*+Jz(e$`rp?u%`TCTHj{5pI%2Y$iOInWbLe#$9jc;L|STD6Mp*txb5U!dCh~t zXWyeJ?u<7tR>9bj#p6xLro)}SUhYoFevZRL#~B{(s6+Q?do0l~rapw(-fU3Y*K-Jy zLf@owwz_1#i=<1x!|@V7;4QQ2b&f9y)*(AMpy1<~h*!{mEDgaQL@(0-#t|l;gLJA? zzz~(CI^7D5&d~w9tE;ubix*5FZp{i{{sNaBHP$F*YtJq5{Zqw>v7!%A$vsYbs}svE zy}tA`DeCz_zs#(HfnEdy)gVlm|BZ?((#}WBUl!ONqBdR4Pu?z`(CYm%v^VJjvFaJP+>gD#Y z=Utj1`i*p7M@gmyO!^KtHmpF%jMT6%aBLbcFyG(sz7Fwzg38LUo@Wk#F*J0R{T1jn z+1iPQ6U)x|rBKHDxt>GLRaVoz_W7NtGJ|wYm_2Jk-L%^im2Sc5`fB@+(M=LIW-&8e%pU{@bkqAglO81&w-*9Tfm#eN#GykkpLwz zX`9Zku@c;#QBo3Uuc_ECV#WzpdV46|(pxJHz{Xo=W#z1Yggo)6murf9F+lBM{rf{%Tsva3q?rv?zNtq-P?MIYbc^~J+uWRF}9 zPI;!YOk!UuXA_8t+{Cd+x@Ujs8r{EfHYSJfbE?`DcM?}`;gJ5m;+lgaHO*Fy#&!Zm zI4%xnKE}-1<v_JrW2=8avBmEJd4{MStRE%n{zI_*msjKx*=N&|;-;B}!nIwHm$w^1L5h3!D#6=m zj*XeZ6=KHfP~UxG@}@gtYir~#Io41yPP8l4HOZZqFXwfzpjc%w9HY3kBhb8511{)=L{&U*Y!q=Jx1>Xej5ls8k_6kV zXnhXc#~0Ke#+D(6smO*)*$BT}@KFt(bR>=_Bhw9-4q0ebAwcKTgNr(0biZEcXe|NfclKKGAYM){B{Sl8>M8QE}E8vH7OO^4~ z)6*BO0#Fpfr^DRr86s@)e?-#H^StCM`s9%d9>+H$x zWxW#*1Lr^6mFO||`K$owPR8`g&7EPq+u!+#7^0j_*Z$xOa>w?Jbxbse3W{+Nw7Fvd zj7{I7>f3oL{z4@o8=P?YO1B9y9QXih_pGA$KNYl~6oUV&R6d%EtK>#w(p8UTtj0|3 zh9)!lL+a`Fh3`jZ=8}zfbS{-4d^VEHvH4AZHx!)$Vrl*R;;1?G_Q0gQZ*8#NTp}wC zTDo|kmx~H8C2qe({B7LURhGta@w@TuSoE#gY655fwu7WTQn3_ZECEOGejj1AjeAI% zh0W`6L+r9%Rqjs;6Y4rZt)Cj>Q(v;Ox7T$GTGd*Mr1GjtQM0h*6lueFn6MKtE@kS9 zX^kT@^Bi*7%4oQH5(n62EHd+Ai0z1TlbsjoT4{K0$JK!0{l(M^^0%(qQdoVjDdr8C zW2>6D+{MY!qU?!TRUcQv2m*xpGVPO^eA4}bdzZ_fzjH&@QZ>}q!i&<)+7v?8#}8gi zj*QUhGkb{Lv*AoNcvzI7uPnnKe71zUi3kc}s=TJ?&t%$j7+w=Vw|usUM- zR15I^i~Rl0vq4LHAcF6liuB=M+NYCeP|Nd!7`roRG$#w&6JCkgUhR^X+|J$K5s*m5 zU|%XM-{m7o?0cm6i^@jyrN>uXR0Q9kQmgRc#QwMEXCn<`1q1Ot4oGgeXmalsh_#dO zIBAXwzM=kmwvf9GwHRm?P7E~3j1S9Q%P;2R81Z`86%AT>ovAJ$eH`&+-}QAFgyRNWKO~L zP@yD--cwhu1V#&JVpWk*Zmb??NkJ3SYeA`=k2c%oZICb%)}3e64<#tNqs=&VM+%37 z!3}ridZks1EWQalr$9&hg_>-luq}xR0Iyb7#}8wplNJd_tu4eg$>#I*XR?-pY8xN5 zpkTZfaPhfZSMrwE?U2FmBOR}+jklNeBk=j;MnRo_fYtWLZ-4C#U^Wx1%P^e=e(@e2|gARpH@BX`|Du` z>yZMWp{J@sPIqJiQRid%6h?gV#t z_u?Ad<>vXmJMYYW|7IqWOyrzBdv^C!CGPc`2?mcSlyZ+s0c=_FlBE8`b!~+SxtcxO z03%mo&rOW0>a0;y&z*f_2`o1%jbe_LHbViq&o%ihO9Zb)+>+kY&W?*}>rJx=Z3{Of zuVQU-C%313*C*)j_*Z6Qz9;^n_UM6p2F@>h<=?J7_EXR2ky%b}?y6_Ya;J+;UN1jI zm_1gb@tPnUk?sE>cOSW~Kxjr=FGgyTtTj?|xmx@_x7_=mBPkPg6$UwS zLls0YiqF6A^e_XOmBnJ=6!QhyzT?`(kjJvJx;)ZmZreCpy8>d!rHVnncA&qoP+GHJl9g<^m}dBwWlaE1Aj(^l5o}ptq}NM;@tE z$y5M6?~jLud8?`fqqg6wIBa1>FPG(CxzHD?!;wZEg=a0o*sjBy3g;H40SJ-NIjPE` zjsr!3rJ`*oN~?A8!AqoHImF6ZX^_(MNA|n&voVyWIfDJ4ukHUw!v}Fn+Sh+O%eUYg zLP-4l{I?Gd7Q?GB4bC3>*rBR46wfZS|Qv2_Fip)(aJ05P8?1FFaUahy69$`|dD=3ZC zP6tSQsySYhrf0pQx`;6=Jv@Q*hp(rG!vF_gzVIrxWg?-5up46(5jk^2#Kj4(fx%v) zyR`}E!j0m?|NbcDWD2JxAjdI3yxey?F5KL4_Jw`yI&M#b3Fv>R)LmUn=44zx4C4w@ zWsCZUKLZqMc)y`Vg0JBOp!8He{hk`ydgKaX+{ZSvKS#GB6*1rL)-F-qI4XL=P3QX& zAD&mg2nW3A09E{V?C~5)BBh-<3Q$lNUv<@oC`rKR^PX`R^@c5rCjP-JNg}%Ec_B47 zYyK~7#8xxfQL+Gn+vciSh-Pnr%KdJ(d_QH6m9CFiH4+dMmX=|;kQjWNZ*jSJGa z^Q=L%KoWVMk?%teCi4e$yPN*ui^{iu-?aR9m<*t2lh_btCL8)Gf(%f;zN6E3-hY_P z7IkD9O`#w+Q~XIb_q*~DXBQ{pWtM$M2mS3f`(^IC&@~Dl=9siB_f!&rM-y|f;U)~cJ}~!1FlT+AGY#Sn46z2<06MKQoY)qF>W7H7NTpw zy1IeC$6sM?EnpT@Q}@f6U*ELP9 z(KtH781XHT?0Zs(N$h0EYGxU+jCtS8kv=XWvMC9K4Zum!tA4Mpso|imZQdFb{2V5! zLXULq5Q&0QeP zK79V$q5ycb;}e*=i4M>$MO-&he;Tk_jvY#OT0JA-;|P9m_En$3lNW8OJ8 zm@h0WV13=q@-(Snx^_F7n5e&WZLhof4FE%Pt@;N~Qj$d!H?^$op4!QNUv1>AIZ9JU z3+hGAyNZy2O~`oB>>D9n>6u+BdzEUXc~+JKS2lTugooba_uPzy_{1^zdW~(MI>Z;S zp=t4~pMQt0p_eXe&cb&AW7uUwBHP84Dc*{&O~jaDWBe}gb<2`KRRp#h!`MGGqf>NC z9fr?Xqhp@V-Q*4VEPrRl?vEW7Q?t=JQF$Yl8Li@4r&Fm!3QsI>(HbX`V%I0l#7g5O zEowPF`VMCHe$q*q>+MDjN=t3BrSMWkgP2%b1ZQ!mI@iP%1Gdj1&5@H8;9~UXmH={e zR-5Z4Rf~EyxTM{zHlEe9LfzxN@E8`j9rY9r+UK$7fkSR|<`$Qb^=ntL#B1N~5`a(< zK%4(Acf-GZecR++yPC@YVvI5ytv3}-Mw)5`UfVv*&F_2%8t-2p{E2p9@v|<;=H8{T zw|P04y+uO)&0K`%A z183yqES2)0g&+}QRsV=EZV`;5r4k~!6y9;aMX%=&o>?M0xgzkzWdVGuRmoqDoK)L^ z={Jz=fXQqiX8I$ODdV%#6TpU&^q8&pf8{{jh*MNI+^D~R9tX=dWC1>CL@9` zUF%UyWhcf%#1#7|*GKt9ka#))8|nHQr;$1ZV0S^QpwDu{DvE>=C9R}{MlJcW{U^V> z6<$uWFkZ?Lf(FS&l9rur&(FvDL<}29AQUwaD&Q+b{!4@tN7 zk5&q4N;Os_?GIpca@nP8-SWWFp$J{GUlkE@5fMHNfC;C%*9YNz6px})4-A!6008fI z=EDxXneS>gw122+u$O~MN?ab0AZuRe<=_7P0;O5~!6G8HnHpR4(76${^CbWx%1*f- zWs_awkVT5C(k+#a3t5I(WeTrw)`lS5YILk8J`nT4;fgYl`AUfxAdG&*);Y3xpLSxp%WG2!X7hG+6z*<2>1jAG_ z<|ZgvNGoK1@Ug1PB|j@tR#S%_*5IrZJa#e|k+!ji!g91;XW#yd#q$oCMnrGw!*cPI zI0e6b8~H^o_((nn2IkGhea`bZGZ}^FbO~ZXlOOFJhk=TFXRfWHG-T3Op*yK(&6p|gfEplO0++Fh}kL1K)-pMf5ui=O9rON`wdVhvb7ds z;k?^8)dK7l3mzGN$ll(b8*EEd-91-=%Oyt={P$w3RysuC5-kA<5U|*^HXm<|0{Vy$ z5Jif{58>fg+2#v9zgdSqF(Xn)N0Wlm>K08mrwa*b6UD7K9Pg3#&auM!Ix38_BDL&U z{|(|J1Z0S)~);nVPn?%?_ zCaMI7bD9JqJQ#Z(aLIMievi%41^Z(X=a=g`T$I=_%!i9+PuU0V`ybHLUBjCK>1_wt zo%^|Q|Lrl37)JdF&x=FUme@@!ri@q;}(#PNwsQ!kPs;$&|Bm2?s=NI{o(I`WGhAq&)o$Q zd3XYita(qL}F#w$e*9eAfCk5*TB|0b!v3GW31`=o~ z&xOK5+G`%qX@0^i|dViLQID%@RN;Sp(jYyhQBBH zb*n7D^)NO3vCGQ{DUvK4yO+*vVoj=~)eX`qje&qU1MbTE@(}@@CbjR@kvqa zLz*BD*&}g#H|a**VE@UNsCcAQWdO}|;TC!N}-vn_9IA<}XlEOzKu$F$SxpZJSF0)tDe#Qg*WHXc9By0{Wtoy5Rk_)(# zb8*26hQ(#~TN8Fz;e-p|O;m|3Q1}|7OAtL4nc>oSg8CAmY8zA&;1MXh}mlZ3oa~5(Ss`tAAo*C1FvPkHN z+&FN3Eh0QzmYX--re}0fYbo;>!FQHue@w?a+-$6NonK2c=GbmV=@yrJqcx5x3e>f@ zH_DTr^m8jo7)D6J_}^laGTGHk^zZvP7q5UXJ*PtnxY?#t(e62sI)GN`sWJbVvGv5! z)GTsDRbI8H^q}@BBdv?5(VoOJK6OJ0!RB|udkT^6en-^!!#~Bm*31M7#WPb|!@arp zxj#B|nge+DV@7|JF9mNb7vKpDY;*(_z!1B@qxZye>9g}MA-1YcEnuP>nRv-U!sjj( zt4}oGoruoHqE=+rRz)fNB{Rd^?0pgK+6wNw#Eb4-`ubzLyTJyuY8^rybf`l!t&iq& zH9p%&VX;0APNj15k358@c5pSHdsUzCMz!R#eeqNw2E8vqLDjq&xf%?#YC?Adp?e^g zzgrk(kXrEK*5%oAbAvg|Q+TV#kS}6@^abqR@<1{-a0?+j@PXv*anxSeUkBtncUK0{ z+EMQ{=l%}q0aw@nOG{M`OZ{#sQ6iDZLyApCFWraQ)WX{)0|vwtc_~Gw;A`Vp3`z~Q zD7Ngj`4;wXTu#~$KC6;k+%*MmHT|}3Rx}vkPC)_|5BSB5G#i(Ud{mya66a95hWw^}?b^5vpA7~^{a#^O>h#B!W#*6D*QU5Q z*%aH_s}sy0(0OhHwaTep9y`B>b!t;|*LR%9%j>+QQdlDv_i-$x1K{JxHS;Tr@Kwu4 z6YgiRZtl!cu?$z!D2Twh1y>F33SC25bS`&ZEa!>FI{MdyO($h8R?pv)$aEqI12Iiu zdS`AkJIPT>2`i6is-K2*4O(=9_2V{nahy->t~0C#IF|;c@f6I?w|J+&=@U z#rmsZuYd3X4(=a^$DD)1vH%H;p{*=QM14&QzkA_N?r-*UV{mg>OX0(>uz?X)OLF4G zRW=2at1<4{OlsQtA+2=W7`}e+Ep89`cD3iWZ5_$%Y#jUo4is*#JwkuK^g4@B{7D+c687g&`7Yd3ZXDR#ZyP)1&-|Yw zX<-@t$R6_#B^w1iA9?O$Kh2s>+JbV|E1x(6NEk@GklhR-fCS2{{|=Z6yxxK@N;A2k zXvcu(iMx2q@#GiaQcOL0XGNW^Xg_?x60;Y&8nKT_FYWCYu}|3FyD{XRCHidZP3s1E z$Aumpo~&lkwWk_4CK4$4CvLG@F)*Kw2z-u16!-_`7fqIEuvvk1ncfF8{!c zL#gpLxY1tLEYyU3zl?INuE!V;e5OOef9hV2U9oR^ZAKx^B5zND^e2Ob4H!!LqXrPx z);YH@aiP*IUrIMO)(L2wkv%js+Mhx@&Ox>@N59GEy%&LvemKn~cBrQe3@TaSfT8mG zo)pO7QTbZ);=-~quWh!t>$0Q)nlv&h#FHvLj}bs*oSyT*MtuVIt|-7xp03k7c!x8g zBGN>JQkuibOBPj2T^*N~FbRk0`kzwa);zaSidqYm9lr=`f$N zFz=V)QJ0VnY;V01*f4KK1gJ2M#EJYnSci(N*SqgFx~Ke)ek(JZ=|aM$GFkWo@2F8w za&|V~)#G~3XtpH~IS-yVezxW25X;I;zc@dihs%tt?ZvhAp^fJ z3`z|;Y|-ET{X$%J9}~uznVE!aCu-cZG%BQ78@>EgEia=X0Zq^o*uVmwkedbv(fs1Y z9k_4>T{T(s%Dh^ptJg*@b@Z}ZuM@v;mtj5?G)^jh_d@$8e6}r)Ze&AIK&1aXz2plK zNOy9SC~8Z;G6$vV_5<&#e3#bQ(C(PCmbpa98mkM!ov$cKTfTv=Sbkv_@zoc{M_OMV zzH{&FPjFn+x9D%bo zF#+ccK{ai}?L(40hH{SX65yHTEig{S#7$Ow_2Vb|RYt_V8E>8VZH(l20299~ zde_1TflVtXMP!EqVtDL5?-dQSl7j4#L$68)b6LV{7}tN&24=-OQ$etQB`A7rJHMAB zWcYah8h;~Wo%z;Mx;sZl*rcMM5WQITZ2~h-g`hkrMUQ+C=9xBcblo_UyL>B$%X8v|q!{ z{+t_7yZ`&s z9>xcolRHUuH}sa&^b8MmPQl8ryVIn7Z8e;Ar&2E^TkwriKMin$bU{DW-M9&8hK!St zAhw{XdM&6E?bcYCjzhHP&-LEVvy}d@vG-0(W)3M!oE)L`EL@^cv)Tt@~<#8yi0Z zx@hrV0QY`Qdl*5oF9$=v)J1y>+nu9&d2+n&w@1Xd!MCy#e$fudJ+hHWdX2l>R{VHD z8fvrK8N=HxMGXBq7lKh1cYd&Do@~!#yr{PrPanzmE6y;p6 zTNO2=x!wCjjun4Rl|2Qn4w=9&P#qe=_)wY^tgPwa_z6E3%g*yhws?jqxf&ULO6-Qslo!vWv{RFmG{PtMo!0 zC>uqmH+;^5KD1k`um5N!p-yw|@J8N^YL$LT@-s$e(be_*2Lun?^`!3`T6`{X+j*ki z9DsFN^0F7Js{<@WX0!7$O?thbR`Okfb;K$nW9*9Q!A<@2m=DN)BJ1Jq-R}S+n(Q^4 zK*npr-zz?f8!IC69{uVm($HEMH z{yOB|_RqU~dh+F(;#N07hKU1PyAAqFJV(%7L8>#$Sc+bunW7;VE6WvVR4#-7ts0Y9 z*JxLeZmjbHrD64*vKy5V{bh$Q|9DfmWQ_xM;syi9k+Ue8qKXrGmVdFg&I{PUN z-FC>Q0$}3oFw8?~h=>J*LPCw?9pIlMlpM;Qgt7^CsRvgT9(;7DwWw^5y)=2D97eM= zBQ5r>9g$~|C}I2GkIuxC=4J{XlDI#7tAVeMZy5^Ii+QDiwTYL)NTj4JWPc>>Y=w>K z^RJs)a2Y`PM8*L)${Y z`HVJD0S6C!DEoNg_D>LzO>H^C(u=VDo|QPA&8)SPsb0f}&PSW1T&JScC$e+h5Tqto z2R}U-w4r4=*ytA}?e+8_IXlY*w3Wyrf*QaQd zf%mm2_Wy=~0YO$vxjjtw%vKX=K}yzk6a~NTyc0sm6seN1XQMSi*g}kIn||(K0hSbnT4RVJUdBSvl$)M^E+1@OxgP z+)XHj)iJOK9j*5x2esqIF9X<%Ag!S*zug=Pz3e%F5?}AHZY8VcMCBEUVn6j`PG7xX zVu2}(G3Zs9xj>go3`|x@*Ka^7Ej!B!lj+H(ZR$^K?kI1dFK`utucT%A)k=#EL zN!4 zV_wk&Fqt99qb}FWY$ZArZ~#O*8j<9t^V~a1Quvu8T}IQ(hH_*WB7x=C@1OoX&c`9L zmEdt6&NSvf^%by&K$VN=neB+%;)b|oP3Z#SD7ElD&a@TaNI+brsW(Cf@YPTM!Z-Bx z-YiaYOuq%*o^G(`$rtmO(Fa|k5w6xzW44zv-X}#g0uMmv2oerqxIw@XK7x@h^_!BTabE%MHnbYx0WTzhV zx zXlYNmv`JkAm#(qY7sn<0_GIpqv5`)F}aJE8{ZUW>Xe8eQ@yj$ZTS%Ilr@F6j@ zS)Nbhi7_v~Uy$0rtskvp)$ekq3n8$1Dv1R)K?${M1_(VDY+jVTJB&M@dwoaY=xrw zFlmM#{veKZN2`~*)Yh=8-U*aw1!K~Flo=8g1r4MEuT~M*kl4qimHReENcdl~f(djs z&q?PHeeDAKLlo<-xs5O2?FxB2HTh`Lc_Q=Ky5 z%xb9K`{R&}axYsX@nZ`=D{ry@C4Sg`F+*!i-slSZuVZoVY^6ky&3FED?e>!<=AlVB z+#=zj=!X!iw_0LpZpv_xag4FmHLjaqD+KZm-RXy63_kUc3_TllqZSag1DG4v9?>U% z;?oR_5Odb{x|QN*Q`NbgIdYYGp}kh7KZ09I#1K#UMG~e&9VpFT+rzlO?BZa*%oJ^% z#xS0~97A3Eq#7A8OOIQ7*6?iXOX@m4e8$WzFIWGKVxFjj;bq2`fBXdgeTBGrd1M&C zY3F<$^1UYJd6w&HL~VcPfV%Thh74g7>RWIEef@}{e3uhKEIm^3G<3W_o6QA11NA#7 ze(hA4&?Jf+S5BlT$C{%+lauidBVr9w5lBs(F0R5<}Bo2C;SVLIxPzt8HWatBb==#i(yF;Zq9S+Ddqz;rvRwkcqzL@cZQSg zeotmEKeZ%6>YFV;m%Kmn^7gfMzt!Xwj?L+@32K`>$Jf2>XNC117ssdnEti z;0gN#>63(0^`#w;7qGN$F#3y>8NY=8v4nA{;XCPz_DLD0CG@?~YU)N+>3~Uf-{maw zjcT127qX#b)>x+UzxzVEUWEugA%(YjZ;U@eHQZCqD9F+s-(2syneteG0`@BhF)T^(Wbq1x2o`e_ZA2AZ z2dZC^E@~PiDG^C7cUR#lAk=#N>}v)n zXw|0*8dxUD$C%$9AHF=>=w1^z;{*mN$J+QO@SiaslZ@23*JCFCef-E*_x03p*>~o7 zCeU)M!)j%rsIk?MbIRVt3#_>s29vdyn8YurYwvH~ z%Xp=EV9L)hkM3Ul9Wx1XH@PrE1kW1`jgij&mnlyNRJq@ny=@vfQ_~Yj5ZPO$$D|tT zS$AdBMMulY%DRfI|1@N9nLbrLtqe7(+H;}5ul^3Xd?)&H4RsIf2bf*JGU<=xOW}my zL`oSuGnG6s_q04atF^d(pw5!E@=5;H9yd5cGN~5m$oi-KCTVeE?-ANkmUaWGmgQV_ zq*)Q9k41PT!U9!fs82MbpBUJJUAc|8j|(9_w{=bUXT{ae2%wAT$}+wLg3krYM0>oUPTgcvS|R+@Cc?JZlN>O6DTd-ralpZ#uc z3k&!P#QYW@w7(4d1sV%#R1Nv-m74wa&ah~vx0mSy46EZ^)-5_tZ61bG_QjnSs1o)0 z4eI3#@h9kA*nkfKY<6e3bD30G3jL{mnW}56A!EiY@_`(R`LRkG(@_N~ln2Q=PDQIt zXa<~CcsGV9EbciuZ7TCNw7FRm^B#t_x9J>24taH>Dgi3i&bH1!MTjrn?XecRH34pa z#KnQs&dD}k>w*bZYzLC=olflt(vJi$;*WmEh@hQKxTW(hiEqqo3Q3%0H(>LsbD6A4 zfh!)dh1dvJ3cNcVk8@UEkbRsRfAk#39UC%YOPt|FyEu!S);r#FEQzzcq{h&0YCN>% zGWE8H1xQ_B>j+wrq~UiO+#|HlF69hh634V`e6^QtM>XeOXl$KrOT(OIjS=|Lo-t!@ zfVIR53_8lnE}ZKbXF`&2BD-Y;Z7h?Cc4SxQ`#=f+$K|2|&;vS$ zTDM!Xf64LtQ54c^YRSTBAQ#xgPc(jb_XMZRhUNn8-LXU~4EfKEjJtz2 zs_5ya-bV^t170kT}5wY1T&}6h(;q}Gbv~2rggmIl-DoXMe88-EnPWOvomm9l( z{HF|MT}Ss$SxrjQ$RfLv{F_{NZY*wY^Y3nBc+At8u$CjXwo;;RwU1paz^KdU z3ytWW%-B((aYdR|?zTDkL?IY4wmihm%|eojZw7-NzoG7wu!;1%*0U?(kiaPwE^ORZ zOd}I>B(Hb!X|x8ZEGFur{k%s{GK@G+hpbME!6HEfIy3J}dtp``kb{2hrijfV^DGrG zh$W)#j(JY(gstt)T9gf#=dW*hJ7+68NXmHandmJ&bU5N&f>6>9&P?4&z4;qEQk^0~)khb~0rQ1s5HxmC!+5fbg^a}iwDVCW$f zw*Z}|1}i!0;tIAaPoEFq+0+6)Qq=$TM{*BZKUy+?P#o=uA;(}C^{VE+Il{4yU;N;S z0WEFncAN^oaJ>Fw;@((~!X_q(Y7>4p1sJI<`BM5l8O^P?{_L&WF=65SjwgVp(TS%d za*Kt&$ZOu5!&Bi^Pv9cS$UDMmF)m&%b_!_)Lrg9hSRdFtuc=4N9Bwf7-0Q#QJ zyyD9|JTn^MpreFt*4`HU9go>zw0ZOW6{NX_8^0q~$!1_vcT1-8w#4>@sDBi8D>wfo z&G5OUdf=QqEj){l1?r8V{M3>UsShdfRr~QtN@|6TRzpBf2(v4FH14w1L4=bgi+S-coCeqP zAMI4Sdi;%Kcs8gGBbMk}5oJ1YW5cinr68*s`}jvyfe3x&ck#;++K+;1_Oh_$qUEm7 z{cQC5pHQq{t?j}E>GZ8B3eH=j7Uw}6Bhx6=j9I#1f zp{g+e_xAq%LpQ1$vO^EZbZ41!&R8cpl=7f)n7#!aPs%Ir+!A*}=_0HycB5BvW9diD z^A^0b(s~_9h)tKh6x`;5n>AT{ze;8%ZVk$vzm@6pL`*6UZp5K2=pq4i%;-uX}6g&}{f{g{D4 z0^G5A3_~L$1DSuV)!(m$zzi$F-604lj}+{=V*mVgpCaZVNgso*vOdqVgUv5egH$``#a(?j!Tun(UbXGl>f#AFwYk8L+1PH%h?U4mbOothIGtyPUaP9K4FZGhYhadYlBYf_L z8I4%@<57F?_R*ASBFI+U5%YeFzqa$0BYwlv#0TfkOIFxsm|KC5wtzPk{TKWiS6BJ- ztk9cX_GX(B<^mt!;O(ao5iSvIY#5&?-h()N@Yb3y{O{QLF4Lv&!nO_)M@1b|y2B-` zUw3k#19qpaq2c!VIgIs{7AmuXkGw#g< zQXGD@COg}TLo-6ksV8Y-RICZ`Bjr}`3FLiXucPBsWizGjR#TZPF23!ZL+>BT*jZj! zEX%~+s1kd!9`E^jW$RlLCJ=)V^fiQ?(j8^s4)6ouC)jWVBd;169%qEScxYiU)5-ND z^J{~lJ)h*yQ*3|4TS$DCY%3%yhAO0XTBwJlav~P#G%Nfqq;{%Fo6=x-pNRWw$frmY z9|%&P<*<)bJ2a0OSAf__7vqJQzPc`=-bdA zFB~Ep)!X85=+2e4R^pXwHX%DfB0vibTp~6j_&_P@j@53Dz*$$9u)&8B;4_N*7e5b7 zf0nsTgcC$q3->iLa_Df>0bWGg0d=rTr@-oV@W*Mu;iqkktk{+GBfT=r$lovE5(|r4 zIw2{@N~baDqp#0#%6PVE=<@eMb3&g&;xnOkb6FqfKIu@JmBlPS`jMsy>mUjVdp@nJ|r$}3KGMWYX19=-~_ z7<7=(fY9+zY0ImOU<{Q-?MvFj@>FFRmlebgTM6d^Q5^ma4)cYMm@y7uM$7qeKEJ~h z414qePqw%AK&jldn{c!7gnOp+fNxnE`ULiV*uRs$3Ub&ud`R|1Vgmf4utUiBXd=Wy zOE~H;{+;pP4mDQWO(L`%Nxz2CJl<=b;~tpL4y@~BIekADt(X`v=@0kR5pbp#W>)$U z2sKLP5?MdUexdrsJ(~_-^BwiJK3k(ox^j{ia-qD1BU0ij&=$i)h2CScK6W;E-HHF5 z7Mw~6uo2~KeB9lFr*VL_8mg4r6axk|XqD03oA}&^0%Xd3>UX zI_xuwxJr~#x%*7bFr_1=z=@XqHw`ZkM4Bu4V$f>!Fn{kWZMlbC|s_S4@gT$1EeXa|KQebA3d%&9AYTC$2E$L^0yc8f>kodMbdf z$pJCA;NIa%tGX983Tbc5>o3oC43IItdQ1s02LuigL;Sl{ZSFmPpeiaVmJ-B=|9Jq( zCoZ33ZSdx;WvG9Fu)1L%^pUOluFCUTPE$j0V8SS9l;`%rT8gTXIsM1Yn8TG2h?-|W z|KVSmVGfeYK=W6- z=%&Z^H06T8a$AGhj3M0YitlFns%R z0d_fW$n_afwf|8Xk$F+Xkt~*;%>Wx#jfMhq)7p#x>m4mEu?j)$Ak+*5njT%V7P31m z#s&N8t4nY! zD;`rS2z}}a8o3mNS1g61n<65|2ek^e z3aPWmu%S86sc24kMU|xOnLF$V*H5$04Th^bQ@-}6r=@WuN_)bD=Ect4w{mgn)t1aL zQgx*rLm0($G&6&-_4bT3jZ+1o18D>Oa|8``Uzkw+dtSCIprAH~ikUcm{VXFb98Dod z)RvgHk`$H#6A{&`m5Txj)YGZ-&rj)=#7s|>(!a)F2DgP2)mfE5;u+?-F=DB5vKr85 z&>oXn{fo?;mw85^MTSd{P5R5Nj8&&RaD{6;_4Tb~>a~8th!9W)56Ss$YDv-ftL~C- zfj|)SXR|c}==+ZHyTCtgoqjlw8=g&RR_bUAx@0d6_lBP2laEEi5~Z!>mU|lRMjgYT zzjZ;8m+oY?D<62w>~mo|6ta>1F(OgsMJdLb{p4UJwB(2J_?S?6BeWc`a79OA1^xSc zrcQqPOpKTq`;0mC#Zj=~Bq!AM_b;}2+jMmMaFF?8y6aV35jcYz7o{mFa_Kt| z{Q!y)k<$!I=)G2cLpAEW{ALEnD9zOaFk%u!UlCmeda!`5t5w9IgFv z%NK8Gr2(08?%ZSfHQw;E!s+Gx-rT%ZCas+kTqtrORn9X?K2>T!uRNk6Te(j8o6qCb ze)p=8KYXtUE7+Q?1b`A#(TF`bPn29d2pbM`*Q(VChEjLy8`uIMlFK(49^M&X15eHz zK!MB;yKNU?BN1JXZ;Qk}Jee#bN&y10B~ggy8-$zi(k$w69%w0X*fGEpl8qieh*u@a z#sZ}pT}E6$nO~Y^;1%kUuzTRKsu`?Eo)h21pN=2nBFFw%D}1QBR{q~QhfJ<8hdV7G zlUIMP3u-jPW}Lpv%-Sj?Cr6k7vcijcq|+)JeX5~-J5{VYUTR1*Ni z(FkoJ%@4OdB|OW6%xTy0P{!FD{~B^Cw1UcGA7^VEWN~OImV?e`p^5{h9$~#^Q}Xef zN+Ke86z&W;+?jNEHs+h)tbC?FiD?rI@2|tW10N-v^{kIR%)ZdUvsH6ymFC^%x|-%F zbrX;zWrgq38}rZb&zo(r&bAGZQMob~CMx z;z-c`rm}lLG4Q>G>2EQ|F2|Oz!a>!S29QLr1=9h))f1PR#@;B|mEhPnOAk^qNMp*e z>~*IaIpvGzC^ua+Zc`!%EJ^i73%A87ePrXTZ1*2WAoYlmg+zU|&e^ftLy^|6>4#!u z^!h%tOSy#VA>P^cXe79S|5i`5e((qtok4V+!u@Y~+b-G}G91$;vc#Mei`kt6*C7Hf zGxnh+tcsK8Ncuk@%|kO#62WtZH()5;A4N4Is@ll{k9Hqj-xQ9i%5(|1$MIHo_W|KE z5YYDdy!hfTlxCxpJr~2Xzb3wXf1AW5O-sgLlNr1+v8?K;Uf1W~VaBMTLLMR)#_J8= zGdY|>bKA`fiyY>ai#=y*2%__RYJXiJ@#G;osVUCR+nXTn(^Hq5dLogSh@0WSN-Jl) zpm@Kxp363jun9}cj=7JIOpYKCgK;lXmJ&l0qn-U>4OGF{17*h22J#;=#IWm*U$Mw7 zlraGxuH8wAiQrUclup_>=xA&(Durz&UZ>SvXsr8R$V3tJ#Q}G*y}#Q!w{0JZ3-rF0 zN`39`!WI}J;zbJ?wvl~oofThqQwy&CaAOTstCDs0A*du^%hQ6^Wvq{rG~@M0(tigZH zIrl3z!q$ery3}jrZ}#i}r=ZNoG7gD9?3YuP!E!q9C85uV{;zAH_l=1{lpe$CN!i&k z($;PUZO6L-h|rt^%hd#&Q*r+sbZKh)rIlxDyJ2r(ZzB+kIe2@C7$`wjHbF65*R-?S zBB^QE7Hhv)nO9c*VX$dJx`0HW$qLd%D)?6$C%mdXxV$jA`McVWooNz%s{MN+pFUbdzKt-a-Tg!sUsesN~EYv z48kTjf-1bNs2jWUpiGhhizLx{Q$-2VXM%h4r!6FYo1w-%#GABuvU;5=J6|*qCiwHYJZT$B%fVr~5a!fPCG7L> z+wiPpp8BB3)cRW#g(~Cjh8ca}3m6*{l0^N^SYGaysUt+(?myO1k|zuk#T)I(*nQHt(KPvo1l_e{ayPo})x?dKG9yJGH1a8}s z|F&NFHBbQ`qniN1;WWjuiX{u;=OAIOt;+bv;TR}j)MU_iT8~w-s(hFz_N7tsUt&4% zp%Qygb~;yX)jRK54oZxaR@`#z#QXjw5?jpdNoR1NTE-Qu%`zh%BKjhc=KNL9Itq8V z&h=)Dh5P-LVkkqdQI3!uX9P=0BtGt^HRNLZPOopeeO^#R)}aLyjtOx+m;zRaWP=iC zaOQ+tqu_qkalCfv8nCeqiV&ZY>tugWtk z;}acgUVS6Ry?va?`4(l#@B+Ps4-g)+3v5W|T2zv{!mu1=4^Pk55hgUqYYzN_=s{cr zAhPIqt#LUJC8ciPgjTBe2V%>7={X$)t6mLlV9FQMhnSWJPSzu3qNhvb>V{Dn?vM%ml_YNP> z=bqc@vrc!oL#crs=%T)K>Dx3VDW;dpcQO8DzkrM2M89u2+axYm|9A|>+kVWnrT|~T z2w{9^ud}x&eAQ0X6Fsz_Y*h{-s%^C|Mg!mBsu=n5N{) zT@Jf^NCg3(c$C@Hz@9Ms%*L^X1XpU8y9~!pmEwZ8T9O~Cf35_(V`&tTcZHQFCvBb- ze5#%AUvv$CP}4rdv+zK)=XdiTzx;Vme5E(rW1ahk9GjyPr{$|~QO`(lWTEPi>4(jA z&3-QC&|Q~~nwqin{XEZ~&Q#l5WTOKdlYc!E>ITti%7I38a_@vKeLZnGyz$i3Fw*JN z)AE2j2nB!ZTwxV?^qoi;GV&o$iBe8)VYS&e`h1(BhzPjSUV2d4#s_f-*T31Q zVPhG`DPgt(UC2iZ=9MTC3jn$gTW{&NlWGTFYnpw&yr_?c|1HStmYgFapK=;YHr1Ent7H0i7({;2MIy;zLVZ5?-wZV zy#rYLY+sHlr!eww&*Bp4{W{sx>tvUz9^Jw1suEPK8fG{G$}Bw_-zr=pFf{iL{_FpH zhpNLf5z%RU`*r-t;00!{?V|@`;ohq#F1U;v6}70Ze@=Y{^{;~8S%JfgQW556wnGBb z42|Iv#_z!Cyh_}-UTCzDg}8ihIZ^^`1nPSkRY!@nyI-^Y`uSBhi2AdK@V(#TB|Q>-UOol;ZA{i`X_b74CY{i-q$4oZtm^ zq>;M!T9h{Z4gc%68<-vK0lOZwGan0HVB-j}HV}R1pG4g=vc2o4qJN+-9Brj!b5-yh zyB4R;uE&IUAM!CRPY(A8^v+713w#G}#3ich(&}RDoEVS(3yxF&cLUdp3Q>0V3NG!N zgDhWXDmONNLDx__cJ=CqNox+^R7r{8i?MntE3U-7Gy5$S0B%lt8r!zjfx-sg^dUzXEw{N0m z!zkFa+61-;t%lAw1*6uT#I-BMsGzikWXsC)$uA82eD$yag@~-;n3JVoq`vbW^5Bz;70v#_}~91#{2|t=*b@TRNZ_mctOyN z#vi?B9YyuCJ1EMXPUBvGIH?VqaUZn;$Ij+rdT&42ioc;|2sV$Vck#xAon2-YIxNI65tU z3G$!(ivRnsGU^BYVNY%0OY4TU4@Zv(tgHMR8fk1a&c*C_5SB-~0Hn;hh~~yJ>>3wD zs1d>QFsQ^5(8mpVTb2W3SJP(-5wsvQ?Yt~ z3ANRmg59`TRD@DCpED=|_O@on>aaNxl?#FfFTm#0SE(V+28PAZz=!zm$7?dFx}svA$FbGGXcX^9i#CLX@=hO20f#q;2d%n z41!lD&9Ge{$KWUO@k&dXW{9iDux1<1@&n(Y+mtd?a`xVU(PhyfA+X2q_JIkZa7YWnPqOrLO2POr72hFg$XY+u&a4G)? zjvk?LS>xaF+l6UeA0Mk$!!9fxs}JACono@p1vhY`v;uj>N3eC_CS0z1fx5zN81CVK zpdm|fyz&mpZXCkWNqsPU*?ycknU5P~w{Z9VU7TDw5fLnCz+@MgKcja?#IUtEc(wwC zg+;==0-Hy>c47kt#5f7%!~%rneuMDSZW>Rv&ZF%{U#$y`oo8UtkqgvE-9p2!4JbP^ z8a{M?R%b%JxyNDf$|Ja9v@fs6qx$8~_~*ZWMN`FYjE(h!MkIo3)&lIj{uFawhioJ{h*DH z2QM(+O%KoD{+PS-MCW<5<0Kw<&m`8E1b=M*r!HvH$ELVXojB+4oyz7csXV z_1hNa!#*u|fo!mn%06NMrf)rmqN_!?N$sPA?0ebe!&opn0ZtlGyEzwzp!bNWI9&A( z|KESzL+;QRxR6cxV!abuJ1;D{{sFIET*gdqS=%$|Jrr6ugpN9j`j$GJn-gL2UH-Vi z3j}j4*j6R29jTHW8MQaE<{m=T%~P1&*M|njQb;Pu_G~{Z#29+96!)~@B&+u^TEUe6=?j| zO{|Fzf-^m{^>_AlwAXZ8c=igvT$u}J7Q7IUf)OJ}TFgTmBQbnP8p0jhFAQ`ayr81I zsu4GO9ZH+)advSw4Nh36p$0pjO-gm(FmMIV-~WLBb9WC0#_~dw4chEok>P+JihEe+-7`v+kFaA}D4eSeH^T=J& zjKpIKPCt5y-wGDO-RbkrQf8AQZvG>1^u=2|xwRGJV{))^*BM;CN@Y_}it>BUP;qh{ z`Uko|MT4%6b@t~DUNFFp$1vYwO(nC2%5xYFl;1<~`Vnw;)KR;$G$8y~@PZB=0fVrm z;3$@*&&Gj6myw^JhXQga?$ws!Z0-;QI;$WtZr8)Ua95C1nKgSQcCH(TBu^_?Svw2q?yMS9&&(J_N%@O~baM_i(ppKgRa=CtWCn#Q_!BY+b-WEID3@ z>dTvjg#eask$og4?WKWF`EJbW?Etk64Mg1R;oolx_Lo1!t-8FAy{Ah3e{)FA;nD#HT#lH z?u+EaWTf;?#FBGQ(Q;=!hS9t4II{;6$S<+B@xiPc&+)8m1JbDNcdXYxV(`L>kFLG03{8tP_j7{cFfnZ6udBMKW@FcgVXCLWALyM7&T%zhE7_D-PbPS$ik5bwWjM- zQrO57G5hc>e7JuQIf>q#7F86aZJ)_UQS-71rzeNN&91$V!uV0a3&Odv);f6g8Hd~p zHc)B2d3peLp|BU zOx9PC-LtWgA$;0pJa~QpgXq2@dRL`PB=kW;$sai~*&k~9yO{ZmrZW8~Y=X=Mp+WKJ zlN67M8_wfF?K!NPJO#_PY{ySi`_Vl$NZnX~2anEUcDN7h*>-tSHGFdp;Ld}aI6SjI z0?1co@9LT`8;9%OqiSao{1j~yJ!DGAd5Z^HO7DU`YwzIi|3Q6s-3g5KGz5ZmO8Y5LKW}5DL*Lm4QS_`D z=a&wIm(&U#BX^*(wgJ~R%|tJi6*QS!Q1!YTTbZ9p<149+1A><3<8kdVY#bay|2E{= zC4MHhRK3KVJ=utKHa&-Qz-;`1dw5x2f~ip~=+KIMLag|8Rq5%$~!>DcXQ!%s%-7 z|NXz;hr*y7*2;)ew#7=%w~~GNWwQ55s&6a!Eht3uoz1Pm3u;v$($kjW z=G!+YI=UTOwl74Eo2yXvs+eIo^t2gI50554<1^2ZB^`-K?@5z);`+1uxU_00{1v3z zA?s06-Gt)pbCImEfx7P+lr&djPewG{*tVZ!3j!8gBn_Ozwh`e_(s+gC#VL9!HkQA{ z-Ti|R>qhxDK1Z$cN6PNoc-dHiS#d_qNCOZyEf;4?p5ocvt%hSGNbgdzYhJNyk^ig+ z%Ti2wH;joC)K{&!bQ2d>4*0_01?K;#;4yGJ%4#ZcYH<$2sSjlNag3Ubz4zYZ&Vh7< zXw7Z48ljUe;z8Yh~0H}@>6YtCTT zm?+p9{dvd8iC9m5*}X%)0X~PnX&J3bF(RDpF7PSP~R+Ux* zePk>~FFAudEsZGHyB5o*q#{Vm%3cZk^aa>=`#El(n1d*dHI3;=FX{wL+FgaW&rV`l zyq;{2p`K*Ukyw7^0ctMHM|u$RzYX=o%G z5bA0#>T3(t&L#}rxe@5sn2Zes%}8(!Nmx(V|k&mY}i0d-d2cb zZ*Jqj=#);u3+x@-a(1Dz{#X3xzwcv9wm+OSZSy2w%SVG32(^MV;~0qO#Ya%l^Z~!z z%E#u}qtSoFcr04K1mgyT!jT2%e@o36VT%)n@v1fSz9Vq(Ry7WdHuylM`Vz~?uVaC# z%R1+!0IAAyLSeQ`vgJ5o+Ec8pYbG$A5>u91TQnqsNs+}4O?zEpyJqa zM3K+KG@}U4#`rDQ@wnwKj!a7H6uh7$ox2R#in3?F;D7$dBkUlb(nZ~QO!%o7=0k?y zVEubMyOoPfE9z@azq5sCjV}@>okY{yyEr+oH}!8_&-3*R#^8neW)z(`hQfWz(a*=| z>wBkQ!j%U6{mF3*^`!RI;hjGoykKan_6bw5si+dS_KroYqg=SR%pn@1cUGXHXb%>o zyTVRb+-K?K)V7zBk6n+7d|}J5fnbWgF{ojp)+YlVhe}3iP%8C z;jJ??PIjQSOZ6oW$i(PPSMl)WJ)E4G)hT#^&5t<`%*Bnzzu>?A^9lA04~M(P?4!@m zM5WTe(R~2+J$;84)#RU9N!y;sG{XX(#~ww)yIP!I+~+%JhS6~zun{e%CR+|(p!Zfg z1tD|qUA(H?ihiMX!ZlJ|3Z@-=h`PEXnAAH7Lx!g!+?vYVAsGwSoyFbf_i^#?My!}R z3}Iwjt*kXjSb7+bpWndhkx`HedSm{K1|DN};l|y3oSv5g7xp15-CyHB1dH>Z%;wR~KEdld8<3OA=F#?IB3s|H@y5*S&++``2Bawr^Jp47U-VmY z4bST?VMRtb>;%nd(QDFvTz^!9<1>6`^UtQUQkM4t;@j5tB>)v zDi;&{ZCm?Sl~)S3-+qOAH0F!&VDo6~8bk2Hj=FjjojZ+^L#wGR7;UO+9EP8Jihnd* zz?cBDXBhdE-~|=65uJBG%-C0s2ZehuDZ(9cy0?us5Fv3dC5`4bmV;80|oqa!St9y&)=ld{JWcHCZ3tmvWAb8*&JbC{F#cMJw z&aeKVgBRMt7Q}7s;5%eK_UE0&nxPRi5EBbu>PSV7NS?R@Re!6;#h->Cm`#kgUdtvI zV=?pCExfJSgX|c~=gJD(=etB<(vj;Z*fkl!^tbLNdD!-Vs?cn#xLks>OEX|kjg1*g zg}oaB$8E;7E0=NM!i6rlh|BrsuzT4UBsjL;j!YOZb{o9lh4CcJhJRLIU9Vs`vx(W( z-{p{555&$V&3KrnMMGs{Fq*oc5jaxTf;WXL(9d5_owE6LW{`&E!5LV3 zsRS2R^oOIMnT~0wVQXCA*LODdo!E($6MMsf8h-mpZxy5x9TEpj$HCJlkUKIPesY5o zDsha#!u@y9QgarI`UgVCwz9VN#ONKxsQ>3J{dA`UH^hJN;XK?Bw@d!$V}ga=O^B5!3XTv*T- z=}IcML)h>o*t2&dMun0Qr_PUU%WgS%fy#}p6Y0DWGIciA9oUbj=A8{V>@u+ec2zw>(T358R*NWaY_dBBvyR=yvj;mcJk*i$&uk5ImdRFXv$34MbU@n*ps2AGHlbHLMDbJc{QqAp5Z`$d&6Q5^8v`AVT+#wc2?uf!;{#u zZUWNuWNWDGbe_IQ%9((n!H%#oD<}5Va6tBKT)J@+o5oRFwcseR$sijVc+Wmjg_{Q^ zBg%!GQW@QY-c?R@pvl~fTW=m9?STg=o5e5l4qg4BK-Xk1kAu2eb1o!AQ=%f~SQmkz^%@ zf9fLSS65;G#1O$I*~gB+mMg_LwJ6Onzz@m6x*OLG+ay|9!#Z#%)*iipy%SR4t)u~t zaO4o{x9u@v|1I1(F$2-9+teEL&L&s==jNln?lO*_T!r!eQu;fqGX?x|W@1J!@7D9{ zn60sQ=#M@3tFa|bL)sv%skHEl$wuyh9n@cuzw$+kR^(?Zm|sut*nbr+-z-CE(GJW@ z^&)>*B-jX-jM12!77G`94cU3}?`%`B?QR1Km&8ItgI|*$!u(Z_iRaMxOBI#}w%uQA z?~G~ZU*gu%V55Df{(|aJA|rn%aT0dyo{2DFGM@Sli3bvf?8WuE^KHQkbRYJmn`6>M z?7Lo!qhB1n(1x7uH+1h4v|N}6S4Z7P{4~;*S_g;73D|yYKejE*gv(cbJxG0ljWaTT zI*r=0!x)|9CX|cYuuUkbI*oZL#s!X)GZe6h%7C3tBTyuj>|%61}7zj=k4W5eLe7I=i+Zs_lN zSEOt#Lw(V5#F7TgCnrA+`OD-R_nUJVcPma}YG1>GpUc2CxLR=mOS3`@i!+IfaP?6E zwx>tImH9*-({cXAbDS9O3q6g!OydnDv#XH{aI?7yXGVELqcQwl6S5L_er?3fpJD}n zTzEFyu|lbX`}_-d$&QU+!3&fh7PJ-KcQXo}7PbX1uzRzw{bPn<)0LaJ@TI{EOz(;W ztSfzjl65p@&{CTd#wFzc(0e(JI*#YR+{5~4dtnqyC&2zAdjDL0Z16%Gtjr_FZ$bHu3!TPR zCR9ohlx~x8`ss6=ni>ozmFcS}wirR037>NI&jU(p^aP#qd{P#Z|QM<@NAlV{W zr+J-k0h=h-!z*+-ihg;5E31>CwPFEjG!CLXisbG{oN@v+byu(=OGjfWF+^S|n6mW@ z&MX^+a9dM7vBfAgQkPvo`Q?om6lG6+iJ_iZ|CO?~6!#8IL!cx1;6kuA>-*>$d$OM= zS0l^K30kAAXJgipCtu;g2J&TDTV-QhO3%(3R|Sp2p5u!VOMM{QIaZ;xhi~End3rn7Aj=F!&QL_>bh1TQF6dU(do#+4_v*fl^SXhunzQPDU`?h=Nv zhwkBV$yN+BX~s4RBi3F=)58;(*_$+DW2PC>(w5ZZ}TsnTbSC z=daRC>&G0=-sAc0&B!K=v<5FQA5-Fn==80)`|ci2&Pf#JKRVu{XE6jX9DM!~uS&L{ zFFUK;G&i6m9i;BSlXopRKTS{lt@(9S2OkMuP_cPHT{On$vYk}cA=`<{TFQc9sGgWV z?wEvy=kDUpk$LFrNw!obg^gVTmYjWv#yeXuB$&(X8`0YkB|=o&6sIyQpYT!-G6ym}{2?45%YmS58Q7i&fc zUdWu`Qy@^{cod)Nn%!aQIX!3!!HgS&W-!|CTQ zaAFMWf7pB#%eM}`Q44YYQ57~1U~_q7FVzZ&Z9LFx#6jG9cN06uhY5?JY%HWA|3no# z5qk=6;OMM0;aEhug8Ub!q1ayf5Leb_AV9sVXfI*6#b3O zHP|`L#HA0-sM^EUuB;5>EV9S8F8&y}^Cli#nvV!JugCgS7i#xQkKyXhc}P+-J7e-Y zm53g*9R)?lF^k%;jj)Rl>4OEhcnl}ql;O<$bOhN_eNaAR*7nGz`^-*>fUDXVutjw( zNm_(F@~am`I|%a%5-Hn3p4~qXOG;ni_J-bO@7e|n0I+xW$I{C$QPUH_3)H{a1P;dP zBNwr6QeXI}Xj~>7;m-PDJ%;b8!kv?|5aVlS>|?2HYzAO^Z9QJ!+KYkgI51QHOmjET!>6|oFBEnFV;KhMrWUbEj287;Q(^jPPDDRk&h#DfM57>l>Gb@ z#j7mu67=T?UJwkN8qSFmu> zz;z4jWXY(RPq+&M#%_ZbyfI;a1seWYj3FFIp+)lA|gp8iGY9@KqN@cl2IfnAShr21CoPa!klx~ljh9K znVCC1@AKU6{SEJr-+$ox*4o`b18v5mXNDi@bB^@x-D|IXRn=9sYSqG#SR-hwOCUyM zU={S2Bfhm8?PVd*702iTA^eGU+ewpBGvhP=8uol<&dagR-w%#N?qta@GJ?RyqUgF6 z?N?vpLVYxr>9J=rMSK(Myl@FMzVnI~Smy;n91h%lfnPtn^Fkz%?Z4vZ2P4=QX-&T; z&yi3*>w2PYiIw?dc=KowV12?0-HXr2202tkJ$uBo+``k#9oTA14pmMC+D_|{vu6+T!_6SWVT)md z58w0-+`e)gNq)ivEz?sT(+8dr+;UrRtfLsKjrfpKwSd?9bhMtlgFpXr5l!1zHpUA8 z0RQw!L_t)8V9plj-ZiI$fp2?k#01%jJy>qRqvtY0O3xkK8!v#50byLs@37rqIw8%t z^>!557D|wpm4S?mNMwmbn`LA4?Q5J!VMh+pcWB=ETEsW0@&$CB3Rk)1&s{D-Y;{pOxUu-{k z7L#2&u#CpSc6+gT;dYkExM1tvDcl$?Mz}Kt3KZ_`SitfVy& z+kPECT&#nanJ$#&G_ar|zzstIG?OpHH$g|XeM zpeZniy`*C!9-KyjKiLhAUyw*^AfU1YRRx>iD#L;t;%0&Xvs+uBjODYcZox{(6dV;~6DDuz5!#F-U8!&!s@j~6z7Z}cU z;EthS#S77`S8@MTI;=8c48vSZRB-IkFd zuCAMm{#QR?Alq2xG0g}WEbSqGNyws?UF z;fw7?W$&K-wggW5@ggicBM16GBj`1yG+k_;%On!c87zOuF% zTub}#>~|_&U^^7m{i<>9#U#a9x=@{i8G25wMD&tP8qPB#-YxtN>%8E+@i-o^?nQB- zSn1>d69HjHmYzjT73Ln^u;4H=`#aqC*t3XYMz%mGiSLUGT`2MI?~-p@ydV^2$Mx6b zq37BwjFgAMPD_e>1wH$;u1=pduKKCP3w#JP5^?;^OYDyn+riH;qh$n}f>U^Ts}Uh{ z79~DLgvAR1866lKYQ~o3!X2;%;T0IX(2LS=S7z`$K35a)FMN3VbR@@a*AX zB(URy=5c!!S$%BpeTfIh5@0T1=h5?FnmdG_UJf9|NX$0S`%%#}gl$1DUj9zS3&OVl zWf*&M9=j+GP#42H$A1KyaN^ld7%R4chPvo`d^Ol@ID!Y`ZP>Ii0)8$|Fx8MI&MZr@ ztqRPREr%uHeSX{`Ox6nHTN&cKAHw^m${(kAfk)TyuzY7f9zQ&WBu6s{=GYi`{jeV970L`Y~nVq;QK(r^+NFZH23-0;hb z7YNI&*qz0dQc|n{V{zyF!^I1Xd+WeFIv)*3_F;#Q3HdxtSO#oD)qzR8{^1UKYq!8n zPmAn`g#65+3cWWa9oTr3qmT5d)R%Ngq^sO#ay;1jr=s`9Z5+)BfHHAmWhE_`89Tt9 zIG!fo431u_5fQ!#@f$MGaOMVX^_C&TMU(h}@IA95%d~t-G17Y+<%Nj|_VI$9K5=id z^|GY9hNOG88X7YjX;`kna(x%+>H%!sybi0}oMBFUiN&{y#9d82ePG4x4qeC7GJ|hH zKki)HhcMQCQ9S08HiXxfW4Lzr6!HUJdeGCHn| zpi5Hm!aU3k(0@(EzRDjpU4$MNdzT?{lP!9$;6=KXn^ z#S<2feMIpByN)npVrUNsLrZ8;++pt-jPURT;;TDQck&8u_SYcNUF&x!UZ8(#5(m!i z#ogO&h*X}%49AtE_2CxVg{uz+Q4*{o#EfGo3I=cBYFjG27-puqEW?cJ7PMR(!7)k2 z3k)+{w=;$rnJ>nSFdq_uw#Te^VK>%D%`09|F@24kIL*5UQd054G-jCnS`5r^#S0;5dBBPn>WN#Ux>leAr|l>be9z`>_s?XLL4*7 zDu!@e(}deU-$j3+|L=gAPc2?hhpy2MoP7NdjcbXwPZv(HoU5)CysP{0;M2 zq@t_=107p9o7+HJ$p}{N0SF7*h}aEjsO}uc)$w*D`{~XUFEE_RNtqzF{v0lx$i^yL z9^_c3L%l6HP?w9f4kl2Y@xe4!iv3-kU12Pz11(b*_yw#-R8%685_jUnoj15tDOziu zCyQRZ!0C-HtSy~jqan?khSYJMd8|Uk>ahVdufZ}$L z;av%GOpg`=?{q(b)+*HBWW@{nv7W{%?rT(dda$8b_WCamF>3sT^5Gd@jk7<$!C+YooXN4y?C@5WgS7EF>>7N4UoY%Nkc+`g z0KkOLlKnrK}NcJ447Rvp`+Kb)P9*!1&JM1r;br zYa*)tEFS;$CK`erV89bAULf!)IObsZ@f*B4x*59c*oYa$_;mST@d618KBRd%a3qjb zH@Bec@G%@~--A3qL+BAvI&k?{yzEJVuZ=3b>-Ws-N66PJUidg+=bdw;nH#zxP(LX#n_&<4eNbup-%y*hHojxuk|2vg*DVDh-B@cSZhLo z#ae7Td=-EB@dAqd$zk)~VZ+Hrf7{}Pvv_fCFWGz}E}>%`+m0(gJwRKi74%rELDBWh zR=AZ+;N_bO=-82g^i(!CB1uh0#*Ra{_Sau9Rqi3OVdQ*O)S;!d2KoC&Fm~l4hPqE- zfAJP<4EBe!E{});>k7nt6f27Q9*Y-V;CdZ9w_O$jV_PJ4Jix=NZHU#P@reQl6-9Yy zyM>{0{4pMm9YoodZG?~Mx!I0wTguQe_5`o5>_wb6Bck#%#S26GBjI5zKf7yyL{Ux( zt81q4>`o`5E%m^YbwbhjbNod9K}&m~-BD9lL(;Lgg#U85PuqJUaO(Qzh;F@t`zN-+ zRBGYE)O`7v;sv%4Y7$k0p$B(yc3(Aew{1s?__J=V$Iy#E1jc z#I1{hBVmPgC6SY|Lwx-RUOYU8L_cdT!6I(w*sf2PjFY(i!xMCDu!Dj6_f)(fI@V0g z2eBeZ#u4}wP;IU~gJ*B2P#IwhT{UKJKCgITG~el?ix+w>O<+&75yuPOU%Vg>1qEp+ z8JNIx-41%rgXm~Kgd-hY=s4JoiFvcDc1Jhk6nyg(d6L&_5Ay$|qXe?H8Ov=$VEvz=gZ9WU|2 zwOaU)zhaAV0d?2$`e_>lyUMe6ooxQ^UA(}2vu*lG+qXnG`Y1q#$Km8!rC& zH{5IRhuRF^rDss_McVEG!pwOLpBhF-St2%vu7#%&+l@Glnc3g@9HARY{QJA)yD45+ zTZGe-r%)c@1_8wZl6n5;7cU%)Rh~_HGR$Zh!M>;$FK*Oh4cWWTEnXNOZpBs~;n6Yg zE?#hgmXsNiyKm!%p;FkJ>&&s6OjML)5#9C_Kiq7@Dor+iK74Dg;LXbpY)~XyIejf# zMEsqL7ufr;+I|E#UR=kivO;8TpNseHi7hz)r{D0fc{McEr!h?bRa%aesxug7ct1Ug zuF52A2@l0`6Lk^ZXMf}Ol0Q!I0*g~DkaYMu-i%hl)mnD}zgJe2CY%2VZ*T2Gpbq(4 zvClrHc!A~5Sa%>Jp9pNu--o&bhtYF@e0;|doF2V~yHlqL%ZpLG@O5QQE=of20xQx} zcZfkl?+`k2f}lD7;>izp(3!dtW?%gnfZ5`O{-+mF88{pBF;OP} zWabl%gO?uTOyxQl(X%L#4l8Nv!f{O^QY(pb9yo;K2N@TmxbgaPJnY?xwa&A}3#x2K ztdtejZf?f$iE|hmxrkFu1;|X;fVB=r^xU%Z><`%#`DI8dJ%z!ka~SR&$Kk4EB(4jG zFL69hSLr%d0IqIigN=tD;)naasNF0c^N}4$%Ezv@i+K8c9J`}TIGdt)5BsoZ zOY%I-z#0u{(UQnSpMGGG5t8n4=1vG48&oVcrWtec@Sc`LaE@JlvPp(^^adaKdK0k+s zH6Ab$&&?8#RbsoHDK4FjLl{S4#S71IX>Tev6?dTb_7nU%(S(&&^A?ARLr?!xi*E_8JsLRZ&mOg(vvso$-5ffe7&aCx+45$VX- zeSpiO9qnMxdR&-CJDdbpmPZpSUTC`W3MaG8p|3&spRu3pb9a=Te~q`KyYurqA1Yp8 z@v)|@A9DL2QodRZbxyP`%K{ipG^SkfWUSF5|GVT zr{U<`f8b_E8vISj5KliS5mYIw4QLvFfrrPp!N;0MzbX8TJ0s6<8P@LZ#DS)5a8f4) znhqXSSSylwq)|l?^7f(Fa^N^xOG3Hb^Fm@piqBe?NFa%yDqO($&f*1nq4c?XW;brW z`4wj}-C(XopHG8=#vtQajEm2H#>GlEXbT9?V&DB#nG-O+qj-S{*R_Ca3BwlCXT>6B z7e;6-qa|zLq{((#F8uDN$Tuxs;E1d}JVT-p>SaL2p6yN-ea5h2y90fX-{M|tIP|o{ zibhy*fbAM=YCn$s^9mO}8#Bz=sTsl2D-2<)-C(On1b=#NSu1Y+wJ1GBMry1AYg~j$ zX4kYsxcd6f7|8X8m9|*%1uJ&&D8R(yUof@H3;J^^!9FaE{OeozW8dw+;>lDKBKfkj zqFpUPULGE156(U*6_}4H9Key$NnF2n8>j11;pwCgS&kfh-^B~ka*Ral z!FJ6qTzq;H2a?U9A}houSG?dFit^#7czJUS$D3Qx#^Htu!_a=TwzQyj$2xdeYLG9U z?Y!{5;)Un8I}ybdFF2xb>^Xisl?Gjj#S7}f;)U~NaGSRGWc!503s>>rbULg*BDwL= z#S4*@=)dy_w+2t*P-`37X5K%0)>iBzU9a5a2?K3r-$gi}XXc6*uGGR$>tCdJfu3E7 zrwLQP42(T~j^WO2@C-{v$_I)U*fZ-{TEdz{hYMO+F(w~Dxkqv9%|+CNxkGP$rM|2x zq8cya+1o3q477p{>C^X7ydX?aJ1%pBz2$sAL;;_oG}&BVRF1vG<$Y^lYe3iYzMtX+ zmS|8mc0%;-9!y-D;*Jg597fM#!FZe|V)kFg<*seQpi3-SIa9oFwE;o;tXsJIzyA@ND_D8iWf3YqY{m>eSgiLgiWgG5aqIa#oIiR9 z9c|)xVg8^6jdgV>inN*OyucC@a&mHzlQo9v^7TloYQ@2U5nQ?P2&4P+5a3}#zW+n^ z_`^a9D)H~{lJBZ`;aneTq8G-sv+~C-Uf6d07Je8hhm(cwf?^$3Xv~Ti-ri_{pQw0Y z#dPt4(sxk2u&oPMpWesC?xPa%-c;X!;%Iv@ZprXYHd4kA#$M}?TG4{`z9C$``50&0 zixBK>N_hYMvGzwRUPwH24R6M(;bF}d5$Dy$JZ!;sw$HRe=^9*XQEk zC3>$z2auf_0bd8g48^48ez`btVFZ;CfAr!7#uJs`v9TI`{l~GxpLBHw-^8W3mgpg< z8hnn2CzG+#nmFngZlrm?d|dHD2PNO5AgG|OE|r6|Gb!w`0)M~)D><= zxSKZVzBE_7uy^VvhO7Qa#S4TP!n|wrPMjL-MP4x5X*>@z+QHa)`Y9fr$v~hT>FQU- z%(Q%5@dA&v>((`cf7V{~UA>8co(61>^M#v@Jn=FWtjs>fb;yeH_??Ou^e858zmK0^ zOrf{=9hfOjL*z0Y;zu&V;)V0KFkZLm+ZHd-*fsP`vHjF9_~HIA@|H=>F3j=hoom~| zuW$sf$;X$5s4eImyZAC&ywJT}S7PzPo~vI{yikercP^r7%ff{?&R-?$!MWQPu}f6E zU=+0nXP=+P-VhHMN#txwP-1q2vonmNIH7Rt8SagDqq8~{o*|pj|KRVq-W~)i@dYa4 zIBGh^h-kfwpI=^PB?r)b z^f+46JfJS6B#MPuKIc=47Ywn!dH_!^9l(0V|K3@=a2OjT6)#-bgH_t^FJ1`QdmBH$ zzJfC?^D)yd#LUiY#4Xq3FvArujI!c|6u5uW;stgTr4BY7{Q*Bdxqwn1QI|;WGtx~> zbGQKLKo`I5=*27gY|nbZ?|_-FSG=G=e^b>qgjZq}y06^9cyBY(wgkb;mUT5&gll{w z2FJRPGNMDhnNUZ4kL?Rh*mqx?t@YGYiWN{Yc9 z&%hpD-2^sH%i!s#OC(eVJcsqD7nropFxV|IZ=N#6@0ewK3rbp<_NY&$rN?)){-6JLbp3!rJ{gVjF9 z@9*015yAzG?&4Tb9-t*y4;t)jAF=O# zs>}%(-&MRoL6oAR8u-#`5U}G2xI~@`7xm!b8*=WeT|Rh@>&M8~EM8y*7>Zm0 z1{q%om}G6m)m9YY(AA&t_S9CmTTB}x`kV}yv}X~{J^cljcX>irlPx~5?pWODL9goW^Iz?=AMl+Pq<*$z#JP6J;zUX`jP1(HQQ2%>9Cv*Tvk_L{NW|EZgnE# zKiA+gy#F&7FYuY2;aMSY=V5d=WnhJ#IuU$P;R4wiMO{y<@w4VyuSxp;yNeg-eQO!R zGxsc>ytsukS(fC?L>M3}%jwv|zho3|?hjJX#mEo^84?PNq@$Tv#oGTfAwnzVhJv$CarT{nqW zZzhoAX$(!8CpM?d=^Ll_;mwZ&NYiD(|NJ=;iR|=o1nSVycE_3^D{{Ju9Kn&2m4=dy z0|IiI&^|tefsXC40gqW`5aO>CVVHb004+m18Ag zMpXj-zfJLi3gl%pvA(DRS+T(|XJ|qX9NQs8K-e~q6%wb+tHJ6`;OgYpC%t$yuezb>n0w<;~&OQU`5ZfK&M3_Gd(6g1OhjN zuCaj}aav^s@;PLO<;|_&yJI&R2QTB?$sE|J3+?-K@xsu}9%OilFQUsp%X<@=2gkl@ z@q&t&eV;Gv{8$;n0@t2h!sj0^pIW?N2TdtWgzmkBR}&TRFw`O6GneP`6m*b$>NOsp zPKFgLNLSZ@Q`sbbeAbOE+G2K{#bd;E>)`ca+=uM{Q^(=(qXTmPUGjprf3{Ly*!O=dO{w;UCWZo z8hS9#J}J3);lT(BeZ`9xWTD}<4%NMrpIyAb=}cT3ZoNK-Di3|AOyhgL$V?}-8Q*h7 z*jhW{F67e*@2qvNjENb%x0j>l%oSW7-U(+-(!B+Er|0A1TNxV1hw=WY@=?VL)A21k z7VazHoe7(BNyQ61)~$(4+OtJ>4FvBR#nbck2(U4P${fB%^CYW|O-G;M$v`HYW-u=l ziNy;HJ0gF;@TX(73S|>N;YEKPd<|9T9kToeOI&NhC3GiFUl>MZgaOBI<|j+JT+}BN zFK}&^*)dFnzu))R2+~zqU98&PhEu%_NN^)8iWkjrT?&Y+QapHLs2r=EwK+~BJSvne zxDc0O3ve^{`%eEk;_?kEh>V^z0k)J)vO`T8wzr}$&GH8;f~E{SNL8h&T-!YpQ3XM@GY%=?NL zRG=uQgB6?i;$;7RBzjQXKL;~x?ky0rdj!`%J zf$ke`aIPT*HtOt*dg4VKX7mwKasuc2Y7yn3L3+zDBmRA%ZZBr>0xP5l*n0(Ut~X+} z1gy*mYgJ8toaY>Y(vh2(YT1ruO44&NUS4cNf~h!WM6nq8QDutn7uYe6*PvUj1rZVzgzN|3nL1*YoKWQ(W2$MQKJTfD%IEK;L*mg1^Qhp^Sx zieiu1To0QAmIGY3_bMKYSHa&xmw1@ahJI}E0$)=PUc097a#5vXxhVSErxY)+VmV{aShQaL z5x2Su;i{!T??je-6U!m!U?tg@k+Dvs__1{>ao?l@c_~9|s6UI_lhxRg+=AnkvGB0f z5Gx#HzE2&i8?WK#`;*8Cu%YLm-=uhkTYKesp!~vg@q!BZs_Ah7*$cxbA z5_7UD#t1DuhC7ePP!?{-1q3P-w6MzL(DHsf`(YHh0m9a@Jibs#mM85-M`;Fv$iOSh z34;Z8e|aMIf{4R7S?U694WYqMlCwj^&I34<5d(WNCUUIn0|lXqWnsvdj3eL4C7$yTiWLs9s7?}ev z@ay9i_-ijbL;O>P?YuQ~@jE3QY zv5N@{NYu=+Z0#oGWW~YH!31h#XvFWYOl038sT0>ch!j$QL%*v?V^I&x#mR?nF;Nx)XANeElpw>m zN9M6xcz&Z9>n(M_BV*4nBSXP)+UY0w)6+Jr*4G7}dnOV?dxWI#K*r`UtT1?A(t_T% zngOh%yYTYY`#7@021=~3hfjK=LVBrc$+ca(cc%wgUVKQ;(+`Gshp3$xx^@Y5@t)9> zUYOt)7xsMq<&$`Fs{>Ki1{~hrhXW?xtayR!3=1TeZLC0BMJ~dKlqt&ylSiDLA)Cfu zdjQAFykVp}UGO3%G=Ccpy~gWv#c-L2M;3Gm^eqr~^aXx%IPRU>i*S2w$jQ#?n~D-S zIAve#zVrwqg}yMPoCk# zW>X>=6kLeiONj`ip?@@j&4>(Bt_*+&8#n!1Qt<+Nex8;k*5r-g@sj~m2I|wi((llBWi{;)R(2BC z$663?$B5Z94k#FwlY**^2fUZL!iH-LB`jXZK7Ioi4kf_Nkcc-&*a+JS6gV1$q50xl zJnf8zxdAKUk%dlV2Oc~bN3JJ5E0NpjXW_akIj3Xv`4b%7U^wS2>(41(uno;X-{?71 z#X4}^Usz#=hMgUptZiXR0hEf0Jdv6pRQBJ%`NlXn>c~N6hMSOGrT3uW6^bBx1L&yH zT#DY)zf$o+ky!Bp_x^brF!xKx@auoz&hTy|n8|#wcwvFCdDr(t@yQ2xey$Sh>;+I{ z{*G)1EACOY+JTc;T;dJDqc^*Fs|=g+f_GE!1{*m&SFraBYhVrmK82s@L zhK?RVCTmG4(I0)9d~ERo^P@602{>{0Df-eJp+?U*YiEhWQoyFSDh8`9rjr9|^vtp7 z7}*1NHL~xV4HN3Rj1&(>E2?nzQ6DmG*pXeVc))J5+pce&xN@P2kKOi4U_T4Nv z2Pdzc$Npp=s1pa3WZyrfcp;|!G2V8kLrYUsyr3)(eX{SKjBm}mo)ySySOy_EX9u>e z_kgy-hq=U-1H0kZcu)W4E4QAj=J!stRKFP$6zF4PC!ztg%!R*&H=! zYQ>;qtPaZrvzTGeEF-N1-DPDMdp3kzJBFF*`;d@7Q{wBx$~y{~xk*^(YXkLpe1E>M zKwi?{-zBVDUs&Tkyt>u^e~Mcq#f567E{Mp?#E$qi@YH=j2mc)TwBm&j)Lnm$iCsR# z(L^?%Y^0o&Cc@iq;`Nnkc(Qrp=J9(eUT}pzVTvDAi%a(|peED=>MYqmgLmRi7MpPT z(F>f}W&<^DQGyS?_io(!={^ob>dX`ru!3+^fj#1gM?E8-%oY$C-jx*%;OyUk@#kkz z86<{xX+;?MB%$ld6&%Y8fCkzA1$ZY6ysvnH;a$oi3LRG;VYt8tdTI(#m`T_Y-s#zN zRz_j9m0;$W6m|9W=ooK=x0dwmLJBK_AwMW^EW+5UvnX_sn`i6kee(5S=CKYLx!VxE z$_|1L;QdoYiN?C7_6A;DZ^jx!ZHdJTd}AksWn>^DAq3ufUs~8DS-3ghT8~R3Cy*3q zN$-oeGvPqf)g7)TX3*!}sT9=wtGHI(dm=3$AbUQG8RBxLap-yQ0{tlt5D;GwzdtKp zNIUT(p6`zmwt!{HeY(bE#VWWHr&mgVU8SgwVKWeK}6 zer+7(5tj6PvqfU;cmOFmdn9*E;%r+Ae9h_EDArKYGK0^iMC?e7$66aL?)byS!2w}h zRJ<_s;xZaSNmofnxgs6X4`~%+EKfUz2e&Eii)0%Hj1ioA7!MwuL0$-Jt1mC&ViYTq z&0AA?8s|=xBh=Xx0!=k&XedBd+6NV#O^91%4pnvp8+%sf6X~5vDXhogXLr!P&IH;l zRw4c6@gi_=Y%hHEalDN(?=}h_+}?=rcb& zGe;zZ8F?)igl!?rq=dkhbr$);oTa#^C@MhT&KtYNU*baZ1{lr94B1b&m~xB|KieH+ zJr6S!%gfndOY0aWIbeauVRZ+^K^UhiWdm)>N>DkUyExG zFQJ-oF>%b$T&n1hFZKO-x zrV~Oor64yo6b^dYqMW7JHJ>OdJarf>+k!Jse!zvj5rk7|;$#%x%JX3Ez7=O)y}@L2 zER98;I1A~Anhq@eLXnuAiiDN+Fjt@T^ItC0#S3pSl4H&lxlMnjtVHpRdljzz=@Aaa z7?7^c{qFmV7lfErvG7M$=M*k%UGb&p8uwA(Z%MA!KWH)6s-4Inhiu)J# zBHo@bBPYZRE5a~bosXVJmvMBPKaA=9&36AKVVKcy#OjUPk((9{Csx4wMVMhWRUNvn z@i_VTCtPk@PyR@T!;CUv#>6oWCtv=EsRIdQbLcskeyC}~e8pO9%}K>3e6;*hAmFSaXHM8?I+CW`)A_tgDdFCSPe76jQj%3 z*dr)58M)~Za5dHi|08VV`-Dd^qLyO}x*z_G>m3^irwlWs*QA4nHtTWh`A@ihXbVh4 zm|^;1x;z+La?-IS&;?eDiW!!d7UrTxCFP~CUWuwp z&+yCXZCqYzx)@1Cg~g5zD7o+&7s@^9H;rLvIBP$dEN<}vD^RdQT| z=@H)N&fTXA#pX5J-fH){>#_KVfWw- zw8!WWxR|3-f@|avjEy!T!ps8J)7O$XIyqzYrW~~PjiYL%So@$)5_VRquqZ=Hh6msD z1GxU|9@=w5phsin90?gtp+Oh6Z8!EV$KdNHT(z?^pDBt8%mUjm_3}OjlUG55h=Vv; z{Ul+|mVnNJT|?i^=)Uy>E_df~yC_%!hb88ORXc34$`KpN#_;R^?-`DyuHq6p(&|>& zM8x#wykI?C zOywcX0!1>$CN9x9c=1=GTh0CvR(Jae$6=l>;Xp7f}pLTMn;4j0U1G+ z(A~KE@Be{+dvgnCv%O}1TaxgU)u3%0io6R?@aFzWl7jv{xhFB~ncVJE_Xy`3$*g6R8w*U_=jbZ!M63!K@r z>NsF${~Nr%(}{Jq+T7n}92Vi6ub~g`#8zBjJF$EW$ga|Nh!83AY!I=d4VNF@$Kf1z zBG&U4b;RrqIoP1`<9PU_AK5|doG@|{WRuy#vdOYU95{Oky?fKK)|LWZ?s_TkO`Nfz zdJuOm?L(ZaE(8oSbM7w^a^k;#@d7;?w{WP5@I9k=F;NE}O94kJSQ3X7c%^jT!!J)d zu*QiGSuTlAHeOx_K83@$ckv)HSeq)g8-$)!M#cc{30c_FkdL)o@dDFPHRxM}V(+a- z=&Oi^vne~@S2*_yDxTP!--ELw3s}07b4Qb7J|iRKdxFowZJXV~eEp{^ve7(?cb=S6;<0 zSBOOFGd&`IWV#yphl=4zM1+wT6$K(!+JR`k`2tsK0=WCJ zxO=<=z6M0V*u1kNap*Hyz79h7UdH_sNrY{7J=+1X(5_DlYa_0;d<&X~FW_{sudu6v zoCyN5vamUN6^!JC7*Lkx!D{^;3``85B{K~6TyYn>KObfR2`JxNfz93~(5B#rwJu}3 zm)KaXvd6fy`j#n*x^~P<8c33FU%Wtb&vqhk&u5LivoG=Xas^!FWQBjDK$No?#Klu63nE@4>3Qh1-EsrxcIOag#qk5T{*n_taqAs zSyfoA$i>N+XEM7i4^<64gfv~oy`E$k(f4Gu%-~UZ1`mb`;7b2C z^4Wo-7sgN>uEmW(%{d&^z2i8N6DVA0vkJ$~p+TI?42Hgx2G*3H#*;S>(7HVsTI`q$ zx`qXO0qb|*z{D%O>`8@%b}-g$aDt(MvT&><<~s)P{PJ%2@I~YQ5Z;M%Yw3F+cknr$ z4`#qj>dO{Kx!rGa%)UuMeRUZI&-WnL&k|fm1;VYwPF6Akcx0Tyjf+Q65a|UY!nyEy zbl?<|jy+Aqh_Du6l*fmro*!y&KEp`uCM>hm2z{PbSQSPu93!r219dib?*fcHI)gG-3*w&S!!%uy-t!pu z$I7vNg(-0kA9 zX9$%+0r1pUguJ`}cB`_`_u?6PtNkDl&AYD43hdZ*0@rEYFC48#oVVqid7rl1j@u66 z#=w58br$N&+<7OvB%=sf&cnl@cJ}{wRT8J5KI7FqQcJEF^+OQq;!m$gqR-op_ zGmO=3fwzt5o(wYzwg}mB7*p5xVXY>^jA%|tm^LQ968Q{aT;BlmId z>@H;Zn?p(DV>PV2u;utI+&fc?kePxP76*ACd-642jhDdNR;d4SN*3@-X~E!)n|Sqb z3^i+l;ccJ@1qF3jc_ri2^H&(E3nKlZ-?m@zGYZ&Vg=Vy3V zn&m0B343vAunW371i#r(JW#ugq7~6>}ciIr9J=f-N@vX5tHa6eI|Nfsp;p)*mELWc! z-+rF37*T|G6$5NLa2v0l4j|Rfirb7LzL>_IRc(DE9{;cZ#6MnK!(f`bM0@+C!g45j zA;suDKZNG3PTU#3QVKR$Us-?{KUe6oPL-q|vg!`l+IbsyChNEuOj)Ea0t*jpI&uT| z`s)#HEfDRZpS?d{O@NhkxA61%e6C=MOA^~hAiq5qZt@CHQc{PhQvy!B`V9|yD&V23 z#NAg;P6hUEp(xrvf?HFAC=d66k<|+L2kAmlk>$r`F=HLO8|Ma(W0R;WAE&c(VsoLe zLJRGX228#D4gc5QFQVAT1X>*DnS0$Q3tJFdkc-NNv&P(96wA-(SOuWCa~x;S?7-Aft^HTN-ighc`G=wh_iW z;rmxs*1_`CThP$|0MCc2;BW1ZmBDVXwNoRU8)I|VBqmPPV{3p7aS-8mq{wEOxmMu< zVLyZ7DGeG6>+qqPD|Xt-+0Q|w6mM_LmuF|`=Je-&ND!O&J^F@zkn9ix%g zK8&Y7-^cjgY9u+E!B8Ncte1h->fM-p_E-Gxf4hQGe+ywTz~^$5X%Wi->UziG$c-Oy z?Q|jBv{=q-HV3Fe{!!b~m-J-}X9pUwZH2)MW)wAy;Gf=#v*%BsBHk5x)0lDFimv-V z;=lgwM?7qbgCoVmU%ZohMwsrgxs#=F#h~NbU7Sd@<;KHu3#{Nw7~`_yNiBHA?Z)LF ze!x)m7MO8!PMA@mzXxtYUGE({8>z)wdw(qVcZY+MCgF+RE#m|t-S#P+z|-DR*yyv4 zEW+H<{JCcZ+QQ$LLTo4bse@57|DLmWLVBa2>yFJWQ@GV%h4oIx9NyWpC~Lc5UG7d) z=EcE-{DBZN8gPuLMF0I8I93({9lj7VT6U4h+CPZLKi$V<>mDS#SiqPtGo80%n9&HV zB#!wP{P%xcLshUXbcr*3QGSVRu$q8ktK74A{L48sgxEug#xAGkjg2)^cygl~xgJK4 zVnshJ4{7X)_>Rl?_y5;_;Fp0~Bzfy|`3H&j{$vprFSI{@ga;#y*tE=8$bU%mT?3KX ze;2QYir}LsR{TkL7v}P$z%#HzS??2!7cb}jJqI@|-@?;_TS5Z{uTP<;U?nWMJg^iL z)by}2{~(4ZM^GEP3}yusBFntaj$ z6_&TOK=#-ROjUUiUzy%mq69g+P;_1X1y{O4V67=y0H=2*&~irH-b=VMRD)<2Gw`{4 z%R))h31QhKs47f=rw(C;bWBNB1NLi5aQfaIoU9Iqo;v$IS!mdVVMlX69{zA27Y^1V z#nlQX8e*7X-KtlWV&MLt@!$V>6T3qlp#O!KVYw?cbu9#CjN;LsFJNDU6PNRr<9i^c z{1TqrK80dWV-aQ)A!p={sQnl5@BeSY487MhvNel`8KJQ5S;BWNg~;|7c+(XRndv;H zSX*`;#jJdR8X^x~#G}ij7#JKvPj@%QN5?QYI)DQ`P1vz