Android中关于如何限制上层应用只在特定区间画图
有时候对于mtk开发中有一个很特殊的需求。
那就是mtk的手机平台不支持横屏模式的显示面板屏幕,只支持竖屏。
mtk的平板平台才支持横屏扫描的屏幕。这个可能是mtk两个部门之间的策略规定。
其他瑞高通平台没有这种限制。
如果你需要用mtk手机平台开发横屏扫描的屏幕(注意不是竖屏横着用,这是另外一种情况,竖屏横着用,显然mtk手机平台直接就支持)。
于是,你的解决办法是,在驱动侧,把480240年的横屏,驱动侧给mtk的mipi信息,故意改为480640的竖屏,但是屏幕其实是横屏,所以时钟故意按照480 * 640分辨率来计算。再做微调时钟频率,保证显示是正确的。
然后你看到屏幕显示只是480640的上面部分,因为屏幕实际只有480240。
而你返回给android上层的分辨率是480640的。
为此,为了让上层应用只知道屏幕只有480240,那么你需要修改如下地方:
对应mtk Android L:修改:
框架/本地/服务/surfaceflinger/DisplayHardware/HWComposer.cpp
queryDisplayProperties()函数的
案例HWC_DISPLAY_WIDTH设置的配置。宽度=480;
案例HWC_DISPLAY_HEIGHT设置的配置。身高=240;
对于mtk安卓(Android 8.1)阿代码:修改
框架/本地/服务/surfaceflinger/DisplayHardware/HWC2.cpp
显示::loadConfig()函数中,
.setWidth (480)
.setHeight (240)
说白了,就是上层surfaceflinger获取显示硬件属性时,故意告诉他另外的分辨率480 * 240,这样surfaceflinger在画图时,就按照这个目标显示分辨率就行呈现合并了。从而实现显示效果。
另外需要注意mtk的内核配置项defconfig文件中的:
CONFIG_MTK_LCM_PHYSICAL_ROTATION_HW=y
如果配置了这个,那么硬件就会旋转180,从而显示framebuffer的下半部份,而且是180度旋转的。导致的结果是,你在surfaceflinger只画了framebuffer的上半部,而硬件上显示下版本,导致图像显示是framebuffer的下半部的随机数据,所以不要设置CONFIG_MTK_LCM_PHYSICAL_ROTATION_HW=y
另外也要注意mtk的ProjectConfig。可文件的CONFIG_MTK_LCM_PHYSICAL_ROTATION=?”
另外我的相关培训视频请看:
欢迎观看我发布的各个课程:https://edu.51cto.com/lecturer/8896847.html
内含免费视频。