【OK210试用体验】之hc_sr04驱动 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】之hc_sr04驱动

罗崇军 ( 楼主 ) 2015-9-16 23:16:40  只看该作者 倒序浏览
驱动终于写完了,这是我的项目的最后一个驱动,虽然还有wifi的驱动,但是由于时间关系,决定就拿内核自带的wifi驱动改一改算了,今天为大家献上超声波测距模块的驱动,希望大家能够喜欢,发了这个之后就是项目了,所以这是最后一个驱动。
      硬件平台:OK210;
      os :Linux2.6.35.7
      驱动类型:hc_sr04
驱动程序如下:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include
  13. //#include

  14. #define MEM_MAGIC 'h' //»ÃÊý
  15. #define HC1_START    _IO(MEM_MAGIC , 0)
  16. #define HC1_END             _IO(MEM_MAGIC , 1)
  17. #define HC2_START                 _IO(MEM_MAGIC , 2)
  18. #define HC2_END             _IO(MEM_MAGIC , 3)

  19. static int major;
  20. static struct class *led_class;
  21. static unsigned long *gpio_con;
  22. static unsigned long *gpio_data;
  23. static int pin1, pin2;

  24. struct timespec now;
  25. char flag=0;
  26. unsigned long data[2]={0,0};
  27. unsigned long s=0,ns=0;

  28. long getnstime()
  29. {
  30.         getnstimeofday(&now);
  31. }

  32. static struct resource hc_sr04_resources[] = {
  33.                 [0] = {
  34.                         .start        =        0xE0200C40,
  35.                         .end        =        0xE0200C44 - 1,
  36.                         .flags        =        IORESOURCE_MEM,
  37.                 },
  38.                 [1] = {
  39.                         .start        =        2,
  40.                         .end        =        2,
  41.                         .flags        =        IORESOURCE_IRQ,
  42.                 },
  43.                 [2] = {
  44.                         .start        =        3,
  45.                         .end        =        3,
  46.                         .flags        =        IORESOURCE_IRQ,
  47.                 }
  48. };

  49. //static struct timer_list key_timer;



  50. static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
  51. {
  52.     if(flag==0)
  53.                 {
  54.                         flag = 1;
  55.                         getnstime();
  56.     s = now.tv_sec;
  57.     ns = now.tv_nsec;
  58.     //printk("interrupt type is rising n");
  59.                 }
  60.                 else
  61.                 {
  62.                         flag = 0;
  63.                         data[0] = 0;
  64.                         data[1] = 0;
  65.                          getnstime();
  66.       data[0] = now.tv_sec-s;
  67.                         if(data[0])
  68.                         data[1]= data[0]*1000000000+now.tv_nsec-ns;
  69.                         else
  70.       data[1] =now.tv_nsec-ns;
  71.           //printk("interrupt type is falling !!!!!!!!! nn");
  72.                 }
  73.         return IRQ_HANDLED;
  74. }


  75. static ssize_t hc_sr04_read (struct file *file, char __user *buff, size_t size, loff_t *loff)
  76. {

  77. copy_to_user(buff,data,sizeof(data));
  78.         flag=0;      //¶ÁÍêºó½«flagÇåÁ㣬ȷ±£Ï´ÎÄÜ׼ȷÅжÏÖжϱßÑØ
  79. return size;

  80.   
  81. }
  82. static void hc_sr04_release(struct device *dev)
  83. {
  84.        
  85.     printk("%sn", __func__);
  86. }


  87. static struct platform_device hc_sr04_device = {
  88.         .name                        =        "hc_sr04s",
  89.         .num_resources        =        ARRAY_SIZE(hc_sr04_resources),
  90.         .resource                =        hc_sr04_resources,
  91.         .dev                    = {
  92.             .release    = hc_sr04_release,
  93.         }
  94. };

  95. static int hc_sr04_open(struct inode *inode, struct file *file)
  96. {
  97.         char irq=0;
  98.         *gpio_con        &= ~((0xf << (pin1 * 4)) | (0xf << (pin2 * 4)));
  99.         *gpio_con        |= (1 << (pin1 * 4)) | (0xf << (pin2 * 4));
  100.          irq = gpio_to_irq(S5PV210_GPH2(3));
  101.    request_irq(irq, gpio_keys_isr, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING ,0,(void *)0);

  102.         return 0;
  103. }

  104. static int hc_sr04_close(struct inode *inode, struct file *file)
  105. {
  106.         char irq=0;
  107.         irq = gpio_to_irq(S5PV210_GPH2(3));
  108.         free_irq(irq, (void *)0);
  109.   //del_timer(&key_timer);
  110.         return 0;
  111. }

  112. static long hc_sr04_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  113. {
  114.         switch (cmd) {
  115.                 case HC1_START:             

  116.      *gpio_data        |= (1 << pin1);
  117.                         udelay(50);
  118.      *gpio_data        &= ~(1 << pin1);
  119.                         break;
  120.                 case HC1_END:
  121.                                 //*gpio_data        &= ~(1 << pin1);
  122.                         break;
  123.                 case HC2_START:
  124.                                 //*gpio_data        |= (1 << pin2);
  125.                         break;
  126.                 case HC2_END:
  127.                                 //*gpio_data        &= ~(1 << pin2);
  128.                         break;
  129.                 default:
  130.                         return -1;
  131.         };
  132.         return 0;
  133. }

  134. static struct file_operations hc_sr04_fops = {
  135.         .open                =        hc_sr04_open,
  136.         .read   = hc_sr04_read,
  137.         .release        =        hc_sr04_close,
  138.         .unlocked_ioctl                =        hc_sr04_ioctl,
  139. };
  140. static int hc_sr04_probe(struct platform_device *dev)
  141. {
  142.         struct resource *res;
  143.        
  144.         major                =        register_chrdev(0, "hc_sr04s", &hc_sr04_fops);
  145.         led_class         =         class_create(THIS_MODULE, "hc_sr04s");
  146.         device_create(led_class, NULL, MKDEV(major, 0), NULL, "hc_sr04s");

  147.         res        = platform_get_resource(dev, IORESOURCE_MEM, 0);

  148.         gpio_con = ioremap(res->start, res->end - res->start + 1);
  149.         gpio_data = gpio_con + 1;

  150.         res = platform_get_resource(dev, IORESOURCE_IRQ, 0);
  151.         pin1 = res->start;

  152.         res        = platform_get_resource(dev, IORESOURCE_IRQ, 1);
  153.         pin2 = res->start;

  154.         return 0;
  155. }

  156. static int hc_sr04_remove(struct platform_device *dev)
  157. {
  158.         iounmap(gpio_con);
  159.         device_destroy(led_class, MKDEV(major, 0));
  160.         class_destroy(led_class);
  161.         unregister_chrdev(major, "hc_sr04s");
  162.    
  163.         return 0;
  164. }

  165. static struct platform_driver        hc_sr04_driver        = {
  166.         .probe        =        hc_sr04_probe,
  167.         .remove        =        hc_sr04_remove,
  168.         .driver        =        {
  169.                         .name        =        "hc_sr04s",
  170.         },
  171. };

  172. static int hc_sr04_init(void)
  173. {
  174.         platform_device_register(&hc_sr04_device);
  175.         platform_driver_register(&hc_sr04_driver);
  176.         return 0;
  177. }

  178. static void hc_sr04_exit(void)
  179. {
  180.         platform_driver_unregister(&hc_sr04_driver);
  181.         platform_device_unregister(&hc_sr04_device);
  182. }

  183. module_init(hc_sr04_init);
  184. module_exit(hc_sr04_exit);
  185. MODULE_LICENSE("GPL");
复制代码

下面是makefile文件
  1. obj-m := hc_sr04.o
  2. KDIR := /my_dir/linux-smart210/
  3. all:
  4.         make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
  5. clean:
  6.         rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order
复制代码

驱动程序经过测试能够正常使用,测距精度在2cm~4m范围内可达一毫米,由于驱动程序不是很复杂,具体的应用程序请大家仔细阅读驱动程序。
接下来的时间小弟会为大家跟上项目“基于arm的泊车导航系统”。

1个回复

HelloWii 发表于 2015-9-17 12:57:07
不错。。。。
回复

举报 使用道具

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

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

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

GMT+8, 2024-4-23 23:59 , Processed in 0.483106 second(s), Total 63, Slave 43 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

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