在本文中,我们对S3C6410开发板按键驱动代码的实现过程进行分析,然后通过一个实例对按键功能进行测试。在本文的资源中包含了设备驱动的源码和测试的源码。

一、设备驱动源码分析

按键的设备驱动主要实现了模块的初始化、模块的卸载、设备打开、设备关闭、设备读取、设备阻塞功能。

1、模块初始化

模块的初始化的源码如下所示。

static int __init dev_init(void)
{int ret;ret = misc_register(&misc);printk (DEVICE_NAME"\tinitialized\n");return ret;
}

这段代码只实现了一个功能,就是使用misc_register()函数向内核注册按键的混杂设备。

2、模块卸载

模块卸载的代码比较简单,如下所示。

static void __exit dev_exit(void)
{misc_deregister(&misc);
}

模块卸载代码实现的功能是将按键的混杂设备从内核中取消注册。

3、设备打开

设备打开代码主要实现了按键对应的GPIO接口的初始化。

static int s3c64xx_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;
}

在这段代码中,使用request_irq()函数用来初始化GPIO接口,主要是开启了GPIO接口的输入中断功能,将中断号与中断处理函数、中断描述结构体绑定在一起。其中,button_irqs[i].irq是中断号,buttons_interrupt是中断处理函数,(void *)&button_irqs[i]是指向中断描述结构体的指针,函数还将中断的模式设置为双边沿触发。当按下或松开按键时,会产生下降沿或上升沿,就会触发中断,中断会把相应的中断描述结构体保持下来,并转到buttons_interrupt函数去处理中断。

buttons_interrupt()函数的源码如下所示。

static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;int down;int number;unsigned tmp;udelay(0);number = button_irqs->number;switch(number) {case 0: case 1: case 2: case 3: case 4: case 5:tmp = readl(S3C64XX_GPNDAT);down = !(tmp & (1<<number));break;case 6: case 7:tmp = readl(S3C64XX_GPLDAT);down = !(tmp & (1 << (number + 5)));break;default:down = 0;}if (down != (key_values[number] & 1)) {key_values[number] = '0' + down;ev_press = 1;wake_up_interruptible(&button_waitq);}return IRQ_RETVAL(IRQ_HANDLED);
}

中断处理函数的重要输入是中断描述结构体dev_id,结构体内部包含了,中断号、按键编号、以及按键名。程序根据按键编号对GPIO数据寄存器的值进行读取,从而判断外部输入电平的状态,并将按键状态保存到key_values[ ]数组中,‘1’代表按键按下,‘0’代表按键没有按下。当按键状态有变化时,程序调用wake_up_interruptible(&button_waitq);将阻塞的内核排队队列唤醒。

4、设备关闭

设备关闭代码如下所示

static int s3c64xx_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;
}

功能比较简单,主要是将按键的中断功能禁止。

5、设备读取

设备的读取代码主要是读取8个按键的状态,代码如下。

static int s3c64xx_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;elsewait_event_interruptible(button_waitq, ev_press);}ev_press = 0;err = copy_to_user((void *)buff, (const void *)(&key_values), min(sizeof(key_values), count));return err ? -EFAULT : min(sizeof(key_values), count);
}

代码实现的功能是将设备状态数组key_values[ ]回传到用户程序的buf中。

6、设备阻塞

设备阻塞函数是用来相应用户空间的select()系统调用函数的,代码如下

static unsigned int s3c64xx_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;
}

阻塞函数功能比较简单,是在没有按键按下或松开时将程序阻塞,当有按键按下或松开时退出阻塞状态。

二、测试代码分析

编写了一个简单的测试代码对按键的驱动进行测试,代码如下。

int main()
{int fd_led,fd_key;fd_set read_set;int max_fd;struct timeval timeout;int ret;char buf[8];fd_led = open("/dev/leds",0);fd_key = open("/dev/buttons",O_RDONLY);if(fd_led<0||fd_key<0){fprintf(stderr,"can't open leds or buttons!\n");return 1;}while(1){//清零描述符集合     FD_ZERO(&read_set); FD_SET(fd_key,&read_set);max_fd = fd_key;//设置超时时间timeout.tv_sec=3;timeout.tv_usec=0;ret = select(max_fd+1, &read_set, 0, 0, &timeout);if(ret>0){read(fd_key,buf,8);if(buf[0]=='1'){ioctl(fd_led,1,0);}else{ioctl(fd_led,0,0);}if(buf[1]=='1'){ioctl(fd_led,1,1);}else{ioctl(fd_led,0,1);}if(buf[2]=='1'){ioctl(fd_led,1,2);}else{ioctl(fd_led,0,2);}if(buf[3]=='1'){ioctl(fd_led,1,3);}else{ioctl(fd_led,0,3);}}        }close(fd_key);close(fd_led);return 0;
}

在这个代码中,通过select()函数将程序阻塞,等待按键的状态变化。当按键状态有变化时,读取按键状态,并根据按键状态对LED灯进行控制。当按键按下时,将相应的LED灯点亮;松开按键时,将相应的LED灯熄灭。

S3C6410开发板按键驱动代码分析及测试代码分析相关推荐

  1. S3C6410开发板adc驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板adc驱动代码的实现过程进行分析,然后通过一个实例对adc功能进行测试.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 adc的设备驱动主要 ...

  2. S3C6410开发板LED驱动代码分析及测试代码分析

    在本文中,我们对S3C6410开发板LED驱动代码的实现过程进行分析,然后通过一个实例对LED进行控制.在本文的资源中包含了设备驱动的源码和测试的源码. 一.设备驱动源码分析 设备驱动主要实现了模块的 ...

  3. 飞凌 ok6410 按键驱动源码及测试代码

    2019独角兽企业重金招聘Python工程师标准>>> 由于OK6410的GPIO按键中断已经被飞凌自带的按键驱动注册,所以运行我们编写的按键驱动前要先去掉飞凌自带的按键驱动,方法: ...

  4. 中国嵌入式高端ARM开发板的江湖故事——详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局

    // Topic:中国嵌入式高端ARM开发板的江湖故事--详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局 //作者:gooogleman //版权:gooogleman  邮箱 ...

  5. 中国嵌入式高端ARM开发板的江湖故事 详细分析国内各家ARM11 S3C6410 开发板的选型以及竞争格局

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! // T ...

  6. 龙芯智龙开发板:驱动步进电机实战入门

    本文面向初学者,请多各位高手包涵.我在此特别致谢勤为本先生为我提供的帮助. 步进电机 步进电机就是一种受脉冲控制的电机,步进电机接收到一系列某种调制顺序的脉冲,做出相应的反应,转到相应的角度或者相应的 ...

  7. RK系列开发板音频驱动适配指南(一)

    背景: 多媒体系统目前在Linux操作系统,windows操作系统已经非常成熟,并且应用场景广泛,但是,基于OpenAtom OpenHarmony(以下简称"OpenHarmony&quo ...

  8. arm11 s3c6410 开发板比较 哪个公司的arm11开发板好? arm11开发板推荐

    代理arm11开发板已经几个月了,说下我自己的看法. 我首先用语言描述一下国内主流的arm开发板情况,个人对各个公司开发板的看法,仅代表个人意见,没有针对某个公司的意思,由于6410 的开发难度以及工 ...

  9. arm11 s3c6410 开发板 学习板 工业开发板 比较 国内主流的arm开发板比较

    代理arm11开发板已经几个月了,说下我自己的看法. 我首先用语言描述一下国内主流的arm开发板情况,个人对各个公司开发板的看法,仅代表个人意见,没有针对某个公司的意思,由于6410 的开发难度以及工 ...

最新文章

  1. Cell子刊:MRI有助于揭示睡眠之谜
  2. linux存储--共享内存机制shm(十四)
  3. Python编程基础:第三十五节 文件删除Delete a File
  4. 利用WINDOWS活动目录提供LDAP的方案
  5. 商海致富独家秘诀:微笑可以当钱花
  6. Python装饰器(二)
  7. 华为交换机eth口作用_华为S5700交换机如何配置ETH-交换机怎么设置
  8. B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?
  9. Palindrome DP
  10. 英雄联盟壁纸,你可以喜欢?
  11. Java中对查出的数据计数_基础算法7:从数据库某个字段中取出现次数最多的几条数据形成“热门xxx”...
  12. Javascript算法:非固定宽度滑动窗口算法
  13. SQL Server 2014,表变量上的非聚集索引
  14. 智能性与实用性兼具,华为开启智能眼镜全民时代
  15. Ubuntu_搜狗输入法安装
  16. gitlab-runner错误之:New runner. Has not connected yet(runner注册成功到了gitlab,但是前面的图标是灰色三角形)
  17. 大数据和java就业前景_Java大数据应用领域及就业方向
  18. 影石创新在科创板递交招股书注册稿,共有492件专利申请信息
  19. Ubuntu 安装Sougou Pinyin输入法
  20. TIOBE 9 月编程语言排行榜:Python 直逼第一,仅差 0.16%!

热门文章

  1. 爱奇艺Q1营收83亿:日均会员数1.29亿 运营利润六个季度连增
  2. 5.2-手眼标定(外参标定)
  3. xUnit测试项目使用笔记
  4. Ubuntu 打开mysql 操作日志
  5. Linux 测试 IO 性能(磁盘读写速度)
  6. OSN博士必须掌握的必杀技(更新至2017/12/15)
  7. 《阿里巴巴 Android 开发手册》(三)
  8. 如何成为福建省政府采购网供应商?
  9. Linux服务器时间慢了怎么改,如何修改linux服务器时间
  10. 配置mod_proxy_fcgi加php fpm