基于ARM的智能家居监控系统详细设计说明书_第1页
基于ARM的智能家居监控系统详细设计说明书_第2页
基于ARM的智能家居监控系统详细设计说明书_第3页
基于ARM的智能家居监控系统详细设计说明书_第4页
基于ARM的智能家居监控系统详细设计说明书_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 基于arm的智能家居监控系统详细设计说明书提交:审核: 提交:farsight审核:xxx核准:xxx 发行签核记录表 发 文 单 位 签 核 发 文 单 位 签 核北京开发中心技术管理部修改纪录表版本发行日期修改记录ver:1.002009-4-9基于arm的智能家居监控系统详细设计说明书1、 引言1.1 目的l 本说明书是为了程序员详细了解基于arm的智能家居监控系统l 应该完成的功能和各模块输入、处理、输出关系,指导程序员正确编码;同时作为测试人员的参考资料使用l 面向的读者:程序员、测试人员、评审员;1.2 项目背景n 项目名称:基于arm的智能家居监控系统。n 项目功能:使用fs2

2、410开发板和gprs模块和usb摄像头,完成对现场的监控功能,硬件资源来源于fs2410开发板自带的资源,比如温度传感器,报警器,红外传感器等。如果温度传感器特测温度高于一定的温度或者红外传感器特测有不法分子闯入,那么相应的相应的报警功能,灭火功能被开启,并通过gprs模块通知用户现场情况,用户根据具体情况采取不同的措施给系统。完成一个远程监控的主要功能。n 系统提出者:北京市华清远见科技信息有限公司n 项目开发者:farsightn 项目管理者:farsightn 最终用户:面向用户n 其他有关背景资料。1.3 术语及缩略语定义1.3.1 术语定义:l fs2410:优龙开发板名称。l c

3、gi : common gate intergace,是http服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上1.3.2 缩略语定义:1.4 参考资料1.4.1 文件l 基于gprs的远程安防监控系统需求分析说明书l 基于gprs的远程安防监控系统概要设计说明书1.4.2 资料l l l l l l 优龙开发板参考资料光盘2、 主控系统详细设计2.1 程序结构图红外传感器usb摄像头gprs灭火装置报警存储照片温度传感器火灾主控板 小偷异常现象internet&手机2.1系统结构图2.2 程序说明:2.2.1 ad模块说明程序描述:ad驱动程序名称:s3c24

4、10-adc.c审核:farsight日期:2008-4-26输入数据:一个模拟电压信号量输出数据:得到一个数字信号量硬件描述:ad转换器是模拟信号源和cpu之间联系的接口,它的任务是将连续变化的模拟信号转化为数字信号,以便计算机和数字系统使用。fs2410开发板用的ad转换器是arm s3c2410自带的一个一路10位的ad转换器。并且支持触摸屏功能。最大转化率是500k,ad转换器频率的计算公式为:系统时钟/(比例值+1)。本电路的特点是通过改变滑动变阻器的阻值来改变模拟电压量。 软件是通过read,write来进行对ad的读和写的操作。原理图:涉及的datasheet: (s3c2410

5、芯片手册)具体操作根据驱动程序和datasheet来结合注册驱动程序程alloc_chrdev_region(&devno,0,1,ad_temperature);(动态)结束初始化cdev,并添加到内核之中cdev_add(&addev.cdev,devno,1);y填充adc_remap_ops结构体的各个域。open,release,read,writerequest_irq(irq_adc,ad_interrupt,sa_interrupt,ad,null);(中断注册)register_chrdev_region(devno,1,ad_temperature) 成功?序流程: 2.2

6、.1ad模块驱动流程图驱动设计思路:在模块中有ad转换驱动和蜂鸣器的驱动,ad驱动的设计为:open函数中设置为手动启动,当应用层调用read函数时,开启ad转换,然后进入可中断的等待队列,当中断来的时候,唤醒等待队列,然后读取转换数值,在ioctl中能控制对ad和蜂鸣器的开和关。#include #include #include #include #include #include #include #include #include #include #include n#include #include #include #include #include #include #incl

7、ude #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define radccon *(volatile unsigned int*)s3c2410_adccon#define radcdat0 *(volatile unsigned int *)s3c2410_adcdat0#define rgpbcon *(volatile unsigned int *)s3c2410_gpbcon#

8、define rgpbdat *(volatile unsigned int *)s3c2410_gpbdat#define rclkcon *(volatile unsigned int *)s3c2410_clkcon#define radctsc *(volatile unsigned int *)s3c2410_adctsc#define ad_magic k#define ad_enable _io(ad_magic,1)#define ad_disable _io(ad_magic,2)#define beep_on _io(ad_magic,3)#define beep_off

