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

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

?? linux2.6內核下的一個按鍵中斷驅動程序示例 .txt

?? linux2.6內核下的一個按鍵中斷驅動程序示例 
?? TXT
字號:
(原創)linux2.6內核下的一個按鍵中斷驅動程序示例  
[ 2006-11-15 21:33:00 | By: Kision ] 
  
    本程序是基于三星s3c2410ARM平臺下的按鍵驅動例程,程序中兩個按鍵分別占用了ARM芯片上的外部中斷16和17,程序中設定外部中斷為下降沿響應中斷.本程序是在2.6.16內核版本下編譯測試通過,交叉編譯器采用3.4.1版本的arm-linux-gcc.
 
1.驅動程序文件名為button.c,其源碼如下示:
/**********************start*******************************/
#i nclude <linux/config.h>
#i nclude <linux/module.h>
#i nclude <linux/version.h>
#i nclude <linux/kernel.h>
#i nclude <linux/init.h>
#i nclude <linux/fs.h>
#i nclude <asm/hardware.h>
#i nclude <asm/delay.h>
#i nclude <asm/uaccess.h>
#i nclude <asm-arm/arch-s3c2410/regs-gpio.h>

#i nclude <asm/io.h>
#i nclude <asm-arm/arch-s3c2410/irqs.h>
#i nclude <asm-arm/irq.h>
#i nclude <linux/interrupt.h>
#i nclude <linux/wait.h>

#define     BUTTON_IRQ1 IRQ_EINT16
#define     BUTTON_IRQ2 IRQ_EINT17
#define DEVICE_NAME "button"
static int buttonMajor=0;
#define     BUTTONMINOR 0
#define     MAX_BUTTON_BUF  16
    
#define BUTTONSTATUS_1      16
#define BUTTONSTATUS_2      17


static unsigned char buttonRead(void);
static int flag=0;

typedef struct {
    unsigned int buttonStatus;      //按鍵狀態
    unsigned char buf[MAX_BUTTON_BUF]; //按鍵緩沖區
    unsigned int head,tail;         //按鍵緩沖區頭和尾
    wait_queue_head_t wq;           //等待隊列
} BUTTON_DEV;

static BUTTON_DEV buttondev;

#define BUF_HEAD    (buttondev.buf[buttondev.head])     //緩沖區頭
#define BUF_TAIL    (buttondev.buf[buttondev.tail])     //緩沖區尾
#define INCBUF(x,mod)   ((++(x)) & ((mod)-1))       //移動緩沖區指針

static void (*buttonEvent)(void);

static void buttonEvent_dummy(void) {}

static void buttonEvent_1(void)
{
    if(buttondev.buttonStatus==BUTTONSTATUS_2) {
    BUF_HEAD=BUTTONSTATUS_2;
     }
    else {
    BUF_HEAD=BUTTONSTATUS_1;
     }
    buttondev.head=INCBUF(buttondev.head,MAX_BUTTON_BUF);
    flag=1;
    wake_up_interruptible(&(buttondev.wq));
    printk("buttonEvent_1\n");
}

static irqreturn_t isr_button(int irq,void *dev_id,struct pt_regs *regs)
{
    
    printk("Occured key board Inetrrupt,irq=%d\n",irq-44);
    switch (irq) {
    case BUTTON_IRQ1:buttondev.buttonStatus=BUTTONSTATUS_1;
                break;
    case BUTTON_IRQ2:buttondev.buttonStatus=BUTTONSTATUS_2;
                break;
    default:break;
     }
    
    buttonEvent();
    return 0;
}

static int button_open(struct inode *inode,struct file *filp) 
{
    int ret;
    buttondev.head=buttondev.tail=0;
    buttonEvent=buttonEvent_1;  
    ret=request_irq(BUTTON_IRQ1,isr_button,SA_INTERRUPT,DEVICE_NAME,NULL);
    if(ret) {
    printk("BUTTON_IRQ1: could not register interrupt\n");
    return ret;
     }
    ret=request_irq(BUTTON_IRQ2,isr_button,SA_INTERRUPT,DEVICE_NAME,NULL);
    if(ret) {
    printk("BUTTON_IRQ2: could not register interrupt\n");
    return ret;
     }
    return 0;
}

