文章目录

  • 一、前文
  • 二、Debug看日志
  • 三、搭建开发环境
  • 四、快速编译
  • 五、代码定位
  • 六、代码修改
  • 七、其他源码分析

一、前文

主板是friendlyarm的NanoPC-T4的主板,RK3399的主芯片,原本适配了1280 * 800的7寸屏和1920 * 1200的11寸屏。

现在又想要用一款10.1寸的屏,接口都是edp,触摸是iic。插上去屏能亮,显示都没问题,但是触摸有点不准

用了一个画图软件,发现横轴的点位有点偏移,偏移不固定,线性的偏移,就是靠左边的时候偏移大,靠右边的时候偏移小。

二、Debug看日志

我第一步就把主板的串口接到电脑,看log,很快就看到一些关键log,分辨率1280*800,触摸ic是gt928,这些都对了。

那问题就很明显了,应该是cfg不对,然后找屏厂的人拿了cfg文件。

[    1.178927] <<-GTP-INFO->> GTP Driver Version: V2.4 <2014/11/28>
[    1.178940] <<-GTP-INFO->> GTP I2C Address: 0x5d
[    1.179032] <<-GTP-INFO->> Guitar reset
[    1.223737] fusb302 4-0022: CC connected in 1 as UFP
[    1.271403] <<-GTP-INFO->> IC Version: 928_1060
[    1.271447] <<-GTP-DEBUG->> [1348]Config Groups' Lengths: 186, 0, 0, 0, 0, 186
[    1.272118] <<-GTP-INFO->> Sensor_ID: 0
[    1.272128] <<-GTP-DEBUG->> [1402]Get config data from header file.
[    1.272140] <<-GTP-INFO->> Config group0 used,length: 186
[    1.272482] <<-GTP-DEBUG->> [1446]Config Version: 95, 0x5F; IC Config Version: 95, 0x5F
[    1.272497] <<-GTP-INFO->> Driver send config.
[    1.278407] <<-GTP-INFO->> X_MAX: 1280, Y_MAX: 800, TRIGGER: 0x01
[    1.290916] <<-GTP-INFO->> create proc entry gt9xx_config success
[    1.290937] <<-GTP-INFO->> Ready to run update thread.
[    1.292208] input: goodix-ts as /devices/virtual/input/input1
[    1.292345] <<-GTP-DEBUG->> [2283][update_proc]Begin update ......
[    1.292361] <<-GTP-DEBUG->> [805]Search for /data/_goodix_update_.bin, /sdcard/_goodix_update_.bin for fw update.(1/2)
[    1.292397] <<-GTP-DEBUG->> [1766]INT trigger type:1
[    1.292454] <<-GTP-DEBUG->> [842]Search for /data/_goodix_config_.cfg, /sdcard/_goodix_config_.cfg for config update.(1/2)
[    1.292457] <<-GTP-INFO->> GTP works in interrupt mode.
[    1.292464] <<-GTP-INFO->> Applied memory size:2562.
[    1.292468] <<-GTP-INFO->> I2C function: without pre and end cmd!
[    1.292477] <<-GTP-INFO->> Create proc entry success!

三、搭建开发环境

  • 开始搭环境
  • 下载源码,看源码
  • 编译,因为我们只改动了kernel部分,所以只要编译kernel.img就行了。

android 7系统

cd kernel
make ARCH=arm64 nanopi4_nougat_defconfig
make -j2 ARCH=arm64 kernel.img

android 8系统

cd kernel
make -j2 ARCH=arm64 nanopi4_oreo_defconfig
make -j2 ARCH=arm64 kernel.img

四、快速编译

其中有个东西可以提一下的,如何用最快的速度编译,关键在make -jN

这个N就是你cpu的核心数,如果你不知道你的cpu核心数是多少, 可以用命令查一下

grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}'

五、代码定位

在改代码的时候,发生了有意思的事情,原本进入/kernel/drivers/input/touchscreen/目录下面,找到gt9xx目录

