Android11 TP触摸随着屏幕旋转(含动态设置屏幕旋转补丁)

动态调整TP响应屏幕旋转的代码补丁,
本文介绍了如何在Android框架中通过修改TouchInputMapper.cpp文件实现触摸屏(TP)跟随屏幕旋转,关键在于使用property_get函数正确获取`ro.surface_flinger.primary_display_orientation`属性并根据其值调整viewportorientation。

实现动态设置屏幕旋转的补丁可参考:

        https://download.csdn.net/download/weixin_71092993/88244740


实现TP随着屏幕旋转:

        有朋友在使用其他文章的方法修改TP旋转时,会发现没有效果。原因是在于使用property_get函数时不能正确读取到属性的值,property_get函数的第一个参数需要根据设定屏幕旋转的属性改,这里我所设定的属性是:"ro.surface_flinger.primary_display_orientation"。

        完整TP随着屏幕旋转的patch如下:

diff --git a/frameworks/native/services/inputflinger/reader/mapper/TouchInputMapper.cpp b/frameworks/native/services/inputflinger/reader/mapper/TouchInputMapper.cpp
index 99a572a5fd..98c5261d90 100644
--- a/frameworks/native/services/inputflinger/reader/mapper/TouchInputMapper.cpp
+++ b/frameworks/native/services/inputflinger/reader/mapper/TouchInputMapper.cpp
@@ -22,6 +22,7 @@
 #include "CursorScroll
<think> 嗯,用户需要的是在Android 16系统中提交SPI触摸(TP)驱动的解决方案。这个问题涉及底层驱动开发和系统适配,需要结合用户提供的多个引用片段来综合分析。 用户引用的资料里,引用[2]特别关键,详细描述了TP驱动的移植流程: - 需要将厂商驱动代码放到kernel/drivers/input/touchscreen目录 - 要修改Kconfig和Makefile配置文件 - 需要在defconfig文件里添加CONFIG_TOUCHPANEL_SYNAPTICS等编译开关 引用[3]提供了LCD相关的调试经验,这对SPI屏的唤醒和显示模式设置很有参考价值。比如提到burst模式配置错误会导致唤醒异常,dtsi文件中的屏幕旋转参数配置等。 引用[1]虽然讲的是SPI OTA升级,但强调了SPI通信稳定性的重要性——这对TP驱动的稳定性设计同样适用。引用[4]展示的V4L2驱动修改范例,其代码修改方式可以借鉴到SPI驱动修改中。 从技术实现角度看,Android 16的SPI TP驱动开发要点: 首先需要确认内核版本是否匹配(引用[2]提到msm-4.9内核),然后重点处理驱动移植、设备树配置(DTS)、电源管理唤醒逻辑(引用[3]的唤醒问题)以及SPI通信稳定性(引用[1]的容错要求)。 用户可能忽略了Android版本兼容性问题。Android 16应该对应Linux 4.x内核,但具体版本需要确认。如果用户的内核较旧,可能需要backport较新的SPI子系统补丁。 考虑到用户之前研究过OTA升级,可能是在开发带副屏的设备,这种情况下还要注意主副屏驱动的协调,引用[3]提到的fbcon_extract_to_screen()图形缓冲机制就很重要。 </think> 在Android 16系统中提交SPI触摸(TP)驱动需重点关注内核驱动移植、设备树配置和稳定性优化。以下是关键步骤及解决方案: --- ### **1. 驱动移植与内核配置** - **驱动代码移植** 将厂商提供的SPI-TP驱动(如Synaptics)放入内核目录: ```bash kernel/msm-4.9/drivers/input/touchscreen/ ``` 头文件需放置到: ```bash kernel/msm-4.9/include/linux/input/ ``` - **内核编译配置** 修改 `Kconfig` 和 `Makefile` 添加驱动依赖,并在设备配置文件(如`sdm710_defconfig`)中启用选项: ```makefile # 示例配置 CONFIG_TOUCHPANEL_SYNAPTICS=y CONFIG_TOUCHPANEL_SYNAPTICS_S3706=y CONFIG_INPUT_TOUCHSCREEN=y ``` [^2] --- ### **2. 设备树(DTS)配置** - **SPI接口定义** 在设备树中声明SPI总线、中断引脚及供电配置: ```dts &spi_6 { status = "okay"; touchscreen@0 { compatible = "synaptics,s3706"; reg = <0>; spi-max-frequency = <10000000>; // SPI时钟频率 interrupt-parent = <&tlmm>; interrupts = <65 0x2008>; // 中断引脚配置 vdd-supply = <&pm660_l11>; // 电源配置 }; }; ``` - **屏幕参数调整** 设置唤醒模式、旋转方向等关键参数(引用[3]经验): ```dts qcom,mdss-dsi-panel-orientation = "180"; // 屏幕旋转180度 qcom,mdss-dsi-traffic-mode = "burst_mode"; // 必须使用Burst模式 ``` --- ### **3. 稳定性优化要点** - **SPI通信容错** 参考OTA升级的稳定性设计(引用[1]): - 采用固定帧长通讯协议 - 添加CRC校验和超时重传机制 - 预留足够DMA缓冲区(600KB+场景需测试极限负载) - **唤醒问题修复** 引用[3]中唤醒异常的解决方案: - 检查RST引脚时序,确保复位信号稳定 - 确认`high-speed`模式配置正确(优先尝试`burst_mode`) - 调试休眠/唤醒时的电源状态机 - **数据传输优化** 借鉴引用[4]的像素格式修改思路,确保SPI传输格式与驱动匹配: ```c // 驱动中指定SPI传输格式 static struct spi_transfer xfer = { .tx_buf = tx_buffer, .rx_buf = rx_buffer, .len = FRAME_LENGTH, .bits_per_word = 16, // 根据设备调整 }; ``` --- ### **4. 调试与验证** 1. **唤醒测试** - 反复触发系统休眠/唤醒,检查TP响应 - 使用`cat /proc/interrupts` 确认中断触发计数 2. **SPI传输监控** ```bash echo 1 > /sys/kernel/debug/spi/spi6.0/loopback # 启用回环测试 dmesg | grep spi # 查看通信错误日志 ``` 3. **性能分析** ```bash systrace.py -b 32768 -o trace.html sched gfx irq spi # 抓取SPI事件 ``` --- ### **相关问题** 1. 如何解决SPI-TPAndroid休眠唤醒后的无响应问题? 2. SPI传输中出现CRC错误应如何调试? 3. 如何优化SPI-TP驱动的功耗以满足Android电源管理要求? 4. 在Android 16中如何动态调整SPI时钟频率以适应不同场景? > 提示:SPI稳定性高度依赖硬件设计,需结合示波器检查CLK/MOSI信号质量。若遇持续通信失败,优先排查PCB布线干扰或尝试降低时钟频率[^1][^3]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值