微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > 嵌入式系统设计讨论 > 嵌入式监控系统喷水模块的设计(含程序代码)

嵌入式监控系统喷水模块的设计(含程序代码)

时间:10-02 整理:3721RD 点击:

嵌入式监控系统中很重要的一个环节就是当有人闯入和有火灾生时候,需要进行报警并喷水,今天我给大家写一个模块的设计。

设计中将四个LED灯与S3C2410处理器的四个管脚相连接,由于GPIO是复用管脚,所以首先进行相应寄存器的配置,也就是首先配置控制寄存器GPFCON,配置为output.然后就是对灯的相应控制,这个是对数据寄存器GPFDAT,如果写0,led灯亮。否则灯灭。

软件是通过ioctl进行相应的控制。


原理图



红外模块驱动流程图




详细代码设计

  1. #include <linux/config.h>

  2. #include <linux/module.h>

  3. #include <linux/init.h>

  4. #include <linux/fs.h>

  5. #include <linux/cdev.h>

  6. #include <linux/ioctl.h>

  7. #include <asm/uaccess.h>

  8. #include <asm/hardware.h>

  9. #include <asm/arch/regs-gpio.h>

  10. #include <asm-arm/irq.h>

  11. #include <asm-arm/arch-s3c2410/irqs.h>

  12. #include <linux/interrupt.h>

  13. #include <asm/io.h>



  14. MODULE_LICENSE("GPL");

  15. #define GPFCON *(volatile unsigned int *)S3C2410_GPFCON

  16. //#define GPBDAT *(volatile unsigned int *)S3C2410_GPBDAT



  17. static int led_major=0;





  18. static int led_open(struct inode *inode ,struct file *file)

  19. {  

  20.    

  21.     GPFCON &=(~(3<<6));

  22.    

  23.     //printk("GPFCON is %x\n",GPFCON);

  24.    

  25.     return 0;

  26. }



  27. static ssize_t led_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)

  28. {

  29.     int flags=0;

  30.     int ret;

  31.     //  writel(0,S3C2410_GPFDAT);

  32.     ret = readl(S3C2410_GPFDAT);

  33.     //printk("!flags is %x\n",ret&(1<<3));

  34.     if((ret & (1<<3)) == 8)

  35.     {

  36.     //printk("in flags =1 ?\n");

  37.     flags=1;

  38.     copy_to_user(buffer, &flags, sizeof(flags));    }

  39.     else

  40.         copy_to_user(buffer,(char *)&flags,sizeof(flags));

  41.     return sizeof(flags);

  42. }





  43. static int led_release(struct inode *inode,struct file *file)

  44. {

  45.     return 0;

  46. }





  47. static void led_setup_cdev(struct cdev *dev,int minor,struct file_operations *fops)

  48. {

  49.     int err;

  50.     int devno=MKDEV(led_major,minor);

  51.     cdev_init(dev,fops);

  52.     dev->owner=THIS_MODULE;

  53.     dev->ops=fops;

  54.     err=cdev_add(dev,devno,1);

  55.     if(err)

  56.     printk(KERN_INFO"Error %d adding led %d\n",err,minor);

  57. }



  58.       

  59. static struct file_operations led_remap_ops={

  60.        .owner=THIS_MODULE,

  61.        .open=led_open,     

  62. .release=led_release,     

  63. .read = led_read,

  64.       

  65. };



  66. static struct cdev SimpleDevs;





  67. static int led_init(void)

  68. {

  69.     int result;

  70.     //int ret;

  71.     dev_t dev=MKDEV(led_major,0);

  72.     if(led_major)

  73.      result=register_chrdev_region(dev,1,"led");

  74.        else

  75.         {

  76.               result=alloc_chrdev_region(&dev,0,1,"led");      led_major=MAJOR(dev);

  77.      }

  78.     if(result<0)

  79.      {

  80.       printk(KERN_WARNING"led:unable to get major %d\n",led_major);   

  81.       return result;

  82.      }

  83.     if(led_major==0)

  84.     led_major=result;   printk(KERN_INFO"led register ok!\n");

  85.     //ret = request_irq(IRQ_EINT19, button_irq, SA_INTERRUPT, "led", NULL);

  86.     led_setup_cdev(&SimpleDevs,0,&led_remap_ops);

  87.     return 0;

  88. }



  89. static void led_exit(void)

  90. {

  91.     cdev_del(&SimpleDevs);

  92.     unregister_chrdev_region(MKDEV(led_major,0),2);

  93.     printk("led device uninstalled\n");

  94. }

  95. module_init(led_init);

  96. module_exit(led_exit);

  97. 2.测试模块程序设计

  98. #include <stdio.h>

  99. #include <sys/types.h>

  100. #include <unistd.h>

  101. #include <fcntl.h>

  102. #include <time.h>

  103. #include <sys/ioctl.h>



  104. int main(void)

  105. {

  106.     int fd,i,j;

  107.     int flags=0;

  108.     j=0;

  109.     fd=open("/dev/led",O_RDWR); //打开设备驱动程序

  110.     //进行打开操作的判断

  111.     if(fd<0)

  112.         {

  113.         printf("led open failed\n");

  114.         exit(0);

  115.         }

  116.       

  117.     while(1)

  118.     {  

  119.     read(fd,&flags,1);

  120.                     printf("flags is %d\n",flags);

  121.     sleep(1);

  122.     }

  123.     close(fd);//关闭设备

  124.     return 0;

  125. }

复制代码




转自《电子技术应用》


LED的linux驱动以及测试。

嗯,被你看出来了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top