乐趣区

关于openharmony:开发板如何适配OpenHarmony-32

简介

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 https://github.com/rockchip-linux/u-boot.git

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/vendor_archermind
https://gitee.com/harchermindy/device_board_archermind
https://gitee.com/harchermindy/uboot-rk-openharmony
https://gitee.com/harchermindy/linux-5.10

退出移动版