觸屏處理流程_第1頁(yè)
觸屏處理流程_第2頁(yè)
觸屏處理流程_第3頁(yè)
觸屏處理流程_第4頁(yè)
觸屏處理流程_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、P100觸屏學(xué)習(xí)總結(jié)一、 觸屏驅(qū)動(dòng)的配置文件:為了使觸屏工作,觸屏模塊驅(qū)動(dòng)文件必須正確配置觸屏的驅(qū)動(dòng)文件,其配置文件在DOOV_11A_COSMOS_GPRS.mak文件中,中斷端口的配置在Touch_panel_.h和IntrCtrl_Mt6236。H文件中ADC的配置文件在Adc_hw.h文件中;對(duì)于系統(tǒng)是怎么區(qū)分x、y、和press的請(qǐng)看36的datasheet。二、 觸屏工作流程:P100使用的是觸屏及極少的觸屏事件,因而它的輸入事件分為兩類1:一般的鍵盤按鍵事件;2:觸屏事件。 一般的鍵盤按鍵事件,之前已經(jīng)寫過相應(yīng)的文檔;就不再重述了。對(duì)于觸屏事件的處理,其原理大致上與鍵盤按鍵事件的

2、處理流程大致相同,也是上層注冊(cè)觸屏事件,下層在觸發(fā)觸屏事件后,會(huì)發(fā)一個(gè)消息給上層,上層得到消息后會(huì)處理之前注冊(cè)過的函數(shù);主要涉及的相關(guān)文件有Dcl_sts.c、Touch_panel_.c、Touch_panel_main.c、Touch_panel_custom.c 、TouchScreen.c、Wgui_Touch_Screen.c、Ts_drv.c等幾個(gè)文件。下面我將以觸屏初始化-mmi層對(duì)觸屏事件的注冊(cè)-drv層觸屏中斷響應(yīng)及處理-mmi層觸屏事件的響應(yīng)及處理的順序描述一下觸屏事件在各個(gè)環(huán)節(jié)是怎么處理的,最后以屏幕校準(zhǔn)為例描述整個(gè)流程;然后再簡(jiǎn)單描述一下Wgui_Touch_Scree

3、n.c文件。I、觸屏初始化觸屏初始化是在函數(shù)tp_task_main中完成的,tp_task_main函數(shù)是在系統(tǒng)初始化過程中由創(chuàng)立一個(gè)任務(wù)函數(shù)custom_tp_task_create實(shí)現(xiàn)的,它會(huì)調(diào)用函數(shù)tp_task_create,從而激活函數(shù)tp_task_main。函數(shù)tp_task_main處理觸屏事件的重要函數(shù),此函數(shù)主要有兩個(gè)作用:1、初始化觸屏事件;2、等待觸屏事件的到來。1、 初始化觸屏事件,主要包括的以下幾個(gè)方面:a: 首先它會(huì)調(diào)用kal_create_event_group創(chuàng)立一個(gè)觸屏事件,用于kal_set_eg_events設(shè)置和kal_retrieve_eg_eve

4、nts接收觸屏事件的信息。b: 然后執(zhí)行初始化函數(shù)DclSTS_Initialize(),在函數(shù)DclSTS_Initialize中主要是根據(jù)全局變量fgSTSInit的值來決定是否調(diào)用touch_panel_init();在函數(shù)touch_panel_init()中主要做了注冊(cè)觸屏事件的回調(diào)函數(shù),包含了DOWN、UP事件的回調(diào)函數(shù),調(diào)用了touch_custom_init函數(shù)用于去抖動(dòng)時(shí)間、觸發(fā)觸屏事件的壓力、對(duì)應(yīng)的LCD顯示屏的顯示起始坐標(biāo),觸屏的起始坐標(biāo)等觸屏基本信息的配置,然后調(diào)用DclHTS_Initialize函數(shù)用于調(diào)用函數(shù)ts_drv_init(),函數(shù)ts_drv_init(

5、)主要處理了:初始化觸屏事件的中斷,設(shè)置ADC控制寄存器AUXADC_CON3,設(shè)置中斷寄存器(中斷向量地址為0x31)標(biāo)志(邊沿觸發(fā)),打開中斷,注冊(cè)中斷處理函數(shù)TS_LISR等;c: 接著調(diào)用函數(shù)touch_panel_test,此函數(shù)主要處理了打開觸屏、配置手寫區(qū)域、配置采樣周期、配置超時(shí)時(shí)間。2、 處理完初始化工作后就會(huì)進(jìn)入一個(gè)while死循環(huán)中,用函數(shù)kal_retrieve_eg_events去接收事件信息,然后根據(jù)TP.state的狀態(tài)去執(zhí)行相應(yīng)的回調(diào)函數(shù) 流程圖如下:圖1:初始化流程圖 在完成初始化工作之后,上層MMI就會(huì)注冊(cè)相應(yīng)的down、up事件函數(shù),當(dāng)觸發(fā)到觸屏事件后就會(huì)

