打印
[技术讨论]

百问网全志D1h开发板MIPI屏幕触摸功能适配

[复制链接]
148|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
神棍地海棠|  楼主 | 2024-6-25 10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件了解
[size=15.008px]首先,还是从官方提供的资料,可以了解MIPI LCD对应的接口信息:
[size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141906868718[color=var(--secondary-high)]774×1288 133 KB


[size=15.008px]触摸功能涉及到DSI_SCL、DSI_SDA、TP_INT、TP_RESET。
[size=15.008px]从芯片的引脚图里面,可以了解到:
[size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141907831990[color=var(--secondary-high)]1356×880 190 KB


[size=15.008px]其中:
  • DSI_SCL、DSI_SDA使用的是PB0、PB1
  • TP_INT和TP_RESET使用的是:PB6、PB4
设备树修改
[size=15.008px]参考 [color=var(--tertiary)]嵌入式开发问答社区100ASK_V853-PRO开发板支持4寸MIPI屏 进行设备树修改。
[size=15.008px]设备树文件:
tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4/board.dts
  • 检查设备树中的twi2_pins_a、twi2_pins_b的配置:
        twi2_pins_a: twi2@0 {                pins = [color=var(--hljs-string)]"PB0", [color=var(--hljs-string)]"PB1";                [color=var(--primary-very-high)]function = [color=var(--hljs-string)]"twi2";                drive-strength = <10>;        };        twi2_pins_b: twi2@1 {                pins = [color=var(--hljs-string)]"PB0", [color=var(--hljs-string)]"PB1";                [color=var(--primary-very-high)]function = [color=var(--hljs-string)]"gpio_in";        };
[size=15.008px]确保其中引脚与前面硬件了解中的一致。
  • 修改触摸屏的配置:
&twi2 {        clock-frequency = <[color=var(--hljs-number)]400000>;        pinctrl[color=var(--hljs-number)]-0 = <&twi2_pins_a>;        pinctrl[color=var(--hljs-number)]-1 = <&twi2_pins_b>;        pinctrl-names = [color=var(--hljs-string)]"default", [color=var(--hljs-string)]"sleep";        dmas = <&dma [color=var(--hljs-number)]45>, <&dma [color=var(--hljs-number)]45>;        dma-names = [color=var(--hljs-string)]"tx", [color=var(--hljs-string)]"rx";        status = [color=var(--hljs-string)]"okay";        ctp@[color=var(--hljs-number)]38 {                compatible = [color=var(--hljs-string)]"focaltech,fts";                reg = <[color=var(--hljs-number)]0x00000038>;                status = [color=var(--hljs-string)]"okay";                interrupt-parent = <&pio>;                interrupts = <PB [color=var(--hljs-number)]6 IRQ_TYPE_LEVEL_LOW>;                focaltech,reset-gpio = <&pio PB [color=var(--hljs-number)]4 GPIO_ACTIVE_HIGH>;                focaltech,irq-gpio = <&pio PB [color=var(--hljs-number)]6 IRQ_TYPE_LEVEL_LOW>;                focaltech,max-touch-number = <[color=var(--hljs-number)]5>;                focaltech,display-coords = <[color=var(--hljs-number)]0 [color=var(--hljs-number)]0 [color=var(--hljs-number)]800 [color=var(--hljs-number)]480>;                focaltech,reg_vdd = <[color=var(--hljs-number)]0x0000001f>;                focaltech,reg_avdd = <[color=var(--hljs-number)]0x0000001f>;                #touchscreen-inverted-x = <0x00000001>;                #touchscreen-inverted-y = <0x00000001>;        };};
[size=15.008px]确保其中引脚与前面硬件了解中的一致。
驱动程序
[size=15.008px]如果不修改驱动程序,触摸功能也能使用上,但是x轴是左右反向的,y轴也是如此,在设备树中不能定义处理,需要修改驱动程序。
具体如下。
[size=15.008px]驱动文件:
lichee/linux-5.4/drivers/input/touchscreen/focaltech_touch/focaltech_core.c
[size=15.008px]修改xy坐标返回值:
# 默认:                        [color=var(--hljs-string)]input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x);                        [color=var(--hljs-string)]input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y);# 修改为:                        [color=var(--hljs-string)]input_report_abs(data->input_dev, ABS_MT_POSITION_X, [color=var(--hljs-number)]480-event->au16_x);                        [color=var(--hljs-string)]input_report_abs(data->input_dev, ABS_MT_POSITION_Y, [color=var(--hljs-number)]800-event->au16_y);
[size=15.008px]因为屏幕是480x800的,所以直接用对应的宽高减去获得的值即可。
配置修改
  • 通用配置修改:
[color=var(--hljs-builtin-name)]make menuconfig
[size=15.008px]选择:Kernel modules > Input modules -> kmod-input-core

  • 选择:Kernel modules > Input modules -> kmod-touchscreen-focaltech
  • # 其他触屏不选
  • [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141915172406[color=var(--secondary-high)]1352×848 238 KB


    • 内核配置修改:
    [color=var(--hljs-builtin-name)]make kernel_menuconfig
    [size=15.008px]选择:Device Drivers > Input device support > Touchscreens -> Focaltech Touchscreen
  • # 其他不选
  • [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141916168969[color=var(--secondary-high)]1400×860 202 KB


    编译烧录
    [size=15.008px]修改完成后,就可以进行编译打包make -j16 && pack,最终结果如下:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141917046336[color=var(--secondary-high)]1012×392 85.9 KB


    [size=15.008px]然后使用烧录工具进行烧录即可。
    MIPI LCD测试
    [size=15.008px]将 MIPI LCD和板子连接好,注意连接正确:
    [size=15.008px]然后用adb shell或者串口连接进行操作。
    • 查看系统连接的触摸设备:
    [color=var(--hljs-builtin-name)]cat /dev/input/
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141919215450[color=var(--secondary-high)]972×224 41.9 KB


    [size=15.008px]从上面的输出可以看到event2,表示识别到了。
    [size=15.008px]再看看系统启动输出信息中,对应的适配信息:
    dmesg | [color=var(--primary-very-high)]grep -A4 -B4 fts
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141919915702[color=var(--secondary-high)]1434×420 174 KB


    [size=15.008px]可以看到,已经成功适配,没有出错信息。
    • 直接查看设备返回信息检查触摸是否有效:
    [color=var(--hljs-builtin-name)]cat /dev/input/event2  | hexdump -x
    [size=15.008px]执行后,点击屏幕任一位置,有返回,说明能够接收到触摸数据了:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141921825121[color=var(--secondary-high)]1030×504 181 KB


    • 屏幕校准
      初次使用屏幕时,需要进行屏幕校准,确保点击位置准确,以免发生偏差。
    [color=var(--hljs-comment)]## 触屏校准[color=var(--hljs-builtin-name)]export TSLIB_CALIBFILE=/etc/pointercal[color=var(--hljs-builtin-name)]export TSLIB_CONFFILE=/etc/ts.conf[color=var(--hljs-builtin-name)]export TSLIB_PLUGINDIR=/usr/lib/ts[color=var(--hljs-builtin-name)]export TSLIB_CONSOLEDEVICE=none[color=var(--hljs-builtin-name)]export TSLIB_FBDEVICE=/dev/fb0[color=var(--hljs-builtin-name)]export TSLIB_TSDEVICE=/dev/input/event2ts_calibrate
    [size=15.008px]执行后,输出如下:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141922781640[color=var(--secondary-high)]848×304 86.3 KB


    [size=15.008px]此时屏幕显示如下:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141924390191[color=var(--secondary-high)]1706×1279 231 KB


    [size=15.008px]点击左上角的那个 + ,又会出现下一个,依次点击:左上、右上、右下、左下、中间,最后黑屏。
    [size=15.008px]输出信息如下:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141925250949[color=var(--secondary-high)]964×498 87.2 KB


    [size=15.008px]点击的时候,如果点左上角,发现X值是400+,Y值是700+,那铁定是前面的驱动文件没有修改或者修改不对,或者修改了没有重新编译烧录。
    [size=15.008px]校准完成后,重启生效:
    sudo reboot -d 0
    • 使用lvgl测试用例
      在使用lv_examples之前,需要做一些修改,使得触摸使用/dev/input/event2
      文件:
    ~/tina-d1-h/package/gui/littlevgl-8lv_examples/src/lv_drv_conf.h
    [size=15.008px]修改:
    [color=var(--primary-very-high)]define EVDEV_NAME   [color=var(--hljs-string)]"/dev/input/event2"
    [size=15.008px]修改完成后,重新编译烧录即可。
    [size=15.008px]然后,使用 lv_examples进行测试:
    [color=var(--hljs-string)]lv_examples [color=var(--hljs-number)]9999
    [size=15.008px]会输出如下结果,表示有5个测试用例可用:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]image[color=var(--secondary-high)]780×244 24.6 KB


    [size=15.008px]大家可以依次测试看看效果如何。
    [size=15.008px]这里就展示lv_examples 0,结果如下:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141928400692[color=var(--secondary-high)]752×170 38.6 KB


    [size=15.008px]屏幕显示如下:
    [size=15.008px][color=var(--tertiary)][color=var(--secondary)]17141928934191[color=var(--secondary-high)]1706×1279 310 KB


    [size=15.008px]左右滑动,上下滑动,或者点击屏幕上的输入位置,就能够进行操作了。
    触摸操作的时候,如果发现上面点了下面动,下面点了上面动,或者滑动刚好和实际方向相反,那铁定是前面的驱动文件没有修改或者修改不对,或者修改了没有重新编译烧录。
    [size=15.008px]现在,屏幕适配好了,触摸也适配好了,后面就可以学学LVGL,来进行界面和互动设计开发了。

    使用特权

    评论回复

    相关帖子

    发新帖 我要提问
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    230

    主题

    238

    帖子

    0

    粉丝