分析a80t ctp開發(fā)說明書_第1頁
分析a80t ctp開發(fā)說明書_第2頁
分析a80t ctp開發(fā)說明書_第3頁
分析a80t ctp開發(fā)說明書_第4頁
分析a80t ctp開發(fā)說明書_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、A80TCTP 開發(fā)說明書第 - 2 - 頁 共 36 頁文檔履歷版本號日期制/修訂人制/修訂V1.02014-06-06初始版本第 - 3 - 頁 共 36 頁目錄A80T.- 1 -CTP 開發(fā)說明書.- 1 -1. 前言.- 5 -1.1. 編寫目的.- 5 -1.2. 適用范圍.- 5 -1.3. 相關(guān).- 5 -2.模塊介紹.- 6 -2.1.模塊功能介紹.- 6 -2.2.模塊體系結(jié)構(gòu)描述 .- 6 -2.3.模塊硬件介紹.- 7 -2.4.源碼結(jié)構(gòu)介紹.- 7 -2.5.模塊配置介紹.- 7 -2.5.1. sys_config.fex 配置 .- 7 -2.5.2.config

2、 的配置.- 8 -3.CTP 驅(qū)動架構(gòu)圖.- 11 -4. CTP 驅(qū)動移植.- 12 -4.1. 驅(qū)動中INPUT 子系統(tǒng)關(guān)鍵接口.- 12 -4.2. I2C 設(shè)備關(guān)鍵接口 .- 12 -4.3.驅(qū)動頭文件.- 13 -4.4.驅(qū)動關(guān)鍵數(shù)據(jù)結(jié)構(gòu) .- 13 -4.5.設(shè)備驅(qū)動關(guān)鍵變量 .- 14 -4.6. Kconfig 和Makefile 文件 .- 14 -4.7. I2C 地址.- 15 -4.8. detect 函數(shù) .- 15 -4.8.1.chi.- 15 -4.8.2. I2C 通信的方式.- 16 -4.8.3.不使用硬件檢測的方式 .- 17 -4.9. sys_co

3、nfig.fex 參數(shù)的獲取 .- 17 -4.10. 中斷申請.- 18 -4.10.1 中斷申請函數(shù)介紹.- 18 -4.10.2 中斷函數(shù)介紹.- 19 -4.10.3 中斷操作例子.- 19 -4.11. super standby 支持.- 20 -4.12.設(shè)備驅(qū)動 init 函數(shù).- 21 -4.13.設(shè)備驅(qū)動 exit 函數(shù).- 22 -4.14.設(shè)備驅(qū)動 remove 函數(shù).- 22 -4.15.ctp_wakeup 函數(shù).- 22 -4.16.驅(qū)動調(diào)試信息.- 23 -4.17.模塊加載及 resume 延時優(yōu)化.- 24 -5.驅(qū)動調(diào)試.- 26 -5.1. 調(diào)試信息的使

4、用方法.- 26 -5.2. 查看驅(qū)動是否加載成功.- 26 -第 - 4 - 頁 共 36 頁5.3. I2C 通信是否成功.- 27 -5.4. 是否有中斷.- 27 -5.5.數(shù)據(jù)分析.- 27 -6.CTP 使用配置.- 28 -6.1. sys_config.fex 配置.- 28 -6.2. 驅(qū)動的加載.- 28 -6.3. IDC 文件.- 29 -6.4. gslX680 使用說明.- 29 -6.5. GT(匯頂)系列使用說明.- 31 -6.5.1 gt 系列驅(qū)動介紹.- 31 -6.5.2 增加新tp 參數(shù)的步驟 .- 31 -6.5.3 增加新tp 參數(shù)的例子 .- 3

5、1 -6.6 ft5x 系列使用說明.- 32 -6.6.1 ft5x02 系列使用說明.- 32 -6.6.2 ft5x06 系列使用說明.- 32 -7.1.性能測試.- 34 -7.2. 可靠性測試.- 34 -7.3. 現(xiàn)象分析.- 34 -8.Declaration .- 36 -第 - 5 - 頁 共 36 頁前言編寫目的文檔對 CTP 硬件以及相關(guān)的調(diào)試與移植過程作詳細的講解,同時對 CTP 的使用與測試作簡要的講解,為達到能快速移植驅(qū)動與使用 CTP 的目的。1.2. 適用范圍介紹本模塊設(shè)計適用 A80T。1.3. 相關(guān)項目中 CTP 驅(qū)動的開發(fā),以及使用應(yīng)認真閱讀該文檔。2.

6、模塊介紹2.1.模塊功能介紹觸摸(CTP)驅(qū)動作為硬件與的一個橋梁,實現(xiàn)對觸摸控制器硬件初始化,接收觸摸控制器發(fā)送的位置坐標信息(必要時,對數(shù)據(jù)進行濾波和動作識別處理),上報用戶手勢相關(guān)信息于操作系統(tǒng),經(jīng)上層系統(tǒng)處理后,正確響應(yīng)觸摸者的意圖。CTP 屬于 INPUT 設(shè)備,因此 CTP 驅(qū)動設(shè)計必須符合整個系統(tǒng)的要求以及 INPUT系統(tǒng)設(shè)計規(guī)范。CTP 使用的通口可能為 USB,SPI,I2C 等,因此 CTP 驅(qū)動設(shè)計時應(yīng)符合相關(guān)通口的設(shè)計規(guī)范。目前使用的 CTP 均為使用 i2c 通口。2.2.模塊體系結(jié)構(gòu)描述模塊體系結(jié)構(gòu)如下圖所示:/dev/input/eventX/dev/input/

