欧美群妇大交群的观看方式_久久机这里只有精品_国产suv精品一区_美国一区二区_欧洲乱码伦视频免费_日韩精品一级二级_另类综合日韩欧美亚洲_黑人巨大精品欧美黑白配亚洲

觸摸屏的設(shè)備驅(qū)動(dòng)

作者: TouchScreen     時(shí)間:2012-05-16     源于:Linux 觸摸屏驅(qū)動(dòng)    總點(diǎn)擊:
【導(dǎo)讀】:按照觸摸屏的工作原理和傳輸信息的介質(zhì),我們把觸摸屏分為4種:電阻式、電容感應(yīng)式、紅外線式以及表面聲波式。電阻式觸摸屏利用壓力感應(yīng)進(jìn)行控制,包含上下疊合的兩個(gè)透明層,通常還要用一種彈性材料來(lái)將兩層隔開。

觸摸屏的硬件原理

按照觸摸屏的工作原理和傳輸信息的介質(zhì),我們把觸摸屏分為4種:電阻式、電容感應(yīng)式、紅外線式以及表面聲波式。

電阻式觸摸屏利用壓力感應(yīng)進(jìn)行控制,包含上下疊合的兩個(gè)透明層,通常還要用一種彈性材料來(lái)將兩層隔開。在觸摸某點(diǎn)時(shí),兩層會(huì)在此點(diǎn)接通。四線和八線觸摸屏由兩層具有相同表面電阻的透明阻性材料組成,五線和七線觸摸屏由一個(gè)阻性層和一個(gè)導(dǎo)電層組成。

所有的電阻式觸摸屏都采用分壓器原理來(lái)產(chǎn)生代表X坐標(biāo)和Y坐標(biāo)的電壓。如圖1所示,分壓器是通過(guò)將兩個(gè)電阻進(jìn)行串聯(lián)來(lái)實(shí)現(xiàn)的。電阻R1連接正參考電壓VREF,電阻R2接地。兩個(gè)電阻連接點(diǎn)處的電壓測(cè)量值與R2的阻值成正比。


圖1 電阻觸摸屏分壓

為了在電阻式觸摸屏上的特定方向測(cè)量一個(gè)坐標(biāo),需要對(duì)一個(gè)阻性層進(jìn)行偏置:將它的一邊接VREF,另一邊接地。同時(shí),將未偏置的那一層連接到一個(gè)ADC的高阻抗輸入端。當(dāng)觸摸屏上的壓力足夠大,兩層之間發(fā)生接觸時(shí),電阻性表面被分隔為兩個(gè)電阻。它們的阻值與觸摸點(diǎn)到偏置邊緣的距離成正比。觸摸點(diǎn)與接地邊之間的電阻相當(dāng)于分壓器中下面的那個(gè)電阻。因此,在未偏置層上測(cè)得的電壓與觸摸點(diǎn)到接地邊之間的距離成正比。

四線觸摸屏包含兩個(gè)阻性層。其中一層在屏幕的左右邊緣各有一條垂直總線,另一層在屏幕的底部和頂部各有一條水平總線,如圖2所示。為了在X軸方向進(jìn)行測(cè)量,將左側(cè)總線偏置為0V,右側(cè)總線偏置為VREF。將頂部或底部總線連接到ADC,當(dāng)頂層和底層相接觸時(shí)即可作一次測(cè)量。為了在Y軸方向進(jìn)行測(cè)量,將頂部總線偏置為VREF,底部總線偏置為0V。將ADC輸入端接左側(cè)總線或右側(cè)總線,當(dāng)頂層與底層相接觸時(shí)即可對(duì)電壓進(jìn)行測(cè)量。


圖2 四線電阻式觸摸屏

S3C2410接4線電阻式觸摸屏的電路原理如圖3所示。S3C2410提供了nYMON、YMON、nXPON和XMON直接作為觸摸屏的控制信號(hào),它通過(guò)連接FDC6321場(chǎng)效應(yīng)管觸摸屏驅(qū)動(dòng)器控制觸摸屏。輸入信號(hào)在經(jīng)過(guò)阻容式低通濾器濾除坐標(biāo)信號(hào)噪聲后被接入S3C2410內(nèi)集成的ADC(模數(shù)轉(zhuǎn)換器)的模擬信號(hào)輸入通道AIN5、AIN7。