static int button_release(struct inode *inode,struct file *filp)
{
    buttonEvent=buttonEvent_dummy;
    free_irq(BUTTON_IRQ1,NULL);
    free_irq(BUTTON_IRQ2,NULL);
    return 0;
}

static ssize_t button_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
    static unsigned char button_ret;
 retry:
    printk("retry start\n");
    if(buttondev.head!=buttondev.tail) {
    button_ret=buttonRead();
    copy_to_user(buffer,(char *)&button_ret,sizeof(unsigned char));
    printk("the button_ret is 0x%x\n",button_ret);
    return sizeof(unsigned char);
     }
    else {
    if(filp->f_flags & O_NONBLOCK)
        return -EAGAIN;
    printk("sleep\n");
    //interruptible_sleep_on(&(buttondev.wq));//為安全起見,最好不要調用該睡眠函數
    wait_event_interruptible(buttondev.wq,flag);
    flag=0;
    printk("sleep_after\n");
    if(signal_pending(current))
         {
        printk("rturn -ERESTARTSYS\n");
        return -ERESTARTSYS;
          }
    goto retry;
     }

    return sizeof(unsigned char);
}

static struct file_operations button_fops= {
    .owner  =   THIS_MODULE,
    .open   =   button_open,
    .read   =   button_read,
    .release    =   button_release,
};



static int __init s3c2410_button_init(void)
{
    int ret;
    set_irq_type(BUTTON_IRQ1,IRQT_FALLING);
    set_irq_type(BUTTON_IRQ2,IRQT_FALLING);

    buttonEvent=buttonEvent_dummy;
    
    ret=register_chrdev(0,DEVICE_NAME,&button_fops);
    if(ret<0) {
    printk("button: can't get major number\n");
    return ret;
     }
    buttonMajor=ret;
#ifdef  CONFIG_DEVFS_FS
 devfs_mk_cdev(MKDEV(buttonMajor,BUTTONMINOR),S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP,DEVICE_NAME);
#endif
    //buttondev.head=buttondev.tail=0;
    buttondev.buttonStatus=BUTTONSTATUS_1;
    init_waitqueue_head(&(buttondev.wq));
    printk(DEVICE_NAME"initialized\n");
    return 0;
}

static unsigned char buttonRead(void)
{
    unsigned char button_ret;
    button_ret=BUF_TAIL;
    buttondev.tail=INCBUF(buttondev.tail,MAX_BUTTON_BUF);
    return button_ret;
}
    
static void __exit s3c2410_button_eixt(void)
{
 
 #ifdef CONFIG_DEVFS_FS
    devfs_remove(DEVICE_NAME);
    
 #endif
    unregister_chrdev(buttonMajor,DEVICE_NAME);
}

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Kision");
MODULE_DESCRIPTION ("the first char device driver");

module_init(s3c2410_button_init);
module_exit(s3c2410_button_eixt);
/*************************end***************************/   
 
2.  當然在編寫2.6內核驅動程序之前應該已經自己建立好一個2.6的內核源碼樹(我這里是基于s3c2410移植的源碼樹,本處該源碼是放在宿主機的/home/src/linux-2.6.16目錄下的),如果沒有的話,那么需要自己去建立好這個源碼樹.自己編寫的模塊化驅動程序可以不放在內核源碼之內,但是此外還需要一個自己編寫一個Makefile文件(該文件和上面的button.c文件應放在同一個目錄下),其內容如下示:
 
ifneq ($(KERNELRELEASE),)
    obj-m :=button.o
else
    KERNELDIR ?= /home/src/linux-2.6.16
    PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
endif
 
