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

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

?? misc_button.c

?? MP3播放器項目
?? C
字號:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/poll.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/miscdevice.h>

#define DEVICE_NAME         "button"    //設備名稱
               
#define KEY_TIMER_DELAY1    (HZ/50)             //按鍵按下去抖延時20毫秒        
#define KEY_TIMER_DELAY2    (HZ/10)             //按鍵抬起去抖延時100毫秒
#define KEY_DOWN            0                   //按鍵按下                    
#define KEY_UP              1                   //按鍵抬起                
#define KEY_UNCERTAIN       2                   //按鍵不確定    

#define KEY_COUNT           6                   //6個按鍵                    

static volatile int ev_press = 0;                //按鍵按下產生標志
static volatile int key_status[KEY_COUNT];       //記錄6個按鍵的狀態    
static struct timer_list key_timers[KEY_COUNT];  //定義6個按鍵去抖動定時器
static DECLARE_WAIT_QUEUE_HEAD(button_waitq);    //定義并初始化等待隊列

//組織硬件資源結構體
struct button_irq_desc    
{
    int irq;            //中斷號
    int pin;            //引腳
    int pin_setting;    //引腳配置
    char *name;         //按鍵名稱,注意這個名稱,在后面的一個現象中會出現
};

//定義6個按鍵資源結構體數組
static struct button_irq_desc button_irqs[] =
 {
    {IRQ_EINT8 , S3C2410_GPG0 , S3C2410_GPG0_EINT8 , "KEY0"},
    {IRQ_EINT11, S3C2410_GPG3 , S3C2410_GPG3_EINT11 , "KEY1"},
    {IRQ_EINT13, S3C2410_GPG5 , S3C2410_GPG5_EINT13 , "KEY2"},
    {IRQ_EINT14, S3C2410_GPG6 , S3C2410_GPG6_EINT14 , "KEY3"},
    {IRQ_EINT15, S3C2410_GPG7 , S3C2410_GPG7_EINT15 , "KEY4"},
    {IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG11_EINT19, "KEY5"},
};

static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{
 //獲取當前按鍵資源的索引
    int key = (int)dev_id;

    if(key_status[key] == KEY_UP)
    {
        //設置當前按鍵的狀態為不確定
        key_status[key] = KEY_UNCERTAIN;

        //設置當前按鍵按下去抖定時器的延時并啟動定時器
        key_timers[key].expires = jiffies + KEY_TIMER_DELAY1;
        add_timer(&key_timers[key]);
    }

    return IRQ_RETVAL(IRQ_HANDLED);
}

static void buttons_timer(unsigned long arg)
{
    //獲取當前按鍵資源的索引
    int key = arg;

    //獲取當前按鍵引腳上的電平值來判斷按鍵是按下還是抬起
    int up = s3c2410_gpio_getpin(button_irqs[key].pin);

    if(!up)//低電平,按鍵按下
    {
        if(key_status[key] == KEY_UNCERTAIN)
        {
            //標識當前按鍵狀態為按下
			key_status[key] = KEY_DOWN;

            //標識當前按鍵已按下并喚醒等待隊列
            ev_press = 1;
            wake_up_interruptible(&button_waitq);
        }

        //設置當前按鍵抬起去抖定時器的延時并啟動定時器
        key_timers[key].expires = jiffies + KEY_TIMER_DELAY2;
        add_timer(&key_timers[key]);
    }
    else//高電平,按鍵抬起
    {
        //標識當前按鍵狀態為抬起
        key_status[key] = KEY_UP;
    }
}

static int buttons_open(struct inode *inode, struct file *file)
{
    int i;
    int ret;

    for(i = 0; i < KEY_COUNT; i++)
    {
        //設置6個IO口為中斷觸發方式
        s3c2410_gpio_cfgpin(button_irqs[i].pin, button_irqs[i].pin_setting);

        //設置中斷下降沿為有效觸發
	 set_irq_type(button_irqs[i].irq, IRQ_TYPE_EDGE_FALLING);
        
        //申請中斷(類型為快速中斷,中斷服務時屏蔽所有外部中斷?)
        ret = request_irq(button_irqs[i].irq, buttons_interrupt, IRQF_DISABLED, button_irqs[i].name, (void *)i);

        if(ret)
        {
            break;
        }

        //初始化6個按鍵的狀態為抬起
        key_status[i] = KEY_UP;

        //初始化并設置6個去抖定時器
        setup_timer(&key_timers[i], buttons_timer, i);
    }

    if(ret)
    {
        //中斷申請失敗處理
        i--;

        for(; i >= 0; i--)
        {
            //釋放已注冊成功的中斷
            disable_irq(button_irqs[i].irq);
            free_irq(button_irqs[i].irq, (void *)i);
        }

        return -EBUSY;
    }

    return 0;
}

