Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152397
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 908
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-03 11:03
个人简介

学习linux

文章分类
文章存档

2014年(7)

2013年(33)

我的朋友

分类: 嵌入式

2014-03-29 23:44:57

用linux的input架构

先产生一个input设备并注册,再用platform_device的/sys当做程序入口

最后用一个用户程序利用随机数产生相对坐标,写入入口


驱动:

点击(此处)折叠或打开

  1. #include <linux/module.h>
  2. #include <linux/platform_device.h>

  3. #include <linux/input.h>




  4. struct platform_device *vms_dev;

  5. struct input_dev *vms_input_dev;

  6. static ssize_t write_vms(struct device *dev,struct device_attribute *attr,
  7.     const char *buffer,size_t count)
  8. {
  9.     int x,y;
  10.     sscanf(buffer,"%d%d",&x,&y);

  11.     input_report_rel(vms_input_dev,REL_X,x);
  12.     input_report_rel(vms_input_dev,REL_Y,y);
  13.     input_sync(vms_input_dev);

  14.     return count;
  15. }

  16. DEVICE_ATTR(coordinates,0644,NULL,write_vms);

  17. static struct attribute *vms_attrs[] = {
  18.     &dev_attr_coordinates.attr,
  19.     NULL,
  20. };

  21. static struct attribute_group vms_attr_group = {
  22.     .attrs = vms_attrs,
  23. };

  24. static int __init vms_init(void)
  25. {    

  26.     vms_input_dev = input_allocate_device();
  27.     set_bit(EV_REL,vms_input_dev->evbit);
  28.     set_bit(REL_X,vms_input_dev->relbit);
  29.     set_bit(REL_Y,vms_input_dev->relbit);

  30.     input_register_device(vms_input_dev);

  31.     printk("input_register_device ok\n");

  32. //use cdev or platform as hardware ISR input
  33.     vms_dev = platform_device_register_simple("vms",-1,NULL,0);
  34.     
  35.     sysfs_create_group(&vms_dev->dev.kobj,&vms_attr_group);
  36.     
  37.     
  38.     return 0;
  39. }

  40. static void __exit vms_exit(void)
  41. {
  42.     input_unregister_device(vms_input_dev);

  43.     printk("input_unregister_device ok\n");

  44.     sysfs_remove_group(&vms_dev->dev.kobj,&vms_attr_group);

  45.     platform_device_unregister(vms_dev);
  46. }


  47. module_init(vms_init);
  48. module_exit(vms_exit);

  49. MODULE_LICENSE("GPL");
  50. MODULE_AUTHOR("archer");
用户虚拟坐标程序:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <fcntl.h>




  4. int main(int argc,char *argv[])
  5. {
  6.     int sim_fd;

  7.     int x,y;
  8.     char buffer[10];

  9.     sim_fd = open("/sys/devices/platform/vms/coordinates",O_RDWR);
  10.     if(sim_fd < 0) {
  11.         printf("open fail\n");
  12.         return -1;
  13.     }

  14.     while(1) {
  15.         x = random()%20;
  16.         y = random()%20;

  17.         if(x % 2)
  18.             x = -x;
  19.         if(y % 2)
  20.             y = -y;

  21.     sprintf(buffer,"%d %d %d",x,y,0);
  22.     
  23.     write(sim_fd,buffer,strlen(buffer));
  24.     fsync(sim_fd);

  25.     sleep(1);
  26.     }

  27.     close(sim_fd);
  28. }

最后用一个  helper工具读取evdev事件包就可以了


gpm -m /dev/input/eventX -t evdev




阅读(2552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~