千家信息网

Linux 驱动开发中测试按键的示例分析

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,今天就跟大家聊聊有关Linux 驱动开发中测试按键的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。示例一:1、驱动代码#include
千家信息网最后更新 2025年02月02日Linux 驱动开发中测试按键的示例分析

今天就跟大家聊聊有关Linux 驱动开发中测试按键的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

示例一:

1、驱动代码

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME     "buttons"struct button_irq_desc {    int irq;    int pin;    int pin_setting;    int number;    char *name;        };static struct button_irq_desc button_irqs [] = {    {IRQ_EINT8 , S3C2410_GPG(0) ,  S3C2410_GPG0_EINT8  , 0, "KEY0"},    {IRQ_EINT11, S3C2410_GPG(3) ,  S3C2410_GPG3_EINT11 , 1, "KEY1"},    {IRQ_EINT13, S3C2410_GPG(5) ,  S3C2410_GPG5_EINT13 , 2, "KEY2"},    {IRQ_EINT14, S3C2410_GPG(6) ,  S3C2410_GPG6_EINT14 , 3, "KEY3"},    {IRQ_EINT15, S3C2410_GPG(7) ,  S3C2410_GPG7_EINT15 , 4, "KEY4"},    {IRQ_EINT19, S3C2410_GPG(11),  S3C2410_GPG11_EINT19, 5, "KEY5"},};static volatile char key_values [] = {'0', '0', '0', '0', '0', '0'};static DECLARE_WAIT_QUEUE_HEAD(button_waitq);static volatile int ev_press = 0;static irqreturn_t buttons_interrupt(int irq, void *dev_id){    struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;    int down;    // udelay(0);    down = !s3c2410_gpio_getpin(button_irqs->pin);    if (down != (key_values[button_irqs->number] & 1)) { // Changed        key_values[button_irqs->number] = '0' + down;                ev_press = 1;        wake_up_interruptible(&button_waitq);    }        return IRQ_RETVAL(IRQ_HANDLED);}static int s3c24xx_buttons_open(struct inode *inode, struct file *file){    int i;    int err = 0;        for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {        if (button_irqs[i].irq < 0) {                continue;        }        err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,                           button_irqs[i].name, (void *)&button_irqs[i]);        if (err)            break;    }    if (err) {        i--;        for (; i >= 0; i--) {            if (button_irqs[i].irq < 0) {                continue;            }            disable_irq(button_irqs[i].irq);            free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);        }        return -EBUSY;    }    ev_press = 1;        return 0;}static int s3c24xx_buttons_close(struct inode *inode, struct file *file){    int i;        for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {        if (button_irqs[i].irq < 0) {            continue;        }        free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);    }    return 0;}static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp){    unsigned long err;    if (!ev_press) {        if (filp->f_flags & O_NONBLOCK)            return -EAGAIN;        else            wait_event_interruptible(button_waitq, ev_press);    }        ev_press = 0;    err = copy_to_user(buff, (const void *)key_values, min(sizeof(key_values), count));    return err ? -EFAULT : min(sizeof(key_values), count);}static unsigned int s3c24xx_buttons_poll( struct file *file, struct poll_table_struct *wait){    unsigned int mask = 0;    poll_wait(file, &button_waitq, wait);    if (ev_press)        mask |= POLLIN | POLLRDNORM;    return mask;}static struct file_operations dev_fops = {    .owner   =   THIS_MODULE,    .open    =   s3c24xx_buttons_open,    .release =   s3c24xx_buttons_close,     .read    =   s3c24xx_buttons_read,    .poll    =   s3c24xx_buttons_poll,};static struct miscdevice misc = {        .minor = MISC_DYNAMIC_MINOR,        .name = DEVICE_NAME,        .fops = &dev_fops,};static int __init dev_init(void){        int ret;        ret = misc_register(&misc);        printk (DEVICE_NAME"\tinitialized\n");        return ret;}static void __exit dev_exit(void){        misc_deregister(&misc);}module_init(dev_init);module_exit(dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("FriendlyARM Inc.");

2、测试代码

#include #include #include #include #include #include #include #include #include #include int main(void){        int buttons_fd;        char buttons[6] = {'0', '0', '0', '0', '0', '0'};        buttons_fd = open("/dev/buttons", 0);        if (buttons_fd < 0) {                perror("open device buttons");                exit(1);        }        for (;;) {                char current_buttons[6];                int count_of_changed_key;                int i;                if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) {                        perror("read buttons:");                        exit(1);                }                for (i = 0, count_of_changed_key = 0; i < sizeof buttons / sizeof buttons[0]; i++) {                        if (buttons[i] != current_buttons[i]) {                                buttons[i] = current_buttons[i];                                printf("%skey %d is %s", count_of_changed_key? ", ": "", i+1, buttons[i] == '0' ? "up" : "down");                                count_of_changed_key++;                        }                }                if (count_of_changed_key) {                        printf("\n");                }                                        }        close(buttons_fd);        return 0;}

示例二:

1、驱动程序

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEVICE_NAME     "buttons2"struct button_irq_desc {    int irq;    int pin;    int number;    char *name;};static struct button_irq_desc button_irqs [] = {    {IRQ_EINT8 , S3C2410_GPG(0) , 0, "KEY0"},    {IRQ_EINT11, S3C2410_GPG(3) , 1, "KEY1"},    {IRQ_EINT13, S3C2410_GPG(5) , 2, "KEY2"},    {IRQ_EINT14, S3C2410_GPG(6) , 3, "KEY3"},    {IRQ_EINT15, S3C2410_GPG(7) , 4, "KEY4"},    {IRQ_EINT19, S3C2410_GPG(11), 5, "KEY5"},};static volatile int key_values [] = {0, 0, 0, 0, 0, 0, 0};static DECLARE_WAIT_QUEUE_HEAD(button_waitq);static volatile int ev_press = 0;static irqreturn_t buttons_interrupt(int irq, void *dev_id){    struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;    int down;    // udelay(0);    down = !s3c2410_gpio_getpin(button_irqs->pin);    if (down) { // Changed        key_values[button_irqs->number + 1] = key_values[button_irqs->number + 1] + 1;        key_values[0] = key_values[0] + 1;                ev_press = 1;        wake_up_interruptible(&button_waitq);    }        return IRQ_RETVAL(IRQ_HANDLED);}static int s3c24xx_buttons_open(struct inode *inode, struct file *file){    int i;    int err = 0;        for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {        if (button_irqs[i].irq < 0) {                continue;        }        err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,                           button_irqs[i].name, (void *)&button_irqs[i]);        if (err)            break;    }    if (err) {        i--;        for (; i >= 0; i--) {            if (button_irqs[i].irq < 0) {                continue;            }            disable_irq(button_irqs[i].irq);            free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);        }        return -EBUSY;    }    ev_press = 1;        return 0;}static int s3c24xx_buttons_close(struct inode *inode, struct file *file){    int i;        for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {        if (button_irqs[i].irq < 0) {            continue;        }        free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);    }    return 0;}static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp){    unsigned long err;    if (!ev_press) {        if (filp->f_flags & O_NONBLOCK)            return -EAGAIN;        else            wait_event_interruptible(button_waitq, ev_press);    }        ev_press = 0;    err = copy_to_user(buff, (const void *)key_values, min(sizeof(key_values), count));    return err ? -EFAULT : min(sizeof(key_values), count);}static unsigned int s3c24xx_buttons_poll( struct file *file, struct poll_table_struct *wait){    unsigned int mask = 0;    poll_wait(file, &button_waitq, wait);    if (ev_press)        mask |= POLLIN | POLLRDNORM;    return mask;}static struct file_operations dev_fops = {    .owner   =   THIS_MODULE,    .open    =   s3c24xx_buttons_open,    .release =   s3c24xx_buttons_close,     .read    =   s3c24xx_buttons_read,    .poll    =   s3c24xx_buttons_poll,};static struct miscdevice misc = {        .minor = MISC_DYNAMIC_MINOR,        .name = DEVICE_NAME,        .fops = &dev_fops,};static int __init dev_init(void){        int ret;        ret = misc_register(&misc);        printk (DEVICE_NAME"\tinitialized\n");        return ret;}static void __exit dev_exit(void){        misc_deregister(&misc);}module_init(dev_init);module_exit(dev_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("FriendlyARM Inc.");

2、测试程序

#include #include #include #include #include #include #include #include #include #include int main(void){        int buttons_fd;        int total_buttons_click = 0;        buttons_fd = open("/dev/buttons2", 0);        if (buttons_fd < 0) {                perror("open device buttons");                exit(1);        }        while (1) {                int current_buttons[7];                int count_of_changed_key;                int i;                if (read(buttons_fd, current_buttons, sizeof current_buttons) != sizeof current_buttons) {                        perror("read buttons:");                        exit(1);                }                if (total_buttons_click < current_buttons[0]) {                        total_buttons_click = current_buttons[0];                        printf("total: %d\t key1: %d\t key2: %d\t key3: %d\t key4: %d\t key5: %d\t key6: %d \n"                                , current_buttons[0], current_buttons[1], current_buttons[2]                                , current_buttons[3], current_buttons[4], current_buttons[5]                                , current_buttons[6]);                }                                       }        close(buttons_fd);        return 0;}

看完上述内容,你们对Linux 驱动开发中测试按键的示例分析有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

0