3.在宿主機的終端下,進入驅動程序目錄內,敲入命令:
#make
就會在該目錄下生成button.ko文件,這就是2.6內核下生成的驅動加載模塊,注意是.ko文件,不同于2.4內核下的.o文件.
把該button.ko文件拷貝到目標板上,在minicom終端下進入該文件目錄,敲入:
#insmod button.ko
如果終端顯示有buttoninitialized則表示加載成功.
這時可以用命令lsmod查看動態加載模塊:
#lsmod
當然,可以用如下命令查看devfs文件系統信息:
#cat /proc/devices
如果用卸載該模塊,敲入命令:
#rmmod button
 
4.加載驅動程序后,可以自己再編寫一個簡單的測試程序,如下:
/**************************start***********************/
#i nclude <sys/stat.h>

#i nclude <fcntl.h>

#i nclude <stdio.h>

#i nclude <sys/time.h>

#i nclude <sys/types.h>

#i nclude <unistd.h>
 

 

main()

{

   

   int retval;

   int fileno;

   int ts, maxfd;

   int  ret= 0,i,j;

   int number;

  

   fileno = open("/dev/button",O_RDWR);

       if (fileno == -1) {

               printf("open device led errr!\n");

               return 0;

              }

   while(1) {

   read(fileno,&number,1);
   printf("key=0x%x\n",number);
    }
   

   close(fileno);

   return 0;

 

}
/**************************end***********************/
 
