關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 基于μClinux的觸摸屏軟硬件關鍵技術分析

        基于μClinux的觸摸屏軟硬件關鍵技術分析

        作者: 時間:2008-11-26 來源:網絡 收藏

          

          

          初始化

          在mc68328digi_()中向內核注冊設備驅動函數:err=misc_register(mc68328_digi),在_ts_settings()中設定觸摸屏的當前參數:內核版本號、筆移動判別閾值、采樣時間、消除抖動開關、消除抖動時間等參數,這些均由用戶根據自己的液晶屏以及精度要求來定制,也可以在應用程序中用I/O()來設定,本文將在參數分析中具體分析這些參數的意義。

          打開設備

          在ts_open()函數中,向內核注冊中斷。中斷也可以在系統初始化的時候向內核注冊,但是一般不建議這樣做,因為在加載的設備比較多時,這樣做有可能造成中斷的沖突。打開一個設備,才讓該設備占用中斷,是一個較好的策略。向內核注冊主要實現兩個功能,一是注冊中斷號,二是注冊中斷處理函數。

          本程序中,向內核注冊了兩個,分別是:

          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是中斷號,可以指定,也可以動態分配。在該中,指定筆中斷分配中斷號為19;handle_pen_irq是中斷處理函數,IRQ_FLG_STD是申請時的選項,它決定的一些特性,這里表示由系統內部占用;touch_ screen是設備名。在后者中,程序向內核注冊SPI中斷,用來在CPU和外設間傳遞數據,分配的中斷號是0,handle_spi_irq是SPI中斷處理函數。

          此外,在觸摸屏驅動初始化子函數_ts_drv()中,進行了如下工作:

          (1)觸摸屏狀態的初始化;

          (2)筆信息(pen_values)的初始化;

          (3)初始化定時器并設置超時函數handle_timeout();

          (4)初始化寄存器。初始化等待隊列,等待隊列是由等待觸摸事件發生的進程組成的一個隊列,它包括頭尾指針和一個正在睡眠進程的鏈表;

          (5)設置觸摸屏狀態為空閑。

          由于這里的初始化會占用一部分系統資源,所以把它們放在了打開設備時處理,而不是最初的設備初始化部分,這樣也是出于節省資源的考慮。

          讀函數ts_read()

          一旦用戶程序調用read()對觸摸屏進行讀操作,則驅動程序調用入口點函數ts_read()進行處理。如果此時沒有數據到來,且驅動程序選擇阻塞型操作,則調用interruptible_sleep_on(queue->proc_list)將進程阻塞,并進入等待隊列,同時設置觸摸屏狀態為等待;如果選擇了非阻塞型操作,則程序在沒有數據到達的時候立即返回,然后用異步觸發fasync()來通知數據的到來。

          在等待數據到來的過程中,如果有觸摸動作(筆中斷pen_irq)發生,則進入中斷處理程序。在中斷處理程序中對數據進行采樣和轉化,把當前坐標信息放入隊列中。在進程被喚醒后(使用wake_up_interruptible(queue->proc_list)來喚醒進程),程序把位置坐標信息、事件序列信息等從隊列中取出,放入用戶空間(put_user),從而可以被用戶程序使用,避免了用戶直接和硬件打交道。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 调兵山市| 蒙阴县| 奇台县| 张掖市| 方正县| 大名县| 陇南市| 常熟市| 洪湖市| 天津市| 赤壁市| 札达县| 上杭县| 高阳县| 石家庄市| 娄烦县| 城市| 舟曲县| 三江| 乌恰县| 都江堰市| 赫章县| 德保县| 鹿邑县| 鲁山县| 南和县| 宁陵县| 仁布县| 靖安县| 澎湖县| 龙海市| 甘肃省| 周口市| 岳池县| 新巴尔虎左旗| 嘉禾县| 和硕县| 青浦区| 连江县| 洞口县| 江北区|