将LCD显示180°旋转,需要做系统底层的修改,具体实现方法如下(以实际项目为例):
1. 更改MTK_LCM_PHYSICAL_ROTATION的值
MTK_LCM_PHYSICAL_ROTATION = 180
所涉及到的文件有:
bootable/bootloader/lk/project/xxxxxx.mk
device/mediateksample/tb8765ap1_bsp_1g/ProjectConfig.mk
device/mediateksample/tb8765ap1_bsp_1g//xxxxx_defconfig
device/mediateksample/tb8765ap1_bsp_1g//xxxxxx_debug_defconfig
2. 触摸屏坐标的修改
显示屏旋转了180°,那么触摸屏也要旋转180°,这样才能方便使用。
涉及到的文件:
kernel-4.4/drivers/input/touchscreen/mediatek/ft5x06_new/focaltech_core.c
打开宏:
#define CONFIG_TPD_ROTATE_180
驱动中有:(没有可以自己实现)
#if defined(CONFIG_TPD_ROTATE_90) || defined(CONFIG_TPD_ROTATE_270) || defined(CONFIG_TPD_ROTATE_180)
static void tpd_rotate_180(int *x, int *y)
{
*y = TPD_RES_Y + 1 - *y; // TPD_RES_Y -- mtk_tpd.c从defconfig的CONFIG_LCM_HEIGT获得()
*x = TPD_RES_X + 1 - *x;
}
#endif
static void tpd_down(int x, int y, int p, int id)
{
#if defined(CONFIG_TPD_ROTATE_180)
tpd_rotate_180(&x, &y);
#endif
...
input_report_abs(tpd->dev, ABS_MT_POSITION_X, x);
}
或者再直接一点,在上报之前:
+ events[i].x = 720 + 1 - events[i].x; // 具体的高宽感觉具体项目tp的烧入坐标固件的分辨率为准,如果没有对应信息
+ events[i].y = 1440 + 1 - events[i].y; // 请使用adb shell 使用 getevent -lt /dev/input/event2 ,分辨获取 高宽(需16进制转)
input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, events[i].area);
input_report_abs(tpd->dev, ABS_MT_POSITION_X, events[i].x);
input_report_abs(tpd->dev, ABS_MT_POSITION_Y, events[i].y);
以下是 触摸旋转函数例子代码(可参照来写):
#ifdef TPD_ROTATION_SUPPORT
static void tpd_swap_xy(int *x, int *y)
{
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}
static void tpd_rotate_90(int *x, int *y)
{
*x = SCREEN_MAX_X + 1 - *x;
*x = (*x * SCREEN_MAX_Y) / SCREEN_MAX_X;
*y = (*y * SCREEN_MAX_X) / SCREEN_MAX_Y;
tpd_swap_xy(x, y);
}
static void tpd_rotate_180(int *x, int *y)
{
*y = SCREEN_MAX_Y + 1 - *y;
*x = SCREEN_MAX_X + 1 - *x;
}
static void tpd_rotate_270(int *x, int *y)
{
*y = SCREEN_MAX_Y + 1 - *y;
*x = (*x * SCREEN_MAX_Y) / SCREEN_MAX_X;
*y = (*y * SCREEN_MAX_X) / SCREEN_MAX_Y;
tpd_swap_xy(x, y);
}
#endif
例: getevent -lt /dev/input/event2
将标好进行十六进制转换获得对应的分辨率以及坐标
个别情况下修改以上部分开机动画还没有旋转,请按下方进行修改
3. 开机动画的旋转
涉及到的文件:
frameworks/native/services/surfaceflinger/DisplayDevice.cpp
将setProjection(DisplayState::eOrientationDefault, mViewport, mFrame);修改为:setProjection(DisplayState::eOrientation180, mViewport, mFrame);
修改的参数是:eOrientationDefault 改为 eOrientation180