static int buttons_close(struct inode *inode, struct file *file)
{
    int i;

    //釋放6個定時器和中斷
    for(i = 0; i < KEY_COUNT; i++)
    {
        del_timer(&key_timers[i]);

        disable_irq(button_irqs[i].irq);
        free_irq(button_irqs[i].irq, (void *)i);
    }

    return 0;
}

static int buttons_read(struct file *file, char __user *buf, size_t count, loff_t *offp)
{
    unsigned long ret;

    if(!ev_press)//判斷按鍵按下產生標識,0沒有產生
  {
        if(file->f_flags & O_NONBLOCK)
        {
            //應用程序若采用非阻塞方式讀取則返回錯誤
            return -EAGAIN;
        }
        else
        {
            //以阻塞方式讀取且按鍵按下沒有產生,讓等待隊列進入睡眠
            wait_event_interruptible(button_waitq, ev_press);
        }
    }

    //1為按鍵按下產生,并清除標識為0,準備給下一次判斷用
    ev_press = 0;

    //將內核中的按鍵狀態數據拷貝到用戶空間給應用程序使用
    ret = copy_to_user(buf, (void *)key_status, min(sizeof(key_status), count));

    return ret ? -EFAULT : min(sizeof(key_status), count);
}

//驅動程序中的輪詢,用于應用程序中的輪詢查詢是否可對設備進行訪問
static int buttons_poll(struct file *file, struct poll_table_struct *wait)
{
    unsigned int mask = 0;

    //添加等待隊列到等待隊列表中(poll_table)
 poll_wait(file, &button_waitq, wait);

    if(ev_press)
    {
        //標識數據可以獲得
        mask |= POLLIN | POLLRDNORM;
    }

    return mask;
}

//設備操作列表
static struct file_operations buttons_fops =
 {
    .owner        = THIS_MODULE,
    .open         = buttons_open,
    .release      = buttons_close,
    .read         = buttons_read,
    .poll         = buttons_poll,
};

static struct miscdevice misc = {
	.minor = MISC_DYNAMIC_MINOR,
	.name = DEVICE_NAME,
	.fops = &buttons_fops,
};

static int __init button_init(void)
{
    int ret;
    //注冊字符設備
    ret = misc_register(&misc);

    if(ret < 0)
  {
        printk(DEVICE_NAME " register faild!\n");
        return ret;
    }

    return 0;
}

static void __exit button_exit(void)
{
    //注銷字符設備
   misc_deregister(&misc);
}

