亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 按鍵驅動.c

?? linux下的按鍵驅動
?? C
字號:
/*這段代碼是一個用戶模式下的DEMO,不是真正的驅動,它負責把按鍵的鍵值打印輸出*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>

int main(void)
{
    int buttons_fd;
    int key_value;

    buttons_fd = open("/dev/buttons", 0);
    if (buttons_fd < 0) {
        perror("open device buttons");
        exit(1);
    }

    for (;;) {
        fd_set rds;
        int ret;

        FD_ZERO(&rds);
        FD_SET(buttons_fd, &rds);

        ret = select(buttons_fd + 1, &rds, NULL, NULL, NULL);
        if (ret < 0) {
              perror("select");
              exit(1);
        }
        if (ret == 0) {
              printf("Timeout.\n");
        } else if (FD_ISSET(buttons_fd, &rds)) {
              int ret = read(buttons_fd, &key_value, sizeof key_value);
              if (ret != sizeof key_value) {
                  if (errno != EAGAIN)
                      perror("read buttons\n");
                  continue;
              } else {
                  printf("buttons_value: %d\n", key_value);
              }
                  
        }
    }

    close(buttons_fd);
    return 0;
}

/*下面是真正的驅動部分*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

#include <linux/miscdevice.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/spinlock.h>
#include <linux/irq.h>
#include <linux/delay.h>

#include <asm/hardware.h>

#define DEVICE_NAME     "buttons"
#define BUTTON_MAJOR 232

static struct key_info {
    int irq_no;
    unsigned int gpio_port;
    int key_no;
} key_info_tab[4] = {
    { IRQ_EINT1, GPIO_F1, 1 },
    { IRQ_EINT2, GPIO_F2, 2 },
    { IRQ_EINT3, GPIO_F3, 3 },
    { IRQ_EINT7, GPIO_F7, 4 },
};

static int ready = 0;
static int key_value = 0;

static DECLARE_WAIT_QUEUE_HEAD(buttons_wait);

static void buttons_irq(int irq, void *dev_id, struct pt_regs *reg)
{
    struct key_info *k;
    int i;
    int found = 0;
    int up;
    int flags;
    for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
        k = key_info_tab + i;
        if (k->irq_no == irq) {
              found = 1;
              break;
        }
    }
    if (!found) {
        printk("bad irq %d in button\n", irq);
        return;
    }

    save_flags(flags);
    cli();
    set_gpio_mode_user(k->gpio_port, GPIO_MODE_IN);
    up = read_gpio_bit(k->gpio_port);
    set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);
    restore_flags(flags);
    if (up) {
          key_value = k->key_no + 0x80;
    } else {
          key_value = k->key_no;
    }
        ready = 1;
    wake_up_interruptible(&buttons_wait);
}

static int request_irqs(void)
{
    struct key_info *k;
    int i;
    for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
        k = key_info_tab + i;
        set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);
        if (request_irq(k->irq_no, &buttons_irq, SA_INTERRUPT, DEVICE_NAME, &buttons_irq)) {
              return -1;
        }
        
    }
    return 0;
}

static void free_irqs(void)
{
    struct key_info *k;
    int i;
    for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
        k = key_info_tab + i;
        free_irq(k->irq_no, buttons_irq);
    }
}

static int matrix4_buttons_read(struct file * file, char * buffer, size_t count, loff_t *ppos)
{
    static int key;
    int flags;
    int repeat;
    if (!ready)
          return -EAGAIN;
    if (count != sizeof key_value)
          return -EINVAL;
    save_flags(flags);
    if (key != key_value) {
        key = key_value;
        repeat = 0;
    } else {
        repeat = 1;
    }
    restore_flags(flags);

    if (repeat) {
        return -EAGAIN;
    }
    
    copy_to_user(buffer, &key, sizeof key);
    ready = 0;
    return sizeof key_value;
}

static unsigned int matrix4_buttons_select(
    struct file *file,
    struct poll_table_struct *wait)
{
    if (ready)
          return 1;
    poll_wait(file, &buttons_wait, wait);
    return 0;
}


static int matrix4_buttons_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
    switch(cmd) {
    default:
        return -EINVAL;
    }
}
static struct file_operations matrix4_buttons_fops = {
    owner:     THIS_MODULE,
    ioctl: matrix4_buttons_ioctl,
    poll: matrix4_buttons_select,
    read: matrix4_buttons_read,
};

static devfs_handle_t devfs_handle;
static int __init matrix4_buttons_init(void)
{
    int ret;

    ready = 0;
    ret = register_chrdev(BUTTON_MAJOR, DEVICE_NAME, &matrix4_buttons_fops);
    if (ret < 0) {
      printk(DEVICE_NAME " can't register major number\n");
      return ret;
    }
    
    ret = request_irqs();
    if (ret) {
        unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);
        printk(DEVICE_NAME " can't request irqs\n");
        return ret;
    }
    devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT,
                  BUTTON_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &matrix4_buttons_fops, NULL);

    return 0;
}

static void __exit matrix4_buttons_exit(void)
{
    devfs_unregister(devfs_handle);
    free_irqs();
    unregister_chrdev(BUTTON_MAJOR, DEVICE_NAME);
}

module_init(matrix4_buttons_init);
module_exit(matrix4_buttons_exit);
MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕国产精品一区二区| 一区二区在线看| 97精品国产97久久久久久久久久久久| 亚洲国产综合视频在线观看| 国产偷国产偷精品高清尤物| 在线播放91灌醉迷j高跟美女 | 日本成人在线网站| 欧美国产精品中文字幕| 欧美一级在线免费| 一本大道av一区二区在线播放| 韩国精品在线观看| 天天免费综合色| 亚洲激情六月丁香| 国产精品色婷婷| 久久精品亚洲乱码伦伦中文| 欧美一区二区成人| 欧美日韩一级片网站| 91在线小视频| 不卡区在线中文字幕| 国产一区视频在线看| 日本美女一区二区三区视频| 亚洲一本大道在线| 亚洲三级电影网站| 欧美韩国日本不卡| 久久久99免费| 久久人人爽人人爽| 精品sm在线观看| 欧美sm美女调教| 日韩精品一区国产麻豆| 91精品国模一区二区三区| 欧美亚洲综合色| 91福利视频在线| 99re热这里只有精品视频| 懂色一区二区三区免费观看| 国产一区亚洲一区| 国产精品自产自拍| 国产成人午夜电影网| 国产精品一区三区| 国产盗摄女厕一区二区三区| 国产一区在线观看麻豆| 国内成+人亚洲+欧美+综合在线| 麻豆视频观看网址久久| 蜜桃91丨九色丨蝌蚪91桃色| 麻豆91精品视频| 久久99精品一区二区三区| 免费xxxx性欧美18vr| 老司机一区二区| 国产毛片精品一区| 国产精品一区二区免费不卡| 国产91在线看| 99久久精品国产一区| 在线观看欧美日本| 欧美色涩在线第一页| 欧美日韩国产高清一区二区三区 | 亚洲1区2区3区视频| 亚洲成人先锋电影| 免费成人在线视频观看| 国产一区二区三区四| 大胆欧美人体老妇| 色一情一乱一乱一91av| 精品视频999| 日韩午夜激情免费电影| 日本在线播放一区二区三区| 青青草一区二区三区| 九色综合狠狠综合久久| 成人免费高清视频在线观看| 99精品在线免费| 欧美精品日韩一本| 久久奇米777| 亚洲欧洲一区二区在线播放| 一区二区欧美视频| 日本大胆欧美人术艺术动态| 国产成人在线观看| 色综合网站在线| 日韩三级av在线播放| 国产精品视频线看| 亚洲二区视频在线| 国产精品自拍网站| 色婷婷综合久久久久中文| 91精品婷婷国产综合久久性色| 亚洲精品在线观看网站| 一区在线中文字幕| 久久国产欧美日韩精品| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 69久久99精品久久久久婷婷| 久久精品人人做人人综合 | 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品一二三区在线| 欧美综合一区二区三区| 久久久久综合网| 亚洲成人精品在线观看| 成人午夜视频在线| 91精品国产麻豆| 亚洲色图欧洲色图婷婷| 卡一卡二国产精品| 91成人免费在线| 国产日韩欧美高清| 日本最新不卡在线| 一本到不卡免费一区二区| 精品欧美乱码久久久久久| 亚洲欧美电影一区二区| 国产伦理精品不卡| 在线不卡中文字幕播放| 亚洲日本中文字幕区| 国产精品夜夜嗨| 欧美三级电影精品| 亚洲欧美一区二区在线观看| 九九视频精品免费| 777色狠狠一区二区三区| 中文字幕一区二区三中文字幕| 激情六月婷婷久久| 欧美一区二区三区免费大片 | 欧美三级视频在线观看| 国产精品成人网| 国产精品88888| 日韩女优av电影在线观看| 亚洲成人免费视频| 日本久久一区二区三区| 国产精品久久99| 国产白丝精品91爽爽久久| 精品国产第一区二区三区观看体验| 性欧美疯狂xxxxbbbb| 在线观看精品一区| 亚洲欧美区自拍先锋| 91影视在线播放| 亚洲欧美在线视频观看| 成人av免费在线| 国产精品理伦片| 国产成人8x视频一区二区| 精品国产伦一区二区三区免费| 青青草国产成人av片免费| 日韩一区二区中文字幕| 日韩黄色在线观看| 欧美精品自拍偷拍| 午夜精品久久久久久久久久久 | 国产宾馆实践打屁股91| 久久午夜国产精品| 国产中文一区二区三区| 精品国产麻豆免费人成网站| 国产一区美女在线| 久久久久久免费毛片精品| 国内国产精品久久| 国产丝袜在线精品| 国产福利一区二区三区视频在线 | 91福利国产成人精品照片| 曰韩精品一区二区| 欧美视频完全免费看| 日韩精品一级二级| 日韩免费在线观看| 国产麻豆精品久久一二三| 国产日韩三级在线| 99久久国产免费看| 亚洲韩国精品一区| 制服丝袜中文字幕一区| 蓝色福利精品导航| 国产欧美日韩三级| 91麻豆福利精品推荐| 亚洲香肠在线观看| 欧美mv日韩mv国产网站| 国产成人精品一区二区三区四区| 亚洲国产成人自拍| 欧美又粗又大又爽| 日韩电影网1区2区| 国产午夜亚洲精品理论片色戒| 成人黄色片在线观看| 洋洋av久久久久久久一区| 欧美一区日韩一区| 国产尤物一区二区| 亚洲女人小视频在线观看| 欧美日韩精品三区| 国产精品一区在线| 亚洲黄色免费网站| 欧美xxxxx牲另类人与| 成人黄色在线看| 日韩制服丝袜av| 国产欧美中文在线| 欧美丝袜丝交足nylons图片| 男人操女人的视频在线观看欧美 | 视频一区在线播放| 久久一区二区三区国产精品| 99精品视频在线免费观看| 日韩黄色免费网站| 日本一区二区三区高清不卡| 欧美性受极品xxxx喷水| 国产一区二区三区精品欧美日韩一区二区三区 | 五月天中文字幕一区二区| 久久色视频免费观看| 91国产丝袜在线播放| 国产一区欧美日韩| 亚洲va欧美va人人爽| 国产日产精品一区| 在线电影院国产精品| 9久草视频在线视频精品| 久久激情五月婷婷| 一个色综合网站| 国产精品拍天天在线| 日韩欧美成人午夜| 欧美日韩激情一区二区| 成人毛片在线观看| 久久99日本精品|