Openharmony(鸿蒙)适配 RK3568触摸屏(7寸GT911)

        注意:openharmony的触摸屏适配涉及 Linux内核 + Linux应用层

        其实说难不难,说简单也不简单,如果你对Linux内核熟悉,基本成功50%,如果你对Linux应用层熟悉那就100%了。主要还是可以看懂别人到底想干嘛,按照基本触摸屏的传统编写思路去分析就可以了。

1、前情

        openharmony的触摸与传统的不一样。

        传统触摸驱动比如QT,他们都是利用tblib这个库来进行获取屏幕触摸,其实就是Linux内核上报触摸数据 + 应用层获取解析。

        openharmony触摸驱动,其实差不多,但是还是很有差别,而是抛弃编写对应的Linux内核屏幕驱动,抛弃tblib库 获取屏幕触摸数据,这就是麻烦之处。其实仔细去看源码,你会发现是自己造轮子,有点多此一举,但是他们是为了兼容RTOS和Linux之类的区分,也是可以理解的。

2、openharmony移植修改篇

        2.1、修改hcs文件

        openharmony的hcs文件类似设备树,但是比设备树复杂一点,主要是分的太杂,跟大公司分一个业务一样,分的太开造成的不容易理解,但是容易找对应的负责人。

        我们只需要修改两个hcs文件,分别是input_config.hcs、device_info.hcs。

        2.11 device_info.hcs修改


        device_info.hcs:主要就是匹配作用,跟设备树一样,需要关注的是名字,deviceMatchAttr对应input_config.hcs,moduleName对应.C代码对应匹配。

        

        如上图所示,我们只需要关注两个节点,device_hdf_touch和device_touch_chip。

        因为我们后面只需要修改这两个节点对应的input_config.hcs的对应节点 和 相对应的.C文件代码。

        2.12 input_config.hcs文件修改

        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的修改。

       

        2.2、修改.C代码文件

        2.21、修改hdf_touch.C

               名字(device_info.hcs对应) 其他函数不需要管,看这个就行

        

        大概的流程:1、解析图.input_config-01的配置信息(屏幕参数、引脚信息等等)2、I2C的初始化,就是打开I2C。        

        我们这里只看TouchDriverInit- ->>TouchSetupBus,这个是函数是需要重点修改的,其他的我相信大家都看得懂,简单到爆。

        TouchSetupBus:

        这个函数里面有关于对I2C的引脚初始化,因为这些初始化必定出错,因为我们根本就没有配置对应的引脚信息,我们注释掉,其他就无所谓了。如果启动打印可以成功,说明I2C初始化完毕。

        这里可以追踪他,这个I2C初始化对应哪个呢,其实仔细观察,就是Linux的I2Cadapter的获取注册,在i2c_adapter.c可以看到Linux的注册,这里函数打开。

        2.22、修改touch_gt911.c

        大家应该都看得到,名字(device_info.hcs对应)、匹配函数,都是需要重点关注的。

       大概的流程:1、首先也是解析配置信息,获取deviceAddr、irq_flag等等的信息。2、注册gt911驱动。

        我们重点关注这个函数RegisterTouchChipDevice -->>ChipDriverInit函数,里面才是重点修改,其他的函数,我们很轻易就可以看懂,且不需要修改。

1、ChipDriverInit:

        这个函数的流程:1、首先SetPowerOnTiming初始化屏幕的复位和中断引脚信息等等。2、chipDev->ops->Detect检测屏幕的I2C是否通过。3、固件更新。 4、SetupChipIrq注册触摸中断获取数据函数。

1、我们只需要保留这几行代码,就是检测I2C到底有没有检测到屏幕、以及SetupChipIrq注册触摸中断,其他一律不需要,我相信写过这个屏幕的驱动的人都是比较了解这个流程。

2、SetPowerOnTiming:里面初始化复位GPIO,我们不需要,因为我们根本不知道对应的关系。

3、后面注释的代码是更新什么固件,我们更不需要了。

2、修改对应的触摸接收函数 ParsePointData:

 SetupChipIrq其实最终注册给Linux的中断函数是

        我们需要修改的是ChipDataHandle-->>ParsePointData函数。

        ParsePointData:

        里面就是针对各种情况编写的屏幕坐标点上报 x\y转换,太无语了,编写过GT911的应该知道怎么修改,这里贴上代码,其实就本本分分的就可以了。

        到此为止,我们修改了配置文件和.C代码,就已经全部完成了,总结一下我们需要修改的内容:

        1、打开I2C,注册到openharmony的驱动上。

        2、检测屏幕I2C是否存在,注册屏幕被按下触发中断的函数。

        其实就这几个部分,但是回顾上文,我们好像还缺少了对I2C的引脚的初始化、对中断引脚和复位引脚的初始化 这三个。但是我们又不知道对应的I2C寄存器信息,引脚的寄存器信息,那怎么办?????

        那谁知道呢?很显然!!开源大哥Linux知道,而我们的openharmony就是在Linux上的,所以,我们可以在Linux原有的GT911驱动上指定我们对应的信息,然后在总线匹配的.C文件中,我们修改驱动,只对引脚初始化,其他不要,好了,那么现在就解决了。

