]> rtime.felk.cvut.cz Git - mx1ts.git/blobdiff - mx1_ts-driver.c
odebrany staticke promene posledni polohy. Posledni poloha patri do struktury mx1ts
[mx1ts.git] / mx1_ts-driver.c
index 923d46264cbc36c0aded957f6d1a1a6d205e1741..a6e760950ef3f3ea1f5b35178d7a8ffa35369ed1 100644 (file)
@@ -183,6 +183,7 @@ struct mx1ts {
 
 }; 
 
+
 static inline void mx1ts_reg_set_mask(struct mx1ts *mts , unsigned int reg, u32 mask)
 {      
        u32 val;
@@ -202,7 +203,7 @@ static inline void mx1ts_reg_clear_mask(struct mx1ts *mts , unsigned int reg, u3
 static inline void mx1ts_reg_write(struct mx1ts *mts, unsigned int reg, unsigned int val)
 {      
        __raw_writel(val, mts->mx1ts_mem+reg);
-       printk(KERN_ERR "mx1_touchscreen: zapisuji do : %p  hodnotu %x\n",mts->mx1ts_mem+reg, val);
+       printk(KERN_DEBUG "mx1_touchscreen: writing into : %p value %x\n",mts->mx1ts_mem+reg, val);
        
 }
 
@@ -211,7 +212,7 @@ static inline unsigned int mx1ts_reg_read(struct mx1ts *mts, unsigned int reg)
        unsigned int out;
 
        out =  __raw_readl( mts->mx1ts_mem + reg );     
-       /*printk(KERN_ERR "mx1_touchscreen: ctu z %p : %d \n",mts->mx1ts_mem + reg, out);*/
+       /*printk(KERN_DEBUG "mx1_touchscreen: reading from %p : %d \n",mts->mx1ts_mem + reg, out);*/
                
        return out;
 }
@@ -282,21 +283,12 @@ static void mx1ts_enable_pen_touch_interrupt(struct mx1ts *mts)
 {
        unsigned int value;
 
-       /*while (1) {
-       value = mx1ts_reg_read(mts, ASP_ACNTLCR);
-       value = 0X00000000;
-       value |= ASP_SW3 | ASP_SW6 | ASP_SW5 | ASP_BGE | ASP_PADE ;
-       mx1ts_reg_write(mts, ASP_ACNTLCR, value);
-       
-       pen_x = mx1ts_reg_read(mts, ASP_PADFIFO);
-       mx1ts_evt_add(mts->ts_idev, 20 , pen_x, 00);*/
-
        /* Enable pen touch interrupt. */
        value = mx1ts_reg_read(mts, ASP_ICNTLR);
-       value |= /*ASP_EDGE | ASP_POL |*/ ASP_PIRQE;
+       value |= ASP_EDGE | /*ASP_POL |*/ ASP_PIRQE;
        mx1ts_reg_write(mts, ASP_ICNTLR, value);
        
-       printk(KERN_ERR "mx1_touchscreen pen_touch: aktivuji pen down interrupt \n");
+       printk(KERN_DEBUG "mx1_touchscreen: pen_touch: activating pen_down interrupt \n");
 }
 
 static void mx1ts_disable_pen_touch_interrupt(struct mx1ts *mts)
@@ -306,9 +298,8 @@ static void mx1ts_disable_pen_touch_interrupt(struct mx1ts *mts)
        /* Enable pen touch interrupt. */
        value = mx1ts_reg_read(mts, ASP_ICNTLR);
        value &= ~ASP_PIRQE;
-       value = 0; /* TODO tohle se musi smazat*/
        mx1ts_reg_write(mts, ASP_ICNTLR, value);
-       printk(KERN_ERR "mx1_touchscreen pen_touch: deaktivuji pen down interrupt \n");
+       printk(KERN_DEBUG "mx1_touchscreen: pen_touch: deaktivating pen_down interrupt \n");
 }
 
 static void mx1ts_enable_pen_up_interrupt(struct mx1ts *mts)
@@ -318,7 +309,7 @@ static void mx1ts_enable_pen_up_interrupt(struct mx1ts *mts)
        value = mx1ts_reg_read(mts, ASP_ICNTLR);
        value |= ASP_PUIE; 
        mx1ts_reg_write(mts, ASP_ICNTLR, value);
-       printk(KERN_ERR "mx1_touchscreen pen_up: aktivuji pen up interrupt \n");
+       printk(KERN_DEBUG "mx1_touchscreen: pen_up: activating pen_up interrupt \n");
 }
 
 static void mx1ts_disable_pen_up_interrupt(struct mx1ts *mts)
