linux3 4 2 觸控螢幕驅動

2021-09-14 06:40:22 字數 4206 閱讀 8760

目錄

1  觸控螢幕硬體連線

2  觸控螢幕檢測原理

3  觸控螢幕介面模式

4  觸控螢幕驅動程式設計流程圖​

5  觸控螢幕驅動程式

6 觸控螢幕驅動程式測試

2440開發板使用的是4線觸控螢幕,該4線連線在2440的ain4~ain7引腳上

ym:(y minus)觸控螢幕的y座標的負線

yp :(y power)觸控螢幕的y座標的正線

xm:(y minus)觸控螢幕的y座標的負線

xp :(y power)觸控螢幕的y座標的正線

測x座標方向時:xp接3.3v , xm接0v, yp與adc檢測引腳相連,當按壓時就可以檢測到yp電壓,根據該電壓可計算x座標。

測y座標方向時:yp接3.3v , ym接0v, xp與adc檢測引腳相連,當按壓時就可以檢測到xp電壓,根據該電壓可計算x座標。

觸控螢幕控制器可以工作在兩個轉換模式之一。方向轉換模式如下方法操作。x 方向模式寫 x 方向轉換資料到

adcdat0,故觸控螢幕介面產生中斷源給中斷控制器。y 方向模式寫 y 方向轉換資料到 adcdat1,故觸控螢幕介面產

生中斷源給中斷控制器。

自動(順序)x/y 方向轉換模式操作如下。觸控螢幕控制器順序變換觸控 x 方向和 y 方向。在自動方向轉變模式中觸控

控制器在寫入 x 測量數值到 adcdat0 和寫入 y 測量數值到 adcdat1 後,觸控螢幕介面產生中斷源給中斷控制器。

當筆尖落下時觸控螢幕控制器產生中斷(int_tc)訊號。等待中斷模式設定值為 radctsc=0xd3; // xp_pu,xp_dis,

xm_dis,yp_dis,ym_en觸控螢幕控制器產生中斷訊號(int_tc)後,必須清除等待中斷模式。(xy_pst 設定到無操作模式)

ts_drv.c檔案

#include #include #include #include #include #include #include #include #include #include #include #include #include #include //包含了gpio相關巨集

#include #include #include struct touch_regs;

static struct input_dev *touch_dev;

static volatile struct touch_regs* ts_regs;

static struct timer_list touch_timer;

/*進入等待中斷模式:

*等待觸控筆按下中斷,開始手動測量x座標,電壓從ym端點進行檢測

*/static void enter_wait_down_mode(void)

/*進入等待中斷模式:

*等待觸控筆鬆開中斷,開始手動測量x座標,電壓從ym端點進行檢測

*/static void enter_wait_up_mode(void)

/*進入自動測量xy模式

*自動轉換xy模式:x,y都轉換完成後才產生adc中斷

*分離xy轉換模式:x轉換完成產生一次中斷,y轉換完成產生一次中斷

*/static void enter_measure_xy_mode(void)

static void start_adc(void)

static int s3c_filter_ts(int x, int y)

static void touch_timer_function(unsigned long data)

else //觸控筆按下 }

/*觸控筆按下,鬆開中斷處理函式*/

static irqreturn_t touch_irq_handler(int irq, void *dev_id)

else//觸控比按下

return irq_handled;

}static irqreturn_t adc_irq_handler(int irq, void *dev_id)

else//觸控筆按下

cnt = 0;//為了能夠處理滑動事件,

enter_wait_up_mode();

mod_timer(&touch_timer, jiffies + hz/100);

} else

}return irq_handled;

}static int touch_init(void)

//4.硬體相關

使能時鐘clkcon

clk = clk_get(null, "adc");

clk_enable(clk);

設定相關暫存器

ts_regs = ioremap(s3c24xx_pa_adc, sizeof(struct touch_regs));

/*bit[14]:prscen = 1 //預分頻使能

*bit[13:6]:prscvl =49 //預分頻係數, adcclk=pclk/(49+1) = 1mhz

*bit[0]: enable_start = 0 //a/d conversion starts by enable

*/ ts_regs->adccon = s3c2410_adccon_prscen | s3c2410_adccon_prscvl(49);

ret = request_irq(irq_tc, touch_irq_handler, irqf_sample_random, "touch_pen", null);//註冊乙個觸控中斷

if (ret)

ret = request_irq(irq_adc, adc_irq_handler, irqf_sample_random, "adc", null);

if (ret)

/*優化1:設定adcdly為最大值*/

ts_regs->adcdly = 0xffff;

/*優化5:使用定時器處理長按滑動*/

init_timer(&touch_timer);

touch_timer.function = touch_timer_function;

add_timer(&touch_timer);

enter_wait_down_mode();

return 0;

}static void touch_exit(void)

module_init(touch_init);

module_exit(touch_exit);

module_license("gpl");

makefile檔案

kern_dir = /home/ningjw/linux-3.4.2

all:

make -c $(kern_dir) m=`pwd` modules

clean:

make -c $(kern_dir) m=`pwd` modules clean

rm -rf modules.order

obj-m += ts_drv.o

如果不去掉觸控螢幕會報如下錯誤:

request irq_tc error

insmod: can't insert 'ts_drv.ko': device or resource busy

0000000 0235 0000 4877 0008 0003 0000 026a 0000                                   

0000010 0235 0000 4889 0008 0003 0001 0201 0000

0000020 0235 0000 488d 0008 0003 0018 0001 0000

0000030 0235 0000 4892 0008 0001 014a 0001 0000

觸控螢幕驅動

輸入子系統體系 核心層 linux dir drivers input input.c 提供最核心函式 裝置事件層 linux dir drivers input evdev.c 提供handler 提供輸入裝置產生的原始資料並上報給應用程式,這適用於 所有輸入裝置,該觸控螢幕也不例外 編寫基於輸入...

Linux 觸控螢幕驅動程式設計

一 輸入子系統模型解析 1.為什麼需要輸入子系統 完成乙個裝置驅動基本上需要三步 1.註冊乙個字元裝置模型 2.open 或者read對使用者程式的操作 3.對不同的硬體裝置進行操作 但這時候為求方便發現了乙個不同硬體的共性 所以引進了輸入子系統的概念 2.輸入子系統模型的概述 3.輸入子系統模型的...

QT 觸控螢幕 驅動

要 本文主要介紹了在嵌入式 linux 系統下基於 qt embeded 的觸控螢幕驅動的設計,通過對 linux 裝置 驅動和qt embedded裝置驅動介面的工作原理和機制介紹,並結合大量源 進行分析,提出了基於qt embeded 的觸控螢幕驅動的開發方案。linux 下的裝置驅動基礎 li...