開發板如何適配OpenHarmony 3.2
簡介
OpenAtom OpenHarmony(以下簡稱“OpenHarmony”) 3.2 Beta5版本在OpenHarmony 3.1 Release版本的基礎上,有以下改變:效能上有很大的提升、標準系統應用開發框架增強、標準系統分散式能力增強。
本文介紹誠邁科技基於RK3568設計的HCPAD-100開發板以及基於RK3566設計的中控屏HongzPad2022在OpenHarmony 3.2 Beta5版本上的適配過程。
涉及到開發板的新增/u-boot /linux-5.10/分割槽表/根檔案系統/顯示/觸控/USB的移植過程以及OpenHarmony所依賴的驅動特性介紹。
如何新增新的開發板進行編譯
參照DAYU200的工程配置檔案我們新建自己的編譯命令。1)在device/board/目錄新建archermind目錄,新建rk3568/rk3588/rk3399目錄,並新增相關的工程檔案。
2)在vendor目錄新建archermind目錄。新建以下幾個目錄,並新增相關的工程檔案。
3)修改vendor/archermind/hongzos_rk3568/config.json檔案,product_name改成hongzos_rk3568,device_build_path改成第一步新建的目錄。
{ "product_name": "hongzos_rk3568", "device_company": "rockchip", "device_build_path": "device/board/archermind/rk3568", "target_cpu": "arm", "type": "standard", "version": "3.0", "board": "rk3568",
透過./build.sh --product-name hongzos_rk3568來編譯出我們自己開發板的映象,編譯完後對應開發板的image映象放在out/rk3568/packages/phone/目錄。相關程式碼放在文章最後的參考連結。
U-Boot移植
U-boot是透過二進位制映象直接放在device/board/hihope/rk3568/loader目錄下的,這個目錄下涉及到檔案如下:
1)下載rk官方釋出的uboot原始碼
git clone
2)修改make.sh, 指定RKBIN_TOOLS的路徑
RKBIN_TOOLS=rkbin/tools
3)增加程式碼讀取ramdisk分割槽到指定的記憶體位置,修改cmd/pxe.c
#include "boot_rkimg.h" #define BLK_CNT(_num_bytes, _block_size) \ ((_num_bytes + _block_size - 1) / _block_size) static char* load_ramdisk_from_partition(void *buffer) { struct blk_desc *desc = rockchip_get_bootdev(); disk_partition_t part_ramdisk_boot; static char initrd_str[28]; long blk_cnt = 0, blks_read = 0; long blk_start = 0; if (part_get_info_by_name(desc, "ramdisk", &part_ramdisk_boot) < 0) { printf("No ramdisk partition\n"); return NULL; } blk_cnt = part_ramdisk_boot.size; blk_start = part_ramdisk_boot.start; printf("Load from partition ' ramdisk ' to address 0x%p, count: %ld total block(s) by ludao\n", buffer, blk_cnt); blks_read = blk_dread(desc, blk_start, blk_cnt, buffer); if (blks_read != blk_cnt) { return NULL; } printf("Read from partition ' ramdisk ' done, from 0x%lx total block(s) 0x%lx\n", blk_start, blk_cnt); sprintf(initrd_str, "0x%p:0x%lx", buffer, blk_cnt*(part_ramdisk_boot.blksz)); printf("Openharmony ramdisk_addr_r = %s\n", initrd_str); return initrd_str; } static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label) if (label->initrd) { if (get_relfile_envaddr(cmdtp, label->initrd, "ramdisk_addr_r") < 0) { printf("Skipping %s for failure retrieving initrd\n", label->name); return 1; } bootm_argv[2] = initrd_str; strncpy(bootm_argv[2], env_get("ramdisk_addr_r"), 18); strcat(bootm_argv[2], ":"); strncat(bootm_argv[2], env_get("filesize"), 9); }else{ void *buffer = (void *)env_get_ulong("ramdisk_addr_r", 16, 0); bootm_argv[2] = load_ramdisk_from_partition(buffer); if(bootm_argv[2]){ printk("initrd = %s \n", bootm_argv[2]); } }
4)指定交叉編譯器和平臺開始編譯,編譯完成後根目錄會生成u-boot.bin
./make.sh CROSS_COMPILE=aarch64-linux-gnu- rk3568
所有相關程式碼已經放到開源社群,大家可以下載下來直接編譯使用,相關程式碼放在文章最後的參考連結。
Linux-5.10移植
1)核心編譯指令碼
linux編譯指令碼的是放在device/board/hihope/rk3568/kernel目錄下的build_kernel.sh檔案,由於kernel/linux/linux-5.10是公共程式碼,OpenHarmony編譯指令碼是透過打補丁的方式來適配不同平臺,不同的平臺有自己的核心補丁。
編譯指令碼會先把kernel/linux/linux-5.10複製到out/kernel/src_tmp/linux-5.10/,然後打上3568的核心補丁patch -p1 < kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch後編譯生成自己的映象,不利於我們開發,我們自己開發過程中做如下修改,這樣方便我們開發過程中的修改。
先進入kernel/linux/linux-5.10目錄 patch -p1 < kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch 修改device/board/hihope/rk3568/kernel/build_kernel.sh 註釋掉 //patch -p1 < ${KERNEL_PATCH}
2)裝置樹的定製,首先我們需要有自己的板子的裝置樹例如rk3568-chujue-linux.dts
把裝置樹放到kernel/linux/linux-5.10/arch/arm64/boot/dts/rockchip/目錄 修改kernel/linux/linux-5.10/ make-ohos.sh model_list=( "TB-RK3568X0 arm64 0xfe660000 rk3568-toybrick-x0-linux Image rockchip_linux_defconfig" "TB-RK3568X10 arm64 0xfe660000 rk3568-toybrick-x10-linux Image rockchip_linux_defconfig" )
修改其中的TB-RK3568X0,把rk3568-toybrick-x0-linux改成我們自己的rk3568-chujue-linux.dts,
TB-RK3568X0是在device/board/hihope/rk3568/kernel/build_kernel.sh指定的
這樣程式設計後生產裝置樹就是我們自己開發板的,裝置樹如果不對,機器將會無法開機,U-boot也會無法開啟。
3)核心config的定製
檔案位置kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig3.2 顯示裝置需要開啟CONFIG_DRM_PANEL_SIMPLE配置顯示才能正常顯示
CONFIG_DRM_PANEL_SIMPLE = y kernel/linux/linux-5.10/drivers/gpu/drm/panel/panel-simple.c 註釋掉 //int panel_simple_loader_protect(struct drm_panel *panel)
4)啟動Logo定製修改device/board/hihope/rk3568/kernel目錄的圖片即可
5)啟動引數的定製
kernel/linux/linux-5.10/ make-ohos.sh
cmdline="append earlycon=uart8250,mmio32,${uart} root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4
分割槽表
1)rk3568取樣的是GPT格式的分割槽表,v3.2新增加了三個分割槽sys_prod, chip-prod,ramdisk透過修改以下檔案來修改分割槽表的配置,我們可以直接使用dayu開發板的分割槽表。device/board/hihope/rk3568/loader/parameter.txt
FIRMWARE_VER:11.0 MACHINE_MODEL:rk3568_r MACHINE_ID:007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: rk3568_r CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE:mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00003000@0x00006000(resource),0x00030000@0x00009000(boot_linux:bootable),0x00002000@0x00039000(ramdisk),0x00400000@0x0003B000(system),0x00200000@0x0043B000(vendor),0x00019000@0x0063B000(sys-prod),0x00019000@0x00654000(chip-prod),0x00010000@0x0066D000(updater),-@0x0067D000(userdata:grow) uuid:system=614e0000-0000-4b53-8000-1d28000054a9 uuid:boot_linux=a2d37d82-51e0-420d-83f5-470db993dd35
device/board/hihope/rk3568/cfg/fstab.rk3568
# fstab file. #<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags> /dev/block/platform/fe310000.sdhci/by-name/system /usr ext4 ro,barrier=1 wait,required /dev/block/platform/fe310000.sdhci/by-name/vendor /vendor ext4 ro,barrier=1 wait,required /dev/block/platform/fe310000.sdhci/by-name/sys-prod /sys_prod ext4 ro,barrier=1 wait /dev/block/platform/fe310000.sdhci/by-name/chip-prod /chip_prod ext4 ro,barrier=1 wait /dev/block/platform/fe310000.sdhci/by-name/userdata /data f2fs discard,noatime,nosuid,nodev,fscrypt=2:aes-256-cts:aes-256-xts wait,check,fileencryption=software,quota /dev/block/platform/fe310000.sdhci/by-name/misc /misc none none wait,required
2)如何修改RKDevTool.exe工具載入的分割槽表
parameter.txt檔案中的CMDLINE欄位中有mtdparts=,其中0x00002000@0x00002000(uboot)的括號裡面是分割槽的名字,@後面的0x00002000是分割槽的開始地址,以4k為單位的偏移地址,@前面是分割槽的大小,注意修改的時候要注意連續性,不要有重疊的位置。
根檔案系統
1)ramdisk從3.1到3.2的變化
3.1中ramdisk.Img是放在out/kernel/src_tmp/linux-5.10/boot_linux/目錄下被打包到boot_linux.img中。
3.2的ramdisk.Img是直接放在單獨的分割槽裡面,由Boot在開機的模式不同的情況下選擇載入不同的根檔案系統
2)如何修改ramdisk
在.gn檔案裡面新增對應的配置檔案,生成的檔案將會被放到ramdisk映象裡面
image_list += [ "ramdisk", "updater_ramdisk", ]
顯示模組適配
1)Devices tree配置
透過裝置樹來開啟mipi 通道1的配置和hdmi的裝置,OpenHarmony 3.2 Beta5 是支援多屏異顯的,OpenHarmony 3.1 Release 不支援。
&dsi1 { status = "okay"; //rockchip,lane-rate = <200>; dsi1_panel: panel@0 { status = "okay"; compatible = "simple-panel-dsi"; reg = <0>; backlight = <&backlight>; reset-delay-ms = <60>; enable-delay-ms = <60>; prepare-delay-ms = <60>; unprepare-delay-ms = <60>; disable-delay-ms = <60>; dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>; dsi,format = <MIPI_DSI_FMT_RGB888>; dsi,lanes = <4>; panel-init-sequence = [ 05 78 01 11 05 14 01 29 ]; panel-exit-sequence = [ 05 00 01 28 05 00 01 10 ]; disp_timings1: display-timings { native-mode = <&dsi1_timing0>; dsi1_timing0: timing0 { clock-frequency = <150000000>; hactive = <1200>; vactive = <1920>; hback-porch = <120>; hfront-porch = <10>; vback-porch = <10>; &hdmi { status = "okay"; rockchip,phy-table = <92812500 0x8009 0x0000 0x0270>, <165000000 0x800b 0x0000 0x026d>, <185625000 0x800b 0x0000 0x01ed>, <297000000 0x800b 0x0000 0x01ad>, <594000000 0x8029 0x0000 0x0088>, <000000000 0x0000 0x0000 0x0000>; };
2)核心開啟相關的配置
3.2中預設關閉了CONFIG_DRM_PANEL_SIMPLE,但是我們的裝置數中欄位需要依賴這個配置項,所以需要開啟它。
CONFIG_DRM_PANEL_SIMPLE=y CONFIG_DRM_ANALOGIX_DP=y CONFIG_DRM_DW_HDMI=y CONFIG_DRM_DW_HDMI_I2S_AUDIO=y CONFIG_DRM_DW_HDMI_CEC=y CONFIG_DRM_DW_MIPI_DSI=y
3)HAL層的適配
原始碼結構
顯示HDI需要適配兩部分:gralloc 和 display_device。
display device適配
display device模組提供顯示裝置管理、layer管理、硬體加速等功能。
drm裝置節點定義
在//device/soc/rockchip/rk3568/hardware/display/src/display_device/drm_device.cpp檔案中,可根據實際情況修改
std::shared_ptr<HdiDeviceInterface> DrmDevice::Create() { DISPLAY_DEBUGLOG(); if (mDrmFd == nullptr) { const std::string name("rockchip"); int drmFd = open("/dev/dri/card0", O_RDWR | O_CLOEXEC); // drmOpen(name.c_str(), nullptr); }
如開發板不支援硬體合成或是有問題的時候,需要在drm_display.cpp檔案中跳過gfx的初始化。
int32_t DrmDisplay::Init() { ... ... ret = preComp->Init(); // gfx初始化,這裡需要跳過 DISPLAY_CHK_RETURN((ret != DISPLAY_SUCCESS), DISPLAY_FAILURE, DISPLAY_LOGE("can not init HdiGfxComposition")); // 或者不判斷返回值 }
同時在//device/soc/rockchip/rk3568/hardware/display/src//hdi_gfx_composition.cpp檔案中修改set_layers方法,全部使用CPU合成顯示。
int32_t HdiGfxComposition::SetLayers(std::vector<HdiLayer *> &layers, HdiLayer &clientLayer) { #if 0 // CPU合成 layer->SetDeviceSelect(COMPOSITION_CLIENT); #else if ((layer->GetCompositionType() != COMPOSITION_VIDEO) && (layer->GetCompositionType() != COMPOSITION_CURSOR)) { layer->SetDeviceSelect(COMPOSITION_DEVICE); } else { layer->SetDeviceSelect(layer->GetCompositionType()); } #endif }
gralloc適配
gralloc模組提供顯示記憶體管理功能,OpenHarmony提供了使用與Hi3516DV300參考實現。drm裝置節點定義在
//device/soc/rockchip/rk3568/hardware/display/src/display_gralloc/display_gralloc_gbm.c檔案中,可根據實際情況修改
const char *g_drmFileNode = "/dev/dri/card0";
1)Devices tree配置
我們的開發板使用的是gt9XX的觸控式螢幕,所以我們把相關的資訊配置進去。
gt9xx: gt911@14 { compatible = "goodix,gt9xx"; reg = <0x14>; pinctrl-names = "default"; pinctrl-0 = <&tp_gpio>; goodix_irq_gpio = <&gpio3 RK_PB4 IRQ_TYPE_LEVEL_LOW>; goodix_rst_gpio = <&gpio3 RK_PB3 GPIO_ACTIVE_HIGH>; /*touchscreen-inverted-x;*/ status = "okay"; };
2)核心驅動配置
開啟核心配置CONFIG_TOUCHSCREEN_GT9XX=y
驅動原始碼裡面把所有ABS_MT_WIDTH_MAJOR相關的屬性去掉。3.2不識別有這個屬性的輸入裝置。
kernel/linux/linux-5.10/drivers/input/touchscreen/gt9xx/gt9xx.c
//input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
USB除錯適配
1) 除錯工具
開發板的USB host是標準的linux驅動架構,OpenHarmony 對這塊基本不需要做修改,USB的裝置包括滑鼠,sdcard都會預設支援。
USB 作為devices,最常用的功能是連線電腦,用電腦端的hdc shell來除錯裝置,這樣我們才能在後續工作中抓取日誌分析。
hdc shell “dmesg -Tw” 實時獲取kernel 日誌
hdc shell “hilog” 獲取OpenHarmony 日誌
2)USB devices裝置的埠選擇
init.rk3568.usb.cfg檔案中有Usb初始化引數設定,其中最主要的是
sys.usb.controller設定成正確的基地址以及裝置型別
"setparam sys.usb.controller fcc00000.dwc3"
總結
至此我們的開發板擁有自己的開發基線,也已經可以進入到桌面,觸控式螢幕,USB滑鼠,hdc除錯都已經正常工作,我們接下來進行下一階段的適配工作。
參考連結
以下是原始碼倉庫地址
https://gitee.com/harchermindy/device_board_archermind
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011554/viewspace-2943703/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 黃吉——如何適配OpenHarmony自有音訊框架ADM?音訊框架
- OpenHarmony-RK3568開發板操作梳理
- Unity中國全面支援OpenHarmony遊戲開發,多款遊戲率先完成適配Unity遊戲開發
- Taro 3.5 canary 釋出:支援適配 鴻蒙&&OpenHarmony鴻蒙
- 全志T113-i開發板適配LVDS螢幕的過程
- OpenHarmony 3.2 Beta Audio——音訊渲染音訊
- OpenHarmony 明星開發板和應用招募啟動,等你來!
- 匯頂科技GR551x系列開發板已支援OpenHarmony
- 熊磊:成功移植OpenHarmony到多套開發板,是最開心的事
- OpenHarmony輕量裝置Hi3861晶片開發板啟動流程分析晶片
- 短視訊軟體開發,ios啟動圖適配和啟動圖示適配iOS
- OpenHarmony 3.2 Beta多媒體系列——影片錄製
- HarmonyOS NEXT應用開發之深色模式適配模式
- 李俊剛:我是如何在OpenHarmony完成ap6275s WiFi驅動的HDF適配工作的?WiFi
- OpenHarmony 3.2 Beta多媒體系列——音影片播放框架框架
- 未來已來,OpenHarmony 3.2 Release釋出,邁入發展新階段
- Android開發之平板和橫豎屏適配-RecyclerViewAndroidView
- OpenHarmony SystemUI開發記錄SystemUI
- Android適配: 拉伸適配的缺點Android
- 技術分享 | MySQL 如何適配 AppArmorMySqlAPP
- flutter 螢幕尺寸適配 字型大小適配Flutter
- Android適配Android
- dimens適配
- iphoneX適配iPhone
- 推進相容適配,使能協同發展 GBase 6月適配速遞
- 推進相容適配,使能協同發展 GBase 5月適配速遞
- Omi 多端開發之 - omip 適配 h5 原理揭祕H5
- Android螢幕適配(理論適配100%機型)Android
- WebView iPhoneX適配WebViewiPhone
- iphoneX,XsMax適配iPhone
- 裝置適配
- 適配問題
- 螢幕適配
- WWDC 2018:快速將開發專案適配所有的iOS裝置iOS
- Win11開發全新右鍵選單,WinRAR已完成適配
- 開源 Python 發行版 Anaconda 適配蘋果 M1 MacPython蘋果Mac
- android螢幕適配三:通過畫素密度適配Android
- 輕鬆掌握移動端web開發【尺寸適配】常用解決方案Web