9、_io(ad_magic,4)#define ad_major 91static void ad_setup_cdev(void);static irqreturn_t ad_interrupt(int irq,void *dev_id,struct pt_regs *regs);static int ad_major = ad_major; int count = 0 ;int onoff = 0 ;struct ad_devwait_queue_head_t wait;struct semaphore semread;int temperature;struct cdev cdev;str

10、uct ad_dev addev;static void beepon(void)/开蜂鸣器 unsigned long data;unsigned long s3c2410_fclk;unsigned long s3c2410_hclk;unsigned long s3c2410_pclk;data = *(volatile unsigned long *)s3c2410_gpbcon;data &= 0x3;*(volatile unsigned *)s3c2410_gpbcon = data | 0x2;data = readl(s3c2410_tcfg0);data &= 0xff;d

11、ata |= 15;writel(data, s3c2410_tcfg0);data = readl(s3c2410_tcfg1);data &= 0xf;data |= 2;writel(data, s3c2410_tcfg1);s3c2410_fclk = s3c2410_get_pll(_raw_readl(s3c2410_mpllcon), 12*1000*1000);data = _raw_readl(s3c2410_clkdivn); s3c2410_hclk = s3c2410_fclk / (data & s3c2410_clkdivn_hdivn) ? 2 : 1);s3c2

12、410_pclk = s3c2410_hclk / (data & s3c2410_clkdivn_pdivn) ? 2 : 1);writel(s3c2410_pclk 7) / 2000, s3c2410_tcntb(0);writel( (s3c2410_pclk 7) / 2000) 1, s3c2410_tcmpb(0);data = readl(s3c2410_tcon);data &= 0x1f;data |= 0xb;writel(data, s3c2410_tcon);data &= 2;writel(data, s3c2410_tcon);static void beepo

13、ff(void)/关蜂鸣器unsigned long data;data = *(volatile unsigned *)s3c2410_gpbcon;data &= 0x3;*(volatile unsigned *)s3c2410_gpbcon = data | 0x1;*(volatile unsigned *)s3c2410_gpbdat &= 0x1;static int ad_open(struct inode *inode,struct file *filp) unsigned long data;if(count=0)/保证只有第一个进程调用是对ad进行初始化data = rc

14、lkcon;data |=(115);rclkcon = data;radcdat0 &=(114);radctsc &=(12);request_irq(irq_adc,ad_interrupt,sa_interrupt,ad,null);radccon = (114)|(2556)|(03)|(02)| (01)|(10);count+;onoff=1;return 0;static void ad_off(void)/关ad转换通过关ad的时钟来停止ad转换unsigned long data;data = rclkcon;data &=(115);rclkcon = data; fre

