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

OpenHarmony3.0的樹莓派4B移植-學(xué)習(xí)記錄

系統(tǒng)
以下是學(xué)習(xí) OpenHarmony3.0 樹莓派4B移植的詳細(xì)流程記錄,實(shí)現(xiàn)了觸摸與顯示,并添加了物理按鍵關(guān)機(jī)的功能。希望能給像我一樣第一次接觸移植的嵌入式小白以幫助。

[[443105]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

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

https://harmonyos.51cto.com

前言

以下是學(xué)習(xí) OpenHarmony3.0 樹莓派4B移植的詳細(xì)流程記錄,主要參考:官方移植指南,官方樹莓派3B移植,社區(qū)大佬樹莓派4B移植,LineageOS 樹莓派移植項(xiàng)目:lineage-rpi,Android 樹莓派移植項(xiàng)目:android-rpi。

實(shí)現(xiàn)了觸摸與顯示,并添加了物理按鍵關(guān)機(jī)的功能。希望能給像我一樣第一次接觸移植的嵌入式小白以幫助。

以下步驟操作于 Ubuntu 20.04 LTS 。OHOS 3.0 LTS 源碼解壓自官方鏡像(使用 repo下載得到的最新源碼有較多變化,以下步驟不再適用)。設(shè)項(xiàng)目根目錄名為 OpenHarmony,且控制臺(tái)默認(rèn)處于該目錄。移植系統(tǒng)為OHOS標(biāo)準(zhǔn)版 (standard),內(nèi)核為 Linux-5.10。

定義開發(fā)板

根據(jù)官方移植手冊(cè),對(duì)源碼目錄以及代碼中常出現(xiàn)的幾個(gè)概念進(jìn)行解釋,并在本流程背景下進(jìn)行賦值:

因此,我們首先定義 SOC。建立文件 OpenHarmony/productdefine/common/device/bcm2711.json:

  1.     "device_name""bcm2711"
  2.     "device_company""brcm"
  3.     "target_os""ohos"
  4.     "target_cpu""arm"
  5.     "kernel_version"""
  6.     "device_build_path""device/brcm/build" 

 目前 OHOS 只支持 arm。

接著定義產(chǎn)品。建立文件 OpenHarmony/productdefine/common/products/rpi4.json:

  1.   "product_name""rpi4"
  2.   "product_company""raspberry"
  3.   "product_device""bcm2711"
  4.   "version""2.0"
  5.   "type""standard"
  6.   "product_build_path""device/brcm/build"
  7.   "parts": { 
  8.    ... 
  9.    "brcm_products:brcm_products":{}, 
  10.    ... 
  11.   } 

 其中,… 部分照搬同目錄下的 Hi3516DV300.json,并將其中的 "hisilicon_products:hisilicon_products":{},改為 "brcm_products:brcm_products":{},。

brcm_products 代表內(nèi)核構(gòu)建的子系統(tǒng)。我們需要在 OpenHarmony/build/subsystem_config.json 中定義它,加入鍵值對(duì):

  1. "brcm_products":{ 
  2.    "project""hmf/brcm_products"
  3.    "path""device/brcm/bcm2711/build"
  4.    "name""brcm_products"
  5.    "dir""device/brcm" 
  6.  },   

建立編譯配置組件

接著在 OpenHarmony/device 下仿照 ./hisilicon/hi3516dv300 建立編譯配置組件。目錄結(jié)構(gòu):

  1. device 
  2. └── brcm 
  3.     ├── bcm2711 
  4.     │   ├── build 
  5.     │   │   └── rootfs 
  6.     │   │       ├── BUILD.gn 
  7.     │   │       └── init.rpi4.cfg 
  8.     │   └── BUILD.gn 
  9.     └── build 
  10.         ├── BUILD.gn 
  11.         └── ohos.build 

 OpenHarmony/device/brcm/bcm2711/build/rootfs/BUILD.gn

  1. import("//build/ohos.gni"
  2.  
  3. ohos_prebuilt_etc("init.rpi4.cfg") { 
  4.   source = "init.rpi4.cfg" 
  5.   install_images = [ "system" ] 
  6.   part_name = "brcm_products" 
  7.  
  8. group("init_configs") { 
  9.   deps = [ 
  10.     ":init.rpi4.cfg" 
  11.   ] 

 OpenHarmony/device/brcm/bcm2711/build/rootfs/init.rpi4.cfg

OpenHarmony/device/hisilicon/hi3516dv300/build/rootfs/init.Hi3516DV300.cfg

OpenHarmony/device/brcm/bcm2711/BUILD.gn

  1. import("//build/ohos.gni"
  2.  
  3. print("bcm2711_group in"
  4. group("bcm2711_group") { 
  5.   deps = [ 
  6.     "build/rootfs:init_configs"
  7.     "//kernel/linux/build:linux_kernel" 
  8.   ] 

 OpenHarmony/device/brcm/build/BUILD.gn

  1. import("//build/ohos.gni"
  2.  
  3. group("products_group") { 
  4.   deps = [ 
  5.     "//device/brcm/bcm2711:bcm2711_group" 
  6.   ] 

 OpenHarmony/device/brcm/build/ohos.build

  1.     "subsystem""brcm_products"
  2.     "parts": { 
  3.         "brcm_products": { 
  4.             "module_list": [ 
  5.                 "//device/brcm/build:products_group" 
  6.             ] 
  7.         } 
  8.     } 

內(nèi)核移植

內(nèi)核編譯流程

首先閱讀 OpenHarmony/kernel/linux/build/kernel.mk

  1. $(KERNEL_IMAGE_FILE): 
  2.     $(hide) echo "build kernel..." 
  3.     $(hide) rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfL $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/ 
  4.     $(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(HDF_PATCH_FILE) && patch -p1 -s -N < $(DEVICE_PATCH_FILE) 
  5. ifneq ($(findstring $(BUILD_TYPE), small),) 
  6.     $(hide) cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(SMALL_PATCH_FILE) 
  7. endif 
  8.     $(hide) cp -rf $(KERNEL_CONFIG_PATH)/. $(KERNEL_SRC_TMP_PATH)/ 
  9.     $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) distclean 
  10.     $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(DEFCONFIG_FILE) 
  11. ifeq ($(KERNEL_VERSION), linux-5.10) 
  12.     $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_prepare 
  13. endif 
  14.     $(hide) $(KERNEL_MAKE) -C $(KERNEL_SRC_TMP_PATH) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) -j64 uImage 
  15. endif 

 了解到內(nèi)核編譯的流程:

  1. 刪除 out(編譯輸出目錄)下之前編譯過的內(nèi)核源碼,重新復(fù)制一份 Linux 內(nèi)核源碼OpenHarmony/kernel/linux/linux-5.10 到 OpenHarmony/out/KERNEL_OBJ/kernel/src_tmp/linux-5.10 下。
  2. 對(duì)內(nèi)核源碼打補(bǔ)丁,包括內(nèi)核源碼補(bǔ)丁與 HDF 補(bǔ)丁。補(bǔ)丁需要預(yù)先準(zhǔn)備。
  3. 復(fù)制 defconfig,需要預(yù)先準(zhǔn)備。
  4. make distclean, xxx_defconfig, modules_prepare, uImage.

生成 patch

因此首先準(zhǔn)備樹莓派4B需要的內(nèi)核補(bǔ)?。?/p>

選擇樹莓派官方內(nèi)核 rpi-5.10.y 來生成內(nèi)核源碼補(bǔ)丁。設(shè)控制臺(tái)處在項(xiàng)目根目錄 OpenHarmony 下,依次執(zhí)行:

  1. mkdir ../rpi-kernel && cd $_ 
  2. git clone git://github.com/raspberrypi/linux -b rpi-5.10.y --depth=1 
  3. cd ../OpenHarmony/kernel/linux 
  4. diff -uNr linux-5.10/ /home/username/Project/RPI/rpi-kernel/linux/ > bcm2711.patch 
  5. mkdir patches/linux-5.10/bcm2711_patch && cp bcm2711.patch $_ && cd $_ 
  6. cp ../hi3516dv300_patch/hdf.patch ./ 

 注意 diff 命令:

由于 kernel.mk 中用的是 patch -p1,即忽略掉路徑的第一部分,因此 diff 需作用在 OHOS 自帶的源碼目錄外。

樹莓派官方內(nèi)核源碼需要用絕對(duì)路徑,因人而異。

實(shí)際編譯時(shí)很可能會(huì)因?yàn)?patch 過程中出現(xiàn)沖突而中斷,解決方法:

在 diff 時(shí)忽略源碼目錄下的 .git, .gitgitignore, 以及某設(shè)備樹文件,保證打補(bǔ)丁時(shí)無沖突。

手動(dòng)執(zhí)行 kernel.mk 中的流程。

生成 defconfig

在樹莓派官方 bcm2711_defconfig 基礎(chǔ)上進(jìn)行增改(當(dāng)前位于 OpenHarmony 目錄):

  1. cp ../rpi-kernel/linux/arch/arm/configs/bcm2711_defconfig kernel/linux/config/linux-5.10/arch/arm/configs/bcm2711_standard_defconfig 

 增改主要有:

  1. OHOS上層系統(tǒng)所需:開啟 SELinux, Binder, ALSA。
  2. 顯示:開啟 DRM, VC4。
  3. 觸屏:開啟 INPUT_TOUCHSCREEN, HID_MULTITOUCH, ADS7846, USB_COMPOSITE。因?yàn)槲沂褂玫奈⒀┯|屏控制器為 ADS7846,且是 USB 連線。
  4. 按鍵關(guān)機(jī):開啟 CONFIG_KEYBOARD_GPIO,以將 gpio-key 驅(qū)動(dòng)編譯進(jìn)內(nèi)核。

生成方法:

先進(jìn)行一次內(nèi)核編譯:

  1. ./build.sh --product-name rpi4 --ccache --jobs $(nproc) --build-target brcm_products 

 再進(jìn)入 out 下的內(nèi)核源碼根目錄,利用 menuconfig 配置 .config,最后用 savedefconfig 保存:

  1. cd out/KERNEL_OBJ/kernel/src_tmp/linux-5.10 
  2. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make bcm2711_standard_defconfig 
  3. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make menuconfig 
  4. ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make savedefconfig 
  5. cp savedefconfig ../../../../../kernel/linux/config/linux-5.10/arch/arm/configs/bcm2711_standard_defconfig 

 或者直接對(duì) bcm2711_standard_defconfig 增改以下內(nèi)容:

  1. CONFIG_KEYBOARD_GPIO=y 
  2. CONFIG_TOUCHSCREEN_ADS7846=y 
  3. CONFIG_TOUCHSCREEN_RASPBERRYPI_FW=y 
  4. CONFIG_TOUCHSCREEN_USB_COMPOSITE=y 
  5. CONFIG_DRM=y 
  6. CONFIG_DRM_V3D=y 
  7. CONFIG_DRM_VC4=y 
  8. CONFIG_SND=y 
  9. CONFIG_SND_SOC=y 
  10. CONFIG_HID_MULTITOUCH=y 
  11. CONFIG_ANDROID=y 
  12. CONFIG_ANDROID_BINDER_IPC=y 
  13. # CONFIG_DRIVERS_HDF is not set 
  14. CONFIG_SECURITY_SELINUX=y 
  15. CONFIG_SECURITY_SELINUX_BOOTPARAM=y 
  16. CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 

 由于本流程沒有移植 HDF,因此不開啟 HDF 驅(qū)動(dòng)。

編譯腳本修正

源碼編譯腳本默認(rèn)生成 uImage,這要求樹莓派4B用 u-boot 引導(dǎo),比較費(fèi)事。因此將 kernel/linux/build/ 目錄下的kernel.mk, build_kernel.sh, BUILD.gn ,kernel_module_build.sh 中的 uImage 都改為 zImage。

事實(shí)上不修改也沒有關(guān)系。在最終生成 uImage 之前,內(nèi)核編譯時(shí)會(huì)在 boot 下首先生成 zImage,手動(dòng)將其復(fù)制到鏡像輸出目錄即可:

  1. cp out/KERNEL_OBJ/kernel/src_tmp/linux-5.10/arch/arm/boot/zImage out/ohos-arm-release/packages/phone/images 

顯示與觸摸配置

顯示

  1. vi third_party/weston/weston.ini 

最后添加:

  1. [output
  2. name=card0 

 不設(shè)置一般也沒有關(guān)系,默認(rèn)通過card0節(jié)點(diǎn)顯示。如果輸出節(jié)點(diǎn)為 HDMI-A-1 并需要旋轉(zhuǎn),則添加:

  1. [output
  2. name=HDMI-A-1 
  3. transform=rotate-90 

觸摸

  1. vi third_party/eudev/rules.d/touchscreen.rules 

 修改為:

  1. ATTRS{name}=="WaveShare WS170120", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1" 
  2. ATTRS{name}=="VSoC keyboard", ENV{ID_INPUT}="1", ENV{ID_INPUT_KEYBOARD}="1" 
  3. DRIVERS=="hid-multitouch", ENV{ID_INPUT}="1", ENV{ID_INPUT_TOUCHSCREEN}="1" 

 其中 WaveShare WS170120 為微雪觸摸屏插入 usb 后,在 /sys/dev/char/xx\:xx/device/uevent 查詢得到的設(shè)備名。支持 hid-multitouch 。

其它修正

init.cfg

初始化配置文件,類似于 Android 里的 init.rc

  1. vi /base/startup/init_lite/services/etc/init.cfg 

 進(jìn)行修改:

  1. -           "/etc/init.Hi3516DV300.cfg" 
  2. +           "/etc/init.rpi4.cfg" 
  1. -                "mount ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor /vendor wait rdonly barrier=1"
  2. -                "mount ext4 /dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc" 
  3. +                "mount ext4 /dev/block/mmcblk0p3 /vendor wait rdonly barrier=1"
  4. +                "mount ext4 /dev/block/mmcblk0p4 /data wait nosuid nodev noatime barrier=1,data=ordered,noauto_da_alloc" 

vendor

雖然沒有移植 HDF 驅(qū)動(dòng),但是相關(guān)文件對(duì)內(nèi)核編譯流程是必要的。在 OpenHarmony/vendor 下新建文件,目錄結(jié)構(gòu)如下所示:

  1. vendor 
  2. └── raspberry 
  3.     └── rpi4 
  4.         └── hdf_config 
  5.             ├── hdf.hcs 
  6.             ├── hdf_test 
  7.             │   ├── hdf.hcs 
  8.             │   └── Makefile 
  9.             ├── khdf 
  10.             │   ├── hdf.hcs 
  11.             │   └── Makefile 
  12.             ├── Makefile 
  13.             └── uhdf 
  14.                 └── hdf.hcs 

 其中 hdf.hcs 均為:

  1. root { 
  2.     module = "default"

 Makefile 均拷貝自 OpenHarmony/vendor/hisilicon/Hi3516DV300/hdf_config/khdf/Makefile

camera.rpi4.gni

雖然沒有移植 camera 驅(qū)動(dòng),但也對(duì)編譯是必要的,否則報(bào)錯(cuò):

  1. cp drivers/peripheral/camera/hal/adapter/chipset/gni/camera.rpi3.gni drivers/peripheral/camera/hal/adapter/chipset/gni/camera.rpi4.gni 

鏡像大小

鏡像大小可以在 OpenHarmony/build/ohos/images/mkimage/ 下的 xxx_image_conf.txt 里修改。

編譯

在根目錄 OpenHarmony 下執(zhí)行:

  1. bash build/prebuilts_download.sh 

下載的第三方開源軟件壓縮包存放于 OpenHarmony 同目錄下的 OpenHarmony_2.0_canary_prebuilts。其中腳本在用 wget 下載 mingw-w64 時(shí),由于后者過大可能觸發(fā) Segmentation fault (core dumped) 。目前還沒有找到比較好的解決方法,只有用其它下載工具手動(dòng)從華為鏡像下載 clang-mingw.tar.gz 后再放進(jìn)去。

編譯:

  1. ./build.sh --product-name rpi4 --ccache --jobs $(nproc) 

 編譯內(nèi)核前腳本會(huì)在控制臺(tái)打印編譯命令,這方便我們?cè)诔鲥e(cuò)后或是修改config后,到內(nèi)核源碼根目錄手動(dòng)編譯。手動(dòng)編譯時(shí)可能會(huì)出現(xiàn)找不到環(huán)境變量 PRODUCT_PATH 的錯(cuò)誤,手動(dòng)設(shè)置:

  1. export PRODUCT_PATH=vendor/raspberry/rpi4  

制作SD卡并啟動(dòng)

分區(qū)與格式化

利用 fdisk 設(shè)置 sd 卡分區(qū):

  1. sudo fdisk /dev/mmcblk0 

步驟:

  1. 刪除既有分區(qū)。(d 命令)
  2. 新建四個(gè)主分區(qū),分別對(duì)應(yīng) boot, system, vendor 與 userdata。大小由對(duì)應(yīng)鏡像決定。(n 命令)
  3. 設(shè)置 p1 分區(qū)文件類型為 W95 FAT32 (LBA)。(t 命令后選擇 c)
  4. 為 p1 分區(qū)添加可啟動(dòng)標(biāo)志。(a 命令)

可能的最終效果(p 命令):

設(shè)備 啟動(dòng) 起點(diǎn) 末尾 扇區(qū) 大小 Id 類型

  1. 設(shè)備           啟動(dòng)    起點(diǎn)     末尾     扇區(qū)  大小 Id 類型 
  2. /dev/mmcblk0p1 *       2048   264191   262144  128M  c W95 FAT32 (LBA) 
  3. /dev/mmcblk0p2       264192  4458495  4194304    2G 83 Linux 
  4. /dev/mmcblk0p3      4458496  5507071  1048576  512M 83 Linux 
  5. /dev/mmcblk0p4      5507072 62333951 56826880 27.1G 83 Linux 

 對(duì)應(yīng)的 fdisk 內(nèi)命令執(zhí)行序列:

  1. n p 1 +128M n p 2 +2G n p 3 +512M n p t 1 c a 1 w 

 格式化:

  1. sudo mkfs.msdos /dev/mmcblk0p1 -n boot 
  2. sudo mkfs.ext4 /dev/mmcblk0p2 
  3. sudo mkfs.ext4 /dev/mmcblk0p3 
  4. sudo mkfs.ext4 /dev/mmcblk0p4 

制備boot

基于樹莓派官方 firmware。設(shè) boot 分區(qū) /dev/mmcblk0p1 已經(jīng)掛載到 /media/username/boot 下:

  1. cd ../ && git clone git://github.com/raspberrypi/firmware --depth=1 
  2. cp firmware/boot/{overlays,bcm2711-rpi-4-b.dtb,bcm2711-rpi-400.dtb,bcm2711-rpi-cm4.dtb,cmdline.txt,config.txt,fixup4.dat,fixup4x.dat,start4.elf,start4x.elf} /media/username/boot -r 
  3. cp OpenHarmony/out/ohos-arm-release/packages/phone/images/zImage /media/username/boot 

 修改 config.txt :

  1. vi /media/username/boot/config.txt 
  1. # Kernel 
  2. kernel=zImage 
  3.  
  4. # waveshare touchscreen 
  5. max_usb_current=1 
  6. hdmi_group=2 
  7. hdmi_mode=87 
  8. hdmi_cvt 800 480 60 6 0 0 0 
  9. hdmi_drive=1 
  10.  
  11. # fake KMS 
  12. dtoverlay=vc4-fkms-v3d 
  13.  
  14. enable_uart=1 
  15.  
  16. output diagnostic information 
  17. uart_2ndstage=1 
  18.  
  19. for hardware power button 
  20. dtoverlay=gpio-key,gpio=3,keycode=116,label="POWER" 

 修改 cmdline.txt :

  1. vi /media/username/boot/cmdline.txt 
  1. console=serial0,115200 no_console_suspend root=/dev/mmcblk0p2 elevator=deadline rootwait spidev.bufsiz=65536 androidboot.hardware=rpi4 androidboot.selinux=permissive 

刷寫鏡像

  1. cd OpenHarmony/out/ohos-arm-release/packages/phone/images 
  2. sudo dd if=system.img of=/dev/mmcblk0p2 bs=1M 
  3. sudo dd if=vendor.img of=/dev/mmcblk0p3 bs=1M 
  4. sudo dd if=userdata.img of=/dev/mmcblk0p4 bs=1M 

啟動(dòng)

為使微雪觸摸屏成功顯示,須滿足以下三個(gè)條件:

config.txt : 手動(dòng)設(shè)置 HDMI 輸出配置(來自官網(wǎng)要求:5inch_HDMI_LCD)

  1. max_usb_current=1 
  2. hdmi_group=2 
  3. hdmi_mode=87 
  4. hdmi_cvt 800 480 60 6 0 0 0 
  5. hdmi_drive=1 

 config.txt : dtoverlay=vc4-fkms-v3d 啟用 fake KMS

至少要在顯示器啟動(dòng)前插入樹莓派,且是遠(yuǎn)離 Type-C 的 Micro HDMI 口。保證樹莓派能識(shí)別到屏幕。

按鍵關(guān)機(jī)

在配置內(nèi)核編譯 defconfig 時(shí),我們開啟了 CONFIG_KEYBOARD_GPIO 以將 gpio-key 編譯進(jìn)內(nèi)核——這是一個(gè)與體系結(jié)構(gòu)無關(guān)的 GPIO 按鍵驅(qū)動(dòng)。只需要在設(shè)備樹 gpio-key 節(jié)點(diǎn)添加需要的按鍵子節(jié)點(diǎn)后即可將 GPIO 狀態(tài)變化轉(zhuǎn)換為按鍵事件。

而樹莓派官方已經(jīng)有相應(yīng)實(shí)現(xiàn)(詳見 rpi-kernel/linux/arch/arm/boot/dts/overlays/README),只需要在 config.txt 開啟即可:

  1. dtoverlay=gpio-key,gpio=3,keycode=116,label="POWER" 

這樣,GPIO3 會(huì)被默認(rèn)拉高,當(dāng)它被接地時(shí) gpio-key 就會(huì)將其轉(zhuǎn)化為鍵碼值 116 的按鍵事件輸出到 /dev/input/event0。

在主流的 Linux 發(fā)行版上(如基于 Debian 的 Raspbian OS),systemd 自帶按鍵事件監(jiān)聽進(jìn)程,只需在 /etc/systemd/logind.conf 中取消注釋 HandlePowerKey = ignore 即可實(shí)現(xiàn)物理按鍵(或按 F5)關(guān)機(jī)。

Android 與 OpenHarmony 雖然不用 systemd,但可以運(yùn)行服務(wù)。因此我們自己寫一個(gè)簡(jiǎn)單的守護(hù)程序:

  1. mkdir ../event0reader && cd $_ 
  2. vi event0reader.c 
  1. #include <stdio.h> 
  2. #include <linux/input.h> 
  3. #include <stdlib.h> 
  4. #include <sys/types.h> 
  5. #include <sys/stat.h> 
  6. #include <fcntl.h> 
  7. #include <unistd.h>  
  8.   
  9. #define DEV_PATH "/dev/input/event0" 
  10.   
  11. int main() 
  12.     int keys_fd; 
  13.     int ret=0; 
  14.     struct input_event t; 
  15.     keys_fd=open(DEV_PATH, O_RDONLY); 
  16.     if(keys_fd <= 0) 
  17.     { 
  18.         printf("open /dev/input/event0 device error!\n"); 
  19.         return -1; 
  20.     } 
  21.     while(1) 
  22.     { 
  23.         if(read(keys_fd, &t, sizeof(t)) == sizeof(t)) 
  24.         { 
  25.             if(t.type==EV_KEY && t.code==116 && t.value==1) 
  26.             { 
  27.                 ret=system("/bin/reboot shutdown"); 
  28.                 if (ret == -1) 
  29.                 { 
  30.                     printf("failed to shutdown!\n"); 
  31.                     return -1; 
  32.                 } 
  33.             } 
  34.         } 
  35.         usleep(100000); 
  36.     } 
  37.     close(keys_fd); 
  38.     return 0; 

其中 /bin/reboot 是 OHOS 自帶的重啟/關(guān)機(jī)程序,源碼位于 OpenHarmony/base/startup/init_lite/services/cmds/reboot/init_cmd_reboot.c。

使用靜態(tài)鏈接庫編譯以保證程序成功運(yùn)行。設(shè) system 分區(qū) /dev/mmcblk0p2 已經(jīng)掛載到 /media/username/_ 下:

  1. arm-linux-gnueabihf-gcc event0reader.c -o myservice -static 
  2. sudo cp myservice /media/username/_/system/bin/ 
  3. sudo chmod 777 /media/username/_/system/bin/myservice 
  4. sudo chgrp 2000 /media/username/_/system/bin/myservice 

 在 OHOS 初始化時(shí),內(nèi)核會(huì)遍歷 /system/etc/init/ 下的所有初始化配置。我們?cè)谠撃夸浵聦懸粋€(gè)對(duì)應(yīng)的 myservice.cfg:

  1. sudo vi /media/username/_/system/etc/init/myservice.cfg 
  1.     "jobs" : [{ 
  2.             "name" : "post-fs"
  3.             "cmds" : [ 
  4.                 "start myservice_shutdown" 
  5.             ] 
  6.         } 
  7.     ], 
  8.     "services" : [{ 
  9.             "name" : "myservice_shutdown"
  10.             "path" : ["/system/bin/myservice"], 
  11.             "uid" :  "root"
  12.             "gid" : ["system""shell"
  13.         } 
  14.    ] 

 當(dāng)我們?cè)趦?nèi)核啟動(dòng)時(shí)觀察到如下信息:

  1. # dmesg |grep myservice 
  2. [    3.722287] [pid=1][init_read_cfg.c:110][Init][INFO] ReadCfgs :/system/etc/init/myservice.cfg from /system/etc/init success. 
  3. [    7.558109] [pid=1][param_service.c:263][Init][INFO] SystemWriteParam name init.svc.myservice_shutdown value: running 
  4. [    7.558618] [pid=116][init_service.c:200][Init][INFO] service->name is myservice_shutdown  
  5. [    7.569011] [pid=1][trigger_processor.c:165][Init][INFO] PostParamTrigger init.svc.myservice_shutdown success 

 則意味著 myservice 成功啟動(dòng)了,可以利用物理按鍵關(guān)機(jī)。接線示意圖:

#星光計(jì)劃2.0# OpenHarmony3.0的樹莓派4B移植-學(xué)習(xí)記錄-鴻蒙HarmonyOS技術(shù)社區(qū)

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

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

https://harmonyos.51cto.com

 

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

2021-11-23 15:35:05

鴻蒙HarmonyOS應(yīng)用

2021-11-29 15:17:48

鴻蒙HarmonyOS應(yīng)用

2021-12-09 10:11:04

鴻蒙HarmonyOS應(yīng)用

2022-01-04 15:35:51

鴻蒙HarmonyOS應(yīng)用

2022-06-21 11:02:27

系統(tǒng)移植鴻蒙

2021-11-24 10:09:41

鴻蒙樹莓操作系統(tǒng)

2021-12-29 16:11:11

鴻蒙HarmonyOS應(yīng)用

2021-11-08 07:19:45

鴻蒙HarmonyOS應(yīng)用

2021-12-03 09:50:39

鴻蒙HarmonyOS應(yīng)用

2022-01-07 09:56:16

鴻蒙HarmonyOS應(yīng)用

2021-01-26 13:50:43

鴻蒙HarmonyOS應(yīng)用開發(fā)

2021-01-25 16:39:08

鴻蒙HarmonyOS添加單板

2021-11-09 15:28:41

鴻蒙HarmonyOS應(yīng)用

2021-10-14 15:48:28

鴻蒙HarmonyOS應(yīng)用

2021-01-25 16:28:10

鴻蒙HarmonyOS搭建環(huán)境

2019-04-11 11:40:32

樹莓派編程語言Linux

2019-03-31 08:00:02

樹莓派更新樹莓派 Linux

2019-03-28 18:51:52

樹莓派Linux編程語言

2019-03-24 20:30:18

樹莓派Linux

2021-03-29 21:24:40

樹莓派Linux
點(diǎn)贊
收藏

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