S3C2410內(nèi)置了一個(gè)8信道的10位ADC,該ADC能以500KS/S的采樣速率將外部的模擬信號(hào)轉(zhuǎn)換為10位分辨率的數(shù)字量。因此,ADC能與觸摸屏控制器協(xié)同工作,完成對(duì)觸摸屏絕對(duì)地址的測(cè)量。

 

圖3 S3C2410連接4線電阻式觸摸屏
 

S3C2410的ADC和觸摸屏接口可工作于5種模式,分別如下:

1.普通轉(zhuǎn)換模式(Normal Converson Mode)

普通轉(zhuǎn)換模式(AUTO_PST = 0,XY_PST = 0)用來(lái)進(jìn)行一般的ADC轉(zhuǎn)換,例如通過(guò)ADC測(cè)量電池電壓等。

2.獨(dú)立X/Y位置轉(zhuǎn)換模式(Separate X/Y Position Conversion Mode)

獨(dú)立X/Y軸坐標(biāo)轉(zhuǎn)換模式其實(shí)包含了X軸模式和Y軸模式。為獲得X、Y坐標(biāo),需首先進(jìn)行X軸的坐標(biāo)轉(zhuǎn)換(AUTO_PST = 0,XY_PST = 1),X軸的轉(zhuǎn)換資料會(huì)寫到ADCDAT0寄存器的XPDAT中,等待轉(zhuǎn)換完成后,觸摸屏控制器會(huì)產(chǎn)生INT_ADC中斷。然后,進(jìn)行Y軸的坐標(biāo)轉(zhuǎn)換(AUTO_PST = 0,XY_PST = 2),Y軸的轉(zhuǎn)換資料會(huì)寫到ADCDAT1寄存器的YPDAT中,等待轉(zhuǎn)換完成后,觸摸屏控制器也會(huì)產(chǎn)生INT_ADC中斷。

3.自動(dòng)(連續(xù))X/Y位置轉(zhuǎn)換模式(Auto X/Y Position Conversion Mode)

自動(dòng)(連續(xù))X/Y位置轉(zhuǎn)換模式(AUTO_PST = 1,XY_PST = 0)運(yùn)行方式是觸摸屏控制自動(dòng)轉(zhuǎn)換X位置和Y位置。觸摸屏控制器在ADCDAT0的XPDATA位寫入X測(cè)定數(shù)據(jù),在ADCDAT1的YPADATA位寫入Y測(cè)定數(shù)據(jù)。自動(dòng)(連續(xù))位置轉(zhuǎn)換后,觸摸屏控制器產(chǎn)生INT_ADC中斷。

4.等待中斷模式(Wait for Interrupt Mode)

當(dāng)觸摸屏控制器等待中斷模式時(shí),它等待觸摸屏觸點(diǎn)信號(hào)的到來(lái)。當(dāng)觸點(diǎn)信號(hào)到來(lái)時(shí),控制器產(chǎn)生INT_TC中斷信號(hào)。然后,X位置和Y位置能被適當(dāng)?shù)剞D(zhuǎn)換模式(獨(dú)立X/Y位置轉(zhuǎn)換模式或自動(dòng)X/Y位置轉(zhuǎn)換模式)讀取到。

5.待機(jī)模式(Standby Mode)

當(dāng)ADCCON寄存器的STDBM位置1時(shí),待機(jī)模式被激活。在這種模式下,A/D轉(zhuǎn)換動(dòng)作被禁止,ADCDAT0的XPDATA位和ADXDATA1的YPDAT保留以前被轉(zhuǎn)換的數(shù)據(jù)。

觸摸屏設(shè)備驅(qū)動(dòng)中數(shù)據(jù)結(jié)構(gòu)

觸摸屏設(shè)備結(jié)構(gòu)體的成員與按鍵設(shè)備結(jié)構(gòu)體的成員類似,也包含一個(gè)緩沖區(qū),同時(shí)包括自旋鎖、等待隊(duì)列和fasync_struct指針,如代碼清單12.12所示。

代碼清單12.12  觸摸屏設(shè)備結(jié)構(gòu)體

1  typedef struct
2  {
3    unsigned int penStatus; /* PEN_UP, PEN_DOWN, PEN_SAMPLE */
4    TS_RET buf[MAX_TS_BUF]; /* 緩沖區(qū) */
5    unsigned int head, tail; /* 緩沖區(qū)頭和尾 */
6    wait_queue_head_t wq; /*等待隊(duì)列*/
7    spinlock_t lock;
8    #ifdef USE_ASYNC
9      struct fasync_struct *aq;
10   #endif
11   struct cdev cdev;
12 } TS_DEV;
 
觸摸屏結(jié)構(gòu)體中包含的TS_RET值的類型定義如代碼清單12.13所示,包含X、Y坐標(biāo)和狀態(tài)(PEN_DOWN、PEN_UP)等信息,這個(gè)信息會(huì)在用戶讀取觸摸信息時(shí)復(fù)制到用戶空間。

代碼清單12.13  TS_RET結(jié)構(gòu)體

1 typedef struct
2 {
3   unsigned short pressure;//PEN_DOWN、PEN_UP
4   unsigned short x;//x坐標(biāo)
5   unsigned short y;//y坐標(biāo)
6   unsigned short pad;
7 } TS_RET;
 
在觸摸屏設(shè)備驅(qū)動(dòng)中,將實(shí)現(xiàn)open()、release()、read()、fasync()和poll()函數(shù),因此,其文件操作結(jié)構(gòu)體定義如代碼清單12.14所示。

代碼清單12.14 觸摸屏驅(qū)動(dòng)文件操作結(jié)構(gòu)體

1  static struct file_operations s3c2410_fops =
2  {
3    owner: THIS_MODULE,
4    open: s3c2410_ts_open, //打開
5    read: s3c2410_ts_read, //讀坐標(biāo)
6    release:
7      s3c2410_ts_release,
8    #ifdef USE_ASYNC
9      fasync: s3c2410_ts_fasync, // fasync()函數(shù)
10   #endif
11   poll: s3c2410_ts_poll,//輪詢
12 };

觸摸屏驅(qū)動(dòng)中的硬件控制

代碼清單12.15中的一組宏用于控制觸摸屏和ADC進(jìn)入不同的工作模式,如等待中斷、X/Y位置轉(zhuǎn)換等。

代碼清單12.15  觸摸屏和ADC硬件控制

1  #define wait_down_int(){ ADCTSC = DOWN_INT | XP_PULL_UP_EN |\
2  XP_AIN | XM_HIZ | YP_AIN | YM_GND | \
3  XP_PST(WAIT_INT_MODE); }
4  #define wait_up_int(){ ADCTSC = UP_INT | XP_PULL_UP_EN | XP_AIN |\
5  XM_HIZ |YP_AIN | YM_GND | XP_PST(WAIT_INT_MODE); }
6  #define mode_x_axis(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN  \
7  | YM_HIZ |XP_PULL_UP_DIS | XP_PST(X_AXIS_MODE); }
8  #define mode_x_axis_n(){ ADCTSC = XP_EXTVLT | XM_GND | YP_AIN | \
9   YM_HIZ |XP_PULL_UP_DIS | XP_PST(NOP_MODE); }
10 #define mode_y_axis(){ ADCTSC = XP_AIN | XM_HIZ | YP_EXTVLT  \
11 | YM_GND |XP_PULL_UP_DIS | XP_PST(Y_AXIS_MODE); }
12 #define start_adc_x(){ ADCCON = PRESCALE_EN | PRSCVL(49) | \
13 ADC_INPUT(ADC_IN5) | ADC_START_BY_RD_EN | \
14 ADC_NORMAL_MODE; \
15   ADCDAT0; }
16 #define start_adc_y(){ ADCCON = PRESCALE_EN | PRSCVL(49) | \
17 ADC_INPUT(ADC_IN7) | ADC_START_BY_RD_EN | \
18 ADC_NORMAL_MODE; \
19   ADCDAT1; }
20 #define disable_ts_adc(){ ADCCON &= ~(ADCCON_READ_START); }
 
觸摸屏驅(qū)動(dòng)模塊加載和卸載函數(shù)