15、e_irq (irq_adc, null);radccon |=(12) ;static void ad_on(void)unsigned long data;data = rclkcon;data |=(115);rclkcon = data;radcdat0 &=(114);radctsc &=(12);request_irq(irq_adc,ad_interrupt,sa_interrupt,ad,null);radccon &= (12);radccon |=(10);static irqreturn_t ad_interrupt(int irq,void *dev_id,struct

16、 pt_regs *regs) / wake_up_interruptible(&addev.wait);return irq_handled ;static ssize_t ad_read(struct file *filp,char _user *buf,size_t count,loff_t *ppos )if(down_interruptible(&addev.semread) return -erestartsys; radccon |= (10);interruptible_sleep_on(&addev.wait); addev.temperature = (radcdat0&0

17、x3ff); copy_to_user(buf,(char*)&addev.temperature,sizeof(addev.temperature); up(&addev.semread); return sizeof(addev.temperature);static ssize_t ad_write(struct file *filp, const char _user *buf, size_t count, loff_t *f_pos)return 0;static int ad_ioctl(struct inode *inodep,struct file *filp,unsigned

18、 int cmd,unsigned long arg )switch(cmd) case ad_disable:if(onoff =1)ad_off();onoff=0; break; case ad_enable:if(onoff = 0)ad_on(); onoff=1; break; case beep_on:beepon(); break; case beep_off:beepoff(); break; default :return - enotty; return 0;/处理ad开换和蜂鸣器开关的接口函数static int ad_release(struct inode* ino

19、de,struct file* flip)if(count = 0)radccon |=(12) ;free_irq(irq_adc,null);count-;return 0;static const struct file_operations ad_fops =.owner = this_module,.open = ad_open,.read = ad_read,.write = ad_write,.ioctl = ad_ioctl,.release = ad_release,;static void ad_setup_cdev(void)int err,devno = mkdev(a

20、d_major,0);cdev_init(&addev.cdev,&ad_fops);addev.cdev.owner = this_module;addev.cdev.ops = &ad_fops;err = cdev_add(&addev.cdev,devno,1);int ad_init(void)int result;dev_t devno = mkdev(ad_major,0);if(ad_major)result = register_chrdev_region(devno,1,ad_temperature); 注册一个名字叫ad_temperature的字符设备result =

21、alloc_chrdev_region(&devno,0,1,ad_temperature);ad_major = major(devno);if(result0)return result;init_waitqueue_head(&addev.wait);sema_init(&addev.semread,1);ad_setup_cdev();return 0;void ad_exit(void)count -;cdev_del(&addev.cdev);unregister_chrdev_region(mkdev(ad_major,0),1);module_init(ad_init);mod

22、ule_exit(ad_exit);module_author(hong xiongfei);module_description(a/d devicer);module_license(gpl);由于我们的模块要单独做成一个守护进程在后台进行,并且每个模块单独完成各自的功能,ad模块的应用程序主要的工作为:循环每分钟读取一次温度,当温度大于40度的时候就调用gprs模块的程序发送短信;并启动蜂鸣器。程序如下:#include #include #include #include #include #include #include #include #include #include #in

23、clude sendmessage.h#define ad_magic k#define ad_enable _io(ad_magic,1)#define ad_disable _io(ad_magic,2)#define beep_on _io(ad_magic,3)#define beep_off _io(ad_magic,4)void init_daemon(void)int pid;int i;if(pid=fork()exit(0);else if(pid0)exit(-1);setsid();if(pid=fork()exit(0);else if(pid0)exit(-1);fo

24、r(i=2;i60) & (count=0)ioctl(fd,beep_on);system(cp /web/html/pic/safe_no.jpg /web/html/pic/safe.jpg);sendmessageburning:more than 60);count =1;if(count = 1)sleep(5);delay+;if(delay =2)count=0;delay=0;ioctl(fd,beep_off);2.2.4蜂鸣器报警模块说明程序描述:蜂鸣器驱动程序名称:beep.c审核:farsight日期:2008-4-26输入数据:有人闯入输出

25、数据: 报警硬件描述:首先将蜂鸣器接到s3c2410处理器的一个gpb0管脚上。还上面的配置一样。首先配置gpbcon的gpb0为输出模式,当数据寄存器里写入1时。蜂鸣器打开,写0关闭蜂鸣器。软件上是通过ioctl来进行相应的控制的。 原理图:所涉及的datasheet(s3c2410数据手册):2.2.4蜂鸣器报警模块驱动流程图2.2.5红外模块说明程序描述:探测入侵程序名称:irda.c irda_gpio.c serial.c shmgt.c审核:farsight日期:2008-11-6输入数据:有人闯入输出数据: 报警、拍照、网页警告硬件描述:通过设置gpfcon来将gpf3设置为输入

26、模式,然后读取相应的数据寄存器的状态来,进行对现场的分析。如果有人闯入,红外模块输出高电平,这个时候gpf3相应的数据寄存器的数值为1,反之为0.原理图:涉及的datasheet(s3c2410数据手册):gpfcon,gpfdat三个寄存器驱动程序模块设计: 1. irda_gpio.c/* linux/drivers/char/irda_gpio.c national semiconductor scx200 gpio driver. allows a user space process to play with the gpio pins. copyright (c) 2001,200

27、2 christer weinigel */#include #include #include #include #include #include /#include #include #include #include #include #include #include #define drvname irda_gpiomodule_author(hongbo liu );module_description(irda detector);module_license(gpl);/#define hello_magic k/声明一个幻数 /#define close_irda _io(

28、hello_magic,1)/#define open_irda _io(hello_magic,2)#define close_irda 0#define open_irda 1#define max_pins 32#define max_result 4char status = open_irda;static int major = 253;/* default to dynamic major */module_param(major, int, 0);module_parm_desc(major, major device number);/读函数,读出红外设备的状态,函数提供co

29、unt毫秒内并小于128的结果,结果以字符y或n来表示状态,设备连接在gpg10端口上static ssize_t irda_gpio_read (struct file *filp, char *buff, size_t count, loff_t *offp)ssize_t result = 0;int i;char datamax_result;char status1 = yes;char status2 = no;if(status = open_irda)int k = readl(s3c2410_gpfdat);/读gpg10端口信号if ( k & ( 13 ) )/判断信号电

