免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 899 | 回复: 0
打印 上一主题 下一主题

9261EK按键的驱动及测试 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-30 09:51 |只看该作者 |倒序浏览

9261EK上一个按键的驱动及测试
1、在内核目录中driver/char/下面建立一个新的.c文件:keydriver.c,修改当前目录中的Makefile文件,加入:
obj-m                           += keydriver.o
2、在内核目录下make modules 既可在driver/char/下生成keydriver.ko,将其下载到开发板的lib/modules/2.6.24下。
3、在任意目录下建立keytest.c文件,并且交叉编译生成二进制文件,如:root@dc-desktop:/home/dc/arm/linux-2.6.24/drivers/char# arm-none-linux-gnueabi-gcc -o keytest keytest.c 将keytest下载到开发板上,利用chmod +x keytest修改权限,然后运行既可。
     此驱动及测试函数完成了对9261-EK上的一个按键中断方式的驱动,此按键接在PA27脚上,运行keytest之后按下按键终端即会显示出按键被按下的次数,次数大于10之后退出程序。
按键驱动程序如下:
#include
#include
#include
#include
#include
#include   /* get the user-level API */
#include
#include
#include
#include
#include
#include
#include
#define ATUO_CLEAR_WATCHDOG       0
#define CLEAR_TIMER   100
#define DEBUG         0
#define USE_HEADER    0
#if DEBUG
    #define printf(fmt, args...)  printk(fmt, ## args)
#else
    #define printf(fmt, args...)
#endif
#define kirq_irq    3
MODULE_LICENSE("GPL");
static int KEY_IRQ = 0x00;
static int kirq_dev;
irqreturn_t kirq_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
    int value;
   mdelay(10);//防抖
value=at91_get_gpio_value(AT91_PIN_PA27);//读取IO的值
   if(!value)
    {
    KEY_IRQ++;
    printk("KEY_IRQY:%d\r\n",KEY_IRQ);
    while(!value)   //防死按
    value=at91_get_gpio_value(AT91_PIN_PA27);
}
    return 0;
   
}
size_t kirq_read (struct file *filp, char __user *buf, size_t count, loff_t *pos)
{
     put_user(KEY_IRQ,(int *)buf);
     return 0;
}
static struct file_operations kirq_fops = {
     .owner = THIS_MODULE,
     .read  = kirq_read,
};
static int __init kirq_init(void){
      int result;
      printk(KERN_ALERT "kirq_test:%s,%s\r\n",__DATE__,__TIME__);
      result = register_chrdev(64, "kirq", &kirq_fops);
      if (result
测试程序如下:
#include  
#include  
#include  
#include  
#include  
#include  
#include  
int dev;
int main(void){
    int j,temp=0;
    int interr_times=0;
    printf("test keydacong.\r\n");   
    system("rmmod keydacong");
    system("insmod keydacong");
    dev = open("/dev/kirq",O_RDWR);
    if(dev == -1){
         printf("cann't open kirq \n");
         return 0;
    }
    while(1)
    {
    read(dev,&interr_times,sizeof(int));
if(interr_times!=temp)
{
    printf("interrupt times:%d\r\n",interr_times);
}
temp=interr_times;
    if(interr_times >9)
    {
     close(dev);
     system("rmmod keydacong");
     break;
    }
    }
}




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/84904/showart_1914846.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP