Changeset 19115


Ignore:
Timestamp:
2010-01-13T11:18:24+01:00 (8 years ago)
Author:
juhosg
Message:

kernel: change debounce logic in the gpio-buttons driver

  • thanks to Nuno Gonçalves
Location:
trunk/target/linux/generic-2.6/files
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic-2.6/files/drivers/input/misc/gpio_buttons.c

    r18927 r19115  
    22 *  Driver for buttons on GPIO lines not capable of generating interrupts 
    33 * 
    4  *  Copyright (C) 2007,2008 Gabor Juhos <juhosg at openwrt.org> 
     4 *  Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org> 
     5 *  Copyright (C) 2010 Nuno Goncalves <nunojpg@gmail.com> 
    56 * 
    67 *  This file was based on: /drivers/input/misc/cobalt_btns.c 
     
    3031 
    3132#define DRV_NAME        "gpio-buttons" 
    32 #define DRV_VERSION     "0.1.1" 
     33#define DRV_VERSION     "0.1.2" 
    3334#define PFX             DRV_NAME ": " 
     35 
     36struct gpio_button_data { 
     37        int last_state; 
     38        int count; 
     39}; 
    3440 
    3541struct gpio_buttons_dev { 
    3642        struct input_polled_dev *poll_dev; 
    3743        struct gpio_buttons_platform_data *pdata; 
     44        struct gpio_button_data *data; 
    3845}; 
    3946 
     
    5057                int state; 
    5158 
     59                if (bdev->data[i].count < button->threshold) { 
     60                        bdev->data[i].count++; 
     61                        continue; 
     62                } 
     63 
    5264                state = gpio_get_value(button->gpio) ? 1 : 0; 
    53                 state ^= button->active_low; 
    54  
    55                 if (state) { 
    56                         button->count++; 
    57                 } else { 
    58                         if (button->count >= button->threshold) { 
    59                                 input_event(input, type, button->code, 1); 
    60                                 input_sync(input); 
    61                         } 
    62                         button->count = 0; 
    63                 } 
    64  
    65                 if (button->count == button->threshold) { 
    66                         input_event(input, type, button->code, 0); 
     65                if (state != bdev->data[i].last_state) { 
     66                        input_event(input, type, button->code, 
     67                                    !!(state ^ button->active_low)); 
    6768                        input_sync(input); 
     69                        bdev->data[i].count = 0; 
     70                        bdev->data[i].last_state = state; 
    6871                } 
    6972        } 
     
    7881        int error, i; 
    7982 
    80  
    8183        if (!pdata) 
    8284                return -ENXIO; 
    8385 
    84         bdev = kzalloc(sizeof(*bdev), GFP_KERNEL); 
     86        bdev = kzalloc(sizeof(struct gpio_buttons_dev) + 
     87                       sizeof(struct gpio_button_data) * pdata->nbuttons, 
     88                       GFP_KERNEL); 
    8589        if (!bdev) { 
    8690                printk(KERN_ERR DRV_NAME "no memory for device\n"); 
    8791                return -ENOMEM; 
    8892        } 
     93 
     94        bdev->data = (struct gpio_button_data *) &bdev[1]; 
    8995 
    9096        poll_dev = input_allocate_polled_device(); 
     
    132138 
    133139                input_set_capability(input, type, button->code); 
    134                 button->count = 0; 
     140                bdev->data[i].last_state = gpio_get_value(button->gpio) ? 1 : 0; 
    135141        } 
    136142 
  • trunk/target/linux/generic-2.6/files/include/linux/gpio_buttons.h

    r18927 r19115  
    22 *  Definitions for the GPIO buttons interface driver 
    33 * 
    4  *  Copyright (C) 2007,2008 Gabor Juhos <juhosg at openwrt.org> 
     4 *  Copyright (C) 2007-2010 Gabor Juhos <juhosg@openwrt.org> 
    55 * 
    66 *  This file was based on: /include/linux/gpio_keys.h 
     
    2222        int     type;           /* input event type (EV_KEY, EV_SW) */ 
    2323        int     code;           /* input event code (KEY_*, SW_*) */ 
    24         int     count; 
    2524        int     threshold;      /* count threshold */ 
    2625}; 
     
    3332 
    3433#endif /* _GPIO_BUTTONS_H_ */ 
    35  
Note: See TracChangeset for help on using the changeset viewer.