root@ubuntu:/home/weijian/Android/RK3399/rk3399-nougat/kernel/drivers/input/touchscreen/gt9xx# ls
goodix_tool.c                             gt9xx_update.c
GT9110P_Config_20160217_1526_2048_97.cfg  Makefile
GT9271_Config_20170526.cfg                WGJ10162B_GT9271_1060_Config_20140821_1341110X42.cfg
GT928_Config_TR1060_1280X800_FPC_D.cfg    WGJ10162_GT9271_Config_20140820_182456.cfg
gt9xx.c                                   WGJ10187_GT9271_Config_20140623_104014_0X41.cfg
gt9xx_firmware.h                          WGJ89006B_GT911_Config_20140625_085816_0X43.cfg
gt9xx.h                                   WGJ89006B_GT9271_Config_20140625_085816_0X41.cfg

就自以为找对了,然后就开始动手看代码,修改代码,发现改了无效,一脸懵逼。

想了想,往GTP-INFO里面添加自定义的关键代码比如weijian等等,然后也没打印出来。这时候才开始看Makefile文件

#
# Makefile for the touchscreen drivers.
## Each configuration option enables a list of files.
……
ifndef CONFIG_TOUCHSCREEN_FE_PANELS
obj-$(CONFIG_TOUCHSCREEN_GT9XX)     += gt9xx/
endif
……
obj-$(CONFIG_TOUCHSCREEN_FE_PANELS) += friendlyelec/

这才发现gt9xx目录下的文件不一定会被编译,需要打开CONFIG_TOUCHSCREEN_FE_PANELS。

而另外friendlyelec目录下是一定会被编译,且该目录同样有gt9xx.c和gt9xx.h文件。

root@ubuntu:/home/weijian/Android/RK3399/rk3399-nougat/kernel/drivers/input/touchscreen/friendlyelec# ls
built-in.o     goodix_tool.o  gt9xx_firmware.h  gt9xx.o         gt9xx_update.o  Makefile         modules.order
goodix_tool.c  gt9xx.c        gt9xx.h           gt9xx_update.c  Kconfig         modules.builtin

六、代码修改

这时候才开始恍然大悟,然后修改,编译,下载,验证ok。

gt9xx.h的部分代码,只修改了CTP_CFG_GROUP0

