最近为一个项目调试TP,现将遇到的问题总结如下。
平台为国产某款soc,TP型号Atmel mXT。
1、从TP功能调通后回看TP调试,个人感觉调试难度不大。TP厂商已将TP源码给给出,我主要做的工作是验证probe内的代码逻辑是否正常走完,I2C通讯是否正常。我调试过程中,能够通过I2C读到芯片ID,证明I2C通信没有问题。查看log发现,TP中断申请函数注册失败,申请API如下。
error = request_threaded_irq(client->irq, NULL, mxt_interrupt, pdata->irqflags, client->dev.driver->name, data); if (error) { dev_err(&client->dev, "Error %d registering irq\n", error); goto err_free_input_device; } data->irq_enabled = true;
出错log提示和irqflags相关,看log怀疑其中的一个IRQF_ONESHOT属性,但是对于TP这种外设需要该属性,中断服务函数中有I2C的读写操作,不希望被终止。这只是理论,实际试一下即可,去掉IRQF_ONESHOT属性,仍申请失败,将irqflags试了很多种组合也不行。
最后只能更改中断注册方式,用request_irq()申请中断,然后用work queue方式将中断服务函数加到工作队列当中,放弃线程化中断申请。部分代码如下。
做了如上改动后,TP功能可用,调试完成。至于用线程化中断申请为何失败,原因在查,也欢迎各位大侠们评论、指正。
2、在功耗优化时,也发现一个比较严重问题,给TP供电的一路LDO在灭屏状态下无法掉电。这个问题查了好久,甚至怀疑过平台BUG,因为调用regulator_disable(),查log函数返回正确值,查看LDO对应寄存器值没有改变。最后发现TP的灭屏掉电策略没有采用early suspend方式,而是notifier LCD,“监控”LCD状态来上下电,系统在启动到内核阶段,LCD不知为何会“enable”一次,导致TP初始化时会regulator_enable()两次,深坑啊!!!,把哥坑的太惨了!!!只能在TP驱动里做个逻辑处理,规避系统启动时因LCD二次regulator_enable()。