[RK3566-Android11] HDMI画面旋转后,进入系统桌面又被强制横屏,导致旋转失效的解决办法

文章讲述了如何通过修改rk356x设备的rk3566_r.mk文件中的hdmirotationlock设置,解除因HDMI接口导致的系统强制横屏问题,即当HDMI连接时屏幕被锁定为横屏模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

通过修改BoardConfig.mk中的SF_PRIMARY_DISPLAY_ORIENTATION属性等于90,将画面旋转90度。可是开机进入系统桌面后,系统又强制变成了横屏。

我并没有在hardware或者frameworks上层部分有做任何强制横屏的修改操作。
(我将代码跟另外一份为修改过的SDK对比,frameworks和hardware并没有区别)
主板也并没有用到G-sensor,kernel和BoardConfig.mk的G-sensor相关配置都已经被我们关闭。
我也并未加入过任何第三方的应用,或者其他应用。
代码make installclean编译过,也make clean全部重新编译过。烧录后,都还是进入系统桌面后,系统又强制变成了横屏。

原因分析:

通过串口dumpsys window -a输出结果可以看到:

  DisplayRotation
    mCurrentAppOrientation=SCREEN_ORIENTATION_UNSPECIFIED
    mLastOrientation=-1
    mRotation=3 mDeferredRotationPauseCount=0
    mLandscapeRotation=ROTATION_90 mSeascapeRotation=ROTATION_270
    mPortraitRotation=ROTATION_0 mUpsideDownRotation=ROTATION_180
    mSupportAutoRotation=true
    WindowOrientationListener
      mEnabled=false
      mCurrentRotation=ROTATION_270
      mSensorType=null
      mSensor=null
      mRate=2

然后出去掉HDMI后在看:

  DisplayRotation
    mCurrentAppOrientation=SCREEN_ORIENTATION_UNSPECIFIED
    mLastOrientation=-1
    mRotation=0 mDeferredRotationPauseCount=0
    mLandscapeRotation=ROTATION_90 mSeascapeRotation=ROTATION_270
    mPortraitRotation=ROTATION_0 mUpsideDownRotation=ROTATION_180
    mSupportAutoRotation=true
    WindowOrientationListener
      mEnabled=false
      mCurrentRotation=ROTATION_0
      mSensorType=null
      mSensor=null
      mRate=2

这里对比可以看出,再接入HDMI时候,画面被强行改为 mRotation=3。变成了横屏。
说明HDMI的旋转被锁死了。

解决方案:

我们只需要修改device\rockchip\rk356x\rk3566_r\rk3566_r.mk下代码:
将PRODUCT_PROPERTY_OVERRIDES += ro.vendor.hdmirotationlock=true
改为PRODUCT_PROPERTY_OVERRIDES += ro.vendor.hdmirotationlock=false
就可以解除HDMI的旋转锁定

### RK3566 实现水平旋转配置方法 对于RK3566芯片,在实现屏幕的水平旋转功能时,主要涉及到显示控制器寄存器设置以及帧缓冲区的数据排列方式调整。通过修改这些参数可以改变图像在屏幕上呈现的角度。 #### 修改显示控制器寄存器 为了使屏幕能够按照指定角度进行旋转,需要重新配置显示屏控制模块的相关寄存器。这包括但不限于分辨率、扫描模式等参数。特别是针对水平翻转和平移操作,可以通过调整水平同步偏移量(Hor Sync Offset) 和水平同步脉冲宽度 (H Sync Pulse Width),来间接影响最终画面的方向[^2]。 ```c /* 设置水平同步参数 */ disp_sys_script_set_item(disp, "hor_sync_offset", 48); disp_sys_script_set_item(disp, "h_sync_pulse_width", 32); ``` 需要注意的是上述代码仅为示意性质,并不适用于所有情况下的实际应用环境当中。具体数值应当依据所使用的面板规格书来进行适当调整。 #### 帧缓存数据重排 除了硬件层面的变化外,软件方面也需要做相应处理——即对即将渲染到屏幕上的每一帧图像像素点顺序做出更改。一般而言,Linux内核提供了多种途径完成这项工作: - **Framebuffer Rotation**: 使用fbcon_rotate工具可以直接作用于framebuffer层面上执行顺/逆时针90度增量式的变换; - **KMS(DRM)**: 若采用现代图形子系统,则可通过原子属性接口传递rotation标志位给对应CRTC对象从而达到目的; 这两种方案各有优劣之处,前者简单易懂但灵活性较差;后者则更加高效且支持更多特性比如多平面合成等功能。 #### 配置文件调整 部分情况下可能还需要编辑设备树源码(.dts/.dtsi), 添加或修改有关display-timings节点内的描述信息以适应新的物理连接关系变化需求: ```diff &lcd { status = "okay"; + display-timings { + native-mode = <&timing0>; + + timing0: timing@0 { + clock-frequency = <...>; /* 根据实际情况填写 */ + + hactive = <1920>; + vactive = <1080>; + + hfront-porch = <<原有值>>; + hback-porch = <<原有值>>; + vsync-len = <<原有值>>; + ... + + // 新增字段用于指示是否启用镜像效果 + panel-orientation = "inverted-x"; + }; + }; }; ``` 以上就是关于如何基于RK3566平台实现水平旋转的一些基本思路和技术要点介绍[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值