觸控螢幕驅動分析

2021-05-28 15:50:47 字數 3112 閱讀 7775

觸控螢幕的主要分為四種,分別是電阻式,電容感應式,紅外線式以及表面聲波式。

我們現在我們主要談論是電阻式觸控螢幕。

看下圖可以大概了解電阻式觸控螢幕。

電阻式觸控螢幕的屏體部分是一塊與顯示器表面相匹配的多層復合薄膜,由一層玻璃或有機玻璃作為基層,表面塗有一層透明

的導電層,上面再蓋有一層外表面的硬化處理,光滑的防刮的塑料層,它的內表面也塗有一層透明的導電層,在兩層導電層之

間有許多細小的透明隔離點把它們隔開絕緣。當手指觸控螢幕時,平常相互絕緣的兩層導電層就在觸控點位置有了乙個接觸,

因其中一面導電層接通y軸方向5v均勻電壓場,使得偵測層電壓由零變為非零,這種接通狀態被控制器偵測到後,進行a/d

轉換,並將得到的電壓值與5v相比即可得到觸控點的y軸座標,同理得出x軸的座標。

s3c2440a觸控螢幕控制器

linux-2.6.28下的觸控螢幕原始碼位置是:\linux-2.6.28.7\drivers\input\touchscreen\s3c2410_ts.c

從載入函式開始分析:

static int __init s3c2410ts_init(void)

clk_enable(adc_clock);

base_addr=ioremap(s3c2410_pa_adc,0x20);

if (base_addr == null)

/* configure gpios */

s3c2410_ts_connect();

//預分頻使能,分頻值0xff,寫adccon

iowrite32(s3c2410_adccon_prscen | s3c2410_adccon_prscvl(0xff),\

base_addr+s3c2410_adccon);

//啟動延時,延時值0xffff

iowrite32(0xffff, base_addr+s3c2410_adcdly);

//檢測筆尖落下,ym使能,yp,xp禁止,等待中斷模式

iowrite32(wait4int(0), base_addr+s3c2410_adctsc);

/* initialise input stuff */

input_dev = input_allocate_device();

if (!input_dev)

dev = input_dev;

//設定input輸入子系統同步,鍵型別

dev->evbit[0] = bit(ev_syn) | bit(ev_key) | bit(ev_abs);

dev->keybit[bits_to_longs(btn_touch)] = bit(btn_touch);

//設定絕對座標x軸,值0至0x3ff

input_set_abs_params(dev, abs_x, 0, 0x3ff, 0, 0);

//同理y軸

input_set_abs_params(dev, abs_y, 0, 0x3ff, 0, 0);

//同理是否按下abs_pressure值,0或1

input_set_abs_params(dev, abs_pressure, 0, 1, 0, 0);

dev->name = s3c2410ts_name;

dev->id.bustype = bus_rs232;

dev->id.vendor = 0xdead;

dev->id.product = 0xbeef;

dev->id.version = s3c2410tsversion;

/* get irqs */

//adc中斷處理函式stylus_action

if (request_irq(irq_adc, stylus_action, irqf_shared|irqf_sample_random,

"s3c2410_action", dev))

//tc中斷處理函式stylus_updown

if (request_irq(irq_tc, stylus_updown, irqf_sample_random,

"s3c2410_action", dev))

printk(kern_info "%s successfully loaded\n", s3c2410ts_name);

/* all went ok, so register to the input system */

input_register_device(dev);

return 0;

}

adc中斷處理函式:

static irqreturn_t stylus_action(int irq, void *dev_id)

else

} return irq_handled;

}

核心計時

static struct timer_list touch_timer =

timer_initializer(touch_timer_fire, 0, 0);

touch_timer_fire函式:

static void touch_timer_fire(unsigned long data)

xp = 0;

yp = 0;

count = 0;

/* 啟動ad 轉換*/

iowrite32(s3c2410_adctsc_pull_up_disable | autopst, base_addr+s3c2410_adctsc);

//x方向測量

iowrite32(ioread32(base_addr+s3c2410_adccon) | s3c2410_adccon_enable_start, base_addr+s3c2410_adccon);

} else

}}

tc中斷:

static irqreturn_t stylus_updown(int irq, void *dev_id)

else

} return irq_handled;

}

觸控螢幕驅動分析

模組初始化 static int init s3c2410ts init void 獲得adc時鐘,並使能 對adc暫存器位址對映到記憶體 配置暫存器 gpio口 xm,xp,ym,yp,adc有關的暫存器 申請input裝置 設定可支援的事件為同步 按鍵 絕對座標事件 設定按鍵時間型別為觸控螢幕 ...

觸控螢幕驅動

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

QT 觸控螢幕 驅動

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