module_init(button_init);
module_exit(button_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Savager Lee");
MODULE_DESCRIPTION("mini2440 button driver");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
voyeur盗摄精品| av在线一区二区三区| 一区二区在线观看视频在线观看| 日韩欧美一级二级| 欧美日韩一区视频| 91丨porny丨首页| 成人黄色综合网站| gogo大胆日本视频一区| 波多野结衣欧美| 91免费视频网址| 欧美日韩的一区二区| 欧美色倩网站大全免费| 欧美一区二区三区电影| 久久久久久97三级| 国产精品久久久久桃色tv| 中文字幕一区三区| 一区二区三区中文字幕精品精品| 欧美性受xxxx黑人xyx性爽| 91国产免费观看| 欧美一区二区三区在线| 精品国产在天天线2019| 日本一区二区三区在线不卡| 亚洲欧美国产高清| 亚洲永久精品国产| 日本女优在线视频一区二区| 国产寡妇亲子伦一区二区| 97精品超碰一区二区三区| 欧美日韩中文精品| 欧美精品一区二| 亚洲欧美日韩久久精品| 久久丁香综合五月国产三级网站 | 欧美视频一区在线| 欧洲中文字幕精品| 欧美成人女星排行榜| 中文字幕一区在线观看| 热久久久久久久| av一区二区不卡| 欧美一区二区精品在线| 国产精品美女久久福利网站| 亚洲国产精品一区二区www在线 | 久久国产精品99精品国产| 国产毛片一区二区| 色狠狠色狠狠综合| 国产香蕉久久精品综合网| 亚洲香肠在线观看| 成人高清视频免费观看| 日韩午夜激情视频| 亚洲精品精品亚洲| 国产精品18久久久久久久久久久久| 日本不卡一区二区三区高清视频| 日韩伦理免费电影| 极品少妇xxxx精品少妇| 91免费国产视频网站| 亚洲精品一区二区三区影院| 一区二区三区国产精品| 国产精品一级二级三级| 日韩一区二区在线看| 一区二区三区成人| 成人avav影音| 国产精品久久久久一区| 国产jizzjizz一区二区| 欧美电影免费观看高清完整版在| 91精品黄色片免费大全| 亚洲精品中文字幕乱码三区| 成人午夜精品在线| 久久色中文字幕| 激情综合色播五月| 91麻豆精品国产91久久久资源速度 | 99久久综合色| 国产欧美日韩综合| 精品在线播放午夜| 欧美电影免费观看高清完整版 | 福利视频网站一区二区三区| 日韩视频永久免费| 日本成人在线网站| 色婷婷综合视频在线观看| 中文字幕在线一区| 成人精品视频一区二区三区尤物| 国产成人精品免费在线| 久久精品一区四区| 国产一区不卡视频| 久久精品一区蜜桃臀影院| 国产成人精品一区二区三区四区 | 亚洲综合在线五月| 一本久久a久久精品亚洲| 亚洲欧美日韩在线播放| 欧美日韩一区久久| 美女国产一区二区三区| 日韩欧美亚洲另类制服综合在线| 26uuu国产电影一区二区| 国产综合久久久久久鬼色| 精品福利一二区| 成人av在线一区二区| 亚洲欧美电影一区二区| 在线观看av一区二区| 日韩精品电影在线观看| 久久久久亚洲蜜桃| thepron国产精品| 五月婷婷久久丁香| 26uuu精品一区二区三区四区在线| 亚洲愉拍自拍另类高清精品| 制服丝袜av成人在线看| 日韩成人精品视频| 国产三级久久久| 欧美午夜在线观看| 国产精品系列在线观看| 亚洲一区欧美一区| 久久蜜桃av一区二区天堂| 色av综合在线| 激情文学综合网| 一区二区激情小说| 日韩精品一区国产麻豆| 99久久精品国产精品久久| 首页亚洲欧美制服丝腿| 国产精品女同一区二区三区| 欧美日韩精品欧美日韩精品 | 五月激情综合网| 欧美成人免费网站| 欧美亚洲动漫精品| 国产成人精品亚洲日本在线桃色| 久久亚洲精华国产精华液| 色综合色综合色综合色综合色综合 | 欧美激情综合网| 欧美电影在哪看比较好| 波多野结衣在线一区| 九九**精品视频免费播放| 国产欧美一区二区在线| 欧美剧情电影在线观看完整版免费励志电影| 最新日韩在线视频| 欧美一二三四在线| 欧美亚洲综合色| 成人美女在线观看| 国产精品一级二级三级| 麻豆精品一二三| 日本sm残虐另类| 亚洲一区在线播放| 日韩伦理av电影| 国产精品色在线| 国产欧美日韩视频在线观看| 欧美一区在线视频| 欧美三级电影在线看| 日本国产一区二区| 91免费看`日韩一区二区| 不卡欧美aaaaa| gogo大胆日本视频一区| eeuss国产一区二区三区| 国产精品一区二区三区四区| 极品销魂美女一区二区三区| 精品系列免费在线观看| 久久国产尿小便嘘嘘尿| 免费成人在线观看| 久久精品国产99| 久久精品999| 九九久久精品视频| 国产精品亚洲午夜一区二区三区| 成人免费一区二区三区在线观看| 99久久精品免费看国产| 99re视频精品| 色8久久精品久久久久久蜜| 欧美无砖专区一中文字| 在线中文字幕一区| 在线中文字幕不卡| 在线成人av网站| 欧美一级欧美三级在线观看| 日韩免费观看2025年上映的电影| 成人激情电影免费在线观看| 波多野洁衣一区| 成人免费视频一区| 91福利精品视频| 欧美精品日韩一本| 26uuu亚洲| 亚洲欧美日韩国产另类专区| 亚洲大片免费看| 久久99精品国产.久久久久久| 尤物在线观看一区| 日本午夜精品视频在线观看| 日韩av一区二区三区四区| 久久国产综合精品| 91污在线观看| 日韩视频在线你懂得| 国产精品国产三级国产普通话蜜臀| 56国语精品自产拍在线观看| 91精品欧美一区二区三区综合在| a在线播放不卡| 在线影视一区二区三区| 精品美女被调教视频大全网站| 91久久精品日日躁夜夜躁欧美| 精品一区二区免费| 91啪九色porn原创视频在线观看| 老司机免费视频一区二区| 韩国精品主播一区二区在线观看 | 久久综合一区二区| 国产午夜亚洲精品午夜鲁丝片| 欧美日韩国产小视频在线观看| 成人精品高清在线| 欧美精品自拍偷拍| 国产精品久久看| 久久爱www久久做| 91在线云播放| 日本一区二区三区久久久久久久久不 |