1. 程式人生 > >基於飛思卡爾i.MX 6Quad Sabrelite開發板的觸控式螢幕除錯

基於飛思卡爾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][email protected] 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 [email protected]: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正常,觸屏工作正常,大功告成!


相關推薦

基於i.MX 6Quad Sabrelite開發觸控式螢幕除錯

1      概述 本次任務是在飛思卡爾i.MX 6Quqd Sabrelite開發板上除錯觸屏驅動,觸屏晶片是Goodix的gt828晶片,觸屏介面是I2C。 作業系統:android 4.0.4 核心版本:3.0.15 2      除錯步驟 2.1    硬體

痞子衡嵌入式:i.MX RT系列微控制器啟動篇(2)- Boot配置(BOOT_CFG Pin/eFUSE)

TP 執行 不同 mcu 更新 oom als 配置 示例   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的Boot配置。   在上一篇文章 飛思卡爾i.MX RT系列微控制器啟動篇(1)- Boot簡介 裏痞子衡為大

痞子衡嵌入式:i.MX RT系列微控制器介紹篇(3)- 命名規則

rule 成員 oom 嵌入 信息 100% 規則 控制器 今天   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的命名規則。   打開任何一款i.MX RT系列芯片的Data Sheet均可找到如下命名規則表,以i.M

痞子衡嵌入式:i.MX RT系列微控制器啟動篇(3)- Serial Downloader模式(sdphost/mfgtool)

efi RM pda lock mman www. esc https conn   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的Serial Downloader模式。   在上一篇文章 飛思卡爾i.MX RT系列微

痞子衡嵌入式:i.MX RT系列微控制器啟動篇(6)- Bootable image格式與加載(elftosb/.bd/.bin)

before 詳細介紹 tab true 加載完成 table sdp 推薦 包含   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的Bootable image格式與加載過程。   在i.MXRT啟動系列第三篇文章 飛

痞子衡嵌入式:i.MX RT系列微控制器啟動篇(9)- 從Parallel NOR啟動

16bit erase section cloud 你會 命令執行 選型 兩個 寬度   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的Parallel NOR啟動。   上一篇講i.MXRT從Raw NAND啟動的文章

痞子衡嵌入式:i.MX RT系列微控制器啟動篇(13)- 從Serial(1-bit SPI) EEPROM/NOR恢復啟動

如何 use pin 訪問 fill normal loader 擔心 飛思卡爾   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RT系列MCU的Serial EEPROM/NOR恢復啟動。   在前幾篇裏痞子衡介紹的Boot Dev

痞子衡嵌入式:i.MX RTxxx系列MCU開發那些事 - 索引

持續更新 技術 紀元 dsp cad rtx 相關 面向 tro   大家好,我是痞子衡,是正經搞技術的痞子。本系列痞子衡給大家介紹的是恩智浦i.MX RTxxx系列微控制器相關知識。   恩智浦半導體於2018年10月發布的i.MX RTxxx系列開啟了ML/AI MC

痞子衡嵌入式:i.MX RTyyyy系列MCU硬體那些事(2.1)- 玩轉載OpenSDA,Freelink偵錯程式

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RTyyyy系列EVK上板載偵錯程式的用法。   本文是i.MXRT硬體那些事系列第二篇,第一篇痞子衡給大家整體介紹了i.MXRT官方EVK,從本文開始痞子衡將細聊EVK上的元件,今天要講的是一個非常經典而且常用的元件 -

痞子衡嵌入式:i.MX RTyyyy系列MCU硬體那些事(2.2)- 在序列NOR Flash XIP除錯原理

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RTyyyy系列EVK在序列NOR Flash除錯的原理。   本文是i.MXRT硬體那些事系列第二篇的續集,在第二篇首集中痞子衡給大家詳細介紹了EVK板載偵錯程式用法,有了偵錯程式在手,從此除錯不用愁。從除錯程式碼所在目

痞子衡嵌入式:i.MX RTyyyy系列MCU外設那些事(2)- 善變的FlexRAM

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是飛思卡爾i.MX RTyyyy系列MCU的FlexRAM外設。   本文是外設系列第二篇,上一篇講的是離核心最近的快取記憶體L1 Cache,今天咱們聊離核心第二近的靜態記憶體SRAM。眾所周知,i.MXRT系列內部沒有非易失性儲存器,但內

產品研發ARM開發如何選擇?I.MX6Q開發

pow 清分 工作 images logs 時鐘 網通 https 處理器 處理器:迅為-i.MX6開發板恩智浦Cortex-A9 四核i.MX6Q處理器,主頻1GHz,內存2G,存儲16GB。 系統支持:i.MX6開發板系統支持LINUX,Android,Ubuntu系統

[原創] 我也來講ModBus移植,基於 K60,中斷接收,中斷髮送

題外話,用K60,其實我是抵觸的,哪有STM32用的舒服,客戶就要汽車級MCU,那就上吧,就是多花點時間唄。移植下來,收穫還很多,記錄下來,或許將來有小夥伴用得上: 在移植MB之前,先理一理MB的實現機理: 首先是三個函式: 1. eMBInit() eMBEnable() 和

基於imxsolosabresd開發Linux-3.10.53 lvds螢幕除錯

       BSP是Linux-3.10.53,在這個版本中引入了devicetree,所以一些關於硬體的配置都被剝離到dts中了,與3.0的版本有較大的改變,下面我們具體來看一下: imxsolo燒寫的時候,需要的是imx6dl-sabresd.dtb檔案,對應的原始碼

迅為i.MX6UL核心ARMCortex-A7單核NXP工控行業Imx6核心

  迅為iMX6UL核心板小巧精緻,尺寸僅38mm*42mm;CPU型號[email protected] 528MHz ARM Cortex-A7架構 ;記憶體:512M DDR ;儲存:8G EMMC,低功耗,效能強大,價效比高。 IMX6UL核心板引數

基於imx6 sabrelite開發的android lvds螢幕驅動除錯

一、概述       1、 飛思卡爾 imx6的顯示屏驅動架構:      2、目標:      因sabrelite開發板本身已提供LVDS介面,目標螢幕是LG的LP101WX1-SLN2,其主要引數為: 解析度:1280*800 色彩:18位 色彩數:262K 時鐘頻

S12系列(基於MC9S12XET256MAA和/MC9S12XEP100)CAN初始化總結和分享

CAN初始化流程: 1.查詢是否進入初始化狀態,如不是,進入初始化狀態,此處需設定CANCTL0,CANCTL1暫存器 3.關閉相應CAN口濾波器,此處需設定CANIDMR暫存器。 4.使能MSCAN模組,進入一般模式,選擇時鐘,此處需設定CANCTL0,C

i.mx6dl開發上實現nfs網路檔案系統掛載操作指南

問題描述:在MCIMX6DL_SDP上實現網路檔案掛載,要求從emmc中啟動uboot和kernel,從網路上掛載根檔案系統。 操作平臺: host :Ubuntu14.04LTS board:

MC9S12系列單片機地址影射以及分頁問題

flash 方式 優先 獲得 機制 再看 這就是 範圍 基本上 對於用MCU的人來說,不一定要明白HCS12(x) memory map的機制和聯系。因為如果沒有系統地學習操作系統和編譯原理之類的課程,確實有些難度。並且,對於DG128 XS128這樣的MCU,默認的e

恩智浦iMX6Q核心/Cortex-A9高穩定性低功耗開發

        iMX6Q核心板-商業級       iMX6Q-Plus核心板   iMX6DL核心板-商業級   iMX6Q核心板-工業級    &nbs