6、執(zhí)行相應(yīng)的注冊(cè)函數(shù)。為了方便理解真?zhèn)€流程下面將MMI對(duì)觸屏事件的注冊(cè)和響應(yīng)放在一起進(jìn)行描述,但程序的執(zhí)行還是以上面的順序?yàn)橹?。II、上層MMI對(duì)觸屏事件的注冊(cè)和處理對(duì)于觸屏它的觸屏事件有兩大類 pen事件,stroke事件(手寫);pen類事件包括up、move、long_tap、repeat、abort等;stroke類事件包括:stroke_down、 stroke_up、stroke_move、stroke_longtap等;在上層mmi層他們注冊(cè)過程和相應(yīng)的處理方式是相同的,我們就以pen類事件中的down事件為例,MMI對(duì)pen事件的處理包括pen事件的注冊(cè)和pen事件的響應(yīng),具體如

7、下:a:MMI層觸屏事件的注冊(cè)若在某個(gè)界面需要down事件,他就會(huì)調(diào)用相應(yīng)down事件注冊(cè)函數(shù)mmi_pen_register_down_handler進(jìn)行注冊(cè),在mmi_pen_register_down_handle函數(shù)中他會(huì)把參數(shù)中的回調(diào)函數(shù)賦給全局變量g_pen_event_table即g_pen_event_tableMMI_PEN_EVENT_DOWN = pen_fp;其他的還有up、move、long_tap、repeat、abort及stroke類的等函數(shù)的注冊(cè)也是一樣的。b:MMI層觸屏事件的響應(yīng) 在初始化pen system過程中mmi_pen_init函數(shù)會(huì)注冊(cè)函數(shù) m

8、mi_pen_drv_callback_registry(mmi_pen_touch_panel_sendilm, NULL) 用于底層drv向上層MMI發(fā)送消息和SetProtocolEventHandler(mmi_pen_touch_panel_event_ind, MSG_ID_TP_EVENT_IND);用于當(dāng)MMI層接收到消息MSG_ID_TP_EVENT_IND就會(huì)執(zhí)行函數(shù)MMI_task函數(shù),MMI_task就會(huì)調(diào)用ProtocolEventHandler進(jìn)而調(diào)用mmi_frm_execute_current_protocol_handler,函數(shù)mmi_frm_execute

9、_current_protocol_handler會(huì)根據(jù)eventID找到之前在初始化pen system過程中注冊(cè)過的函數(shù)mmi_pen_touch_panel_event_ind進(jìn)而調(diào)用mmi_pen_poll_hdlr();接著根據(jù)event的類型excecute_pen_event();執(zhí)行之前注冊(cè)的函數(shù)(g_pen_event_tableevt_type) (pos);流程圖如下:圖2:MMI層觸摸的響應(yīng)流程圖(g_pen_event_tableevt_type) (pos)中的注冊(cè)函數(shù)的參數(shù)pos是x、y的坐標(biāo)值;在執(zhí)行之前注冊(cè)過的函數(shù)時(shí)他會(huì)調(diào)用mmi_pen_check_insi