在觸摸屏設(shè)備驅(qū)動(dòng)的模塊加載函數(shù)中,要完成申請(qǐng)?jiān)O(shè)備號(hào)、添加cdev、申請(qǐng)中斷、設(shè)置觸摸屏控制引腳(YPON、YMON、XPON、XMON)等多項(xiàng)工作,如代碼清單12.16所示。

代碼清單12.16  觸摸屏設(shè)備驅(qū)動(dòng)的模塊加載函數(shù)

1  static int __init s3c2410_ts_init(void)
2  {
3    int ret;
4    tsEvent = tsEvent_dummy;
5    ...//申請(qǐng)?jiān)O(shè)備號(hào),添加cdev

7    /* 設(shè)置XP、YM、YP和YM對(duì)應(yīng)引腳 */
8    set_gpio_ctrl(GPIO_YPON);
9    set_gpio_ctrl(GPIO_YMON);
10   set_gpio_ctrl(GPIO_XPON);
11   set_gpio_ctrl(GPIO_XMON);
12
13   /* 使能觸摸屏中斷 */
14   ret = request_irq(IRQ_ADC_DONE, s3c2410_isr_adc,
15     SA_INTERRUPT, DEVICE_NAME,s3c2410_isr_adc);
16   if (ret)
17     goto adc_failed;
18   ret = request_irq(IRQ_TC, s3c2410_isr_tc, SA_INTERRUPT,
19     DEVICE_NAME,s3c2410_isr_tc);
20   if (ret)
21     goto tc_failed;
22
23   /*置于等待觸點(diǎn)中斷模式*/
24   wait_down_int();
25
26   printk(DEVICE_NAME " initialized\n");
27
28   return 0;
29   tc_failed:
30   free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);
31   adc_failed:
32   return ret;
33 }
 
在觸摸屏設(shè)備驅(qū)動(dòng)的模塊卸載函數(shù)中,要完成釋放設(shè)備號(hào)、刪除cdev、釋放中斷等工作,如代碼清單12.17所示。

代碼清單12.17 觸摸屏設(shè)備驅(qū)動(dòng)模塊卸載函數(shù)

1 static void __exit s3c2410_ts_exit(void)
2 {
3 ...//釋放設(shè)備號(hào),刪除cdev
4 free_irq(IRQ_ADC_DONE, s3c2410_isr_adc);
5 free_irq(IRQ_TC, s3c2410_isr_tc);
6 }
 
觸摸屏驅(qū)動(dòng)中斷、定時(shí)器處理程序

由文章開頭對(duì)觸摸屏和ADC模式的分析,可知觸摸屏驅(qū)動(dòng)中會(huì)產(chǎn)生兩類中斷,一類是觸點(diǎn)中斷(INT-TC),一類是X/Y位置轉(zhuǎn)換中斷(INT-ADC)。在前一類中斷發(fā)生后,若之前處于PEN_UP狀態(tài),則應(yīng)該啟動(dòng)X/Y位置轉(zhuǎn)換。另外,將抬起中斷也放在INT-TC處理程序中,它會(huì)調(diào)用tsEvent()完成等待隊(duì)列和信號(hào)的釋放,如代碼清單12.18所示。

代碼清單12.18  觸摸屏設(shè)備驅(qū)動(dòng)的觸點(diǎn)/抬起中斷處理程序

1  static void s3c2410_isr_tc(int irq, void *dev_id, struct pt_regs *reg)
2  {
3    spin_lock_irq(&(tsdev.lock));
4    if (tsdev.penStatus == PEN_UP)
5    {
6      start_ts_adc(); //開始X/Y位置轉(zhuǎn)換
7    }
8    else
9    {
10     tsdev.penStatus = PEN_UP;
11     DPRINTK("PEN UP: x: %08d, y: %08d\n", x, y);
12     wait_down_int();//置于等待觸點(diǎn)中斷模式
13     tsEvent();
14   }
15   spin_unlock_irq(&(tsdev.lock));
16 }
 
當(dāng)X/Y位置轉(zhuǎn)換中斷發(fā)生后,應(yīng)讀取X、Y的坐標(biāo)值,填入緩沖區(qū),如代碼清單12.19所示。

代碼清單12.19 觸摸屏設(shè)備驅(qū)動(dòng)X/Y位置轉(zhuǎn)換中斷處理程序

