设备出厂横竖屏修改 & 默认手势导航修改(按键导航)

导航修改

device/rockchip/rk3576/overlay/frameworks/base/core/res/res/values/config.xml

xml 复制代码
    <!-- Controls the navigation bar interaction mode:
         0: 3 button mode (back, home, overview buttons)
         1: 2 button mode (back, home buttons + swipe up for overview)
         2: gestures only for back, home and overview -->
    <integer name="config_navBarInteractionMode">2</integer>

横竖屏修改

BoardConfig.mk SF_PRIMARY_DISPLAY_ORIENTATION := 90

这样的修改引入了很多问题:屏幕虽然显示为横屏,但底部的触摸坐标、手势返回等等仍是原竖屏下的逻辑,此种方案并不可行。

路径 :App → WMS 布局 → SF 合成画面(逻辑尺寸仍然是竖屏:w=1080 h=1920) → SF 把这幅竖屏画面旋转 90° → 输出给 VOP 硬件 → 屏幕看到横屏画面

修改 LocalDisplayAdapter+LogicalDisplay读取属性设置主屏 rotation、交换逻辑宽高 方案

frameworks/base/services/core/java/com/android/server/display/LocalDisplayAdapter.java

getDisplayDeviceInfoLocked()

java 复制代码
if (mIsFirstDisplay) {
        if (res.getBoolean(R.bool.config_mainBuiltInDisplayIsRound)
                || (Build.IS_EMULATOR
                && SystemProperties.getBoolean(PROPERTY_EMULATOR_CIRCULAR, false))) {
            mInfo.flags |= DisplayDeviceInfo.FLAG_ROUND;
        }
        //-----rk-code-----//
        // 内建(首屏)DSI 面板也支持整机旋转,使触摸/手势与显示一致。
        // persist.sys.rotation.dsi: 0/ROTATION_0, 1/ROTATION_90, 3/ROTATION_270 等。
        if (SystemProperties.get("ro.board.platform").equals("rk356x")||SystemProperties.get("ro.board.platform").equals("rk3588")||SystemProperties.get("ro.board.platform").equals("rk3576")) {
            int rotation = SystemProperties.getInt("persist.sys.rotation.dsi", 0);
            if (rotation != 0) {
                Slog.d(TAG, "internal DSI set rotation " + rotation);
                mInfo.rotation = rotation;
            }
        }
        //-----------------//
}

frameworks/base/services/core/java/com/android/server/display/LogicalDisplay.java

updateLocked()

java 复制代码
      //-----------------//
    // 内建DSI主屏旋转:未走 TYPE_EXTERNAL 路径,单独处理。
    // persist.sys.rotation.dsi 为奇数(1/3)时交换逻辑宽高,使 WMS 自然方向变横屏
    // (SystemUI 手势返回/底部 recent 区域随之落在横屏的正确边上)。
    if (deviceInfo.type == Display.TYPE_INTERNAL) {
        if (SystemProperties.getInt("persist.sys.rotation.dsi", 0) % 2 != 0) {
            mBaseDisplayInfo.appWidth = deviceInfo.height;
            mBaseDisplayInfo.appHeight = deviceInfo.width;
            mBaseDisplayInfo.logicalWidth = deviceInfo.height;
            mBaseDisplayInfo.logicalHeight = deviceInfo.width;
        }
    }
    //-----------------//
    mPrimaryDisplayDeviceInfo = deviceInfo;
    mInfo.set(null);
    mDirty = false;

device/rockchip/rk3576/tspi_3m/tspi_3m.mk

开机默认横屏。值 1=90°、3=270°(同为横屏,若图像上下颠倒则改 3);0=竖屏(默认)。 PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.dsi=1

横屏后触摸的修改方案

