导航修改
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
横屏后触摸的修改方案
本文重点研究了横屏后的触摸修改方案,归纳起来共有三种:
- 修改上文的
LocalDisplayAdapter+LogicalDisplay(已成功验证) - 修改触摸驱动,例如在
kernel-6.1/drivers下新增或修改触摸驱动,并交换 x、y 坐标等 - 修改设备树
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 分区镜像中。