7、misc/dev/input/jsUser spaceKernel spaceInporeInput Event DriversCTP driverI2C BUSCTTP設(shè)備Hardware圖 1 模塊體系結(jié)構(gòu)圖CTP 設(shè)備為使用 I2C 總線進行通信的輸入設(shè)備,需調(diào)用到 Linux 的Input 子系統(tǒng)中的相應(yīng)接口進行設(shè)備的行數(shù)據(jù)的通信。,同時需要調(diào)用 I2C 總線的設(shè)備進行I2C 設(shè)備的以便進CTP Driver 提供對硬件各寄存器的讀寫和將底層硬件對用戶輸入的響應(yīng)轉(zhuǎn)層對下提供換為標準的輸入事件,再通過層(Inpore)提交給事件處理層;而了CTP Driver 的編程接口,對上又提供了事

8、件處理層的編程接口;而事件處理層(inputEvent Driver)就為用戶空間的應(yīng)用程序提供了設(shè)備的接口和驅(qū)動層提交來以及相應(yīng)的處理。的事件處理。用戶空間將根據(jù)設(shè)備的節(jié)點進行數(shù)據(jù)的I22C控制器I2C driver第 - 7 - 頁 共 36 頁2.3.模塊硬件介紹目前 CTP 與 HOST 的連接主要有 6 個 pin 腳,分別為 VCC,GND,WAKE_UP(RESET),SDA,SCL。引腳正常工作時候的硬件電路連接如下圖所示:均為 3.3V。SerialerfaceTXCTPHostTPMCUControllerRXWAKEUP(RESET)圖 2 ctp 硬件連接圖CTP 的調(diào)

9、試中,首先確認硬件的正確性。硬件調(diào)試中,需要確認下列項:、確認各個引腳與 HOST 連接的正確性。、電源電壓是不是正常的,VCC 是否為 3.0V,GND 是否為 0。 (3)、I2C 引腳電平是否匹配。(4)、復(fù)位電路是否正常,主要檢查 WAKE_UP(RESET)引腳的電壓是否正常。(5)、引腳電壓是否正常。(6)、確認設(shè)備使用的 I2C 地址,特別是設(shè)備可以設(shè)置為多個地址時。2.4.源碼結(jié)構(gòu)介紹CTP 初始化部分源碼位置如下:移植的 CTP 驅(qū)動均放置在一個 如下:licheelinux-3.4driversinputtouchscreen的目錄下面,CTP 模塊驅(qū)動的源碼位置FT5x(

10、ft5x_ts.c)系列,gsl(gslX680.c)系列,gt(gt82x.c)等系列的源碼均位于該目錄下。2.5.模塊配置介紹2.5.1. sys_config.fex 配置(1)、CTP 使用配置配置文件的位置:licheetoolspackchipn9iw1configs目錄下。配置文件 sys_config.fex 中關(guān)于CTP 的配置項如下:ctp_para ctp_used ctp_twi_idctp_name=12gt813_evb第 - 8 - 頁 共 36 頁ctp_screen_max_x ctp_screen_max_y ctp_revert_x_flag ctp_re

11、vert_y_flagctp_exchange_x_y_flag=1280800111port:PH21 port:PB13ctp_portctp_wakeup文件配置說明如下:觸摸模塊中的 GPIO 需要正確的配置中斷引腳、wakeup(reset),根據(jù)引腳進行相應(yīng)的配置。(2)、ctp 自動檢測配置ctp_list_para中使用的ctp_det_used ft5x_ts gt82x gslX680 gt9xx_ts gt811zet622x=110111/設(shè)置為 1 時,啟動自動檢測,為 0 時,退出自動檢測。/設(shè)置為 1,該模塊支持的 I2C 地址添加到掃描列表/設(shè)置為 0,該模塊支

12、持的 I2C 地址從掃描列表中剔除=1ctp_list_para 列表中的名稱順序必須與 sw_device.c 中ctps 的名稱順序一一對應(yīng)。當(dāng)ctp_det_used 設(shè)置為 1 時,啟用自動檢測,將設(shè)置為 0 時,退出自動檢測。模塊的名稱后面寫 1 表示添加到自動檢測掃描列表,寫 0 表示剔除自動檢測掃描列表。2.5.2.config 的配置在編譯服務(wù)器上,目錄為licheelinux-3.4 上,輸入命令:ctp_twi_id使用哪組I2Cctp_name設(shè)備的名字,用于同一驅(qū)動中,區(qū)別不同型號的TP 面板參數(shù)ctp_twi_addrI2C 設(shè)備地址(7 位地址)ctp_screen

13、_max_x,ctp_screen_max_ytouch panel 的分辨率ctp_revert_x_flag如果 x 軸反向,請置為 1ctp_revert_y_flag如果 y 軸反向,請置為 1ctp_exchange_x_y_flag如果 x、y 倒置,請置為 1ctp_port觸摸中斷引腳ctp_wakeup觸摸 wakeup 引腳ctp_io_port中斷引腳配置第 - 9 - 頁 共 36 頁如下所示:進入目錄Device DriversInput deviupportTouchscreens 目錄下可以看到 ctp 模塊是編譯為模塊、編譯進內(nèi)核、不編譯。為了便于配置以及更換設(shè)

