显示相关适配案例汇总
案例1 适配异形屏 版本:OHOS4.0 release api10芯片:3399分辨率1920*540 鸿蒙系统如何适配异形屏,现在系统能够运行,但是只能显示一半的界面。这个屏幕安卓适配没有问题。 方案:display hdi 通过drm 获取屏幕属性,通过修改display hdi 里面屏幕属性达对应目的修改点
案例1 适配异形屏
版本:OHOS4.0 release api10
芯片:3399
分辨率1920*540
鸿蒙系统如何适配异形屏,现在系统能够运行,但是只能显示一半的界面。这个屏幕安卓适配没有问题。
方案:display hdi 通过drm 获取屏幕属性,通过修改display hdi 里面屏幕属性达对应目的
修改点如下 device/soc/rockchip/rk3399/hardware/display/src/display_device/drm_connector.cpp
void DrmMode::ConvertToHdiMode(DisplayModeInfo &hdiMode)
{
hdiMode.height = 540; /* default height*/
hdiMode.width = mModeInfo.hdisplay;
hdiMode.freshRate = mModeInfo.vrefresh;
hdiMode.id = mId;
}
注意:uboot可能也需要调整
案例2 显示屏使用linux原生驱动
关闭CONFIG_DRIVERS_HDF_DISP开关
以3568为例
路径:kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig
修改内核config配置,CONFIG_DRIVERS_HDF_DISP=y 改成 # CONFIG_DRIVERS_HDF_DISP is not set
补充:使用linux原生驱动需要注意
文件kernel/linux/config/linux-5.10/rk3568/arch/arm64_defconfig中可能也有相关开关,如果有需要全部关闭。
案例3 GPU适配
GPU适配有主要两种方式:
- 使用GPU闭源库
- 使用开源mesa3d库
1. 使用GPU闭源库
平台:rk3568
GPU型号:Mali-G52
除了GPU,RK系列板卡上还有一个独立的2D硬件加速器–RGA (Raster Graphic Acceleration Unit),可以不占用CPU资源下, 进行加速点/线绘制,执行图像缩放、旋转、bitBlt、alpha混合等常见的2D图形操作,用户空间使用通过 librga 库。
图形库:OpenGL ES3.2 ES3.2/2.0/1.1、Vulkan1.1等图形处理接口。
编译脚本分析
路径:device/soc/rockchip/rk3568/hardware/BUILD.gn
group("hardware_group") {
deps = [
"//device/soc/rockchip/rk3568/hardware/gpu:mali-bifrost-g52-g2p0-ohos",
"//device/soc/rockchip/rk3568/hardware/isp:isp",
"//device/soc/rockchip/rk3568/hardware/mpp:mpp",
"//device/soc/rockchip/rk3568/hardware/wifi:ap6xxx",
]
}
脚本中依赖了mali-bifrost-g52-g2p0-ohos.so库,通过objdunp可以看出,其中包含了这几块比较特殊的内容:
- ohos适配代码
- OpenGL、OpenCl库的内容
路径:device/soc/rockchip/rk3568/hardware/gpu/BUILD.gn
ohos_prebuilt_shared_library("mali-bifrost-g52-g2p0-ohos") {
if (target_cpu == "arm") {
source = "lib/libmali-bifrost-g52-g2p0-ohos.so"
} else if (target_cpu == "arm64") {
source = "lib64/libmali-bifrost-g52-g2p0-ohos.so"
}
......
install_enable = true
symlink_target_name = [
"libEGL_impl.so",
"libGLESv1_impl.so",
"libGLESv2_impl.so",
"libGLESv3_impl.so",
"libmali.so.0",
"libmali.so.1",
]
}
symlink_target_name:表示[]中的库文件重定向链接到source的库上,用符号表示libEGL_impl.so->libmali-bifrost-g52-g2p0-ohos.so
也就是说这些库最终都会调用到libmali-bifrost-g52-g2p0-ohos.so。
2. 使用开源Mesa3D库
基本概念
Mesa3D
Mesa3D对上提供标准的OpenGL接口,对下使用Gallium框架,屏蔽驱动差异。
也就是说,OpenGL是一种接口规范,Mesa3D是OpenGL的实现。
panfrost
是对ARM系列GPU驱动的开源实现之一,它的功能主要是完成对GPU硬件的初始化,以及以job的方式,完成对渲染数据硬件处理。在本案例中,GPU相关的配置,渲染管理等都是通过Mesa3D对panfrost ioctl来实现的。Panfrost可以作为Gallium3D的一个后端驱动来使用。
参考链接:https://blog.csdn.net/weixin_43082062/article/details/139595195
Mesa3D适配
OpenHarmony-3.2-Release版本适配Mesa3D:
参考链接:
https://laval.csdn.net/65ea646fdcaa10382b96e63d.html
https://blog.csdn.net/isoftstone_HOS/article/details/130622073
https://laval.csdn.net/6505bbd4993dd34278ee328e.html
https://laval.csdn.net/6502eff46b896f66024cbb88.html?q=%E7%BC%96%E8%AF%91%E7%BB%84%E4%BB%B6
OpenHarmony-5.0-Release版本适配Mesa3D,待验证更新。
其他领域适配案例
案例一 USB设备
问题描述:
部分USB设备(USB指纹仪、U盘等)识别报错,导致无法调用应用提供的API。问题分析:
分析log可以看到,有许多初始化、内存分配、获取id相关的报错,这种一般都是处于设备初始化阶段,如果不是框架问题,那么推测大概率是配置问题。08-05 17:43:22.936 483 586 I C02500/USB_RAW_API_LIBRARY: RawInit: created default context 08-05 17:43:22.936 483 586 E C02500/USB_INTERFACE_POOL: IfFindInterfacePool:348 interface pool list is empty 08-05 17:43:22.937 483 586 E C02500/USB_RAW_API_LIBRARY: RawUsbMemFree:1604 mem is null. 08-05 17:43:22.938 483 586 E C02500/USB_RAW_API_LIBRARY: RawGetConfigDescriptor:<private> invalid param ...... 08-05 17:43:22.939 483 586 E C02500/Usbd: UsbdInit:UsbdClaimInterfaces failed ret:-1 08-05 17:43:22.939 483 586 E C02500/Usbd: FunAttachDevice:UsbInit failed ret:-1 08-05 17:43:22.939 483 586 E C02500/Usbd: UsbdBulkASyncListReleasePort: port or port->bulkASyncList is nullptr 08-05 17:43:22.939 483 586 I C02500/Usbd: ReportUsbdSysEvent: UsbdDeviceCreateAndAttach failed 08-05 17:43:22.943 483 586 E C02500/usb_interface_stub: UsbInterfaceStubOpenDevice_ failed, error code is -202 08-05 17:43:22.944 707 707 E C01510/BinderInvoker: 124: SendRequest: handle=2 result = -202 08-05 17:43:22.944 707 707 E C02500/usb_interface_proxy: OpenDevice_ failed, error code is -202 08-05 17:43:22.944 707 707 E C02904/UsbService: [usb_service.cpp] GetDeviceInfo# OpenDevice failed ret=-202 08-05 17:43:22.944 707 707 I C02904/UsbService: [usb_service.cpp] AddDevice# GetDeviceInfo ret=-202 08-05 17:43:22.944 707 707 W C02904/UsbService: [usb_service.cpp] UnLoadSelf# not need unload 08-05 17:43:22.945 254 698 I C02d10/HiView-SysEventSource: Parser: parser result domain_=HDF_USB eventName_=RECOGNITION_FAIL 08-05 17:43:22.945 483 586 I C02500/USB_RAW_API_LIBRARY: RawInit: created default context 08-05 17:43:22.945 483 586 E C02500/USB_INTERFACE_POOL: IfFindInterfacePool:348 interface pool list is empty 08-05 17:43:22.946 483 586 E C02500/USB_RAW_API_LIBRARY: RawUsbMemFree:1604 mem is null. ...... 08-05 17:43:22.949 254 698 I C02d10/HiView-SysEventSource: CheckValidSysEvent: HandleEventJson fail 08-05 17:43:22.949 483 586 E C02500/USB_INTERFACE_POOL: ClaimInterface:993 interfacePool or interfacePool->device is null 08-05 17:43:22.950 483 586 E C02500/Usbd: GetUsbInterfaceById: UsbClaimInterface failed 08-05 17:43:22.950 483 586 E C02500/Usbd: UsbdClaimInterfaces:GetUsbInterfaceById nullptr 08-05 17:43:22.950 483 586 E C02500/Usbd: UsbdInit:UsbdClaimInterfaces failed ret:-1
总结:
上述问题,推测是其设备走的cdc协相关议,但是没有打开相应开关编译相应 。建议:适配新设备时,需要熟悉新设备的特性,接口协议是否支持,检查各配置项是否正确。
原问题链接:https://laval.csdn.net/user/discuss/671234b52db35d1195fc9565
更多推荐
所有评论(0)