1  static void s3c2410_isr_adc(int irq, void *dev_id, struct pt_regs *reg)
2  {
3    spin_lock_irq(&(tsdev.lock));
4    if (tsdev.penStatus == PEN_UP)
5      s3c2410_get_XY(); //讀取坐標(biāo)
6    #ifdef HOOK_FOR_DRAG
7      else
8        s3c2410_get_XY();
9    #endif
10   spin_unlock_irq(&(tsdev.lock));
11 }

上述程序中調(diào)用的s3c2410_get_XY()用于獲得X、Y坐標(biāo),它使用代碼清單12.15的硬件操作宏實(shí)現(xiàn),如代碼清單12.20所示。

代碼清單12.20 觸摸屏設(shè)備驅(qū)動(dòng)中獲得X、Y坐標(biāo)

1  static inline void s3c2410_get_XY(void)
2  {
3    if (adc_state == 0)
4    {
5      adc_state = 1;
6      disable_ts_adc();   //禁止INT-ADC
7      y = (ADCDAT0 &0x3ff); //讀取坐標(biāo)值
8      mode_y_axis();
9      start_adc_y();   //開始y位置轉(zhuǎn)換
10   }
11   else if (adc_state == 1)
12   {
13     adc_state = 0;
14     disable_ts_adc(); //禁止INT-ADC
15     x = (ADCDAT1 &0x3ff);  //讀取坐標(biāo)值
16     tsdev.penStatus = PEN_DOWN;
17     DPRINTK("PEN DOWN: x: %08d, y: %08d\n", x, y);
18     wait_up_int();   //置于等待抬起中斷模式
19     tsEvent();
20   }
21 }
 
代碼清單12.18、12.20中調(diào)用的tsEvent最終為tsEvent_raw(),這個(gè)函數(shù)很關(guān)鍵,當(dāng)處于PEN_DOWN狀態(tài)時(shí)調(diào)用該函數(shù),它會(huì)完成緩沖區(qū)的填充、等待隊(duì)列的喚醒以及異步通知信號(hào)的釋放;否則(處于PEN_UP狀態(tài)),將緩沖區(qū)頭清0,也喚醒等待隊(duì)列并釋放信號(hào),如代碼清單12.21所示。

代碼清單12.21 觸摸屏設(shè)備驅(qū)動(dòng)的tsEvent_raw()函數(shù)

1  static void tsEvent_raw(void)
2  {
3    if (tsdev.penStatus == PEN_DOWN)
4    {
5      /*填充緩沖區(qū)*/
6      BUF_HEAD.x = x;
7      BUF_HEAD.y = y;
8      BUF_HEAD.pressure = PEN_DOWN;

10     #ifdef HOOK_FOR_DRAG
11       ts_timer.expires = jiffies + TS_TIMER_DELAY;
12       add_timer(&ts_timer);//啟動(dòng)定時(shí)器
13     #endif
14   }
15   else
16   {
17     #ifdef HOOK_FOR_DRAG
18       del_timer(&ts_timer);
19     #endif
20
21     /*填充緩沖區(qū)*/
22     BUF_HEAD.x = 0;
23     BUF_HEAD.y = 0;
24     BUF_HEAD.pressure = PEN_UP;
25   }
26
27   tsdev.head = INCBUF(tsdev.head, MAX_TS_BUF);
28   wake_up_interruptible(&(tsdev.wq));  //喚醒等待隊(duì)列
29
30   #ifdef USE_ASYNC
31     if (tsdev.aq)
32       kill_fasync(&(tsdev.aq), SIGIO, POLL_IN);//異步通知
33   #endif
34 }

在包含了對(duì)拖動(dòng)軌跡支持的情況下,定時(shí)器會(huì)被啟用,周期為10ms,在每次定時(shí)器處理函數(shù)被引發(fā)時(shí),調(diào)用start_ts_adc()開始X/Y位置轉(zhuǎn)換過(guò)程,如代碼清單12.22所示。

代碼清單12.22 觸摸屏設(shè)備驅(qū)動(dòng)的定時(shí)器處理函數(shù)

1  #ifdef HOOK_FOR_DRAG
2    static void ts_timer_handler(unsigned long data)
3    {
4      spin_lock_irq(&(tsdev.lock));
5      if (tsdev.penStatus == PEN_DOWN)
6      {
7        start_ts_adc();  //開始X/Y位置轉(zhuǎn)換
8      }
9      spin_unlock_irq(&(tsdev.lock));
10   }
11 #endif
 
