Porting Tp 问题总结

本文介绍在MTK平台上移植和调试TP(触摸屏)驱动的过程,包括配置文件设置、驱动源码位置、常见问题及其解决方案等内容。
首先是在Porting Tp驱动的时候要注意几个重要的的几个文件
(1)配置文件的设置
ProjectConfig.mk       //mediatek/config/项目名/ProjectConfig.mk
主要配置的是所要porting tp 驱动的文件名 如CUSTOM_KERNEL_TOUCHPANEL =  xx 
单款tp的话跟一个文件驱动就行了,如果做的多款tp的话就跟多个文件驱动名就行,多款之间以空格分开
如XXX项目中多款tp驱动的兼容定义如下:
CUSTOM_KERNEL_TOUCHPANEL = tma568 st_fts ft5336 bt532
还有就是tp的中断管脚及时钟管脚的配置了,这个可以通过硬件设计的pcb电路图通过mtk提供的dws工具来配置
 工具位置:  mediatek/dct/DrvGen.exe 
 打开文件配置: mediatek/custom/Projectname/kernel/dct/dct/codegen.dws
(2)驱动源码文件及位置
一般驱动都是ic厂商写好提供驱动源码包给我们然后添加到我们所做的项目中,根据不同平台来修改部分的ic厂商给我们的驱动代码,比如高通平台移植到mtk平台,以及mtk平台不同型号芯片的移植。
驱动文件一般可能放在两个位置:
/mediatek/custom/common/kernel/touchpanel/驱动文件

/mediatek/custom/项目名/kernel/touchpanel/驱动文件


问题及总结


在调试Cypress Tp时由于这款tp的驱动是依照高通平台而写的驱动所以移植到mtk平台时遇到很多问题,下面列出几个在调试中遇到的问题及解决办法:
1)在调试时从log上看在i2c通信的时候一直报一个通信速度过快,但从其他兼容的tp上看i2c的通信都没有出现过这样的问题,最终判断可能是Cypress 的硬件不支持那样的i2c通信的速率.


解决办法:在i2c读写的时候通过设置改变i2c读写主系统时钟来解决该问题,从mtk6589文档上写关于i2c的默认速率是i2c_msg.timing=400 ,所以在i2c的读写数据时将i2c_msg.timing=100后解决此问题。


2)Tp调试时出现一个中断只来一次的问题,在调试过成中发现在只有在每次开机启动时才产生一次中断,也就是在刚初始化完毕后来了一次中断此后就没有再报有tp中断。


问题原因:通过和其他Tp驱动工程师交流找到了问题的所在,配置中断时没有配置好,mtk关于Tp中断的配置方面有两种方式,一个是中断产生处理由硬件自动开启关闭中断,另一个方式是需要在中断处理时软件手动的去开启和关闭中断。而我们采用的是手动去开启和关闭中断,但是在中断处理函数中却没有对开启和关闭中断做处理导致出现这样的问题,通过下面函数实现硬件或软件方式来处理中断。
mt65xx_eint_registration(CUST_EINT_TOUCH_PANEL_NUM, CUST_EINT_TOUCH_PANEL_DEBOUNCE_EN, CUST_EINT_TOUCH_PANEL_POLARITY, eint_interrupt_handler, 1);  //最后一个参数决定通过那种方式来处理中断 如果是1表示硬件在处理中断时自动开启和关闭中断,如果是0表示需要在中断处理函数中手动软件去开启和关闭中断。


解决办法: 将mt65xx_eint_registration函数最后一个参数设置为1让硬件自动开启和关闭中断。


3)TP能够正常报点,打开设置中的显示报点坐标也可以清晰的看到所触摸的点,但是屏幕始终没有响应点击。
问题原因:通过进入手机终端输入命令getevent发现有两个同名的tp设备被注册,并有两个event事件同时报点,通过检查驱动代码发现在驱动的prob函数对该设备进行了注册,然后再将注册的值反馈出去“tpd->dev = md->input;”但从mtk的设计上看在mtk_tpd.c中就已经对tp进行了注册,所以进入手机终端看会有两个相同的注册设备以及相同的报点事件导致报点不能被识别。导致这样的原因主要受到高通平台的驱动思维的影响。