14、備,ctp模塊的形式。驅(qū)動均編譯為圖 3 Device Drivers 選項配置圖 4 Input deviupport 選項配置make ARCH=armconfig第 - 10 - 頁 共 36 頁圖 5sw_touchscreens 配置選項圖 6 gslX680 驅(qū)動配置第 - 11 - 頁 共 36 頁3.CTP 驅(qū)動架構(gòu)圖中,將系統(tǒng)使用的硬件資源、配置文件與模組的驅(qū)動分開,CTP 驅(qū)動的結(jié)構(gòu)圖如下所示:獲取配置參數(shù)一個I22C設(shè)備圖 7 ctp 驅(qū)動結(jié)構(gòu)圖input 初始化中,主要工作是提供獲取 sys_config.fex 文件中的配置信息,申請使用的GPIO 引腳,封裝系統(tǒng)函數(shù)

15、對中斷的使能,頻率的設(shè)置等與硬件相關(guān)信息等相關(guān)接口。模組的驅(qū)動中(即 CTP driver)根據(jù)第四章中驅(qū)動的移植進行相關(guān)函數(shù)的修改即可完成驅(qū)動的移植工作,無需添加相應(yīng)的硬件相關(guān)接口。接下來將詳細介紹 CTP 驅(qū)動初始化的接口以及關(guān)鍵數(shù)據(jù)結(jié)構(gòu),在第四章中將詳細介紹CTP 驅(qū)動移植的步驟。input 初始化包含獲取種設(shè)備的 sysconfig.fex 的配置參數(shù)以及 ctp 相關(guān)的接口,源碼位于:licheelinux-3.4driversinputsw_device.c申請CCTTP GPIO相關(guān)接口獲取syys_conffigg.ffex信關(guān)接口提供 件相關(guān) 的接口注銷 申請的工作隊列分配填

16、充設(shè)注輸入申備冊個設(shè)備請的輸輸?shù)膬?nèi)中初入入斷始設(shè)設(shè)容化備備第 - 12 - 頁共 36 頁4. CTP 驅(qū)動移植驅(qū)動的移植中主要需要關(guān)注點為如何獲取 sys_config.fex 中的配置信息,中斷的申請,detect 函數(shù),suspend 以及 resume 函數(shù)等。以下將以 ft5x 系列驅(qū)動移植過程為例進行說明。源碼路徑為:licheelinux-3.4driversinputtouchscreenft5xft5x.c4.1. 驅(qū)動中 INPUT 子系統(tǒng)關(guān)鍵接口這部分接口是 linux INPUT 子系統(tǒng)對外提供的接口,tp driver 使用這些接口,向 input子系統(tǒng)設(shè)備和上報數(shù)據(jù)

17、。(1)、申請input_dev 結(jié)構(gòu):(2)、輸入設(shè)備,并和對應(yīng)的 handler 處理函數(shù)掛鉤:(3)、注銷Input 設(shè)備:(4)、上報坐標值(絕對值):(5)、上報多點坐標值時多點同步信號:(6)、上報坐標值結(jié)束時的同步信號:I2C 設(shè)備關(guān)鍵接口目前CTP 設(shè)備驅(qū)動使用的都是 I2C 總線進行通信,關(guān)鍵的接口如下所示:、i2c_set_cntdata將設(shè)備驅(qū)動的私有數(shù)據(jù)連接到設(shè)備 cnt 中。、i2c_get_cntdata獲取設(shè)備 cnt 的設(shè)備驅(qū)動的私有數(shù)據(jù)。、i2c_add_driver通過 I2C的 i2c_add_driver()函數(shù)添加 i2c_driver,使用到的關(guān)鍵數(shù)

18、據(jù)結(jié)構(gòu)為i2c_driver,注意i2c_driver 中使用的 name 需與 INPUT 中的 input_dev name 一致,否則有會出現(xiàn)找不到設(shè)備的情況。結(jié)構(gòu)體定義如下所示:sic inline void input_sync(struct input_dev *dev)sic inline void input_mt_sync(struct input_dev *dev)sic inline void input_report_abs(struct input_dev *dev, unsignedcode,value)inpputt_unreggistter_ddevice(ff

19、tt55x_ts-input_ddev);err = inpputt_reggistter_ddevice(inpputt_ddev);inpputt_ddev = inpputt_allocatte_ddevice();第 - 13 - 頁共 36 頁(4)、i2c_del_driver通過I2C的i2c_del_driver()函數(shù)刪除i2c_driver。4.3.驅(qū)動頭文件CTP 驅(qū)動中需要包含頭文件:#include 這個頭文件中包含使用的 struct ctp_config_info 結(jié)構(gòu)體以及sysconfig.fex 的相關(guān)調(diào)用接口,申請 gpio 相關(guān)接口、ctp引腳的相關(guān)硬件

20、配置接口、打印等級的定義。該文件的具體實現(xiàn):licheelinux-3.4driversinputsw_device.c可查閱文檔“A20input 初始化文檔.doc”4.4.驅(qū)動關(guān)鍵數(shù)據(jù)結(jié)構(gòu)ctp_config_info,該數(shù)據(jù)結(jié)構(gòu)主要存放從sys_config.fex 中獲取的信息,如tp 的分辨率,使用的 wakeup 引腳,irq 引腳等。數(shù)據(jù)結(jié)構(gòu)的定義如下:struct ctp_config_infoenum input_sensor_typeinput_type; /設(shè)備類型,ctp 的應(yīng)該為CTP_TYPE ctp_used;/是否使用 ctp,當(dāng)該變量為 0 時,則結(jié)束初始化