@@ -329,7 +320,7 @@ static void mx1ts_disable_pen_up_interrupt(struct mx1ts *mts)
        value = mx1ts_reg_read(mts, ASP_ICNTLR);
        value &= ~ASP_PUIE;
        mx1ts_reg_write(mts, ASP_ICNTLR, value);
-       printk(KERN_ERR "mx1_touchscreen pen_up: deaktivuji pen up interrupt \n");
+       printk(KERN_DEBUG "mx1_touchscreen: pen_up: deaktivating pen_up interrupt \n");
 }
 
 
@@ -337,7 +328,7 @@ static void mx1ts_disable_pen_up_interrupt(struct mx1ts *mts)
 static void mx1ts_start_auto_calibration(struct mx1ts *mts)
 {
        unsigned int value;
-       printk(KERN_ERR "mx1_touchscreen start_auto_calibration \n");
+       printk(KERN_DEBUG "mx1_touchscreen: start_auto_calibration \n");
 
 
        mts->auto_calibration = 1;
@@ -404,6 +395,10 @@ static void mx1ts_reset_asp(struct mx1ts *mts)
 
 static void mx1ts_evt_add_touch(struct input_dev *idev, u8 p , u16 x, u16 y)
 {
+       struct mx1ts *mts = dev_get_drvdata(idev->dev.parent);
+       mts->x_akt = x;
+       mts->y_akt = y;
+
        input_report_key(idev, BTN_TOUCH, 1);
        input_report_abs(idev, ABS_X, x);
        input_report_abs(idev, ABS_Y, y);
@@ -412,25 +407,17 @@ static void mx1ts_evt_add_touch(struct input_dev *idev, u8 p , u16 x, u16 y)
        input_sync(idev);
 }
 
-static void mx1ts_evt_add_up(struct input_dev *idev, u16 x, u16 y)
+static void mx1ts_evt_add_up(struct input_dev *idev)
 {
-       input_report_abs(idev, ABS_X, x);
-       input_report_abs(idev, ABS_Y, y);
+       struct mx1ts *mts = dev_get_drvdata(idev->dev.parent);
+       
+       input_report_abs(idev, ABS_X, mts->x_akt);
+       input_report_abs(idev, ABS_Y, mts->y_akt);
        input_report_abs(idev, ABS_PRESSURE, 0);
        /*input_report_key(idev, BTN_TOUCH, 0);*/
        input_sync(idev);
 }
 
-static void mx1ts_evt_add(struct input_dev *idev, u8 p , u16 x, u16 y)
-{
-       if((x < 7900 || x > 8900) && (y < 7751 || y > 10900)) {
-               mx1ts_evt_add_touch(idev,p, x, y); /* TODO opravit pen_up pen_down zrejme chyba HW  ??? TODO */
-               mx1ts_evt_add_up(idev, x, y);                   
-       }
-       
-
-}
-
 /*
  * Handle the pen data ready interrupt, generated when pen data is
  * in the FIFO.
@@ -447,19 +434,19 @@ static irqreturn_t mx1ts_pendata_irq(int irq, void *dev_id)
        mx1_cal_range_x = 1;
        mx1_cal_range_y = 1;
 
-       /*printk(KERN_ERR "mx1_touchscreen mx1ts_pendata_irq \n");*/
-/*     printk(KERN_ERR "mx1_touchscreen: mx1_pendata_irq interrupt recived from struct %p\n", mts);*/
+       /*printk(KERN_DEBUG "mx1_touchscreen mx1ts_pendata_irq \n");*/
+/*     printk(KERN_DEBUG "mx1_touchscreen: mx1_pendata_irq interrupt recived from struct %p\n", mts);*/
                
-       if (mx1ts_reg_read(mts, ASP_ISTATR) & ASP_PUIS) {               /*pen up interupt pending*/
-               mx1ts_reg_set_mask(mts, ASP_ISTATR, ASP_PUIS);          /*clearing pen up interupt*/
+       if (mx1ts_reg_read(mts, ASP_ISTATR) & ASP_PUIS) {       /*pen up interupt pending*/
+               mx1ts_reg_set_mask(mts, ASP_ISTATR, ASP_PUIS);  /*clearing pen up interupt*/
 
                mx1ts_disable_auto_sample(mts);                         
                mx1ts_disable_pen_up_interrupt(mts);
                mx1ts_enable_pen_touch_interrupt(mts);
 
                if(mts->is_open)                                        /*report last known touch*/
-                       mx1ts_evt_add_up(mts->ts_idev, 100, 100);
-               printk(KERN_ERR "Pen up interrupt.\n");                 
+                       mx1ts_evt_add_up(mts->ts_idev);
+               printk(KERN_DEBUG "Pen up interrupt.\n");                       
                mx1ts_flush_fifo(mts);
 
                return IRQ_HANDLED;
@@ -472,19 +459,18 @@ static irqreturn_t mx1ts_pendata_irq(int irq, void *dev_id)
                mts->cal_range_x = mx1ts_reg_read(mts, ASP_PADFIFO) & 0xFFFF;
                mts->cal_range_y = mx1ts_reg_read(mts, ASP_PADFIFO) & 0xFFFF;
 
-               printk(KERN_ERR "Kalibrace cal_auto_zero %i.\n",mts->cal_auto_zero);
-               printk(KERN_ERR "Kalibrace cal_range_x %i.\n",mts->cal_range_x);
-               printk(KERN_ERR "Kalibrace cal_range_y %i.\n",mts->cal_range_y);
-
                if ((mts->cal_auto_zero >= mts->cal_range_x) ||
                    (mts->cal_auto_zero >= mts->cal_range_y)) {
                        // Invalid data. 
-                       printk(KERN_ERR "Invalid data.\n");
+                       printk(KERN_INFO "Invalid calibration data. Recalibrating. \n");
                        mx1ts_flush_fifo(mts);                  /*if there are some older data*/
                        mx1ts_start_auto_calibration(mts);
-                       return IRQ_NONE; /* return IRQ_HANDLED; */
+                       return IRQ_HANDLED; /*return IRQ_NONE;*/
                }
 
+               printk(KERN_DEBUG "mx1 touchscreen: calibration cal_auto_zero %i.\n",mts->cal_auto_zero);
+               printk(KERN_DEBUG "mx1 touchscreen: calibration cal_range_x %i.\n",mts->cal_range_x);
+               printk(KERN_DEBUG "mx1 touchscreen: calibration cal_range_y %i.\n",mts->cal_range_y);
                
                mts->cal_range_x -= mts->cal_auto_zero;
                mts->cal_range_y -= mts->cal_auto_zero;
@@ -504,7 +490,7 @@ static irqreturn_t mx1ts_pendata_irq(int irq, void *dev_id)
                // generated as long as there is data in the FIFO. 
 
                if ((mx1ts_reg_read(mts, ASP_ISTATR) & ASP_PDR) != ASP_PDR) {
-                       return IRQ_NONE; /* TODO je to tak? */
+                       return IRQ_NONE; 
                }
 
                auto_zero = mx1ts_reg_read(mts, ASP_PADFIFO);
@@ -522,7 +508,7 @@ static irqreturn_t mx1ts_pendata_irq(int irq, void *dev_id)
                              mts->cal_range_y);
                
                if(mts->is_open)
-                       mx1ts_evt_add(mts->ts_idev, 200 , pen_x, pen_y);
+                       mx1ts_evt_add_touch(mts->ts_idev, 200 , pen_x, pen_y);
        }
        return IRQ_HANDLED;
 }