3、Linux移植修改篇

        3.1、修改设备树

                指定好对应的I2C引脚、复位引脚、中断引脚就可以了

        

        3.2、修改平台匹配.C文件 ( goodix.c)

           大家如果编写过过pinctrl的总线驱动或者自身有了解过pinctrl机制,就知道,在平台总线匹配的时候,会在对应的过程找到设备树的引脚信息,进行引脚的初始化。

        

        这个函数就是去找pinctrl的总线的驱动里面的等等配置函数初始化,不难,也不算简单。

        之后就是大家熟悉的总线模型了   

        之后就是goodix_ts_probe:

        总之,基本都不要,只需要Linux的引脚初始化

        好了,这下我们都修改完毕了,期间有可能的问题就只是屏幕是否可以检测到、是否中断接收到数据等细节问题,移植完毕。可以在屏幕上触摸啦。

        其实今年年初接触这个的时候,就已经移植好了,一直想编写分享,网上看到的大多是只处理Linux的屏幕驱动这个就可以,其实跟Linux那边的触摸屏驱动没关系,这个是独立开来的,所以大家可以先在Linux上验证自己的屏幕硬件没问题,再进行移植。

 额外:

        回头看过去,其实原理很简单,如果大家是从单片机一步步走过来的,那么这个移植其实并不难,都是套来套去,只不过框架性的问题。​​​​​​​

<think&gt;好的,用户的问题是关于HarmonyOS 5.0在RK3568硬件平台上支持的分辨率配置及设置方法。首先,我需要结合用户提供的引用内容来整理相关信息。 首先,用户提供的引用[1]提到RK3568开发板支持多种显示接口,如HDMI2.0、MIPI、LVDS等,并且支持多屏异显。这说明RK3568在硬件上具备处理不同显示输出的能力。引用[3]提到了在OpenHarmony中使用libdrm的modetest工具进行屏幕测试,这可能与分辨率设置相关。引用[4]讨论了屏幕方向配置,虽然主要涉及方向调整,但也可能影响到分辨率的适配。引用[5]中的性能工具可能帮助验证分辨率设置后的效果。 接下来,我需要确定HarmonyOS 5.0在RK3568上的具体分辨率支持。通常,分辨率支持取决于硬件接口和驱动程序。根据引用[1],RK3568支持4K解码,可能意味着HDMI接口支持4K输出。而MIPI/LVDS等接口可能支持不同的分辨率,具体需要查看屏幕规格和设备树配置。 然后,设置方法可能涉及修改设备树(dts文件)来配置显示参数,如引用[2]中修改内核配置的示例。此外,引用[3]提到的modetest工具可以用来测试和设置分辨率。系统配置文件如引用[4]中的module.json5可能用于应用级别的方向设置,但分辨率设置更多是在底层驱动或系统服务中处理。 需要注意用户可能混淆了HarmonyOSOpenHarmony的版本,但根据引用内容,用户应该是指基于OpenHarmony的版本。因此,回答需要明确说明基于OpenHarmony的环境,并引用相关的配置文件和工具。 最后,应提供验证方法,如使用引用[5]中的性能工具检查显示性能,或者通过adb命令获取当前分辨率。同时,提醒用户注意屏幕硬件支持的最大分辨率,以及驱动和系统服务的兼容性。 总结回答的结构:先说明硬件支持的分辨率类型,然后介绍配置方法(设备树修改、modetest工具),再提供验证步骤和相关注意事项,确保用户能逐步操作并解决问题。</think&gt;### HarmonyOS 5.0(基于OpenHarmony)在RK3568上的分辨率支持及设置方法 #### 一、硬件分辨率支持 RK3568芯片支持多显示接口(HDMI2.0、MIPI、LVDS等),**最高支持4K@60Hz输出**,具体分辨率取决于连接的屏幕硬件规格和驱动配置[^1][^3]。例如: - **HDMI接口**:支持1080P@60Hz、4K@30Hz/60Hz等常见分辨率 - **MIPI/LVDS接口**:分辨率由屏幕模组决定(如800x1280、1920x1200等) #### 二、分辨率配置方法 1. **设备树配置(DTS文件)** 在RK3568Linux内核设备树文件中定义显示参数: ```c // 示例:HDMI输出配置(路径:kernel/linux/arch/arm64/boot/dts/rockchip/rk3568.dtsi) &hdmi { status = "okay"; ddc-i2c-bus = <&i2c5&gt;; pinctrl-names = "default"; pinctrl-0 = <&hdmitx_scl &hdmitx_sda&gt;; }; ``` 需根据屏幕规格修改`display-timings`节点中的时序参数[^2]。 2. **使用modetest工具验证** OpenHarmony内置的`libdrm`库提供`modetest`命令行工具,可枚举支持的显示模式和分辨率: ```bash modetest -M rockchip # 显示所有可用模式 modetest -M rockchip -s <connector_id&gt;@<crtc_id&gt;:<mode&gt; # 设置分辨率 ``` 例如设置HDMI为1920x1080@60Hz: ```bash modetest -M rockchip -s 42@35:1920x1080@60 ``` 3. **系统显示服务配置** 在`/system/etc/init/`目录下的显示服务配置文件中定义默认分辨率,例如: ```json { "services": [ { "name": "display_service", "resolution": "1920x1080", "refresh_rate": 60 } ] } ``` #### 三、验证分辨率设置 1. 通过`hdc shell`进入设备命令行,执行: ```bash dumpsys display | grep curMode # 查看当前分辨率 ``` 2. 使用SmartPerf工具监控显示性能: ```bash device-daemon -f com.example.app -VIEW # 采集屏幕刷新率数据[^5] ``` #### 四、注意事项 1. 多屏异显需确保不同接口的分辨率不超过硬件限制 2. 屏幕旋转配置需同步修改`module.json5`中的`orientation`字段[^4] 3. 4K分辨率需确认HDMI线材和屏幕支持HDMI2.0标准
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值