前言:
以在mtk6737平台移植汇顶的GT910举例,建议正式调试的前一天把代码完整编译一遍,假如时间来不及,至少
要先编译内核,编译eng或者userdebug版本。一般要提前准备:主板、TP模组、串口线、硬件原理图,供应商提供
芯片手册、规格书、驱动代码和cfg参数等。调试最开始首先要了解TP芯片的型号、屏幕分辨率、主板上面TP座子位
置、供电方式、中断和复位脚的GPIO号、用到哪组i2c总线核对主板座子和规格书里面排线线序是否一致。接下来第
一个小目标就是调通i2c,读到正确的ID值。
TP(触摸屏)的大致工作流程是:主控芯片与TP芯片通过i2c总线通讯,它们之间一般有6个引脚相连接,分别是VDD、
RESET、SCL、SDA、INT、GND。开机过程中系统会对TP芯片进行上电初始化,之后TP处于待命状态。当TP模组
表面有触摸时,会产生中断,接着在中断处理函数中唤醒触摸事件的线程,在线程里面通过i2c读取点坐标信息上报给
系统层。
1、移植芯片driver驱动代码
把厂家提供的GT910的代码复制到以下目录,有时候要把另外提供的CFG参数替换到gt9xx_config.h的CTP_CFG
_GROUP1中
kernel-3.18/drivers/input/touchscreen/mediatek/
驱动代码gt9xx_driver.c中需要重点关注的一些函数:
static int __init tpd_driver_init(void); /*一般阅读驱动的代码是从最下面的module_init里面的函数开始*/
void tpd_get_dts_info(void); /*读取设备树touch节点的属性*/
static int tpd_local_init(void); /*在这里添加i2c driver*/
static s32 tpd_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id); /*匹配成功才调用这个函数*/
static int tpd_power_on(struct i2c_client *client); /*上电和复位*/
s32 gtp_read_version(struct i2c_client *client, u16 *version); /*读取版本号,在这里可以确认i2c通讯是否成功*/
static s32 gtp_init_panel(struct i2c_client *client); /*TP芯片的初始化*/
static int touch_event_handler(void *unused); /*触摸事件处理线程,中断产生时会唤醒这个线程*/
static void tpd_down(s32 x, s32 y, s32 size, s32 id); /*上报点坐标*/
如果感兴趣,可以等驱动调通后再更加仔细地阅读代码,在内核中用dump_stack(); 函数可以查看当前函数被
哪些函数调用,对跟读代码很有帮助。
a、供电方面要注意,主板上是采用pmic输出2.8V,还是外部独立的LDO供电,根据硬件原理图来定。
//pmic输出2.8V的部分控制代码
tpd->reg = regulator_get(tpd->tpd_dev, "vtouch");
ret = regulator_set_voltage(tpd->reg, 2800000, 2800000); /*set 2.8v*/
if (ret) {
printk("regulator_set_voltage(%d) failed!\n", ret);
return -1;
}
ret = regulator_enable(tpd->reg); /*使能电源*/
//独立的LDO供电方式,则是控制某个gpio输出高、低电平
#define GTP_POWER_PORT (GPIO22 | 0x80000000)
/*MTK旧的平台可以直接这样调用GPIO,Android7.0及以后建议改用从dts里面读取*/
mt_set_gpio_mode(GTP_POWER_PORT, GPIO_MODE_00);
mt_set_gpio_dir(GTP_POWER_PORT, GPIO_DIR_OUT);
mt_set_gpio_out (GTP_POWER_PORT, 1); //输出高电平,使能LDO的2.8V
b、检查一下的复位时序
void gtp_reset_guitar(struct i2c_client *client, s32 ms);
c、看看申请中断的部分,少数时候要修改compatible匹配名称
d、针对这个芯片,不需要固件升级