21、過程_u32twi_id;/使用的I2C 組別號,為,0,1,2,3 等數(shù)值 screen_max_x;/Tp X 軸最大值 screen_max_y;/Tp X 軸最大值revert_x_flag;/X 軸反轉(zhuǎn)標志 revert_y_flag;/ Y 軸反轉(zhuǎn)標志 exchange_x_y_flag;/X,Y 軸互換標志_number;/Irq 使用的 gpio 號wakeup_number;/Wakeup(reset)使用的 gpio 號u32u32#ifdef TOUCH_KEY_LIGHT_SUPPORTu32light_number; /有按鍵燈時,使用的 gpio 號#endif;s

22、c sttructt i22c_ddriver fftt55x_tts_ddriver = .class = I22CC_CCLAASSS_HWMON,.pprobbe= fftt55x_tts_pprobbe,.remove= ddevexitt_pp(fftt55x_tts_remove),.idd_ttabble= fftt55x_tts_idd,.ddriver= .name= CCTTP_NAAME,.owner = TTHISS_MODULE,.addddress_listt= normal_i22c,;第 - 14 - 頁共 36 頁4.5.設(shè)備驅(qū)動關(guān)鍵變量移植新的設(shè)備驅(qū)動時,需

23、要設(shè)置一些跟相關(guān)的關(guān)鍵的變量,如表所示:4.6. Kconfig 和 Makefile 文件當(dāng)添加一個設(shè)備模組時,需要修改該目錄下的 Kconfig 以及Makefile 文件,使得能夠在config 中選設(shè)備模組驅(qū)動并編譯生成模塊或者是直接編譯進內(nèi)核。如下所示:Kconfig 中需要添加的信息:config SW_TOUCHSCREEN_FT5X_TS triseft5x touchscreen driver default mdepends on INPUT & I2Chelp名稱含義使用位置ctp_debug設(shè)置打印等級變量在 module_para_name 中使用config_inf

24、o存取sys_config.fex 獲得的配置值主要用于 ctp_get_system_config函數(shù)中,獲取配置值CTP_IRQ_NUMB ERIRQ 的 GPIO 引腳號,從config_info 中獲取用 于 中 斷 申 請 sw_gpio_irq_request 等中斷操作的相關(guān)函數(shù)中,CTP_IRQ_MODEIRQ 中斷的觸發(fā)方式用于中斷申請sw_gpio_irq_requestCTP_NAME設(shè)備模組名稱用于設(shè)備的等SCREEN_MAX_X(screen_max_x)X 軸最大分辨率用于上報數(shù)值的控制,以及數(shù)據(jù)時處理等。SCREEN_MAX_Y(screen_max_y)Y 軸最

25、大分辨率用于上報數(shù)值的控制,以及數(shù)據(jù)時處理等。revert_x_flagX 軸反轉(zhuǎn)標志當(dāng) X 軸反置時使用,用于數(shù)據(jù)的處理或者是上報函數(shù)中revert_y_flagY 軸反轉(zhuǎn)標志當(dāng) Y 軸反置時使用,用于數(shù)據(jù)的處理或者是上報函數(shù)中exchange_x_y_flagX,Y 軸互換標志當(dāng) X,Y 軸需要互換時使用,用于數(shù)據(jù)的處理或者是上報函數(shù)中_handle中斷申請句柄為 sw_gpio_irq_request 的返回值,用于 sw_gpio_irq_free 中斷函數(shù)中normal_i2c設(shè)備地址數(shù)組i2c_driver 結(jié)構(gòu)體中,設(shè)備地址chip_id_valueChi值數(shù)組當(dāng) detect

26、函數(shù)中使用硬件檢測時使用twi_idI2C 組別號用于 detect 函數(shù)中第 - 15 - 頁共 36 頁ft5x touchscreen driver Makefile 文件中需要添加的信息:obj-$(CONFIG_SW_TOUCHSCREEN_FT5X_TS)ft5x_ts-objs := ft5x02_config.o ini.o ft5x.o+= ft5x_ts.oFt5x 驅(qū)動兼容 ft5x06 以及 ft5x02,因此需要添加 ft5x02 的相關(guān)文件,為多文件編譯為一個 KO 文件,注意格式的寫法。Kconfig 中 config 后的 SW_TOUCHSCREEN_FT5X

27、_TS 與 Makefile 后 CONFIG_后的 SW_TOUCHSCREEN_FT5X_TS 名稱必須相同。一般情況下以模組的名稱命名,便于識別。添加之后可以到系統(tǒng)中查看是否添加成功,在編譯服務(wù)器上,目錄為licheelinux-3.4上,輸入命令:make ARCH=armconfig進入目錄Device DriversInput devi的模組的選項。4.7. I2C 地址upportTouchscreens 目錄下查看是否存在添加設(shè)備的 I2C 地址以固定的形式存在于設(shè)備驅(qū)動中。存放設(shè)備地址的數(shù)組必須以I2C_CNT_END 標致結(jié)束。如下所示:sic const unsigned