10、de_polygon(area, point);判斷觸摸的坐標(biāo)與控件的顯示坐標(biāo)是否匹配;若匹配則是有效觸摸然后進(jìn)行相應(yīng)操作;若不匹配則被視為無效觸摸;下面主要描述一下MMI層響應(yīng)的主要函數(shù)mmi_pen_poll_hdlr,描述時(shí)還以pen down事件為例;首先會(huì)根據(jù)if_has_pen_event()的返回值是否為假和delay_polling_timer是否為真即進(jìn)入while語句;在執(zhí)行函數(shù)if_has_pen_event()過程中它會(huì)從buffer中讀出之前存入buffer的觸摸信息,具體流程見下圖:圖3:mmi_pen_poll_hdlr函數(shù)流程圖 在mmi_pen_poll_hd

11、lr中的while循環(huán)會(huì)一直從buffer中讀數(shù)據(jù)直到while的條件為假;然后開啟一個(gè)執(zhí)行回調(diào)函數(shù)mmi_pen_poll_hdlr的timer,以處理后面的repeat、longtap、up事件。III、drv層觸屏事件中斷響應(yīng)及處理在我們的系統(tǒng)中,對(duì)于觸摸功能是這樣處理的: 首次觸摸是由中斷檢測(cè)得到,之后響應(yīng)中斷進(jìn)行處理;處理完后開啟一個(gè)timer,定時(shí)器到時(shí)處理時(shí)主動(dòng)讀取觸摸坐標(biāo),若是有效坐標(biāo)則處理,處理完后同樣開啟一個(gè)timer ,若是無效坐標(biāo)則表示沒有觸摸,此時(shí)再清除中斷標(biāo)記、重新打開中斷響應(yīng),等待下一次觸摸中斷 。 在初始化過程中已經(jīng)注冊(cè)了中斷的響應(yīng)函數(shù)TS_LISR,當(dāng)觸屏上的

12、壓力大于門檻壓力時(shí)就會(huì)觸發(fā)一個(gè)中斷,進(jìn)入中斷函數(shù)TS_LISR,會(huì)激活高級(jí)中斷的DRV_AUXADC_HISR_ID從而進(jìn)出高級(jí)中斷函數(shù)TS_HISR,在高級(jí)TS_HISR函數(shù)會(huì)檢測(cè)tp_state然后根據(jù)tp_state的值進(jìn)行相應(yīng)的處理,讀出ADC的值即tp的x、y坐標(biāo),繼而執(zhí)行相應(yīng)的回調(diào)函數(shù)HTS_DownHandle以設(shè)置一個(gè)事件kal_set_eg_events,從而使函數(shù)tp_task_main中的while循環(huán)得到事件信息進(jìn)而執(zhí)行相應(yīng)的回調(diào)函數(shù)touch_panel_down_hdr,在函數(shù)touch_panel_down_hdr中首先處檢查是否有中斷丟失若有就會(huì)調(diào)用touch_

13、panel_up_hdr()參數(shù)為空即不作處理。若沒有就會(huì)把tp的x、y坐標(biāo)轉(zhuǎn)化為屏的坐標(biāo),然后判斷是否是手寫然后把坐標(biāo)值、時(shí)間、壓力值、事件類型,存放到buffer里邊,同時(shí)開啟一個(gè)timer用于長(zhǎng)觸屏事件和重復(fù)觸屏事件的處理,具體流程如下:圖4:drv層觸屏事件中斷響應(yīng)及處理流程圖下面對(duì)touch_panel_down_hdr函數(shù)進(jìn)行描述,重點(diǎn)在于對(duì)此函數(shù)中的長(zhǎng)觸屏事件和重復(fù)觸屏事件的處理進(jìn)行描述:首先會(huì)判斷是否有中斷丟失若有就會(huì)調(diào)用touch_panel_up_hdr()參數(shù)為空即不作處理。若沒有就會(huì)把tp的x、y坐標(biāo)轉(zhuǎn)化為屏的坐標(biāo),然后判斷是否是手寫然后把坐標(biāo)值、時(shí)間、壓力值、事件類型

