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...