????????????????????????????锟�?????????????卸?????stylus_updown????


static irqreturn_t stylus_updown(int irq?? void *dev_id)
{
       unsigned long data0;
       unsigned long data1;
       int updown;
       if (down_trylock(&ADC_LOCK) == 0) {  //????????
              OwnADC = 1;       //????????
              data0 = ioread32(base_addr+S3C2410_ADCDAT0); //???X??????
              data1 = ioread32(base_addr+S3C2410_ADCDAT1); //???Y??????
              updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN)); //????????????锟�?????updowm=1
              if (updown) {
                     touch_timer_fire(0);  // ??????????????锟�????touch_timer_fire
              } else {  //????????????????
                     OwnADC = 0;
                     up(&ADC_LOCK);
              }
       }
       return IRQ_HANDLED;
}


???????????????畏???touch_timer_fire????????????????????卸??械?????????????????璧�????????????o?????????????AD???


static void touch_timer_fire(unsigned long data)
{
     unsigned long data0;
     unsigned long data1;
       int updown;
     data0 = ioread32(base_addr+S3C2410_ADCDAT0);
     data1 = ioread32(base_addr+S3C2410_ADCDAT1);
      updown = (!(data0 & S3C2410_ADCDAT0_UPDOWN)) && (!(data1 & S3C2410_ADCDAT0_UPDOWN));
      if (updown) {  //????????????
             if (count != 0) { //count?????????????AD???????????未AD???
                     long tmp;                                                                                        
                     tmp = xp;
                     xp = yp;
                     yp = tmp;                                                                                        
           xp >>= 2;
           yp >>= 2;
                    input_report_abs(dev?? ABS_X?? xp);
                    input_report_abs(dev?? ABS_Y?? yp);
                    input_report_key(dev?? BTN_TOUCH?? 1);
                    input_report_abs(dev?? ABS_PRESSURE?? 1);
                    input_sync(dev);
             }
             xp = 0;      //??????????????锟�?????未???AD???
             yp = 0;
             count = 0;
             //???????????X??Y????
iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST?? base_addr+S3C2410_ADCTSC);
//AD?????????位??????????
             iowrite32(ioread32(base_addr+S3C2410_ADCCON) | S3C2410_ADCCON_ENABLE_START?? base_addr+S3C2410_ADCCON);
      } else {
             count = 0;
             input_report_key(dev?? BTN_TOUCH?? 0);
             input_report_abs(dev?? ABS_PRESSURE?? 0);
             input_sync(dev);
             iowrite32(WAIT4INT(0)?? base_addr+S3C2410_ADCTSC);
              if (OwnADC) {
                     OwnADC = 0;
                     up(&ADC_LOCK);
              }
      }
}


???????????????????????????????锟�?????AD????????????????????AD????????????X??Y????????????AD????卸?????AD??????卸???????????????????????????锟�???X??Y?????????????????AD????????AD??????卸????????????????????AD??????卸???????


static irqreturn_t stylus_action(int irq?? void *dev_id)
{
       unsigned long data0;
       unsigned long data1;
       if (OwnADC) { //??写??????????锟�??????????卸???????1
              data0 = ioread32(base_addr+S3C2410_ADCDAT0); //???X????
              data1 = ioread32(base_addr+S3C2410_ADCDAT1);  //???Y????
              xp += data0 & S3C2410_ADCDAT0_XPDATA_MASK;//????X????
              yp += data1 & S3C2410_ADCDAT1_YPDATA_MASK;//????Y????
              count++;  //???AD???????
           if (count < (1<<2)) { //???AD???????????4??
                     //???????????X??Y????
 iowrite32(S3C2410_ADCTSC_PULL_UP_DISABLE | AUTOPST?? base_addr+S3C2410_ADCTSC);
//AD?????????位??????????
iowrite32(ioread32(base_addr+S3C2410_ADCCON) |S3C2410_ADCCON_ENABLE_START??base_addr+S3C2410_ADCCON);
              } else {
                     mod_timer(&touch_timer?? jiffies+1); //???AD?????????????
                     iowrite32(WAIT4INT(1)?? base_addr+S3C2410_ADCTSC);//??????
              }
       }
       return IRQ_HANDLED;
}