发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
[作品] 【IMX6UL开发板试用体验】- 项目实战 前篇 平台总写 & 输入子系统
2017-2-27 06:24:13  3887
分享
本帖最后由 290005999 于 2017-2-27 12:33 编辑

1. 本次实验的项目会用到platform 平台总线以及input输入子系统

2.什么是paltform总线
一个现实的linux设备和驱动通常都需要挂接在一种总线上,比较常见的总线有USB、PCI总线等。但是,在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设却不依附与此类总线。基于这样的背景下,2.6内核加入了platform虚拟总线。platform机制将设备本身的资源注册进内核,有内核统一管理,在驱动程序使用这些资源时使用统一的接口,这样提高了程序的可移植性。

3.什么是input子系统
Input驱动程序是linux输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse和mice)、事件设备(event)。其中事件驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏等多种输入设备。

----------------------------------------------------------------------

本次实战的过程,platform _driver 与 platform_device 的probe 过程,并通过App 模拟鼠标的位置(一个random函数,模拟鼠标x , y,并应该直接从鼠标传递,不过在项目实战前篇的开门篇 不想增加过多的难度,所以仅作为模拟)传输到驱动中,并上报了input 核心层给应用层采集信息。

platform_device


  1. /*
  2. * platform_device.c
  3. *      Author: chenpeng
  4. */

  5. #include <linux/module.h>
  6. #include <linux/init.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/mm.h>
  9. #include <linux/slab.h>


  10. #define GPIO_TO_PIN(bank, gpio) (((bank)*32) + (gpio))

  11. static struct resource mouse_analog_source[] = {
  12.                 [0] = {
  13.                         .flags = IORESOURCE_IRQ,
  14.                         .start = GPIO_TO_PIN(1, 27),
  15.                         .end = GPIO_TO_PIN(1, 27),
  16.                 },
  17. };



  18. static struct platform_device mouse_analog_dev = {
  19.                 .name = "irq_control",
  20.                 .id = -1,
  21.                 .num_resources = ARRAY_SIZE(mouse_analog_source),
  22.                 .resource = &mouse_analog_source,
  23. };


  24. static int __init platform_device_init(void)
  25. {
  26.         return platform_device_register(&mouse_analog_dev);
  27. }

  28. static void __exit platform_device_exit(void)
  29. {
  30.          platform_device_unregister(&mouse_analog_dev);
  31. }

  32. module_init(platform_device_init);
  33. module_exit(platform_device_exit);

  34. MODULE_LICENSE("GPL");




复制代码