28、 short normal_i2c2 = 0 x38,I2C_C4.8. detect 函數(shù)detect 函數(shù)為硬件設(shè)備的檢測,一般情況下通過NT_END;IC 的 chi號或者是檢測I2C是否通信成功進行檢測。當(dāng) chi不匹配,或者是 I2C 通信不成功時,將返回失敗,I2C 設(shè)備失敗。因此當(dāng)使用 I2C 通信以及設(shè)備 chi時,必須保證在 detect則函數(shù)中時,設(shè)備已經(jīng)準備就緒,在硬件沒有錯誤的情況下能進行正常的 I2C 通信過程。也可以測,但在后期設(shè)備的通信中無法正常保證設(shè)備通信正常。4.8.1.chichi值,以 ft5x.c 中的ctp_detect 函數(shù)為例,如下:sicctp_

29、detect(struct i2c_cnt *cnt, struct i2c_board_info *info)struct i2c_adapter *adapter = cnt-adapter; ret = 0, i = 0;if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)return -ENODEV;if(twi_id = adapter-nr)ret = i2c_smbus_read_byte_dnt,0 xA3);第 - 16 - 頁共 36 頁if(ret = -70) msleep(10);ret = i

30、2c_smbus_read_byte_dnt,0 xA3);dprk(DEBUG_INIT,addr:0 x%x,chip_id_value:0 x%xn,cnt-addr,ret); while(chip_id_valuei+)if(ret = chip_id_valuei - 1)strlcpy(info-type, CTP_NAME, I2C_NAME_SIZE);chip_id = ret;return 0;prk(%s:I2C connection might be something wrong ! n,_func_);return -ENODEV;elsereturn -ENOD

31、EV;使用該方法時,必須確保否則將造成檢測失敗的情況。出來的 chi值,已經(jīng)存放在 chip_id_value 數(shù)組中,4.8.2. I2C 通信的方式I2C 通信的方式進行檢測,以 gslX680.c 中的 ctp_detect 函數(shù)為例,i2c_test 函數(shù)存放在init-inp中。如下:sicctp_detect(struct i2c_cnt *cnt, struct i2c_board_info *info)struct i2c_adapter *adapter = cnt-adapter; ret;if (!i2c_check_functionality(adapter, I2C_

32、FUNC_SMBUS_BYTE_DATA)return -ENODEV;if(twi_id = adapter-nr)dprk(DEBUG_INIT,%s: addr= %xn,_func_,cnt-addr);ret = i2c_test(cnt);第 - 17 - 頁共 36 頁if(!ret)k(%s:I2C connection might be something wrong n,_func_);prreturn -ENODEV;elsestrlcpy(info-type, CTP_NAME, I2C_NAME_SIZE); return 0;elsereturn -ENODEV;4

33、.8.3.不使用硬件檢測的方式不使用硬件檢測時,將直接加載設(shè)備的驅(qū)動,無法判斷硬件設(shè)備是否存在,可能會造成加載錯誤等情況發(fā)生,因此建議使用硬件加載的方式。不使用硬件檢測的方式時,如下所示:sicctp_detect(struct i2c_cnt *cnt, struct i2c_board_info *info)struct i2c_adapter *adapter = cnt-adapter;if(twi_id = adapter-nr)dprk(DEBUG_INIT,%s: addr= %xn,_func_,cnt-addr);strlcpy(info-type, CTP_NAME, I2

34、C_NAME_SIZE);return 0;elsereturn -ENODEV;4.9. sys_config.fex 參數(shù)的獲取增加模組時,需要增加 ctp_get_system_config 函數(shù)獲取系統(tǒng)的配置參數(shù),當(dāng)?shù)綍r,返回失敗。該函數(shù)如下所示:不sicctp_get_system_config(void)第 - 18 - 頁共 36 頁twi_id = config_info.twi_id;screen_max_x = config_info.screen_max_x; screen_max_y = config_info.screen_max_y; revert_x_flag =

35、 config_info.revert_x_flag; revert_y_flag = config_info.revert_y_flag; exchange_x_y_flag = config_info.exchange_x_y_flag;if(twi_id = 0) | (screen_max_x = 0) | (screen_max_y = 0)prk(%s:read config error!n,_func_);return 0;return 1;4.10. 中斷申請4.10.1 中斷申請函數(shù)介紹中將封裝了中斷的申請函數(shù),為 sw_gpio_irq_request。u32 sw_gpi

36、o_irq_request(u32 gpio, enum gpio_e_trigtype trig_type,pe_handle handle, void *para)功能: 申請gpio 中斷.參數(shù):gpio:trig_type:gpio.觸發(fā)類型.Handle: 中斷回調(diào)函數(shù). 當(dāng)gpio 中斷觸發(fā)時回調(diào).Para:handle 的參數(shù). 必須為全局, 或者在堆中, 不能為棧中的局部變量.返回值: 成功返回句柄, 失敗返回 0.該函數(shù)會進行的操作為:、檢測 gpio 是否可配置成中斷、配置 gpio 的功能(mul sel),pull,driver level, trig type,并打開

37、 gpio 中斷的 enable位,這些通過調(diào)用 sw_gpio_e_setall_range 來完成。enum ggppio_e_ttriggttyyppe TTRIG_EDGE_ITTIVVE = 00, TTRIG_EDGE_NEGAATTIVVE, TTRIG_LEVVL_HIGH, TTRIG_LEVVL_LOW,TTRIG_EDGE_DOUBLE,/*ttive/neggattive */ TTRIG_INAALID;第 - 19 - 頁共 36 頁、分配 gpio 中斷句柄(gpio_irq_handle 結(jié)構(gòu))作為返回值。、向linux 內(nèi)核申請中斷。調(diào)用request_irq