// TODO: define your own default or for Sensor_ID == 0 config here.
// The predefined one is just a sample config, which is not suitable for your tp in most cases.//#define CTP_CFG_GROUP0 {\/* HD101B */ \
/*      0x00,0x00,0x05,0x20,0x03,0x05,0x3D,0x00,0x01,0x08,0x28,\0x05,0x50,0x32,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,\0x01,0x1A,0x1C,0x1E,0x14,0x8E,0x2E,0x88,0x20,0x1E,0x31,\0x0D,0x00,0x00,0x00,0x9C,0x03,0x1D,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x64,0x94,0xC5,\0x02,0x07,0x00,0x00,0x04,0x51,0x2C,0x00,0x4A,0x34,0x00,\0x44,0x3F,0x00,0x40,0x4C,0x00,0x3E,0x5B,0x00,0x3E,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x01,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,\0x0D,0x0E,0x0F,0x10,0x11,0x14,0x15,0xFF,0xFF,0xFF,0xFF,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x02,0x04,0x06,0x07,0x08,0x0A,0x0C,0x0D,0x0F,0x10,0x11,\0x12,0x13,0x19,0x1B,0x1C,0x1E,0x1F,0x20,0x21,0x22,0x23,\0x24,0x25,0x26,0x27,0x28,0xFF,0xFF,0xFF,0xFF,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x01\}*/
#define CTP_CFG_GROUP0 {\/* 10.1 1280*800 */\0x5F,0x00,0x05,0x20,0x03,0x05,0x0D,0x00,0x01,0x08,0x28,\0x05,0x50,0x3C,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x8F,0x2F,0xAA,0x43,0x45,0x0C,\0x08,0x00,0x00,0x00,0x00,0x03,0x1D,0x00,0x00,0x00,0x00,\0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x3C,0x64,0x94,0xD5,\0x02,0x07,0x00,0x00,0x04,0x80,0x3F,0x00,0x7B,0x46,0x00,\0x73,0x4D,0x00,0x6B,0x55,0x00,0x63,0x5F,0x00,0x63,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x01,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,\0x0D,0x0E,0x0F,0x10,0x11,0x14,0x15,0x16,0x17,0x18,0x19,\0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x02,0x04,0x06,0x07,0x08,0x0A,0x0C,0x0D,0x0F,0x10,0x11,\0x12,0x13,0x14,0x19,0x1B,0x1C,0x1E,0x1F,0x20,0x21,0x22,\0x23,0x24,0x25,0x26,0x27,0x28,0x29,0xFF,0xFF,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x01\
}// TODO: define your config for Sensor_ID == 1 here, if needed
#define CTP_CFG_GROUP1 {\}// TODO: define your config for Sensor_ID == 2 here, if needed
#define CTP_CFG_GROUP2 {\}// TODO: define your config for Sensor_ID == 3 here, if needed
#define CTP_CFG_GROUP3 {\}// TODO: define your config for Sensor_ID == 4 here, if needed
#define CTP_CFG_GROUP4 {\}// TODO: define your config for Sensor_ID == 5 here, if needed
#define CTP_CFG_GROUP5 {\/* HD702 */ \0x50,0x20,0x03,0x00,0x05,0x05,0x34,0x20,0x02,0x2B,0x28,\0x0F,0x50,0x3C,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x18,0x1A,0x1E,0x14,0x8D,0x2D,0x88,0x3A,0x37,0x33,\0x0F,0x00,0x00,0x00,0x02,0x02,0x2D,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x41,0x94,0xC5,\0x02,0x07,0x00,0x00,0x04,0xD6,0x1E,0x1E,0xB6,0x24,0x00,\0x9F,0x2A,0x00,0x8A,0x32,0x00,0x79,0x3B,0x00,0x79,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\0x00,0x00,0x00,0x01,0x04,0x05,0x06,0x07,0x08,0x09,0x0C,\0x0D,0x0E,0x0F,0x10,0x11,0x14,0x15,0xFF,0xFF,0xFF,0xFF,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,\0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1F,0x1E,0x1C,0x1B,\0x19,0x13,0x12,0x11,0x10,0x0F,0x0C,0x0A,0x08,0x07,0x06,\0x04,0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,\0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x01\}
  • CTP_CFG_GROUP0原本适配11寸屏(1920 * 1200),现在改成适配10寸屏(1280 * 800)
  • CTP_CFG_GROUP5适配7寸屏(1280 * 800)
  • 其余空着,不做适配

七、其他源码分析

看了一点代码,简单说一下的触摸驱动的流程。

触摸屏通过iic控制,驱动部分适配了5种不同的屏幕,通过读取触摸ic(GT928)的sensor id来判断,适配哪个屏幕,即哪个cfg。

关键代码是gt9xx.c里面

static s32 gtp_init_panel(struct goodix_ts_data *ts)
{……ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1);if (SUCCESS == ret){if (sensor_id >= 0x06){GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id);ts->pnl_init_error = 1;return -1;}}else{GTP_ERROR("Failed to get sensor_id, No config sent!");ts->pnl_init_error = 1;return -1;}GTP_INFO("Sensor_ID: %d", sensor_id);/* parse config data*/
#ifdef GTP_CONFIG_OFGTP_DEBUG("Get config data from device tree.");ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, sensor_id);if (ret < 0) {GTP_ERROR("Failed to parse config data form device tree.");ts->pnl_init_error = 1;return -1;}
#elseGTP_DEBUG("Get config data from header file.");if ((!cfg_info_len[1]) && (!cfg_info_len[2]) &&(!cfg_info_len[3]) && (!cfg_info_len[4]) &&(!cfg_info_len[5])){sensor_id = 0;}ts->gtp_cfg_len = cfg_info_len[sensor_id];memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len);
#endif……
}

