赞
踩
注意:openharmony的触摸屏适配涉及 Linux内核 + Linux应用层
其实说难不难,说简单也不简单,如果你对Linux内核熟悉,基本成功50%,如果你对Linux应用层熟悉那就100%了。主要还是可以看懂别人到底想干嘛,按照基本触摸屏的传统编写思路去分析就可以了。
openharmony的触摸与传统的不一样。
传统触摸驱动比如QT,他们都是利用tblib这个库来进行获取屏幕触摸,其实就是Linux内核上报触摸数据 + 应用层获取解析。
openharmony触摸驱动,其实差不多,但是还是很有差别,而是抛弃编写对应的Linux内核屏幕驱动,抛弃tblib库 获取屏幕触摸数据,这就是麻烦之处。其实仔细去看源码,你会发现是自己造轮子,有点多此一举,但是他们是为了兼容RTOS和Linux之类的区分,也是可以理解的。
openharmony的hcs文件类似设备树,但是比设备树复杂一点,主要是分的太杂,跟大公司分一个业务一样,分的太开造成的不容易理解,但是容易找对应的负责人。
我们只需要修改两个hcs文件,分别是input_config.hcs、device_info.hcs。
device_info.hcs:主要就是匹配作用,跟设备树一样,需要关注的是名字,deviceMatchAttr对应input_config.hcs,moduleName对应.C代码对应匹配。
如上图所示,我们只需要关注两个节点,device_hdf_touch和device_touch_chip。
因为我们后面只需要修改这两个节点对应的input_config.hcs的对应节点 和 相对应的.C文件代码。
input_config.hcs:获取屏幕的参数、使用哪个i2c,i2c地址、复位和中断引脚是哪个等等。
HDF_TOUCH节点:
图.input_config-01
我们需要目前需要关注的节点:
match_attr:对应上面device_info.hcs的match_attr。
inputAttr:自己屏幕的参数。
busConfig->busType:触摸是I2C;busConfig->busNum:我使用I2C的是i2c0; 之后这个节点剩下的就是对应的I2C引脚的寄存器跟引脚号信息,跟Linux一样需要配置初始化,我不知道,但是我们有办法初始化它,后面有介绍,所有先这样子。
pinConfig:intGpio中断引脚,这个看自己原理图使用了哪个,这个还是很好找的,比如PA0,就是0; 剩下的触摸屏的复位引脚 以及 寄存器配置信息,暂时不理会,我也不知道寄存器信息。
这样子,对于HDF_TOUCH节点我们就全部定义好了。
HDF_TOUCH_GT911节点:
图.input_config-02
上面的图是什么意思,大家应该都猜得出来,就是对应我们需要修改的第二个节点,对应device_info.hcs的HDF_TOUCH_GT911节点。
主要关注busType和deviceAddr、irqFlag中断引脚的触发方式,对应好自己的I2C地址。
是不是感觉分得很开,是这样的,所以说,openharmony的代码很不友好,其实仔细看,里面很多辣鸡代码,比如上一段时间很兴起的软总线,其实就UDP广播+加密+TCP,但是介绍会上又是另一种说法了,但是其实总比没有好,还是挺不错的。
好了,到此为止,我们就已经修改完openharmony的hcs文件配置了,离我们完整的修改就差.C的修改。
名字(device_info.hcs对应) 其他函数不需要管,看这个就行
大概的流程:1、解析图.input_config-01的配置信息(屏幕参数、引脚信息等等)2、I2C的初始化,就是打开I2C。
我们这里只看TouchDriverInit- ->>TouchSetupBus,这个是函数是需要重点修改的,其他的我相信大家都看得懂,简单到爆。
TouchSetupBus:
这个函数里面有关于对I2C的引脚初始化,因为这些初始化必定出错,因为我们根本就没有配置对应的引脚信息,我们注释掉,其他就无所谓了。如果启动打印可以成功,说明I2C初始化完毕。
这里可以追踪他,这个I2C初始化对应哪个呢,其实仔细观察,就是Linux的I2Cadapter的获取注册,在i2c_adapter.c可以看到Linux的注册,这里函数打开。
大家应该都看得到,名字(device_info.hcs对应)、匹配函数,都是需要重点关注的。
大概的流程:1、首先也是解析配置信息,获取deviceAddr、irq_flag等等的信息。2、注册gt911驱动。
我们重点关注这个函数RegisterTouchChipDevice -->>ChipDriverInit函数,里面才是重点修改,其他的函数,我们很轻易就可以看懂,且不需要修改。
这个函数的流程:1、首先SetPowerOnTiming初始化屏幕的复位和中断引脚信息等等。2、chipDev->ops->Detect检测屏幕的I2C是否通过。3、固件更新。 4、SetupChipIrq注册触摸中断获取数据函数。
1、我们只需要保留这几行代码,就是检测I2C到底有没有检测到屏幕、以及SetupChipIrq注册触摸中断,其他一律不需要,我相信写过这个屏幕的驱动的人都是比较了解这个流程。
2、SetPowerOnTiming:里面初始化复位GPIO,我们不需要,因为我们根本不知道对应的关系。
3、后面注释的代码是更新什么固件,我们更不需要了。
SetupChipIrq其实最终注册给Linux的中断函数是
我们需要修改的是ChipDataHandle-->>ParsePointData函数。
ParsePointData:
里面就是针对各种情况编写的屏幕坐标点上报 x\y转换,太无语了,编写过GT911的应该知道怎么修改,这里贴上代码,其实就本本分分的就可以了。
到此为止,我们修改了配置文件和.C代码,就已经全部完成了,总结一下我们需要修改的内容:
1、打开I2C,注册到openharmony的驱动上。
2、检测屏幕I2C是否存在,注册屏幕被按下触发中断的函数。
其实就这几个部分,但是回顾上文,我们好像还缺少了对I2C的引脚的初始化、对中断引脚和复位引脚的初始化 这三个。但是我们又不知道对应的I2C寄存器信息,引脚的寄存器信息,那怎么办?????
那谁知道呢?很显然!!开源大哥Linux知道,而我们的openharmony就是在Linux上的,所以,我们可以在Linux原有的GT911驱动上指定我们对应的信息,然后在总线匹配的.C文件中,我们修改驱动,只对引脚初始化,其他不要,好了,那么现在就解决了。
指定好对应的I2C引脚、复位引脚、中断引脚就可以了
大家如果编写过过pinctrl的总线驱动或者自身有了解过pinctrl机制,就知道,在平台总线匹配的时候,会在对应的过程找到设备树的引脚信息,进行引脚的初始化。
这个函数就是去找pinctrl的总线的驱动里面的等等配置函数初始化,不难,也不算简单。
之后就是大家熟悉的总线模型了
之后就是goodix_ts_probe:
总之,基本都不要,只需要Linux的引脚初始化
好了,这下我们都修改完毕了,期间有可能的问题就只是屏幕是否可以检测到、是否中断接收到数据等细节问题,移植完毕。可以在屏幕上触摸啦。
其实今年年初接触这个的时候,就已经移植好了,一直想编写分享,网上看到的大多是只处理Linux的屏幕驱动这个就可以,其实跟Linux那边的触摸屏驱动没关系,这个是独立开来的,所以大家可以先在Linux上验证自己的屏幕硬件没问题,再进行移植。
额外:
回头看过去,其实原理很简单,如果大家是从单片机一步步走过来的,那么这个移植其实并不难,都是套来套去,只不过框架性的问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。