案例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适配有主要两种方式:

  1. 使用GPU闭源库
  2. 使用开源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可以看出,其中包含了这几块比较特殊的内容:

    1. ohos适配代码

      img

    1. OpenGL、OpenCl库的内容

      img


      img

路径: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库

img

基本概念

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设备

  1. 问题描述:
    部分USB设备(USB指纹仪、U盘等)识别报错,导致无法调用应用提供的API。

  2. 问题分析:
    分析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
    
  3. 总结:
    上述问题,推测是其设备走的cdc协相关议,但是没有打开相应开关编译相应 。

    建议:适配新设备时,需要熟悉新设备的特性,接口协议是否支持,检查各配置项是否正确。
    原问题链接:https://laval.csdn.net/user/discuss/671234b52db35d1195fc9565

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