zoukankan      html  css  js  c++  java
  • 基于飞思卡尔i.MX 6Quad Sabrelite开发板的触摸屏调试


    1      概述

    本次任务是在飞思卡尔i.MX 6Quqd Sabrelite开发板上调试触屏驱动,触屏芯片是Goodix的gt828芯片,触屏接口是I2C。

    操作系统:android 4.0.4

    内核版本:3.0.15

    2      调试步骤

    2.1    硬件连接

    2.1.1    开发板硬件接口

    开发板已提供独立的接口用于触屏,其示意图如下:

    它提供了一组I2C,电源、地和一个GPIO口。

    2.1.2    GT828硬件接口

    触屏芯片GT828的硬件接口如下:


    其中INT是中断脚,RESET是复位脚,另一个需要注意的是芯片电压是3.3V。

    2.1.3    连接

    熟悉了开发板和芯片的硬件接口后,下一步就是要把他们连接起来。

    1)  首先是电源脚,因开发板触屏接口的电源是5V,而芯片电压是3.3V,所以要另找3.3V的电源跟芯片接上。

    2)  连接I2C管脚,开发板的I2C本身已有4.7K的上拉电阻,所以不用再外接上拉电阻。

    3)  把开发板的GPIO_9连到芯片的INT脚,用于控制中断。

    4)  芯片的RESET需要一个GPIO来控制,但开发板的触屏接口的GPIO脚只有一个GPIO_9,所以另找一个GPIO脚来控制RESET。

    连接方式如下:

    1       VCC33      =>     3.3V

    2       GND                   =>     接地

    3       SDA           =>     6       I2C3_SDA

    4       SCL            =>     5       I2C3_SCL

    5       INT            =>     4       GPIO9

    6       RESET       =>     DISP0_CONTRAST


    注:INT脚和RESET脚不用再外接上拉电阻。



    2.2    驱动修改

    1、  把厂家提供的驱动文件gt813_827_828.c和gt813_827_828.h文件放到内核目录Kernel_imx/drivers/input/touchscreen

     

    2、  修改gt813_827_828.h头文件。

    1)  修改宏开关:

    #defineGTP_CHANGE_X2Y        1    //x,y坐标互换
    #defineGTP_CREATE_WR_NODE    0  //不进行在线升级要设为0,否则编译不通过
    #defineGTP_ICS_SLOT_REPORT   1      //android 4.0配置成slot方式上报坐标


    2)  修改INT和RESET管脚定义

    #define GTP_RST_PORT   MX6Q_SABRELITE_TP_RST
    #define GTP_INT_PORT   MX6Q_SABRELITE_CAP_TCH_INT1


    其中MX6Q_SABRELITE_TP_RST 和MX6Q_SABRELITE_CAP_TCH_INT1定义在arch/arm/plat-mxc/include/mach/sabrelite.h文件中:

    #define MX6Q_SABRELITE_TP_RST                     IMX_GPIO_NR(2,0)
    #define MX6Q_SABRELITE_CAP_TCH_INT1      IMX_GPIO_NR(1, 9)

    这两个管脚的定义是怎么样来的呢?参考硬件连接:

    5                   INT            =>     4       GPIO9

    6                   RESET       =>     DISP0_CONTRAST

    首先看INT脚,连到CPU的GPIO9,我们在i.MX 6Quad的datasheet上搜索GPIO_9,找到IOMUXC_SW_MUX_CTL_PAD_GPIO09,它的MUX_MODE描述为:

    MUX Mode Select Field.
    Select 1 of 7 iomux modes to beused for pad: GPIO_9.
    NOTE: Pad GPIO_9 is involved inDaisy Chain.
    000 ALT0 — Select signalESAI_RX_FS.
    - Configure registerIOMUXC_ESAI_RX_FS_SELECT_INPUT for mode ALT0.
    001 ALT1 — Select signalWDOG1_B.
    010 ALT2 — Select signalKEY_COL6.
    - Configure registerIOMUXC_KEY_COL6_SELECT_INPUT for mode ALT2.
    011 ALT3 — Select signalCCM_REF_EN_B.
    100 ALT4 — Select signalPWM1_OUT.
    101 ALT5 — Select signalGPIO1_IO09.
    110 ALT6 — Select signal SD1_WP.
    - Configureregister IOMUXC_USDHC1_WP_ON_SELECT_INPUT for mode ALT6.


    ALT5模式为GPIO1_IO09,所以配置为IMX_GPIO_NR(1, 9),同理RESET脚配置为IMX_GPIO_NR(2, 0)。

     


    3)  修改分辨率:

    #ifGTP_CUSTOM_CFG
      #define GTP_MAX_HEIGHT   800                         
      #define GTP_MAX_WIDTH    480
      #define GTP_INT_TRIGGER  1   //0:Falling 1:Rising
    #else
        //屏幕的分辨率
      #define GTP_MAX_HEIGHT   6400
      #define GTP_MAX_WIDTH    9600
      #define GTP_INT_TRIGGER  1
    #endif


    4)  修改其他宏定义:

    //#defineGTP_INT_CFG     S3C_GPIO_SFN(0xF) //注释掉
    #defineGTP_GPIO_AS_INPUT(pin)          do{
                                               gpio_direction_input(pin);
                                           }while(0)
    #defineGTP_GPIO_AS_INT(pin)            do{
                                               gpio_direction_input(pin);
                                           }while(0)


    3、  配置I2C信息

    在arch/arm/mach-mx6/board-ma6q_sabrelite.c中找到mxc_i2c2_board_info,在里面添加:

    I2C_BOARD_INFO("Goodix-TS",0x5d),

    修改完成后,像这样:

    staticstruct i2c_board_info mxc_i2c2_board_info[] __initdata = {
    {
               I2C_BOARD_INFO("egalax_ts",0x4),
               .irq =gpio_to_irq(MX6Q_SABRELITE_CAP_TCH_INT1),
    },
    {
              
               I2C_BOARD_INFO("Goodix-TS",0x5d),
    },
    };


    再配置i2c速率为400kb:

    static struct imxi2c_platform_data mx6q_sabrelite_i2c_data = {
    .bitrate = 400000,
    };


    4、  编译。


    1)  在touchcreen目录下的Makefile中添加:

    obj-$(CONFIG_TOUCHSCREEN_GT828)              += gt813_827_828.o

    2)  在同目录下的Kconfig文件中添加以下内容:

    configTOUCHSCREEN_GT828
       tristate "GT828 touchscreen driver"
       depends on I2C
       help
         Say Yhere to support GT828/813/827 touchscreen.
     
         Tocompile this driver as a module, choose M here: the
        module will be called gt828_ts


    3)  配置menuconfig

    在kenel目录下执行:make menuconfig

    进入配置界面,把gt828的驱动的开关打开,示意如下:

    Device Drivers ->
     Input device support ->
                Touchscreens->
                         <*>GT828 touchscreen driver


    4)  在kenel目录下执行make uImage进行编译,编译成功后生成uImage文件,紧接着在android源码目录下执行make bootimage生成boot.img文件

    5)  把boot.img文件烧录到tf卡中,启动系统。

    3      软件调试

    1、  启动系统后,发现系统的串口打印有问题,只能用adb登陆后用dmesg命令查看内核消息,发现内核一直输出这样的log:

    GTP-ERROR->>[339]I@C transfer error.errno:-110

    表示i2c通讯有问题,检查了一下管脚,发现i2c的SDA和SCL互相调换了,再重新焊接,把sda和scl接好。

     

    2、  重新启动系统,发现i2c仍然不能通讯,log如下:

    <4><<-GTP-INFO->>[362]Datanot ready!
    <4><<-GTP-INFO->>[362]Datanot ready!
    <4><<-GTP-INFO->>[362]Datanot ready!
    <4><<-GTP-INFO->>[362]Datanot ready!


    这个错误是在触屏驱动的终端函数中产生的。继续查看log,返现dmesg的输出没有包含gt828驱动初始化函数的打印,因gt828的初始化函数会打印如下信息:

    [   4.192103] <<-GTP-FUNC->>[1108]Func:goodix_ts_probe
    [   4.197196] <<-GTP-DEBUG->>[1110]I2C addr:5d
    [   4.201501] <<-GTP-INFO->>[1113]GTP DriverVersion:V1.2<2012/06/08>
    …

    我怀疑是dmesg打印不完全,那么要看完整的内核log只能把开发板的串口输出问题解决了。

     

     

    3、  经过无数次尝试,终于把开发板的串口输出问题解决,解决方法是修改u-boot的串口输出端口为ttymxc1,原来的端口是ttymxc0。

     

    4、  重新启动系统,查看串口打印log,发现gt828的驱动初始化信息仍然没出来。经过数次尝试,发现在gt828的驱动加载函数把late_initcall修改为module_init即可,修改如下:

    module(goodix_ts_init);
    module_exit(goodix_ts_exit);

    修改后,编译、启动系统,发现驱动初始化log如下:

    <<-GTP-INFO->>[1278]GTPdriver install.
    <<-GTP-DEBUG->>[973]I2Caddr:5d
    <<-GTP-INFO->>[976]GTPDriver Version:V1.2<2012/06/08>
    <<-GTP-INFO->>[977]GTPDriver build@11:21:04,Jun 18 2013
    <<-GTP-DEBUG->>[637]len1=112,len2=0,len3=0
    <<-GTP-DEBUG->>[655]SENSORID:0
    <<-GTP-DEBUG->>[706]X_MAX= 800,Y_MAX = 1280,TRIGGER = 0x00
    <<-GTP-DEBUG->>[837]INTtrigger type:0
    <<-GTP-INFO->>[1046]GTPworks in interrupt mode.
    <<-GTP-INFO->>[741]ICVERSION:00_0000
    i2c-core: driver [isl29023] usinglegacy suspend method
    i2c-core: driver [isl29023] usinglegacy resume method
     
     
    <<-GTP-INFO->>[362]Datanot ready!
    <<-GTP-INFO->>[362]Datanot ready!
    <<-GTP-INFO->>[362]Datanot ready!
    <<-GTP-INFO->>[362]Datanot ready!
    <<-GTP-INFO->>[362]Datanot ready!

    从IC VERSION:00_0000可以判断i2c通讯不正常。

    于是再次检查软件、硬件,经过n此尝试,确定软件是没问题的,硬件的RST、INT脚也工作正常,剩下的就可能是i2c硬件问题了。

     

    果断换一个i2c口,把原来的i2c3改为i2c2。硬件改好后,在board-ma6q_sabrelite.c中找到mxc_i2c1_board_info,在里面添加:

    I2C_BOARD_INFO("Goodix-TS",0x5d),

    重新编译、烧录系统。


    5、  启动系统后发现log正常,触屏工作正常,大功告成!

     

     


  • 相关阅读:
    locate和grep命令
    内存管理(30天自制操作系统--读书笔记)
    单字节的FIFO缓存(30天自制操作系统--读书笔记)
    STM32 DMA中断只进入一次的解决办法
    Linux Linker
    Linux Linker Script
    java学习-- equals和hashCode的关系
    java学习--"==”和 equals
    java学习--equals
    POI richText和html的转换案例
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3146991.html
Copyright © 2011-2022 走看看