觸摸屏設(shè)備驅(qū)動(dòng)的打開、釋放函數(shù)

在觸摸屏設(shè)備驅(qū)動(dòng)的打開函數(shù)中,應(yīng)初始化緩沖區(qū)、penStatus和定期器、等待隊(duì)列及tsEvent時(shí)間處理函數(shù)指針,如代碼清單12.23所示。

代碼清單12.23  觸摸屏設(shè)備驅(qū)動(dòng)的打開函數(shù)

1  static int s3c2410_ts_open(struct inode *inode, struct file *filp)
2  {
3  tsdev.head = tsdev.tail = 0;
4  tsdev.penStatus = PEN_UP;//初始化觸摸屏狀態(tài)為PEN_UP
5  #ifdef HOOK_FOR_DRAG //如果定義了拖動(dòng)鉤子函數(shù)
6  init_timer(&ts_timer);//初始化定時(shí)器
7  ts_timer.function = ts_timer_handler;
8  #endif
9  tsEvent = tsEvent_raw;
10 init_waitqueue_head(&(tsdev.wq));//初始化等待隊(duì)列
11
12 return 0;
13 }
 
觸摸屏設(shè)備驅(qū)動(dòng)的釋放函數(shù)非常簡(jiǎn)單,刪除為用于拖動(dòng)軌跡所使用的定時(shí)器即可,如代碼清單12.24所示。

代碼清單12.24 觸摸屏設(shè)備驅(qū)動(dòng)的釋放函數(shù)

1 static int s3c2410_ts_release(struct inode *inode, struct file *filp)
2 {
3   #ifdef HOOK_FOR_DRAG
4     del_timer(&ts_timer);//刪除定時(shí)器
5   #endif
6   return 0;
7 } 
 
觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)

觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)實(shí)現(xiàn)緩沖區(qū)中信息向用戶空間的復(fù)制,當(dāng)緩沖區(qū)有內(nèi)容時(shí),直接復(fù)制;否則,如果用戶阻塞訪問(wèn)觸摸屏,則進(jìn)程在等待隊(duì)列上睡眠,否則,立即返回-EAGAIN,如代碼清單12.25所示。

代碼清單12.25  觸摸屏設(shè)備驅(qū)動(dòng)的讀函數(shù)

1  static ssize_t s3c2410_ts_read(struct file *filp, char *buffer, size_t count,
2    loff_t *ppos)
3  {
4    TS_RET ts_ret;

6    retry:
7    if (tsdev.head != tsdev.tail)  //緩沖區(qū)有信息
8    {
9      int count;
10     count = tsRead(&ts_ret);
11     if (count)
12       copy_to_user(buffer, (char*) &ts_ret, count);//復(fù)制到用戶空間
13     return count;
14   }
15   else
16   {
17     if (filp->f_flags &O_NONBLOCK)    //非阻塞讀
18       return  - EAGAIN;
19     interruptible_sleep_on(&(tsdev.wq));  //在等待隊(duì)列上睡眠
20     if (signal_pending(current))
21       return  - ERESTARTSYS;
22     goto retry;
23   }
24
25   return sizeof(TS_RET);
26 }
 
觸摸屏設(shè)備驅(qū)動(dòng)的輪詢與異步通知

在觸摸屏設(shè)備驅(qū)動(dòng)中,通過(guò)s3c2410_ts_poll()函數(shù)實(shí)現(xiàn)了輪詢接口,這個(gè)函數(shù)的實(shí)現(xiàn)非常簡(jiǎn)單。它將等待隊(duì)列添加到poll_table,當(dāng)緩沖區(qū)有數(shù)據(jù)時(shí),返回資源可讀取標(biāo)志,否則返回0,如代碼清單12.26所示。

代碼清單12.26  觸摸屏設(shè)備驅(qū)動(dòng)的poll()函數(shù)

1 static unsigned int s3c2410_ts_poll(struct file *filp, struct poll_table_struct *wait)
2 {
3 poll_wait(filp, &(tsdev.wq), wait);//添加等待隊(duì)列到poll_table
4 return (tsdev.head == tsdev.tail) ? 0 : (POLLIN | POLLRDNORM);
5 }