38、,并傳入 IRQF_SHARED 標記。4.10.2 中斷函數(shù)介紹IRQ 時,使用的函數(shù)為 sw_gpio_irq_free. u32 sw_gpio_irq_free(u32 handle)功能:gpio 中斷. 與 sw_gpio_irq_request 對應(yīng).參數(shù):Handle:sw_gpio_irq_request 返回的句柄.返回值: 成功返回 0, 失敗返回錯誤行號.該函數(shù)會進行的操作:(1)、關(guān)閉 gpio 中斷的 enable 位. 調(diào)用 sw_gpio_e_set_enable.(2)、清 gpio 中斷的pending 位. 調(diào)用 sw_gpio_e_clr_irqpd_s

39、ta.(3)、向linux 內(nèi)核gpio 中斷. 調(diào)用 free_irq.、gpio 中斷句柄. 即 sw_gpio_irq_request 返回的句柄.gpio 的權(quán). 調(diào)用 gpio_free.4.10.3 中斷操作例子因此在模組驅(qū)動中,只需要調(diào)用 sw_gpio_irq_request 函數(shù)即可完成中斷的申請操作。如下所示:中斷服務(wù)程序也跟之前有所差別,中會根據(jù)中斷申請進行相應(yīng)的處理,并進行清中斷操作,修改后的中斷服務(wù)程序返回值為 0 表示成功,其他值表示錯誤。如下所示:中斷函數(shù)的,當(dāng)退出驅(qū)動,或者是不在使用時,需要IRQ, _handle 為申請中斷時的標記。如下所示:sc u332

40、fft55x_tts_errupptt(sttructt fftt55x_tts_ddatta *fftt55x_tts)ddpprkk(DEBUG_INFO,=fft55x_tts TTSerrupptt=n); qqueue_workk(fftt55x_tts-tts_workkqqueue, &fftt55x_tts-ppen_eventt_workk);return 00;_handdle =sw_ggppio_irqq_reqTTP_IRQ_NUMBER,CCTTP_IR _MODE,(ppe_handdle)fftt55x_tts_errupptt,fft55x_tts); iff

41、 (!_handdle) pprk(fftt5x_tts_pprobbe: re uestt irqq ffaileddn); ggotto exitt_ir _re uestt_ffailedd;第 - 20 - 頁共 36 頁4.11. super standby 支持Suspend 分為 early suspend 與 suspend ,resume 分為late resume 與 resume。Early suspend 與 late resume 為一對,當(dāng)定義 CONFIG_HAS_EARLYSUSPEND 使用;suspend與resume 為一對,該接口主要定義于 i2c_dr

42、iver 結(jié)構(gòu)體中。以上四個函數(shù)的接口的關(guān)系要處理好,否則可能導(dǎo)致無法喚醒等意外情況發(fā)生。在 suspend 與 early suspend 函數(shù)中,需要清 數(shù)據(jù)的隊列,防止工作隊列中的工作還沒有完成,但是硬件已經(jīng)處于不工作狀態(tài)。在 early susupend 與 later resume 為一對,在 early suspend 函數(shù)中,做了停止的操作,在 late resume 函數(shù)中就需要做相對應(yīng)的恢復(fù)工作。Suspend 與 resume 函數(shù)也是如此。當(dāng)sys_config.fex 中standby_mode 設(shè)置為 1 時表示支持super standby,super standb

43、y就是關(guān)掉除 AVCC 和DRAM_VCC 電源以外的所有電源;這樣的操作有可能改變模塊狀態(tài)。因此當(dāng)開啟 super standby 時,驅(qū)動中的 suspend 以及resume 函數(shù)需要做相應(yīng)的操作,支持super standby。防止開始 super standby 時,機器喚醒之后會出現(xiàn)觸摸失效的現(xiàn)象。需要做的步驟如下所示:、包含頭文件 linux/pm.h;、進行相應(yīng)處理,根據(jù)掉電情況,區(qū)別對待設(shè)備;在掉電的情況下,有的設(shè)備需要重新寫配置參數(shù)的,需要進行相應(yīng)的區(qū)分,以保證能快速的喚醒,且在休眠設(shè)備掉電后,重新喚醒時,設(shè)備也能正常穩(wěn)定的使用。 Suspend 函數(shù)中需要將硬件以及的動作

44、停止掉,在寫寄存器等操作讓設(shè)備進入休眠。如下所示:sic voidd fftt55x_tts_susppendd(sttructt earlyy_susppendd *handdler)ddpprkk(DEBUG_SSUSSPEND,=fftt55x_tts_susppendd=n);ddpprkk(DEBUG_SSUSSPEND,fftt55x_tts_susppendd: writte FTT55XX00XX_REG_PMODE .n); sw_ggppio_e_sett_enabble(CCTTP_IRQ_NUMBER,00);cancel_workk_syync(&fftt55x_tt

45、s-ppen_eventt_workk); fftt55x_sett_regg(FTT55XX00XX_REG_PMODE, PMODE_HIBERNATTE);Resume 函數(shù)中則進行相關(guān)的動作,如下所示:sc ddevexitt fftt55x_tts_remove(sttructt i22c_cntt *cntt)sw_ggppio_irqq_ffree(_handdle);第 - 21 - 頁共 36 頁4.12.設(shè)備驅(qū)動 init 函數(shù)該函數(shù)中主要任務(wù)為調(diào)用相關(guān)函數(shù)獲取 sys_config.fex 中的配置信息,以及設(shè)備驅(qū)動。如下所示:i2csic_init ft5x_ts_in

