【OK210试用体验】+第八篇☞(简单的查询方式)按键驱动源代码及深入分析 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】+第八篇☞(简单的查询方式)按键驱动源代码及深入分析

杨永胜 ( 楼主 ) 2015-8-26 10:40:53  只看该作者 倒序浏览
本帖最后由 iysheng 于 2015-8-26 10:53 编辑

由于最近想从红帽转到redora,搞了快两星期了,还是没有成功,最终卡在NFS挂载文件系统(同样的步骤在rhel上面成功了,在fedora上就是没有成功,心累。。。。。)上面,估计有可能是编译器的问题。哎,愁人啊。最终,还是回到了红帽上面,时隔了这么久,今天就简单的从led驱动转到一个按键驱动了,本次实现使用电是最简单的查询方式。深一点的我也不会,尴尬啊,说真的,我真心觉得驱动真的难啊,没有一个清晰的明确的方向,现在就是只能一步步自己从0不断的摸索,有时候真的心累。。。。

废话不说了,今天来一个思维导图吧,这样思路可能会更加清楚一些,可以说本次实现的查询方式按键程序应该是很简单的,几乎没有多余的代码
驱动程序的思维导图


驱动程序的源代码
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include

  7. /*GPH0[3,4,5,6,7]*/
  8. #define KEYCON 0Xe0200c00
  9. #define KEYDAT 0xe0200c04

  10. unsigned int *key_config;
  11. unsigned int *key_dat;

  12. struct cdev keydev;//定义结构体
  13. dev_t devnum;//定义设备号

  14. /*定义open函数*/
  15. int key_open (struct inode *inode, struct file *filp)
  16. {
  17.         key_dat = ioremap(KEYDAT, 4);
  18.         printk(KERN_INFO"welcome to yskeyn");
  19.         return 0;
  20. }

  21. /*定义read函数*/
  22. ssize_t key_read (struct file *filp, char __user *buf, size_t size, loff_t *ppos)
  23. {
  24. //        long flag;
  25.         
  26. //        flag = copy_to_user(buf, key_dat, size);
  27.         *buf = readb(key_dat);
  28.         return 0;
  29. /*        if (flag == 0)
  30.                 return 0;
  31.         else
  32.                 printk(KERN_WARNING"sorry read failedn");
  33.                 return -EFAULT;
  34. */
  35. }
  36. /*声明函数操作集*/
  37. static struct file_operations keyfops = {
  38.         .open = key_open,
  39.         .read = key_read,
  40. };

  41. static int key_init(void)//定义驱动入口函数
  42. {
  43.         cdev_init(&keydev, &keyfops);//联系起来结构体和文件操作集
  44.         alloc_chrdev_region(&devnum, 0, 1, "yskey");//分配空间
  45.         cdev_add(&keydev, devnum, 1);//注册驱动
  46.         return 0;
  47. }

  48. static void key_exit(void)
  49. {
  50.         cdev_del(&keydev);//删除空间
  51.         unregister_chrdev_region(devnum, 1);//取消注册
  52. }

  53. MODULE_LICENSE("GPL");//声明LICENSE,防止安装时出现警告
  54. MODULE_AUTHOR("SIMON YANG");//声明驱动作者

  55. module_init(key_init);//声明驱动入口
  56. module_exit(key_exit);//声明驱动出口
复制代码
用户程序的思维导图



用户程序的源代码
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include

  6. int main()
  7. {
  8.         int fd = 0;
  9.         unsigned char dst = 0;
  10.         unsigned char key_value = 0;
  11.         fd = open("/dev/yskey", O_RDONLY);//义只读方式打开设备
  12.         if (fd == 0xffffffff){
  13.                 printf("open the keydev failed! the errno is %dn",errno);
  14.                 return errno;}

  15. while(1)
  16. {
  17.         do{
  18.         read(fd, &dst, 1);
  19.         dst &= 0x0f8;
  20.         }while(dst == 0xf8);//第一次读取键值
  21.         
  22.         key_value = dst;//备份键值
  23.         
  24.         do{
  25.         read(fd, &dst, 1);
  26.         dst &= 0x0f8;
  27.         }while(dst == key_value);//第二次读取键值,并和第一次的比较
  28.         
  29.         printf("The KEY value is 0X%Xn",key_value);//输出键值
  30. }        
  31.         return 0;
  32. }
复制代码
通过两次读取键值并比较可以避免出现无意义的输出,如下图所示:



最后,通过一个shell脚本,安装驱动(启动247时主设备号大家的和我的不一定是相同的,0是表示第一个从设备,从0开始编号的)
  1. #!/bin/sh
  2. insmod keydev.ko

  3. mknod /dev/yskey c 247 0
复制代码
编译用户程序:

  1. arm-linux-gcc -static -o keyr keyr.c
复制代码
切记,要用静态编译(-static)
运行效果如下图所示(查询方式实现效果):


如上图所示:对于5个按键,根据不同的按键情况,对应输出不同的键值。本次查询方式按键驱动完成。加油啊!


2个回复

小萃米 发表于 2015-8-26 18:22:16
楼主加油,工程师都是这样的
杨永胜 发表于 2015-8-27 08:33:53
小萃米 发表于 2015-8-26 18:22
楼主加油,工程师都是这样的

嗯,谢谢你的支持。
您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-12-22 10:54 , Processed in 0.426186 second(s), Total 36, Slave 26 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表