而為了實(shí)現(xiàn)觸摸屏設(shè)備驅(qū)動(dòng)對(duì)應(yīng)用程序的異步通知,設(shè)備驅(qū)動(dòng)中要實(shí)現(xiàn)s3c2410_ts_fasync()函數(shù),這個(gè)函數(shù)與第9章給出的模板完全一樣,如代碼清單12.27所示。

代碼清單12.27 觸摸屏設(shè)備驅(qū)動(dòng)的fasync()函數(shù)

1 #ifdef USE_ASYNC
2 static int s3c2410_ts_fasync(int fd, struct file *filp, int mode)
3 {
4 return fasync_helper(fd, filp, mode, &(tsdev.aq));
5 }
6 #endif


相關(guān)閱讀:3D打印    模具產(chǎn)業(yè)    微鑄鍛技術(shù)    石墨烯    OLED面板    夏普    iPhone 8    半導(dǎo)體    蘋果    
關(guān)于我們 | 廣告服務(wù) | 聯(lián)系我們 | 版權(quán)聲明 | 隱私政策 | 網(wǎng)站地圖 | 友情鏈接 | 歡迎投稿 | 加入收藏 | 意見反饋 | 經(jīng)銷商加入
網(wǎng)站廣告、經(jīng)銷商加盟、觸摸屏軟件銷售: 028-85108892 13183843395 028-66219290 聯(lián)系人: 張小姐 產(chǎn)品購(gòu)買聯(lián)系方式如下:
地址:成都市高升橋東路2號(hào)高盛中心1109室 電話: 028-85108892 13183843395 028-66219290
版權(quán)所有 Copyright(C) 2003-2015 All rights reserved 中國(guó)觸摸屏網(wǎng) 電子郵件: 51touch@126.com touch8@gmail.com
業(yè)務(wù)合作QQ:觸摸屏技術(shù),觸摸屏報(bào)價(jià),觸摸屏軟件咨詢 43361182 觸摸屏軟件制作與技術(shù)支持:觸摸屏軟件,觸摸查詢系統(tǒng),觸摸查詢軟件 893008608 媒體合作QQ: 893008608

2000人超級(jí)QQ觸摸屏群:59897879 171220106