RK3399触摸不准,修改drivers中gt9xx.h的cfg相关推荐

  1. Qt修改QSS中的qlineargradient属性,实现颜色渐变

    程序如下: 运行截图如下: 动态运行图如下: 原理很简单,修改QSS中的qlineargradient属性即可: 源码如下: widget.h #ifndef WIDGET_H #define WID ...

  2. 修改bash中PS1命令提示符的颜色

    修改bash中PS1命令提示符的颜色 1. 对比Ubuntu与CentOS的命令提示符 2. CentOS命令提示符颜色设置 3. 颜色以及相关控制字符的含义解释 4. 使用`tput`命令修改终端命 ...

  3. gt9xx.c和gt9xx.h文件分析

    在goodix官网上搜索gt911找到如下信息: Channe(DxS) Package Size Points GT911 26x14 QFN52, 6x6 7"~8" 5 1. ...

  4. 如何在笔记本电脑触摸板上进行中键单击

    Most laptop touchpads make it possible to perform a middle-click, but not all do. In some situations ...

  5. 解决ubuntu18.04触摸屏旋转后触摸不准问题

    文章目录 问题描述 解决过程 查看系统支持的显示设备 修改配置文件 总结 问题描述 因为项目需要将21寸的横屏触摸屏旋转成竖屏使用,如果是在x86平台上直接在系统设置一下屏幕旋转就解决了,但是在arm ...

  6. 飞凌嵌入式RK3399开发板使用过程中问题实录及解决思路

    飞凌RK3399的开发板,已经推出了一段时间,根据飞凌嵌入式技术服务部统计的客户问题反馈,整理了一份客户在使用RK3399开发板过程中经常遇到的几个问题,并提供了解决思路. RK3399开发板简介: ...

  7. 微信小程序this.setData修改对象中某个属性的值

    前言 做过微信小程序的同学都知道,this.setData() 方法可以修改或者更新 data 中的值 .那不知道大家有没有遇到这么一种情况,我要修改对象中某个属性的值该怎么办呢?是不是第一想到的就是 ...

  8. ROS:引用同一工作空间下其他包中的 .h 文件

    引用同一工作空间下其他package的'.h'文件,一种方法是创建library生成动态链接库'.so': [1]https://answers.ros.org/question/33779/how- ...

  9. vs2017/2019中pch.h和pch.cpp是个什么东西(附加,如何删除)

    v s 2017 / 2019 中 p c h . h 和 p c h . c p p 是 个 什 么 东 西 vs2017/2019中pch.h和pch.cpp是个什么东西 vs2017/2019中 ...

  10. latex_3_中文会议论文模板以及修改过程中遇到的问题的解决方案

    latex中文会议论文模板以及修改过程中遇到的问题的解决方案 latex中文会议论文模板 1 报出错误: LaTex Error: File "picins.sty" not Fo ...

最新文章

  1. 学习canvas 过程中的几点总结
  2. 读书笔记-《增长黑客》-低成本、高效率的精准营销
  3. 【计算理论】可判定性 ( 对角线方法 | 使用对角线方法证明 通用任务图灵机 语言 不可判定 )
  4. 利用commons-fileupload 上传图片(包含表单数据)
  5. Python Django手写分页代码
  6. 三种流行防火墙配置方案分析与对比
  7. redis集群信息分析-cluster info-cluster nodes
  8. js正则表达式限制文本框只能输入数字,小数点,英文字母
  9. 好用的平板电脑_小熊分享|这五款平板电脑的性价比绝了!
  10. mysql数据库多少张表会影响性能_mysql数据库多少张表会影响性能
  11. Linex第三章第四章
  12. 标准Android按钮具有不同的颜色
  13. 实验假设与分析方法(参数与非参检验)
  14. w ndows10怎么关闭启动项,win10怎么关闭开机启动项
  15. java一个字符几个字节_Java 语言中一个字符占几个字节?
  16. 2.2析取范式与合取范式
  17. 监听Home键和返回键
  18. 图灵奖得主Yann LeCun的六十年
  19. JSONObject.put 覆盖原有数据,解决办法
  20. Wonderware-InTouch Historian WorkBook部件制作简易SPC

热门文章

  1. 类别不平衡问题之SMOTE算法(Python imblearn极简实现)
  2. 《软件工程》真题考点
  3. 3dmax测试软件自动关闭,3dmax软件会自动关闭解决方案
  4. 推荐一款在线工具-程序员的工具箱
  5. java web背景颜色表,更改表行背景颜色
  6. JS判断数组元素是否重复
  7. 计算机网络经过了几个阶段,计算机网络的发展经过哪几个阶段?
  8. 计算机中计算排名用什么公式,最全面的Excel函数排名公式汇总
  9. 字节跳动面试题 —— 水壶问题
  10. 实验一高频小信号调谐放大器