30、平strcpy(data,status1);elsestrcpy(data,status2);elsestrcpy(data,status2);/printk(kernel buf is %sn,data);if (copy_to_user (buff, data, count)return -efault;result = count;return result;/设备打开static int irda_gpio_open(struct inode *inode, struct file *file)writel(readl(s3c2410_gpfcon) &(36),s3c2410_gpf

31、con); /*设置gpg10端口为输入端口*/status = open_irda;return 0;/设备关闭static int irda_gpio_release(struct inode *inode, struct file *file)return 0;static int irda_gpio_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)switch(cmd)case close_irda: /writel(readl(s3c2410_gpfcon) | (1 6),

32、s3c2410_gpfcon);/writeb(readb(s3c2410_gpfdat) & (13),s3c2410_gpfdat);status = close_irda;printk(irda closedn);break;case open_irda:printk(irda openn);status = open_irda;break;default:break;return 0;/操作结构指针static const struct file_operations irda_gpio_fileops = .owner = this_module,.read = irda_gpio_

33、read,.open = irda_gpio_open,.ioctl = irda_gpio_ioctl,.release = irda_gpio_release,;static struct cdev irda_gpio_cdev; /* use 1 cdev for irda */驱动模块注册static int _init irda_gpio_init(void)int rc;dev_t devid;if (major) devid = mkdev(major, 0);rc = register_chrdev_region(devid, max_pins, irda_gpio); els

34、e rc = alloc_chrdev_region(&devid, 0, max_pins, irda_gpio);major = major(devid);if (rc 0) printk(kern_warningirda_gpio chrdev_region err: %dn, rc);return rc;if(0=major)major=rc;/printk(kern_noticedebug irda device major is %dn,major);cdev_init(&irda_gpio_cdev, &irda_gpio_fileops);cdev_add(&irda_gpio

35、_cdev, devid, max_pins);return 0; /* succeed */驱动模块卸载static void _exit irda_gpio_cleanup(void)cdev_del(&irda_gpio_cdev);/* cdev_put(&irda_gpio_cdev); */unregister_chrdev_region(mkdev(major, 0), max_pins);module_init(irda_gpio_init);module_exit(irda_gpio_cleanup);2. irda.c#include serial.h#include be

36、ep.h#include wdaemon.hint main (int argc, char *argv )char bufmax_result;char tst_buf1 = yes;char tst_buf2 = no;char status_cnt = 0;char alarm = enable;int fd,i,j;wdaemon(0);for(i=0;i= stat_tst_cnt & alarm = enable)status_cnt = 0;alarm = disable;printf(burningn);if(fork() = 0)beepon();sleep(1);beepo

37、ff();while(sendmessagewarning!) = send_fail);system(cp /web/html/pic/safe_no.jpg /web/html/pic/safe.jpg);execl(/camera/mouse_capture,/camera/mouse_capture,null);exit(0);sleep(1);return 0;3. serial.c#include #include #include #include #include #include #include #include #include #define

38、send_success 0#define send_fail -1int open_port(int fd,int comport) char *dev=/dev/s3c2410_serial0,/dev/s3c2410_serial1,/dev/s3c2410_serial2; long vdisable; if (comport=1) fd = open( /dev/s3c2410_serial0, o_rdwr|o_noctty|o_ndelay); if (-1 = fd) perror(cant open serial port); return(-1); else if(comp

39、ort=2) fd = open( /dev/s3c2410_serial1, o_rdwr|o_noctty|o_ndelay); if (-1 = fd) perror(cant open serial port); return(-1); else if (comport=3) fd = open( /dev/s3c2410_serial2, o_rdwr|o_noctty|o_ndelay); if (-1 = fd) perror(cant open serial port); return(-1); if(fcntl(fd, f_setfl, 0)0) printf(fcntl f

40、ailed!n); else printf(fcntl=%dn,fcntl(fd, f_setfl,0); if(isatty(stdin_fileno)=0) printf(standard input is not a terminal devicen); else printf(isatty success!n); printf(fd-open=%dn,fd); return fd;int set_opt(int fd,int nspeed, int nbits, char nevent, int nstop) struct termios newtio,oldtio; if ( tcg

41、etattr( fd,&oldtio) != 0) perror(setupserial 1); return -1; bzero( &newtio, sizeof( newtio ) ); newtio.c_cflag |= clocal | cread; newtio.c_cflag &= csize; switch( nbits ) case 7: newtio.c_cflag |= cs7; break; case 8: newtio.c_cflag |= cs8; break; switch( nevent ) case o: newtio.c_cflag |= parenb; ne

42、wtio.c_cflag |= parodd; newtio.c_iflag |= (inpck | istrip); break; case e: newtio.c_iflag |= (inpck | istrip); newtio.c_cflag |= parenb; newtio.c_cflag &= parodd; break; case n: newtio.c_cflag &= parenb; break; switch( nspeed ) case 2400: cfsetispeed(&newtio, b2400); cfsetospeed(&newtio, b2400); break; case 4800: cfsetispeed(&newtio, b4800); cfsetospeed(&newtio, b4800); break; case 9600: cfsetispeed(&newtio, b9600); cfsetospeed(&newtio, b96

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论