命名為test.c,并交叉編譯該文件:
#arm-linux-gcc test.c -o test
將二進制文件同樣拷貝到目標板上,運行:
#./test &
即可看到實驗效果. 
  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产风韵犹存在线视精品| 欧美精品一级二级三级| 欧美色窝79yyyycom| 26uuu国产日韩综合| 亚洲精品美腿丝袜| 国产综合久久久久久鬼色| 日本精品一区二区三区四区的功能| 日韩亚洲电影在线| 一区二区三区四区精品在线视频 | 国产三级欧美三级| 亚洲国产一区二区a毛片| 国产酒店精品激情| 69堂亚洲精品首页| 亚洲一区二区在线视频| 成人av电影观看| 精品成人免费观看| 日韩和欧美的一区| 欧美日韩一区视频| 亚洲乱码国产乱码精品精可以看| 国产麻豆视频一区| 欧美成人精品3d动漫h| 国产精品网站在线观看| 国产又黄又大久久| 久久99国产精品麻豆| 99热这里都是精品| 中文一区一区三区高中清不卡| 日本特黄久久久高潮| 色老汉一区二区三区| 欧美国产一区二区| 国产传媒久久文化传媒| 精品国产乱码久久久久久图片 | 亚洲国产视频一区| 91一区二区在线| 国产精品美日韩| 国产成人一区在线| 国产欧美日韩在线视频| 国产呦萝稀缺另类资源| 久久综合九色综合97婷婷女人| 国内精品国产成人| 欧美一级艳片视频免费观看| 亚洲在线观看免费视频| 欧美在线观看一二区| 亚洲香蕉伊在人在线观| 欧美影视一区在线| 天堂成人国产精品一区| 欧美一区二区三区小说| 蜜桃视频在线观看一区二区| 日韩亚洲欧美在线| 国产一区二区视频在线播放| 国产欧美日韩综合| 91免费看视频| 五月激情综合婷婷| 日韩欧美一二三四区| 韩国毛片一区二区三区| 欧美国产精品一区二区三区| 99精品视频在线观看免费| 亚洲精品国产成人久久av盗摄 | 亚洲视频小说图片| 欧美视频在线观看一区二区| 日韩在线观看一区二区| 26uuu久久综合| 成人app软件下载大全免费| 一区二区三区在线观看动漫| 欧美裸体bbwbbwbbw| 精品一区二区三区蜜桃| 亚洲欧洲av另类| 欧美高清www午色夜在线视频| 蜜桃av一区二区在线观看| 国产日本欧洲亚洲| 欧美亚洲综合色| 久久福利资源站| 亚洲视频你懂的| 欧美一区二视频| 不卡欧美aaaaa| 日韩av高清在线观看| 久久精品亚洲乱码伦伦中文| 在线免费观看成人短视频| 蜜桃av一区二区在线观看| 亚洲女与黑人做爰| 亚洲精品在线一区二区| 色视频一区二区| 国产精品影视在线| 国产精品白丝jk白祙喷水网站| 综合色天天鬼久久鬼色| 欧美一级二级在线观看| 一本色道久久综合狠狠躁的推荐| 蜜臀av性久久久久蜜臀aⅴ | 国产成人免费视频网站| 亚洲一级二级三级在线免费观看| 久久奇米777| 91精品国产综合久久福利 | 亚洲国产高清在线观看视频| 欧美性一区二区| 不卡av在线网| 激情伊人五月天久久综合| 亚洲成人手机在线| 亚洲欧洲一区二区在线播放| 精品国产乱码久久久久久图片 | 欧美一级欧美三级| 日本韩国精品在线| 高清av一区二区| 国产91在线观看丝袜| 欧美aaaaa成人免费观看视频| 日韩美女啊v在线免费观看| 国产偷国产偷精品高清尤物| 日韩视频在线你懂得| 欧美丝袜丝交足nylons图片| 99久久精品免费看| 成人高清在线视频| 国产精品一区在线观看乱码 | 91久久一区二区| 99re热这里只有精品视频| 国产91精品免费| 国内欧美视频一区二区| 麻豆专区一区二区三区四区五区| 一区二区欧美国产| 一区二区三区四区乱视频| 亚洲色欲色欲www| 亚洲天堂中文字幕| 国产精品国产自产拍在线| 欧美激情在线观看视频免费| 久久久久高清精品| 国产农村妇女毛片精品久久麻豆| 精品国内片67194| 精品国产污网站| 国产亚洲综合性久久久影院| 久久综合成人精品亚洲另类欧美 | 不卡的电视剧免费网站有什么| 国产福利一区在线| 成人精品一区二区三区四区 | 久久精品噜噜噜成人av农村| 日本网站在线观看一区二区三区| 日韩av一区二区三区| 另类成人小视频在线| 久久成人免费网| 国产成人精品1024| 成人免费观看av| 欧美综合一区二区| 777午夜精品视频在线播放| 777奇米四色成人影色区| 欧美不卡在线视频| 中文字幕久久午夜不卡| 亚洲欧美另类在线| 婷婷六月综合网| 狠狠色丁香婷婷综合久久片| 成人小视频在线观看| 色综合一区二区| 欧美一区二区日韩一区二区| 久久人人97超碰com| 亚洲另类一区二区| 毛片av一区二区| 99国内精品久久| 日韩一卡二卡三卡四卡| 国产精品午夜电影| 婷婷国产在线综合| 国产成人午夜高潮毛片| 欧美午夜一区二区| 久久久久久久av麻豆果冻| 一区二区三区欧美| 韩国欧美一区二区| 欧美性受极品xxxx喷水| 久久久久久久综合狠狠综合| 一区二区三区在线观看动漫 | 亚洲一区视频在线| 老司机精品视频线观看86| 97se狠狠狠综合亚洲狠狠| 日韩一级高清毛片| 亚洲免费资源在线播放| 六月丁香婷婷色狠狠久久| 色av综合在线| 久久久五月婷婷| 视频一区二区三区入口| thepron国产精品| 精品国产三级电影在线观看| 亚洲精品五月天| 国产美女精品人人做人人爽| 欧美日精品一区视频| 国产精品日日摸夜夜摸av| 美脚の诱脚舐め脚责91| 色婷婷久久综合| 日本一区二区三区四区| 日本中文一区二区三区| 色综合中文字幕国产| 欧美一区二区三区四区在线观看| 亚洲欧美另类小说视频| 国产高清无密码一区二区三区| 欧美一区二区三区在线观看| 一区二区在线观看不卡| 成人av电影观看| 久久久精品欧美丰满| 极品瑜伽女神91| 日韩一级免费观看| 秋霞午夜av一区二区三区| 在线观看欧美日本| 亚洲精品乱码久久久久久久久 | 国产精品欧美综合在线| 国产一区二区三区免费在线观看| 日韩一级免费观看| 男女激情视频一区| 日韩网站在线看片你懂的|