完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 czliu3231 于 2016-6-12 13:45 编辑 第4章 智能家居网络系统软件设计 4.1嵌入式系统 4.1.1 Open WRT系统介绍 思科(Cisco/Linksys)在2003年发布了一款无线路由,型号为WRT54G。同年,有人发现它所使用的系统是基于Linux。然而Linux是属于GPL许可证发布的,按照该许可证思科应该将源代码公开。思科迫于无奈不得不公开了这款路由系统的源代码,于是就有了基于思科源码的第三方路由系统,Open WRT也就由此而来。 Open WRT系统特点: 1、可扩展性好,可定制很多功能,可以在线安装插件,目前有一千多个插件可以安装。也可以将Linux上的程序移植过来,资源丰富。 2、文件系统可读写,是一款迷你型Linux系统,便于嵌入式开发实践和调试。 如果对Linux系统有一定的了解,并且想学习嵌入式系统。可以不用专门买arm开发板来学习,直接找个路由,升级下它的闪存和内存就可以将Open WRT系统移植上去了。经常关注Open WRT论坛,你就会发现论坛里有很多教程,基本上都是介绍如何去移植系统,如何学习将Linux上的程序移植到Open WRT系统中去,这些教程都会对学习嵌入式系统带来帮助。 一般嵌入式 Linux 的开发过程,都必需经过以下的开发过程: 1、创建 Linux 交叉编译环境; 2、建立 Bootloader; 3、移植 Linux 内核; 4、建立 Rootfs (根文件系统); 5、安装驱动程序和软件; 当熟悉了嵌入式 Linux 的基本开发流程后,就可以根据自己的需求,来定制一款专用的嵌入式Linux系统,做出一款属于自己的嵌入式产品。 4.1.2Linux字符设备驱动介绍 当我们在使用单片机开发时,基本上都是使用C语言作为开发语言,通常都是分析解决问题所需要的步骤,然后用函数的方法来实现,这就是面向过程编程[33]。但当我们接触过C++和JAVA之后,知道了把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个时候在整个解决问题的步骤中的一个行为,贴近人的思考方式,这就是面向对象编程。 所谓字符型设备驱动,就是调用一个文件结构体,实现结构体里的几个函数的具体操作,Linux把设备抽象为文件,用户调用这个抽象文件,对函数的进行操作就可以操作实际硬件设备,字符型设备驱动的关键部分就是,将文件结构里的函数根据你的需求去将它完善。 用户空间通过系统调用来使用这个库,库直接的调用通过内核符号来完成解析。 字符设备驱动框架,包括加载函数(用于初始化)、卸载函数、文件操作结构体函数。如图4.1所示: 图4.1 字符设备驱动框架 框架加载流程: 1、动态分配主设备号(标识驱动),从设备号(标识设备); 2、字符设备(struct cdev)空间分配(cdev_alloc); 3、字符设备cdev_init与fileoperations关联; 4、添加字符设备(cdev_add); 4.2编译Open WRT固件 4.2.1搭建Linux编译环境 首先先在电脑上安装Ubuntu系统[36],可以在虚拟机上安装,也可以直接安装。安装完成后打开附件.终端(快捷键Ctrl+Alt+T),在终端命令窗口中输入sudo apt-get update命令,先把系统更新一下。然后安装Open WRT所需要的环境软件,在终端命令窗口中输入sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev安装完后再输入sudo apt-get update再次更新一下系统,这样Open WRT的编译环境就搭建完成。如图4.2所示: 图4.2 搭建编译环境 4.2.2Open WRT源码文件结构 Open WRT源码文件列表,有几个重要的目录如dl、bin、build_dir、staging_dir、target、package、scripts等。如图4.3所示: 图4.3 Open WRT源码文件列表 --dl目录是download的缩写,在还没编译的时候,Makefile[38]会根据配置文件的信息会自动从网络中下载数据包,通常是需要编译的源码,当下载很慢的时候,我们可以手动下载来加快速度。当下载完成后,就将源码包解压到build_dir目录下,然后开始编译。 --bin目录是用来存放编译好后的固件镜像文件,在bin目录里会对不同的型号进行分类存放。 --build_dir/host目录是建立工具链的临时目录 --target/linux/ --target/linux/ --package目录存放了我们在配置文件中所勾选的软件包,我们可以通过./scripts/feeds update(install) –a来对软件包进行更新(安装)。 --scripts目录是存放一些脚本文件来方便我们调用,如对软件包进行更新或安装等。 4.2.3配置Open WRT系统 在Open WRT文件夹里输入./scripts/feeds updte -a更新软件包,因为Open WRT系统的软件会定期更新,所以在配置Open WRT先要先更新一下软件包,以便获取最新的软件可供安装。如图4.4所示: 图4.4 更新软件包 在Open WRT文件夹里输入./scripts/feeds install -a安装软件包,将更新好的软件包进行安装,这样在配置Open WRT时就有新的选项可供选择。如图4.5所示: 图4.5 安装软件包 在Open WRT文件夹里输入make menuconfig[39]进入Open WRT配置界面。menuconfig是菜单类型的配置界面,xconfig是图形列表类型的配置界面,config是文本式的配置界面。如图4.6所示: 图4.6 进入Open WRT配置界面 Open WRT配置界面,界面里的第一项是选择主控厂商,第二项subtarget是选择产品架构,第三项是选择指定的型号。第四项是选择生成镜像类型,第五项是全局设置。在这里我们要生成Open WRT固件所要用到的交叉编译工具链,所以要把倒数第二项和第三项都选上(*)即可。如图4.7所示: 图4.7 Open WRT配置界面 在Linux 中,文件系统是必不可少的。在配置Open WRT系统时,由于有很多选项。在不了解这些选项的用途时,建议不要去修改它,以免导致固件编译失败。如图4.8所示: 图4.8 文件系统镜像 全局配置界面,界面里都是一些Open WRT系统编译配置选项,可以根据硬件具体配置选择合适的优化级别。如图4.9所示: 图4.9 全局设定 这里是一些系统的基本选项,可根据你的需求来选择、定制,这体现了Open WRT系统可裁剪性。根据你的硬件资源来选择合适的服务,精简Linux内核使其运行。如图4.10所示: 图4.10 基本系统选项 在Open WRT系统里搭建WEB服务器需要用到Lua服务和php服务[42],因此在这里应该要将这两个选择上。如图4.11所示: 图4.11 语言环境 4.2.4编译Open WRT固件 当配置完毕后,保存退出,然后在终端里输入make -j 4 V=s。 -j 4的意思是4线程编译,这样编译的时候能够加快速度,通常全速编译需要1到2个小时, V=s 是在编译的时候显示详细的编译过程。如图4.12、4.13所示: 图4.12 编译 图4.13 编译过程 如果编译失败了,它会有提示,有时是在下载过程中,有的文件资源在国外,这可能会出现连接不上的情况,导致无法下载,提示失败。有时是在配置的过程中,未安装依赖文件,导致错误。下载过程如图4.14所示: 图4.14 编译过程中下载文件 4.3烧录Open WRT系统固件 4.3.1 Kermit串口软件 在Ubuntu系统下,需要安装一个Kermit软件来查看串口信息,通过串口连接,我们可以看到MT7620的一些启动信息,如图4.15所示: 图4.15 启动信息 U-Boot的版本是1.1.3,主频是580MHZ,内存是64MB,闪存型号是W25Q128BV,16MB。再往下有几项可选择的加载项,第一项是通过TFTP将系统固件加载到内存当中运行,内存的特性就是,速度快,掉电不保存。当主板掉电后,系统也将丢失,在做系统调试的时候可以选这一项。第二项是将系统固件通过TFTP加载到闪存当中去,推荐此项刷写固件。第三项是默认项,当我们没有做出选择的时候,系统默认就会选择这个选项,意思是系统从闪存当中启动。第四项是进入Boot命令窗口,查看一些系统调试信息。第五项和第六项分别是通过串口或者TFTP将U-BOOT[45]启动文件刷写到闪存中去,U-BOOT是一段系统启动引导程序,通过这段引导程序才能启动Linux系统。这里的U-BOOT相当于PC中的DOS系统,当电脑没有安装系统的时候,PC中一般会预留一个DOS系统,我们使用U盘或者光盘,在DOS系统下加载安装命令来进行系统安装,U-BOOT也是起到一种这样的作用。 4.3.2设置TFTP传输服务 TFTP是一种基于TCP/IP协议文件传输服务,具有速度快,配置简单等优点。具体配置如图4.16所示: 图4.16 TFTP配置 将TFTP客户端IP(MT7620A)设置为10.10.10.123,TFTP服务端IP(电脑PC)设置为10.10.10.3即可。 设置好TFTP客户端和服务端的IP地址后,直接将固件放到TFTP服务的文件夹里,只需要在终端里输入固件的名字。#号表示进度条,当出现done是表示刷入完成。如图4.17所示: 图4.17 固件刷入中 4.4启动Open WRT系统 当固件通过TFTP服务传输完成的时候,Bootload程序会先自动校验固件的完整性,然后将固件存放到闪存里,最后引导系统启动。如图4.18、4.19所示: 图4.18 Open WRT启动信息 图4.19 Open WRT界面 4.5编写字符驱动 4.5.1编写MakeFile文件 在Linux系统编程中,我们经常会使用到make这个命令来实现自动化编译,要实现自动化编译要先去编写一个Make file,Make file文件里的内容可以理解为英语中的语法规则。如图4.20所示: 图4.20 Make File文件 Make命令必须按照文件里的规则来执行指令,我们只需要弄明白Make file里的规则如何编写即可,这样就不再需要一步一步输入指令来生成编译文件了,Make file有点类似于脚本。 obj-m是写要生成的编译后文件(.o文件),CC指的是GCC编译工具路径,KERNLDIR指的内核存放路径。 4.5.2编写C文件 首先,第一步我们先分配一个文件结构体框架,然后是将结构体里的函数补充完整,第二步,注册设备,给设备起个名字并关联之前分配的结构体。如图4.21所示: 图4.21 编写C文件 第三步,创建类,在类下面创建设备节点。第四步,硬件相关操作,通过查询数据手册,将需要的寄存器地址依次定义好。第五步,填写模块卸载函数,注销设备号、设备类、设备节点等等操作。 当写好一个字符型驱动框架之后,包括模块初始化、注册、注销,然后将文件操作结构里的函数步骤完整,最后等待用户调用。如图4.22所示: 图4.22 完善结构体函数 在做产品开发的时候,常常接触到很多芯片,这就需要通过资料来了解这款芯片的工作性能、结构体系、底层寄存器等等,常用到的就是数据手册和用户手册。数据手册是介绍芯片的电气性能、工作原理、指标测试、封装参数等等,用户手册则是介绍这款芯片该如何去使用或者配置寄存器。如图4.23所示: 图4.23 MT7620A用户手册目录 从用户手册的目录就可以看出,各个寄存器[48](系统控制寄存器、计数器寄存器、中断控制寄存器、串口寄存器、GPIO寄存器)都有自己的地址(基地址),这些寄存器只是一个笼统的概念,在这些寄存器下面还有很多具体的寄存器,它们也有自己的地址(偏移地址),偏移地址是在基地址上进行偏移得到的地址。 我们通过查看用户手册,知道寄存器的地址和配置方式就可以对相关的寄存器进行配置。在写驱动的时候,我们只要把这些地址和相关的寄存器都一一声明定义在C文件里,在模块初始化的时候直接调用并配置即可,这就是底层驱动开发的模式。 4.5.3Make生成KO文件 当我们编写完C文件的时候,只要把Make file文件配置好,直接输入make即可完成自动编译。当有语法错误的时候,它会自动报错,提示哪一行有错误,当编译成功后会自动生成KO文件。如图4.24所示: 图4.24 编译中 在这个文件夹里编写完一个Make file和一个C文件后,输入make编译指令,则会生成几个文件出来,KO文件就是模块驱动文件,只需将这个KO文件拷贝到嵌入式系统里加载即可。如图4.25所示: 图4.25 编译后的文件夹 第5章 调试 5.1硬件调试5.1.1 WEB网页调试 WEB网页采用HTML5语言编写,先编写出一个分栏式框架网页,然后再分别写对应模块的网页。如图5.1所示: 图5.1 WEB网页主框架 编写网页时,可以参考HTML5编写教程,了解需要用到的网页元素用法或者参考例子程序。灯模块网页,如图5.2所示: 图5.2 灯网页程序 当网页编写好时,将网页放到MT7620A的WWW文件夹下即可,在浏览器中输入192.168.1.1/main.html即可登录控制网页界面。如图5.3、5.4所示: 图5.3 电脑网页显示效果 图5.4 手机网页显示效果 当MT7620A的GPIO输出一个低电平时,相应继电器就会闭合导通。如图5.5所示: 图5.5 实物调试 5.2软件调试5.2.1 Open WRT编译调试 在编译Open WRT系统的时候,第一准备编译环境,安装相应软件。第二获取Open WRT系统源代码,更新软件包。第三检查配置环境,解决文件读写权限问题。第四配置Open WRT系统,编译系统。 5.2.2设备驱动调试 (1)安装驱动 在Linux系统中传输文件,我们可以使用SCP命令来实现远程下载与上传。直接输入SCP /本地文件夹 远程登录名@远程IP地址:/远程文件夹,按回车输入远程登录密码即可完成传输。如图5.6所示: 图5.6 传输文件 找到放置驱动文件的目录后,然后输入insmod test.ko即可完成驱动安装。如图5.7所示: 图5.7 安装驱动 当输入完insmod命令之后,可以通过串口看到内核上打印了一条“灯 初始化安装中”信息。如图5.8所示: 图5.8 内核信息 这条信息是写在模块初始化函数里的,当在做开发调试的时候,可以将需要显示的信息打印到内核上显示,就能知道哪些函数已经被调用了,哪些函数实际上并没有运行。这样就能快速找出漏洞,方便调试。 当驱动安装成功后,在dev目录里可以看到Lamp_key这个文件,如图5.9所示: 图5.9 dev(设备)目录 这个目录存放的都是驱动文件,在Linux系统中,要访问外部设备就需要对该驱动文件进行读写操作,从而实现对外部设备的访问。 在dev目录下,可以通过ls –l命令来查看设备号。如图5.10所示: 图5.10 查看设备号 前面的数字253表示的是主设备号(不同型号),后面的数字11表示的是次设备号(同型号个数)。通过主次设备号,Linux系统就可以将许多设备进行统一分配、归类,方便查找。 (2)调用接口函数 在Linux系统中,文件的概念很重要。设备和文件相挂钩,对文件进行读写就相当于对设备进行操作。如图5.11所示: 图5.11 开灯操作 当参数传递到函数里后,可以看到内核上已经打印出“正在操作灯中”和“已开灯”信息。如图5.12所示: 图5.12 内核信息 前面一条信息,是写在文件结构体open函数里的,后面则是写在文件结构体write函数里。而接口函数是直接接在write函数里的,为什么open函数会被执行?原因很简单,因为这是面向对象语言,更贴近人的思考方式。就像在写字时,要先把笔盖打开,是一个道理。因此,一些初始化函数可以放在open函数里实现,模块初始化里则放一些公共的初始化函数即可。 (3)卸载驱动 当不需要这个驱动时,可以使用rmmod函数来卸载驱动。如图5.13所示: 图5.13 卸载驱动 Linux系统会去自动执行模块卸载函数里的命令,将设备号、设备节点释放出来。通过insmod命令则可以完成驱动的安装。 查询驱动是否被卸载成功,即可一通过内核信息查看,又可以到dev目录去看驱动文件是否已经被删除。内核信息,如图5.14所示: 图5.14 内核信息 结论 无网络则无智能家居,智能家居并不是一个新兴名词,它之所以会成为近年来大家关注的焦点,是因为互联网的高速发展,物联网得以深入。 智能家居网络系统,必须依靠物联网和操作系统相互协作才能快速发展。传统的有线网络缺点众多,成本代价高,无线网络可以很好的弥补这些缺点。 本智能家居网络系统采用开源的Open WRT操作系统,既提供强大的网络服务,又给物联网带来强力支撑。通过Wi-Fi网络将物联网设备有序联接,使用Html网页作为跨平台控制界面。 目前,大多数公司开发的智能设备都是直接采用单片机加无线模块的方案,手机APP作为控制平台。这种方案成本低廉,硬件简单,实现起来容易。但是如果采用手机APP作为智能家居网络系统的控制核心,会带来很多麻烦。比如说手机在同一时间只能连接一个Wi-Fi,要控制别的智能设备,必须切换Wi-Fi才能进行控制,这不利于构建一个系统。 本系统直接将MT7620A作为控制平台,智能设备和用户一同连入MT7620A的Wi-Fi网络即可通过网页实现控制,无需切换。 评分 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
「含关键代码」基于AM3352/AM3354/AM3359的Linux开发案例分享
4885 浏览 0 评论
87391 浏览 0 评论
【高手问答】如何做到精通linux技术?资深工程师带你突破难点
4710 浏览 2 评论
3602 浏览 2 评论
解读Linux :先从创建一个文件夹用来存放jdk压缩文件开始
2469 浏览 0 评论
1987浏览 3评论
1259浏览 1评论
求解:aarch64交叉编译工具已经安装成功,环境变量已经配置,怎么将系统架构切换为ARM的架构
1332浏览 0评论
电脑和虚拟机可以互ping,电脑和开发板也可以互ping,但是虚拟机和开发板ping不通是什么原因
1226浏览 0评论
1166浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-11 23:14 , Processed in 1.410477 second(s), Total 98, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号