@@ -536,7 +522,7 @@ static irqreturn_t mx1ts_touch_irq(int irq, void *dev_id)
 {
        struct mx1ts *mts = (struct mx1ts *) dev_id;
        
-       printk(KERN_ERR "Prijat touch down irq \n");    
+       printk(KERN_DEBUG "mx1 touchscreen: Touch down interrupt \n");  
 
        /* Clear the interrupt. */
        mx1ts_reg_set_mask(mts, ASP_ISTATR, ASP_PEN);
@@ -552,13 +538,14 @@ static irqreturn_t mx1ts_touch_irq(int irq, void *dev_id)
 static inline int mx1ts_enable_irqs(struct mx1ts *mts) //zaregistruje preruseni
 {
        int result;
+//TODO printk(KERN_ERR "enabling irq %d.\n",mts->ts_idev->dev.parent.resource[1]->start);
        result = request_irq(ASP_PENDATA_IRQ,
                             mx1ts_pendata_irq,
-                            /*IRQF_*/ 0,
+                                0,
                             DEV_IRQ_ID,
                             mts);
        if (result) {
-               printk(KERN_ERR "Couldn't request pen data IRQ.\n");
+               printk(KERN_ERR "mx1 touchscreen: Couldn't request pen data IRQ.\n");
                return result;
        }
 
@@ -568,7 +555,7 @@ static inline int mx1ts_enable_irqs(struct mx1ts *mts)      //zaregistruje preruseni
                             DEV_IRQ_ID,
                             mts);
        if (result) {
-               printk(KERN_ERR "Couldn't request pen touch IRQ.\n");
+               printk(KERN_ERR "mx1 touchscreen: Couldn't request pen touch IRQ.\n");
                free_irq(ASP_PENDATA_IRQ, mts);
                return result;
        }
@@ -577,31 +564,36 @@ static inline int mx1ts_enable_irqs(struct mx1ts *mts)    //zaregistruje preruseni
 
 
 
-static int mx1ts_on(struct mx1ts *mts)
+static int mx1ts_on(struct mx1ts *mts)    /*TODO doplnit pri chybach*/
 {
        int ret = 0;
        
        if(!request_mem_region(ASP_BASE_ADDR, 0x38 , "mx1ts")) {
-               printk(KERN_ERR "mx1ts: request_mem_region \tFAILED\n");
+               printk(KERN_ERR "mx1 touchscreen: request_mem_region \tFAILED\n");
                return -1;      
        }
 
-       printk(KERN_ERR "mx1ts: request_mem_region \tOK\n");    
+       printk(KERN_DEBUG "mx1 touchscreen: request_mem_region \tOK\n");        
 
        mts->mx1ts_mem = ioremap ( ASP_BASE_ADDR, 0x38);
        
-       printk(KERN_ERR "mx1ts: memory remaped on %p \n", mts->mx1ts_mem);
+       if(!mts->mx1ts_mem) {
+               printk(KERN_ERR "mx1 touchscreen: ioremap  \tFAILED\n");
+               return -1;      
+       }
+
+       printk(KERN_DEBUG "mx1 touchscreen: memory remaped on %p \n", mts->mx1ts_mem);
        
 
 
-       printk(KERN_ERR "mx1ts: enabling irqs\n");
+       /*printk(KERN_DEBUG "mx1 touchscreen: enabling irqs\n");*/
        if ((ret = mx1ts_enable_irqs(mts)))
                return ret;
-       printk(KERN_ERR "mx1ts: irqs enabled \tOK\n");  
+       printk(KERN_DEBUG "mx1 touchscreen: irqs enabled \tOK\n");      
 
        
        mx1ts_reset_asp(mts);
-       printk(KERN_ERR "mx1ts: reset\tOK\n");
+       printk(KERN_DEBUG "mx1 touchscreen: reset\tOK\n");
        
        return 0;
 }
@@ -612,7 +604,7 @@ static void mx1ts_close(struct input_dev *idev)
        mts->is_open = 0;
        mx1ts_flush_fifo(mts);
        mx1ts_reset_asp(mts);
-       printk(KERN_ERR "mx1ts: reset\tOK\n");
+       printk(KERN_DEBUG "mx1 touchscreen: reset\tOK\n");
        mx1ts_disable_pen_touch_interrupt(mts);
        mx1ts_disable_pen_up_interrupt(mts);
 
@@ -624,7 +616,7 @@ static int mx1ts_open(struct input_dev *idev)
        mts->is_open = 1;
        mx1ts_flush_fifo(mts);                  /*if there are some older data*/
        mx1ts_enable_pen_touch_interrupt(mts);
-       printk(KERN_ERR "mx1ts: zapnuti touch interrupt\n");    
+       printk(KERN_DEBUG "mx1 touchscreen: touch_down interupt enabled\n");    
        return 0;
 }
 