本文重点研究了横屏后的触摸修改方案,归纳起来共有三种:

  1. 修改上文的 LocalDisplayAdapter + LogicalDisplay(已成功验证)
  2. 修改触摸驱动,例如在 kernel-6.1/drivers 下新增或修改触摸驱动,并交换 x、y 坐标等
  3. 修改设备树 kernel-6.1/arch/arm64/boot/dts/rockchip/tspi-3m-rk3576-dsi-c41409463.dtsi

直接修改 Java 层的 Display 代码并非最优方案,经过探索,最终确认修改 dtsi 才是最正统且简单的方式:

bash 复制代码
/*-----------------------------------------------------------
 * 触摸节点
 *-----------------------------------------------------------*/
&i2c0 {
    pinctrl-names = "default";
	pinctrl-0 = <&i2c0m1_xfer>;
	clock-frequency = <400000>;
	status = "okay";

	ts@5d {
		compatible = "goodix,gt9xx";
		reg = <0x5d>;
		tp-size = <970>;   /* 竖屏(89:换XY+反X) -> 横屏(970:不换不反), 配合 SF 旋转90° 910&9111 */
		max-x = <1280>;
		max-y = <800>;
		irq-gpios = <&gpio0 RK_PC5 IRQ_TYPE_LEVEL_LOW>;
        reset-gpio = <&gpio0 RK_PD0 GPIO_ACTIVE_LOW>;
	};
};

最终只需要两处修改即可:

  • 在 device/rockchip/rk3576/BoardConfig.mk 中,通过一句 SF_PRIMARY_DISPLAY_ORIENTATION ?= 90 来旋转画面
  • 通过修改 tp-size = <970>(原为 89)来让触摸跟随画面旋转

至此,修改流程已全部完成。

89、970、910、9111 等数值的含义

tp-size = <xxx> 是瑞芯微 RK 平台 GT9xx 汇顶触摸驱动中的自定义魔改参数,并非硬件寄存器。驱动代码内部硬编码了一组【X/Y 交换、X 翻转、Y 翻转】的坐标转换组合,该参数用于选择其中的组合,同时用于选择内置的 TP 固件 cfg 数组。

开机画面与动画的竖屏修改

通过上文我们已经将 Android 系统由竖屏改为横屏,并将触摸也调整正确,但启动阶段的 uboot、kernel、bootanimation 仍以竖屏方式展示。

bootanimation

即显示 Android 字样的 bootanimation.zip 动画资源。只需修改 device/rockchip/rk3576/BoardConfig.mk,加入如下语句(同时让 Recovery 界面同步为横屏):

makefile 复制代码
TARGET_RECOVERY_DEFAULT_ROTATION ?= ROTATION_RIGHT

这一句即可达成目标,修改后编译变更体现在 recovery.img 分区镜像中。

相关推荐
SameX27 分钟前
ArkTS 做应用内"快捷胶囊" —— 续航日记踩过的两个鸿蒙声明式 UI workaround
前端
用户114818678948428 分钟前
水印的实现方式逻辑
前端·python
孟陬3 小时前
Foobar 技术周刊#160:大模型让大规模形式化软件验证成为现实丨AI写C++代码之后会发生什么?丨我们真的需要alpha() 函数吗丨重试,有时会让故障更
前端·后端·typescript
flash俊杰3 小时前
屏幕感知双通道:截图之外,为什么还要一份 UIA 控件清单
前端
熟的生菜3 小时前
从零造一个腱绳驱动灵巧手——仿真器篇3:VTK 渲染与 3D 交互——看得见、点得着、转得动
前端
Henry-SAP4 小时前
SAP PP中的核心业务流程——离散制造、重复制造、流程制造三大模式解析
前端·数据库·人工智能·制造
徐小夕4 小时前
下载量超 30 万的开源智能体 Prime Agent:它把自己从 TypeScript 重写成了 Rust
前端·vue.js·github
Zhao-Jichao4 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记
Moment5 小时前
为什么这么多 Agent Harness 都选择 TypeScript
前端·后端·面试