点击蓝字 ╳ 关注我们
开源项目 openharmony是每个人的 openharmony
陆道
诚迈科技高级技术专家
简介
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) initrd) {
if (get_relfile_envaddr(cmdtp, label->initrd, ramdisk_addr_r) 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 , 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.shcmdline=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.txtfirmware_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-470db993dd35device/board/hihope/rk3568/cfg/fstab.rk3568# fstab file.
#
/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=2aes-256-xts wait,check,fileencryption=software,quota
/dev/block/platform/fe310000.sdhci/by-name/misc /misc none none wait,required2)如何修改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 = ;
dsi1_panel: panel@0 {
status = okay;
compatible = simple-panel-dsi;
reg = ;
backlight = ;
reset-delay-ms = ;
enable-delay-ms = ;
prepare-delay-ms = ;
unprepare-delay-ms = ;
disable-delay-ms = ;
dsi,flags = ;
dsi,format = ;
dsi,lanes = ;
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: timing0 {
clock-frequency = ;
hactive = ;
vactive = ;
hback-porch = ;
hfront-porch = ;
vback-porch = ;
&hdmi {
status = okay;
rockchip,phy-table =
,
,
,
,
,
;
};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=y3)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 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::vector &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 = ;
pinctrl-names = default;
pinctrl-0 = ;
goodix_irq_gpio = ;
goodix_rst_gpio = ;
/*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
原文标题:开发板如何适配openharmony 3.2
文章出处:【微信公众号:openatom openharmony】欢迎添加关注!文章转载请注明出处。
液压电磁换向阀的详细介绍
半导体行业简单地去中间化 企业利润就一定会最大化吗?
基于80C32单片机和SPC3芯片的通讯适配器实现纸机控制系统的设计
CDMA2000核心网演进组网策略探讨
安装使用蒸汽回收机的方案及注意事项是什么
开发板如何适配OpenHarmony 3.2
来看看各种焊接不良~
关于波形发生器,你知道多少?
多家企业正式立项联盟标准人工光叶菜生产LED光照系统一般技术要求
华为表示澳大利亚政府的5G禁令将会导致数十亿的投资订单枯竭
腾讯叮当自主设计的带屏幕智能音箱 搭载了高清屏和全栈AI解决方案
仙知机器人解决各种应用难题 助力客户真正实现智能物流及智能制造
扩展600V输入、无光耦合器隔离式反激式控制器的电源电压
网络布线传输距离是多少米 100米是极限吗?
国内OLED行业处于高速发展时期,产能放量在即
2023年SiC衬底市场将持续强劲增长
详细谈一谈力士乐齿轮泵的维护知识
多单元电池组如何组装?
保卫蓝天!河北积极开展“煤改电”配套电网建设工作
使用β-CD调节锌离子的沉积行为