46、it(void).if (input_fetch_sysconfig_para(&(config_info.input_type) /獲取配置參數(shù)prk(%s: ctp_fetch_sysconfig_para err.n, _func_);return 0; else ret = input_init_platform_resource(&(config_info.input_type);/申請ctp 引腳資源if (0 != ret) prk(%s:ctp_ops.init_platform_resource err. n, _func_);if(config_info.ctp_used

47、= 0)prprk(* ctp_used set to 0 !n);k(* if use ctp,please put the sys_config.fex ctp_used set to 1. n);return 0;if(!ctp_get_system_config()prk(%s:read config fail!n,_func_);return ret;ctp_wakeup(config_info.wakeup_number, 0, 10); ft5x_ts_driver.detect = ctp_detect;.sc voidd fftt55x_tts_resume(sttructt

48、 earlyy_susppendd *handdler)ddpprkk(DEBUG_SSUSSPEND,=fftt55x_tts_resume= n); cttpp_wakkeupp(00,2200);sw_ggppio_e_sett_enabble(CCTTP_IRQ_NUMBER,1); iff(SSTTAANDBYY_WITTH_ER_OFF = sttanddbbyy_level)msleepp(10000);第 - 22 - 頁共 36 頁ret = i2c_add_driver(&ft5x_ts_driver);.4.13.設(shè)備驅(qū)動 exit 函數(shù)exit 函數(shù)主要是卸載 i2c

49、驅(qū)動,以及退出申請的 ctp 硬件資源等。sic void _exit ft5x_ts_exit(void)prk(=ft5x_ts_exit=n);i2c_del_driver(&ft5x_ts_driver); class_destroy(i2c_dev_class); unregister_chrdev(I2C_MAJOR, aw_i2c_ts);input_free_platform_resource(&(config_info.input_type);4.14.設(shè)備驅(qū)動 remove 函數(shù)模塊卸載時,注意 probe 函數(shù)與 init 函數(shù)中申請的資源,要依照申請的順序進行釋放,后申

50、請的先。如果申請的資源沒有,或沒有按照順序,在模塊卸載時,會卸載失敗,甚至導(dǎo)致死機。同時,在卸載時,注意要調(diào)用 i2c_set_cntdnt, NULL);函數(shù)。否則驅(qū)動自己是可以正常卸載的,但卸載后,向此 I2C 加載其它 gsensor 驅(qū)動時會出現(xiàn) I2C 通訊不成功問題。4.15.ctp_wakeup 函數(shù)ctp_wakeup 函數(shù)的實現(xiàn)在init-inp中,主要作用為設(shè)置 ctp wakeup 引腳的輸出電平以及延時的時間等。函數(shù)的接口如下所示:ctp_wakeup(u32 gpio,sus, gpio: 為 wakeup 引腳的 gpio wakeup_number 中。ms),存

51、在于 struct ctp_config_info 結(jié)構(gòu)體的變量sus:為輸出的 gpio 的狀態(tài),0 表示低電平,1 表示。ms:當(dāng) ms 為 0 的時候,表示將 gpio 設(shè)置為 sus 狀態(tài)。當(dāng) ms 不為 0 時表示將gpio 設(shè)置為 ms 后,在將其設(shè)置為“-ms”。例子:ctp_wakeup(config_info.wakeup_number, 0, 10);/將 wakeup 引腳輸出低10ms 之后輸出高。 ctp_wakeup(config_info.wakeup_number, 1, 20);/將 wakeup 引腳輸出高20ms 之后輸出低。 ctp_wakeup(con

52、fig_info.wakeup_number, 0, 0);/將 wakeup 引腳輸出低。ctp_wakeup(config_info.wakeup_number, 1, 0);/將 wakeup 引腳輸出高。第 - 23 - 頁共 36 頁4.16.驅(qū)動調(diào)試信息驅(qū)動的設(shè)計中,通過模塊的參數(shù)來設(shè)置相關(guān)的打印信息。默認情況下,打印信息為不開啟的,主要用于調(diào)試使用。為了不需要重新編譯,導(dǎo)入等一些麻煩操作,所以在驅(qū)動中添加模塊的參數(shù)來設(shè)置相關(guān)的打印信息。打印信息的等級定義在 init-input.h 中,當(dāng)將模塊參數(shù)中設(shè)置打印信息的開關(guān)打開時,將打印相關(guān)的打印信息。打印開關(guān)的設(shè)置如下所示:enum

53、DEBUG_INITT = 1U 00, DEBUG_SSUSSPEND = 1U 1,DEBUG_INFO = 1U 22,DEBUG_XX_YY_INFO = 1U 33, DEBUG_KKEYY_INFO = 1U 44, DEBUG_WAAKEUP_INFO = 1U 5, DEBUG_OTTHERSS_INFO = 1U x55,eventt-y55);第 - 25 - 頁共 36 頁隊列的使用,init 隊列主要用于 probe 函數(shù)中,resume 隊列用于喚醒函數(shù)中。使用隊列的注意事項:由于隊列不在主線進行,其工作的時間不可預(yù)估,因此,隊列中的工作應(yīng)該跟時序無關(guān),或者隊列中的整

54、個工作過程必須滿足 ctp 工作的時序,且不影響整個模塊加載的時序要求或者是喚醒時序要求。scggsl_tts_resume(sttructt i2c_cntt *cntt)qqueue_workk(gslXX668800_reme_wqq, &gglsXX668800_resume_workk);sc ddevinitt ggsl_tts_pprobbe(sttructt i22c_cntt *cntt,constt sttructt i22c_ddevice_idd *idd)qqueue_workk(ggslXX668800_wqq, &gglsXX668800_initt_workk)

55、;sc voidd gglsXX668800_resume_eventts (sttructt workk_sttructt *workk)cttpp_wakkeupp(1,55); cttpp_wakkeupp(1,00); msleepp(100);resett_chipp(gglsXX66880_i22c); sttarttupp_chipp(gglsXX668800_i22c); checkk_mem_ddatta(gglsXX668800_i22c);sw_ggppio_e_sett_enabble(CCTTP_IRQ_NUMBER,1);sc voidd gglsXX668800_

56、initt_eventts (sttructt workk_sttructt *workk)ggslXX668800_chipp_initt(); initt_chipp(gglsXX668800_i22c); checkk_mem_ddatta(gglsXX668800_i22c);_handdle =sw_ggppio_irqq_reqTTP_IRQ_NUMBER,CCTTP_IRQ_MODE,(ppe_handdle)ggsl_tts_irqq,tts_initt); iff (!_handdle) pprkk( ggsl_pprobbe: reqquestt irqqledn);ret

57、turn;第 - 26 - 頁 共 36 頁5.驅(qū)動調(diào)試設(shè)備驅(qū)動中添加了調(diào)試信息,可能根據(jù)需要進行相應(yīng)的信息打印而不需要進行驅(qū)動的重新編譯導(dǎo)入等工作。驅(qū)動調(diào)試的關(guān)鍵點以及步驟如下:5.1. 調(diào)試信息的使用方法設(shè)備驅(qū)動中添加了模塊的參數(shù)之后,可以根據(jù)需要將想要的打印信息打印出來。需要進行的操作為,對模塊的參數(shù)進行設(shè)置。需要到的工具為 adb s為例。步驟如下:。仍以加載 ft5x_ts.ko(1)、進入adb s界面,使用命令:adb s(2)、進入模塊節(jié)點,使用命令:(3)、查看模塊參數(shù)名稱(4)、查看模塊參數(shù)當(dāng)前值:(5)、設(shè)置模塊參數(shù)數(shù)值,打印 SUSPEND 信息:(6)、查看設(shè)置是否成

58、功:注意 # 號后面的為命令,然后鍵入回鍵即可。echo 命令中,“”號,前后均為空格。5.2. 查看驅(qū)動是否加載成功當(dāng)系統(tǒng)起來之后,觸摸無反應(yīng),首先檢查驅(qū)動是否加載成功,probe 函數(shù)是否按流程完成??梢酝ㄟ^ adb 工具進行查看,一些簡單的 adb令如下所示:(1)、使用lsmod 命令查看驅(qū)動是否加載adb s登錄設(shè)備的sadb push xx.ko /drv將觸摸驅(qū)動通過adb工具push到機器中cd /system/vendor/modules 進入KO文件目錄 ls *.ko 查看機器中已經(jīng)有了那些驅(qū)動 lsmod 查看系統(tǒng)中已經(jīng)加載了那些模塊 rmmod * 卸載驅(qū)動(注:不用

59、加后綴) insmod *.ko 加載驅(qū)動getevent 查看系統(tǒng)中已經(jīng)了那些input設(shè)備(當(dāng)觸摸有效時,觸摸屏幕,會有相應(yīng)的打印信息)第 - 27 - 頁共 36 頁(2)、在 adb s中使用 cat /proc/kmsg 命令,或者是使用串口查看內(nèi)核的打印信息,查看不能正常加載的原因,一般情況下驅(qū)動加載不成功的原因有:一是的sys_config1.fex 文件中的配置信息與加載的驅(qū)動不匹配,二是 probe 函數(shù)遇到某些錯誤沒能正確的完成 probe 的時候返回,三是驅(qū)動與所使用的固件不匹配。5.3. I2C 通信是否成功如果 detect 函數(shù)中使用的為設(shè)備 chi值,以及檢測通信

60、是否成功的方式,則可以根據(jù) detect 函數(shù)進行判斷 I2C 是否能正常的通信。當(dāng) detect 函數(shù)中,不使用這兩種方法時,可以在 probe 函數(shù)中添加調(diào)用 ctp_i2c_test 函數(shù)進行I2C 是否能成功通信的判斷,或者是在數(shù)據(jù)的時候進行判斷。如果I2C 通信失敗,請先查看 I2C 通信失敗的原因。、查看 I2C 的電壓是不是正常的,如果 I2C 電壓不正常,查看硬件說明地方將 I2C的電壓弄不正常。、確認I2C 地址是不是正確的,特別是設(shè)備可以配置為多個地址的時候。、通過打印信息查看 I2C 通信不成功的原因。打印信息為: START Can失敗。dout!則有可能為引腳的電壓不

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論