解决办法:由于不对驱动代码有太大的改动而导致驱动不稳采用了一种比较折中的办法,将tpd->dev = md->input;这句屏蔽掉,并且改了一下注册驱动的名称,最后从手机终端看会有两个注册的tp设备,但报点只有一个满足了要求,上层也响应了点击事件。


4)TP 固件升级出现问题,在升级过程中一直读取设备信息失败,读取的数据一直报错不符合要求。


问题原因:在升级固件时写数据后会同时产生一个中断事件,而中断事件在处理时会去对设备的数据进行读取,从ic厂商给的数据手册上看,在读取设备hid信息时是可被中断打断的,但是从读取的结果来看不与相符,当中断读取信息完成后如果再次去读取时,读取的数据会变为空,所以在设备读取信息是一直报错,读取不到数据。


解决办法:在中断对于特殊情况写命令后对中断里数据进行限制性读,也就是在发送写命令读取设备信息时让中断里不读取数据,从而解决了该问题,成功的升级固件。
如果是你说的 cwmp 根元素决定如何处理这个xml信息 那cwmp main core 等文件如何被触发 还是进程一直存在 直到检测到什么信息之后直接运行吗/* Copyright © 2024 TP-Link Systems Inc. * * file cwmp_main.c * brief * details * * author Wu Zhiqin * version * date 15Sep11 * * history \arg */ #include <string.h> #include <sys/resource.h> #include "os_lib.h" #include "dm_objIdStr.h" #include "dm_init.h" #include "rdp.h" #include "cwmp_main.h" #include "cwmp_rpc.h" #include "cwmp_core.h" #include "cwmp_httpServer.h" #include "cwmp_util.h" #include "cwmp_inform.h" #include "cwmp_porting.h" #ifdef INCLUDE_TR111_PART2 #include "cwmp_stun.h" #endif /* INCLUDE_TR111_PART2 */ #ifdef INCLUDE_CONTAINER #include "cwmp_tr157_priv_opObj.h" #endif /*INCLUDE_CONTAINER*/ #ifdef INCLUDE_SEC_CWMP_NONROOT #include "minicap.h" #endif /* INCLUDE_SEC_CWMP_NONROOT */ /**************************************************************************************************/ /* DEFINES */ /**************************************************************************************************/ #define CORE_SIZE (1024 * 1024 * 5) /**************************************************************************************************/ /* TYPES */ /**************************************************************************************************/ /**************************************************************************************************/ /* EXTERN_PROTOTYPES */ /**************************************************************************************************/ extern CPE_MACHINE cpeClient; extern int gNeedSendGetRPC; #ifdef INCLUDE_CWMP_SSL_VERIFY_PEER extern UBOOL8 g_verifyPeerEnable; #endif /* INCLUDE_CWMP_SSL_VERIFY_PEER */ /**************************************************************************************************/ /* LOCAL_PROTOTYPES */ /**************************************************************************************************/ /**************************************************************************************************/ /* VARIABLES */ /**************************************************************************************************/ CWMP_USERDATA g_udata; /* for port mirror history use,get SourceIP and Origin */ #ifdef INCLUDE_PORT_MIRROR_HISTORY char g_UIClientIpAddr[BUFLEN_40]; #endif /* INCLUDE_PORT_MIRROR_HISTORY */ /**************************************************************************************************/ /* LOCAL_FUNCTIONS */ /**************************************************************************************************/ /**************************************************************************************************/ /* PUBLIC_FUNCTIONS */ /**************************************************************************************************/ /**************************************************************************************************/ /* GLOBAL_FUNCTIONS */ /**************************************************************************************************/ int cwmp_main() { DM_NUM_STACK stack = EMPTY_STACK_NUM; DEV2_MANAGEMENT_SERVER_OBJ mngtServer; #ifdef INCLUDE_CWMP_SSL_CERT_SETTING DM_NUM_STACK cacertStack = EMPTY_STACK_NUM; DEV2_MANAGEMENT_CACERT_OBJ cacertObj; #endif /* INCLUDE_CWMP_SSL_CERT_SETTING */ CMM_RET ret; CWMP_USERDATA *pUdata = NULL; if ((ret = dm_shmInit(DM_SHMCTX_TR181, 0)) != CMM_OK) { CWMP_ERROR("CWMP attach to shared memory faild, ret = %d", ret); return ret; } #ifdef INCLUDE_NON_KEY_STORE ret = dm_shmInit(DM_SHMCTX_NONKEY, 0); if (CMM_OK != ret) { CWMP_ERROR("CWMP attach to shared memory failed, err = %d", ret); return ret; } #endif /* INCLUDE_NON_KEY_STORE */ #ifdef INCLUDE_GMS ret = dm_shmInit(DM_SHMCTX_GMS_CONTROLLER, 0); if (CMM_OK != ret) { CWMP_ERROR("CWMP attach to shared memory failed, err = %d", ret); return ret; } #endif /* INCLUDE_GMS */ if ((ret = rdp_getObjStruct(CMM_UI_TR69, DEV2_MANAGEMENT_SERVER, &stack, sizeof(DEV2_MANAGEMENT_SERVER_OBJ), &mngtServer)) != CMM_OK) { CWMP_ERROR("CWMP get app config failed, ret = %d", ret); return ret; } #ifdef INCLUDE_CWMP_SSL_VERIFY_PEER g_verifyPeerEnable = mngtServer.X_TP_CACertEn; #endif /* INCLUDE_CWMP_SSL_VERIFY_PEER */ #ifdef INCLUDE_CWMP_SSL_CERT_SETTING if (mngtServer.X_TP_CACertEn && (ret = rdp_getObjStruct(CMM_UI_TR69, DEV2_MANAGEMENT_CACERT, &cacertStack, sizeof(DEV2_MANAGEMENT_CACERT_OBJ), &cacertObj)) != CMM_OK) { CWMP_ERROR("CWMP get ca cert failed, ret = %d", ret); return ret; } #endif /* INCLUDE_CWMP_SSL_CERT_SETTING */ if(mngtServer.X_TP_Flag & CWMP_FLAG_LOG_PKG) { cwmpinit_logSoap(1); } if(mngtServer.X_TP_Flag & CWMP_FLAG_CERT_AUTH) { cwmpinit_SSLAuth(1); } if(mngtServer.X_TP_Flag & CWMP_FLAG_SENDGETRPC) { cwmpinit_sendGetRPC(1); } if(mngtServer.X_TP_Flag & CWMP_FLAG_SKIPMREBOOT) { cwmpinit_skipMReboot(1); } if(mngtServer.X_TP_Flag & CWMP_FLAG_SELFREBOOT) { cwmpinit_selfReboot(1); } if (mngtServer.X_TP_Flag & CWMP_FLAG_RETURN_503) { cwmpinit_return503(1); } if(mngtServer.X_TP_Flag & CWMP_FLAG_DIS_CONREQ_AUTH) { cwmpinit_disConReqAuth(1); } #ifdef INCLUDE_CWMP_SSL if (mngtServer.X_TP_Flag & CWMP_FLAG_CUSTOM_CA_CERT) { cwmpinit_useCustomerCa(TRUE); } if (mngtServer.X_TP_Flag & CWMP_FLAG_CUSTOM_CLI_CERT) { cwmpinit_useCustomerCert(TRUE); } #endif if (!(mngtServer.X_TP_Flag & CWMP_FLAG_KEEP_LONG)) { cwmpinit_long2Int(TRUE); } #ifdef INCLUDE_CWMP_SSL_CERT_SETTING if (mngtServer.X_TP_CACertEn) { cwmpinit_useDmCaCert(cacertObj.cert, mngtServer.X_TP_CustomCA); cwmpinit_useDmClientCert(NULL, NULL, FALSE); } #endif /* INCLUDE_CWMP_SSL_CERT_SETTING */ pUdata = cwmp_init_userdata(&mngtServer); if(NULL == pUdata) { CWMP_ERROR("ERROR: cwmp_init_userdata is fild, NULL == pUdata,,,"); return -1; } if(mngtServer.X_TP_Flag & CWMP_FLAG_DELAY) { cwmpinit_delayStart(pUdata); } memset(&cpeClient, 0, sizeof(CPE_MACHINE)); cpeClient.cpeState = CPE_ST_DISCONNECTED; cpeClient.cpeAuthType = CWMP_AUTH_NONE; cpeClient.cpeUser = pUdata; cpeClient.cpeSendGetRPC = gNeedSendGetRPC; cpeClient.socketfd = -1; #ifdef INCLUDE_AUTO_CHANGE_CWMP_INTF cpeClient.cpeRetryThreshold = mngtServer.X_TP_AutoChangeIntfThreshold; #endif /* INCLUDE_AUTO_CHANGE_CWMP_INTF */ cpeClient.waitDownloadSem = FALSE; pUdata->pMachine = (void *)&cpeClient; cwmp_port_updateUserdate(pUdata, &cpeClient); if (mngtServer.X_TP_Flag & CWMP_FLAG_FACTORY_RESET) { cwmp_addEvent(pUdata->pMachine, EC_BOOTSTRAP); } #ifdef INCLUDE_TR111_PART2 cwmp_initStun(pUdata); #endif #ifdef INCLUDE_CONTAINER initDu(); #endif /* INCLUDE_CONTAINER */ cwmp_webclient(pUdata); return 0; } #ifdef INCLUDE_SEC_CWMP_NONROOT static int drop_root_privilege(void) { unsigned long req_caps = 0; unsigned long amb_caps = 0; unsigned long test_caps = 0; unsigned long test_ambs = 0; #ifdef INCLUDE_SEC_LIBMINICAP_DEBUG test_caps = get_caps_from_file("cwmp_caps"); test_ambs = get_caps_from_file("cwmp_ambs"); #endif /* INCLUDE_SEC_LIBMINICAP_DEBUG */ if (test_caps > 0) { req_caps = test_caps; } else { req_caps |= (1ULL << CAP_NET_ADMIN); req_caps |= (1ULL << CAP_NET_RAW); req_caps |= (1ULL << CAP_NET_BIND_SERVICE); req_caps |= (1ULL << CAP_DAC_OVERRIDE); //req_caps |= (1ULL << CAP_SYS_BOOT); } if (test_ambs > 0) { amb_caps = test_ambs; } else { } return cap_change_user_caps(INCLUDE_SEC_CWMP_UID, INCLUDE_SEC_CWMP_GID, req_caps, amb_caps); } #endif /* INCLUDE_SEC_CWMP_NONROOT */ #ifdef __LINUX_OS_FC__ int main() { /* Linux core dump start */ chdir("/var"); struct rlimit limit = { .rlim_cur = CORE_SIZE, .rlim_max = CORE_SIZE }; setrlimit(RLIMIT_CORE, &limit); switch (fork()) { case -1: return(-1); case 0: break; default: _exit(0); } if (setsid() == -1) { return(-1); } if (fork()) { _exit(0); } chdir("/"); signal(SIGPIPE, SIG_IGN); #ifdef INCLUDE_SEC_CWMP_NONROOT if (drop_root_privilege() != 0) { CWMP_ERROR("drop root privilege failed."); _exit(1); } #endif /* INCLUDE_SEC_CWMP_NONROOT */ CWMP_INIT_MODULE_LEVEL(); /* Infinite loop */ cwmp_main(); return 0; } #endif /* __LINUX_OS_FC__ */
10-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值