分享到
青青免费在线视频| 午夜电影一区| 国产综合视频| 欧美成人a在线| 日韩和欧美一区二区| 开心激情综合| 国产原创精品视频| 日韩av在线免费观看一区| 91在线国内视频| 久久aimee| 久久精品视频网| 99久久久国产精品免费调教网站| 亚洲视频一区二区免费在线观看| 国产在线美女| 国产精品久久久久一区| 亚洲精品一区二区三区在线| 欧美一区二区三区的| 免费一级片91| 精品久久99| 精品黄色免费中文电影在线播放| 日韩欧美在线网站| 国产成人精品亚洲线观看| 欧美疯狂做受xxxx富婆| 久久综合色综合88| 操欧美女人视频| 国产在线黄色| 91激情五月电影| 黄色成人在线网站| 最近中文字幕mv第三季歌词| 国产精品自在欧美一区| 色呦呦网站在线观看| 一区二区三区成人| 激情亚洲网站| 精品无人乱码| 久久精品国产精品亚洲综合| 污污软件在线观看| 激情图片小说一区| 成人在线播放免费观看| 久久老女人爱爱| 欧美色婷婷久久99精品红桃| 国产69精品久久app免费版| 日韩精品欧美成人高清一区二区| 三上悠亚激情av一区二区三区| 3751色影院一区二区三区| 91免费国产在线观看| 成人毛片视频在线观看| 成人av在线一区二区| 美女国产一区| 免费在线成人| 亚洲国产免费看| 久久av影院| 日韩伦理片在线观看| 久久只精品国产| 欧美一区电影| 黄色成年人视频在线观看| 欧美日韩精品一区二区在线播放| 国产精品三级视频| 精品肉辣文txt下载| 日韩国产欧美在线播放| 国产原创精品视频| 色香蕉久久蜜桃| 一区二区三区不卡视频 | 国产精品777777在线播放| 亚洲国产精品精华素| 亚洲午夜久久久久久久久电影院| 午夜在线a亚洲v天堂网2018| 日本综合久久| 国产在线色视频| 亚洲成a人片77777在线播放| 精品国产免费人成在线观看| 亚洲精品日韩久久久| 一级毛片高清视频| 宅男在线观看免费高清网站| 9999在线视频| 亚洲国产欧美国产第一区| 日韩精品分区| 天堂a中文在线| 亚洲第一区中文字幕| 18涩涩午夜精品.www| 久久综合色婷婷| 中文字幕一区二区精品区| 99视频这里有精品| 亚洲欧美国产精品va在线观看| 国产精品一区二区黑丝| 亚洲精品四区| 黄色日韩网站视频| 国产日产亚洲精品系列| 粉嫩一区二区三区性色av| 日韩视频一区| 欧美日韩天堂| 国产成人精选| 亚洲人午夜色婷婷| 亚洲男人天堂久| 在线播放/欧美激情| 欧美变态tickling挠脚心| 日韩日韩日韩日韩| 天堂中文av在线资源库| 国产精品一区二区日韩| 欧美综合社区国产| 无遮挡的视频在线观看| 麻豆传媒在线播放| 91精品国产综合久久精品app | 国产丝袜欧美中文另类| 奇米综合一区二区三区精品视频| 欧洲精品99毛片免费高清观看| 一级日本在线| 九色91在线| 国产一区二区三区四区| 欧美久久精品一级c片| 六九午夜精品视频| 国产精品欧美一区二区三区不卡 | 麻豆系列在线观看| 国内av一区二区三区| 999精品网| 激情综合在线| 亚洲国产精品激情在线观看| av免费看大片| 欧美成人家庭影院| 欧美日韩亚洲一区| 国产精品午夜久久| 久久久综合九色合综国产精品| 一区二区三区四区在线| 欧美视频不卡中文| 亚洲成人资源在线| 在线观看日韩av先锋影音电影院| 欧美午夜无遮挡| 精品国产91乱码一区二区三区| 一区二区三区视频国产日韩| 一个人看的免费网站www视频| 欧美午夜电影在线播放| 午夜视频一区在线观看| 亚洲制服丝袜在线| 亚洲一区二区免费视频| 亚洲另类春色国产| 亚洲视频免费看| 日韩一区二区三区三四区视频在线观看 | 国产精一区二区三区| 日韩一区二区影院| 黄色一级片视频| 黄网站免费在线观看| 免费一区二区| 毛片免费不卡| 成人全视频在线观看在线播放高清 | 我爱我色成人网| 国产精品18久久久| 亚洲另类激情图| 网红女主播少妇精品视频| 97se亚洲国产综合自在线观| 亚洲精品小视频在线观看| 欧美xxxx黑人又粗又长| 久久久加勒比| 久久97超碰国产精品超碰| 久久久国产午夜精品| 精品久久久久久亚洲国产300| 欧美变态tickle挠乳网站| 桃乃木香奈av在线| 成人mm视频在线观看| 好看不卡的中文字幕| 国产亚洲精品精华液| 中文字幕av一区二区三区免费看| 亚洲丰满少妇videoshd| 欧美一区二区三区在线视频| 日本aⅴ中文| 超碰超碰在线| 日韩免费高清视频网站| 国产精品九九| 天天综合网 天天综合色| 精品亚洲综合| 精品一区毛片| 日本不卡123| 91精品国产入口| av丝袜在线| 夜夜夜久久久| 91精品综合久久久久久| 伊人精品综合| 欧美日韩综合视频网址| 午夜成年人在线免费视频| 日韩av一区二区三区四区| 亚洲精品国产视频| 亚洲人成电影网站色| 3d欧美精品动漫xxxx无尽| 久久激情一区| 亚洲.国产.中文慕字在线| 成人a视频在线| 亚洲a∨精品一区二区三区导航| 亚洲影音一区| 7878成人国产在线观看| gogo亚洲高清大胆美女人体| 精品一区二区国语对白| 欧美日韩精品久久久| 国产精品久久久久白浆| 91av一区| 国产毛片精品视频| 你懂的在线看| 亚洲午夜激情在线| 日韩欧美亚洲| 亚洲成aⅴ人片久久青草影院| av成人免费在线| 亚洲精品少妇网址| 秋霞在线一区|