@@ -640,7 +632,7 @@ static int mx1ts_probe(struct platform_device *dev)
        idev = input_allocate_device();
        if (!mts || !idev) {
                error = -ENOMEM;
-               printk(KERN_ERR "mx1ts: failed allocate memory for struct mx1ts or idev\n");    
+               printk(KERN_ERR "mx1 touchscreen: failed allocate memory for struct mx1ts or idev\n");  
                goto err_free_devs;
                return error;   
        }
@@ -648,65 +640,45 @@ static int mx1ts_probe(struct platform_device *dev)
        mx1ts_on(mts);                  /* remaping registers, reseting device */
 
        mts->ts_idev = idev;
-       //ucb->adcsync = adcsync;
-       //ucb->ac97 = to_ac97_t(dev);
        init_waitqueue_head(&mts->ts_wait);
 
-/*     id = mx1ts_reg_read(ucb, UCB_ID);
-       if (id != UCB_ID_1400) {
-               error = -ENODEV;
-               goto err_free_devs;
-       }
-
-       error = mx1ts_detect_irq(ucb);
-       if (error) {
-               printk(KERN_ERR "UCB1400: IRQ probe failed\n");
-               goto err_free_devs;
-       }
-
-       error = request_irq(ucb->irq, mx1ts_hard_irq, IRQF_TRIGGER_RISING,
-                               "UCB1400", ucb);
-       if (error) {
-               printk(KERN_ERR "mx1ts: unable to grab irq%d: %d\n",
-                               ucb->irq, error);
-               goto err_free_devs;
-       }
-       printk(KERN_DEBUG "UCB1400: found IRQ %d\n", ucb->irq);*/
-
        //input_set_drvdata(idev, mts);         /*moznost ulozit ukazatel na trukturu do input_driver*/
        platform_set_drvdata(dev, mts);
 
        idev->dev.parent        = &dev->dev;
        idev->name              = "MX1 touchscreen interface";