再看platform_driver :
  1. /*
  2. * platform_driver.c
  3. *      Author: chenpeng
  4. */

  5. #include <linux/fs.h>
  6. #include <linux/input.h>
  7. #include <linux/cdev.h>
  8. #include <linux/device.h>
  9. #include <linux/module.h>
  10. #include <linux/init.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/gpio.h>
  13. #include <linux/errno.h>
  14. #include <asm/uaccess.h>
  15. #include <linux/irq.h>
  16. #include <linux/interrupt.h>
  17. #include <linux/input.h>
  18. //#include <asm/bitops.h>

  19. #define debug 1

  20. #IFdef debug
  21. #define DEBUG(...) printk(KERN_INFO #__VA_ARGS__) //printk()
  22. #else
  23. #define DEBUG(...) do{} while(0)
  24. #endif

  25. static unsigned int gpio_num;
  26. static unsigned int devno;
  27. static struct cdev cdev;
  28. static struct class *platform_class;
  29. int kbuf[20];
  30. static int irq;
  31. static struct platform_device *myinput_platform;

  32. static struct input_dev *myinput;


  33. /*
  34. *
  35. */
  36. ----------------以下是我写input的函数,2017-02-22------------------------------------
  37. ssize_t mouse_analog_write(struct file *filp, const char __user *ubuf, size_t count, unsigned long *ppos)
  38. {
  39.         int x = 0;
  40.         int y = 0;
  41.         sscanf(ubuf, "%d%d", &x,&y);
  42.         printk("x = %d, y = %d \n", x, y);

  43.         input_report_key(myinput, REL_X, x);
  44.         input_report_key(myinput, REL_Y, y);
  45.         input_sync(myinput);

  46.         return count;
  47. }
  48. static struct file_operations fops = {
  49.                 .owner = THIS_MODULE,
  50.                 .write = mouse_analog_write,
  51. };
  52.      

  53. static int mouse_analog_probe(struct platform_device *pdev)
  54. {
  55.         int ret = -1;

  56.         DEBUG("mouse_analog_probe is running\n");

  57.         struct resource *mouse_analog = platform_get_resource(pdev,        IORESOURCE_IRQ, 0);
  58.         gpio_num = mouse_analog->start;
  59.         printk("--------------------------------------gpio_num = %d -------------------------------\n", gpio_num);
  60.         ret = alloc_chrdev_region(&devno, 0, 1, "mouse_analog_platform");
  61.                 if (ret < 0){
  62.                         printk("error\n");
  63.                         ret = -1;
  64.                         goto fail1;
  65.                 }
  66.                 DEBUG("platform1 is running \n");
  67.                 cdev_init(&cdev, &fops);
  68.                 cdev.owner = THIS_MODULE;
  69.                 ret = cdev_add(&cdev, devno, 1);
  70.                 if (ret)
  71.                 {
  72.                         printk("error\n");
  73.                         ret = -1;
  74.                         goto fail2;
  75.                 }
  76.                 platform_class = class_create(THIS_MODULE, "platform_mouse_analog_1");
  77.                 if (IS_ERR(platform_class))
  78.                 {
  79.                         printk("is error in platformclass \n");
  80.                         ret = -1;
  81.                         goto fail3;
  82.                 }
  83.                 DEBUG("platform is running \n");
  84.                 device_create(platform_class,NULL, devno, NULL, "platform_mouse_analog_2");
  85.                 //gpio_request(gpio_num, "mouse_analog_light");
  86.                 //gpio_direction_output(gpio_num, 0);
  87.                 irq = gpio_to_irq(gpio_num);
  88.                 if (irq < 0)
  89.                 {
  90.                         printk("-----------------------irq is fail--------------------- \n");
  91.                 }
  92.                 ret = request_irq(irq, irq_control_func, IRQF_trigger_FALLING, "myirq", NULL);

  93.                 if (ret < 0)
  94.                 {
  95.                         printk("request_irq is fail \n");
  96.                         ret = -1;
  97.                         goto fail4;
  98.                 }

  99.                 myinput = input_allocate_device();

  100.                 if (!myinput) {
  101.                                 ret = -1;
  102.                                 goto fail4;
  103.                                 printk("request input is fail \n");
  104.                                 }
  105.                 DEBUG("platform3 is running \n");
  106.                 //myinput->name = "my_input";
  107.                 set_bit(EV_REL, myinput->evbit);
  108.                 set_bit(REL_X, myinput->relbit);
  109.                 set_bit(REL_Y, myinput->relbit);
  110.                 DEBUG("platform2 is running \n");

  111.                 ret = input_register_device(myinput);
  112.                 if (ret){
  113.                         printk("input_register_device is fail \n");
  114.                         goto fail5;
  115.                 }
  116.                 DEBUG("platform5 is running \n");
  117.                 if (IS_ERR(myinput_platform)){
  118.                         printk("platform_device_register_simple is fail \n");
  119.                         ret = -1;
  120.                         goto fail5;
  121.                 }

  122.                 DEBUG("platform6 is running \n");
  123.                 printk("probe func is running ending \n");
  124.                 return 0;


  125.                 fail5:
  126.                         input_free_device(myinput);
  127.                 fail4:
  128.                         free_irq(irq, NULL);
  129.                 fail3:
  130.                         class_destroy(platform_class);
  131.                 fail2:
  132.                         cdev_del(&cdev);
  133.                 fail1:
  134.                         unregister_chrdev_region(devno, 1);
  135.                 return ret;
  136. }


  137. static int mouse_analog_remove(struct platform_device *pdev)
  138. {
  139.         device_destroy(platform_class, devno);
  140.         class_destroy(platform_class);

  141.         input_unregister_device(myinput);
  142. //        platform_device_unregister(myinput_platform);
  143.         cdev_del(&cdev);
  144.         printk("num = %d \n", irq);
  145.         free_irq(irq, NULL);
  146.         unregister_chrdev_region(devno, 1);
  147.         return 0;
  148. }

  149. static struct platform_driver mouse_analog_drv = {
  150.                 .driver ={
  151.                                 .name = "irq_control",
  152.                                 .owner = THIS_MODULE,
  153.                 },
  154.                 .probe = mouse_analog_probe,
  155.                 .remove = mouse_analog_remove,
  156. };

  157. static int __init platform_driver_init(void)
  158. {
  159.         return platform_driver_register(&mouse_analog_drv);
  160. }

  161. static void __exit platform_driver_exit(void)
  162. {
  163.         platform_driver_unregister(&mouse_analog_drv);
  164. }


  165. module_init(platform_driver_init);
  166. module_exit(platform_driver_exit);

  167. MODULE_LICENSE("GPL");


复制代码
最后看app函数:
  1. /*
  2. * app.c
  3. *
  4. *      Author: chenpeng
  5. */
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. #include <stdlib.h>

  11. #define FILE_NAME "/dev/mouse_analog2"
  12. int main(void)
  13. {
  14.         int fd, x ,y;
  15.         char buf[20];
  16.         fd = open(FILE_NAME, O_RDWR);
  17.         if (fd < 0)
  18.         {
  19.                 printf("open is error \n");
  20.                 return -1;
  21.         }
  22.         /*
  23.         while(1){

  24.                 x = random()%20;
  25.                 y = random()%20;
  26.                 sprintf(buf, "%d %d", x, y);
  27.                 printf("buf = %s \n", buf);

  28.                 write(fd, buf, 20);
  29.                 //fsync(fd);

  30.                 sleep(1);
  31.         }
  32.         */
  33.         printf("~~~~~~~~~~~~~success~~~~~~~~~~~~\n");

  34.         return 0;
  35. }
复制代码


这就是全部的代码,下面一节将写关于USB的驱动,与小米手机连接


0
2017-2-27 06:24:13   评论 分享淘帖
4 个讨论
实战必须是干货  感谢分享
2017-2-27 18:13:34 评论

举报

很好的,点个赞!
2017-2-28 09:38:21 评论

举报

……这一大段代码贴的,代码可读性较差呀
2017-3-22 15:58:23 评论

举报

只有小组成员才能发言,加入小组>>

30个成员聚集在这个小组

加入小组

创建小组步骤

关闭

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

快速回复 返回顶部 返回列表