14、,存放到buffer里邊,同時(shí)開啟一個(gè)timer用于長(zhǎng)觸屏事件和重復(fù)觸屏事件的處理,流程圖如下:圖5:touch_panel_down_hdr函數(shù)流程圖 下面描述一下是怎么檢查UP事件的,當(dāng)進(jìn)入函數(shù)touch_panel_event_cb后,會(huì)調(diào)用函數(shù)DclHTS_Control來檢測(cè)TP.state的狀態(tài)是否改變,通過tp_level_pressure檢測(cè)壓力來判斷是否發(fā)生了狀態(tài)改變,若沒有改變則執(zhí)行down事件,可以說touch_panel_event_cb只做了兩件事a:檢查TP.state的狀態(tài)是否改變,若改變執(zhí)行up事件,b:若沒有改變則讀出ADC的值,并轉(zhuǎn)換成坐標(biāo),判斷是否是有效坐

15、標(biāo),若是開一個(gè)執(zhí)行touch_panel_repeat_cb的timer,然后調(diào)用touch_panel_event_hdr,若否直接調(diào)用touch_panel_event_hdr,具體流程如下:圖6:up事件檢測(cè)及處理流程圖 touch_panel_up_hdr的處理流很簡(jiǎn)單只是關(guān)閉了所有用于長(zhǎng)觸屏事件和重復(fù)觸屏事件事件的timer,然后把數(shù)據(jù)存到buffer中。對(duì)于long和repeat的處理過程幾乎是一樣的,這里以repeat為例,描述一下相應(yīng)的處理流程,也是先調(diào)用函數(shù)DclHTS_Control來檢測(cè)TP.state的狀態(tài)是否改變,通過tp_level_pressure檢測(cè)壓力來判斷是

16、否發(fā)生了狀態(tài)改變,若沒有改變則執(zhí)行down事件,并在最后開啟一個(gè)timer,具體流程如下:圖7:repeat事件流程圖以上就是觸屏觸摸流程的整個(gè)過程從MMI的注冊(cè)到drv層的中斷處理再到MMI層的響應(yīng)的整個(gè)過程;IV、下面將以屏幕校準(zhǔn)為例在描述一下整個(gè)流程:整個(gè)流程和上述過程一樣,同樣是上層注冊(cè)觸摸事件,觸摸引發(fā)中斷進(jìn)入drv層進(jìn)行處理;然后發(fā)送消息給上層;上層得到消息后響應(yīng)觸摸事件;整體流程如下: 當(dāng)調(diào)用 void mmi_pen_start_calibration(kal_uint16 num, const mmi_pen_point_struct *points) 函數(shù)時(shí),就開始進(jìn)入觸摸

17、屏校準(zhǔn)狀態(tài),num 表示校準(zhǔn)的個(gè)數(shù),points 分別就是理想點(diǎn)的位置,真正執(zhí)行校準(zhǔn)的是在 函數(shù) touch_excute_cali里面 其實(shí)校準(zhǔn)是否正確 還是主要看 touch_panel_check_cali 這個(gè)函數(shù)的結(jié)果。這個(gè)函數(shù)主要里有 3 個(gè)校準(zhǔn)測(cè)試,只有都符合條件才符合。stage 1 比例對(duì)比,也就是保證測(cè)試點(diǎn)1 和 點(diǎn) 2 傾斜一定的角度。不會(huì)與x 軸或者y軸平行stage 2 保證第1 點(diǎn) 和 第 2 點(diǎn) 在 第3 點(diǎn)的 兩端stage 3 根據(jù)stage 1 和 stage 2 得出的slope 和 offset, 比較計(jì)算獲得的第3點(diǎn) 和 希望獲得第3點(diǎn) 誤差小于 設(shè)定值。V、簡(jiǎn)單描述一下Wgui_Touch_Screen.c文件 Wgui_Touch_Screen.c文件中有許多關(guān)于down、up、move、repeat等事件的相關(guān)函數(shù),現(xiàn)以wgui_general_pen

溫馨提示

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

評(píng)論

0/150

提交評(píng)論