+       idev->phys              = "mx1ts/input0";       //dodano
        idev->id.vendor         = (unsigned int) 345;   /*mx1ts_reg_read(mx1_ts, AC97_VENDOR_ID1);*/
        idev->id.product        = (unsigned int) 354;   /*id;*/
+       idev->id.version        = 0x0100;               //dodano
+       idev->id.bustype        = BUS_HOST;
        idev->open              = mx1ts_open;
        idev->close             = mx1ts_close;
        idev->evbit[0]          = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
        idev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
 
-       printk(KERN_ERR "mx1ts: setting idev struct \tOK\n");
+       printk(KERN_DEBUG "mx1ts: setting idev struct \tOK\n");
        
-       x_res = 60000;
+       x_res = 60000;          /*TODO neni mozne zmerit ? */
        y_res = 60000;
        printk(KERN_DEBUG "mx1ts: x/y = %d/%d\n", x_res, y_res);
 
        input_set_abs_params(idev, ABS_X, 0, x_res, 0, 0);
        input_set_abs_params(idev, ABS_Y, 0, y_res, 0, 0);
-       input_set_abs_params(idev, ABS_PRESSURE, 0, 20000, 0, 0);
+       input_set_abs_params(idev, ABS_PRESSURE, 0, 1, 0, 0);
 
        error = input_register_device(idev);
        if (error) {
-               printk(KERN_ERR "mx1ts: error while register input device\n");
+               printk(KERN_ERR "mx1 touchscreen: error while register input device\n");
                goto err_free_devs;
                }
 
-       printk(KERN_ERR "mx1ts: input device registered \tOK\n");
+       printk(KERN_DEBUG "mx1ts: input device registered \tOK\n");
 
        return 0;
 
   err_free_devs:
-       printk(KERN_ERR "mx1ts: error in device probe  \n");
+       printk(KERN_ERR "mx1 touchscreen: error in device probe  \n");
        /*input_free_device(idev);*/
        kfree(mts);
        return error;
@@ -719,22 +691,22 @@ static int mx1ts_remove(struct platform_device *dev)
 {
        struct mx1ts *mts = platform_get_drvdata(dev);
 
-       BUG_ON(mts == NULL);
+       //BUG_ON(mts == NULL);
        
        free_irq(ASP_PENDATA_IRQ, mts);
        free_irq(ASP_TOUCH_IRQ, mts);
 
        /*input_free_device(mts->ts_idev);
-       printk(KERN_ERR "Free device \tOK\n");*/
+       printk(KERN_DEBUG "Free device \tOK\n");*/
        
        input_unregister_device(mts->ts_idev);
-       printk(KERN_ERR "Unregister device \tOK\n");
+       printk(KERN_INFO "mx1 touchscreen: Unregister device \tOK\n");
        iounmap(mts->mx1ts_mem);
        release_mem_region(ASP_BASE_ADDR, 0x38);
                
        kfree(mts);
 
-       printk(KERN_ERR "Removing driver \tOK\n");
+       printk(KERN_INFO "mx1 touchscreen: Removing driver \tOK\n");
        return 0;
 }
 
@@ -775,11 +747,21 @@ static struct resource mx1ts_resources[] = {
        },
 };
 
+void mx1ts_device_release(struct device *dev) {
+       /*struct platform_device *pdev = to_platform_device(dev);
+       release_resource(&dev->res);
+       kfree(pdev);
+       }*/
+}
+
 static struct platform_device mx1ts_device = {
        .name           = "mx1ts",
        .id             = 0,
        .num_resources  = ARRAY_SIZE(mx1ts_resources),
        .resource       = mx1ts_resources,
+       .dev = {
+       .release = mx1ts_device_release,
+       },
 };
 
 
@@ -791,7 +773,7 @@ static int __init mx1ts_init(void)
        int error;
        error = platform_device_register(&mx1ts_device);
        if(error) {
-               printk(KERN_ERR "PiMX1_touchsceen: device registration failed\n");
+               printk(KERN_ERR "mx1 touchscreen: device registration failed\n");
                return error;
        }