Linux驅動開發之基於輸入子系統觸控螢幕驅動程式

2021-08-21 13:45:03 字數 4307 閱讀 5478

1、驅動源**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

/* for ts.dev.id.version */

#define s3c2410tsversion    0x0101

#define wait4int(x)  (((x)<<8) | \

s3c2410_adctsc_ym_sen | s3c2410_adctsc_yp_sen | s3c2410_adctsc_xp_sen | \

s3c2410_adctsc_xy_pst(3))     //設定等待中斷模式

#define autopst         (s3c2410_adctsc_ym_sen | s3c2410_adctsc_yp_sen | s3c2410_adctsc_xp_sen | \

s3c2410_adctsc_auto_pst | s3c2410_adctsc_xy_pst(0))   //設定x,y自動轉換

static char *s3c2410ts_name = "s3c2410 touchscreen";

static    struct input_dev *dev;

static    long xp;

static    long yp;

static    int count;

static int ownadc = 0;

static void __iomem *base_addr;

static inline void s3c2410_ts_connect(void)   //配置管腳的功能

static void touch_timer_fire(unsigned long data)

xp = 0;

yp = 0;

count = 0;

/*自動x/y軸座標轉換模式的設定,自動地進行x軸和y軸的轉換操作,隨後產生相應的int_adc中斷通知轉換完畢*/

iowrite32(s3c2410_adctsc_pull_up_disable | autopst, base_addr+s3c2410_adctsc);

/*如果還沒有啟動adc或者adc轉換四次完畢後則啟動adc*/

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

} else }}

static struct timer_list touch_timer =

timer_initializer(touch_timer_fire, 0, 0);

/*當觸控按下時,產生int_tc中斷,會進入到stylus_updown中斷處理函式*/

static irqreturn_t stylus_updown(int irq, void *dev_id)

else

return irq_handled;

}/*int_adc 中斷處理函式*/

static irqreturn_t stylus_action(int irq, void *dev_id)

else

}return irq_handled;

}static struct clk    *adc_clock;

static int __init s3c2410ts_init(void)

clk_enable(adc_clock); //使能觸控螢幕時鐘

/*i/o記憶體是不能直接進行訪問的,必須對其進行對映 */

base_addr=ioremap(s3c2410_pa_adc,0x20);//對映:把物理位址對映為虛擬位址

if (base_addr == null)

/* configure gpios */

s3c2410_ts_connect(); /*gpio 設定*/

/*使能預分頻和設定分頻係數*/

iowrite32(s3c2410_adccon_prscen | s3c2410_adccon_prscvl(0xff),\

base_addr+s3c2410_adccon);

/*設定adc延時,在等待中斷模式下表示產生int_tc的間隔時間,adc轉換週期等待定時器*/

iowrite32(0xffff,  base_addr+s3c2410_adcdly); 

/*adctsc = 0xd3 ,將觸控螢幕置為等待中斷模式,等待觸控螢幕被按下產生int_tc中斷*/

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

/* 以下配置2.6核心劃分出來的輸入裝置 */

/* initialise input stuff */

input_dev = input_allocate_device();

if (!input_dev)

dev = input_dev;

/* evbit欄位用來定義該輸入裝置可以支援的(產生和響應)的事件的型別,

觸控螢幕設定為支援同步(en_syn)、按鍵(en_key)、絕對座標(ev_abs)事件

*/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的最小最大值(0-0x3ff) */

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

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;

/*int_tc, int_adc中斷註冊,問題:兩種中斷的產生時機?哪種中斷會先產生?*/

/* get irqs */

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

"s3c2410_action", dev))

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;

}static void __exit s3c2410ts_exit(void)

input_unregister_device(dev);//登出輸入裝置

iounmap(base_addr);  //解除對映  

}module_init(s3c2410ts_init);

module_exit(s3c2410ts_exit);

2、應用程式

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(void)

for (;;)

close(ts_fd);

return 0;

}

tiny4412 Linux驅動開發之輸入子系統

本次介紹linux的輸入子系統的驅動開發.linux 核心的輸入子系統為滑鼠 鍵盤 觸控螢幕 遊戲杆等輸入裝置提供了驅動框架。當程式設計師要為自己的輸入裝置編寫驅動程式時,只需要實現從裝置獲取輸入事件即可。至於 輸入事件如何處理,使用者介面如何實現,都由輸入子系統完成。這大大減輕了輸入驅動程式 的編...

Linux驅動開發之DRM驅動

qq群 852283276 b站 主頁 drm 驅動程式開發 開篇 drm 驅動程式開發 vkms 最簡單的drm應用程式 single buffer drm 驅動是如何建立 fb device 的 linux中的drm 介紹 linux graphic dri 顯示子系統 介紹1 xilinx d...

linux驅動之輸入子系統

輸入子系統框架,把核心開啟 搜尋input.c 輸入子系統的 在 driver input目錄下面 最上一層,我們稱它為核心層 要看乙個驅動程式我們應該從他的入口函式開始看 有一行 err register chrdev region mkdev input major,0 input max ch...