基于μClinux的觸摸屏軟硬件關(guān)鍵技術(shù)分析
在mc68328digi_init()中向內(nèi)核注冊(cè)設(shè)備驅(qū)動(dòng)函數(shù):err=misc_register(mc68328_digi),在init_ts_settings()中設(shè)定觸摸屏的當(dāng)前參數(shù):內(nèi)核版本號(hào)、筆移動(dòng)判別閾值、采樣時(shí)間、消除抖動(dòng)開(kāi)關(guān)、消除抖動(dòng)時(shí)間等參數(shù),這些均由用戶(hù)根據(jù)自己的液晶屏以及精度要求來(lái)定制,也可以在應(yīng)用程序中用I/O控制函數(shù)ioctl()來(lái)設(shè)定,本文將在參數(shù)分析中具體分析這些參數(shù)的意義。
打開(kāi)設(shè)備
在ts_open()函數(shù)中,驅(qū)動(dòng)程序向內(nèi)核注冊(cè)中斷。中斷也可以在系統(tǒng)初始化的時(shí)候向內(nèi)核注冊(cè),但是一般不建議這樣做,因?yàn)樵诩虞d的設(shè)備比較多時(shí),這樣做有可能造成中斷的沖突。打開(kāi)一個(gè)設(shè)備,才讓該設(shè)備占用中斷,是一個(gè)較好的策略。向內(nèi)核注冊(cè)中斷處理程序主要實(shí)現(xiàn)兩個(gè)功能,一是注冊(cè)中斷號(hào),二是注冊(cè)中斷處理函數(shù)。
本程序中,向內(nèi)核注冊(cè)了兩個(gè)中斷處理程序,分別是:
request_irq(PEN_IRQ_NUM, handle_pen_irq,IRQ_FLG_STD,
“touch_screen”,NULL)和request_ irq(SPI_IRQ_NUM,handle_spi_irq, IRQ_FLG_STD,“spi_irq”,NULL);
在前者中,PEN_IRQ_NUM是中斷號(hào),可以指定,也可以動(dòng)態(tài)分配。在該驅(qū)動(dòng)程序中,指定筆中斷分配中斷號(hào)為19;handle_pen_irq是中斷處理函數(shù),IRQ_FLG_STD是申請(qǐng)時(shí)的選項(xiàng),它決定中斷處理程序的一些特性,這里表示由系統(tǒng)內(nèi)部占用;touch_ screen是設(shè)備名。在后者中,程序向內(nèi)核注冊(cè)SPI中斷,用來(lái)在CPU和外設(shè)間傳遞數(shù)據(jù),分配的中斷號(hào)是0,handle_spi_irq是SPI中斷處理函數(shù)。
此外,在觸摸屏驅(qū)動(dòng)初始化子函數(shù)init_ts_drv()中,進(jìn)行了如下工作:
(1)觸摸屏狀態(tài)的初始化;
(2)筆信息(pen_values)的初始化;
(3)初始化定時(shí)器并設(shè)置超時(shí)函數(shù)handle_timeout();
(4)初始化寄存器。初始化等待隊(duì)列,等待隊(duì)列是由等待觸摸事件發(fā)生的進(jìn)程組成的一個(gè)隊(duì)列,它包括頭尾指針和一個(gè)正在睡眠進(jìn)程的鏈表;
(5)設(shè)置觸摸屏狀態(tài)為空閑。
由于這里的初始化會(huì)占用一部分系統(tǒng)資源,所以把它們放在了打開(kāi)設(shè)備時(shí)處理,而不是最初的設(shè)備初始化部分,這樣也是出于節(jié)省資源的考慮。
讀函數(shù)ts_read()
一旦用戶(hù)程序調(diào)用read()對(duì)觸摸屏進(jìn)行讀操作,則驅(qū)動(dòng)程序調(diào)用入口點(diǎn)函數(shù)ts_read()進(jìn)行處理。如果此時(shí)沒(méi)有數(shù)據(jù)到來(lái),且驅(qū)動(dòng)程序選擇阻塞型操作,則調(diào)用interruptible_sleep_on(queue->proc_list)將進(jìn)程阻塞,并進(jìn)入等待隊(duì)列,同時(shí)設(shè)置觸摸屏狀態(tài)為等待;如果選擇了非阻塞型操作,則程序在沒(méi)有數(shù)據(jù)到達(dá)的時(shí)候立即返回,然后用異步觸發(fā)fasync()來(lái)通知數(shù)據(jù)的到來(lái)。
在等待數(shù)據(jù)到來(lái)的過(guò)程中,如果有觸摸動(dòng)作(筆中斷pen_irq)發(fā)生,則進(jìn)入中斷處理程序。在中斷處理程序中對(duì)數(shù)據(jù)進(jìn)行采樣和轉(zhuǎn)化,把當(dāng)前坐標(biāo)信息放入隊(duì)列中。在進(jìn)程被喚醒后(使用wake_up_interruptible(queue->proc_list)來(lái)喚醒進(jìn)程),程序把位置坐標(biāo)信息、事件序列信息等從隊(duì)列中取出,放入用戶(hù)空間(put_user),從而可以被用戶(hù)程序使用,避免了用戶(hù)直接和硬件打交道。
評(píng)論